Главная » Микроконтроллеры
Призовой фонд
на сентябрь 2017 г.
1. 1000 руб
PCBWay
2. Осциллограф DSO138
Паяльник
3. Тестер компонентов MG328
Паяльник
4. 100 руб.
От пользователей

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

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

Скачать список элементов (PDF)

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

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

Теги:

Колтыков А.В. Опубликована: 2011 г. 0 0
Я собрал 0 0
x

Оценить статью

  • Техническая грамотность
  • Актуальность материала
  • Изложение материала
  • Полезность устройства
  • Повторяемость устройства
  • Орфография
0

Средний балл статьи: 0 Проголосовало: 0 чел.

Комментарии (2) | Я собрал (0) | Подписаться

0
Юрий #
Ошибки могут быть из-за того что передатчик уходит в спящий режим каждые 70ms, поэтому надо перед тем как отправлять данные подать единицу на 5ms потом ноль 5ms, либо передавать данные чаще
Ответить
0
Aleksandr1786 #
Чтобы строить такие устройства, недостаточно знать микроконтроллеры и их программирование, нужно также хорошо знать и аналоговую схемотехнику: чтобы исключить помехи, можно, например, использовать интегрирующие помехоподавляющие цепи перед подачей сигнала на МК в приемнике, или передавать "1" и "0" в виде тональных сигналов, а в приемнике использовать активный полосовой RC-фильтр, ИМХО, это должно эффективно решать проблему помех в цифровом сигнале.
Отредактирован 26.03.2017 14:08
Ответить
Добавить комментарий
Имя:
E-mail:
не публикуется
Текст:
Защита от спама:
В чем измеряется электрическое сопротивление?
Файлы:
 
Для выбора нескольких файлов использйте CTRL

AVR-программатор USB ASP
AVR-программатор USB ASP
Конструктор регулируемого преобразователя напряжения LM317 Набор начинающего радиолюбителя
вверх