Construire et piloter une voiture Arduino
Programme Arduino B4R concernant la voiture n° 1
Conception d'un programme B4R pour contrôler ce véhicule
Avant de détailler le programmes utilisé, il est bon de se familiariser avec l'emploi d'un servomoteur pour contrôler la direction de la voiture Arduino. Tout d'abord, nous allons vérifier le bon fonctionnement du servomoteur en utilisant un potentiomètre comme sur le schéma ci-dessous:
Voir vidéo: Test du servomoteur en utilisant un potentiomètre
Télécharger le petit programme de test: "EssaiServoMoteur.B4R
Grâce à l'utilisation d'une
bibliothèque spécialement adaptée aux servomoteurs, les commandes envoyées au
servomoteur sont finalement traduites en degrés. Cela se traduira par exemple ainsi:
- Angle de 90° >>> Le bras du servomoteur se place au
milieu de sa course (de 180°), les roues de la voiture seront alignées en ligne
droite.
- Angle de 70° >>> Orientation légère à gauche
- Angle de 40° >>> Orientation nette à gauche
- Angle de 110° >>> Orientation légère à droite
- Angle de 130° >>> Orientation nette à droite
Il est fortement conseillé de fixer le bras du servomoteur à l'endroit correspondant à la position centrale (90°). Les essais doivent être effectués de préférence avant de fixer le bras au système de direction, car de fausses manœuvres pourraient endommager le matériel et le servomoteur lui-même (engrenages internes) surtout si les commandes envoyées sont inférieures à 30° ou supérieures à 130°, même si mathématiquement on pourrait varier de 0° à 180° !!!
Pour ceux qui ne disposent pas d'un potentiomètre, il est possible de tester votre servomoteur seul avec un petit programme de test B4R adapté. Le schéma est pratiquement le même que plus haut:
Voir vidéo: Test du servomoteur sans potentiomètre
Sur cette vidéo, les commandes
sont générées automatiquement par le petit programme de test
"TestServo2.B4R", le bras du servomoteur va successivement effectuer
les mouvements suivants:
- Ordre: Angle de 70° >>>
Rotation légère à gauche
- Ordre: Angle de 30° >>>
Rotation nette à gauche
- Ordre: Angle de 90° >>>
Alignement droit
- Ordre: Angle de 110° >>> Rotation
légère à droite
- Ordre: Angle de 130° >>>
Rotation nette à droite
- Ordre: Angle de 90° >>> Alignement droit
Télécharger le petit programme de test: "TestServo2.B4R
Et enfin, nous pouvons envoyer des ordres à la demande par le système Bluetooth avec un programme B4A installé sur un Smartphone (Voir la partie 4 pour plus de détails), ce qui donnera ceci:
Voir vidéo: Test du servomoteur par Bluetooth
Maintenant que tous les équipements sont installés et connectés, il est possible de tester le programme Arduino qui va contrôler la voiture et lui permettre de rouler. En effet, ce programme B4R permet de tester les équipements installés sans attendre la mise au point de l'application B4A qui pilotera la voiture à partir d'un Smartphone via le système Bluetooth.
Détail du programme écrit en Visual Basic pour cartes
Arduino > "B4R"
1 ' NewCarArduino - VoitureArduino - NewCarArduino.B4R - Marc DANIEL - Novembre
2021
2 #Region Project Attributes
3 #AutoFlushLogs: True
4 #CheckArrayBounds: True
5 #StackBufferSize: 300
6 #End Region 7
8 ' NB - L'utilisation de la bibliothèque rServo
provoque un bogue sur une carte
9 ' ARDUINO UNO, le servomoteur fonctionne normalement mais
les broches PWM
10 ' sont affectées et le moteur arrière ne reçoit plus rien,
la voiture reste
11 ' donc immobile! Pour cette
raison, je conseille l'utilisation d'une carte
12 ' MEGA2560 sur laquelle le programme est parfaitement
exécuté - Marc DANIEL
13
14 ' Using the rServo library
causes a bug on an ARDUINO UNO board,
15 ' the servo motor works normally but the PWM pins are
affected
16 ' and the rear engine (ENA >>> PWM on D9) no
longer receives anything,
17 ' so the car remains motionless!For
this reason, I advise the use of
18 ' a MEGA2560 card on which the program is perfectly
executed - Marc DANIEL
19
20 Sub Process_Globals
21 Public Serial1 As Serial
22 Private SoftwareSerial1 As SoftwareSerial
23 Private astream As AsyncStreams
24 ' Private IN1, IN2, ENA as Pin
25 ' Pins of the L298N to be used for a second engine
26 Private BtnTest, IN3, IN4, ENB, Lights,
Klaxon As Pin
27 Private SpeedM As UInt 'Vitesse de la voiture
- car speed
28 Private X=0, Y=0 As UInt
29 Private FEUX As Boolean ' Eclairage, LEDs, diodes
30 ' Lighting leds
diodes
31 Public MonServo As Servo 'Servomoteur
pilotant la direction
32 ' Servo motor controlling the direction of the front
wheels
33 Private SON As Boolean ' Klaxon ou Buzzer si installé
34 ' Horn or Buzzer if installed
35 End Sub 36
37 Private Sub AppStart
38 Serial1.Initialize(115200)
39 Log("Démarrage de la voiture")
40 IN3.Initialize(4, IN3.MODE_OUTPUT) ' Marche avant - Forward
41 IN4.Initialize(7, IN4.MODE_OUTPUT) ' Marche arrière - Backward
42 ENB.Initialize(9, ENB.MODE_OUTPUT)'Envoi
du signal PWM vers le moteur
43 ' Sending the PWM signal to the rear engine
44 Lights.Initialize(13, Lights.MODE_OUTPUT)
45 'Tous les feux, LEDs blanches avant, diodes rouges arrière,
doivent
46 'être reliées à la broche 13
47 'All lights, front white LEDs, rear red diodes
48 ' must be connected to pin 13
49 'Si aucun feu n'est connecté, il est possible de vérifier
l'allumage
50 ' de la petite LED jaune sur la carte Arduino elle-même.
51 'If no light is connected, it is possible to check the
ignition
52 ' of the small yellow LED on the Arduino board itself
53 Klaxon.Initialize(2, Klaxon.MODE_OUTPUT)
54 ' gestion de l'avertisseur sonore ou buzzer si installé
55 ' management of the audible alarm or buzzer if
installed
56 MonServo.Attach2(10,30,130) 'Servomoteur contôlant la direction
57 ' 30° est la valeur minimale, 130° est la valeur maximale
58 ' Servo motor control the front steering
59 ' 30° is the minimum value, 130° is the maximum value
60 BtnTest.Initialize(BtnTest.A0,BtnTest.MODE_INPUT_PULLUP)
61 ' Bouton poussoir qui lance le test des moteurs
62 ' Push button that starts the engine test
63 BtnTest.AddListener("BtnTEST_StateChanged")
64 SoftwareSerial1.Initialize(9600,11,12)
65 ' Software Serial port sur les broches 11 et 12
66 ' Software Serial port on pins 11 and 12 -
67 'Broche TXD de HC-05 directement reliée à Arduino 11
68 'Broche RXD de HC-05 protégée par 3 résistances de 1 Ko
reliée à Arduino 12
69 astream.Initialize(SoftwareSerial1.Stream,
"astream_NewData", Null)
70 End Sub
71
72 Private Sub BtnTEST_StateChanged(State As Boolean) 'Appui
sur le bouton de test
73 ' Press the test button
74 If State = False Then 'BoutonTEST=0
75 Log("Bouton test: ", State)
76 Depart
77 Else 'BoutonTEST=1
78 Log("Bouton test: ", State)
79 End If
80 End Sub
81
82 Sub
Depart 'tests de
fonctionnement des équipements après appui sur le petit bouton test
83 'equipment operation tests after pressing the small
test button
84 For x=1 To 3
85 Lights.DigitalWrite(True) 'Test des feux si installés
86 '(sinon
la LED 13 de la carte permettra de vérifier le test)
87 'Test of the lights if installed
88 '(otherwise the LED 13 of the card will check the
test)
89 Log("Allumage des feux")
90 FEUX = True
91 Klaxon.DigitalWrite(True) 'Test du Klaxon ou
Buzzer si installé
92 ' Test the Horn or Buzzer if installed
93 SON = True
94 Log("Déclenchement du Klaxon")
95 Delay(1000)
96 Lights.DigitalWrite(False)
97 FEUX = False '(Lumières
éteintes par défaut)
98 '(Lights off by default)
99 Log("Extinction des feux")
100 Klaxon.DigitalWrite(False)
101 SON = False
102 Log("Arrêt du Klaxon") '(Klaxon à l'arrêt par défaut)
103 '(Horn at idle by default)
104 Delay(1000)
105 Next
106 MonServo.Write(120) 'Tests sur la direction commandée
par le Servomoteur
107 ' Tests on the steering controlled by the Servo motor
108 Log("Roues avant braquées à droite")
109 Delay(2000)
110 MonServo.Write(35)
111 Log("Roues avant braquées à gauche")
112 Delay(2000)
113 MonServo.Write(90) 'Les roues avant sont
alignées en ligne droite
114 ' (Angle du bras orienté à 90°)
115 'The front wheels are aligned in a straight line (90°
arm angle)
116 Log("Alignement des roues avant")
117 'Test moteur arrière (Attention la voiture va avancer puis
reculer)
118 ''Rear engine test (Be careful the car will move
forward and then backward)
119 IN3.DigitalWrite(True)
120 IN4.DigitalWrite(False)
121 SpeedM = 100
122 Envoi
123 Delay(3000)
124 IN3.DigitalWrite(False)
125 IN4.DigitalWrite(True)
126 SpeedM = 100
127 Envoi
128 Delay(3000)
129 SpeedM=0 'Vitesse ramenée à zéro par défaut
130 ' Speed reduced to zero by default
131 Envoi
132 For x=1 To 3
133 Lights.DigitalWrite(True) 'Test des feux si
installés
134 '(sinon
la LED 13 de la carte permettra de vérifier le test)
135 'Test of the lights if installed
136 '(otherwise the LED 13 of the card will check the
test)
137 Log("Allumage des feux")
138 FEUX = True
139 Klaxon.DigitalWrite(True) 'Test du Klaxon ou
Buzzer si installé
140 ' Test the Horn or Buzzer if installed
141 SON = True
142 Log("Déclenchement du Klaxon")
143 Delay(1000)
144 Lights.DigitalWrite(False)
145 FEUX = False '(Lumières
éteintes par défaut)
146 '(Lights off by default)
147 Log("Extinction des feux")
148 Klaxon.DigitalWrite(False)
149 SON = False
150 Log("Arrêt du Klaxon") '(Klaxon à l'arrêt par défaut)
151 '(Horn at idle by default)
152 Delay(1000)
153 Next
154 End Sub 'Fin des tests de fonctionnement des équipements
155 ' End of equipment operation tests 156
157 Sub AStream_NewData (Buffer() As Byte)
158 'Fonctionnement de la voiture pilotée par Bluetooth
159 ' How the car is operated by Bluetooth
160 If Buffer.Length = 2 Then
161 X= Buffer(0)
162 Log("X: ",X)
163 Delay(10)
164 Y=Buffer(1)
165 Log("Y: ",Y)
166
167 If Y=2 And X= 2 Then
168 'Alignement des roues avant en ligne droite
169 'Alignment of the front wheels in a straight line
170 Log("Rouler tout droit")
171 MonServo.write(90)
172
173 Else If Y=4 And X= 4 Then
174 'Rotation légère à gauche -
Slight rotation on the left
175 Log("Rotation légère à gauche")
176 MonServo.write(70)
177
178 Else If Y=5 And X= 5 Then
179 'Rotation nette à gauche - Net rotation on the left
180 Log("Rotation nette à gauche")
181 MonServo.write(35)
182
183 else if Y=6 And X=6 Then
184 'Rotation légère à droite -
Light rotation to the right
185 Log("Rotation légère à droite")
186 MonServo.Write(110)
187
188 else if Y=7 And X=7 Then
189 'Rotation nette à droite - Net rotation to the right
190 Log("Rotation nette à droite")
191 MonServo.Write(125)
192
193
194
195 Else If Y < 117 And Y > 10 Then
196 ' MARCHE AVANT - FORWARD MARCH
197 'lance la voiture en avant - launches the car forward
198 IN3.DigitalWrite(True)
199 IN4.DigitalWrite(False)
200 SpeedM = 100
201 Log("Marche avant")
202 Envoi
203
204
205 else if Y > 137 Then
206 'MARCHE ARRIÈRE - BACKWARD
207 'lance la voiture en arrière - throws
the car back
208 IN3.DigitalWrite(False)
209 IN4.DigitalWrite(True)
210 SpeedM = 90
211 Log("Marche arrière")
212 Envoi
213
214 Else
215 SpeedM=0
216 Log("arrêt de la voiture")
217 Envoi
218 End If
219 End If
220
221 If Y = 250 And X = 250 Then
222 ' MARCHE AVANT rapide de la
voiture - Fast FORWARD OF THE CAR
223 IN3.DigitalWrite(True)
224 IN4.DigitalWrite(False)
225 SpeedM = 180
226 Log("Marche avant rapide")
227 Envoi
228
19
229 else if Y=200 And X=200 Then
230 'MARCHE ARRIÈRE rapide de la voiture - Fast REVERSE of the
car
231 IN3.DigitalWrite(False)
232 IN4.DigitalWrite(True)
233 SpeedM = 110
234 Log("Marche arrière rapide")
235 Envoi
236
237 else if Y=9 And X=9 Then
238 ' GESTION des FEUX, LEDS, DIODES et lumières diverses si
connectés broche 13
239 ' MANAGEMENT of LIGHTS, LEDS, DIODES and various
lights if connected pin 13
240 If FEUX=False Then
241 Lights.DigitalWrite(True)
242 FEUX = True
243 Log("Allumage des LEDs")
244 'Allumage des LEDS si elles existent et ont été connectées
sur la broche 13
245 'Ignition of LEDs if they exist and have been
connected on pin 13
246 Else
247 Lights.DigitalWrite(False)
248 FEUX = False
249 Log("Extinction des LEDs")
250 'Extinction des LEDS si elles existent et ont été
connectées sur la broche 13
251 'Turning off LEDs if they exist and have been
connected on pin 13
252 End If
253
254 else if Y = 3 And X = 3 Then ' GESTION du «Klaxon» ou
buzzer si connecté à la broche 3
255 'MANAGEMENT of the "Horn" or buzzer or
similar device if connected to pin 3
256 If SON = False Then
257 Klaxon.DigitalWrite(True)
258 SON = True
259 Log("Déclenchement du Klaxon")
260 Else
261 Klaxon.DigitalWrite(False)
262 SON = False
263 Log("Arrêt du Klaxon")
264 End If
265
266 else if Y=8 And X = 8 Then
267 GrandHuit
268 End If
269 End Sub
270
271 Sub
GrandHuit
272 ' La voiture va effectuer seule les manoeuvres
sur un circuit de plusieurs mètres
273 ' de préférence à l'extérieur
274 'The car will make the trips alone on a circuit of
several meters preferably outside
275 MonServo.Write(90)
276 IN3.DigitalWrite(True)
277 IN4.DigitalWrite(False)
278 SpeedM = 140
279 Envoi 'Démarrage - Startup
280 Delay(3000)
281 MonServo.Write(30)
282 Delay(3000)
283 MonServo.Write(90)
284 Delay(4000)
285 MonServo.Write(125)
20
286 Delay(3000)
287 MonServo.Write(90)
288 Delay(4000)
289 SpeedM = 0
290 Envoi 'Fin du circuit - End of the circuit
291 End Sub
292
293 Private Sub Envoi 'Gestion vitesse
de la voiture - Car speed management
294 ENB.analogWrite(SpeedM)
295 Log("Vitesse de la voiture:",SpeedM)
296 End Sub
Fin du
programme B4R
Lien de téléchargement >>>
Téléchargement du programme Arduino n°1 B4R
Maintenant que nous disposons du programme
qui va contrôler la voiture Arduino et que celle-ci est construite
et équipée de tous les éléments nécessaires à son bon fonctionnement, il est
déjà possible de vérifier si tout fonctionne bien en effectuant les opérations
suivantes :
- Téléverser le programme B4R dans la
carte MEGA2560 à l’aide d’un câble USB approprié ;
- Mettre sous tension la voiture en
utilisant le petit interrupteur arrière ;
- Presser sur le petit bouton de tests
situé sur la mini-plaque de connexions :
Si tout est bien en place, la voiture
va effectuer la série de tests prévus par l’algorithme du programme des ligne
82 à 155:
- Vous devriez assister successivement
à 3 appels de phares (LEDs avant, Diodes rouges arrière)
accompagnés par 3 sons de Klaxon (Buzzer)
- Puis les roues avant vont se
braquer
à droite puis à gauche, puis les roues seront ramenées en ligne droite
- ATTENTION ! la voiture va rouler
en avant pendant 3 secondes puis reculer également pendant 3 secondes.
- Les tests se termineront
par 3 nouveaux appels de phares + 3 coups de Klaxon.
Ainsi, sans même attendre la mise au point de l’application B4A pour Smartphone Android qui va nous permettre prochainement de piloter à distance cette voiture grâce au système Bluetooth, il est possible de faire bouger la voiture et de vérifier qu’elle est prête pour continuer les travaux.
La partie "Programme
Arduino B4R" est terminée. Nous allons pouvoir passer à l'étape suivante: Mise au point de l'application Android B4A
qui va nous permettre de piloter la voiture à distance.
Continuer >>> Application Android B4A permettant de piloter à distance les voitures Arduino