Objectif

Ce projet a été développé à des fins pédagogiques et pourra servir dans le domaine du développement de robots.

La robotique devient accessible et facile à piloter. Néanmoins il convient de porter une attention particulière à certains aspects techniques. Et plus particulièrement à la manipulation des servomoteurs.

Le projet utilise des composants existant sur le marché. Une fois les composants assemblés ils seront coordonnées par un programme Arduino. Ce programme sera le centre d’intérêt du projet.

Le robot est un bras articulé qui se déplace sur trois axes. Le bras sera programmé pour enregistrer ses positions. Une fois enregistrées on pourra rejouer automatiquement une séquence de positions et ainsi animer le bras.

Les positions resteront mémorisées lorsque le courant est coupé.

Le tout se pilote à l’aide d’un smartphone utilisant une app Bluetooth.

Ce projet attache une grande importance à la qualité du montage et de la programmation (du moins j’aurai essayé 😉). Il développera des points de vigilance afin de garantir un fonctionnement optimal.

Le matériel

Kit bras articulé

Le kit complet du bras articulé peut se trouver à moins de 50$. Malheureusement si les parties mécaniques sont de bonne qualité, les servomoteurs (MG996) ne le sont pas. Lors des essais deux servos ont grillés. Ils ont été remplacés par des servos DS3225MG plus chers mais robustes. Le montage du bras ne pose pas de problèmes particuliers. Ayant constaté que des vis se dévissaient sous l’effet des vibrations je conseille d’ajouter des rondelles autobloquantes.

Contrôleur PWM

Un contrôleur PWM PCA9685 permet la connexion de 16 servomoteurs. Le bras utilisera 6 servos. Il est relié à l’Arduino en I2C.

Ecran LCD

Un écran LCD peut être utilisé pour afficher la position du bras ainsi que d’autres informations utiles pour la programmation du bras (voir pour le montage d’un écran en pilotage I2C : https://www.instructables.com/ELEGOO-Kit-Lab-or-How-to-Make-My-Life-As-a-Develop/). L’utilisation de l’écran LCD est optionnelle. Les mêmes informations sont également envoyées sur la console série. Si on ne veut pas utiliser d’écran LCD une variable dans le programme permet de le dévalider sans avoir à supprimer les lignes de code le concernant.

Alimentation

L’alimentation électrique doit être performante et autoriser des pics de courant pouvant atteindre 2,5 ampères. L’affichage de la consommation de courant permet de contrôler les dérives. Par exemple en cas de blocage d’un servomoteur le courant va fortement augmenter et la tension peut diminuer sous 4V, ce qui pourra entrainer un mouvement erratique des servomoteurs. Un contrôle visuel de l’alimentation devient indispensable.

Android App

Pour piloter le bras on utilisera un smartphone ou une tablette avec l’application « Bluetooth Remote ». Cette application gratuite est simple à configurer. Elle est basée sur la création de boutons programmables. Pour chaque bouton on définit une séquence de caractères à envoyer en Bluetooth. L’Arduino équipé du module HC05 recevra les informations pour les transformer en actions.

Mémoire Eeprom

La mémoire du bras est constituée d’un module contenant une Eeprom AT24C256. Cette mémoire sert à conserver les informations après l’extinction de l’Arduino. Ces informations sont disponibles après redémarrage de l’Arduino. On peut mémoriser des positions du bras et les jouer en séquences afin de créer un effet de mouvements. Ce module est connecté à l’Arduino en I2C.

Schéma du montage

 

Le circuit électronique est simple à réaliser.

Programme : Les déclarations et définitions

Le programme se compose de trois fichiers : un programme principal et deux fichiers contenant des fonctions. L’utilisation de fonctions évite la répétition de code et facilite la lisibilité du programme. Divers fichiers sont disponibles au téléchargement ici et en particulier des informations sur le contrôleur PWM. Déclaration de l’afficheur LCD.

Si l’afficheur n’est pas utilisé on pourra laisser la déclaration (éventuellement ajouter la bibliothèque à Arduino même si non utilisée par la suite). La variable « lcdpres » sera initialisée à 0.

Déclaration de la mémoire Eeprom.

L’adresse sur le bus I2C est 0x50. Le tableau « eprdata » sert de tampon pour les échanges avec la mémoire. Il comporte 6 positions/octets correspondants aux 6 servos et à une position donnée du bras. La course d’un servo allant de 0 à 180 cette information est stockée dans un octet. On utilisera ainsi 6 octets par position du bras. On appellera par la suite ces 6 valeurs une séquence et on échangera des séquences avec la mémoire.

On utilise deux pointeurs ou numéros de séquences. Un pointeur pour le numéro de la séquence actuelle et un pointeur pour le numéro de la dernière séquence enregistrée dans la mémoire Eeprom.

C’est le tableau « eptactmax » qui contient les valeurs de ces deux pointeurs.

Déclaration du Bluetooth.

Le module est câblé sur les positions 2 et 3 de l’Arduino. La variable « bluerec » contient le caractère reçu. Dans ce projet l’application Remote n’enverra qu’un caractère par action.

Déclarations pour le contrôleur de servos. C’est la partie qui mérite le plus d’attention.

L’adresse sur le bus I2C est 0x40.Dans le programme on utilisera l’angle de rotation (0 à 180) pour le positionnement des servos. La rotation sera effectuée par le contrôleur PWM qui utilise des impulsions dont la largeur (500 à 2500µs). varie en fonction de l’angle. La communication avec le contrôleur se fera par une fonction « servowrite » (sera développé plus loin) qui effectuera au préalable une conversion angle-impulsion. Les variables MAX et MIN servent à cette conversion. En fonction de modèle de servo ces valeurs peuvent changer. Dans notre cas les servos MG996 ont un angle de rotation couvrant 180°. Les servos de remplacement DS3225 ont un angle de 270°. On gardera la rotation sur 180° car une rotation sur 270° n’est mécaniquement pas possible pour ce bras.

Dans le montage certains servos ne peuvent pas tourner sur toute la plage des 180°. Ils seront bloqués mécaniquement par les supports et se mettrons à chauffer. Il convient donc de les protéger en limitant leur course. Le tableau « tabanglim » contient les valeurs limites de rotation pour chaque servo (min et max).

Le tableau « homepos » contient la position du bras à la mise sous tension. Il est recommandé avant la mise hors tension de ramener le bras dans cette position initiale. Au redémarrage le bras sera alors déjà en place. Si le bras est dans une autre position un mouvement brutal s’effectuera à la mise sous tension. Il convient d’être prudent à la mise sous tension.

Toutes ces valeurs sont à mettre à jour si vous réaliser ce projet !

Structure des informations stockées au début de la mémoire Eeprom : AMHHHHHH111111222222333333444444

Chaque caractère correspond à un octet. A est la valeur du pointeur de séquence actuel (1 à n). M est la valeur de la dernière séquence enregistrée (4 ci-dessus). 111111..444444 sont les positions des servos pour la séquence 1…4. HHHHHH est la séquence 0 et correspond à la position de départ du bras.

A la mise sous tension HHHHHH est regravé dans l’eeprom à partir du tableau « homepos » ; A et M sont lus depuis l’Eeprom et stockés dans le tableau « expactmax ».

Programme : Partie setup 

Dans cette étape les périphériques sont initialisés.

Les fonctions suivantes sont utilisées : lcdw », « readeeprom(x,y) », « writeeeprom(x,y) » et « servomove(a,b) ».

« x » représente le numéro de l’octet à lire, « y » représente le nombre d’octets à lire ou à écrire, « a » le numéro de la séquence sur l’Eeprom, « b » sera expliqué plus tard.

HHHHHH est regravé dans l’eeprom à partir du tableau « homepos » ; A et M sont lus depuis l’Eeprom et stockés dans le tableau « expactmax ». Le bras est positionné dans sa position de départ. « a » représente la séquence 0 et pointe sur HHHHHH.

Programme : Partie principale

Le programme est composé de plusieurs boucles imbriquées. La boucle principale concerne la réception d’un caractère depuis le Bluetooth. Suivant le caractère reçu on opère une action.

De « A » à « L » on va déplacer manuellement un servo avec une rotation gauche ou droite (fonction « servowrite »). On passe à la boucle « while ». Le servo tourne jusqu’à la réception du caractère « S ». « S » est envoyé lorsqu’on relâche le bouton sur le smartphone. C’est ici qu’on contrôle la course du servo afin d’éviter qu’il ne bute dans le support.

La réception des caractères « M » à « 9 » entraine des opérations particulières.
    • « M » et « N » vont agir sur le pointeur de séquence par incrément ou décrément de 1.
    • « Y » affiche l’angle des 6 servos ainsi que la valeur des deux pointeurs de séquence.
    • « Z » déplace le bras de sa position actuelle vers la position de départ.
    • « 1 » à « 4 » déplace le bras de sa position actuelle vers la position correspondant aux séquences 1 à 4.
    • « 8 » déplace le bras de sa position actuelle vers la position correspondant à la séquence séléctionnée (« M » et « N »).
    • « 7 » affiche les 100 premières valeurs de l’Eeprom sur le port série.
    • « 9 » enregistre la position actuelle du bras (séquence sélectionnée par « M » et « N »).
    • « 6 » va enchainer une succession de déplacements définis dans le tableau « prog » (fonction « scenario ») et correspond à jouer un scénario.
    • // Other variables =====================int prog[2][10] = {{2,5,6,3,7,8,4,9,11,0}, {0,1,0,0,1,0,0,1,0,0}};  // little scenario as an example Dans l’exemple ci-dessus le bras se déplacera successivement dans les positions indiquées par les séquences 2,5,6,3 etc. Remarque importante :

      Avant l’exécution de la séquence le bras va effectuer un mouvement vers le haut. Ce mouvement peut être inhibé. C’est le cas dans l’exemple pour les séquences 5,7 et9 (on utilise pour cela la deuxième partie du tableau « prog ». Les séquences 5,7 et 9 correspondent à la fermeture de la pince pour saisir un objet. Le bras doit rester en place pour ces opérations.

Programme : Partie lecture/écriture sur Eeprom de grande capacité.

  • « writeprom » transforme le numéro d’une séquence en adresse mémoire avant d’appeler « wrtiteeeprom ».
  • « writeeeprom » écrit une suites d’octets (« stotab » et « len » ) à partir d’une adresse indiquée (« data_addr »).
  • « readeeprom » lit une suites d’octets (« eprdata » et « len » ) à partir d’une adresse indiquée (« data_addr »).

Programme : Partie déplacement du bras vers une destination

La fonction « servomove » déplace le bras depuis la position actuelle vers la position indiquée dans une séquence.

Le principe du déplacement repose sur la rotation simultanée (en apparence) des servos. Il aurait été plus simple de faire tourner un servo après l’autre vers sa position de destination.  L’effet visuel n’est alors pas fluide et le mouvement saccadé.

Le programme est par conséquent un peu plus complexe. On opère par lots de servos. On fait tourner pas à pas chaque servo à tour de rôle.

Les servos sont numérotés des 0 (base) à 5 (pince). La rotation s’effectue dans l’ordre suivant :

  1. Le lot composé des servos 1,2 est déplacé vers le haut indépendamment de la séquence.
  2. Le lot composé des servos 0,3,4 est déplacé selon les valeurs de la séquence.
  3. Le lot composé des servos 1,2 est déplacé selon les valeurs de la séquence.
  4. Le lot 5 (la pince) est déplacé selon la valeur de la séquence.

Application Android

Pour piloter le bras on utilisera un smartphone ou une tablette avec l’application « Bluetooth Remote ». Cette application gratuite est simple à configurer. Elle est basée sur la création de boutons programmables. Pour chaque bouton on définit une séquence de caractères à envoyer en Bluetooth. L’Arduino équipé du module HC05 recevra les informations pour les transformer en actions.

Les modifications du panneau se font en entrant le mode mise à jour (1). Chaque bouton pourra être modifié en taille, position et orientation (2). En cliquant sur un bouton on pourra mettre à jour les données du bouton (3) ou ajouter un nouveau bouton (4).

Remarque :

Les deux rangées de boutons de gauche utilisent la valeur “S” dans la zone “On Press Up”. Lorsque le bouton est relâcher “S” est envoyé à l’Arduino  (utilisé dans les CASE “A” à ” L”  du programme). 

Conclusion

Parmi les fichiers à télécharger se trouve une version utilisant le pilotage des servos par la carte Arduino directement (Utilisation des ports 4 à 9). On peut alors se passer du contrôleur PCA9685. Le montage est plus complexe car le câblage est plus important.

Ce projet a été développé à des fins pédagogiques et pourra servir de base de développement de robots.

Vous pouvez maintenant donner libre cours à votre imagination pour le maquettage de vos robots. Enjoy it !

7 Responses

  1. admin
    | Répondre

    Bonjour, mettre avant le “case ‘ A'” une impression sur le moniteur série Serial.println(bluerec); Ainsi on peut vérifier ce qui arrive vraiment dans le programme en provenance du smartphone. Si vous voulez on pourra communiquer par une adresse mail et échanger des fichiers et en particulier un programme de test du bluetooth.==> (dan10@mail.info-suivi.top)

  2. admin
    | Répondre

    Bonjour, dans la fonction setup() mettre en commentaire les lignes entre « EEPROM init » et « End EEprom init ». Dans la partie loop() ne se servir que des cases A à L. Cela devrait fonctionner.

    • Michel WINKEL
      | Répondre

      Merci pour la réponse, je vais essayer ça prochainement

    • Michel WINKEL
      | Répondre

      Bonjour, sans EEPROM AT24C256, j’ai mis en commentaires les lignes entre “EEPROM Init” et “End EEPROM init” et le téléversement s’effectue bien sans erreur.
      Je ne possède pour l’instant qu’un seul servo MG995 et je souhaiterais (avant d’acheter 5 servo complémentaires) tester le codage et le câblage qu’avec ce seul servo et ça ne marche pas.
      J’utilise les éléments suivants : Arduino Uno, PCA9685, Bluetooth HC05 et MG995. J’ai branché le servo sur la connection “0” du PCA9685.
      Configuration Bluetooth Remote, bouton 1-L : PUSH, On Press Down “A”, On Press Up “S”, bouton 1-R : PUSH, On Press Down “B”, On Press Up “S”.
      La connexion avec HC05 se fait bien (clignotements espacés de la LED), mais le servo ne bouge pas lorsque j’actionne les boutons 1-L et 1-R.
      Pourriez-vous m’aider à résoudre mon problèmé ? Merci d’avance.

  3. Michel WINKEL
    | Répondre

    Bonjour,
    Je souhaiterais dans un premier temps réaliser un bras articulé sans Eeprom AT24C256. Est-il possible d’utiliser votre codage tel quel, sinon quelles modifs faut-il éffectées ?

  4. Ibrahem
    | Répondre

    Hi sir daniel i don’t understand how to program the bluetooth remote can you help me

    • admin
      | Répondre

      To control the arm you use a smartphone or tablet with the “Bluetooth Remote” application.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *