Arduino codes

_images/logo.JPG
Auteur

J.Soranzo et Gilles

Societe

VoRoBoTics 2

Entity

VoLAB 2

Dépôts Bitbucket

Source de la doc, code ARDUINO, serveur et la doc en html 1

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”

_images/rep_mot.jpg
  • 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

_images/600px-BRE_fusionCapture_v1CompleteGarde.jpg

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

_images/sensRotPlfBrasJojo.svg
  • 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

_images/sensRotationPoignetBrasJojo.svg

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

_images/servo25kgBanggood.JPG

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.

puce BC417 puce datasheet

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.