Обмен данными по радиоканалу. Часть 3.

В первой и второй частях статьи рассмотрены варианты кодирования и передачи данных с использованием простейших радиомодулей с модуляцией OOK. Способ кодирования данных, описанный во второй статье позволяет легко организовать передачу небольшого (три байта) объема информации на не слишком большие (десятки метров) расстояния. DSCF6043

В этой статье рассмотрено создание приемника системы дистанционного управления несколькими каналами. Передатчиком служит готовый пульт (серенький на фото сверху) от системы управления «розеткой» (на фото сверху). Метод кодирования тот же, что в предыдущей статье. Но библиотека Arduino для приема используется иная.

Библиотека RCSwitch взята с этого сайта. В работе она оказалась удобнее, чем та, которая использована в предыдущей статье. В скетче, приведенном ниже, описан приемник-декодер, где выход  радиомодуля подключен к pin3 (вход прерываний Int1), а каналы управляемой нагрузки — к выводам 7, 8, 9 и 10.

#include <RCSwitch.h>

RCSwitch mySwitch = RCSwitch();

int ch1 = 7;   //номера pin управляемых каналов
int ch2 = 8;
int ch3 = 9;
int ch4 = 10;

byte mch1 = 0; //программное состояние каналов
byte mch2 = 0; //используется для отказа от чтения портов
byte mch3 = 0; //при переключении
byte mch4 = 0;

int stat = 13; //контроль начала работы и признак приема

void setup()  {
  Serial.begin(9600);
  Serial.println("Start receive... ");
  mySwitch.enableReceive(1);  // Receiver on inerrupt 1 is pin #3
  pinMode(ch1, OUTPUT);     
  pinMode(ch2, OUTPUT);     
  pinMode(ch3, OUTPUT);     
  pinMode(ch4, OUTPUT);     
  pinMode(stat, OUTPUT);     
  digitalWrite(stat, HIGH); // мигнем 13 pin-ом чтоб знать, что
  delay(500);               // все хорошо при включении
  digitalWrite(stat, LOW);  
}

void loop() {
  if (mySwitch.available()) {  //проверим готов ли прием
    digitalWrite(stat, HIGH);  //если что-то принято включим 13 
    long value = mySwitch.getReceivedValue(); //заберем принятый код
    if (value == 0) {  //если принято не пойми что - выходим без исполнения
      Serial.print("Unknown RF encoding");
    } else {
      Serial.print("RF 433 received : ");
      Serial.println( value );  //индикация принятого кода для настройки прогр.
      if (value == 8696671) {   // CH1 ON
        digitalWrite(ch1, HIGH);  mch1 = 1;}  // turn the LED on 
      if (value == 8696663) {   // CH1 OFF
        digitalWrite(ch1, LOW);  mch1 = 0;}  // turn the LED off 
      if (value == 8696667) {   // CH2 ON
        digitalWrite(ch2, HIGH);  mch2 = 1;}  // turn the LED on 
      if (value == 8696659) {   // CH2 OFF
        digitalWrite(ch2, LOW);  mch2 = 0;}  // turn the LED off 
      if (value == 8696669) {   // CH3 ON
        digitalWrite(ch3, HIGH);  mch3 = 1;}  // turn the LED on 
      if (value == 8696661) {   // CH3 OFF
        digitalWrite(ch3, LOW);  mch3 = 0;}  // turn the LED off 
      if (value == 8696670) {   // CH4 ON
        digitalWrite(ch4, HIGH);  mch4 = 1;}  // turn the LED on 
      if (value == 8696662) {   // CH4 OFF
        digitalWrite(ch4, LOW);  mch4 = 0;}  // turn the LED off 
      if (value == 8696664) {   // ALL OFF
        digitalWrite(ch1, LOW);  mch1 = 0;   // turn the LED off 
        digitalWrite(ch2, LOW);  mch2 = 0;   // turn the LED off 
        digitalWrite(ch3, LOW);  mch3 = 0;   // turn the LED off 
        digitalWrite(ch4, LOW);  mch4 = 0;   // turn the LED off 
    }
    mySwitch.resetAvailable();  //сбрасываем признак готовности приемника
  }
  delay(100);
  digitalWrite(stat, LOW);    // turn the LED off 
}

Arduino с такой программой распознает 9 кодов в радиоканале. 8 из них управляют четырьмя каналами, 9-ый выключает их все сразу. Программа не самообучаемая (как принято), а «настраиваемая». На первом этапе на подключенное к компьютеру устройство подаем команды с передатчика (команда — это три байта (24 бита), структура кодировки которых описана в предыдущей статье).  Полученные в мониторе последовательного порта значения записываем  в условиях операторов if() скетча, аналогично приему статьи про IR.

Надо отметить, что алгоритм декодирования принятого сигнала, используемый в библиотеке RCSwitch очень ресурсоемкий. По сути, весь принимаемый сигнал записывается в ОЗУ микроконтроллера, а затем анализируется на предмет поиска синхробита (Sync. Bit). После его обнаружения, определяется длительность короткого импульса (того, что используется при кодировании «0») и далее «вычисляется» весь принятый код. Потребности в ОЗУ так велики, что для работы уже не хватает ресурсов ATmega88!

Добавить комментарий

Ваш e-mail не будет опубликован.

Нажимая кнопку "Отправить" Вы даёте свое согласие на обработку введенной персональной информации в соответствии с Федеральным Законом №152-ФЗ от 27.07.2006 "О персональных данных".