Очень часто возникает потребность получить данные от какого-либо датчика или устройства, находящимся на небольшом расстоянии. Использование ИК, кабелей и др. часто является нецелесообразным решением. И тут выбор падает на радиосвязь. В данной статье описывается интерфейс связи 2-х микроконтроллеров 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 см вполне хватает для оптимальной дальности связи.
Список радиоэлементовОбозначение
Тип
Номинал
Количество
ПримечаниеМагазинМой блокнот
МК PIC 8-битPIC16F8772
877А
Конденсатор0.1 мкФ2
Конденсатор22 пФ4
Подстроечный резистор5 кОм2
Резистор10 кОм2
РОТ
Подстроечный резистор10 кОм2
Кварцевый резонатор10 МГц2
LCD-дисплей2х8 LCD Display2
Тактовая кнопка2
Радиопередающий модульKST-TX011
Радиоприемный модульKST-RX8061
Добавить все
Скачать список элементов (PDF)
Прикрепленные файлы:
- pic_rf.rar (413 Кб)