Проблема с ИК-приемником (TSOP)

abcman
Offline
Зарегистрирован: 10.03.2013

Здравствуйте. Действую по инструкции http://www.compcar.ru/forum/showthread.php?t=4959. Установлено было чистое IDE 1.0.3(да и на 1.0.1 пробовал). Суть такова выдает ошибки. Библиотека IRemote установлена, но постоянно выбивает ошибки. Затем узнал, что нужно еще файлы закинуть в "arduino-1.0.3\hardware\arduino\cores\arduino", однако все равно ошибки. Закинул wiring.c, WProgram.h. Может кто поделится годной информацией?

tsostik
Offline
Зарегистрирован: 28.02.2013

Телепаты в отпуске.

Выложите свой скетч и лог ошибок.

abcman
Offline
Зарегистрирован: 10.03.2013

Такс это лог

core.a(wiring_digital.c.o): In function `pinMode':
C:\arduino-1.0.3\hardware\arduino\cores\arduino/wiring_digital.c:33: undefined reference to `digital_pin_to_bit_mask_PGM'
C:\arduino-1.0.3\hardware\arduino\cores\arduino/wiring_digital.c:33: undefined reference to `digital_pin_to_bit_mask_PGM'
C:\arduino-1.0.3\hardware\arduino\cores\arduino/wiring_digital.c:34: undefined reference to `digital_pin_to_port_PGM'
C:\arduino-1.0.3\hardware\arduino\cores\arduino/wiring_digital.c:34: undefined reference to `digital_pin_to_port_PGM'
C:\arduino-1.0.3\hardware\arduino\cores\arduino/wiring_digital.c:40: undefined reference to `port_to_mode_PGM'
C:\arduino-1.0.3\hardware\arduino\cores\arduino/wiring_digital.c:40: undefined reference to `port_to_mode_PGM'
C:\arduino-1.0.3\hardware\arduino\cores\arduino/wiring_digital.c:41: undefined reference to `port_to_output_PGM'
C:\arduino-1.0.3\hardware\arduino\cores\arduino/wiring_digital.c:41: undefined reference to `port_to_output_PGM'
core.a(wiring_digital.c.o): In function `digitalRead':
C:\arduino-1.0.3\hardware\arduino\cores\arduino/wiring_digital.c:166: undefined reference to `digital_pin_to_timer_PGM'
C:\arduino-1.0.3\hardware\arduino\cores\arduino/wiring_digital.c:166: undefined reference to `digital_pin_to_timer_PGM'
C:\arduino-1.0.3\hardware\arduino\cores\arduino/wiring_digital.c:167: undefined reference to `digital_pin_to_bit_mask_PGM'
C:\arduino-1.0.3\hardware\arduino\cores\arduino/wiring_digital.c:167: undefined reference to `digital_pin_to_bit_mask_PGM'
C:\arduino-1.0.3\hardware\arduino\cores\arduino/wiring_digital.c:168: undefined reference to `digital_pin_to_port_PGM'
C:\arduino-1.0.3\hardware\arduino\cores\arduino/wiring_digital.c:168: undefined reference to `digital_pin_to_port_PGM'
C:\arduino-1.0.3\hardware\arduino\cores\arduino/wiring_digital.c:176: undefined reference to `port_to_input_PGM'
C:\arduino-1.0.3\hardware\arduino\cores\arduino/wiring_digital.c:176: undefined reference to `port_to_input_PGM'

А это код

// http://compcar.ru 
#include <IRremote.h> 
  
byte bytes[4]; 
 int RECV_PIN = 10;    //вход ИК приемника 
IRrecv irrecv(RECV_PIN); 
decode_results results; 
unsigned long ir_dt, old_ir;
  
void setup() 
{ 
  Serial.begin(115200); 
  irrecv.enableIRIn(); // включить приемник 
} 
  
void loop() { 
  if (irrecv.decode(&results))  
  { 
    if (results.value > 0 && results.value < 0xFFFFFFFF) 
    { 
      ir_dt = results.value; 
      bytes[0] = ir_dt & 0xFF;          // преобразовать в 4-байта  
      bytes[1] = (ir_dt & 0xFF00) >> 8;  
      bytes[2] = (ir_dt & 0xFF0000) >> 16; 
      bytes[3] = (ir_dt & 0xFF000000) >> 24; 
      Serial.write( bytes,4); // отправить прочитаное значение компьютеру 
              
      if (old_ir == ir_dt){delay(250);}  //Пауза между короткими нажатиями
      else {delay(500);}// Пауза после первого нажатия и удержания(перед повторами)
      old_ir = ir_dt;
    } 
           if (results.value == 0xFFFFFFFF )
            {
             delay(120); //пауза между повторами
             Serial.write( bytes,4);
            } 
       irrecv.resume(); 
  } 
} 

 

maksim
Offline
Зарегистрирован: 12.02.2012

abcman пишет:

Затем узнал, что нужно еще файлы закинуть в "arduino-1.0.3\hardware\arduino\cores\arduino", однако все равно ошибки. Закинул wiring.c, WProgram.h.

Вот интересно откуда вы это узнали.... 

Скачайте соответствующую своей версии IDE библиотку IRemote, то есть для ArduinoIDE 1.0 и больше. Только папку Arduino-IRremote-master переименуйте в IRremote.

abcman
Offline
Зарегистрирован: 10.03.2013

Код без них ссылался на то, что их нет. Киньте в меня ссылкой не важно на какую версию. Хоть 1.0.1, хоть 1.0.3. Поставлю какую скажите лишь бы работало. Иначе не понятно.

tsostik
Offline
Зарегистрирован: 28.02.2013

maksim опередил :-)

Недостаточно просто подключить нужный заголовочный файл посредством include. Необходимо добавить библиотеку к скетчу.

abcman
Offline
Зарегистрирован: 10.03.2013

Ребят ну что может кто кинет ссылкой?

paf
Offline
Зарегистрирован: 25.01.2013

Библиотека рабочая. 

Путь должен выглядеть: \arduino-1.0.2\libraries\IRremote

Пробуем замечательные примерчики. 

maksim
Offline
Зарегистрирован: 12.02.2012

abcman пишет:

Ребят ну что может кто кинет ссылкой?

Внимательно перечитайте сообщение #3.

maksim
Offline
Зарегистрирован: 12.02.2012

tsostik пишет:
Недостаточно просто подключить нужный заголовочный файл посредством include.
Если библиотека лежит там где надо
paf пишет:
\libraries\IRremote
то достаточно.

abcman
Offline
Зарегистрирован: 10.03.2013

Там не пойми какая версия IRremote

maksim
Offline
Зарегистрирован: 12.02.2012

Где там? 

Если "там" это ссылка из сообщения #3, то это версия библиотеки 0.1 , она поддерживает в том числе версии дуины 1.0 и выше.

tsostik
Offline
Зарегистрирован: 28.02.2013

maksim пишет:

tsostik пишет:
Недостаточно просто подключить нужный заголовочный файл посредством include.
Если библиотека лежит там где надо
paf пишет:
\libraries\IRremote
то достаточно.

Да, действительно наврал. Я недооценивал количество работы, проделываемой вайрингом перед стартом avr-gcc.

abcman
Offline
Зарегистрирован: 10.03.2013

Ребята. Скачал 1.0.2, скачал плагин из 3 сообщения. Тестирую.
 

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

abcman пишет:

      bytes[1] = (ir_dt & 0xFF00) >> 8;  
      bytes[2] = (ir_dt & 0xFF0000) >> 16; 
      bytes[3] = (ir_dt & 0xFF000000) >> 24; 
      Serial.write( bytes,4); // отправить прочитанное значение компьютеру 

Народ, бросьте рабочий примерчик, - как собрать обратно, в число Serial.write( bytes,4), на стороне МК принявшего эти четыре байта?

Пример реализации желаемого для одного байта.

void loop() {
if (Serial.available() > 0) {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(Serial.read());
Serial.flush();
}
}

Спасибо.

maksim
Offline
Зарегистрирован: 12.02.2012
void loop() 
{
  if (Serial.available() > 3) 
  {
    byte temp8[] = {Serial.read(), Serial.read(), Serial.read(), Serial.read()};  
    unsigned long *temp32 = (unsigned long*)&temp8;
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print(temp32[0]);
  }
}

И почитайте про flush().

leshak
Offline
Зарегистрирован: 29.09.2011

>Народ, бросьте рабочий примерчик, - как собрать обратно,

Вот тут Запись в EEPROM | Аппаратная платформа Arduino всякие способы разбора/сбора обсуждались (намек: да вообщем-то так же как вы разбирали, только сдвигать нужно не вправо, а влево)

Или можно вообще не парится, а сразу прочитать в четерех-байтову переменную.

Посмотрите http://arduino.ru/forum/programmirovanie/rabota-s-besprovodnym-modulem-apc220-43#comment-27323

В сообщение #1 внутри loop - пример чтения сразу нескольких байт в массив. (там он называется values), но... на его месте может быть переменная любого типа (в вашем случае, раз шлете четыре байта, то должна быть четерехбайтовая, разве что амперсанд добавить.).

Кстати и отправлять можно так же, как в том примере массив отправляется. Без промежуточного разбора на массив байтов. Сразу вашу ir_dt и пихать в Serial.write  (ну только "обмануть компилятор" сказать ему что ....

А, ладно, че-то запутался в словах. ПРоще показать. Проверить счас не на чем, но  опробуйте такой финт ушами:

  // отправляем
  Serial.write( (byte*)&ir_dt,sizeof(ir_dt)); 
  
  ....
  
  // принимаем
  if(Serial.available()) {
    Serial.readBytes(byte*)&ir_dt,sizeof(ir_dt);
    // что-то делаем с ir_dt
  }

 

 

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

maksim пишет:

void loop() 
{
  if (Serial.available() > 3) 
  {
    byte temp8[] = {Serial.read(), Serial.read(), Serial.read(), Serial.read()};  
    unsigned long *temp32 = (unsigned long*)&temp8;
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print(temp32[0]);
  }
}

Спасибо, Максим - именно это было и не понятно "{Serial.read(), Serial.read(), Serial.read(), Serial.read()}".

maksim пишет:
И почитайте про flush().

Да.