IR-передатчик

ali_vlad
Offline
Зарегистрирован: 20.02.2015

Пытаюсь собрать адаптер резистивных кнопок на руле авто для управления магнитолой Kenwood на Arduino Pro Micro. На магнитоле есть вход для внешнего управления (ИК-протокол NEC).

С клавиатурой разобрался, коды пульта считал, сохранил. Но не могу  найти примера для посылки кода.

Огромная просба: покажите пример посылки кодов (протокол NEC).

Список кодов:

Влево         9D6250AF

Вправо        9D62D02F

Громкость +   9D6228D7

Громкость –   9D62619E

[ + ]         9D62C03F

[ – ]         9D6230CF

SRC           9D62C837

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

Так возьмите пример из родной библиотеки NECIRremote.h Там есть.

ali_vlad
Offline
Зарегистрирован: 20.02.2015

ЕвгенийП пишет:

Так возьмите пример из родной библиотеки NECIRremote.h Там есть.

А где взять эту суперсекретную библиотеку, о которой яндекс ничего не знает?

Или тяжело написать пару строк с примером?

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

ali_vlad пишет:

А где взять эту суперсекретную библиотеку, о которой яндекс ничего не знает?

Где-то я её скачивал. Сейчас поищу, должна где-то валяться.

ali_vlad пишет:

Или тяжело написать пару строк с примером?

Странно. Мне показалось как будто Вы меня упрекаете? Я Вам что-то задолжал?

Сейчас поищу библиотеку.

ali_vlad
Offline
Зарегистрирован: 20.02.2015

Я, конечно, не имею большого опыта в программировании, но про библиотеку NECIRremote.h первый раз слышу. У меня есть библиотека IRremote.h и примеры к ней, но я не могу разобраться что куда, поэтому и попросил ПРИМЕР с посылкой кода.

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

NECIRRemote В сети что-то не могу найти, но могу дать свою копию.

Впрочем, это не надо. В библиотеке IRRemote, которую Вы пользуете есть аж два примера отправки

https://github.com/z3t0/Arduino-IRremote/blob/master/examples/IRsendDemo...

https://github.com/z3t0/Arduino-IRremote/blob/master/examples/IRsendRawD...

Примеры очень короткие. Вы не можете их запустить? Что-то с ними не так?

ali_vlad
Offline
Зарегистрирован: 20.02.2015

послать_код 9D6250AF на пин3

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

Ну, там же примеры из трёх строк - смотрите как они посылают, и сами посылайте

ali_vlad
Offline
Зарегистрирован: 20.02.2015

Ладно, проехали. Будем считать, что сам разобрался, хотя, на данный момент, не совсем.

Прар вопрос по железу:

1. Хочу повесить IR-светодиод на пин3. Вроде бы последовательно с диодом должен быть резистор. Какой номинал резистора?

2. Необходимо снизить амплитуду выходного дапряжения до 3.3В (нужно для магнитолы). Как это сделать без потери качества сигнала?

3. Внешнее питание. Можно ли запитать от борт-сети авто напрямую и на какой пин или нет?

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

ali_vlad пишет:

1. Хочу повесить IR-светодиод на пин3. Вроде бы последовательно с диодом должен быть резистор. Какой номинал резистора?

Открываешь даташит диода. Смотришь прямое напряжение (Up) и рабчий ток (I). Измеряешь напряжение на пине (Upin). Дальше считаешь (Upin-Up)/I - получаешь сопротивление. Берёшь ближайший больший номинал.

ali_vlad пишет:

2. Необходимо снизить амплитуду выходного дапряжения до 3.3В (нужно для магнитолы). Как это сделать без потери качества сигнала?

Tcnm 100500 решений.

а) Делитель напряжения с последующим эммитерным повторителем,
б) делитель напряжения с последующим операционным усилителем. 
в) Два операционных усилителя - первый понижает и инверитует, второй не трогает, но инвертирует обратно.
г) микросхема-буффер, например CD4050B
д) любая из схем в этой статье 
е) готовый преоборазователь уровня за 23 рубля на ali

ali_vlad пишет:

3. Внешнее питание. Можно ли запитать от борт-сети авто напрямую и на какой пин или нет?

Можно, если обеспечить дополнительную фильтрацию, т.к. бортовое питание колбасит не по-детски

 

ali_vlad
Offline
Зарегистрирован: 20.02.2015

ЕвгенийП пишет:

ali_vlad пишет:

1. Хочу повесить IR-светодиод на пин3. Вроде бы последовательно с диодом должен быть резистор. Какой номинал резистора?

Открываешь даташит диода. Смотришь прямое напряжение (Up) и рабчий ток (I). Измеряешь напряжение на пине (Upin). Дальше считаешь (Upin-Up)/I - получаешь сопротивление. Берёшь ближайший больший номинал.

Даташит на диод врядли найду, так как выдрал его из старого пульта.

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

ali_vlad пишет:

Даташит на диод врядли найду, так как выдрал его из старого пульта.

Мда, они бывают на 20mA, а бывают и на 500.

Ну, экспериментируйте. Подбирайте ток, чтобы работал.

ali_vlad
Offline
Зарегистрирован: 20.02.2015

ЕвгенийП пишет:

ali_vlad пишет:

Даташит на диод врядли найду, так как выдрал его из старого пульта.

Мда, они бывают на 20mA, а бывают и на 500.

Ну, экспериментируйте. Подбирайте ток, чтобы работал.

Так сколько вешать в Омах?

Yarik.Yar
Offline
Зарегистрирован: 07.09.2014

(Подключаясь к всеобщему мозгу человечества, раскручивая магический шар и закуривая ядрёную траву) Воткните на 1КОм, попробуйте!  Экс-пе-ри-мен-тируйте!

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

ali_vlad пишет:

Так сколько вешать в Омах?

Да, хрен же его знает, что у Вас там за диод-то. Откуда хоть Вы его выдрали?

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

Если выдрали из более или менее стандартного пульта, то то ток может быть от 50ма до 1,5А. Например, вот такой.

Ну, попробуйте сделать 50мА нормой и 1,5А в пике. Должен заработать. Даже если 50 - многовато, сгореть не должен, там очень короткие импульсы.

Кстати, на такой ток не вздумайте вешать на пин, только через ключевой транзистор. При выборе транзистора помните, что до 1,5А в пике может быть.

 

std
Offline
Зарегистрирован: 05.01.2012

Для светодиодов Vishay TSAL6100/6200 от 5В резистор 39 Ом, от 3.3В - 22 Ом. Они тёмно-синего цвета, 5 мм:

Для неизвестных светодиодов, выдранных из китайских пультов ставлю от 100 до 220 Ом, дальность выходит 5-10 метров. Они бесцветные, 3 мм:

Реально ток через них что-то около 15 мА. Хз, может можно больше.

ali_vlad
Offline
Зарегистрирован: 20.02.2015

Отрыл похожий светодиод 

  • Forward Voltage: 1.5~1.6V
  • Forward Current: 60mA Continuous, 120mA peak

Может посоветуете схему обвязки?

std
Offline
Зарегистрирован: 05.01.2012

Идёте на led.linear1.org и забиваете указанные вами цифры, получите номинал резистора, транзистор ставите такой чтобы выдержал этот ток (подсказка: КТ315)

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

Транзистор практически любой на ток от 150 mA (например, 2N2222A, C1815,  2N3904, S9013H, S8050D, A42, 2N5551 и т.п.).

Резистор в базу зависит от транзистора, когда выберете транзистор, посчитаете.

Схема включения зависит от типа транзистора, когда выберете транзистор - определитесь

Резистор в цепь нагрузки зависит от напряжения питания нагрузки. Какое у Вас? Берёте напряжение питания, вычитаете из него падение на светодиоде (1.6V) и падение на транзисторе (0,65В) и то, что получилось, делите на ток светодиода. Т.е., если напряжение питания у Вас 5В, получаете (5-1,6-0,65) /0,120 = 2,29Ом. Такой, вроде как бывает (в ряде E192), но я ни разу не видел. Из ряда Е24 берёте ближайший в большую сторону - 24 ома.

ali_vlad
Offline
Зарегистрирован: 20.02.2015

Что-то я вообще ничего не понял. Можно схемку?

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

Вы не знаете как транзистор ставить?

Вот здесь, на правой стороне страницы 2. Только там пачка диодов, а у Вас один будет. Резистор который там 2.2К - это то, что я называл "в базе", а резистор на 470 ом - в цепи нагрузки.

У Вас будут другие номиналы. но их не посчитать пока Вы не определитесь с транзистором. Всё от него считается.

ali_vlad
Offline
Зарегистрирован: 20.02.2015

В том же пульте есть транзистор 9014 128. Его можно использовать? В нашей дыре не всё можно найти.

janclod
Offline
Зарегистрирован: 17.04.2016

Привет. Потратил уже 2 дня на решение своей проблемы, помогайте, гугл не даёт ничего. Собираю термостат, исходный код нашёл на ютюбе, у человека управление осуществляется кнопками на lcd шилде, я заменил часть с кнопками на свою, получается выйти в меню, но в самом меню почему-то не обрабатываются команды с пульта.

#include <EEPROM.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <IRremote.h>
#define DS1307_I2C_ADDRESS 0x68
int RECV_PIN = 6;
IRrecv irrecv(RECV_PIN);
decode_results results;
LiquidCrystal_I2C lcd(0x27, 16, 2);
const byte outPin = 2; // выход на реле
byte setMinClockOn; // 
byte setHorClockOn;
byte setMinClockOff; // 
byte setHorClockOff;
uint32_t val; // переменная значений кнопок
byte key(){ //// для кнопок ЛСДшилда
  
 
    if (val==0xFF22DD) return 5;
    else if (val==0xFFC23D) return 3;
    else if (val==0xFF629D) return 4;
    else if (val==0xFFA857) return 2;
    else if (val==0xFF02FD) return 1;
    else return 0;  
}


/////////// часы ..
byte decToBcd(byte val){
  return ( (val/10*16) + (val%10) );
}

byte bcdToDec(byte val){
  return ( (val/16*10) + (val%16) );
}

void setDateDs1307(byte second,        // 0-59
                   byte minute,        // 0-59
                   byte hour,          // 1-23
                   byte dayOfWeek,     // 1-7
                   byte dayOfMonth,    // 1-28/29/30/31
                   byte month,         // 1-12
                   byte year)          // 0-99
{
   Wire.beginTransmission(DS1307_I2C_ADDRESS);
   Wire.write(0);
   Wire.write(decToBcd(second));    
   Wire.write(decToBcd(minute));
   Wire.write(decToBcd(hour));     
   Wire.write(decToBcd(dayOfWeek));
   Wire.write(decToBcd(dayOfMonth));
   Wire.write(decToBcd(month));
   Wire.write(decToBcd(year));
   Wire.endTransmission();
}

void getDateDs1307(byte *second,
          byte *minute,
          byte *hour,
          byte *dayOfWeek,
          byte *dayOfMonth,
          byte *month,
          byte *year)
{

  Wire.beginTransmission(DS1307_I2C_ADDRESS);
  Wire.write(0);
  Wire.endTransmission();

  Wire.requestFrom(DS1307_I2C_ADDRESS, 7);

  *second     = bcdToDec(Wire.read() & 0x7f);
  *minute     = bcdToDec(Wire.read());
  *hour       = bcdToDec(Wire.read() & 0x3f); 
  *dayOfWeek  = bcdToDec(Wire.read());
  *dayOfMonth = bcdToDec(Wire.read());
  *month      = bcdToDec(Wire.read());
  *year       = bcdToDec(Wire.read());
}
////
void setClock(){ // установка часов
  byte pos = 1;
  byte second, minute, hour, dayOfWeek, dayOfMonth, month, year; 
    getDateDs1307(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month, &year);
  
    lcd.clear();
    lcd.blink();

   while(key() != 1){ // крутим   цикл   
    byte KEY = key(); // читаем состояние кнопок
      delay(200);
    lcd.setCursor(1, 1);
    lcd.print("set to save");
    lcd.setCursor(0, 0);     // выводим инфу
     if (hour < 10) lcd.print("0");
    lcd.print(hour);
    lcd.print(":");
     if (minute < 10) lcd.print("0"); 
    lcd.print(minute);  
    lcd.print(" ");     
     if (dayOfMonth < 10) lcd.print("0");
    lcd.print(dayOfMonth);
    lcd.print("/");
     if (month < 10) lcd.print("0");
    lcd.print(month);
    lcd.print("/");
     if (year < 10) lcd.print("0");
    lcd.print(year);
    
    lcd.setCursor(pos, 0); // устанавливаем курсор согласно позиции
    
    if (KEY == 5 && pos < 13) pos += 3; // крутим позицию
    else if (KEY == 2 && pos > 1) pos -= 3;
    
    else if (pos == 1 && KEY == 3) hour++; // крутим значения
    else if (pos == 1 && KEY == 4) hour--;
    else if (pos == 4 && KEY == 3) minute++;
    else if (pos == 4 && KEY == 4) minute--;    
    else if (pos == 7 && KEY == 3) dayOfMonth++;
    else if (pos == 7 && KEY == 4) dayOfMonth--;    
    else if (pos == 10 && KEY == 3) month++;
    else if (pos == 10 && KEY == 4) month--;    
    else if (pos == 13 && KEY == 3) year++;
    else if (pos == 13 && KEY == 4) year--;  
    
    if (hour > 23) hour = 0;
    else if (minute > 59) minute = 0;
    else if (dayOfMonth > 31) dayOfMonth = 0;
    else if (month > 12) month = 1;
    else if (year > 99) year = 0;
  }// конец цикла
  
 setDateDs1307(second, minute, hour, dayOfWeek, dayOfMonth, month, year); 
   lcd.noBlink(); 
   lcd.clear();
   lcd.print("     Saved");
   delay(1500);
}///

void setOnOff(){    
  byte pos = 0;   
    lcd.clear();
    lcd.blink();

   while(key() != 1){ // крутим   цикл   
    byte KEY = key(); // читаем состояние кнопок
      delay(200);
    lcd.setCursor(1, 1);
    lcd.print("set to save");
    lcd.setCursor(0, 0);     // выводим инфу
     if (setHorClockOn < 10) lcd.print("0");
    lcd.print(setHorClockOn);
    lcd.print(":");
     if (setMinClockOn < 10) lcd.print("0"); 
    lcd.print(setMinClockOn);  
    lcd.print(" ");     
     if (setHorClockOff < 10) lcd.print("0");
    lcd.print(setHorClockOff);
    lcd.print(":");
     if (setMinClockOff < 10) lcd.print("0");
    lcd.print(setMinClockOff); 
    
    lcd.setCursor(pos, 0); // устанавливаем курсор согласно позиции
    
    if (KEY == 5 && pos < 9) pos += 3; // крутим позицию
    else if (KEY == 2 && pos > 1) pos -= 3;
    
    else if (pos == 0 && KEY == 3) setHorClockOn++; // крутим значения
    else if (pos == 0 && KEY == 4) setHorClockOn--;
    else if (pos == 3 && KEY == 3) setMinClockOn++;
    else if (pos == 3 && KEY == 4) setMinClockOn--;    
    else if (pos == 6 && KEY == 3) setHorClockOff++;
    else if (pos == 6 && KEY == 4) setHorClockOff--;    
    else if (pos == 9 && KEY == 3) setMinClockOff++;
    else if (pos == 9 && KEY == 4) setMinClockOff--;    
 
    
    if (setHorClockOn > 23) setHorClockOn = 0;
    else if (setMinClockOn > 59) setMinClockOn = 0;
    else if (setHorClockOff > 23) setHorClockOff = 0;
    else if (setMinClockOff > 59) setMinClockOff = 0;
    
  }// конец цикла
   lcd.noBlink(); 
   lcd.clear();

   EEPROM.write(0, setMinClockOn);
   EEPROM.write(1, setHorClockOn);
   EEPROM.write(3, setMinClockOff);
   EEPROM.write(4, setHorClockOff);

   lcd.print("     Saved");
   delay(1500);
}///
 
void menu(){
  lcd.clear();
  char menuTxt[2][14] = {"set ON/OFF >>", "set clock  >>"};
  byte pos = 0;
  
  while(1){  
      
    byte KEY = key();
    
    lcd.setCursor(0, 0);
    lcd.print(pos+1);
    lcd.print(".");
    lcd.print(menuTxt[pos]);
    
    if (KEY == 3 && pos != 0) pos--;
    else if (KEY == 4 && pos < 1) pos++;
    
    if (KEY == 5 && pos == 0) setOnOff();
    else if (KEY == 5 && pos == 1) setClock(); 
  }
}  
 
void setup(){
  Wire.begin(); 
  lcd.begin();
  lcd.clear();
  irrecv.enableIRIn();
  pinMode(outPin, OUTPUT);
  digitalWrite(outPin, HIGH);
  Serial.begin(9600);
  setMinClockOn = EEPROM.read(0);
  setHorClockOn = EEPROM.read(1);
  setMinClockOff = EEPROM.read(3);
  setHorClockOff = EEPROM.read(4);

delay(300);
}

void loop()
{
  if (irrecv.decode(&results)) { // если пришел пакет  
    if (results.value != 0xFFFFFFFF){ // и этот пакет не FF
     val = results.value; // сохраняем правельный пакет в переменную     
    } 
  byte second, minute, hour, dayOfWeek, dayOfMonth, month, year;  
  getDateDs1307(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month, &year);
  
  // обработка кнопок
  if (key() == 1) menu(); // если нажата селект
  else if (key() == 3) digitalWrite(outPin, HIGH);
  else if (key() == 4) digitalWrite(outPin, LOW);

  // сравниваем время и управляем выходом// 
  if (setMinClockOff == minute && setHorClockOff == hour
      && second == 0) digitalWrite(outPin, LOW);
  if (setMinClockOn == minute && setHorClockOn == hour
      && second == 0) digitalWrite(outPin, HIGH);    
 
 
//   lcd.clear();
    lcd.setCursor(0, 0);
     if (hour < 10) lcd.print("0"); 
    lcd.print(hour); 
    lcd.print(":");
     if (minute < 10) lcd.print("0"); 
    lcd.print(minute);
//  lcd.print(":");
//   if (second < 10) lcd.print("0");
//  lcd.print(second);
//    lcd.setCursor(8, 0); 
//    lcd.print("    ");  
    lcd.setCursor(0, 1);
     if (dayOfMonth < 10) lcd.print("0");
    lcd.print(dayOfMonth);
    lcd.print("/");
     if (month < 10) lcd.print("0");
    lcd.print(month);
    lcd.print("/");
     if (year < 10) lcd.print("0");
    lcd.print(year);
     //
    lcd.setCursor(11, 0);
     if (setHorClockOn < 10) lcd.print("0"); 
    lcd.print(setHorClockOn); 
    lcd.print(":");
     if (setMinClockOn < 10) lcd.print("0"); 
    lcd.print(setMinClockOn);
    
    lcd.setCursor(11, 1);
     if (setHorClockOff < 10) lcd.print("0"); 
    lcd.print(setHorClockOff); 
    lcd.print(":");
     if (setMinClockOff < 10) lcd.print("0"); 
    lcd.print(setMinClockOff);      
   
    lcd.setCursor(7, 0);
    if (digitalRead(outPin)) lcd.print("ON ");
    else lcd.print("Off");
  
irrecv.resume(); // 

}

    

}

Если в меню не входить, то всё работает как задано здесь:

// обработка кнопок
  if (key() == 1) menu(); // если нажата селект
  else if (key() == 3) digitalWrite(outPin, HIGH);
  else if (key() == 4) digitalWrite(outPin, LOW);

Помогите пожалуйста, как заставить работать кнопки в самом меню?

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

Влад, ну, что Вы как маленький, я же Вам написал в посте №19

ЕвгенийП пишет:

Транзистор практически любой на ток от 150 mA

Кто Вам не даёт открыть даташит 1914 и посмотреть, что ток у него до 100mA? значит не подходит. Почему я за Вас смотрю? Для этого какие-то особые знания и умения нужны?

И что у Вас за дыра такая, что нет ни почты, ни "Евросети"?

Если время терпит, то закажите на али по 2р. 45 коп. за штуку - доставка по почте от трёх недель до полутора месяцев.

Если не терпит, закажите в чипедипе по 7р. за штуку  - доставка в любой, ближайший к Вам магазин "Евросеть" в течение нескольких дней.

В моей дыре вообще нет ни одного магазина, торгующего деталями. Каждый резистор, каждый конденсатор - всё заказываю, и ничего, живу.

 

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

janclod пишет:

Привет. Потратил уже 2 дня на решение своей проблемы,

А ничего, что это тема о другом? Откройте свою и там спрашивайте.

ali_vlad
Offline
Зарегистрирован: 20.02.2015

Перенес сие извращение на Arduino Nano, ибо Pro Micro слабовата по току. Nano зажигает гирлянду светодиодов и ничё. Попробую сначала с переменным резистором на 1К последовательно.

ali_vlad
Offline
Зарегистрирован: 20.02.2015

Вроде заработало.

Плата Arduino Nano, выход беру с D3

#include <IRremote.h>
IRsend irsend;
const int read1 = A0;//левый блок кнопок
const int read2 = A1;//правый блок кнопок
float val1=0;
float val2=0;         
float lastval1=0;
float lastval2=0;
int pause1=180;//Задержка после нажатия кнопок
int pause2=200;//Задержка после нажатия кнопrи SRC
// Коды сняты с пульта
//[Влево]       9D6250AF
//[Вправо]      9D62D02F 
//[Громкость +]	9D6228D7 
//[Громкость –]	9D62A857
//[ + ]		9D62B04F
//[ – ]		9D6230CF
//[SRC]		9D62C837

//Расположение кнопок на блоках
//Громкость +  правый
//Громкость -  правый
//Следующий    правый
//Предыдущий   правый
//Источник     правый
//Громковсть + левый
//Громкость -  левый
//+            левый
//-            левый

void setup()
{
  pinMode (read1, INPUT);
  pinMode (read2, INPUT);
  Serial.begin(9600);              
}
void loop()
{
  ///////////////////    Обработка правого блока кнопок     ////////////////////// 
  val1 = analogRead(read1);
  val2 = analogRead(read2);
  if (val1>10 && val1<1000)//фильтр от помех
  {
    if (val1 != lastval1)//если значение изменилось
    {
      delay (pause1);//задержку подбирал на свой вкус
      if (val1>840&&val1<850)//Громкость +
      {
        Serial.println(" R. Vol +");//Контроль
        irsend.sendNEC(0x9D6228D7, 32);
        lastval1=val1;
      }
      if (val1>890&&val1<900)//Громкость -
      {
        Serial.println(" R. Vol -");//Контроль
        irsend.sendNEC(0x9D62A857, 32);
        lastval1=val1;
      }
      if (val1>690&&val1<700)//Выбор источника
      {
        Serial.println(" R. SRC");//Контроль
        irsend.sendNEC(0x9D62C837, 32);
        lastval1=val1;
        delay (pause2);//дополительная задержка
      }
      if (val1>295&&val1<315)//Вправо
      {
        Serial.println(" R. >>");//Контроль
        irsend.sendNEC(0x9D62D02F, 32);
        lastval1=val1;
      }
      if (val1>530&&val1<555)//Влево
      {
        Serial.println(" R. <<");//Контроль
        irsend.sendNEC(0x9D6250AF, 32);
        lastval1=val1;
      }
    }
  }
  ///////////////////    Обработка левого блока кнопок     ////////////////////// 
  if (val2>10 && val2<1000)//фильтр от помех
  {
    if (val2 != lastval2)//если значение изменилось
    {
      delay (pause1);//задержку подбирал на свой вкус
      if (val2>530&&val2<600)//Громкость +
      {
        Serial.println(" L. Vol +");//Контроль
        irsend.sendNEC(0x9D6228D7, 32);
        lastval2=val2;
      }
      if (val2>840&&val2<900)//Громкость -
      {
        Serial.println(" L. Vol -");//Контроль
        irsend.sendNEC(0x9D62A857, 32);
        lastval2=val2;
      }
    }
    if (val2>300&&val2<340)//Вверх
    {
      Serial.println(" L. +");//Контроль
      irsend.sendNEC(0x9D62D02F, 32);
      lastval2=val2;
    }
    if (val2>690&&val2<720)//Вниз
    {
      Serial.println(" L. -");//Контроль
      irsend.sendNEC(0x9D6250AF, 32);
      lastval2=val2;
    }
  }
}

 

ali_vlad
Offline
Зарегистрирован: 20.02.2015

Помогите с обвязкой ардуины.

Если на D3 подключаю ИК-светодиод и подношу его к магнитоле - всё нормально. Если  подключаю D3 на прямую к магнитоле - результат - 0.

ali_vlad
Offline
Зарегистрирован: 20.02.2015

Вопрос по совместимости кодов. Почему один и тот же код в ардуине выглядит так  "9D6228D7 (32 bits)", а официально так: адрес: 0x46B9 значение: 0x14? Как их переводить один в другой?

http://www.wheelremote.ru/rc.shtml?kenwood_rc-547

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

Что-то как-то не сростается с официальным описанием.

или так: адрес 8 бит 0x40    команда 0x01

или так: адрес 16 бит 0x6B86    команда 0x01

Совсем не похоже на 0x9D6250AF. Где тут адрес, где команда?

Единственное, 0x9D62 присутствует во всех кодах с моего пульта, но перевод из HEX(9D62) в DEC получается 55650 (не 18105). Вот меня и интересует перевод из ардуинного NECа в стандартный NEC.

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

Там младшие биты вперед, 0x00000001 будет передано как 0x80000000.

UPD: Прошу прощения, ошибся, нужно смотреть формат данных и реверсировать их согласно описанию (см. ссылку на описание протокола). Например, если адрес = 0x10, то начало передачи будет: 0x08F7..

UPD2: Рассмотрим твои данные: 9D6250AF

Это адрес прямой и инверсный, команда прямая и инверсная.

Адрес 0x9D в реверсе: 0xB9

Команда 0x50 в реверсе: 0x0A

 

ali_vlad
Offline
Зарегистрирован: 20.02.2015

Сам себя запутал. Не то значение взял

9D6228D7

Есть адрес 0x46B9 и значение 0x14 (HEX). Как его перевести на язык ардуины?

Кажись немного въехал

9D62 -> 1001110101100010 -> инвертируем 100011010111001 -> 46B9

Первые четыре цифры - это адрес.

Со значением застрял

14 -> 00010100 -> 00101000 -> 28            где еще 2 цифры? D7 что это?

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

"Реверс" это младший бит поменять со старшим и т.п. Если непонятно, распиши в двоичном виде. Это примерно как прочитать слово наоборот, с конца. Было "вася", стало "ясав" (представь себе, что каждая буква - это один бит). Было b10100010 стало b01000101. Зеркало. Если и это непонятно, то я уже ничем не могу помочь, изучай двоичную систему счисления:

https://ru.wikipedia.org/wiki/%D0%94%D0%B2%D0%BE%D0%B8%D1%87%D0%BD%D0%B0%D1%8F_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D0%B0_%D1%81%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F

ali_vlad
Offline
Зарегистрирован: 20.02.2015

По аналогии перевожу команду из ардуины 28D7 получается EB14, но тут EB явно лишние или я что-то не понял или ардуина с библиотекой врёт.

irsend.sendNEC(0x9D6228, __); Как это правильно написать?

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

В описании протокола всё написано,

28 b00101000
D7 b11010111
 
Здесь явно видно, что 28 и D7 инверсны друг другу, значит просто нужно отбросить D7, как в адресе (см. описание протокола внимательно, передаются command и инверсный command, по одному байту). Оставшемуся 0x28 реверсируем биты и получаем b00010100 = 0x14
 
Почему рассматривают адрес целиком, потому что в одном из вариантов передается не адрес и инверсный адрес, а адрес целиком. Это тоже есть в описании протокола, хотя здесь 0x9D и 0x62 инверсны друг другу.
 
kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

ali_vlad пишет:

irsend.sendNEC(0x9D6228, __); Как это правильно написать?

void  sendNEC        (unsigned long data,  int nbits) ;

ali_vlad
Offline
Зарегистрирован: 20.02.2015

Видимо дело не в програмной части, а в аппаратной. С ик-диодом работает, с магнитолой нет. Видимо нужна схема согласования.

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

"коды пульта считал, сохранил." Если коды сохранены и распознаны библиотекой IRremote как коды протокола NEC, то нужно их точно так же и отправлять (sendNEC(code, 32)), как они получены, без всяких заморочек с реверсом битов и т.п.

Если есть вторая ардуина, то есть смысл с одной посылать код, на второй принимать и проверить, работает ли передатчик, а уже потом пробовать на магнитоле, иначе один немой, другой слепой, если передатчик не пашет, то и работать не будет. Сразу проверить дальность уверенного срабатывания, т.е. на каком удалении начинаются сбои в приеме кодов, либо ни начинают считываться с ошибками.

"С ик-диодом работает, с магнитолой нет." - вот это не совсем понял, передатчик работает? Кто передает и кто принимает?

ali_vlad
Offline
Зарегистрирован: 20.02.2015

Arduino nano в качестве адаптера рулевых кнопок (скетч в посте #27 под спойлером).

К выходу D3 подключаю ИК-светодиод и направляю на магнитолу, на руле нажимаю кнопки - реагирует.

Выход D3 подключаю ко входу Remote магнитолы ... - не работает.

Подключаю другой контроллер, который выдает протокол NEC? ко входу Remote магнитолы ... - работает. Другой контроллер оставить не могу,  нужен для других целей.

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

Не нашел в этой теме и никогда не использовал разъем Remote, потому не совсем понятно, откуда информация, что там нужно 3,3В на входе, плюс не совсем понятно, с чего это вдруг нужно подавать модулированный сигнал, предназначенный для IR, на какой либо вход магнитолы? Есть какая то распиновка входного разъема или какое то описание в инете? Что то с трудом верится, что такое вообще бывает (может ошибаюсь, но не верю).

 

ali_vlad
Offline
Зарегистрирован: 20.02.2015

Магнитола - Kenwood kdc-6051u. Есть вход REMOTE для подключения адаптера резистивных кнопок. Данная магнитола на указаном входе понимает только протокол NEC. Про 3.3 вольта: другой адаптер выдает на выходе, который соединен с магнитолой, 3.3 вольта. Вот я и подумал, что нужно 3.3В.

messar
Offline
Зарегистрирован: 25.04.2016

http://arduino.ru/forum/programmirovanie/obrashchenie-k-pamyati-mikrokon...
Извините, что не в тему, прошу о помощи братья

ali_vlad
Offline
Зарегистрирован: 20.02.2015

messar пишет:

http://arduino.ru/forum/programmirovanie/obrashchenie-k-pamyati-mikrokon...
Извините, что не в тему, прошу о помощи братья

Так создайте свою тему

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

ali_vlad пишет:

Магнитола - Kenwood kdc-6051u. Есть вход REMOTE для подключения адаптера резистивных кнопок. Данная магнитола на указаном входе понимает только протокол NEC. Про 3.3 вольта: другой адаптер выдает на выходе, который соединен с магнитолой, 3.3 вольта. Вот я и подумал, что нужно 3.3В.

Увы, не нашел ничего на эту тему, есть только разъем для подключения CDChanger, и управления с кнопок руля, через специальный адаптер. Управлять можно через CAN или аналоговые кнопки. Всё.

Давай порассуждаем логически:

Какой смысл делать вход, как с IR передатчика (а там модулированный частотой 38КГц сигнал)? Никакого, потому что это бессмысленно. Потому что чтобы использовать такой вход нужно лепить специальный адаптер, который NEC сигнал промодулирует. А нафига производителю такой гемор.

Распиновка этого разъема есть? (к которому подключается руль через адаптер).

 

ali_vlad
Offline
Зарегистрирован: 20.02.2015

В том то и дело, машина у меня hyundai accent 2. Там мультируль изначально не предусмотрен. Вставил от getz. Далее адаптер. Есть адаптер (с другого, профильного, сайта). Запрограммировал выход адаптера, который подключен к магнитоле, через прилагаемую оболочку, на выдачу ик-кода nec. Коды снимал этим же адаптером с родного кенвудовского пульта. Совпадают 100% с кодами (ссылка выше). Далее, магнитола. Разъем стандартный, кннвудовский, на который выведено питание, колонки, вход mute, выход питания (наверно для включения усилка или активной антены) и вход remote con.
Так вот что получается: этот (покупной) адаптер считывает нажатые резистивные кнопки и выдает ик-протокол nec, который магнитола проглатывает на ура. Но! Он выдает 3.3В и на выходе стоит какой-то транзистор? и еще чегото. Плата многослойная, точнее не могу сказать.
Предполагаю, что на выходе ардуины должен стоять активный элемент-повторитель, но я в этих делах не силён.

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

"адаптер считывает нажатые резистивные кнопки и выдает ик-протокол nec, который магнитола проглатывает на ура."

Схема есть или какое либо описание адаптера? Пока что видится странным такая сложная конструкция. Я еще понимаю, если адаптер содержит в себе ИК светик и выдает на пульт команды.

 

ali_vlad
Offline
Зарегистрирован: 20.02.2015

По скольку я сам был в неведении, то получается ввёл в зблуждение...

Адаптер выдает ИК-код, только не модулированный, поэтому у меня ничего и не получается при подключении к магнитоле. наверно надо править саму библиотеку, чтобы отключить передачу модуляции, а протокол - тот же.

ali_vlad
Offline
Зарегистрирован: 20.02.2015

Проблема решена. Устройство работает совместно с магнитолой кенвуд и выдает инверсный сигнал. Правда пришлось использовать модифицированную библиотеку (спасибо Дмитрию Г.) в которой удалена модуляция сигнала. Ссылка на библиотеку http://pccar.ru/attachment.php?attachmentid=43584&d=1461668795

ali_vlad
Offline
Зарегистрирован: 20.02.2015

1