// =================================== move robot to position
void servomove(int li,int sk){ // move the robot in the target position.
// Setting of the function ====================
// li : number of stored sequence of robot (example: sequence = 3 will point to address li*6+2 of eeprom)
// sk : if sk = 0 the arm rise before the programmed move
// End setting of the function ================
delay(200); // to be sure last move finished
int bb = 75,cc = 110;
int ind0=1, ind1=1, ind2, ind3, ind4, ind5 ;
if (sk == 1) {ind1 = 0; ind2 = 0;}
while (ind1+ind2 >0)
{
if (tabserpos[1] != bb) { ind1 = 1;
if (tabserpos[1] < bb) { tabserpos[1] = tabserpos[1]+1; } if (tabserpos[1] > bb) { tabserpos[1] = tabserpos[1]-1; } servowrite(1, tabserpos[1]); }
else { ind1 = 0 ;}
if (tabserpos[2] != cc) { ind2 = 1;
if (tabserpos[2] < cc) { tabserpos[2] = tabserpos[2]+1; } if (tabserpos[2] > cc) { tabserpos[2] = tabserpos[2]-1; } servowrite(2, tabserpos[2]); }
else { ind2 = 0 ;}
} // end while (ind1+ind2 >0)

if (li > epractmax[1]) { li = epractmax[1] ; }
readeeprom((li*6 + 2),6) ; // in return the eprdata table contains the target positions of the servos
ind0 = 1;
while (ind0+ind3+ind4+ind5 >0)
{
if (tabserpos[0] != eprdata[0]) { ind0 = 1;
if (tabserpos[0] < eprdata[0]) { tabserpos[0] = tabserpos[0]+1; } if (tabserpos[0] > eprdata[0]) { tabserpos[0] = tabserpos[0]-1; } servowrite(0, tabserpos[0]) ; }
else { ind0 = 0 ;}
if (tabserpos[3] != eprdata[3]) { ind3 = 1;
if (tabserpos[3] > eprdata[3]) { tabserpos[3] = tabserpos[3]-1; } if (tabserpos[3] < eprdata[3]) { tabserpos[3] = tabserpos[3]+1; } servowrite(3, tabserpos[3]) ; }
else { ind3 = 0 ;}
if (tabserpos[4] != eprdata[4]) { ind4 = 1;
if (tabserpos[4] < eprdata[4]) { tabserpos[4] = tabserpos[4]+1; } if (tabserpos[4] > eprdata[4]) { tabserpos[4] = tabserpos[4]-1; } servowrite(4, tabserpos[4]) ; }
else { ind4 = 0 ;}
}
ind1 = 1;
while (ind1+ind2 >0)
{
if (tabserpos[1] != eprdata[1]) { ind1 = 1;
if (tabserpos[1] < eprdata[1]) { tabserpos[1] = tabserpos[1]+1; } if (tabserpos[1] > eprdata[1]) { tabserpos[1] = tabserpos[1]-1; } servowrite(1, tabserpos[1]) ; }
else { ind1 = 0 ;}
if (tabserpos[2] != eprdata[2]) { ind2 = 1;
if (tabserpos[2] < eprdata[2]) { tabserpos[2] = tabserpos[2]+1; } if (tabserpos[2] > eprdata[2]) { tabserpos[2] = tabserpos[2]-1; } servowrite(2, tabserpos[2]) ; }
else { ind2 = 0 ;}
}
ind5 = 1;
while (ind5 >0)
{
if (tabserpos[5] != eprdata[5]) { ind5 = 1;
if (tabserpos[5] < eprdata[5]) { tabserpos[5] = tabserpos[5]+1; } if (tabserpos[5] > eprdata[5]) { tabserpos[5] = tabserpos[5]-1; } servowrite(5, tabserpos[5]) ; }
else { ind5 = 0 ;}
}
listpos();
}
// ==================================
void servowrite(int sernum, int angl) // move servo to new position
{
int imp = map(angl, MIN_ANG[sernum], MAX_ANG[sernum], MIN_IMP[sernum], MAX_IMP[sernum]); // convert angle to impulse
pca.writeMicroseconds(sernum,imp);
delay(servodelay);
tabserpos[sernum] = angl;
}

Automatisation d’un bras articulé

 

tags : robot, arduino, bluetooth, eeprom, PWM, servo, PCA9685, AT24C256, I2C, remote control

 

Objectifs du projet

 

Ce projet a été développé à des fins pédagogiques et pourra servir dans le domaine de 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

 

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 et plus robuste. 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.

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

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.

 

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.

 

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.

 

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 - The Circuit:

 

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 du programme

 

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.

 

Modal Header Content

Automatisation d’un bras articulé

 

tags : robot, arduino, bluetooth, eeprom, PWM, servo, PCA9685, AT24C256, I2C, remote control

 

Objectifs du projet

 

Ce projet a été développé à des fins pédagogiques et pourra servir dans le domaine de 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

 

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 et plus robuste. 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.

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

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.

 

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.

 

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.

 

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 - The Circuit:

 

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 du programme

 

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.