Bonjour à tous !
Je suis débutant dans le monde de l’Arduino et de la programmation. J’ai comme objectif de réaliser un bras robotisé constitué de trois servo pour mettre en place ou retirer un couvercle de télescope afin d’automatiser les prises de vues nocturne.
A l’aide de mBlock et divers morceaux de programme glanés sur le net, j’ai réussi à écrire une petite application fonctionnelle pour l’arduino qui me permet de piloter la fonction d’ouverture et fermeture en local à l’aide de deux boutons poussoir ou par l’intermédiaire de commandes envoyées sur le port série via la prise usb.
Voici le programme Arduino:
Code arduino : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151 #include <Arduino.h> #include <Servo.h> Servo ServoCapot; Servo ServoRotation; Servo ServoTranslation; const int boutonfermeture2 = 2; const int boutonouverture3 = 3; String commande; int AngleServoCapot; int AngleServoRotation; int AngleServoTranslation; int reception; void setup() { Serial.begin(115200); Serial.flush(); ServoCapot.attach(10, 500, 2475); // init pin ServoRotation.attach(9, 500, 2475); // init pin ServoTranslation.attach(8, 500, 2475); // init pin pinMode(boutonfermeture2,INPUT); pinMode(boutonouverture3,INPUT); ServoCapot.write(0); // write to servo ServoRotation.write(137); // write to servo ServoTranslation.write(47); // write to servo AngleServoCapot = 0; AngleServoRotation = 137; AngleServoTranslation = 47; } void loop() { // put your main code here, to run repeatedly: while (Serial.available() > 0) { reception = Serial.read(); commande += char(reception); delay(5); } if (commande != "") { traitementserial(); // Appel de la fonction } if(digitalRead(2) == HIGH) { fermeture(); // Appel de la fonction } if(digitalRead(3) == HIGH) { ouverture(); // Appel de la fonction } } // Fonctions void ouverture() // Fonction de traitement de l'ouverture { while(!(((AngleServoTranslation)==(137)))) { _loop(); ServoTranslation.write((AngleServoTranslation) + (1)); // write to servo AngleServoTranslation += 1; _delay(0.02); } _delay(1); while(!(((AngleServoCapot)==(180)))) { _loop(); ServoCapot.write((AngleServoCapot) + (1)); // write to servo AngleServoCapot += 1; _delay(0.02); } _delay(1); while(!(((AngleServoRotation)==(47)))) { _loop(); ServoRotation.write((AngleServoRotation) - (1)); // write to servo AngleServoRotation += -1; _delay(0.02); } } void fermeture() // Fonction de traitement de la fermeture { while(!(((AngleServoRotation)==(137)))) { _loop(); ServoRotation.write((AngleServoRotation) + (1)); // write to servo AngleServoRotation += 1; _delay(0.02); } _delay(1); while(!(((AngleServoCapot)==(0)))) { _loop(); ServoCapot.write((AngleServoCapot) - (1)); // write to servo AngleServoCapot += -1; _delay(0.02); } _delay(1); while(!(((AngleServoTranslation)==(47)))) { _loop(); ServoTranslation.write((AngleServoTranslation) - (1)); // write to servo AngleServoTranslation += -1; _delay(0.02); } } void traitementserial() // Fonction de traitement de la commande { if (commande == "ouverture") { ouverture(); } else if (commande == "fermeture") { fermeture(); } else { Serial.print("Commande '" + commande + "' inconnue : ");// Traitement de la commande inconnue. } if ((AngleServoTranslation)==(47)) { Serial.println("Capot fermé"); } if ((AngleServoTranslation)==(137)) { Serial.println("Capot ouvert"); } commande = ""; } void _delay(float seconds){ long endTime = millis() + seconds * 1000; while(millis() < endTime)_loop(); } void _loop(){ }
J’ai ensuite adapté un petit programme python que j’ai trouvé sur le très intéressant tutoriel « Piloter Arduino depuis un PC avec Python et Boa Constructor » à l’adresse suivante :
https://herve-troadec.developpez.com...-boa/#LVII-B-5
Ce programme me permet d’envoyer les commandes nécessaires à l’Arduino pour ouvrir et fermer le couvercle.
Voici le programme python:
Code Python version 1 : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35 #!/usr/bin/python # coding: utf8 import serial import time print("Initialisation du port") portCom = serial.Serial() portCom.port = "/dev/cu.usbserial-1420" portCom.baudrate = 115200 print("Ouverture du port...") try: portCom.open() except serial.SerialException: print("Un problème s'est produit à l'ouverture du port.\n" "Vérifiez que le port utilisé par la carte Arduino est\n" "bien '/dev/cu.usbserial-1420'. Si ce n'est pas le cas, modifiez\n" "le script Python en conséquence.") saisie = "" while saisie != "q": saisie = str(raw_input("Entrer 'q' pour quitter: ")) while portCom.is_open: commande = str(raw_input("Saisir une commande ('q' pour quitter): ")) if commande != "q": portCom.write(commande) time.sleep(10) nbCar = portCom.in_waiting retour = portCom.read(nbCar) print(retour) portCom.reset_input_buffer() else: portCom.close()
Mais mes connaissances en programmation ne me permettent pas de modifier ce programme comme j’aimerais qu’il soit.
En fait, j’aimerais le simplifier au maximum. L’idée est de garder la possibilité de le quitter si il rencontre des difficultés à se connecter au port série de l’arduino mais j’aimerais ne pas avoir à écrire la commande d’ouverture ou de fermeture. Je voudrais avoir deux scripts, un pour l’ouverture et un autre pour la fermeture. Ces scripts envoient juste la commande à l’arduino, vérifient que la commande a bien été envoyée et si oui, il quitte ou si non, un message « erreur » s’écrit.
J’ai essayé ceci mais cela ne marche pas bien. Le programme s’arrête comme si la condition « if retour == "Capot ouvert »: » ne fonctionnait pas
Voici le programme python modifié:
Code python version 2 : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38 #!/usr/bin/python # coding: utf8 import serial import time print("Initialisation du port") portCom = serial.Serial() portCom.port = "/dev/cu.usbserial-1420" portCom.baudrate = 115200 commande = "ouverture" print("Ouverture du port...") try: portCom.open() except serial.SerialException: print("Un problème s'est produit à l'ouverture du port.\n" "Vérifiez que le port utilisé par la carte Arduino est\n" "bien '/dev/cu.usbserial-1420'. Si ce n'est pas le cas, modifiez\n" "le script Python en conséquence.") saisie = "" while saisie != "q": saisie = str(raw_input("Entrer 'q' pour quitter: ")) while portCom.is_open: portCom.write(commande) time.sleep(10) nbCar = portCom.in_waiting retour = portCom.read(nbCar) if retour == "Capot ouvert": print(retour) portCom.reset_input_buffer() portCom.close() else: print("erreur") portCom.close()
Si certains d’entre vous peuvent m’aiguiller, ce serait super cool !
L’idée, au finale, est de faire deux scripts exécutables à l’aide de py2app.
Merci par avance…
Partager