MX-05V + MX-FS-03V + пульт Came TOP432NA
- Войдите на сайт для отправки комментариев
Ср, 20/01/2016 - 07:34
Всем привет.
Имею следующие устройства:
MX-05V
MX-FS-03V
пульт Came TOP432NA
Собственно вопрос, можно ли их между собой подружить?
частоты вроде совпадают 433,92 MHz
Тестовые скетчи не работают, вернее не получаю ожидаемого результата, тычу кнопку на пульте, на стороне ардуино тишина.
На приемнике никакой индикации нет, включился он вообще или нет.
Какое значение bits per second выставлять в vw_setup?
Нашел скетч, который работает.
Прием
#define RX 2 #define TIMER_DIV volatile byte level = 255; volatile unsigned long last, len; byte p_level; unsigned long p_len, p_len_prev; struct { uint8_t state; uint8_t data[3], dat_bit; } came; void set_bit(uint8_t *data, uint8_t n) { data[n / 8] |= 1 << (n % 8); } #define CM_MAX_TE 450 #define CM_MIN_TE 250 #define CM_BITS12 12 #define CM_BITS24 24 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; came.data[0] = 0x00; came.data[1] = 0x00; came.data[2] = 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 dump_hex(byte *buf, byte bits) { byte b; for (b = 0; b > (bits + 7) / 8; b++) { if (buf[b] > 0x0f) Serial.print('0'); Serial.print(buf[b], HEX); Serial.print(" "); } Serial.println(""); } void rx_int() { if (level != 255) return; len = micros() - last; last = micros(); if (digitalRead(RX) == HIGH) level = 0; else level = 1; } void setup() { attachInterrupt(0, rx_int, CHANGE); Serial.begin(115200); while (!Serial); Serial.println("MEGA ARDUINO LOGGER"); Serial.println(""); interrupts(); } byte b; void loop() { 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) { Serial.print(came.data[0], HEX); Serial.print(came.data[1], HEX); Serial.print(came.data[2], HEX); //Serial.print("CAME["); Serial.print("came["); Serial.print(came.dat_bit); Serial.print("]: "); dump_hex(came.data, came.dat_bit); came.state = 0; } }Отправка
#define txPin 8 #define Te 320 void setup() { pinMode(txPin, OUTPUT); Serial.begin(9600); } void loop() { SendCame(0b100010001111); } void SendCameBit(byte b) { delayMicroseconds(Te); if (!b) digitalWrite(txPin, HIGH); delayMicroseconds(Te); digitalWrite(txPin, HIGH); delayMicroseconds(Te); digitalWrite(txPin, LOW); } void SendCame(long Code) { for (int j = 0; j < 5; j++) // посылку посылаем как и брелок - 4 раза подряд. { digitalWrite(txPin, HIGH); delayMicroseconds(Te); digitalWrite(txPin, LOW); // посылаем стартовый импульс for (byte i = 12; i > 0; i--) { SendCameBit(bitRead(Code, i - 1)); // побитово перебираем и посылаем код } delay(16); } delay(2000); // сделать паузу после посылки на 2 с }Переработал вышеуказанный код.
В loop убираем комментарий с нужного функционала - прием или передача.
#define pinRX 2 #define pinTX 8 #define CM_MAX_TE 450 #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; }Привет. Спасибо за скетч.
Подключил, запустил. Бортовой огонек TX на Arduino мигает постоянно. При нажатии кнопки на Came TOP432NA загорается постоянно, но монитор порта молчит, кроме инициализированного MEGA ARDUINO LOGGER.
Подскажи, где почитать подробнее про это. Не хватает своего разумения.
Заранее благодарен.
Доброго времени суток!
Возможно тема уже изжевана, но ответа я так и не нашел.
Попробовал скетч и вроде как с брелоком 432NA работает и приходит что-то типа
6D40came[12]:
и это на одной кнопке, а с другой кнопки вообще ничего не приходит
Попробовал для наглядности немного разделить
... Serial.print(came.data[0],HEX); Serial.print("-"); Serial.print(came.data[1],HEX); Serial.print("--"); Serial.print(came.data[2],HEX); Serial.print("---"); Serial.print(" CAME["); //Serial.print("came["); Serial.print(came.dat_bit); Serial.print("]: "); ...В итоге пришло
6D-4--0--- CAME[12]:
Есть подозрение, что что-то идет не так, но что понять я не могу, если это обсуждалось - очень прошу подсказать где, ну и в принципе по проблеме подсказать
Проблема то в чем?
Проблема в том, что 6D-4--0--- CAME[12]: полная чушь. Не такой код. Берем этот 6D40 передаем с учетом инициализации и прочего - и ничего не открывается. Мало того, передаем и сразу ловим что передаем и нифига не 6D40 приходит.
А то что со второй кнопки не ловит - это тоже баг. Т.к. на второй кнопке абсолютно точно имеется открытие второго шлакбаума, с утра проверял - с брелока все ок. Завтра проверю теорию и возможно приложу другой скетч, проверенный на практике.
Предполагаю, что в коде изначаьно добавлена ошибка, чтобы исключить часть людей, поэтому и обратился.
Проблема в том, что 6D-4--0--- CAME[12]: полная чушь. Не такой код.
Конечно не такой. Вы ж его неправильно записали. Вот посмотрите - вы приняли три шестнадцатиричных числа - "6D", "4" и "0". Так с какой же стати вы его записываете как 6D40 ? - числа-то двузначные!
Правильная запись вашего кода - 6D 04 00
Код вы не приводите, поэтому про ошибку ничего сказать не могу. Но вполне возможно, что lдело и не в ошибке. Факторов много. Может у вашего приемника чуть расстроена частота. Или у брелка не вполне точные длительности сигнала - шлагбаум может открываться, а программа не принимает...