- Необходими компоненти
- 433Mhz RF трансмитер и приемник модул)
- Схема на РЧ трансмитер със STM32F103C8
- Схема на RF приемник с Arduino Uno
- Програмиране на STM32F103C8 за безжично RF предаване
- Програмиране на Arduino UNO като RF приемник
- Тестване на базиран на STM 32 RF предавател и приемник
Осъществяването на безжични проекти във вградената електроника става много важно и полезно, тъй като няма разбъркани проводници, което прави устройството по-удобно и преносимо. Съществуват различни безжични технологии като Bluetooth, WiFi, 433 MHz RF (радиочестота) и др. Всяка технология има свои предимства и недостатъци като разходи, пренос на разстояние или обхват, скорост или пропускателна способност и др. Днес ще използваме RF модул със STM32 за изпращане и получаване на данни безжично. Ако сте нов в STM32 микроконтролера, започнете с мигащ светодиод със STM32 с помощта на Arduino IDE и проверете всички други STM32 проекти тук.
Освен това, ние също използвахме RF 433Mhz безжичен модул с други микроконтролери, за да изградим някои безжично контролирани проекти, като например:
- RF контролирани домакински уреди
- RF дистанционно управлявани светодиоди, използващи Raspberry Pi
- RF контролиран робот
- Връзка RF модул с Arduino
- PIC към PIC комуникация чрез RF модул
Тук ще свържем 433MHz RF безжичен модул с микроконтролер STM32F103C8. Проектът е разделен на две части. В предавателя ще бъде свързан с STM32 и приемника ще бъде свързан с Arduino UNO. Ще има различни схеми на схеми и скици както за предаващата, така и за приемащата част.
В този урок радиочестотният предавател изпраща две стойности към страната на приемника: разстоянието, измерено с помощта на ултразвуков сензор и ADC стойността на потенциометъра (0 до 4096), което се нанася като число от (0 до 100). В RF приемник на Ардуино получава както на ценностите и отпечатъците тези разстояние и брой ценности в 16x2 LCD дисплей безжично.
Необходими компоненти
- STM32F103C8 Микроконтролер
- Arduino UNO
- 433Mhz RF предавател и приемник
- Ултразвуков сензор (HC-SR04)
- 16x2 LCD дисплей
- 10k потенциометър
- Макет
- Свързване на проводници
433Mhz RF трансмитер и приемник модул)
RF предавател Pinout:
433Mhz RF предавател |
Описание на щифта |
МРАВКА |
За свързване на антена |
GND |
GND |
VDD |
3.3 до 5V |
ДАННИ |
Тук са дадени данни, които трябва да се предадат на получателя |
RF приемник:
433Mhz RF приемник |
ИЗПОЛЗВАЙТЕ |
МРАВКА |
За свързване на антена |
GND |
GND |
VDD |
3.3 до 5V |
ДАННИ |
Данни, които трябва да бъдат получени от предавателя |
CE / DO |
Това е и ПИН за данни |
Спецификации на модула 433 MHz:
- Работно напрежение на приемника: 3V до 5V
- Работно напрежение на предавателя: 3V до 5V
- Работна честота: 433 MHz
- Разстояние на предаване: 3 метра (без антена) до 100 метра (максимум)
- Модулираща техника: ASK (Амплитудно превключване на клавиатурата)
- Скорост на предаване на данни: 10Kbps
Схема на РЧ трансмитер със STM32F103C8
Свързващи вериги между RF трансмитер и STM32F103C8:
STM32F103C8 |
RF предавател |
5V |
VDD |
GND |
GND |
PA10 |
ДАННИ |
NC |
МРАВКА |
Свързващи вериги между ултразвуков сензор и STM32F103C8:
STM32F103C8 |
Ултразвуков сензор (HC-SR04) |
5V |
VCC |
PB1 |
Trig |
PB0 |
Ехо |
GND |
GND |
А потенциометър 10k е свързан с STM32F103C8 да се осигури въвеждане на аналогов стойност (от 0 до 3.3V) на ADC щифт PA0 на STM32.
Схема на RF приемник с Arduino Uno
Верижни връзки между RF приемник и Arduino UNO:
Arduino UNO |
RF приемник |
5V |
VDD |
GND |
GND |
11. |
ДАННИ |
NC |
МРАВКА |
Верижни връзки между 16x2 LCD и Arduino UNO:
Име на LCD щифт |
Име на Pin на Arduino UNO |
Земя (Gnd) |
Земя (G) |
VCC |
5V |
VEE |
ПИН от центъра на потенциометъра за контраст |
Избор на регистър (RS) |
2 |
Четене / запис (RW) |
Земя (G) |
Активиране (EN) |
3 |
Бит за данни 4 (DB4) |
4 |
Бит за данни 5 (DB5) |
5 |
Бит за данни 6 (DB6) |
6 |
Бит за данни 7 (DB7) |
7 |
LED Положителен |
5V |
LED отрицателен |
Земя (G) |
Кодирането ще бъде обяснено накратко по-долу. Ще има две части на скицата, където първата част ще бъде предавателна секция, а друга ще бъде приемна секция. Всички файлове със скици и работещо видео ще бъдат дадени в края на този урок. За да научите повече за свързването на RF модула с Arduino Uno, следвайте връзката.
Програмиране на STM32F103C8 за безжично RF предаване
STM32F103C8 може да бъде програмиран с помощта на Arduino IDE. За качване на кода в STM32F103C8 не е необходим FTDI програмист или ST-Link. Просто се свържете с компютър чрез USB порт на STM32 и започнете да програмирате с ARDUINO IDE. Можете да научите програмиране на вашия STM32 в Arduino IDE, като следвате връзката.
В секцията на предавателя разстоянието на обекта в 'cm' се измерва с помощта на ултразвуков сензор, а числовата стойност от (0 до 100) се задава с помощта на потенциометър, който се предава чрез RF предавател, свързан със STM32.
Първо е включена библиотеката на Radiohead, която може да бъде изтеглена от тук. Тъй като тази библиотека използва ASK (Amplitude Shift Keying Technique) за предаване и получаване на данни. Това прави програмирането много лесно. Можете да включите библиотека в скица, като влезете в Скица-> включи библиотека-> Добави.zip библиотека.
#include
Както в този урок в страната на предавателя, за измерване на разстоянието се използва ултразвуков сензор, така че да се дефинират щифтовете на спусъка и ехото.
#define trigPin PB1 #define echoPin PB0
След това името на обекта за библиотеката RH_ASK се задава като rf_driver с параметри като скорост (2000), RX пин (PA9) и TX пин (PA10).
RH_ASK rf_driver (2000, PA9, PA10);
След това се декларират променливата Strings, необходима в тази програма.
Низ номер_предаване; Низ предаване_разстояние; String предаване;
След това в void setup () обектът за RH_ASK rf_driver се инициализира.
rf_driver.init ();
След това щифтът на спусъка е зададен като ИЗХОД ЗА ИЗХОД, а PA0 (свързан към потенциометъра) и щифтът за ехо е зададен като ИНПУТ. Серийната комуникация започва с скорост на предаване 9600.
Serial.begin (9600); pinMode (PA0, INPUT); pinMode (echoPin, INPUT); pinMode (trigPin, OUTPUT);
След това в цикъла void (), първо стойността на потенциометъра, която е входното аналогово напрежение, се преобразува в цифрова стойност (намерена е ADC стойност). Тъй като ADC на STM32 има 12-битова резолюция. И така, цифровата стойност варира от (0 до 4096), което се отразява в (0 до 100).
int analoginput = analogRead (PA0); int pwmvalue = карта (аналогов вход, 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 = String (разстояние);
И двата низа се добавят като един ред и се съхраняват в низ, наречен предаване и запетая “,” се използва за разделяне на два низа.
предаване = предаване_pwm + "," + предаване_разстояние;
Предавателният низ се преобразува в масив от символи.
const char * msg = transmit.c_str ();
Данните се предават и изчакайте, докато бъдат изпратени.
rf_driver.send ((uint8_t *) msg, strlen (msg)); rf_driver.waitPacketSent ();
Изпратените низови данни също се показват в серийния монитор.
Serial.println (msg);
Програмиране на Arduino UNO като RF приемник
Arduino UNO е програмиран с помощта на Arduino IDE. В секцията на приемника данните, които се предават от секцията на предавателя и се получават от модула на RF приемника, и получените данни от низовете се разделят на съответни данни (разстояние и номер) и се показват на LCD дисплея 16x2.
Нека видим накратко кодирането на приемника:
Както в секцията на предавателя, първо е включена библиотеката RadiohHead. Тъй като тази библиотека използва ASK (Техника за манипулиране на амплитудно изместване) за предаване и получаване на данни. Това прави програмирането много лесно.
#include
Тъй като тук се използва LCD дисплей, така е включена и библиотеката с течни кристали.
#include
И щифтовете 16x2 LCD дисплея, свързани с Arduino UNO, са посочени и декларирани с помощта на lcd като обект.
LCD LiquidCrystal (2,3,4,5,6,7);
След това се декларират променливите на String данни за съхраняване на низови данни.
Низ str_receive; Низ str_number; Низ str_distance;
Обектът за библиотеката на Radiohead е деклариран.
RH_ASK rf;
Сега в настройката за празнота (), LCD дисплеят е настроен в режим 16x2 и се показва и изчиства приветствено съобщение.
lcd.begin (16,2); lcd.print ("CIRCUIT DIGEST"); 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))
В Buf има получените низ така че след това получи низ се съхранява в str_receive низ променлива.
str_receive = String ((char *) buf);
Този цикъл 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 дистанционна струна; str_distance.toCharArray (низ от разстояние, 3); str_number.toCharArray (stringstring, 3);
След това преобразувайте символния масив в цяло число, използвайки atoi ()
int разстояние = atoi (низ от разстояние); int номер = atoi (числов низ);
След преобразуване в целочислени стойности стойностите разстояние и число се показват на 16x2 LCD дисплей
lcd.setCursor (0,0); lcd.print ("Номер:"); lcd.print (номер); lcd.setCursor (0,1); lcd.print ("Разстояние:"); lcd.print (разстояние); lcd.print ("cm");
След качване на кодовете, т.е. предавател и приемник в STM32 и Arduino UNO, данните като брой и разстояние на обекта, измерени с помощта на STM32, се предават на RF приемника чрез RF предавател и получените стойности се показват на LCD дисплея безжично.
Тестване на базиран на STM 32 RF предавател и приемник
1. Когато числото на 0 и разстоянието на обекта е на 6 см.
2. Когато номер 47 и разстоянието на обекта е 3cm.