Снова ИК пульт

popUP
Offline
Зарегистрирован: 09.10.2014

Доброго времени суток.

Вполне возможно, что я не там и не так ищу. И тут и вокруг полно информации чуть ли не с 10-го года народ обсуждает и делится знаниями о том, как заменить существующий пульт к существующему устройству. 

Я уже собирал робота на IR управлении из стандартного набора. Я применял другие пульты и т.п. Но не устраивает. Хочу использовать джойстик. Хочу регулировать скорость движения в соответствии с положением жджойстика. Хочу поворачивать серву на угол в соответствии с положением джойстика.

Не нашел как отправить свои данные, не какое-то значение, а, так сказать, в динамике, изменяющиеся. 

Наверняка как-то закодировать на передатчике и раскодировать в приемнике.  Может кто-то встречал статейку для чайников с примерами? Поделитесь ссылкой.

Вот мой код, куда планирую пристроить ИК передатчик.

/* 
 Подключены устройства
 - Arduino NANO
 - LCD 128x64   i2c
 
Устройства ввода
 - Джойстик 2 шт
 - Кнопка

 */

//подключаем библиотеки ////////////////////////////

#include <Wire.h> 
#include <SPI.h>  //Библиотека (Serial Peripheral Interface), или последовательный периферийный интерфейс
#include <Adafruit_GFX.h>  //Библиотека экрана
#include <Adafruit_SSD1306.h>  //Библиотека экрана

#include <IRremote.h>
IRsend irsend;

//Определение Экрана
#define OLED_RESET 4
Adafruit_SSD1306 display(OLED_RESET);
#define NUMFLAKES 10
#define XPOS 0
#define YPOS 1
#define DELTAY 2
#if (SSD1306_LCDHEIGHT != 64)
#error("Height incorrect, please fix Adafruit_SSD1306.h!");
#endif

// Пины и переменные

#define Joy_1_Pin_X    A0   // Джойстик 1 Ось Х
#define Joy_1_Pin_Y    A1   // Джойстик 1 Ось Y
#define Joy_1_Pin_Sw   7   // Джойстик 1 SW
#define Joy_2_Pin_X    A2   // Джойстик 2 Ось Х
#define Joy_2_Pin_Y    A3   // Джойстик 2 Ось Y
#define Joy_2_Pin_Sw   8   // Джойстик 2 SW

int Joy_1_Val_X = 0;
int Joy_1_Val_Y = 0;
int Joy_1_Val_Sw = 0;
int Joy_2_Val_X = 0;
int Joy_2_Val_Y = 0;
int Joy_2_Val_Sw = 0;

#define Sw_1_Pin  10   // Кнопка 1
int Sw_1_Val = 0;

////******убираем к чертям DELAY****Спасибо г-н Клапауций 322 http://arduino.ru/forum/programmirovanie/klass-titanovyi-velosiped-dlya-...
long previousMillis = 0;        // храним время последнего действия чтением датчиков
long interval = 200;           // интервал между чтением датчиков 


void setup() {
  Serial.begin(9600); 

  pinMode (Joy_1_Pin_Sw, INPUT);
  pinMode (Joy_2_Pin_Sw, INPUT);
  digitalWrite(Joy_1_Pin_Sw, HIGH); // включаем встроенный подтягивающий резистор
  digitalWrite(Joy_2_Pin_Sw, HIGH); // включаем встроенный подтягивающий резистор

  pinMode (Sw_1_Pin, INPUT);
  digitalWrite(Sw_1_Pin, HIGH); // включаем встроенный подтягивающий резистор

  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);  // initialize with the I2C addr 0x3С (for the 128x64)
  display.display();
  delay(200);
  display.clearDisplay();
  display.setTextSize(1);
  display.setTextColor(WHITE);
  display.clearDisplay();

} /* --(end setup )-- */

void loop() {
  unsigned long currentMillis = millis();
  if(currentMillis - previousMillis > interval) {
READ_DATA();
    previousMillis = currentMillis; // сохраняем время последнего переключения
  }

  LCD_PRINT ();

//Вот тут и надо что-то послать, но как послать значения датчиков- джойстиков
//  int khz = 38; // 38kHz carrier frequency for the NEC protocol
//  unsigned int irSignal[] = {9000, 4500, 560, 560, 560, 560, 560, 1690, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 1690, 560, 1690, 560, 560, 560, 1690, 560, 1690, 560, 1690, 560, 1690, 560, 1690, 560, 560, 560, 560, 560, 560, 560, 1690, 560, 560, 560, 560, 560, 560, 560, 560, 560, 1690, 560, 1690, 560, 1690, 560, 560, 560, 1690, 560, 1690, 560, 1690, 560, 1690, 560, 39416, 9000, 2210, 560}; //AnalysIR Batch Export (IRremote) - RAW
//  irsend.sendRaw(irSignal, sizeof(irSignal) / sizeof(irSignal[0]), khz); //Note the approach used to automatically calculate the size of the array.


} /* --(end main loop )-- */

//////////////////////////////////////////////////////////////////////////////////////////////////
/*-----( Declare User-written Functions )-----*/

void READ_DATA ()
{
  Joy_1_Val_X = analogRead(Joy_1_Pin_X);      //// Джойстик 1 Ось Х
  Joy_1_Val_Y = analogRead(Joy_1_Pin_Y);      //// Джойстик 1 Ось Х
  Joy_1_Val_Sw = digitalRead (Joy_1_Pin_Sw);  //Джойстик 1 SW

  Joy_2_Val_X = analogRead(Joy_2_Pin_X);      //// Джойстик 2 Ось Х
  Joy_2_Val_Y = analogRead(Joy_2_Pin_Y);      //// Джойстик 2 Ось Х
  Joy_2_Val_Sw = digitalRead (Joy_2_Pin_Sw);  //Джойстик 2 SW

  Sw_1_Val = digitalRead (Sw_1_Pin);      //Кнопка 1

}


void LCD_PRINT ()
{
  display.setCursor(0,0);
  display.print("Joy_1_X: ");
  display.print(Joy_1_Val_X);
  display.setCursor(0,15);
  display.print("Joy_1_Y: ");
  display.print(Joy_1_Val_Y);
  display.setCursor(80,15);
  display.print("SW_1: ");
  display.print(Joy_1_Val_Sw);

  display.setCursor(0,30);
  display.print("Joy_2_X: ");
  display.print(Joy_2_Val_X);
  display.setCursor(0,45);
  display.print("Joy_2_Y: ");
  display.print(Joy_2_Val_Y);
  display.setCursor(80,45);
  display.print("SW_2: ");
  display.print(Joy_2_Val_Sw);

  display.setCursor(0,55);
  display.print("Swich_1: ");
  display.print(Sw_1_Val);

  display.display();
  display.clearDisplay();
}

 

Клапауций 232
Offline
Зарегистрирован: 05.04.2016

TV-пульты не отправляют данные

TV-пульты отправляют зашитые в них команды, соответсвующие нажатой кнопке.

popUP
Offline
Зарегистрирован: 09.10.2014

Спасибо. Это я понял. А как отправить свои данные? Через самодельный пульт. Как зашифровать и расшифровать?

Клапауций 232
Offline
Зарегистрирован: 05.04.2016

popUP пишет:
Спасибо. Это я понял. А как отправить свои данные? Через самодельный пульт. Как зашифровать и расшифровать?

никак - прекращай тупить.

popUP
Offline
Зарегистрирован: 09.10.2014

Та не может быть!
Есть вертолетики на ИК. Там тоже джойстик. Или там тупо повторяющиеся значение одной кнопки?

Клапауций 232
Offline
Зарегистрирован: 05.04.2016

popUP пишет:
Или там тупо повторяющиеся значение одной кнопки?

нет - там девственницы на единорогах шифруют данные.

popUP
Offline
Зарегистрирован: 09.10.2014

Жаль.
Тогда еще вопрос . А с радио. 433. Я смогу реализовать такой пульт?

Клапауций 232
Offline
Зарегистрирован: 05.04.2016

popUP пишет:
Жаль. Тогда еще вопрос . А с радио. 433. Я смогу реализовать такой пульт?

не знаю - читай спецификацию на своё радио.

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

Чисто логически:
1. Дальность ИК пульта не очень большая, хватит разве что для управления комнатными моделями.
2. Протокол есть протокол, можно сделать что угодно. Взять, к примеру, Сплит системы, там передается много данных.
3. Про радио не скажу, не использовал.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

1. Если у Вас не стандартный пульт от телевизора, а нормальный передатчик - Вы запрсото можете реализовать передачу нужных Вам данных. Вообще без проблем

2. согласен с kisoft - радио намного лучше. Если у Вас есть копеечная пара приёмник-передатчик на 433 - проблем никаких. Другое дело, Вы должны быть внимательны при выборе пары, а именно,

А) Вы долждны ответить себе на вопрос нужна ли Вам односторонняя связи или двусторонняя. от этого зависит что выбирать. В первом случае подойдёт просто примник и передатчик, а во втором - нужно два "приёмомпередатчика".

Б) смотрите на параметры пары. например, популярная и недорогая пара для односторонней связи, которую я, например, часто использую, имеет такую особенность - питание передатчика до 12В и чем больше, тем дальше дистанця работы. Т.е. Вам на пульте нужно иметь 10-12 вольт для хорошей дистанции. Если их негде взять, то лучше поискать другую пару.

Успехов!

popUP
Offline
Зарегистрирован: 09.10.2014

Ай спасибо!

ЕвгенийП , у меня есть указаная Вами " популярная и недорогая пара для односторонней связи" ,  и с утра, после облома от Клапауций 232, я с ней экспериментирую.

И вот в ходе экспериментов  обратил внимание, что можно отправлять пакеты, в том числе для ленивых есть EasyTransferVirtualWire.h, которая собирает пакет. еще не знаю, как часто может отсылаться пакет,  будет ли тормозить управление от джойстиков, но разве никак нельзя прикрутить пакеты для ИК?

Просто читал про 433 Mhz и часто мнение: "И робот не поехал. или поехал , но очень не хорошо , если речь идет о платах заявленых выше." превалирует. http://arduino.ru/forum/apparatnye-voprosy/besprovodnaya-svyaz-na-chasto...

А мне управление в пределах до 10 м. освою это устройство, буду пробовать что-то новое. Вот заказал https://ru.aliexpress.com/item/Wireless-Module-NRF24L01-PA-LNA-with-Antenna-1000-Meters-Long-Distance-Free-Shipping-via-China-post/1660900248.html?spm=2114.13010308.0.92.N4XVNd . Но, пока придет, буду пробовать 433 Mhz

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

На этой паре можно отправлять данные (любые) на скорости 2000 бит/сек. Вроде, можно и больше, но сам я больше не делал. На такой скорости, вполне можно работать с джойстиком, по мне, так достаточно. Мой внук передаёт структуру в которой зашиты показания двух джойстиков и управляет танкеткой. Расстояние - больше 40 метров не пробовали, на 40 метров при питании передатчика 3х3,37В и 17,5см. штыревых антеннах на обоих устройствах - всё отлично. Он использует библиотеку VirtualWire, правда мне пришлось переделать её на другой таймер, т.к. тот таймер, что в ней зашит у него уже занят был.

Разумеется к этой паре Вы ИК никак не прекрутите.

Что до ИК, там есть свои пары. Передавать любые данные проблемы тоже никакой, но вот насчёт скорости и дальности не знаю, не пробовал. На 3-5 метров работает хорошо. А скорость - я передавал только одиночные команды, так что скорость меня не волновала ни разу и потому, я даже не вникал.

vvadim
Offline
Зарегистрирован: 23.05.2012

используйте nrf24l

по ним  куча информации

работают нормально

проверено))))

popUP
Offline
Зарегистрирован: 09.10.2014

Спасибо

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

ESP8266 и управлять с телефона. Конечно уже из квартиры далеко не выйдешь. WiFi он такой, WiFi

Navigator
Navigator аватар
Offline
Зарегистрирован: 26.01.2016

Пользовался именно такими нрф-ками с антенной и усилителем, два джойстика и несколько кнопок. Отличные модули! Нужно сразу обязательно добавить конденсаторы по питанию, без них работать не будет. Ну и конечно отдельное питание 3, 3 В. На 1000м не проверял, проверял только до 300 метров. Как работает на большем расстоянии не знаю.

Радиомодули на 433 МГц тоже позволяют реализовать управление с джойстика. Но дальность действия(связи) небольшая и много жалоб на эти модули. Модули доставляются в пакете, где-то его немного придавили, помялись витки у катушки и в итоге получаем радиомодули с рассогласованной настройкой. Настроить их сложно.

Jeka_M
Jeka_M аватар
Offline
Зарегистрирован: 06.07.2014

Navigator пишет:

Модули доставляются в пакете, где-то его немного придавили, помялись витки у катушки и в итоге получаем радиомодули с рассогласованной настройкой. Настроить их сложно.

Бывало даже, что китайцы путали и присылали комплект из приёмника и передатчика на разные частоты (315/433)

popUP
Offline
Зарегистрирован: 09.10.2014

Всем спасибо :) указанные модули заказл. буду ждать.

Но, пока вот пробовал то, что есть - И случились проблемы с кодом :)

Подключил Джойстики , кнопку и экранчик 128*64. Все работает, данные на экране отображаются, меняются. Ок

Подключил передатчик - отрубился экран и вообще ничего не работает

#include <Wire.h> 
#include <SPI.h>  //Библиотека (Serial Peripheral Interface), или последовательный периферийный интерфейс
#include <Adafruit_GFX.h>  //Библиотека экрана
#include <Adafruit_SSD1306.h>  //Библиотека экрана
#include <VirtualWire.h>
#include <EasyTransferVirtualWire.h>

////Определение Экрана
#define OLED_RESET 4
Adafruit_SSD1306 display(OLED_RESET);
#define NUMFLAKES 10
#define XPOS 0
#define YPOS 1
#define DELTAY 2
#if (SSD1306_LCDHEIGHT != 64)
#error("Height incorrect, please fix Adafruit_SSD1306.h!");
#endif

// Пины и переменные
#define Joy_1_Pin_X    A0   // Джойстик 1 Ось Х
#define Joy_1_Pin_Y    A1   // Джойстик 1 Ось Y
#define Joy_1_Pin_Sw   7   // Джойстик 1 SW
#define Joy_2_Pin_X    A2   // Джойстик 2 Ось Х
#define Joy_2_Pin_Y    A3   // Джойстик 2 Ось Y
#define Joy_2_Pin_Sw   8   // Джойстик 2 SW
#define Sw_1_Pin  10   // Кнопка 1

#define Sw_1_Pin2  2   // Кнопка 1 светодиод

int Joy_1_Val_X ;
  int Joy_1_Val_Y ;
  int Joy_1_Val_Sw ;
  int Joy_2_Val_X ;
  int Joy_2_Val_Y ;
  int Joy_2_Val_Sw ;
  int Sw_1_Val ;

/// Определяем передатчик
EasyTransferVirtualWire ET; 
struct SEND_DATA_STRUCTURE{
  byte ID;
  int Joy_1_Val_X ;
  int Joy_1_Val_Y ;
  int Joy_1_Val_Sw ;
  int Joy_2_Val_X ;
  int Joy_2_Val_Y ;
  int Joy_2_Val_Sw ;
  int Sw_1_Val ;

};
SEND_DATA_STRUCTURE mydata;

////******убираем к чертям DELAY****Спасибо г-н Клапауций 322
long previousMillis = 0;        // храним время последнего действия чтением датчиков
long interval = 50;           // интервал между чтением датчиков 

void setup() {
  Serial.begin(9600); 

  pinMode (Joy_1_Pin_Sw, INPUT);
  pinMode (Joy_2_Pin_Sw, INPUT);
  digitalWrite(Joy_1_Pin_Sw, HIGH); // включаем встроенный подтягивающий резистор
  digitalWrite(Joy_2_Pin_Sw, HIGH); // включаем встроенный подтягивающий резистор
  pinMode (Sw_1_Pin, INPUT);
  digitalWrite(Sw_1_Pin, HIGH); // включаем встроенный подтягивающий резистор

  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);  // initialize with the I2C addr 0x3С (for the 128x64)
  display.display();
  delay(200);
  display.clearDisplay();
  display.setTextSize(1);
  display.setTextColor(WHITE);
  display.clearDisplay();

  //start the library, pass in the data details
 //ET.begin(details(mydata));
 mydata.ID = 1;
//  // Initialise the IO and ISR
  vw_set_ptt_inverted(true); // Required for DR3100
  vw_set_tx_pin(12);      // Пин передатчика
  vw_setup(2000);	 // Bits per sec

  pinMode(13, OUTPUT);      //Будет мигать в момент передачи 
  pinMode (Sw_1_Pin2 , OUTPUT);
  randomSeed(analogRead(0));  //задание случайного интервала передачи данных для нескольких устройств

} /* --(end setup )-- */

void loop() {
  unsigned long currentMillis = millis();
  if(currentMillis - previousMillis > interval) {
    READ_DATA();
    previousMillis = currentMillis; // сохраняем время последнего переключения
  }


//DATA_SEND ();
LCD_PRINT ();

} /* --(end main loop )-- */

//////////////////////////////////////////////////////////////////////////////////////////////////
/*-----( Declare User-written Functions )-----*/

void READ_DATA ()
{
  Joy_1_Val_X = analogRead(Joy_1_Pin_X);      //// Джойстик 1 Ось Х
  Joy_1_Val_Y = analogRead(Joy_1_Pin_Y);      //// Джойстик 1 Ось Х
  Joy_1_Val_Sw = digitalRead (Joy_1_Pin_Sw);  //Джойстик 1 SW
 
  Joy_2_Val_X = analogRead(Joy_2_Pin_X);      //// Джойстик 2 Ось Х
  Joy_2_Val_Y = analogRead(Joy_2_Pin_Y);      //// Джойстик 2 Ось Х
  Joy_2_Val_Sw = digitalRead (Joy_2_Pin_Sw);  //Джойстик 2 SW

  Sw_1_Val = digitalRead (Sw_1_Pin);      //Кнопка 1
  digitalWrite(Sw_1_Pin2, Sw_1_Val);
}
void DATA_SEND()
{
  mydata.Joy_1_Val_X = Joy_1_Val_X;
  mydata.Joy_1_Val_Y = Joy_1_Val_Y;
  mydata.Joy_1_Val_Sw = Joy_1_Val_Sw;
  mydata.Joy_2_Val_X = Joy_2_Val_X;
  mydata.Joy_2_Val_Y = Joy_2_Val_Y;
  mydata.Joy_2_Val_Sw = Joy_2_Val_Sw;
  mydata.Sw_1_Val = Sw_1_Val;
  //send the data
//  digitalWrite(13, HIGH);
  ET.sendData();
//  digitalWrite(13, LOW); 
}

void LCD_PRINT ()
{
  display.setCursor(0,0);
  display.print("Joy_1_X: ");
  display.print(Joy_1_Val_X);
  display.setCursor(0,15);
  display.print("Joy_1_Y: ");
  display.print(Joy_1_Val_Y);
  display.setCursor(80,15);
  display.print("SW_1: ");
  display.print(Joy_1_Val_Sw);

  display.setCursor(0,30);
  display.print("Joy_2_X: ");
  display.print(Joy_2_Val_X);
  display.setCursor(0,45);
  display.print("Joy_2_Y: ");
  display.print(Joy_2_Val_Y);
  display.setCursor(80,45);
  display.print("SW_2: ");
  display.print(Joy_2_Val_Sw);

  display.setCursor(0,55);
  display.print("Swich_1: ");
  display.print(Sw_1_Val);

  display.display();
  display.clearDisplay();
}



Вот в таком виде данные отображаются но не передаются.

Если снять комменты с 76 и 97 - и закомментировать 98, то данные передаются, но не отображаются. Если снять все комменты - то ... вообще ничего

popUP
Offline
Зарегистрирован: 09.10.2014

Еще попробовал подключить серво. Ошибки еще при компиляции появились. Какой-нибудь то вектор где- то уже объявлен.

VirtualWire\VirtualWire.cpp.o: In function `__vector_11':
D:\ARDUINO\Sketch\libraries\VirtualWire/VirtualWire.cpp:790: multiple definition of `__vector_11'
Servo\Servo.cpp.o:C:\Program Files (x86)\Arduino\libraries\Servo/Servo.cpp:103: first defined here
 
Как побороть?

 

popUP
Offline
Зарегистрирован: 09.10.2014

Ответ тут 

http://electronics.stackexchange.com/questions/67967/problems-using-serv...

но я где-то тут видел, что меняли библиотеку VW? но не могу опять найти кто  и как)