Главная » Микроконтроллеры
Призовой фонд
на ноябрь 2017 г.
1. Термометр Relsib WT51
Рэлсиб
2. 1000 руб
PCBWay
3. Тестер компонентов LCR-T4
Паяльник
4. 200 руб.
От пользователей

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

Очень часто возникает потребность получить данные от какого-либо датчика или устройства, находящимся на небольшом расстоянии. Использование ИК, кабелей и др. часто является нецелесообразным решением. И тут выбор падает на радиосвязь. В данной статье описывается интерфейс связи двух микроконтроллеров 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

Программатор Pickit3
Программатор Pickit3
Автомобильный GPS-трекер с GSM/GPRS и дистанционным управлением USB осциллограф DSO-2090
вверх