Подключение Sharp GP1U521Y (LIGHT DETECTING UNITS)

ulin
Offline
Зарегистрирован: 10.12.2016

Имеется датчик (Sharp GP1U521Y) (доки http://kazus.ru/datasheets/pdf-data/3244764/SHARP/GP1U521Y.html)

Подключен к 9 пину, 5вольт (Arduino Duemilanove, Atmega 328).

Код (стаднартный) "

#include "IRremote.h"
IRrecv irrecv(9); // Указываем пин, к которому подключен приемник
decode_results results;
 
void setup()
{
  Serial.begin(9600); // Выставляем скорость COM порта
  irrecv.enableIRIn(); // Запускаем прием
}
 
void loop() {
  if (irrecv.decode(&results)){ // Если данные пришли
    Serial.println(results.value, HEX); // Отправляем полученную данную в консоль
    irrecv.resume(); // Принимаем следующую команду
  }
}

". На нажатие пульта реагирует, но на компьютер приходят такие значения как(FFFF) или эти значения одинаковы на каждую кнопку и с каждым нажатием я получаю не то что хотелось.

 

Вывод "

25AE7EE0
FFFFFFFF
FFFFFFFF
5A33C757
25AE7EE0
FFFFFFFF
FFFFFFFF
FFFFFFFF
191A4029
FFFFFFFF
E09F2533
FFFFFFFF

----ИНАЯ КНОПКА
FFFFFFFF
591B80E9
FFFFFFFF
FFFFFFFF
5A33C754
1A1A41BA
FFFFFFFF
"

Что делается не правильно, может уникальность датчика или не совсем правильное подключение

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

FF  - обычно означает удержание нажатой кнопки. То есть, если нажать и держать кнопку - сначала выдаётся её уникальный код, а потом просто символы повтора. Но вывод у Вас всё же несколько странный...

ulin
Offline
Зарегистрирован: 10.12.2016

Вот вывод еще, нажималась одна единственная клавиша STOP

"25AE7EE0
25AE7EE0
25AE7EE0
FFFFFFFF
57D22308
DBC8CB72
57D22308
A0F22FDA
FFFFFFFF
FFFFFFFF
FFFFFFFF
FFFFFFFF
5A33C757
25AE7EE0
FFFFFFFF
25AE7EE0
3AF2B941
24AE7D4F

"

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

Поиграйте типо передающего устройства. там в библиотеке IRRemote есть разные типы.

svm
Offline
Зарегистрирован: 06.11.2016

Выводите в монитор в двоичном коде (BIN). Увидите, что при нажатии разных кнопок меняются только несколько разрядов. Остальные для данного пульта неизменны и информации не несут. Вот пример кода генератор управляемый ПДУ. Правда там немного урезанная библиотека ИР приема NECIRrcv.h .

 

//  Чтение IR ПДУ с NEC кодировкой

#include <NECIRrcv.h>     //IR библиотека для NEC пультов
#include <Wire.h>
#define IRPIN 3           // pin  IR детектора
NECIRrcv ir(IRPIN) ;
 long rez;
 byte scan_code;
 byte sr[8];// массив разрядов индикатора

//массив изображений 7 сегментных символов от 0 до 9 и пустота
byte simv[11]={
B00111111, //0
B00000110, //1
B01011011, //2
B01001111, //3
B01100110, //4
B01101101, //5
B01111101, //6
B00000111, //7
B01111111, //8
B01101111, //9
B00000000, //пустота
};
void setup()
{
 // Serial.begin(9600) ;
  ir.begin() ;
  Wire.begin();

// *********инициализация таймеров генератора************


pinMode (9,OUTPUT);      // выход генератора
TCCR1A=1<<COM1A0;        //подключить выход OC1A первого таймера
TCCR1B=0;                //

  
                     // ********** ИНИЦИАЛИЗАЦИЯ  ДИСПЛЕЯ *************
  
Wire.beginTransmission(0x24);      //обращаемся к любому порту 0х24-0х27
   Wire.write(0b01000001);         //включаем:яркость 4,8 битный режим, отображение ON
Wire.endTransmission();            // закрываем сессию
  
}
void loop()
{
  readkl:
  unsigned long ircode ;
    while (ir.available()) {
    ircode = ir.read() ;
    //Serial.print("Scan kode = ") ;
    //Serial.println((ircode>>16)&0xff,DEC) ;// выводим скан коды в монитор 
                          //убрав все лишнее для данного пульта и выводим скан коды
  scan_code=ircode>>16&0xff;

 if (scan_code ==31)rez=0;sr[1]=0;sr[2]=0;sr[3]=0;sr[4]=0;           // обнулить
 if (scan_code ==17 ){rez=rez/10; goto wuw;}// коррекция
 if (scan_code ==17 ){rez=rez/10; goto wuw;}//
  if (scan_code ==11 )rez=rez+1;   //Клавиша "стрелка вверх" увеличить частоту на 1 Гц
 if (scan_code ==14 )rez=rez-1;    //Клавиша "стрелка вниз" уменьшить частоту на 1 Гц
 if (scan_code ==13 );             //Клавиша "OK"
 if (scan_code <10 ){ rez=rez*10; rez= rez+scan_code; }
 if (rez > 9999) rez=0;//                 обнулить если перебор
//Serial.print("REZ = ") ;
// Serial.println(scan_code,DEC) ;//раскоментировать если нужно посмотреть скан код клавиши
 
  wuw:

//Выделяем разряды и записываем их в массив разрядов индикатора
sr[0]=(rez%10);
sr[1]=(rez%100/10);
sr[2]=(rez%1000/100);
sr[3]=(rez%10000/1000);
sr[4]=(rez%100000/10000);
sr[5]=(rez%1000000/100000);
sr[6]=(rez%10000000/1000000);
sr[7]=(rez%100000000/10000000);
 


//           ******** ПИШЕМ В ДИСПЛЕЙ *********
 
Wire.beginTransmission(0x37);//Пишем в 4 разряд
  Wire.write(simv[sr[0]]);
Wire.endTransmission();             // закрываем сессию

Wire.beginTransmission(0x36);//Пишем в 3 разряд
  Wire.write(simv[sr[1]]);
Wire.endTransmission();             // закрываем сессию

Wire.beginTransmission(0x35);//Пишем вo 2 разряд
  Wire.write (simv[sr[2]]);
Wire.endTransmission();             // закрываем сессию

Wire.beginTransmission(0x34);//Пишем в 1 разряд
  Wire.write(simv[sr[3]]);//
Wire.endTransmission();             // закрываем сессию

 delay(200);
//_________________ * ГЕНЕРАТОР * _________________
//http://arduino.ru/forum/proekty/generator-s-reguliruemoei-chastotoi-na-arduino?page=3

static uint32_t enc=1; //переменная счёта энкодера
uint32_t ocr; uint32_t divider; float freq;

 enc = rez; //передаем значение частоты в герцах в ГЕНЕРАТОР
            //расчёт прескалера и OCR по нужной частоте
   divider=1; ocr = (F_CPU / enc /2 /divider);
   if (ocr >65536) { divider=8; ocr = F_CPU / enc /2 /divider;
       if (ocr >65536) { divider=64; ocr = F_CPU / enc /2 /divider;
           if (ocr >65536)  {divider=256; ocr = F_CPU / enc /2 /divider;
               if (ocr >65536) { divider=1024; ocr = F_CPU / enc /2 /divider;
                   if (ocr >65536){ocr=65536; }}}}} OCR1A=ocr-1; 
              //запись в регистр прескалера            
   switch (divider) {
     case 1: TCCR1B=1|(1<<WGM12); break;
      case 8: TCCR1B=2|(1<<WGM12); break;
       case 64: TCCR1B=3|(1<<WGM12); break;
        case 256: TCCR1B=4|(1<<WGM12); break;
         case 1024: TCCR1B=5|(1<<WGM12); break;  }

  
  }
}

В строках 49-55 опрос кодов пульта и удаление лишней информации

ulin
Offline
Зарегистрирован: 10.12.2016

Еще не сказал, пульт TACTICS, шел вместе с GP1U521Y.

Код что-то слижком большой, и пугающий. Про бинарные данные поищю в апи.

svm
Offline
Зарегистрирован: 06.11.2016

Строки 82-99 можете удалить, они выводят на дисплей. Получится генератор от 1 Гц до 8 МГц, ввод частоты с ПДУ.

для просмотра двоичного кода клавиши вставьте строку

// Serial.println(scan_code,BIN) ;//раскоментировать если нужно посмотреть двоичный скан код клавиши

еще проще измените строчку в Вашей программе

Serial.println(results.value, HEX); // Отправляем полученную данную в консоль

только HEX замените на   BIN

 

ulin
Offline
Зарегистрирован: 10.12.2016

1110000101110000101000001011000
11111111111111111111111111111111
11111111111111111111111111111111
11111111111111111111111111111111
1110000101110000101000001011000
1100001001111100010000011011111
11111111111111111111111111111111
11111111111111111111111111111111
11111111111111111111111111111111
11111111111111111111111111111111
11110101111010101110111001111111
11111111111111111111111111111111
11111111111111111111111111111111
1001010101100001111011110110101

Биты получены, кнопка одна и тажа.

svm
Offline
Зарегистрирован: 06.11.2016

Странно, повтор нажатий идет нормально 32 бита едениц, а код нажатия 31 и разный.  Что-то не так, возможно ИР приемник не стыкуется с пультом или библиотека глючит.  У меня неустойчиво работало в двух случаях - когда пульт слишком близко к премнику и он перегружается или когда очень далеко. 

Попробуйте другие пульты, которые есть в хозяйстве.

если убрать строки повтора, то некая закономерность прослеживается

1110000101110000101000001011000
1110000101110000101000001011000
1100001001111100010000011011111
11110101111010101110111001111111
1001010101100001111011110110101
 
первые две строки одинаковые, но 4я более похожа на правду
ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Вы попробовали поиграть типом пульта, как я советовал? Что-нибудь дало?

ulin
Offline
Зарегистрирован: 10.12.2016

Пока не пробовал, щяс пытаюсь вывод понять.

ulin
Offline
Зарегистрирован: 10.12.2016

взял иной пульт, даже удивился что он подошел.

 

"

11111111111111111111111111111111
11111111111111111111111111111111
11111111111111111111111111111111
11111111111111111111111111111111
11111111111111111111111111111111
11111111111111111111111111111111
11111111111111111111111111111111
11111111111111111111111111111111
11111111111111111111111111111111
11111111111111111111111111111111
11111111111111111111111111111111
11111111111111111111111111111111
11111111111111111111111111111111
11111111111111111111111111111111
11111111111111111111111111111111
11111111111111111111111111111111
11111111111111111111111111111111
11111111111111111111111111111111
11111111111111111111111111111111
11111111111111111111111111111111

"

ulin
Offline
Зарегистрирован: 10.12.2016

Пульт от PHILIPS. одни еденицы.

ulin
Offline
Зарегистрирован: 10.12.2016

Пульт BBK "101011010010001010011011100000
11111111111111111111111111111111
1110001101110000101000111101111
11111111111111111111111111111111
11010001101100010010100011000111
11111111111111111111111111111111
1111001000111111011000010010110
11111111111111111111111111111111
1110001101110000101000111101111
11111111111111111111111111111111
110000110100011001101101111110
11111111111111111111111111111111
1110001101110000101000111101111
110000110100011001101101111110
1110001101110000101000111101111

"

ulin
Offline
Зарегистрирован: 10.12.2016

Помоему чего-то в схеме не хватает, иза этого мусор? или сама библиотека?

ulin
Offline
Зарегистрирован: 10.12.2016

BBK КНОПКА CANCEL

"

11111111111111111111111111111111
1101011101001000111000011101111
11111111111111111111111111111111
1110001101110000101000111101111
11111111111111111111111111111111
1110010001010110000010010110111
1101010101001000110111101011000
11111111111111111111111111111111
1001100101100001111101011011101
11111111111111111111111111111111
11111111111111111111111111111111
11111111111111111111111111111111
11111111111111111111111111111111
1110001101110000101000111101111
1111100000111111011010101001111

"

svm
Offline
Зарегистрирован: 06.11.2016

Всего два совпадения 4-я сверху и 2-я снизу, а пульт другой?

Попробуй библиотеку из моего скетча. Она не универсальная, а только для кодирови NEC. Использует таймер 2 и прерывание с 2 пина.

Скетч:

//  Чтение IR ПДУ с NEC кодировкой

#include <NECIRrcv.h>
#define IRPIN 2    // pin  IR детектора

NECIRrcv ir(IRPIN) ;

void setup()
{
  Serial.begin(9600) ;
  ir.begin() ;
}
void loop()
{
  unsigned long ircode ;
    while (ir.available()) {
    ircode = ir.read() ;
    Serial.print("Scan kode = ") ;
    Serial.println(ircode,BIN) ;// выводим скан коды в монитор 
    //Serial.println((ircode>>16)&0xff,DEC) ;// выводим скан коды в монитор 
                          //убрав все лишнее для данного пульта и выводим скан коды
  }
}

Библиотеку могу скинуть. https://yadi.sk/d/z8AL3p9h32w2L3

ulin
Offline
Зарегистрирован: 10.12.2016

Да пульт другой (BBK фирма пульта и его видика, TACTICS родной пульт).

ulin
Offline
Зарегистрирован: 10.12.2016

Библиотеку "NECIRrcv" не могу найти..

ulin
Offline
Зарегистрирован: 10.12.2016

Ок, обновил страницу вижу, пробую.

svm
Offline
Зарегистрирован: 06.11.2016

Скинул на яндекс диск. Смотри выше.

ulin
Offline
Зарегистрирован: 10.12.2016

Реакции нету

svm
Offline
Зарегистрирован: 06.11.2016

выход приемника на 2 пине?

ulin
Offline
Зарегистрирован: 10.12.2016

Да, по коду на втором, вот и он на втором.

svm
Offline
Зарегистрирован: 06.11.2016

А если другие пульты попробовать?

ulin
Offline
Зарегистрирован: 10.12.2016

Три пульта) от разных устройств.

svm
Offline
Зарегистрирован: 06.11.2016

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

Тактовая частота ардуино 16 МГц?

ulin
Offline
Зарегистрирован: 10.12.2016

Кварц на 16. Приемник 38 khz

svm
Offline
Зарегистрирован: 06.11.2016

Непонятно. Может еще кто подключится.

ulin
Offline
Зарегистрирован: 10.12.2016

"Внимание! Если код кнопки будет считываться с ошибками, либо не считываться совсем, необходимо собрать схему с фильтром:" Нашел схему http://student-proger.ru/2013/03/arduino-upravlenie-svetom-s-pulta-dista... Как думаете стоит?

svm
Offline
Зарегистрирован: 06.11.2016

В принципе помочь может. Там собран фильтр по питанию и дополнительная подтяжка выхода. А у Вас осциллографа нет. Глянуть, что на выходе приемника. Приемник фельдеперсовый, по даташиту питание 6.3 В. Что у него на выходе одному богу известно.

ulin
Offline
Зарегистрирован: 10.12.2016

Нашел еще статью "http://webstrannik.ru/podklyuchenie-infrakrasnogo-priemnika-k-Arduino.html" знаете я узнал свой датчик (тот в железной коробке, и распиновка почти тажа) И там есть схема.

ulin
Offline
Зарегистрирован: 10.12.2016

Вобщем спаял я все это дело и странно, пульты старые родные работать перестали, а вот пульт от PHILIPS который вообще отказывался изначально работать вдруг начел адекватные значения выдавать!!

 

"

1000A
1000A
A
A
1000A
1000A
A
A
1000A
1000A
A
A
1000A
1000A

ИНАЯ КНОПКА

1005C
1005C
5C
1005C
5C

" Правда странный он видите иногда от 100 плюсует, иногда бывает у него и FF, и мусор но это редко. Спасибо всем за помощь! Особенно svm.

svm
Offline
Зарегистрирован: 06.11.2016

Поздравляю с успехом. Чтобы легчеразобраться смотри в BIN. Там разница между кодами визуально видна.