Arduino codes¶
- Auteur
J.Soranzo et Gilles
- Societe
- Entity
- Dépôts Bitbucket
- Création
05/2023
Presentation¶
Bras Manipulateur Original - version Gilles
Voir wiki Vorobotics Bras manipulateur 3
Transmission sur lien série MySerial (Serial soft) pin 8 en tx et 9 en Rx
Les commandes sont des octets (4 octets par moteur):
0 et 10 démarre et arrête la rotation poignet sans horaire
1 et 11 pignet antihoraire
2 et 20 ouverture pince
3 et 30 fermeture pince
4 et 40 articulation poignet sans anti-horaire
5 et 50 articulation poignet sans horaire
6 et 60 coude ah
7 et 70 coude h
8 et 80 epaule ah
9 et 90 épaule h
12 et 120 plateforme ah
13 et 130 plateforme h
Plus les 4 commandes spéciales 100 init et 200 rangement et 201 enregistrer la position et 202 lancement (des positions enregistrées)
Warning
La logique des commandes horaires vs antihoraires change à partir de 4
jaune rx verte tx sur ftdi
Warning
Eccueil
Nous avons débouché sur une infaisabilité
L’appli web (PHPoc) parle en angles moteur, l’appli bras robot Gilles parle en switch je tourne/j’arrête
Idée : reprendre le code Arduino de l’appli Web (PHPOc) et l’adapter à notre commande moteur. Conséquence : l’appli ap Inventor ne sera pas compatible… Autre possibilité d’adaptation rendre le code Arduino de Gilles compatible d’un pilotage avec des angles.
Adaptation du code Arduino¶
Notre décision : on repart du code Arduino Gilles (bras_manip_rot_control_bluetooth.ino) et on essaie de le rendre compatible de la version web PHPoc.
Répertoire de travail¶
0021_brasRobot_webGUI\projet\_02-realisation\bras2023arduinocodes\bras_manip_rot_control_bluetooth
Etape 1 : regroupement des fonctions du mode APP-INVENTOR¶
A la demande de Gilles, on souhaite séparer les fichiers cpp en web d’une part et app inventor d’autre part
Dépendances¶
Utilisation de la bibliothèque SoftwareSerial version 1.0
Utilisation de la bibliothèque Wire version
Utilisation de la bibliothèque Adafruit_PWM_Servo_Driver_Library version 2.4.1
Test du mode APP_INVENTOR¶
Balancement effectué avec le code modifié. Bon fonctionnement.
Etape 2 : mode WEB¶
Passage en mode WEB, rappel nous avons ajouté @ en début de trame web voir dans serveur
La fonction appInventorInterface retourne WEB quand elle reçoit un 64d (code ASCII de @)
Difficulté avec le module BT et mon Windows¶
Envoie des commande AT:
+VERSION:2.0-20100601
+NAME:HC-05
+UART:9600,0,0
+ROLE:0
+PSWD:1234
Changement de nom: AT+NAME=Bras2023_HC05
+NAME:Bras2023_HC05
+CMOD:1
+BIND:98d3:31:300e42
+ADDR:98d3:32:31115a
A la mise sous tension la broche KEY ou EN doit être connectée au 3.3V (la LED clignote alors lentement 2s)
Travaux en mode liaison série¶
Conception¶
Connexion du module FTDI232 à la carte ARDUINO en 8,9. Comment on test ?
on est en 9600, côté ARDUINO on a : SoftwareSerial mySerial(8,9);
RX,TX obsolète avec la 2560
on utilise Serial1 pour la connexion au serveur en attendant de passer sur du BT
Avec le FTDI faut-il croiser ? Croisé confirmé
Test : comment savoir que le code est passé en mode WEB ? Le firmware affiche “passage en mode webconfirmé” mais seulement sur la liaison debug
(Vert en 9 et jeune en 8 + gnd)
Intégration du code phpoc_man ARDUINO dans le code de Gilles. Création du fichier fonctionsRobotWeb.cpp On a copié la boucle loop de phpoc_man vers la fonction void moveMotorAngleWeb().
Analyse de la séquence de calcul de la variable stepNum : recherche du plus petits parmi les 6 déplacements des moteurs. Puis déplacement à proprement parlé.
Question : faut-il faire une boucle à l’intérieur de notre fonction ou s’appuyer sur la loop extérieure ?
On décide de couper la fonction en 2 (decode et move) et d’appeler les 2 nouvelles fonctions depuis la loop principale pour reproduire le plus possible le fonctionnement initial.
Nouvel écueil, nous utilisons un carte PWM ADAFRUIT, phpoc_man la lib servo.h donc adaptation…
Nous avons écrit une fonction de déplacement : int rotationServo(int numServ, int angleDepart, int angleArrive) qui déplace les moteurs de la position de départ vers la position d’arrivée dans un boucle for cadencée à 15ms moteur par moteur ce qui dans le cas de l’interface téléphone ne pose pas de souci car on travail avec un seul moteur à la fois.
phpoc_man déplace les 6 moteurs d’une petite quantité toutes les 20ms.
Pour s’adapter au principe de cinématique inverse et du déplacement des 6 moteurs simultanément, nous avons ré-écrit la fonction de déplacement d’un moteur en version carte ADAFRUIT
Mise au point¶
14/10/23 : lenteur transfert trames constaté entre serveur et ARDUINO. La liaison est en softSerial à 9600 soit environ 26ms par trame.
On a pas retrouvé le comportement aléatoire du 30/09.
Décision 1 : on essaie UNO à 1152200 => comportement aléatoire du 30/09 => passage 2560
plus de comportement aléatoire à 115200 par contre latence
Nouvelle architecture du code ARDUINO partie servomoteurs¶
A partir de la réception de la trame.
stepNum = decodeTrameWeb(msg);
Tableaux dest_angles, cur_angless
puis moveMotorWeb( stepNum );
LED alarm appInventor¶
Suite à nos essais de Janvier 2024, nous avons câbler une LED en 38,40 qui devrait s’allumer si le mode aapInventor reçoit une commande invalide notamment des trames web alors qu’on est en mode appInventor, ce qui se produit quand on reset la carte ARDUINO alors qu’on est en mode WEB.
Sauf que à l’étape 2 ci-dessus, nous avions prévu de faire précéder chaque trame serveur d’un @. D’après github, jamais implémenté en PYTHON, seulement en javascript et supprimé le 17/06/2023.
Décision : on remet l’@ au début de chaque trame WEB
Mode debug¶
Afin de faire les calage des valeurs des servo, nous nous sommes aperçus que nous avions besoin de commander finement le bras indépendamment de l’interface web.
Nous avons ajouté le mode debug qu’on peut activer en envoyant * sur la liaison serveur.
Ajout des fichier SerialCommand.h et .cpp
Vitesse de debug descendue à 9600 !
Commandes:
<h> display this list in alphabetic order
<A> Passage en mode AppInventor
<D> Passage en mode debug
<E> display code status
<F> Find I2C device I2C scan
<M m a> Move motor m at angle a
<W> passage en mode WEB
Un scan I2C donne 0x40 (carte ADAFRUIT adresse I2C par défaut), pas dans le code ARDUINO car adresse par défaut.
Définition des différentes valeurs des servomoteurs du bras “Gilles”¶
servo1 : Plateforme
valeur Initiale : 60
Valeur Maxi : 150
valeur Mini : 10
sens : 1
valeur de rangement : 130
servo2 : Epaule
valeur Initiale : 40
Valeur Maxi : 110
valeur Mini : 20
sens : 1
valeur de rangement : 80
servo3 : Coude
valeur Initiale : 70
Valeur Maxi : 150
valeur Mini : 10
sens : 1
valeur de rangement : 30
servo4 : Poignet
valeur Initiale : 30
Valeur Maxi : 150
valeur Mini : 10
sens : 1
valeur de rangement : 140
servo5 : Rotation poignet
valeur Initiale : 150
Valeur Maxi : 150
valeur Mini : 50
sens : 1
valeur de rangement : 70
servo6 : Pince
valeur Initiale : 70 (pince ouverte)
Valeur Maxi : 150 (pince fermée)
valeur Mini : 70
sens : 1
valeur de rangement : 70
Définition des différentes valeurs des servomoteurs du bras malette 60kG¶
Sens des servo : référence la tête de M2 servo 60kg
servo1 : Plateforme
valeur Initiale : 90
Valeur Maxi : 180
valeur Mini : 0
Sens : vu de dessus positif sens inverse des aiguille d’une montre.
valeur de rangement : 90
servo2 : Epaule
valeur Initiale : 80
Valeur Maxi : 180
valeur Mini : 0
sens : positif sens des aiguille d’une montre
valeur de rangement : 60
servo3 : Coude
valeur Initiale : 90
Valeur Maxi : 180
valeur Mini : 0
sens : positif sens des inverse aiguille d’une montre
valeur de rangement : 0
servo4 : Poignet
valeur Initiale : 85
Valeur Maxi : 180
valeur Mini : 0
sens : positif sens des inverse aiguille d’une montre
valeur de rangement : 0
servo5 : Rotation poignet
valeur Initiale : 0
Valeur Maxi : 180
valeur Mini : 0
sens (ref identique à M1 bras tendu verticalement) vu de dessus positif sens inverse des aiguille d’une montre (comme M1).
valeur de rangement : 0
PS: regarder dans le html zone C (+45 passé à +125 mais le sens de rotation est inversé !)
servo6 : Pince
pince ouverte : 10
pince fermée (à vide) légère pression: 95 (600mA)
pince fermée sens pression 80
sens : inversé par rapport à l’interface web
valeur de rangement : 10
Note
à 110° on a 2.6A
Mise au point web vs physique¶
La trame reçue en position de repos depuis l’interface WEB:
@90,90,180,180,90,17
Nous on a:
90,80,90,85,0,10
Passage à la classe Joint¶
Evaluation de l’impact¶
Fonction initialisation() propre au mode AppInventor
Warning
Quid du passage du mode AppInventor au mode WEB
(les varaibles du mode web ne sont alors pas initialisées avec la position courante des moteurs)
L’impact se limite au fichier fonctionsRobotWeb.cpp
Transformer 7 tableaux en 1 tableau de 7 instances de la classe Joint:
dest_angles[]
cur_angles[]
direction[]
angle_offset[]
angle_max[]
angle_min[]
angleSteps[]
Mise au point¶
Stepnum¶
Valeurs initiales <T 0 0 0 0 0 0>:
current : 90, dest : 0
current : 80, dest : 0
current : 90, dest : 0
current : 85, dest : 0
current : 0, dest : 0
current : 10, dest : 0
Mise au point stepNum trame pour avoir stepnum à 0 : <T -90 80 -90 -85 0 10> versus valeur initiales faux et archi faux
(direction négative pour tous sauf épaule et pince)
Déplacement plateforme 10° <T -80 80 -90 -85 0 10> faux et archi faux
Trame déplace plateforme et épaule de 10° : <T -80 70 -90 -85 0 10> faux et archi faux
Les valeurs de la trames ne sont que positive.
Warning
On doit travailler en delta
Pour un moteur positif on ajoute un delta positif Pour un moteur négatif on retranche un delta positif
Déplacement plateforme 30° <T 120 80 90 85 0 10>
Mise au point stepNum trame pour avoir stepnum à 0 : <T 90 80 90 85 0 10>
<T 91 80 90 85 0 10>
Servo vitesse¶
Un exemple from Banggood: DSSERVO DS3225 25KG 180 degrés Engrenage en métal à couple élevé et étanche Servo numérique pour avions RC, robots et voitures - 1 pc 4
Vitesse de fonctionnement (5.0V): 0.15 sec/60 degrés
sous 4.8VV 0.18s/60° soit pour 180° : 540ms 3ms/°
Retour des Travaux BT¶
09/03/24, grosse difficultés pour faire fonctionner le BT.
Utilisation du code bras2023arduinocodes\bt2560
le module s’identifie bien dans Windows avec bras2023_HC05 après quelques réponses aux commande AT plus moyen…
on essaie un autre module (sans bouton poussoir) s’identifie comme HC05
Commande AT complément : confirmation la broche wakeup au 3.3V arduino permanent (pas besoin de faire d’impulsion) - les commandes AT répondent en 38400, pas besoin de mettre les commandes en majuscule et bine nous avons trouvé un module qui ne réagit pas aux commandes en minuscule.
BC352
commande en majuscule et
accepte AT+ NAME
Le module répond OK à chaque commande (supprimés de la sortie ci-dessous):
Bonjour mode echo 2560 BT sur serial 1 2560
+NAME:HC-05
+VERSION:2.0-20100601
+UART:9600,0,0
+PSWD:1234
5 port com au niveau du pc 4,6 7,8,9 le bon est 9 (vitesse 9600 des 2 côtés)
16/03 : le module répond aux commandes AT en 9600 aujourd’hui et on est sur COM4 côté BT.
En commande AT on clignote vite,
CONCLUSION¶
Même si la LED BT clignote rapidement, il n’est pas nécessaire de refaire l’appairage.
Il n’est pas nécessaire de se désappairer d’un appareil pour s’appairer avec un autre.
Quand tout va bien, appairé et connecté, la led émet 2 clignotements bref toutes les 2s environs.