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

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

Очень часто возникает потребность получить данные от какого-либо датчика или устройства, находящимся на небольшом расстоянии. Использование ИК, кабелей и др. часто является нецелесообразным решением. И тут выбор падает на радиосвязь. В данной статье описывается интерфейс связи двух микроконтроллеров 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-модулями не представляет из себя ничего сложного, достаточно подсоединить их к UART портам микроконтроллеров. Однако, в процессе экспериментов выявилось две особенности. Первая из них – при пересылке 8-бит значения от АЦП, когда число было в районе 250 (dec), на приемнике принимался какой-то мусор. Думаю это из-за того, что в данных содержится слишком много единиц (255 в двоичном коде будет 11111111). Одним из решений, является разделить данные от АЦП на два полубайта и передавать их раздельно. Это несколько уменьшило бы скорость передачи (т.к. добавляются дополнительные данные), зато стало бы меньше ошибок.

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

Скачать PDF

Оригинал статьи на английском языке (перевод Колтыков А.В. для сайта cxem.net)


Категория: Микроконтроллеры
Метки:

Написать коментарий

*
= 3 + 0

Добавить изображение

Последние статьи