Main Bionique

Introduction

Ce tutoriel a été réalisé dans le cadre du projet "Parle à ma main" financé par la Fondation de France (Bourse Déclic Jeune). Ce tutoriel est la continuité du tutoriel Premiers Pas Arduino et de Contrôler ses propres LEDs .

Il s'agit de fabriquer une "prothèse bionique" au collège. Ce tutoriel est une sous-partie du projet: faire une main en carton contrôlée par Arduino et un servomoteur.

Vous avez besoin:

  • de carton, si possible souple type boite de céréales
  • de fil souple, fin et solide type fil de pêche ou ficelle à rôti
  • de ciseaux
  • d'un stylo
  • de colle (colle forte, colle chaude ou super glue)
  • de 5 pailles

Si vous souhaitez animer la main avec un servomoteur, vous aurez besoin:

  • d'une carte Arduino avec son branchement USB et de Arduino installé sur votre ordinateur
  • de trois fils électriques dénudé aux extrémités (dans le texte: un rouge, un noir et un jaune)
  • d'un servomoteur fonctionnant sur 5V


Faire la main en carton

Dessiner votre main sur du carton, ou une main "extraterrestre". La main finale fonctionne mieux avec du carton souple (type boite de céréales) et si les doigts sont parallèles.

Découper votre main en carton.

Plier les doigts de la main en carton au niveau des phalanges et de la paume de la main.

Coller des bouts de pailles, plus petits que les phalanges pour permettre à la main de se plier, sur chaque phalanges.

Si vous avez le temps de laisser sécher, il est possible d'utiliser de la colle forte en tube. Si vous n'avez pas le temps, optez plutôt de la super glue en couche fine, ou pour de la colle chaude.

Le résultat:

Passer du fil de pêche

Le fil va servir à imiter le travail des muscles "tirant" sur le phalanges.

Faites un trou avec la pointe d'une paire de ciseaux au bout de chaque doigt.

Passer un fil au bout de chaque doigt et faites un nœud. Vous pouvez renforcer cette partie avec un point de colle.


Tirer les fils de chaque doigt au travers des pailles du doigt auxquels ils sont rattachés.


Tenez les cinq fils ensemble au niveau de la paume et faites un nœud.

Pour faciliter cette étape, vous pouvez tenir les fils ensemble, faire un point de colle. Une fois sec, faites le nœud au niveau du point de colle.


Si vous tirez sur le noeud, la main se ferme.

Votre main est prête à être connectée à un servomoteur !


Contrôle du servomoteur avec Arduino

Brancher le servomoteur

Alimentation électrique:

• Fil rouge sur une broche 5V de votre carte Arduino, et sur le fil rouge du servomoteur

• Fil noir sur une broche GND de votre carte Arduino, et sur le fil marron de votre servomoteur

Contrôle de l’angle:

• Fil jaune sur la broche 9 de votre carte Arduino, et sur le fil jaune de servo moteur

La carte Arduino sur le PC via USB

Le programme

Un premier programme Arduino pour mettre le servomoteur à une position précise

Pour vous familiariser avec le contrôle d'un servomoteur, voici un premier code qui met le servomoteur à un angle précis (donné dans la variable "position" dans le code).

Un servomoteur est un moteur qui se met dans une position donnée, on dit qu'il est "asservi".

Voici le détail du code complet affiche à droite. Si vous ne savez pas comment le charger sur votre carte Arduino, je vous conseille de voir le tutoriel Premiers pas avec Arduino.

Ligne 1: #include <Servo.h>

Cette instruction sert à indiquer à la carte Arduino que l'on fait appelle à des commandes spécifiques liées au contrôle du servomoteur. On demande donc d'inclure ces elements.


Ligne 2: Servo monServomoteur;

On crée un objet de type Servo que l'on appelle "monServomoteur" pour contrôler le servomoteur (pour que l'ordinateur comprennent qu'il y a un servomoteur et que "monServomoteur" est de ce type).


Ligne 3: int position = 0;

On choisit la position du servomoteur au démarrage ici. Dans ce cas, le servomoteur se met en butée à l'angle 0, avec 90 il se mettra au milieu, et avec 180 il se mettra en butée à 180 dégrée. "Position" est une variable de type int (c'est à dire un nombre entier), et vous pouvez mettre une valeur entre 0 et 180 degrés pour que votre servomoteur prenne cette position plus tard.


Ligne 4: void setup() {

Ouverture de la fonction d'initialisation. Plus d'informations dans le tutoriel l Premiers pas avec Arduino.


Ligne 5: monServomoteur.attach(9);

On indique à la carte Arduino que la broche pour le contrôle de l'angle du servomoteur est branchée à la broche (ou PIN) numéro 9. C'est ce que vous deviez avoir fait avec le fil jaune dans la partie précédente.


Ligne 6: }

Fermeture de la fonction d'initialisation.

Ligne 7: void loop() {

Ouverture de la fonction qui tourne en boucle lorsque la carte est branchée. Plus d'informations dans le tutoriel l Premiers pas avec Arduino.


Ligne 8: monServomoteur.write(position);

On indique à la carte Arduino de demander au servomoteur "monServomoteur" de se mettre dans l'angle indiqué dans la variable "position".


Ligne 9: }

Ouverture de la fonction qui tourne en boucle lorsque la carte est branchée et fin fu programme.


Note: les noms en italique dans le texte ne peuvent pas être modifiés, car ils sont propres à Arduino. Les mots entre guillemets dans le texte peuvent être renommes comme vous le souhaitez, mais ils doivent être modifier partout où ils apparaissent pour être cohérent.

Code:

#include <Servo.h>

Servo monServomoteur;

int position = 0;

void setup() {

monServomoteur.attach(9);

}

void loop() {

monServomoteur.write(position);

}

Mettre le programme sur la carte Arduino

Pour mettre le programme sur votre carte et voir votre programme à l’œuvre:

  • Brancher votre Arduino à l'ordinateur avec le câble USB (bleu) prévu à cet effet
  • Sélectionner dans le logiciel Arduino (l'IDE) le bon Port COM
  • Entrer, compiler et téléverser le programme décrit précédemment sur votre carte Arduino avec le servomoteur branché

Plus de détails dans le tutoriel l Premiers pas avec Arduino.

Observer

Lorsque votre carte Arduino est débranchée de l'ordinateur, vous pouvez faire tourner à la main le servomoteur entre 0 et 180 dégrées.

  • si "position" est à 0 ou 180, mettez votre servomoteur au milieu avant de brancher la carte Arduino sur l'ordinateur
  • si position est déjà une autre valeur, mettez le servomoteur en butée avant de brancher la carte Arduino sur l'ordinateur

Maintenant, lorsque vous branchez votre carte Arduino avec le servomoteur branché et le programme téléversé dessus, vous devez voir le servomoteur bouger à la bonne position. Vous ne pouvez plus faire tourner à la main le servomoteur.

Nous allons faire bouger le servomoteur dans la suite du tutoriel.

Exercice: Comment modifier le code si on a branché un servomoteur sur la broche 10?

Il suffit de remplacer le "9" par un "10":


#include <Servo.h>

Servo monServomoteur;

int position = 0;

void setup() {

monServomoteur.attach(10);

}

void loop() {

monServomoteur.write(position);

}

Note: Il faut toujours brancher le contrôle de l'angle du servomoteur sur une broche Arduino avec un tilde "~ ", comme la ~ 3, ~ 5, ~ 6, ~ 9, ~ 10, ou ~ 11.

Exercice: Comment modifier le code pour brancher deux servomoteur à deux angles différents, un sur la broche 9 et un sur la 10?

Il suffit de rajouter un objet type Servo avec un nom différent du premier, attachée sur la broche 10. On ajoute egalement un deuxieme int avec un nom different de "position".

Dans la solution suivante, le deuxième Servo s'appelle "monServomoteurBis", et le deuxième entier int s'appelle "positionBis" avec une valeur de 34 dégrés.

#include <Servo.h>

Servo monServomoteur;

Servo monServomoteurBis;

int position = 0;

int positionBis = 34;

void setup() {

monServomoteur.attach(9);

monServomoteurBis.attach(10);

}

void loop() {

monServomoteur.write(position);

monServomoteurBis.write(positionBis);

}


Un programme Arduino pour que le servomoteur fasse des allers-retours

La seule partie qui change est dans la fonction loop.

Ligne 1: for (int position = 0; position <= 180; position++) {

Ouverture d'une boucle for. Tout ce qui est dans cette boucle se répété tant que les condition sont respectées (les lignes 2 et 3 se répètent).

  • int position = 0 : cela indique que l'on crée un entier (un int) qui s'appelle "position" et qui commence avec une valeur de 0
  • position <= 180: cela indique que la condition de fin de cette boucle for va être lorsque position, au début égal à 0, va dépasser la valeur de 180
  • position++: cela indique qu'a chaque tour, position va valoir une unité de plus.

On aura donc:

    • tour 1: position=0. La boucle for commence.
    • tour 2: position=1
    • tour 3: position=2
    • ...
    • tour 56: position=55
    • ...
    • tour 180: position=179
    • tour 181: position=180
    • tour 182: position=181. La boucle for s’arrête, car on a rempli la condition


Ligne 2: monServomoteur.write(position);

On indique à la carte Arduino de demander au servomoteur "monServomoteur" de se mettre dans l'angle indiqué dans la variable "position".

On aura donc:

    • tour 1: le servomoteur se met à 0° . La boucle for commence.
    • tour 2: le servomoteur se met à 1°
    • tour 3: le servomoteur se met à 2°
    • ...
    • tour 56: position=le servomoteur se met à 55°
    • ...
    • tour 180: position= le servomoteur se met à 179°
    • tour 181: position=le servomoteur se met à 180°
    • La boucle for s’arrête, car on a rempli la condition

Ligne 3: delay(15);

Le programme s’arrête pour 15 millisecondes, avant de continuer:

  • On aura donc:
    • tour 1: on attend 15 ms.
    • tour 2: on attend 15 ms.
    • tour 3: on attend 15 ms.
    • ...
    • tour 56: on attend 15 ms.
    • ...
    • tour 180: on attend 15 ms.
    • tour 181: on attend 15 ms.
    • La boucle for s’arrête, car on a rempli la condition


Ligne 4: }

Fin de la boucle for. L'ensemble de la boucle for se résume comme cela:

    • tour 1: position=0. La boucle for commence. Le servomoteur se met à 0°. On attend 15ms.
    • tour 2: position=1. Le servomoteur se met à 1°. On attend 15ms.
    • tour 3: position=2. Le servomoteur se met à 2°. On attend 15ms.
    • ...
    • tour 56: position=55. Le servomoteur se met à 55°. On attend 15ms.
    • ...
    • tour 180: position=179. Le servomoteur se met à 179°. On attend 15ms.
    • tour 181: position=180. Le servomoteur se met à 180°. On attend 15ms.
    • tour 182: position=181. La boucle for s’arrête, car on a rempli la condition. On passe à la suite du programme.

Ligne 5: for (int position = 180; position >= 0; position--) {

C'est comme la ligne 1, sauf que l'on va de 180 à 0 au lieu de 0 a 180 degrés.

Ouverture d'une boucle for. Tout ce qui est dans cette boucle se répété tant que les condition sont respectées (les lignes 2 et 3 se répètent).

  • int position = 180 : cela indique que l'on crée un entier (un int) qui s'appelle "position" et qui commence avec une valeur de 180
  • position >= 0: cela indique que la condition de fin de cette boucle for va être lorsque position, au début égal à 180, va passer en dessous de 0.
  • position--: cela indique qu'a chaque tour, position va valoir une unité de moins.

On aura donc:

    • tour 1: position=180. La boucle for commence.
    • tour 2: position=179
    • tour 3: position=178
    • ...
    • tour 56: position=45
    • ...
    • tour 180: position=1
    • tour 181: position=0
    • tour 182: position= -1. La boucle for s’arrête, car on a rempli la condition


Ligne 6 et 7: identiques à lignes 2 et 3

Ligne 8: }

Fin de la deuxième boucle for. Si on résume, l'ensemble de cette boucle for:

    • tour 1: position=180. La boucle for commence. Le servomoteur se met à 180°. On attend 15ms.
    • tour 2: position=179. Le servomoteur se met à 179°. On attend 15ms.
    • tour 3: position=178. Le servomoteur se met à 178°. On attend 15ms.
    • ...
    • tour 56: position=45. Le servomoteur se met à 45°. On attend 15ms.
    • ...
    • tour 180: position=1. Le servomoteur se met à 1°. On attend 15ms.
    • tour 181: position=0. Le servomoteur se met à 0°. On attend 15ms.
    • tour 182: position= -1. La boucle for s’arrête, car on a rempli la condition. On passe à la suite du programme.


On va ensuite répéter l'ensemble de ces instructions, car la fonction "loop" recommence.

Code:

#include <Servo.h>

Servo monServomoteur;

int position = 0;

void setup() {

monServomoteur.attach(9);

}

void loop() {

for (int position = 0; position <= 180; position++) {

monServomoteur.write(position);

delay(15);

}

for (int position = 180; position >= 0; position--) {

monServomoteur.write(position);

delay(15);

}

}

Mettre le programme sur la carte Arduino

Pour mettre le programme sur votre carte et voir votre programme à l’œuvre:

  • Brancher votre Arduino à l'ordinateur avec le câble USB (bleu) prévu à cet effet
  • Sélectionner dans le logiciel Arduino (l'IDE) le bon Port COM
  • Entrer, compiler et téléverser le programme décrit précédemment sur votre carte Arduino avec le servomoteur branché

Plus de détails dans le tutoriel l Premiers pas avec Arduino.

Observer

Maintenant, lorsque vous branchez votre carte Arduino avec le servomoteur branché et le programme téléversé dessus, vous devez voir le servomoteur bouger en continu de 0 à 180° puis de 180 à 0° et ainsi de suite.

Faisons maintenant bouger la main en carton.

Attacher le servomoteur à la main

Vous pouvez attacher le servomoteur au nœud grâce aux fils ! La main bouge !

bionic hand.mp4

To be continued

Vous pouvez maintenant lier votre main à n'importe quel système qui s'interface avec Arduino. Dans un prochain tutoriel, vous apprendrez à lier contrôler un servomoteur via Unity (un moteur de jeu vidéo).

Vous pouvez également contrôler chaque doigt avec un servomoteur différent.