Радіозв'язок між двома мікроконтролерами з використанням 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-модулів

Як видно, робота з 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

Оригінал статті

Прикреплені файли:

Top