Радиосвязь между двумя микроконтроллерами

Очень часто возникает потребность получить данные от какого-либо датчика или устройства, находящимся на небольшом расстоянии. Использование ИК, кабелей и др. часто является нецелесообразным решением. И тут выбор падает на радиосвязь. В данной статье описывается интерфейс связи двух микроконтроллеров PIC16F877A с использованием дешевых RF-модулей KST-TX01 и KST-RX806.

Радиосвязь между двумя МК

Модули работают на частоте 433 МГц. Один микроконтроллер PIC16F877A будет запрограммирован на передачу данных от АЦП (RA0/AN0 канал) через встроенный USART-интерфейс со скоростью 1200 бод, без контроля четности, поток 8 бит. Выход TX от USART подает данные на вход модуля KST-TX01, который в свою очередь передает данные на 433 МГц АМ. Другой RF-модуль KST-RX806 принимает эти данные и подает на RX-вход UART второго микроконтроллера. Дополнительно, к обеим МК подключены LCD-дисплеи для отображения переданных и принятых байтах.

Схема передатчика

Схема приемника

Программная часть

Приведенный ниже код для микроконтроллера передатчика и приемника написан при помощи CCS PCWHD компилятора. Код прост для понимания и не требует разъяснений. В CCS PCWHD, выводы для LCD задаются в файле lcd.c. По умолчанию, для подключения LCD используются выводы PORTD (как в схеме выше). Если будут использоваться другие выводы, то необходимо внести соответствующие изменения в файл lcd.c.

Код передатчика:

 #include <16F877A.h> #device *= 16 #device adc=8 #fuses HS, NOWDT, NOPROTECT, NOLVP, PUT #fuses NOBROWNOUT, CPD, NODEBUG, NOWRT #use delay(clock=10MHz) #use rs232(baud=1200, xmit=PIN_C6, bits=8, parity=N)       #include                  void main() {  byte s=0;  lcd_init();  lcd_putc("f");  setup_adc_ports(adc_clock_internal);  setup_adc(AN0);  set_adc_channel(0);  while(true)  {   read_adc(adc_start_only);   while(!adc_done());   s = read_adc(adc_read_only);   lcd_gotoxy(1,1);   printf(lcd_putc, "fTx Data = %u" s);   putc(s);   delay_ms(100);  } } 

Код приемника:

 #include <16F877A.h> #device *= 16 #fuses HS, NOWDT, NOPROTECT, NOLVP, PUT #fuses NOBROWNOUT, CPD, NODEBUG, NOWRT #use delay(clock=10MHz) #use rs232(baud=1200, rcv=PIN_C7, bits=8, parity=N)   #include                    void main() {  byte c;  lcd_init();  lcd_putc("f");  while(true)  {  c=getc();  printf(lcd_putc,"fRx Data = %u",c);  delay_ms(100);  } } 

Фото работы RF-модулей

Как видно, работа с RF-модулями не представляет из себя ничего сложного, достаточно подсоединить их к UART портам микроконтроллеров. Однако, в процессе экспериментов выявилось две особенности. Первая из них — при пересылке 8-бит значения от АЦП, когда число было в районе 250 (dec), на приемнике принимался какой-то мусор. Думаю это из-за того, что в данных содержится слишком много единиц (255 в двоичном коде будет 11111111). Одним из решений, является разделить данные от АЦП на два полубайта и передавать их раздельно. Это несколько уменьшило бы скорость передачи (т.к. добавляются дополнительные данные), зато стало бы меньше ошибок.

Второй особенностью является дальность действия данных модулей. Многие производители модулей заявляют о дальности RF-модулей 10м и выше. Но в реальности, все зависит от длины антенны и качества самих модулей. На практике, длины антенны 30 см вполне хватает для оптимальной дальности связи.

Список радиоэлементов

Обозначение Тип Номинал Количество Примечание Магазин Мой блокнот
МК PIC 8-бит PIC16F877 2 877А
Конденсатор 0.1 мкФ 2
Конденсатор 22 пФ 4
Подстроечный резистор 5 кОм 2
Резистор 10 кОм 2
РОТ Подстроечный резистор 10 кОм 2
Кварцевый резонатор 10 МГц 2
LCD-дисплей 2х8 LCD Display 2
Тактовая кнопка 2
Радиопередающий модуль KST-TX01 1
Радиоприемный модуль KST-RX806 1