Введение в трансивер rfm69hw

Введение в трансивер rfm69hw
Введение в трансивер rfm69hw
Anonim

Введение в RFM69HW Transceiver

Трансиверы RFM69HW

Инженеры разрабатывают все больше и больше схем, которые используют некоторую форму беспроводной связи для достижения уровня удобства и возможности подключения, недоступных для проводных опций. В стремлении дизайнера к беспроводной сети предлагаются несколько вариантов, которые выполняют разные функции. Приемопередатчики с частотой 2, 4 ГГц могут отправлять и получать большие объемы данных и могут работать с очень маленькими антеннами, но они имеют сравнительно небольшой диапазон в отношении низкочастотных приемопередатчиков, а также уровень сложности и стоимости, которые могут быть чрезмерными для многих проектов. Для проектов, где приемлема низкая пропускная способность, приемопередатчики серии RFM69HW обеспечивают менее сложное решение, которое может взаимодействовать со всем от скромного ПОС до современного настольного ПК и всего, что между ними. Приемопередатчик RFM можно приобрести в 433 МГц, 868 МГц или 915 МГц без лицензии ISM-диапазоне примерно за 4 доллара США и может работать с использованием модуляции FSK, GFSK, MSK, GMSK и OOK. Потребление энергии чрезвычайно низкое, но эти трансиверы могут обмениваться данными на несколько сотен метров с учетом адекватных антенн. Эти функции делают это устройство отличным кандидатом на добавление беспроводного подключения к батареям или удаленным проектам для очень низких затрат. Этот проект станет частью первой серии, представляющей ряд приложений для RFM-приемопередатчиков; в этом случае мы будем настраивать трансиверы для беспроводного использования проверенных временем встроенных систем, эквивалентных «Hello World!» - программе «Blinky».

Что вам нужно

В целях обучения мы будем внедрять этот код с использованием микропроцессоров Atmel328 с загрузчиком Arduino. У меня, случается, есть стек из 16Mhz Pro Mini V2, как показано ниже, который будет работать после перетаскивания селектора 3, 3 вольта, с Arduino вы можете использовать практически любую доску и получить тот же результат, однако выбранная вами доска должна быть в состоянии работать 3, 3 В, так как микросхема RFM может работать только на максимум 3, 3 вольта. Если вы абсолютно должны использовать 5-вольтовый Arduino, вам понадобится конвертер логического уровня.

Image
Image

Вам также нужен сам RFM-чип, с изображенной ниже моделью 915MHz 69HW.

Image
Image

Нет необходимости использовать эту идентичную модель; вы можете выбрать другие модели или частоты, но вам нужно будет настроить код для этого. Код будет прокомментирован в этих местах для удобства внесения изменений.

Вам также понадобится метод программирования и питания плат; если вы используете UNO или другой Arduino со встроенным USB, тогда у вас есть это требование. В моем случае мне нужно использовать последовательные прорывные платы FTDI, так как Pro Mini только заполнены самим процессором и несколькими компонентами домашнего хозяйства.

Image
Image

В дополнение к этим основным компонентам вам, разумеется, нужен светодиод, резистор (для соответствующего светодиодного балласта), мгновенная кнопка, перемычка и прототипы.

Настроить

Теперь, когда у нас есть все части, мы можем собрать схему. Ниже приведена схема подключения:

Image
Image

Кратковременная кнопка должна быть наведена на контакт 3 и заземлена, светодиод должен быть прикреплен к контакту 9, а штырьки данных NSS, MOSI, MISO и SCK должны подключаться к контактам 10, 11, 12, 13 в этом порядке. Антенна может быть настоящей антенной или просто частью провода без конца. Сделайте две из этой идентичной схемы, и любое устройство может быть настроено как отправитель или получатель. Ваши схемы должны выглядеть примерно так:

Image
Image

Запустить код

С целями в руке пришло время для программирования. Вам понадобятся две библиотеки, написанные для запуска RFM-чипов на Arduino, RFM69.h и LowPower.h; они могут быть получены из //www.github.com/lowpowerlab/rfm69 и //github.com/lowpowerlab/lowpower соответственно. Установите эти библиотеки и скопируйте следующий код в свою среду IDE:


//RFM69HW Blinky Code //This program is a highly simplified version of the program by Felix from LowPowerLab //A button is pushed on the sender unit which toggles an LED on the receiver #include//get it here: //www.github.com/lowpowerlab/rfm69 #include#include//get library from: //github.com/lowpowerlab/lowpower //********************************************************************************************* // *********** IMPORTANT SETTINGS - YOU MUST CHANGE/ONFIGURE TO FIT YOUR HARDWARE ************* //********************************************************************************************* //This part of the code simply sets up the parameters we want the chip to use // these parameters allow you to have multiple networks, channels, and encryption keys #define NETWORKID 100 //the same on all nodes that talk to each other #define RECEIVER 1 //unique ID of the gateway/receiver #define SENDER 2 // you could for example, have multiple senders #define NODEID RECEIVER //change to "SENDER" if this is the sender node (the one with the button) //Select your frequency by uncommenting //#define FREQUENCY RF69_433MHZ //#define FREQUENCY RF69_868MHZ #define FREQUENCY RF69_915MHZ #define ENCRYPTKEY "sampleEncryptKey" //exactly the same 16 characters/bytes on all nodes! #define IS_RFM69HW //uncomment only for RFM69HW! Remove/comment if you have RFM69W! //********************************************************************************************* #define SERIAL_BAUD 9600 //This part defines the LED pin and button pin #define LED 9 //LED on D9 #define BUTTON_INT 1 //user button on interrupt 1 (D3) #define BUTTON_PIN 3 //user button on interrupt 1 (D3) #define RX_TOGGLE_PIN 7 //GPIO to toggle on the RECEIVER RFM69 radio; // the setup contains the start-up procedure and some useful serial data void setup() { Serial.begin(SERIAL_BAUD); radio.initialize(FREQUENCY, NODEID, NETWORKID); #ifdef IS_RFM69HW radio.setHighPower(); //only for RFM69HW! #endif radio.encrypt(ENCRYPTKEY); char buff(50); sprintf(buff, "\nListening at %d Mhz…", FREQUENCY==RF69_433MHZ ? 433: FREQUENCY==RF69_868MHZ ? 868: 915); Serial.println(buff); Serial.flush(); pinMode(BUTTON_PIN, INPUT_PULLUP); pinMode(LED, OUTPUT); attachInterrupt(BUTTON_INT, handleButton, FALLING); pinMode(RX_TOGGLE_PIN, OUTPUT); } //******** THIS IS INTERRUPT BASED DEBOUNCING FOR BUTTON ATTACHED TO D3 (INTERRUPT 1) #define FLAG_INTERRUPT 0x01 volatile int mainEventFlags = 0; boolean buttonPressed = false; void handleButton() mainEventFlags byte LEDSTATE=LOW; //LOW=0 void loop() { //******** THIS IS INTERRUPT BASED DEBOUNCING FOR BUTTON ATTACHED TO D3 (INTERRUPT 1) if (mainEventFlags & FLAG_INTERRUPT) { LowPower.powerDown(SLEEP_120MS, ADC_OFF, BOD_ON); mainEventFlags &= ~FLAG_INTERRUPT; if (!digitalRead(BUTTON_PIN)) { buttonPressed=true; } } if (buttonPressed) { Serial.println("Button pressed!"); buttonPressed = false; if (radio.sendWithRetry(RECEIVER, "All About Circuits", 18)) //target node Id, message as string or byte array, message length delay(100); } //check if something was received (could be an interrupt from the radio) if (radio.receiveDone()) { //print message received to serial Serial.print('(');Serial.print(radio. SENDERID);Serial.print(") "); Serial.print((char*)radio. DATA); Serial.print(" (RX_RSSI:");Serial.print(radio. RSSI);Serial.print(")"); Serial.println(); if(LEDSTATE==LOW) LEDSTATE=HIGH; else LEDSTATE=LOW; digitalWrite(LED, LEDSTATE); digitalWrite(RX_TOGGLE_PIN, LEDSTATE); //check if sender wanted an ACK if (radio. ACKRequested()) { radio.sendACK(); Serial.print(" - ACK sent"); } } radio.receiveDone(); //put radio in RX mode Serial.flush(); //make sure all serial data is clocked out before sleeping the MCU LowPower.powerDown(SLEEP_8S, ADC_OFF, BOD_ON); //sleep Arduino in low power mode (to save battery) }

Скачать код

Код прокомментирован, чтобы описать его работу, но вот основная разбивка того, что происходит:

1. Включить библиотеки

Это библиотеки, связанные с ранее, в дополнение к стандартной библиотеке SPI.h для последовательной связи.

2. Определите константы

Скажите чипу, кто он, какая сеть он включен, каков его код шифрования, является ли он отправителем или получателем, какой из возможных наборов приемников / отправителей является единицей и т. Д.

3. Инициализация радиостанции

Это этап управления, в котором все те параметры, которые мы только что определили, применяются, помимо настройки последовательного монитора для целей отладки.

4. Перейдите в режим ожидания и дождитесь прерывания

Использование прерывания на кнопке и включение устройства в режим сна помогает экономить электроэнергию, когда устройство работает на холостом ходу. Прерывания - это очень эффективный инструмент для пробуждения устройства при событии и позволяют устройству делать другие вещи в то же время до и после прерывания.

5. Передача по флагом прерывания

Это отправит сообщение получателю после нажатия кнопки отправителя. В этом случае сообщение «All About Circuits».

6. Получать

Приемник проверяет и подтверждает, что он получил сообщение. Затем он печатает сообщение в последовательном порядке, а также печатает RSSI (индикатор уровня сигнала приема), чтобы вы знали, насколько сильный сигнал был в дБм. Затем приемник переключает светодиод, чтобы пользователь знал, что сообщение получено.

7. Признать

Отправьте бит ACK отправителю, чтобы сообщить ему, что сообщение получено.

8. Сон

Верните устройство в режим с низким энергопотреблением, чтобы сохранить батарею и ждать другого прерывания.

Если вы подключите свой приемный блок к компьютеру для использования терминала последовательного монитора, вы должны увидеть это после нажатия кнопки несколько раз:

Image
Image

Кроме того, светодиод должен мигать и включаться при нажатии кнопки. Читатели с острыми глазами, возможно, заметили что-то интересное в этом блоке последовательного монитора: скорость передачи установлена в 19200, а скорость передачи в коде - 9600. Это связано с тем, что Pro Mini, который я использую, работает на частоте 16 МГц с 3, 3 вольт, а в IDE Arduino есть опция для Pro Mini, работающего на частоте 8 МГц с питанием 3, 3 вольта. Чтобы компенсировать это, скорость передачи на последовательном мониторе должна быть установлена так, чтобы удваивать скорость передачи в бодах, определенную в коде.

Приложения этих модулей огромны для любителей и инженеров: простой, дешевый, мощный цифровой приемопередатчик, который может быть сопряжен практически с чем угодно. Я видел, как они использовались для модулей домашней автоматизации, удаленных метеорологических станций, беспилотных летательных аппаратов и различных дистанционно управляемых устройств, датчиков близости к автомобилю - список можно продолжать и продолжать. Следующая статья в этой серии будет посвящена созданию солнечного монитора погоды, который отправляет данные обратно в концентратор для отображения на небольшом экране.

Попробуйте этот проект сами! Получить спецификацию.