Проблема с приемом (модуль 433мГц)
- Войдите на сайт для отправки комментариев
Всем привет!
У меня есть две Arduino Nano, передатчик(433мГц) и приемник(433мГц).
К одной ардуине подключен передатчик и загружен вот такой скетч:
#define txPin 13 int var=3000, i; void SendBit(byte b) { if (b) { digitalWrite(txPin, LOW); delayMicroseconds(640); digitalWrite(txPin, HIGH); delayMicroseconds(320); } else { digitalWrite(txPin, LOW); delayMicroseconds(320); digitalWrite(txPin, HIGH); delayMicroseconds(640); } } void Send_preambula(int preambula) { digitalWrite(txPin, HIGH); delayMicroseconds(preambula); digitalWrite(txPin, LOW); } void SendPerebor(long Code, unsigned int preambula, unsigned int pilot) { for(int i=0; i<8; i++) { // посылку посылаем 4 раза подряд. Send_preambula(preambula); // время стартового импульса for(int i=12; i>0 ; i--) { SendBit(bitRead(Code,i-1)); // побитово перебираем и посылаем код } digitalWrite(txPin, LOW); delayMicroseconds(pilot); } delay(130); } void setup() { pinMode(txPin, OUTPUT); Serial.begin(9600); } void loop() { Serial.print("Otpravlyaem kod "); Serial.print(var); Serial.print(" ("); Serial.print(var, HEX); Serial.println(")"); SendPerebor(var, 320, 11520); Serial.println("Zakonchili"); delay(5000); }
Если вкратце, то каждые 5 секунд 8 раз подряд побитово передается число "3000"(HEX: BB8).
К другой ардуине подключен приемник и загружен вот такой скетч:
#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("PRIEM"); 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.dat_bit); Serial.print("]: "); dump_hex(came.data, came.dat_bit); came.state=0; } }
Он побитово принимает код и выводит в 16-ной системе счисления.
Теперь сама проблема: почему-то код принимается неправильно(или выводится). То есть отправляется "BB8", а приходит "DD1". И так со всеми кодами.
Проблема тут точно не в сверхрегенеративном приемнике, так как стабильно приходит "DD1".
Правильный код приходит только тогда, когда отправляешь код "4095"(HEX: FFF).
И есть еще одна проблема: почему-то не принимаются коды от 1 до 2047. Ну это пока что не важно, так как для начала нужно сделать, чтобы правильно принимался(или отображался) код.
Вообщем, помогите, пожалуйста, исправить мою проблему, а то у меня уже мыслей не осталось, все уже перепробовал.
Только не предлагайте использовать библиотеки - они не подходят для реализации задуманного.
Заранее спасибо!
может просто надо передавать строку и примать строку. т.е. типы данных должны быть одни и теже
У вас криво организован МАнчестер 2 https://youtu.be/NaaG90--n4E?t=517
Не очень понял. Передается последовательность нулей и единиц, и принимается тоже последовательность.
Если имеется ввиду "тип переменной"(типа integer, double, char), то нет, так как приемник каждый импульс по отдельности принимает, а как я хранить буду принятые данные(в переменной какого типа) - это уже не важно.
Довольно-таки интересная лекция, спасибо.
Но вопрос остался, так как там все завязано на напряжение: то есть если напряжение не равно 1/2, то следовательно параллельно пришел еще какой-то пакет. А как проверять на это самое напряжение?
Извиняюсь за глупый вопрос, просто код на прием писал не я(взял из интернета) и просто хочу в нем разобраться, но знаний для этого, по-видимому, не хватает.
Блин вот у вас передатчик и приемник . Вкл выкл. Пусть посылка будет в 1 бит /=\ длительность 640 это 1 320 это 0 если больше это ошибка или начало пакета . Ясно!? Передаем посылку в 2, 3 бита /=\=/=\ где /1\2/3\ последовательность . Если 2 бита в посылке то 3 бит в последовательности это 0 . Надо же выключить передатчик в конце посылки , а не ждать след пакета . Передача байта (8 бит) /1\2/3\4/5\6/7\8/=\ Где = это стоповый бит, пусть будет 0 , ноль короче 1 . Ну а дальше если длительность больше 640 это или ошибка или ждать начало нового пакета. Вот такой принцип легче программировать на прием и на передачу.
Да, я себе это так и представлял. Так 640(320) - это же задержка. И получается, что она не всегда будет равна этим значениям, так как что-то может повлиять на время передачи, или же приемник или передатчик будут двигаться.
Правильно я понимаю, что нужно взять границу побольше на всякий случай?(то есть вместо 640 взять, допустим, 740. А вместо 320 - 420)
Скорее 640+-64 это 1 а 320+- 32 это 0 . А иначе это помехи, и принятый пакет в отбой. У вас же канал в одну сторону . отправляйте 4 раза одно и тоже . Приемник пусть анализирует это повтор старого или новая посылка.
Спасибо большое. Вроде бы разобрался.
Попробуй сам написать, а то в этом разбираться не очень хочется)
Здравствуйте, товарищи! Сижу уже неделю с такой же проблемой. Не могу понять что не так с кодом. У меня в передатчике немного другой код: