Очень часто возникает потребность получить данные от какого-либо датчика или устройства, находящимся на небольшом расстоянии. Использование ИК, кабелей и др. часто является нецелесообразным решением. И тут выбор падает на радиосвязь. В данной статье описывается интерфейс связи двух микроконтроллеров 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-бит | 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 | Поиск в магазине Отрон | |||
Скачать список элементов (PDF)
Прикрепленные файлы:
- pic_rf.rar (413 Кб)
Комментарии (2) | Я собрал (0) | Подписаться
Для добавления Вашей сборки необходима регистрация