- Необходимые компоненты
- 433 МГц RF передатчик и модуль приемника)
- Схема передатчика RF с STM32F103C8
- Принципиальная схема радиоприемника с Arduino Uno
- Программирование STM32F103C8 для беспроводной передачи RF
- Программирование Arduino UNO в качестве радиоприемника
- Тестирование передатчика и приемника RF на базе STM 32
Создание беспроводных проектов со встроенной электроникой становится очень важным и полезным, поскольку нет перепутанных проводов, что делает устройство более удобным и портативным. Существуют различные беспроводные технологии, такие как Bluetooth, WiFi, 433 МГц RF (радиочастота) и т. Д. Каждая технология имеет свои преимущества и недостатки, такие как стоимость, расстояние или передача диапазона, скорость или пропускная способность и т. Д. Сегодня мы будем использовать RF-модуль с STM32. для отправки и получения данных по беспроводной сети. Если вы новичок в микроконтроллере STM32, начните с мигающего светодиода с STM32, используя Arduino IDE, и проверьте все другие проекты STM32 здесь.
Помимо этого, мы также использовали беспроводной модуль RF 433Mhz с другими микроконтроллерами для создания некоторых проектов с беспроводным управлением, таких как:
- Бытовая техника с радиочастотным управлением
- Радиочастотные светодиоды с дистанционным управлением с использованием Raspberry Pi
- RF управляемый робот
- Взаимодействие радиочастотного модуля с Arduino
- Связь PIC с PIC с использованием радиочастотного модуля
Здесь мы будем сопрягать радиомодуль 433 МГц с микроконтроллером STM32F103C8. Проект разделен на две части. Передатчик будет сопряжен с STM32 и приемник будет сопряжен с Arduino UNO. Как передающей, так и принимающей части будут разные принципиальные схемы и эскизы.
В этом руководстве РЧ-передатчик отправляет два значения на сторону приемника: расстояние, измеренное с помощью ультразвукового датчика, и значение АЦП потенциометра (от 0 до 4096), которое отображается как число от (0 до 100). РЧ приемник из Arduino принимает оба значения и печатает эти расстояния и количество значений в 16x2 ЖК - дисплей по беспроводной сети.
Необходимые компоненты
- Микроконтроллер STM32F103C8
- Arduino UNO
- Радиочастотный передатчик и приемник 433 МГц
- Ультразвуковой датчик (HC-SR04)
- ЖК-дисплей 16x2
- Потенциометр 10k
- Макетная плата
- Подключение проводов
433 МГц RF передатчик и модуль приемника)
Распиновка передатчика RF:
Радиочастотный передатчик 433 МГц |
Описание контакта |
МУРАВЕЙ |
Для подключения антенны |
GND |
GND |
VDD |
От 3,3 до 5 В |
ДАННЫЕ |
Здесь представлены данные для передачи на приемник. |
Распиновка радиочастотного приемника:
433 МГц RF приемник |
ИСПОЛЬЗОВАТЬ |
МУРАВЕЙ |
Для подключения антенны |
GND |
GND |
VDD |
От 3,3 до 5 В |
ДАННЫЕ |
Данные, которые должны быть получены от передатчика |
CE / DO |
Это также контакт данных |
Технические характеристики модуля 433 МГц:
- Рабочее напряжение приемника: от 3 до 5 В
- Рабочее напряжение передатчика: от 3 до 5 В
- Рабочая частота: 433 МГц
- Расстояние передачи: от 3 метров (без антенны) до 100 метров (максимум)
- Техника модуляции: ASK (амплитудная манипуляция)
- Скорость передачи данных: 10 Кбит / с
Схема передатчика RF с STM32F103C8
Цепные соединения между РЧ-передатчиком и STM32F103C8:
STM32F103C8 |
RF передатчик |
5В |
VDD |
GND |
GND |
PA10 |
ДАННЫЕ |
NC |
МУРАВЕЙ |
Цепные соединения между ультразвуковым датчиком и STM32F103C8:
STM32F103C8 |
Ультразвуковой датчик (HC-SR04) |
5В |
VCC |
PB1 |
Триггер |
PB0 |
Эхо |
GND |
GND |
10k потенциометр соединен с STM32F103C8 для обеспечения ввода аналогового значения (от 0 до 3,3 В) к АЦП контактного PA0 из STM32.
Принципиальная схема радиоприемника с Arduino Uno
Цепные соединения между RF-приемником и Arduino UNO:
Arduino UNO |
Приемник RF |
5В |
VDD |
GND |
GND |
11 |
ДАННЫЕ |
NC |
МУРАВЕЙ |
Цепные соединения между ЖК-дисплеем 16x2 и Arduino UNO:
Имя вывода ЖК-дисплея |
Имя вывода Arduino UNO |
Земля (Gnd) |
Земля (G) |
VCC |
5В |
VEE |
Штифт из центра потенциометра для контраста |
Выбрать регистр (RS) |
2 |
Чтение / запись (RW) |
Земля (G) |
Включить (EN) |
3 |
Бит данных 4 (DB4) |
4 |
Бит данных 5 (DB5) |
5 |
Бит данных 6 (DB6) |
6 |
Бит данных 7 (DB7) |
7 |
Светодиод Положительный |
5В |
Светодиод отрицательный |
Земля (G) |
Кодирование будет кратко объяснено ниже. Эскиз будет состоять из двух частей: первая часть будет передатчиком, а другая - приемником. Все файлы скетчей и рабочие видео будут предоставлены в конце этого урока. Чтобы узнать больше о взаимодействии RF-модуля с Arduino Uno, перейдите по ссылке.
Программирование STM32F103C8 для беспроводной передачи RF
STM32F103C8 можно запрограммировать с помощью Arduino IDE. Программатор FTDI или ST-Link не требуется для загрузки кода в STM32F103C8. Просто подключитесь к ПК через USB-порт STM32 и начните программировать с помощью ARDUINO IDE. Вы можете научиться программированию STM32 в среде Arduino IDE, перейдя по ссылке.
В секции передатчика расстояние до объекта в «см» измеряется с помощью ультразвукового датчика, а числовое значение от (0 до 100) устанавливается с помощью потенциометра, который передается через RF-передатчик, связанный с STM32.
Сначала включена библиотека Radiohead, ее можно скачать отсюда. Поскольку эта библиотека использует ASK (метод амплитудной манипуляции) для передачи и приема данных. Это делает программирование очень простым. Вы можете включить библиотеку в эскиз, перейдя в Sketch-> include library-> Add.zip library.
#включают
Как и в этом руководстве, на стороне передатчика ультразвуковой датчик используется для измерения расстояния, поэтому определяются триггерные и эхо-контакты.
#define trigPin PB1 #define echoPin PB0
Затем имя объекта для библиотеки RH_ASK устанавливается как rf_driver с такими параметрами, как скорость (2000), вывод RX (PA9) и вывод TX (PA10).
RH_ASK rf_driver (2000, PA9, PA10);
Затем объявляются переменные Strings, необходимые в этой программе.
Строка transfer_number; Строка transfer_distance; Передача строки;
Затем в void setup () инициализируется объект для RH_ASK rf_driver.
rf_driver.init ();
После этого вывод триггера устанавливается как вывод OUTPUT, а PA0 (соединенный с потенциометром) и вывод эха устанавливается как вывод INPUT. Последовательная связь начинается со скоростью 9600 бод.
Serial.begin (9600); pinMode (PA0, ВХОД); pinMode (echoPin, ВХОД); pinMode (trigPin, ВЫХОД);
Затем в пустом цикле () сначала значение потенциометра, которое является входным аналоговым напряжением, преобразуется в цифровое значение (находится значение АЦП). Поскольку АЦП STM32 имеет 12-битное разрешение. Таким образом, цифровое значение изменяется от (0 до 4096), которое отображается в (от 0 до 100).
int analoginput = analogRead (PA0); int pwmvalue = map (аналоговый вход, 0,4095,0,100);
Затем расстояние измеряется с помощью ультразвукового датчика путем установки триггера на высокий и низкий уровень с задержкой в 2 микросекунды.
digitalWrite (trigPin, LOW); delayMicroseconds (2); digitalWrite (trigPin, HIGH); delayMicroseconds (10); digitalWrite (trigPin, LOW);
Эхо-контакт воспринимает отраженную волну обратно, то есть время, в течение которого инициированная волна отражается обратно, используется при вычислении расстояния до объекта по формуле. Узнайте больше о том, как ультразвуковой датчик рассчитывает расстояние, перейдя по ссылке.
длинная продолжительность = pulseIn (echoPin, HIGH); расстояние плавания = продолжительность * 0,034 / 2;
Теперь и количество данных, и измеренное расстояние преобразуются в строковые данные и сохраняются в соответствующих строковых переменных.
номер_передачи = Строка (значение pwm); transfer_distance = строка (расстояние);
Обе строки добавляются как одна строка и сохраняются в строке, называемой передачей, а запятая «,» используется для разделения двух строк.
передача = скорость_передачи + "," + расстояние_передачи;
Строка передачи преобразуется в массив символов.
const char * msg = transfer.c_str ();
Данные передаются и ждут, пока они не будут отправлены.
rf_driver.send ((uint8_t *) сообщение, strlen (сообщение)); rf_driver.waitPacketSent ();
Отправленные строковые данные также отображаются в Serial Monitor.
Serial.println (сообщение);
Программирование Arduino UNO в качестве радиоприемника
Arduino UNO программируется с использованием Arduino IDE. В секции приемника данные, которые передаются из секции передатчика и принимаются модулем радиочастотного приемника, а также полученные строковые данные разделяются на соответствующие данные (расстояние и число) и отображаются на ЖК-дисплее 16x2.
Вкратце рассмотрим кодировку приемника:
Как и в разделе передатчиков, сначала включена библиотека RadiohHead. Поскольку эта библиотека использует ASK (метод амплитудной манипуляции) для передачи и приема данных. Это делает программирование очень простым.
#включают
Поскольку здесь используется ЖК-дисплей, также включена библиотека жидких кристаллов.
#включают
И контакты ЖК-дисплея 16x2, подключенные к Arduino UNO, указаны и объявлены с использованием lcd как объекта.
ЖК-дисплей LiquidCrystal (2,3,4,5,6,7);
Затем объявляются переменные данных String для хранения строковых данных.
Строка str_receive; Строка str_number; Строка str_distance;
Объявлен объект для библиотеки Radiohead.
RH_ASK rf;
Теперь в настройке void () ЖК-дисплей установлен в режим 16x2, и приветственное сообщение отображается и очищается.
lcd.begin (16,2); lcd.print ("ДАЙДЖЕСТ ЦЕПИ"); lcd.setCursor (0,1); lcd.print («РФ с STM32»); задержка (5000); lcd.clear ();
После этого инициализируется объект RF .
rf.init ();
Теперь в void loop () объявляется массив buf с размером 7. Поскольку данные, отправленные от передатчика, имеют 7, включая «,». Итак, измените это в соответствии с данными, которые должны быть переданы.
uint8_t buf; uint8_t buflen = sizeof (buf);
Если строка доступна в модуле РЧ-приемника, функция if проверяет размер и выполняет. Rf.recv () используется для приема данных.
если (rf.recv (buf, & buflen))
ЬиЙ имеют полученную строку так, то полученные строки хранятся в str_receive переменной строки.
str_receive = Строка ((char *) buf);
Этот цикл for используется для разделения полученной строки на две, если он обнаруживает ',' между двумя строками.
for (int i = 0; i <str_receive.length (); i ++) { if (str_receive.substring (i, i + 1) == ",") { str_number = str_receive.substring (0, i); str_distance = str_receive.substring (i + 1); сломать; }
Объявляются два массива символов для двух значений, а строка, разделенная на две части, сохраняется в уважаемом массиве путем преобразования строки в массив символов.
char numberstring; char distancestring; str_distance.toCharArray (Distancestring, 3); str_number.toCharArray (числовая строка, 3);
После этого преобразуйте массив символов в целое число с помощью atoi ()
int distance = atoi (строка расстояния); int number = atoi (числовая строка);
После преобразования в целые числа значения расстояния и числа отображаются на ЖК-дисплее 16x2.
lcd.setCursor (0,0); lcd.print ("Число:"); lcd.print (номер); lcd.setCursor (0,1); lcd.print ("Расстояние:"); lcd.print (расстояние); lcd.print ("см");
После загрузки обоих кодов, то есть передатчика и приемника, в STM32 и Arduino UNO соответственно, данные, такие как число и расстояние до объекта, измеренные с помощью STM32, передаются на РЧ-приемник через РЧ-передатчик, а полученные значения отображаются на ЖК-дисплее по беспроводной связи.
Тестирование передатчика и приемника RF на базе STM 32
1. Когда номер равен 0, а расстояние до объекта 6 см.
2. Когда номер 47 и расстояние до объекта 3 см.