прочитать код пульта arduino

iopq
Offline
Зарегистрирован: 05.07.2016

имеется вот такой пульт. он открывает ворота на паркинге кнопкой B. как бы прочитать его код и использовать кнопку A (да и кнопку B тоже можно) по своему усмотрению (например для включения света). известно что код там статичен, внутри стоит attiny13a, посылка длиной 25 бит вида - 1100000110100111011001111 (для кнопки A). пробовал известные библиотеки но ничего не читается ими.

 

DIVGENY
Offline
Зарегистрирован: 23.08.2016

как прочитать код с радиопульта ???

для начала нужно иметь радиодекодер, настроенный на нужную частоту....

iopq
Offline
Зарегистрирован: 05.07.2016

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

Волшебник
Offline
Зарегистрирован: 22.12.2016

Поконкретнее бы, что за библиотеки известные пробовали, а то так советовать не  понятно, может она известна а может и нет. RC-Switch например, как то игрался с ней, отлично перехватывает с простыми  модулями стоимостью <1$. Библа на гит-хабе хоститься.

iopq
Offline
Зарегистрирован: 05.07.2016

Rc-switch и remoteswitch пробовал. Главное что старый статичный брелок от сигнализации считывается (тоже 25 бит) а этот не хочет 

Волшебник
Offline
Зарегистрирован: 22.12.2016

А модуляция точно амплитудная? Может там цифровой передатчик  GMSK?

iopq
Offline
Зарегистрирован: 05.07.2016

совершенно точно. подключаю осциллограф на выход приемника и вижу код

iopq
Offline
Зарегистрирован: 05.07.2016

вот верхние биты читаются библиотекой RCSwitch а нижние не хотят

iopq
Offline
Зарегистрирован: 05.07.2016
DIVGENY
Offline
Зарегистрирован: 23.08.2016

iopq пишет:

вот верхние биты читаются библиотекой RCSwitch а нижние не хотят

невооруженным глазом видно, что на первой осциллограме нули формируются по спаду импульса, а на второй по фронту ( подьему ), думаю средствами библиотеки это настраивается.

библиотеку брал эту

https://github.com/sui77/rc-switch

 

 согласно описанию в RCSwitch.h


struct Protocol {
int pulseLength;      //  длительность импульса в микросекундах, например  350.
HighLow syncFactor;   // Бит синхронизации: {1, 31} означает 1 высокий импульс и 31 низкий импульс
                      // всего импульсов 32. общая длина бит синхронизации 32 * микросекунды пульсации
HighLow zero;         // импульс нуля
HighLow one;          // импульс единицы
/** @brief if true inverts the high and low logic levels in the HighLow structs */
bool invertedSignal;   // инверсия сигнала

находим и пробуй менять параметры в RCSwitch.cpp

static const RCSwitch::Protocol PROGMEM proto[] = {
#endif
  // { 350, {  1, 31 }, {  1,  3 }, {  3,  1 }, false },    // protocol 1        КОММЕНТИРУЕМ ОРИГИНАЛЬНУЮ (строка 76)  В БИБЛИОТКЕ, по ссылке выше

    // пробуем менять на такие параметры

  { 350, {  1, 31 }, {  2,  1 }, {  2,  1 }, false },    // protocol 1        ЭТА СТРОКА ИЗМЕНЕНА
  { 650, {  1, 10 }, {  1,  2 }, {  2,  1 }, false },    // protocol 2
  { 100, { 30, 71 }, {  4, 11 }, {  9,  6 }, false },    // protocol 3
  { 380, {  1,  6 }, {  1,  3 }, {  3,  1 }, false },    // protocol 4
  { 500, {  6, 14 }, {  1,  2 }, {  2,  1 }, false },    // protocol 5
  { 450, { 23,  1 }, {  1,  2 }, {  2,  1 }, true }      // protocol 6 (HT6P20B)
};

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

я бы еще посмотрел на длину импульса осциллографом

еще очень похоже на протокол HT6P20B, но возможно нужно поиграться со временем длительности импульса, синхронизацией и  true   поменять на false

 

http://lmpautomation.com/blog/?p=24

http://criecomeletronica.blogspot.com/2016/04/decoder-ht6p20.html

http://zps-electronics.com/docs/wiegand_rfid_reader_avr/

Н_Андрей_Ю
Н_Андрей_Ю аватар
Offline
Зарегистрирован: 22.12.2016

iopq пишет:

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

Вот с этого и нужно начать, скажи какой у тебя приемник, спрашиваю потому что сам уже собаку съел, на этом деле. Также как и ты вижуосциллографом на выходе четкий меандр, а скетч с программой декодирования не реагирует, хотя автор скетча уверяет что скетч 100% рабочий. Так вот скажу тебе по секрету в приемнике есть проблема! Напиши чем принимаешь! Вот моя тема на форуме! 

iopq
Offline
Зарегистрирован: 05.07.2016

Верхние биты библиотека распознаёт как протокол 5 значит длина импульса 500. Попробовал изменять Настройки но ничего не вышло.

iopq
Offline
Зарегистрирован: 05.07.2016

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

DIVGENY
Offline
Зарегистрирован: 23.08.2016

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

я думал у вас имеется осциллограф и вы можете посмотреть это на нем.

Н_Андрей_Ю
Н_Андрей_Ю аватар
Offline
Зарегистрирован: 22.12.2016

iopq пишет:

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

Сам его ищу, сейчас буду еще раз смотреть куда его положил, жди!

Н_Андрей_Ю
Н_Андрей_Ю аватар
Offline
Зарегистрирован: 22.12.2016

Вот нашол, получите. 

//код работает,выдает длительность импульсов.
int rxPin = 2;  
volatile static unsigned long m=0;
volatile long lastLow=0;
volatile long lastHigh=0;
boolean preambula=0;
  
void setup() {
attachInterrupt(0, grab, CHANGE);
Serial.begin(115200);
 Serial.println("MEGA ARDUINO LOGGER"); 
   Serial.println("CAME"); 
}
 
void loop() {
 
if (lastLow>14500){preambula=1;lastLow=0;}
if (lastHigh>0&&lastHigh<350){preambula=0;} 
if (lastHigh>250&&lastHigh<390&&preambula==1){
preambula=0;
lastHigh=0;
Serial.println("");

 
for (int k=0;k<24;){
if (lastLow>0)
{Serial.print(lastLow);
Serial.print("L,");
lastLow=0;
k=k+1;}
 
if (lastHigh>0)
{Serial.print(lastHigh);
Serial.print("H,");
lastHigh=0;
k=k+1;}
}
}
}
 
void grab()
{
    if (digitalRead(rxPin) == HIGH){lastLow=micros()-m;}
    else{lastHigh=micros()-m;}
    m=micros();
}

 

Вот тут видно длительности импульсов нулей и единиц!

Н_Андрей_Ю
Н_Андрей_Ю аватар
Offline
Зарегистрирован: 22.12.2016

Вот, купи, и будет тебе счастье! https://www.chipdip.ru/product/433mhz-kit-transceiver

Работает с ардуино на 100%

iopq
Offline
Зарегистрирован: 05.07.2016

вот пожалуйста

DIVGENY
Offline
Зарегистрирован: 23.08.2016

я бы написал так

 { 500, {  1, 24 }, {  2,  1 }, {  2,  1 }, false },  //  24 или 25 или 26

или


{ 320, {  1, 24 }, {  2,  1 }, {  2,  1 }, false },  //  24 или 25 или 26

 

https://ru.aliexpress.com/item/Best-prices-1-pair-2pcs-433Mhz-RF-transmitter-and-receiver-link-kit-for-Arduino-ARM-MCU/32274252129.html

iopq
Offline
Зарегистрирован: 05.07.2016

попробовал все 6 вариантов. не видит

iopq
Offline
Зарегистрирован: 05.07.2016
MEGA ARDUINO LOGGER
CAME

612L,616L,356H,636L,360H,628L,348H,648L,340H,308L,684H,304L,692H,640L,336H,320L,676H,648L,336H,648L,340H,320L,680H,312L,
596L,604L,388H,276L,720H,264L,716H,620L,380H,272L,712H,616L,372H,620L,352H,312L,680H,312L,680H,316L,672H,640L,352H,320L,
592L,600L,388H,268L,724H,264L,724H,608L,376H,284L,712H,616L,372H,608L,392H,268L,712H,284L,704H,288L,696H,628L,364H,300L,
576L,612L,372H,288L,700H,284L,700H,288L,700H,620L,360H,304L,692H,296L,692H,628L,360H,632L,356H,300L,696H,292L,688H,300L,
596L,280L,704H,284L,712H,600L,388H,604L,384H,280L,700H,296L,684H,304L,684H,300L,688H,16532L,744H,240L,728H,596L,404H,580L,
584L,280L,704H,288L,704H,628L,376H,284L,700H,624L,368H,616L,380H,280L,700H,292L,692H,296L,692H,632L,360H,308L,692H,300L,
596L,600L,400H,252L,716H,280L,712H,276L,704H,620L,356H,308L,680H,312L,676H,632L,364H,624L,356H,300L,688H,304L,688H,300L,
604L,280L,712H,268L,716H,608L,376H,616L,376H,288L,696H,292L,696H,300L,692H,300L,688H,16536L,744H,240L,728H,604L,400H,588L,
600L,276L,712H,608L,388H,604L,388H,268L,716H,276L,700H,288L,704H,624L,352H,312L,676H,316L,676H,636L,356H,632L,356H,308L,
620L,272L,708H,608L,400H,592L,388H,268L,716H,280L,704H,288L,704H,616L,364H,300L,692H,296L,692H,628L,356H,628L,360H,296L,
600L,272L,720H,596L,404H,584L,400H,260L,712H,276L,708H,280L,708H,620L,368H,296L,696H,288L,696H,624L,364H,624L,352H,308L,
612L,608L,388H,276L,712H,276L,704H,284L,704H,616L,364H,304L,696H,296L,692H,624L,360H,628L,364H,300L,696H,296L,684H,304L,
616L,616L,380H,280L,696H,296L,696H,300L,688H,304L,688H,16560L,736H,248L,736H,584L,400H,588L,408H,580L,400H,596L,400H,588L,
608L,596L,400H,584L,400H,592L,392H,608L,380H,280L,700H,288L,700H,628L,376H,284L,704H,620L,368H,620L,372H,284L,708H,288L,
604L,280L,708H,284L,704H,624L,368H,288L,700H,620L,368H,628L,352H,308L,684H,300L,692H,300L,692H,628L,356H,308L,696H,292L,
600L,276L,720H,276L,704H,616L,360H,636L,352H,308L,700H,296L,688H,300L,684H,304L,692H,16536L,736H,252L,728H,588L,400H,588L,
608L,288L,700H,288L,708H,608L,384H,612L,372H,288L,700H,292L,700H,288L,688H,300L,692H,16540L,740H,248L,732H,584L,404H,592L,
600L,596L,400H,264L,720H,272L,712H,612L,400H,264L,720H,608L,372H,616L,376H,288L,700H,296L,696H,296L,696H,620L,360H,304L,
596L,272L,704H,292L,692H,292L,692H,624L,364H,304L,688H,304L,688H,632L,356H,624L,360H,304L,692H,296L,688H,304L,684H,304L,
600L,272L,720H,268L,712H,284L,708H,608L,372H,296L,696H,292L,692H,624L,368H,616L,364H,292L,692H,300L,688H,304L,672H,320L,
596L,608L,372H,284L,712H,280L,704H,292L,696H,296L,688H,16564L,740H,244L,724H,600L,388H,604L,384H,608L,380H,608L,388H,604L,

 

 

Н_Андрей_Ю
Н_Андрей_Ю аватар
Offline
Зарегистрирован: 22.12.2016

это ты сколько раз на кнопки нажимал? вот он тебе показал все длительности импульсов, и нулей и единиц! Какие еще вопросы есть?

DIVGENY
Offline
Зарегистрирован: 23.08.2016

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

я насчитал 56 бит

iopq
Offline
Зарегистрирован: 05.07.2016

DIVGENY пишет:

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

я насчитал 56 бит

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

DIVGENY
Offline
Зарегистрирован: 23.08.2016
iopq
Offline
Зарегистрирован: 05.07.2016

я читал вот так

DIVGENY
Offline
Зарегистрирован: 23.08.2016

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

при питании от USB напряжение питания намикроконтроллер и подключаемую перефирию 3.3в

iopq
Offline
Зарегистрирован: 05.07.2016

да 5 вольт там на переферии...

 

616L,276L,704H,612L,380H,612L,376H,284L,700H,284L,696H,288L,696H,624L,368H,304L,680H,16564L,712H,620L,692H,82056L,236H,2076L,172H,
616L,280L,704H,612L,380H,612L,376H,284L,700H,292L,700H,292L,696H,624L,368H,304L,680H,16568L,712H,616L,692H,628L,79996L,152H,
612L,276L,708H,616L,380H,608L,376H,288L,700H,288L,700H,288L,692H,632L,364H,304L,680H,16580L,708H,616L,696H,300L,680H,316L,

вот три нажатия на кнопку пульта

 
iopq
Offline
Зарегистрирован: 05.07.2016

давайте просто исключим радиоканал. я напрямую припаяю ардуину к тини13. я прочитал прошивку пульта и записал в новую тини. на выводе 3 получаю те же импульсы что и с пульта

DIVGENY
Offline
Зарегистрирован: 23.08.2016

код на статичный не похож  и не соответствет показаной ранее осциллограме

8 первых бит, дальше задержка, а дальше неизвестно вообще что

попробуй в сктче от Андрея цифру 24 увеличивать с шагом 8

24-32-40-48....  , пока результат не станет статичным, других мыслей у меня нет...  (((

DIVGENY
Offline
Зарегистрирован: 23.08.2016

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

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

iopq
Offline
Зарегистрирован: 05.07.2016
648L,644L,316H,644L,316H,644L,316H,644L,316H,324L,636H,324L,636H,652L,320H,332L,632H,644L,320H,644L,316H,328L,636H,328L,636H,328L,636H,648L,316H,648L,316H,332L,628H,648L,320H,640L,316H,332L,632H,328L,636H,324L,636H,328L,636H,16152L,644H,312L,
644L,648L,316H,644L,320H,640L,320H,640L,320H,324L,636H,324L,636H,656L,316H,332L,632H,644L,316H,644L,316H,324L,636H,324L,636H,328L,636H,648L,316H,652L,316H,328L,636H,644L,316H,644L,316H,324L,636H,324L,636H,328L,636H,328L,636H,16168L,648H,312L,
648L,648L,316H,644L,316H,644L,316H,644L,316H,324L,636H,328L,636H,652L,320H,320L,636H,648L,316H,648L,316H,324L,640H,324L,636H,328L,636H,648L,316H,652L,316H,324L,636H,644L,320H,644L,316H,328L,636H,324L,640H,324L,636H,324L,636H,16152L,644H,316L,
648L,644L,316H,644L,316H,644L,316H,648L,316H,332L,628H,324L,636H,656L,316H,332L,628H,648L,316H,644L,316H,324L,636H,328L,632H,328L,636H,644L,320H,652L,316H,324L,636H,644L,320H,640L,316H,324L,636H,328L,636H,324L,636H,324L,636H,16148L,644H,312L,
648L,644L,316H,644L,316H,644L,316H,648L,316H,332L,628H,324L,636H,652L,320H,324L,632H,644L,316H,644L,320H,320L,636H,328L,632H,328L,632H,644L,316H,652L,316H,324L,636H,648L,316H,644L,316H,324L,636H,324L,636H,324L,632H,328L,636H,16124L,644H,316L,
648L,644L,320H,640L,320H,640L,316H,644L,316H,324L,636H,328L,632H,652L,316H,324L,636H,644L,320H,644L,316H,332L,628H,324L,636H,324L,636H,648L,316H,648L,316H,324L,636H,648L,316H,644L,316H,324L,632H,324L,632H,328L,632H,328L,632H,16164L,648H,312L,
648L,648L,316H,648L,316H,648L,316H,644L,316H,324L,636H,324L,636H,652L,316H,328L,632H,648L,320H,644L,316H,332L,632H,324L,636H,324L,640H,644L,320H,644L,324H,320L,632H,644L,320H,644L,316H,324L,640H,328L,640H,320L,640H,324L,640H,16136L,644H,316L,
648L,644L,320H,648L,320H,644L,320H,640L,316H,332L,628H,328L,636H,656L,320H,328L,632H,648L,316H,648L,320H,332L,632H,328L,636H,328L,636H,648L,320H,652L,316H,324L,636H,648L,316H,648L,316H,324L,636H,328L,636H,328L,636H,328L,636H,16172L,644H,316L,
644L,644L,320H,644L,320H,644L,320H,644L,316H,332L,632H,324L,636H,652L,320H,332L,628H,648L,316H,648L,316H,332L,632H,324L,640H,324L,636H,648L,316H,652L,320H,332L,628H,644L,320H,644L,320H,332L,628H,324L,636H,328L,636H,328L,636H,16144L,644H,312L,
644L,648L,316H,648L,316H,644L,316H,644L,316H,324L,636H,324L,636H,652L,316H,332L,628H,648L,316H,644L,316H,320L,636H,328L,636H,324L,636H,648L,316H,652L,316H,332L,628H,644L,316H,644L,316H,324L,636H,324L,636H,324L,636H,328L,636H,16132L,644H,316L,
648L,644L,316H,648L,316H,644L,316H,644L,316H,332L,628H,324L,632H,652L,316H,332L,628H,648L,316H,644L,316H,324L,636H,324L,636H,324L,636H,648L,316H,648L,316H,320L,632H,644L,320H,640L,320H,320L,632H,328L,636H,324L,636H,324L,636H,16136L,644H,312L,
644L,644L,316H,644L,316H,644L,316H,644L,316H,328L,636H,324L,636H,652L,320H,320L,636H,648L,316H,640L,316H,324L,636H,328L,636H,324L,632H,644L,320H,648L,316H,324L,636H,648L,316H,644L,316H,336L,628H,324L,636H,328L,636H,324L,636H,16160L,644H,316L,
648L,644L,316H,644L,320H,644L,316H,648L,316H,324L,636H,328L,636H,656L,316H,324L,636H,648L,320H,644L,320H,320L,632H,324L,636H,328L,636H,648L,320H,652L,316H,332L,632H,648L,316H,648L,316H,324L,636H,328L,636H,328L,636H,324L,636H,16156L,644H,316L,
648L,648L,320H,644L,320H,644L,320H,648L,320H,320L,636H,324L,636H,656L,316H,332L,632H,648L,320H,648L,320H,328L,628H,324L,636H,328L,636H,648L,316H,656L,316H,332L,632H,648L,316H,648L,320H,332L,632H,328L,636H,328L,636H,328L,636H,16180L,644H,316L,
648L,644L,316H,648L,316H,648L,320H,644L,320H,332L,628H,324L,636H,660L,312H,324L,636H,644L,324H,640L,316H,324L,632H,324L,636H,328L,640H,640L,316H,652L,316H,324L,636H,648L,320H,644L,316H,324L,632H,324L,636H,324L,636H,328L,636H,16168L,644H,316L,
648L,644L,320H,644L,316H,648L,316H,644L,316H,332L,628H,328L,636H,656L,316H,332L,628H,644L,316H,648L,316H,332L,628H,328L,636H,324L,636H,648L,316H,652L,316H,332L,632H,648L,316H,648L,316H,332L,632H,324L,640H,324L,640H,328L,636H,16164L,648H,316L,
648L,648L,316H,648L,320H,648L,316H,648L,320H,324L,636H,328L,640H,652L,316H,324L,636H,648L,316H,648L,320H,328L,632H,324L,636H,328L,636H,648L,316H,652L,320H,332L,632H,648L,316H,648L,316H,332L,632H,324L,636H,328L,636H,324L,632H,16156L,648H,312L,
648L,648L,316H,648L,316H,644L,320H,644L,320H,332L,632H,324L,640H,656L,316H,320L,636H,648L,320H,648L,316H,332L,632H,328L,636H,328L,636H,648L,320H,652L,320H,332L,632H,652L,316H,648L,316H,332L,636H,328L,636H,324L,640H,328L,640H,16220L,644H,316L,
648L,648L,316H,648L,320H,648L,316H,648L,320H,328L,636H,324L,636H,652L,316H,336L,628H,648L,320H,648L,316H,332L,632H,324L,640H,324L,640H,644L,320H,652L,316H,332L,632H,648L,316H,648L,316H,324L,640H,328L,636H,328L,636H,324L,636H,16168L,648H,316L,
648L,648L,324H,640L,316H,644L,320H,644L,320H,332L,628H,324L,640H,652L,320H,324L,636H,648L,320H,644L,320H,332L,632H,324L,636H,324L,640H,648L,316H,656L,316H,332L,632H,648L,316H,644L,316H,328L,636H,328L,636H,328L,636H,324L,640H,16180L,652H,308L,
648L,644L,316H,644L,316H,644L,316H,648L,316H,332L,628H,328L,636H,656L,320H,332L,628H,648L,316H,640L,320H,332L,628H,328L,636H,328L,636H,644L,320H,652L,316H,324L,636H,648L,320H,644L,316H,332L,628H,324L,640H,324L,636H,328L,636H,16164L,648H,316L,
648L,648L,316H,648L,320H,644L,316H,644L,316H,324L,636H,324L,636H,656L,316H,324L,640H,648L,316H,644L,320H,332L,628H,328L,636H,328L,636H,652L,316H,652L,316H,324L,636H,648L,316H,648L,316H,332L,632H,328L,636H,328L,636H,324L,632H,16172L,644H,316L,
644L,644L,316H,644L,316H,644L,316H,644L,316H,324L,636H,328L,636H,652L,320H,324L,636H,644L,316H,644L,316H,324L,636H,328L,636H,324L,636H,648L,316H,652L,316H,324L,636H,648L,316H,644L,316H,324L,636H,328L,636H,328L,636H,324L,636H,16132L,644H,316L,
648L,644L,320H,644L,316H,644L,316H,648L,316H,324L,636H,328L,636H,652L,320H,324L,636H,648L,316H,644L,320H,332L,628H,328L,636H,324L,636H,648L,316H,648L,320H,324L,636H,648L,320H,640L,316H,324L,636H,324L,636H,328L,636H,328L,636H,16136L,644H,312L,
 
тини13 припаяна к ардуине
DIVGENY
Offline
Зарегистрирован: 23.08.2016

не читаемо

попробуй скетч, в нем длительность просто заменил на 1 и 0

//код работает,выдает длительность импульсов.
int rxPin = 2;  
volatile static unsigned long m=0;
volatile long lastLow=0;
volatile long lastHigh=0;
boolean preambula=0;
  
void setup() {
attachInterrupt(0, grab, CHANGE);
Serial.begin(115200);
 Serial.println("MEGA ARDUINO LOGGER"); 
   Serial.println("CAME"); 
}
 
void loop() {
 
if (lastLow>14500){preambula=1;lastLow=0;}
if (lastHigh>0&&lastHigh<350){preambula=0;} 
if (lastHigh>250&&lastHigh<390&&preambula==1){
preambula=0;
lastHigh=0;
Serial.println("");

 
for (int k=0;k<128;){
if (lastLow>0)
{Serial.print("0");
Serial.print(",");
lastLow=0;
k=k+1;}
 
if (lastHigh>0)
{Serial.print("1");
//Serial.print(",");
lastHigh=0;
k=k+1;}
}
}
}
 
void grab()
{
    if (digitalRead(rxPin) == HIGH){lastLow=micros()-m;}
    else{lastHigh=micros()-m;}
    m=micros();
}

 

DIVGENY
Offline
Зарегистрирован: 23.08.2016

316H,644L это вообще нонсенс для скетча

iopq
Offline
Зарегистрирован: 05.07.2016
0,0,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,
0,0,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,
0,0,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,
0,0,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,
0,0,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,
 
DIVGENY
Offline
Зарегистрирован: 23.08.2016

кусок из скетча

if (lastLow>14500){preambula=1;lastLow=0;}     // если импульс 0 больше 14500, то метка =1, импульс 0=0
if (lastHigh>0&&lastHigh<350){preambula=0;}    // если импульс 1 больше 0 и меньше 350, метка =0 
if (lastHigh>250&&lastHigh<390&&preambula==1){ // если импульс 1 больше 250 и меньше 390 и метка равна 1

preambula=0;                                   // обнуляем
lastHigh=0;                                    // обнуляем
Serial.println("");                            //ничего не пишем и переходим в следующую новую строку

 

Н_Андрей_Ю
Н_Андрей_Ю аватар
Offline
Зарегистрирован: 22.12.2016

Да, код мне кажется статический, и его очень просто прочитать вот таким скетчем:

#define pinRX 2
#define pinTX 8

#define CM_MAX_TE 16500
#define CM_MIN_TE 250
#define CM_BITS12 12
#define CM_BITS24 24
#define Te 320

volatile byte level = 255;
volatile unsigned long last;
volatile unsigned long len;
byte p_level;
unsigned long p_len;
unsigned long p_len_prev;
struct
{
    uint8_t state;
    uint8_t data[3], dat_bit;
} came;


void setup()
{
    Serial.begin(9600);
    while (!Serial);
    attachInterrupt(0, pinRX_int, CHANGE);
    pinMode(pinTX, OUTPUT);
    interrupts();
}

void loop()
{
    ////прием
    RfReceive();

    ////передача
    char *code = "000000000000"; // 0-0
    ///char *code = "000000000000000000000000"; // 0-0-0
   RfTransmitt(code, 4);
    delay(2000); // сделать паузу между отправками
}

void RfReceive()
{
    if (level != 255)
    {
        noInterrupts();
        p_level = level;
        p_len = len;
        len = 0;
        level = 255;
        interrupts();
        process_came();
        p_len_prev = p_len;
    }
    if (came.state == 100)
    {
        for (int i = 0; i < sizeof(came.data) - (came.dat_bit == CM_BITS12 ? 1 : 0); i++) {
            if (i > 0) {
                Serial.print("-");
            }
            Serial.print(stringWithPrefix(String(came.data[i], BIN), came.dat_bit == CM_BITS12 ? 6 : 8, '0'));
        }
        came.state = 0;
        Serial.println();
    }
}

void RfTransmitt(char *codeString, unsigned int numberOfShipments)
{
    int codeLength = strlen(codeString);
    if (codeLength != 12 && codeLength != 24)
    {
        Serial.println("incorrect code.");
        return;
    }

    byte code[codeLength];
    for (int i = 0; i < codeLength; i++) {
        code[i] = codeString[i] == '0' ? 0 : 1;
    }

    byte codeUpdate[codeLength];

    int number = 0;

    switch (codeLength) {
    case 12:
        //оратный порядок
        for (int i = 5; i >= 0; i--) {
            codeUpdate[number] = code[i];
            Serial.print(codeUpdate[number]);
            number++;
        }
        Serial.print(" ");
        //прямой порядок
        for (int i = 6; i < 12; i++) {
            codeUpdate[number] = code[i];
            Serial.print(codeUpdate[number]);
            number++;
        }
        break;
    case 24:
        //оратный порядок для всех символов
        for (int i = 1; i <= 3; i++) {
            for (int j = i * 8 - 1; j >= 8 * (i - 1); j--) {
                codeUpdate[number] = code[j];
                Serial.print(codeUpdate[number]);
                number++;
            }
            Serial.print("-");
        }
        break;
    }

    Serial.println();

    for (int i = 0; i < numberOfShipments; i++) // посылку посылаем как и брелок - NS раза подряд.
    {
        digitalWrite(pinTX, HIGH);
        delayMicroseconds(Te);
        digitalWrite(pinTX, LOW); // посылаем стартовый импульс
        for (int j = 0; j < codeLength; j++) {
            SendCameBit(codeUpdate[j]); // побитово перебираем и посылаем код
        }
        delay(16);
    }
}

void pinRX_int()
{
    if (level != 255) return;
    len = micros() - last;
    last = micros();
    if (digitalRead(pinRX) == HIGH) level = 0;
    else level = 1;
}

void process_came()
{
    unsigned char b;

    switch (came.state)
    {
    case 0:
        if (p_level) break;
        came.state = 1;
        break;
    case 1: //start
        if (!p_level) break;

        else if (p_len >= CM_MIN_TE && p_len <= CM_MAX_TE)
        {
            came.state = 2;
            came.dat_bit = 0;

            for (int i = 0; i < sizeof(came.data); i++) {
                came.data[i] = 0x00;
            }

        }
        else came.state = 0;
    case 2: //dat
        if (p_level)
        {
            if (came.dat_bit == CM_BITS24)
            {
                came.state = 0;
                break;
            }

            if (p_len_prev <= CM_MAX_TE && p_len_prev >= CM_MIN_TE &&
                    p_len <= CM_MAX_TE * 2 && p_len >= CM_MIN_TE * 2) b = 0;
            else if (p_len_prev <= CM_MAX_TE * 2 && p_len_prev >= CM_MIN_TE * 2 &&
                     p_len <= CM_MAX_TE && p_len >= CM_MIN_TE) b = 1;
            else
            {
                came.state = 0;
                break;
            }

            if (b) set_bit(came.data, came.dat_bit);
            came.dat_bit++;
            break;
        }
        else
        {
            if ((p_len > 5000) && (came.dat_bit == CM_BITS12 || came.dat_bit == CM_BITS24)) came.state = 100;
        }
        break;
    }
}

void SendCameBit(byte b)
{
    delayMicroseconds(Te);
    if (!b) digitalWrite(pinTX, HIGH);
    delayMicroseconds(Te);
    digitalWrite(pinTX, HIGH);
    delayMicroseconds(Te);
    digitalWrite(pinTX, LOW);
}

void set_bit(uint8_t *data, uint8_t n)
{
    data[n / 8] |= 1 << (n % 8);
}

String stringWithPrefix(String line, int len, char prefix)
{
    String addon = "";
    int n = len - line.length();
    for (int i = 0; i < n; i++) {
        addon += prefix;
    }
    return addon + line;
}

 

iopq
Offline
Зарегистрирован: 05.07.2016
 
0,0,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,
0,0,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,
0,0,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,

 

Н_Андрей_Ю 

 
000000 000000
000000 000000
000000 000000
 

 

напоминаю что сейчас у меня attiny13 подключена непосредственно к ардуино минуя радиоканал

DIVGENY
Offline
Зарегистрирован: 23.08.2016

 пауа между пачками кода, которая переводит каретку

Serial.println(""); 

в новую строку в сериале мне указывает на 64-битовый код

iopq
Offline
Зарегистрирован: 05.07.2016

DIVGENY пишет:

 пауа между пачками кода, которая переводит каретку

Serial.println(""); 

в новую строку в сериале мне указывает на 64-битовый код

но вы же доверяете больше глазам? на осциллограмме четко 25 бит

DIVGENY
Offline
Зарегистрирован: 23.08.2016

1 сигнал может быть инверсным.

2 разверните осциллограму на несколько пачек.

iopq
Offline
Зарегистрирован: 05.07.2016

давайте я вам прошивку выложу а вы в протеусе посмотрите? просто не пойму немного что делать. те 25 бит что на осциллограмме что на логическом анализаторе (картинка выше) абсолютно (мамой клянусь) статичны и не изменяются ни при каких условиях. я склоняюсь что это какой то самописный (99% что это так и есть) 

DIVGENY
Offline
Зарегистрирован: 23.08.2016

у Н_Андрей_Ю скетч для меги

у UNO

#define pinTX 8 

ПОМЕНЯЙ НА

#define pinTX 3 

 

iopq
Offline
Зарегистрирован: 05.07.2016

хм.. а зачем нам передача если мы же принимать пытаемся?

DIVGENY
Offline
Зарегистрирован: 23.08.2016

чтобы в мониторе порта видеть что принимаем...

iopq
Offline
Зарегистрирован: 05.07.2016
#define pinRX 2 - сюда подключена тини13
#define pinTX 3
как были нули так и остались
DIVGENY
Offline
Зарегистрирован: 23.08.2016

какой-то тупик.

перечитал все снова от первого поста

предлагаю возвратиться назад

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

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

{ 320, {  16, 1 }, {  1,  2}, {  2,  1 }, true },    // protocol 1 

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

Форма волны для бита данных значения «0», {1, 3} означает 1 высокий импульс
  * И 3 низких импульса, общая длина (1 + 3) * длина импульса

но может быть получится и так

{ 320, {  1, 16 }, {  2,  1}, {  1,  2 }, false },    // protocol 1 

код составил согласно замеров с пульта и согласно осциллограме + логическийан ализатор

а какойан ализатор...? обычно по кнемупишет и полученный код и тайминги

 

 

 

iopq
Offline
Зарегистрирован: 05.07.2016

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

DIVGENY
Offline
Зарегистрирован: 23.08.2016

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

то есть этот пример из библиотеки

#include <RCSwitch.h>

RCSwitch mySwitch = RCSwitch();

void setup() {
  Serial.begin(9600);
  mySwitch.enableReceive(0);  // Receiver on interrupt 0 => that is pin #2
}

void loop() {
  if (mySwitch.available()) {
    
    int value = mySwitch.getReceivedValue();
    
    if (value == 0) {
      Serial.print("Unknown encoding");
    } else {
      Serial.print("Received ");
      Serial.print( mySwitch.getReceivedValue() );
      Serial.print(" / ");
      Serial.print( mySwitch.getReceivedBitlength() );
      Serial.print("bit ");
      Serial.print("Protocol: ");
      Serial.println( mySwitch.getReceivedProtocol() );
    }

    mySwitch.resetAvailable();
  }
}

пишет в сериале

Unknown encoding

???

 

iopq
Offline
Зарегистрирован: 05.07.2016

вообще ничего не пишет

DIVGENY
Offline
Зарегистрирован: 23.08.2016

правленую библиотеку скопировали в папку с библиотками для IDE

у меня она тут c:\Program Files (x86)\arduino-1.6.8\libraries\