- Composants requis
- Module émetteur et récepteur RF 433 Mhz)
- Schéma de circuit de l'émetteur RF avec STM32F103C8
- Schéma de circuit du récepteur RF avec Arduino Uno
- Programmation STM32F103C8 pour la transmission RF sans fil
- Programmation Arduino UNO comme récepteur RF
- Test de l'émetteur et du récepteur RF basés sur la STM 32
Faire des projets sans fil dans l'électronique embarquée devient très important et utile car il n'y a pas de fils brouillés partout, ce qui rend l'appareil plus pratique et portable. Il existe différentes technologies sans fil telles que Bluetooth, WiFi, 433 MHz RF (fréquence radio), etc. Chaque technologie a ses avantages et ses inconvénients tels que le coût, la distance ou le transfert de la plage, la vitesse ou le débit, etc. Aujourd'hui, nous allons utiliser le module RF avec STM32 pour envoyer et recevoir les données sans fil. Si vous êtes nouveau sur le microcontrôleur STM32, commencez par LED clignotante avec STM32 en utilisant Arduino IDE et vérifiez tous les autres projets STM32 ici.
En dehors de cela, nous avons également utilisé le module sans fil RF 433Mhz avec d'autres microcontrôleurs pour construire des projets contrôlés sans fil, tels que:
- Appareils ménagers contrôlés par RF
- LED télécommandées RF à l'aide de Raspberry Pi
- Robot contrôlé par RF
- Interfaçage du module RF avec Arduino
- Communication PIC à PIC à l'aide du module RF
Ici, nous allons interfacer un module sans fil RF 433 MHz avec le microcontrôleur STM32F103C8. Le projet est divisé en deux parties. L' émetteur sera interfacé avec STM32 et le récepteur sera interfacé avec Arduino UNO. Il y aura différents schémas de circuit et croquis pour la partie émettrice et la partie réceptrice.
Dans ce tutoriel, l'émetteur RF envoie deux valeurs côté récepteur: la distance mesurée à l'aide du capteur à ultrasons et la valeur ADC du potentiomètre (0 à 4096) qui est mappée sous forme de nombre de (0 à 100). Le récepteur RF d'Arduino reçoit à la fois les valeurs et imprime ces valeurs de distance et de nombre sur un écran LCD 16x2 sans fil.
Composants requis
- Microcontrôleur STM32F103C8
- Arduino UNO
- Émetteur et récepteur RF 433Mhz
- Capteur à ultrasons (HC-SR04)
- Écran LCD 16x2
- Potentiomètre 10k
- Planche à pain
- Connexion des fils
Module émetteur et récepteur RF 433 Mhz)
Brochage de l'émetteur RF:
Émetteur RF 433Mhz |
Description des broches |
FOURMI |
Pour connecter l'antenne |
GND |
GND |
VDD |
3,3 à 5 V |
LES DONNÉES |
Les données à transmettre au récepteur sont données ici |
Brochage du récepteur RF:
Récepteur RF 433Mhz |
UTILISATION |
FOURMI |
Pour connecter l'antenne |
GND |
GND |
VDD |
3,3 à 5 V |
LES DONNÉES |
Données à recevoir de l'émetteur |
CE / DO |
C'est aussi une broche de données |
Spécifications du module 433 MHz:
- Tension de fonctionnement du récepteur: 3V à 5V
- Tension de fonctionnement de l'émetteur: 3V à 5V
- Fréquence de fonctionnement: 433 MHz
- Distance de transmission: 3 mètres (sans antenne) à 100 mètres (maximum)
- Technique de modulation: ASK (modulation par décalage d'amplitude)
- Vitesse de transmission de données: 10 Kbps
Schéma de circuit de l'émetteur RF avec STM32F103C8
Connexions du circuit entre l'émetteur RF et le STM32F103C8:
STM32F103C8 |
Émetteur RF |
5V |
VDD |
GND |
GND |
PA10 |
LES DONNÉES |
NC |
FOURMI |
Connexions du circuit entre le capteur à ultrasons et le STM32F103C8:
STM32F103C8 |
Capteur à ultrasons (HC-SR04) |
5V |
VCC |
PB1 |
Trigonométrie |
PB0 |
Écho |
GND |
GND |
Un potentiomètre 10k est connecté au STM32F103C8 pour fournir une valeur analogique d'entrée (0 à 3,3 V) à la broche ADC PA0 du STM32.
Schéma de circuit du récepteur RF avec Arduino Uno
Connexions du circuit entre le récepteur RF et Arduino UNO:
Arduino UNO |
Récepteur RF |
5V |
VDD |
GND |
GND |
11 |
LES DONNÉES |
NC |
FOURMI |
Connexions du circuit entre 16x2 LCD et Arduino UNO:
Nom de la broche LCD |
Nom de la broche Arduino UNO |
Sol (Gnd) |
Terre (G) |
VCC |
5V |
VEE |
Broche du centre du potentiomètre pour le contraste |
Inscription Sélectionner (RS) |
2 |
Lecture / écriture (RW) |
Terre (G) |
Activer (EN) |
3 |
Bit de données 4 (DB4) |
4 |
Bit de données 5 (DB5) |
5 |
Bit de données 6 (DB6) |
6 |
Bit de données 7 (DB7) |
sept |
LED positive |
5V |
LED négative |
Terre (G) |
Le codage sera expliqué brièvement ci-dessous. Il y aura deux parties du croquis où la première partie sera la section émetteur et une autre sera la section récepteur. Tous les fichiers d'esquisse et la vidéo de travail seront donnés à la fin de ce tutoriel. Pour en savoir plus sur l'interfaçage du module RF avec Arduino Uno, suivez le lien.
Programmation STM32F103C8 pour la transmission RF sans fil
STM32F103C8 peut être programmé à l'aide de l'IDE Arduino. Un programmeur FTDI ou ST-Link n'est pas nécessaire pour télécharger le code vers STM32F103C8. Connectez-vous simplement au PC via le port USB de STM32 et commencez la programmation avec ARDUINO IDE. Vous pouvez apprendre à programmer votre STM32 dans Arduino IDE en suivant le lien.
Dans la section émetteur, la distance de l'objet en «cm» est mesurée à l'aide d'un capteur à ultrasons et la valeur numérique de (0 à 100) est réglée à l'aide d'un potentiomètre qui est transmis via un émetteur RF interfacé avec STM32.
La bibliothèque Radiohead est d'abord incluse, elle peut être téléchargée à partir d'ici. Comme cette bibliothèque utilise ASK (Amplitude Shift Keying Technique) pour transmettre et recevoir des données. Cela rend la programmation très facile. Vous pouvez inclure une bibliothèque dans l'esquisse en accédant à Sketch-> include library-> Add.zip library.
#comprendre
Comme dans ce tutoriel côté émetteur, un capteur à ultrasons est utilisé pour mesurer la distance afin de définir les broches de déclenchement et d'écho.
#define trigPin PB1 #define echoPin PB0
Ensuite, le nom de l'objet pour la bibliothèque RH_ASK est défini comme rf_driver avec les paramètres tels que la vitesse (2000), la broche RX (PA9) et la broche TX (PA10).
RH_ASK rf_driver (2000, PA9, PA10);
Ensuite, la variable Strings nécessaire dans ce programme est déclarée.
String send_number; Chaîne de transmission_distance; Chaîne de transmission;
Ensuite, dans void setup (), l'objet pour RH_ASK rf_driver est initialisé.
rf_driver.init ();
Après cela, la broche de déclenchement est définie comme broche OUTPUT et le PA0 (connecté au potentiomètre) et la broche d'écho sont réglés comme broche INPUT. La communication série commence à une vitesse de transmission de 9600.
Serial.begin (9600); pinMode (PA0, INPUT); pinMode (echoPin, INPUT); pinMode (trigPin, OUTPUT);
Ensuite, dans la boucle vide (), d'abord la valeur du potentiomètre qui est l'entrée La tension analogique est convertie en valeur numérique (la valeur ADC est trouvée). Comme l'ADC de STM32 a une résolution de 12 bits. Ainsi, la valeur numérique varie de (0 à 4096) qui est mappée en (0 à 100).
int analoginput = analogRead (PA0); int pwmvalue = map (entrée analogique, 0,4095,0,100);
Ensuite, la distance est mesurée à l'aide d'un capteur à ultrasons en réglant le déclencheur haut et bas avec un retard de 2 microsecondes.
digitalWrite (trigPin, LOW); delayMicrosecondes (2); digitalWrite (trigPin, HIGH); delayMicrosecondes (10); digitalWrite (trigPin, LOW);
La broche d'écho détecte l'onde réfléchie en retour, c'est-à-dire que la durée pendant laquelle l'onde déclenchée est réfléchie est utilisée pour calculer la distance de l'objet à l'aide de la formule. En savoir plus sur la façon dont le capteur à ultrasons calcule la distance en suivant le lien.
longue durée = pulseIn (echoPin, HIGH); distance flottante = durée * 0,034 / 2;
Désormais, le nombre de données et la distance mesurés sont convertis en données de chaîne et stockés dans des variables de chaîne respectives.
transmettre_nombre = Chaîne (pwmvalue); transmettre_distance = Chaîne (distance);
La chaîne est ajoutée sur une seule ligne et stockée dans une chaîne appelée transmission et une virgule «» est utilisée pour séparer deux chaînes.
transmettre = transmettre_pwm + "," + transmettre_distance;
La chaîne de transmission est convertie en tableau de caractères.
const char * msg = transmettre.c_str ();
Les données sont transmises et attendez qu'elles soient envoyées.
rf_driver.send ((uint8_t *) msg, strlen (msg)); rf_driver.waitPacketSent ();
Les données de chaîne envoyées sont également affichées dans Serial Monitor.
Serial.println (msg);
Programmation Arduino UNO comme récepteur RF
Arduino UNO est programmé à l'aide de l'IDE Arduino. Dans la section de récepteur, les données qui sont transmises depuis la section d'émetteur et reçues par le module de récepteur RF et les données de chaîne reçues sont divisées en données respectives (distance et nombre) et affichées sur l'écran LCD 16x2.
Voyons le codage du récepteur en bref:
Comme dans la section émetteur, la bibliothèque RadiohHead est d'abord incluse. Comme cette bibliothèque utilise ASK (Amplitude Shift Keying Technique) pour transmettre et recevoir des données. Cela rend la programmation très facile.
#comprendre
Comme l'écran LCD est utilisé ici, la bibliothèque de cristaux liquides est également incluse.
#comprendre
Et les broches d'affichage LCD 16x2 connectées à Arduino UNO sont spécifiées et déclarées en utilisant LCD comme objet.
LiquidCrystal LCD (2,3,4,5,6,7);
Ensuite, les variables de données de chaîne pour stocker les données de chaîne sont déclarées.
String str_receive; String str_number; String str_distance;
L'objet de la bibliothèque Radiohead est déclaré.
RH_ASK rf;
Maintenant, dans la configuration d' annulation (), l'écran LCD est réglé en mode 16x2 et un message de bienvenue est affiché et effacé.
lcd.begin (16,2); lcd.print ("CIRCUIT DIGEST"); lcd.setCursor (0,1); lcd.print ("RF avec STM32"); retard (5000); lcd.clear ();
Après cela, l' objet rf est initialisé.
rf.init ();
Maintenant, dans la boucle void (), le buf Array est déclaré avec une taille de 7. Comme les données envoyées par l'émetteur en ont 7, y compris le «,». Alors, changez cela en fonction des données à transmettre.
uint8_t buf; uint8_t buflen = sizeof (buf);
Si la chaîne est disponible sur le module récepteur RF, la fonction if vérifie la taille et s'exécute. La rf.recv () est utilisée pour recevoir des données.
if (rf.recv (buf, & buflen))
Le buf a la chaîne reçue, donc la chaîne reçue est stockée dans une variable de chaîne str_receive .
str_receive = Chaîne ((char *) buf);
Cette boucle for est utilisée pour diviser la chaîne reçue en deux si elle détecte le ',' entre deux chaînes.
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); Pause; }
Deux tableaux de caractères pour deux valeurs sont déclarés et la chaîne divisée en deux est stockée dans un tableau respecté en convertissant la chaîne en tableau de caractères.
char numbertring; char distancestring; str_distance.toCharArray (distancestring, 3); str_number.toCharArray (numerostring, 3);
Après cela, convertissez le tableau de caractères en entier en utilisant atoi ()
int distance = atoi (distancestring); nombre entier = atoi (chaîne de nombres);
Après la conversion en valeurs entières, la distance et le nombre de valeurs sont affichés sur l'écran LCD 16x2
lcd.setCursor (0,0); lcd.print ("Numéro:"); lcd.print (nombre); lcd.setCursor (0,1); lcd.print ("Distance:"); lcd.print (distance); lcd.print ("cm");
Après avoir téléchargé à la fois les codes, à savoir l'émetteur et le récepteur dans le STM32 et l'Arduino UNO respectivement, les données telles que le nombre et la distance de l'objet mesurées à l'aide du STM32 sont transmises au récepteur RF via l'émetteur RF et les valeurs reçues sont affichées sans fil sur l'écran LCD.
Test de l'émetteur et du récepteur RF basés sur la STM 32
1. Lorsque le nombre est à 0 et que la distance de l'objet est à 6 cm.
2. Lorsque le numéro 47 et la distance de l'objet sont à 3 cm.