Радіозв'язок між двома мікроконтролерами з використанням RF-модулів
Дуже часто виникає потреба отримати дані від якогось датчика або пристрою, що знаходиться на невеликій відстані. Використання ІК, кабелів та ін. часто є недоцільним рішенням. І тут вибір падає на радіозв'язок. У даній статті описується інтерфейс зв'язку двох мікроконтролерів 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 |
Прикреплені файли:
- pic_rf.rar (413 Кб)