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


Retour HAUT page   Retour Menu Arduino

Voir toutes mes applications