прочитать код пульта arduino
- Войдите на сайт для отправки комментариев
Пнд, 26/06/2017 - 21:16
имеется вот такой пульт. он открывает ворота на паркинге кнопкой B. как бы прочитать его код и использовать кнопку A (да и кнопку B тоже можно) по своему усмотрению (например для включения света). известно что код там статичен, внутри стоит attiny13a, посылка длиной 25 бит вида - 1100000110100111011001111 (для кнопки A). пробовал известные библиотеки но ничего не читается ими.

как прочитать код с радиопульта ???
для начала нужно иметь радиодекодер, настроенный на нужную частоту....
собственно говоря я и хочу сделать радиодекодер. приемник 433.92 у меня конечно есть.
Поконкретнее бы, что за библиотеки известные пробовали, а то так советовать не понятно, может она известна а может и нет. RC-Switch например, как то игрался с ней, отлично перехватывает с простыми модулями стоимостью <1$. Библа на гит-хабе хоститься.
Rc-switch и remoteswitch пробовал. Главное что старый статичный брелок от сигнализации считывается (тоже 25 бит) а этот не хочет
А модуляция точно амплитудная? Может там цифровой передатчик GMSK?
совершенно точно. подключаю осциллограф на выход приемника и вижу код
вот верхние биты читаются библиотекой RCSwitch а нижние не хотят
http://www.skd-gate.ru/produkty/gate/apparatnaya_chast/gatetx/ вот нашел брелок
http://www.skd-gate.ru/produkty/gate/apparatnaya_chast/gaterx/ а вот приемник
вот верхние биты читаются библиотекой 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/
собственно говоря я и хочу сделать радиодекодер. приемник 433.92 у меня конечно есть.
Верхние биты библиотека распознаёт как протокол 5 значит длина импульса 500. Попробовал изменять Настройки но ничего не вышло.
Приёмник у меня от автомобильной сигнализации. А где взять ваш скетч который вместо кодов выдаёт длительность импульсов?
длительность импульсов ардуина без специальных входных цепей врядли померяет.
я думал у вас имеется осциллограф и вы можете посмотреть это на нем.
Приёмник у меня от автомобильной сигнализации. А где взять ваш скетч который вместо кодов выдаёт длительность импульсов?
Вот нашол, получите.
//код работает,выдает длительность импульсов. 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(); }Вот тут видно длительности импульсов нулей и единиц!
Вот, купи, и будет тебе счастье! https://www.chipdip.ru/product/433mhz-kit-transceiver
Работает с ардуино на 100%
я бы написал так
{ 500, { 1, 24 }, { 2, 1 }, { 2, 1 }, false }, // 24 или 25 или 26или
{ 320, { 1, 24 }, { 2, 1 }, { 2, 1 }, false }, // 24 или 25 или 26https://ru.aliexpress.com/item/Best-prices-1-pair-2pcs-433Mhz-RF-transmitter-and-receiver-link-kit-for-Arduino-ARM-MCU/32274252129.html
попробовал все 6 вариантов. не видит
это ты сколько раз на кнопки нажимал? вот он тебе показал все длительности импульсов, и нулей и единиц! Какие еще вопросы есть?
синхронизация напрочь отсутствует. такие вещи нужно запитывать от батарей. бп не годится.
я насчитал 56 бит
синхронизация напрочь отсутствует. такие вещи нужно запитывать от батарей. бп не годится.
я насчитал 56 бит
вы про что именно? путьт запитан от батарейки если я правильно понял
нужно мерять в приемнике....
я читал вот так
попробуйте запитать ардуину через разьем для питания от кроны.
при питании от USB напряжение питания намикроконтроллер и подключаемую перефирию 3.3в
да 5 вольт там на переферии...
вот три нажатия на кнопку пульта
давайте просто исключим радиоканал. я напрямую припаяю ардуину к тини13. я прочитал прошивку пульта и записал в новую тини. на выводе 3 получаю те же импульсы что и с пульта
код на статичный не похож и не соответствет показаной ранее осциллограме
8 первых бит, дальше задержка, а дальше неизвестно вообще что
попробуй в сктче от Андрея цифру 24 увеличивать с шагом 8
24-32-40-48.... , пока результат не станет статичным, других мыслей у меня нет... (((
я сам только хочу собрать подобное устройство и пытаюсь учиться на чужих ошибках...
возможно нужно подождать других людей в тему, котрые более сведующи...
не читаемо
попробуй скетч, в нем длительность просто заменил на 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(); }316H,644L это вообще нонсенс для скетча
кусок из скетча
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(""); //ничего не пишем и переходим в следующую новую строкуДа, код мне кажется статический, и его очень просто прочитать вот таким скетчем:
#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; }Н_Андрей_Ю
напоминаю что сейчас у меня attiny13 подключена непосредственно к ардуино минуя радиоканал
пауа между пачками кода, которая переводит каретку
Serial.println("");в новую строку в сериале мне указывает на 64-битовый код
пауа между пачками кода, которая переводит каретку
Serial.println("");в новую строку в сериале мне указывает на 64-битовый код
но вы же доверяете больше глазам? на осциллограмме четко 25 бит
1 сигнал может быть инверсным.
2 разверните осциллограму на несколько пачек.
давайте я вам прошивку выложу а вы в протеусе посмотрите? просто не пойму немного что делать. те 25 бит что на осциллограмме что на логическом анализаторе (картинка выше) абсолютно (мамой клянусь) статичны и не изменяются ни при каких условиях. я склоняюсь что это какой то самописный (99% что это так и есть)
у Н_Андрей_Ю скетч для меги
у UNO
ПОМЕНЯЙ НАхм.. а зачем нам передача если мы же принимать пытаемся?
чтобы в мониторе порта видеть что принимаем...
какой-то тупик.
перечитал все снова от первого поста
предлагаю возвратиться назад
если на платеприемника есть джампер для инверсии сигнала, то меняем уровни местами
и в библиотеке пробуем менять строку так
{ 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код составил согласно замеров с пульта и согласно осциллограме + логическийан ализатор
а какойан ализатор...? обычно по кнемупишет и полученный код и тайминги
оба варианте - нет. анализатор Logic 1.2.10. он конечно поддерживает декодирование но такого протокола он не знает. перемычек никаких на приемнике нет да и сейчас я напрямую тини подключил к плате ардуино. может вам все же прошивку дать пульта?
прошивка мне ничего недаст
то есть этот пример из библиотеки
#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(); } }пишет в сериале
???
вообще ничего не пишет
правленую библиотеку скопировали в папку с библиотками для IDE
у меня она тут c:\Program Files (x86)\arduino-1.6.8\libraries\