- Потрібні компоненти
- Модуль радіочастотного передавача та приймача 433 МГц)
- Принципова схема РЧ-передавача з STM32F103C8
- Схема РЧ-приймача з Arduino Uno
- Програмування STM32F103C8 для бездротової РЧ-передачі
- Програмування Arduino UNO як радіочастотного приймача
- Тестування радіочастотного передавача та приймача на основі STM 32
Створення бездротових проектів у вбудованій електроніці стає дуже важливим та корисним, оскільки в ньому відсутні переплетені дроти, що робить пристрій більш зручним та портативним. Існують різні бездротові технології, такі як Bluetooth, WiFi, радіочастота 433 МГц тощо. Кожна технологія має свої переваги та недоліки, такі як вартість, передача відстані чи діапазону, швидкість або пропускна здатність тощо. Сьогодні ми будемо використовувати РЧ-модуль із STM32 для бездротової передачі та отримання даних. Якщо ви новачок у мікроконтролері STM32, тоді почніть з блимаючого світлодіода зі STM32 за допомогою Arduino IDE і перевірте всі інші проекти STM32 тут.
Окрім цього, ми також використовували бездротовий модуль RF 433 МГц з іншими мікроконтролерами для побудови деяких бездротових проектів, таких як:
- Побутова техніка, керована ВЧ
- Радіочастотні світлодіоди з дистанційним управлінням за допомогою Raspberry Pi
- Робот, керований РФ
- Взаємозв'язок RF-модуля з Arduino
- Зв'язок PIC-PIC за допомогою RF-модуля
Тут ми зв’яжемо 433 МГц бездротовий модуль із мікроконтролером STM32F103C8. Проект розділений на дві частини. Передавач буде пов'язаний з STM32 і приймач буде пов'язаний з Arduino UNO. Будуть різні електричні схеми та ескізи як для передавальної, так і для приймаючої частини.
У цьому посібнику радіочастотний передавач надсилає два значення на сторону приймача: відстань, виміряну за допомогою ультразвукового датчика, і значення АЦП потенціометра (від 0 до 4096), яке відображається як число від (0 до 100). РЧ приймач з Arduino приймає обидва значення і друкує ці відстані і кількість значень в 16x2 ЖК - дисплей з бездротової мережі.
Потрібні компоненти
- Мікроконтролер STM32F103C8
- Arduino UNO
- РЧ-передавач та приймач 433 МГц
- Ультразвуковий датчик (HC-SR04)
- РК-дисплей 16x2
- 10k потенціометр
- Макет
- Підключення проводів
Модуль радіочастотного передавача та приймача 433 МГц)
Висновок радіочастотного передавача:
РЧ-передавач 433 МГц |
Опис штифта |
АНТ |
Для підключення антени |
GND |
GND |
VDD |
Від 3,3 до 5 В |
ДАНІ |
Дані, що передаються одержувачу, наведені тут |
Розпіновка радіочастотного приймача:
РЧ-приймач 433 МГц |
ВИКОРИСТАННЯ |
АНТ |
Для підключення антени |
GND |
GND |
VDD |
Від 3,3 до 5 В |
ДАНІ |
Дані, які потрібно отримати від передавача |
CE / DO |
Це також шпилька даних |
Технічні характеристики модуля 433 МГц:
- Робоча напруга приймача: від 3 до 5 В.
- Робоча напруга передавача: від 3 до 5 В.
- Робоча частота: 433 МГц
- Відстань передачі: від 3 метрів (без антени) до 100 метрів (максимум)
- Техніка модуляції: ASK (амплітудна маніпуляція)
- Швидкість передачі даних: 10 Кбіт / с
Принципова схема РЧ-передавача з STM32F103C8
Схема з'єднання між радіочастотним передавачем і STM32F103C8:
STM32F103C8 |
Радіочастотний передавач |
5 В |
VDD |
GND |
GND |
PA10 |
ДАНІ |
NC |
АНТ |
Схема з'єднань між ультразвуковим датчиком і STM32F103C8:
STM32F103C8 |
Ультразвуковий датчик (HC-SR04) |
5 В |
VCC |
PB1 |
Trig |
PB0 |
Відлуння |
GND |
GND |
10k потенціометр з'єднаний з STM32F103C8 для забезпечення введення аналогового значення (від 0 до 3,3 В) до АЦП контактного PA0 з STM32.
Схема РЧ-приймача з Arduino Uno
Схемотехнічні зв’язки між РЧ-приймачем та Arduino UNO:
Arduino UNO |
Радіочастотний приймач |
5 В |
VDD |
GND |
GND |
11 |
ДАНІ |
NC |
АНТ |
Мікросхеми між РК-дисплеєм 16x2 та Arduino UNO:
Назва PIN-коду РК-дисплея |
Ім'я PIN-коду 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 для бездротової РЧ-передачі
STM32F103C8 можна запрограмувати за допомогою Arduino IDE. Для завантаження коду на STM32F103C8 не потрібен програміст FTDI або ST-Link. Просто підключіться до ПК через USB-порт STM32 і почніть програмувати за допомогою ARDUINO IDE. Ви можете навчитися програмуванню вашого STM32 в Arduino IDE, перейшовши за посиланням.
У секції передавача відстань об'єкта в 'см' вимірюється за допомогою ультразвукового датчика, а числове значення від (0 до 100) встановлюється за допомогою потенціометра, який передається через радіочастотний передавач, з'єднаний з STM32.
Спочатку включена бібліотека Radiohead, яку можна завантажити звідси. Оскільки ця бібліотека використовує ASK (Техніка введення клавіш зсуву амплітуди) для передачі та отримання даних. Це робить програмування дуже простим. Ви можете включити бібліотеку в ескіз, перейшовши в Ескіз-> включити бібліотеку-> Додати бібліотеку.zip.
#включати
Як і в цьому посібнику на стороні передавача, для вимірювання відстані використовується ультразвуковий датчик, щоб визначити тригер та ехо-штифти.
#define trigPin PB1 #define echoPin PB0
Далі ім'я об'єкта для бібліотеки RH_ASK встановлюється як rf_driver з такими параметрами, як швидкість (2000), RX-штифт (PA9) і TX-штифт (PA10).
RH_ASK rf_driver (2000, PA9, PA10);
Далі оголошується змінна Strings, необхідна в цій програмі.
Рядок передавати_ номер; Рядок передачі_відстані; Рядок передачі;
Далі у void setup () об’єкт для RH_ASK rf_driver ініціалізується.
rf_driver.init ();
Після цього контактний штифт встановлюється як вихідний штифт, а PA0 (підключений до потенціометра), а ехо-штифт - як вхідний. Послідовний зв’язок починається зі швидкістю передачі даних 9600.
Serial.begin (9600); pinMode (PA0, INPUT); pinMode (echoPin, INPUT); pinMode (trigPin, OUTPUT);
Далі в циклі порожнечі () спочатку значення потенціометра, яке є вхідною аналоговою напругою, перетворюється в цифрове значення (значення АЦП знайдено). Оскільки АЦП STM32 має 12-бітну роздільну здатність. Отже, цифрове значення варіюється від (0 до 4096), яке відображається (від 0 до 100).
int analoginput = analogRead (PA0); int pwmvalue = map (analoginput, 0,4095,0,100);
Далі відстань вимірюється за допомогою ультразвукового датчика, встановлюючи тригер високим і низьким із затримкою 2 мікросекунди.
digitalWrite (trigPin, LOW); delayMicroseconds (2); digitalWrite (trigPin, HIGH); delayMicroseconds (10); digitalWrite (trigPin, LOW);
Ехо-пін відчуває відбиту хвилю назад, тобто тривалість часу, коли спрацьована хвиля відбивається назад, використовується для обчислення відстані об'єкта за формулою. Дізнайтеся більше про те, як ультразвуковий датчик обчислює відстань, перейшовши за посиланням.
тривала тривалість = pulseIn (echoPin, HIGH); плаваюча відстань = тривалість * 0,034 / 2;
Тепер і кількість даних, і виміряна відстань перетворюються на дані рядків і зберігаються у відповідних рядкових змінних.
номер_передачі = Рядок (pwmvalue); transmit_distance = Рядок (відстань);
Обидва рядки додаються як один рядок і зберігаються у рядку, який називається передавати, і комою “,” використовується для відокремлення двох рядків.
передавати = передавати_pwm + "," + передавати_відстань;
Рядок передачі перетворюється в масив символів.
const char * msg = transmit.c_str ();
Дані передаються і чекають, поки вони будуть надіслані.
rf_driver.send ((uint8_t *) msg, strlen (msg)); rf_driver.waitPacketSent ();
Надіслані рядкові дані також відображаються у послідовному моніторі.
Serial.println (msg);
Програмування Arduino UNO як радіочастотного приймача
Arduino UNO програмується з використанням IDE Arduino. У секції приймача дані, які передаються від секції передавача і приймаються модулем радіочастотного приймача, а отримані рядкові дані поділяються на відповідні дані (відстань і число) і відображаються на РК-дисплеї 16x2.
Давайте коротко розберемо кодування приймача:
Як і в розділі передавача, спочатку включена бібліотека RadiohHead. Оскільки ця бібліотека використовує ASK (Техніка введення клавіш зсуву амплітуди) для передачі та отримання даних. Це робить програмування дуже простим.
#включати
Оскільки тут використовується РК-дисплей, тому бібліотека рідких кристалів також включена.
#включати
А штифти РК-дисплея 16x2, підключені до Arduino UNO, визначаються та оголошуються за допомогою рідкокристалічного дисплея як об’єкта.
Рідкий кристал LiquidCrystal (2,3,4,5,6,7);
Далі оголошуються змінні рядкових даних для зберігання рядкових даних.
Рядок str_receive; Рядок str_number; Рядок str_distance;
Оголошено об’єкт для бібліотеки Radiohead.
RH_ASK rf;
Тепер у налаштуваннях порожнечі () РК-дисплей встановлено в режим 16x2, а привітальне повідомлення відображається та очищається.
lcd.begin (16,2); lcd.print ("СХЕМ ДАЙДЖЕСТУ"); lcd.setCursor (0,1); lcd.print ("RF з STM32"); затримка (5000); lcd.clear ();
Після цього rf- об'єкт ініціалізується.
rf.init ();
Тепер у циклі void (), масив масиву масиву оголошений розміром як 7. Оскільки дані, надіслані з передавача, мають 7, включаючи “,”. Отже, змініть це відповідно до даних, які будуть передані.
uint8_t buf; uint8_t buflen = sizeof (buf);
Якщо рядок доступний у модулі RF-приймача, функція if перевіряє розмір і виконується. Rf.recv () використовується для прийому даних.
if (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 char distancestring; str_distance.toCharArray (distancestring, 3); str_number.toCharArray (числовий рядок, 3);
Після цього перетворіть масив символів у ціле число, використовуючи atoi ()
int distance = atoi (stringstring); int число = atoi (рядок чисел);
Після перетворення в цілі значення значення відстані та числа відображаються на РК-дисплеї 16x2
lcd.setCursor (0,0); lcd.print ("Номер:"); lcd.print (номер); lcd.setCursor (0,1); lcd.print ("Відстань:"); lcd.print (відстань); lcd.print ("см");
Після завантаження обох кодів, тобто передавача та приймача в STM32 та Arduino UNO відповідно, такі дані, як кількість та відстань до об'єкта, виміряні за допомогою STM32, передаються на радіочастотний приймач за допомогою РЧ-передавача, а отримані значення відображаються на РК-дисплеї бездротовим способом.
Тестування радіочастотного передавача та приймача на основі STM 32
1. Коли число в 0 і відстань до предмета становить 6 см.
2. Коли число 47 і відстань об'єкта дорівнює 3см.