- Wymagane składniki
- 433 Mhz RF nadajnik i moduł odbiornika)
- Schemat obwodu nadajnika RF z STM32F103C8
- Schemat obwodu odbiornika RF z Arduino Uno
- Programowanie STM32F103C8 do bezprzewodowej transmisji RF
- Programowanie Arduino UNO jako odbiornika RF
- Testowanie nadajnika i odbiornika RF opartego na STM 32
Tworzenie projektów bezprzewodowych w elektronice wbudowanej staje się bardzo ważne i pomocne, ponieważ nie ma poplątanych przewodów, co sprawia, że urządzenie jest bardziej poręczne i przenośne. Istnieją różne technologie bezprzewodowe, takie jak Bluetooth, WiFi, 433 MHz RF (częstotliwość radiowa) itp. Każda technologia ma swoje zalety i wady, takie jak koszt, przesyłanie odległości lub zasięgu, prędkość lub przepustowość itp. Dzisiaj będziemy używać modułu RF z STM32. aby wysyłać i odbierać dane bezprzewodowo. Jeśli jesteś nowy w mikrokontrolerze STM32, zacznij od migającej diody LED z STM32 za pomocą Arduino IDE i sprawdź wszystkie inne projekty STM32 tutaj.
Oprócz tego użyliśmy również modułu bezprzewodowego RF 433Mhz z innymi mikrokontrolerami do budowy projektów sterowanych bezprzewodowo, takich jak:
- Urządzenia domowe sterowane radiowo
- Zdalnie sterowane diody LED za pomocą Raspberry Pi
- Robot sterowany radiowo
- Łączenie modułu RF z Arduino
- Komunikacja PIC do PIC za pomocą modułu RF
Tutaj połączymy bezprzewodowy moduł 433MHz RF z mikrokontrolerem STM32F103C8. Projekt podzielony jest na dwie części. Przetwornik jest połączony z STM32, a odbiornik połączony jest z Arduino ONZ. Będzie inny schemat połączeń i szkice zarówno dla części nadawczej, jak i odbiorczej.
W tym samouczku nadajnik RF wysyła dwie wartości do strony odbiornika: odległość mierzoną za pomocą czujnika ultradźwiękowego i wartość potencjometru ADC (od 0 do 4096), która jest odwzorowywana jako liczba od (0 do 100). Odbiornik RF z Arduino otrzyma obie te wartości i wydruki na odległość i ilość wartości w wyświetlacz LCD 16x2 bezprzewodowo.
Wymagane składniki
- Mikrokontroler STM32F103C8
- Arduino UNO
- Nadajnik i odbiornik RF 433 Mhz
- Czujnik ultradźwiękowy (HC-SR04)
- Wyświetlacz LCD 16x2
- Potencjometr 10 k
- Płytka prototypowa
- Podłączanie przewodów
433 Mhz RF nadajnik i moduł odbiornika)
Pinout nadajnika RF:
Nadajnik RF 433 Mhz |
Opis pinów |
MRÓWKA |
Do podłączenia anteny |
GND |
GND |
VDD |
3,3 do 5 V. |
DANE |
W tym miejscu podano dane, które mają być przesłane do odbiorcy |
Pinout odbiornika RF:
Odbiornik RF 433 Mhz |
POSŁUGIWAĆ SIĘ |
MRÓWKA |
Do podłączenia anteny |
GND |
GND |
VDD |
3,3 do 5 V. |
DANE |
Dane do odebrania od nadajnika |
CE / DO |
Jest to również pin danych |
Dane techniczne modułu 433 MHz:
- Napięcie robocze odbiornika: od 3 V do 5 V.
- Napięcie robocze nadajnika: od 3 V do 5 V.
- Częstotliwość pracy: 433 MHz
- Odległość transmisji: od 3 metrów (bez anteny) do 100 metrów (maksymalnie)
- Technika modulacji: ASK (kluczowanie z przesunięciem amplitudy)
- Szybkość transmisji danych: 10 kb / s
Schemat obwodu nadajnika RF z STM32F103C8
Połączenia obwodów między nadajnikiem RF a STM32F103C8:
STM32F103C8 |
Nadajnik RF |
5V |
VDD |
GND |
GND |
PA10 |
DANE |
NC |
MRÓWKA |
Połączenia obwodu między czujnikiem ultradźwiękowym a STM32F103C8:
STM32F103C8 |
Czujnik ultradźwiękowy (HC-SR04) |
5V |
VCC |
PB1 |
Wymuskany |
PB0 |
Echo |
GND |
GND |
10k potencjometru jest połączony z STM32F103C8 dostarczyłoby wartość analogową (od 0 do 3,3) do ADC sworznia PA0 z STM32.
Schemat obwodu odbiornika RF z Arduino Uno
Połączenia obwodów między odbiornikiem RF a Arduino UNO:
Arduino UNO |
Odbiornik RF |
5V |
VDD |
GND |
GND |
11 |
DANE |
NC |
MRÓWKA |
Połączenia obwodów między wyświetlaczem LCD 16x2 i Arduino UNO:
Nazwa styku wyświetlacza LCD |
Nazwa pinu Arduino UNO |
Ziemia (Gnd) |
Mielone (G) |
VCC |
5V |
VEE |
Szpilka ze środka potencjometru kontrastu |
Zarejestruj Wybierz (RS) |
2 |
Odczyt / zapis (RW) |
Mielone (G) |
Włącz (EN) |
3 |
Bit danych 4 (DB4) |
4 |
Bit danych 5 (DB5) |
5 |
Bit danych 6 (DB6) |
6 |
Bit danych 7 (DB7) |
7 |
Dioda LED dodatnia |
5V |
Negatyw LED |
Mielone (G) |
Kodowanie zostanie krótko wyjaśnione poniżej. Będą dwie części szkicu, gdzie pierwsza część będzie sekcją nadajnika, a druga będzie sekcją odbiornika. Wszystkie pliki szkiców i działające wideo zostaną podane na końcu tego samouczka. Aby dowiedzieć się więcej na temat połączenia modułu RF z Arduino Uno, kliknij łącze.
Programowanie STM32F103C8 do bezprzewodowej transmisji RF
STM32F103C8 można zaprogramować za pomocą Arduino IDE. FTDI programista lub ST-Link nie jest potrzebny, aby przesłać kod do STM32F103C8. Wystarczy podłączyć do komputera przez port USB STM32 i rozpocząć programowanie za pomocą ARDUINO IDE. Możesz nauczyć się programowania STM32 w Arduino IDE, klikając link.
W sekcji nadajnika odległość obiektu w 'cm' mierzona jest za pomocą czujnika ultradźwiękowego, a wartość liczbowa od (0 do 100) ustawiana za pomocą potencjometru, który transmitowany jest przez nadajnik RF połączony z STM32.
Najpierw dołączona jest biblioteka Radiohead, którą można pobrać stąd. Ponieważ ta biblioteka wykorzystuje technikę ASK (Amplitude Shift Keying Technique) do przesyłania i odbierania danych. To sprawia, że programowanie jest bardzo łatwe. Możesz dołączyć bibliotekę do szkicu, przechodząc do Szkic-> dołącz bibliotekę-> Dodaj bibliotekę.zip.
#zawierać
Podobnie jak w tym samouczku, po stronie nadajnika do pomiaru odległości używany jest czujnik ultradźwiękowy, więc zdefiniowano piny wyzwalacza i echa.
# zdefiniować trigPin PB1 # zdefiniować echoPin PB0
Następnie nazwa obiektu dla biblioteki RH_ASK jest ustawiana jako rf_driver z parametrami takimi jak prędkość (2000), pin RX (PA9) i pin TX (PA10).
RH_ASK rf_driver (2000, PA9, PA10);
Następnie deklarowana jest zmienna Strings potrzebna w tym programie.
String numer_ transmisji; String transmit_distance; Transmisja ciągu;
Następnie w void setup () inicjowany jest obiekt RH_ASK rf_driver.
rf_driver.init ();
Następnie pin wyzwalacza jest ustawiany jako pin OUTPUT, a pin PA0 (podłączony do potencjometru) i pin echa jest ustawiany jako pin INPUT. Komunikacja szeregowa rozpoczyna się przy szybkości transmisji 9600.
Serial.begin (9600); pinMode (PA0, WEJŚCIE); pinMode (echoPin, INPUT); pinMode (trigPin, OUTPUT);
Następnie w pustej pętli () najpierw wartość potencjometru, czyli wejście, napięcie analogowe jest konwertowane na wartość cyfrową (znajduje się wartość ADC). Ponieważ ADC w STM32 ma rozdzielczość 12-bitową. Tak więc wartość cyfrowa waha się od (0 do 4096), która jest odwzorowywana na (0 do 100).
int analoginput = analogRead (PA0); int pwmvalue = map (analoginput, 0,4095,0,100);
Następnie odległość jest mierzona za pomocą czujnika ultradźwiękowego, ustawiając wyzwalacz w stan wysoki i niski z opóźnieniem 2 mikrosekund.
digitalWrite (trigPin, LOW); delayMicroseconds (2); digitalWrite (trigPin, HIGH); delayMicroseconds (10); digitalWrite (trigPin, LOW);
Kołek echa wyczuwa odbitą falę z powrotem, czyli czas, przez jaki wyzwolona fala jest odbijana, jest używany do obliczania odległości obiektu za pomocą wzoru. Dowiedz się więcej, jak czujnik ultradźwiękowy oblicza odległość, klikając link.
długi czas trwania = pulseIn (echoPin, HIGH); odległość pływaka = czas trwania * 0,034 / 2;
Teraz zarówno liczba danych, jak i zmierzona odległość są konwertowane na dane łańcuchowe i przechowywane w odpowiednich zmiennych łańcuchowych.
transmit_number = String (pwmvalue); transmit_distance = String (odległość);
Oba łańcuchy są dodawane jako jedna linia i przechowywane w łańcuchu o nazwie transmit, a przecinek „” służy do oddzielania dwóch ciągów.
transmit = transmit_pwm + "," + transmit_distance;
Przesyłany ciąg jest konwertowany na tablicę znaków.
const char * msg = transmit.c_str ();
Dane są przesyłane i czekaj, aż zostaną wysłane.
rf_driver.send ((uint8_t *) msg, strlen (msg)); rf_driver.waitPacketSent ();
Wysłane dane ciągu są również wyświetlane w monitorze szeregowym.
Serial.println (msg);
Programowanie Arduino UNO jako odbiornika RF
Arduino UNO jest programowane za pomocą Arduino IDE. W sekcji odbiornika dane, które są przesyłane z sekcji nadajnika i odbierane przez moduł odbiornika RF oraz odbierane dane tekstowe są dzielone na odpowiednie dane (odległość i liczba) i wyświetlane na wyświetlaczu LCD 16x2.
Przyjrzyjmy się w skrócie kodowaniu odbiornika:
Podobnie jak w sekcji nadajnika, najpierw dołączona jest biblioteka RadiohHead. Ponieważ ta biblioteka wykorzystuje technikę ASK (Amplitude Shift Keying Technique) do przesyłania i odbierania danych. To sprawia, że programowanie jest bardzo łatwe.
#zawierać
Ponieważ używany jest tutaj wyświetlacz LCD, dołączona jest również biblioteka ciekłokrystaliczna.
#zawierać
Piny wyświetlacza LCD 16x2 połączone z Arduino UNO są określone i zadeklarowane przy użyciu lcd jako obiektu.
LiquidCrystal lcd (2,3,4,5,6,7);
Następnie deklarowane są zmienne danych typu String do przechowywania danych łańcuchowych.
String str_receive; String str_number; String str_distance;
Zadeklarowano obiekt biblioteki Radiohead.
RH_ASK rf;
Teraz w void setup (), wyświetlacz LCD jest ustawiony na tryb 16x2, a komunikat powitalny jest wyświetlany i kasowany.
lcd.begin (16,2); lcd.print ("PRZEGLĄD OBWODU"); lcd.setCursor (0,1); lcd.print ("RF z STM32"); opóźnienie (5000); lcd.clear ();
Następnie inicjowany jest obiekt rf .
rf.init ();
Teraz w void loop (), Array buf jest zadeklarowana z rozmiarem 7. Ponieważ dane wysyłane z nadajnika mają 7, łącznie z „,”. Dlatego zmień to zgodnie z danymi, które mają być przesłane.
uint8_t buf; uint8_t buflen = sizeof (buf);
Jeśli łańcuch jest dostępny w module odbiornika rf, funkcja if sprawdza rozmiar i wykonuje. Rf.recv () jest wykorzystywany do odbioru danych.
if (rf.recv (buf, & buflen))
Buf ma odebrany ciąg tak potem otrzymał ciąg jest przechowywany w str_receive zmiennej łańcuchowej.
str_receive = String ((char *) buf);
Ta pętla for jest używana do podzielenia otrzymanego ciągu na dwa, jeśli wykryje „,” pomiędzy dwoma ciągami.
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); przerwa; }
Deklarowane są dwie tablice znaków dla dwóch wartości, a String, który jest podzielony na dwie, jest przechowywany w odpowiedniej tablicy poprzez konwersję ciągu znaków na tablicę znaków.
ciąg znaków; znak dystansu; str_distance.toCharArray (distancestring, 3); str_number.toCharArray (numberstring, 3);
Następnie przekonwertuj tablicę znaków na liczbę całkowitą za pomocą atoi ()
int distance = atoi (distancestring); int liczba = atoi (ciąg liczbowy);
Po przeliczeniu na wartości całkowite wartości odległości i liczby są wyświetlane na wyświetlaczu LCD 16x2
lcd.setCursor (0,0); lcd.print ("Numer:"); lcd.print (liczba); lcd.setCursor (0,1); lcd.print ("Odległość:"); lcd.print (odległość); lcd.print ("cm");
Po wgraniu obu kodów tj. Nadajnika i odbiornika odpowiednio do STM32 i Arduino UNO, dane takie jak numer i odległość obiektu zmierzone za pomocą STM32 są przesyłane do odbiornika RF za pośrednictwem Nadajnika RF, a odebrane wartości są bezprzewodowo wyświetlane na wyświetlaczu LCD.
Testowanie nadajnika i odbiornika RF opartego na STM 32
1. Gdy liczba na 0, a odległość obiektu wynosi 6cm.
2. Gdy liczba 47 i odległość obiektu wynosi 3cm.