Проблема с выводом кода полученного по IR

lihachov
Offline
Зарегистрирован: 20.07.2013

Помогите плиз с такой задачей.

есть телик, хочу сделать ик-удлинитель (в идеале прикрутить к нему блютуз, но т.к. блютуз еще в пути, код принимается с пульта, но суть проблемы не меняется) .

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

сериалпорт выставлен на 800бит/с (т.к. в даташите на ик-приемник).
минус и ТХ соответственно подключены на место где раньше в телике стоял ик приемник.

должен дублировать принятый код  на телик, но этого не происходит....

буду очень благодарен за помощь.

#include <IRremote.h>

int RECV_PIN = 11;
unsigned long BUT;

IRrecv irrecv(RECV_PIN); // ик приемник
decode_results results;

void setup()
{
Serial.begin(800);
irrecv.enableIRIn(); // включаем приемник ик

}

void loop() {

delay(200);

if (irrecv.decode(&results)) {
BUT = results.value;
Serial.println(BUT,HEX);

}
irrecv.resume(); //продолаем принимать ик

}

 

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

Это что это за такой ИК-приемник, который работает по UART'у ??? не покажите ли этот даташит откуда вы это вычитали...

lihachov
Offline
Зарегистрирован: 20.07.2013

Даташит
http://www.chipfind.ru/datasheet/vishay/tsop48xx.htm

в программировании новичок, буду очень благодарен если поможете разобраться и разъясните в этом вопросе))

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

http://arduino.ru/forum/programmirovanie/arduino-rgb-kontroller-podklyuchenie-cherez-provod

Только вот почему бы просто не сделать из дуины ретранслятор ИК сигнала?

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

а в чем смысл? если можно купить готовый ретраслятор за 8 баксов? и не морочиться

lihachov
Offline
Зарегистрирован: 20.07.2013

в дальнейшем хочу использовать вместо пульта телефон на андроиде по блютузу (прога пишется в App Inventor буквально за вечер даже таким новичом в программировании как я).

притом обычный ретранслятор создает неудобства. вариант если рядом со штатным ик-приемником поставить излучатель с ардуины то будет ограниченный функцилнал и куча неудобств.

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

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

так и зачем вам подпаиватся к телевизеру то? нельзя на ардуине поставить диод инфракрасный и мигать им куда хочется хоть с телефона хоть с интернета..? таких решений уже мешок и телега.. готовых...

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

В общем что бы напрямую подключиться в обход ИК-приемника (при этом приемник обязательно нужно выпаять) нужно редактировать библиотеку, а именно - убрать модуляции.

lihachov
Offline
Зарегистрирован: 20.07.2013

с одним вопросом значит разобрался, а то пытался слать данные по уарту, спасибо maksim за подсказки :)

возникает другой, редактирование библиотеки.

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

Примерно так , в файле ...\arduino-1.0\libraries\IRremote\IRremote.cpp меняете эти 3 функции:

void IRsend::mark(int time) {
  // Sends an IR mark for the specified number of microseconds.
  // The mark output is modulated at the PWM frequency.
  //TIMER_ENABLE_PWM; // Enable pin 3 PWM output
  PORTD &= ~(1<<3);
  delayMicroseconds(time);
}

/* Leave pin off for time (given in microseconds) */
void IRsend::space(int time) {
  // Sends an IR space for the specified number of microseconds.
  // A space is no output, so the PWM output is disabled.
  //TIMER_DISABLE_PWM; // Disable pin 3 PWM output
  PORTD |= 1<<3;
  delayMicroseconds(time);
}

void IRsend::enableIROut(int khz) {
  // Enables IR output.  The khz value controls the modulation frequency in kilohertz.
  // The IR output will be on pin 3 (OC2B).
  // This routine is designed for 36-40KHz; if you use it for other values, it's up to you
  // to make sure it gives reasonable results.  (Watch out for overflow / underflow / rounding.)
  // TIMER2 is used in phase-correct PWM mode, with OCR2A controlling the frequency and OCR2B
  // controlling the duty cycle.
  // There is no prescaling, so the output frequency is 16MHz / (2 * OCR2A)
  // To turn the output on and off, we leave the PWM running, but connect and disconnect the output pin.
  // A few hours staring at the ATmega documentation and this will all make sense.
  // See my Secrets of Arduino PWM at <a data-cke-saved-href="http://arcfn.com/2009/07/secrets-of-arduino-pwm.html" href="http://arcfn.com/2009/07/secrets-of-arduino-pwm.html" rel="nofollow">http://arcfn.com/2009/07/secrets-of-arduino-pwm.html</a> for details.

  
  // Disable the Timer2 Interrupt (which is used for receiving IR)
  //TIMER_DISABLE_INTR; //Timer2 Overflow Interrupt
  
  pinMode(3, OUTPUT);
  digitalWrite(3, HIGH); // When not sending PWM, we want it low
  
  // COM2A = 00: disconnect OC2A
  // COM2B = 00: disconnect OC2B; to send signal set to 10: OC2B non-inverted
  // WGM2 = 101: phase-correct PWM with OCRA as top
  // CS2 = 000: no prescaling
  // The top value for the timer.  The modulation frequency will be SYSCLOCK / 2 / OCR2A.
  //TIMER_CONFIG_KHZ(khz);
}

так же быть может надо поменять местами выделенные строки. Подключаться надо по прежнему к 3 выводу дуины.

dimka
dimka аватар
Offline
Зарегистрирован: 21.09.2012

радио-удлинитель ИК пультов

// урок от Дмитрия Осипова - радио-удлинитель ИК пультов

#include <IRremote.h> // это скачанная библиотека

// ВАЖНО !!! (PIN 3;) вЫход ИК передатчика ((PIN 3;)на другой пин изменить нельзя)

#define PanasonicAddress 0x4004 // Panasonic address (Pre data)

#define P1 0x1000809 //ВАЖНО !!! ( 1000809 ) это код кнопки №1 - моего пульта от телевизора Panasonic - у вашего пульта будет другой код - замените на свой

#define P2 0x1008889

#define P3 0x1004849

#define P4 0x100C8C9

#define P5 0x1002829

#define P6 0x100A8A9

#define JVC1 0xFB05 //( FB05 ) это код кнопки пульта от видеокамеры JVC (ZOOM)

#define JVC2 0xFB85

IRsend irsend;

#define button1 9 // пины куда подключен радио приёмник, от радио пульта

#define button2 10

#define button3 11

#define button4 12

void setup()

{

}

void loop() {

if (digitalRead(button1) == HIGH) // при нажатии одной кнопки на радио пульте, выполняются 6 ИК команд

{ irsend.sendPanasonic(PanasonicAddress,P1);

delay(400);

irsend.sendPanasonic(PanasonicAddress,P2);

delay(600);

irsend.sendPanasonic(PanasonicAddress,P3);

delay(800);

irsend.sendPanasonic(PanasonicAddress,P4);

delay(1200);

irsend.sendPanasonic(PanasonicAddress,P5);

delay(1500);

irsend.sendPanasonic(PanasonicAddress,P6);

}

if (digitalRead(button2) == HIGH)

//одной радио кнопкой, включить по ИК, телевизор Panasonic и видеокамеру JVC

{ irsend.sendPanasonic(PanasonicAddress,P1);delay(10);irsend.sendJVC(JVC1, 16,0);}

if (digitalRead(button3) == HIGH)

irsend.sendJVC(JVC1, 16,0);

if (digitalRead(button4) == HIGH)

irsend.sendJVC(JVC2, 16,0);

}

 

dimka
dimka аватар
Offline
Зарегистрирован: 21.09.2012
/*             v.01 Arduino управление домом телефоном Phone Control DTMF Decoder IR extender
 ****************************
 урок от Дмитрия Осипова. http://www.youtube.com/user/d36073?feature=watch
 v.01 Arduino управление домом телефоном Phone Control DTMF Decoder IR extender
 Version 0.1-2013/07/22
 -----------------------------
 изменения; в Version 0.1-2013/07/22 
 1. 
 2. 
 ------------------------------
 идеология;
 звоним с телефона ( назовем его телефон клиент), на другой телефон (назовем его телефон сервер).
 На (телефоне сервере) устанавливаем авто ответ (авто поднятие).
 К (телефону серверу) подключен модуль (DTMF Decoder) через разъем для гарнитуры.
 после до-звона (телефон сервер) сам поднимает трубку и слушает тоновые команды от ( телефона клиента).
 В зависимости от услышанного тона, у нас 12 команд (1,2,3,4,5,6,7,8,9,0,*,#) выполняет то или иное действие.
 
 1. Можно напрямую подключится к контактом  (DTMF Decoder) и управлять удалённым устройством например реле, в режиме "триггер".
 
 2. Через Arduino,  в режиме удержания кнопки То есть нажимая и удерживая кнопку на (телефоне клиента) напряжение идет, отпуская исчезает.
 
 3.Отправка (ИК) инфракрасного сигнала на управляемое устройство, типа удалённый ИК пульт,
 например для включения телевизора, переключения по каналам. 
 Arduino принимает (сигнал) от (DTMF Decoder), и в зависимости от пришедшего
 сигнала, включает соответствующий сигнальный светодиод, и начинает слать записанный ИК код кнопки пульта через ИК передатчик
 на конечное ИК устройство которым хотим управлять например через стены на большом расстоянии.
 ( Заранее прописываем в скетч sketch, ИК коды кнопок ВАШЕГО ИК пульта, для отправки)
 
 ------------------------------------------ 
 скетч sketch: v.01 Arduino управление домом телефоном Phone Control DTMF Decoder IR extender
 http://yadi.sk/d/qFo3Q-3X76ika
 ================================ 
 что нам понадобиться. 
 Аппаратное:
 1. телефон -2 штуки.
 2. Arduino -1 штука.
 3. 12CH Smart Home Controller Voice Phone Control DTMF MT8870 Audio Decoder Modules -1 штука.
 4. ИК инфракрасный передатчик - 1 штука.
 5. Светодиоды нужны только для визуального контроля за процессом. 
 --------------------------------
 программное:
 2. Библиотеки.
 
 1.IRremote, библиотека для работы с ИК сигналом.
 Скачать библиотеку IRremote для ИК пульта
 https://disk.yandex.ru/public/?hash=yNz1au3lm3/yyMHOYtnZ2UGSf19wTvYBZnkx...
 
 IRremote эта библиотека кажется по новее будет
 http://yadi.sk/d/0jIS1tfw6tbb7
 
 https://github.com/shirriff/Arduino-IRremote
 
 =======================================================
 подробную видео инструкцию выложу здесь
 v.01 Arduino управление домом телефоном Phone Control DTMF Decoder IR extender
 https://www.youtube.com/watch?v=KeTRkKmfonk
 ++++++++++++++++++++++++++++++ 
 Вспомогательные видео обзоры, скетчи.....
 
 управление домом через телефон Phone Control DTMF MT8870 Audio Decoder 
 http://www.youtube.com/watch?v=oTZ6NqeKvVU&feature=c4-overview&list=UU7a...  
 
 скетч arduino чтобы узнать код кнопки ИК пульта
 sketch arduino buttons on the remote to learn the code
 https://disk.yandex.ru/public/?hash=KzLtuC1ljISPaCoXw03D6mbiKea8spktcWL5... 
 
 4/6 как ? узнать код - кнопки своего ИК пульта
 http://www.youtube.com/watch?v=InZuGntH_wk
 
 
 v.01 Arduino IR Управление с ИК пульта в режиме удержания кнопки
 https://www.youtube.com/watch?v=AjIASUNiWkY
 
 усилитель ИК инфракрасного сигнала IR infrared signal amplifier на одном транзисторе Arduino
 http://www.youtube.com/watch?v=3EYxONWSyR4
 
 Самый дешевый Arduino Uno 5$ Minimal Atmega328 without Arduino Board
 http://www.youtube.com/watch?v=joSc-AT8o5k
 
 */

// подключаем скачанную библиотеку IRremote
#include <IRremote.h> // это скачанная библиотека 

#define PanasonicAddress      0x4004  

//ВАЖНО !!! (1000809) это код кнопки №1 - моего (ИК)! (инфракрасного пульта)!, -
//-у вашего пульта будет другой код, замените на свой!
#define P1        0x1000809  
#define P2        0x1008889  
#define P3        0x1004849 
#define P4        0x100C8C9  
#define P5        0x1002829 
#define P6        0x1001819
#define P7        0x1009899  
#define P8        0x180C041  
#define P9        0x180A021 
#define P10        0x1801091  
#define P11        0x1004E4F 
#define P12        0x100CECF

#define JVC1      0xFB05 //( FB05 ) это код кнопки пульта от видеокамеры JVC (ZOOM)
#define JVC2      0xFB85

IRsend irsend;

//пины от DTMF Decoder, подключаем к пинам Arduino
// во время поступления тонального сигнала, DTMF_Decoder_Pin меняет своё состояние с HIGH на LOW.
int DTMF_Decoder_Pin1 = 1;    
int DTMF_Decoder_Pin2 = 2;
int DTMF_Decoder_Pin3 = 4;
int DTMF_Decoder_Pin4 = 5;    
int DTMF_Decoder_Pin5 = 6;
int DTMF_Decoder_Pin6 = 7;
int DTMF_Decoder_Pin7 = 8;    
int DTMF_Decoder_Pin8 = 9;
int DTMF_Decoder_Pin9 = 10;
int DTMF_Decoder_Pin10 = 11;    
int DTMF_Decoder_Pin11 = 12;
int DTMF_Decoder_Pin12 = 13;

// во время поступления ЛЮБОГО тонального сигнала, DTMF_Decoder_STD_Pin15 меняет своё состояние с LOW на HIGH 
int DTMF_Decoder_STD_Pin15 = 14;  //пин 14, на Arduino Uno (A0)

//светодиоды подключены к этим пинам
//Светодиоды нужны только для визуального контроля за процессом.
int ledPin1 =  15;  // пин 15, на Arduino Uno (A1)
int ledPin2 =  16; // пин 16, на Arduino Uno (A2)
int ledPin3 =  17;
int ledPin4 =  18;  
int ledPin5 =  19; 

// ВАЖНО !!! (PIN 3;) вЫход ИК передатчика, ((PIN 3;)на другой пин изменить нельзя)!!!
//так устроена IRremote, библиотека для работы с ИК сигналом.
//An IR LED must be connected to the output PWM pin 3.

void setup() {
  // назначаем пины как вЫходы
  pinMode(ledPin1, OUTPUT);  
  pinMode(ledPin2, OUTPUT);
  pinMode(ledPin3, OUTPUT); 
  pinMode(ledPin4, OUTPUT);  
  pinMode(ledPin5, OUTPUT);

  // назначаем пины как ВХоды
  pinMode(DTMF_Decoder_Pin1, INPUT);  
  pinMode(DTMF_Decoder_Pin2, INPUT);
  pinMode(DTMF_Decoder_Pin3, INPUT);  
  pinMode(DTMF_Decoder_Pin4, INPUT);  
  pinMode(DTMF_Decoder_Pin5, INPUT);
  pinMode(DTMF_Decoder_Pin6, INPUT);    
  pinMode(DTMF_Decoder_Pin7, INPUT);  
  pinMode(DTMF_Decoder_Pin8, INPUT);
  pinMode(DTMF_Decoder_Pin9, INPUT); 
  pinMode(DTMF_Decoder_Pin10, INPUT);  
  pinMode(DTMF_Decoder_Pin11, INPUT);
  pinMode(DTMF_Decoder_Pin12, INPUT);

  pinMode(DTMF_Decoder_STD_Pin15, INPUT); 
}

void loop(){
  //если поступил сигнал (-) LOW от DTMF_Decoder_Pin1 И "&&" в этот момент на DTMF_Decoder_STD_Pin15 будет (+) HIGH
  // начинаем отправлять ИК сигнал кнопки ИК пульта через ИК передатчик, и включаем светодиод 
  if (digitalRead(DTMF_Decoder_Pin1) == LOW && (digitalRead(DTMF_Decoder_STD_Pin15) == HIGH))irsend.sendPanasonic(PanasonicAddress,P1),digitalWrite(ledPin1, HIGH);
  if (digitalRead(DTMF_Decoder_Pin2) == LOW && (digitalRead(DTMF_Decoder_STD_Pin15) == HIGH))irsend.sendPanasonic(PanasonicAddress,P2),digitalWrite(ledPin2, HIGH);
  if (digitalRead(DTMF_Decoder_Pin3) == LOW && (digitalRead(DTMF_Decoder_STD_Pin15) == HIGH))irsend.sendPanasonic(PanasonicAddress,P3),digitalWrite(ledPin3, HIGH);
  if (digitalRead(DTMF_Decoder_Pin4) == LOW && (digitalRead(DTMF_Decoder_STD_Pin15) == HIGH))irsend.sendPanasonic(PanasonicAddress,P4),digitalWrite(ledPin4, HIGH);
  if (digitalRead(DTMF_Decoder_Pin5) == LOW && (digitalRead(DTMF_Decoder_STD_Pin15) == HIGH))irsend.sendPanasonic(PanasonicAddress,P5),digitalWrite(ledPin5, HIGH);

  //здесь тоже самое, только без включение светодиода. на Arduino Uno закончились свободные пины
  if (digitalRead(DTMF_Decoder_Pin6) == LOW && (digitalRead(DTMF_Decoder_STD_Pin15) == HIGH))irsend.sendPanasonic(PanasonicAddress,P6);
  if (digitalRead(DTMF_Decoder_Pin7) == LOW && (digitalRead(DTMF_Decoder_STD_Pin15) == HIGH))irsend.sendPanasonic(PanasonicAddress,P7);
  if (digitalRead(DTMF_Decoder_Pin8) == LOW && (digitalRead(DTMF_Decoder_STD_Pin15) == HIGH))irsend.sendPanasonic(PanasonicAddress,P8);
  if (digitalRead(DTMF_Decoder_Pin9) == LOW && (digitalRead(DTMF_Decoder_STD_Pin15) == HIGH))irsend.sendPanasonic(PanasonicAddress,P9);
  if (digitalRead(DTMF_Decoder_Pin10) == LOW && (digitalRead(DTMF_Decoder_STD_Pin15) == HIGH))irsend.sendPanasonic(PanasonicAddress,P10);
  if (digitalRead(DTMF_Decoder_Pin11) == LOW && (digitalRead(DTMF_Decoder_STD_Pin15) == HIGH))irsend.sendPanasonic(PanasonicAddress,P11);
  if (digitalRead(DTMF_Decoder_Pin12) == LOW && (digitalRead(DTMF_Decoder_STD_Pin15) == HIGH))irsend.sendPanasonic(PanasonicAddress,P12);

  // после изменения сигнала DTMF_Decoder_STD_Pin15 с HIGH на LOW, выключаем включённые светодиоды
  if (digitalRead(DTMF_Decoder_STD_Pin15) == LOW) digitalWrite(ledPin1, LOW),digitalWrite(ledPin2, LOW),digitalWrite(ledPin3, LOW)
    ,digitalWrite(ledPin4, LOW),digitalWrite(ledPin5, LOW);    
}

 

dimka
dimka аватар
Offline
Зарегистрирован: 21.09.2012


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

Бот засрал форум, а админам похуй?

lihachov
Offline
Зарегистрирован: 20.07.2013

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

до сих пор не решил проблему, жду когда приедет вторая ардуина..