Celles et ceux qui ont fait (ou vu) des projets de robotique (Lego ou autres) ont sûrement remarqué que les défis sont souvent des labyrinthes où le robot doit se déplacer en évitant des obstacles.
Dans le présent projet, nous construisons un tel robot à peu de frais (moins de 25$, donc l’élève pourrait même garder son robot).
Attention! Le but ici n’est pas de faire de la compétition de robotique comme on voit avec les robots Lego (NXT, EV3). Mais bien d’apprendre comment ça se passe au niveau des circuits. Il sera relativement difficile de programmer notre robot pour qu’il circule dans un labyrinthe. Par contre, l’élève pourra «voir» au coeur du robot, ce qui est riche en apprentissages.
Note aux débutants : La présente documentation a pour but d’inspirer, non pas d’être copiée-collée sans comprendre le programme et les circuits. Car le copier-coller en Arduino ne fonctionne pas nécessairement.
Les pièces
Pour réaliser notre robot de base, nous aurons besoin des pièces suivantes (les liens sont à titre d’exemple, d’autres fournisseurs peuvent avoir de meilleurs prix).
- Carte Arduino UNO (il y a des cartes à moins de 6$ avec fil USB)
- H-bridge (le modèle L298N fait l’affaire)
- Support à piles (les piles 3,7 V sont adéquates pour la plupart des projets Arduino. Voir cet article pour l’alimentation d’une carte Arduino)
- Moteurs et roues (on a ici à faire 2 petites soudures sur les moteurs)
- Capteurs (peut être ce qu’on veut, ex.: ultrason, intensité lumineuse, etc).
- Fils (Fils Dupont sont très utiles dans des projets Arduino)
- Blindage + platine d’expérimentation (optionnel mais utile pour les connexions multiples sans soudures)
Le châssis
Attention! Afin d’éviter des bris (suite à la manipulation fréquente des pièces) voir ces conseils.
Avec un peu d’imagination, on peut utiliser plusieurs types de châssis. De l’impression 3D (si vous avez accès à une imprimante 3D, la conception par ordinateur du châssis est une tâche intéressante en science et technologie) à l’utilisation de gouttières en PVC, plusieurs matériaux pourront servir à assembler votre robot.
Voici des exemples de châssis qui ont chacun leurs forces et faiblesses.
Une descente de gouttière divisée en deux (devrait être renforcée, car un peu trop souple).
Une descente de gouttière complète.
Un bouchon de 4″.
Un bouchon de 4″ avec les moteurs à l’extérieur (Jean-François Garneau).
Une morceau de plancher flottant (Jean François Garneau).
Châssis imprimé avec une imprimante 3D (Jean-François Garneau).
Attention! Les connexions électriques (image ci-dessous) sur les moteurs sont fragiles. Pour éviter des problèmes, un renforcement (avec colle chaude ou autres moyens) est nécessaire avant de débuter ses manipulations/expérimentations.
De plus, pour que le robot se déplace en ligne droite, des ajustements seront nécessaires (roues parallèles, le frottement, etc.).
Montage
Le montage pour les moteurs nécessite le pont en H et une alimentation.
Voici la description des connexions dans le schéma ci-dessous (vous aurez à ajuster les sorties selon votre montage).
Carte Arduino | Pont en H |
GND | GND |
Sortie 3 ~ | ENB (optionnel) |
Sortie 4 | IND |
Sortie 5 | INC |
Sortie 6 | INB |
Sortie 7 | INA |
Sortie 9 ~ | ENA (optionnel) |
Le pont en H utilisé ici peut contrôler la vitesse de rotation des moteurs à l’aide des broches ENA et ENB (optionnel dans le tableau ci-haut). Pour débuter, nous vous suggérons de ne pas les utiliser (avoir toujours le maximum de courant dans les moteurs), ceci simplifie un peu le projet.
À noter également la mise à la terre à connecter sur la carte Arduino (protection du circuit).
La programmation
Inspiration :
- http://www.apprendre-en-ligne.net/info/robotique/DdR.pdf
- http://www.wikidebrouillard.org/index.php/Arduino_:_Le_cahier_de_programmation
C’est ici que ça devient intéressant pour la résolution de problème. Car on doit faire des tests pour trouver la bonne orientation des moteurs selon le ce qu’on envoie comme signal dans les sorties 4,5,6 et 7 (les «IN» sur le pont en H).
Voici un exemple pour faire tourner les roues. Le tout est d’observer dans quel sens les roues tournent avec cette programmation et d’ajuster au besoin.
void setup() { pinMode(5, OUTPUT); pinMode(6, OUTPUT); pinMode(7, OUTPUT); pinMode(8, OUTPUT); } void loop() { //moteur A digitalWrite(7, HIGH);//INA digitalWrite(6, LOW);//INB //Moteur B digitalWrite(5, HIGH);//INC digitalWrite(4, LOW);//IND }
Un peu de théorie, capteur de distance
Un des capteurs intéressants pour ce type de bolide est le capteur de distance. Voir cet article pour les détails de son utilisation.
Bolide et distance
Nous voici prêts pour programmer un robot qui avance tant qu’il y a au moins 25 cm d’espace devant lui. Voici une vidéo présentant le résultat.
Le programme en Blockly@rduino est ici (version xml compressée pouvant être importée).
Le programme en mode texte :
int lecture_echo; int cm; //On peut créer des fonctions comme ci-dessous de façon à simplifier la programmation dans la boucle loop void Avance() { digitalWrite(7, HIGH); digitalWrite(6, LOW); digitalWrite(5, LOW); digitalWrite(4, HIGH); } void Recule() { digitalWrite(7, LOW); digitalWrite(6, HIGH); digitalWrite(5, HIGH); digitalWrite(4, LOW); } void TourneGauche() { digitalWrite(7, LOW); digitalWrite(6, HIGH); digitalWrite(5, LOW); digitalWrite(4, HIGH); } void TourneDroite() { digitalWrite(7, HIGH); digitalWrite(6, LOW); digitalWrite(5, HIGH); digitalWrite(4, LOW); } void Arrete() { digitalWrite(7, LOW); digitalWrite(6, LOW); digitalWrite(5, LOW); digitalWrite(4, LOW); } void setup() // { pinMode(11, OUTPUT); digitalWrite(11, LOW); pinMode(7, OUTPUT); pinMode(6, OUTPUT); pinMode(5, OUTPUT); pinMode(4, OUTPUT); pinMode(10, INPUT); Serial.begin(9600); } void loop() { //on lit la distance devant le robot digitalWrite(11, HIGH); delay(10); digitalWrite(11, LOW); lecture_echo = pulseIn(10,HIGH); ; cm = lecture_echo / 58; Serial.print(cm); delay(10);//on donne un peu de temps au robot pour respirer ;-) if (cm > 25) { //si chemin libre Avance(); } else { //si obstacle Arrete(); delay(1000); Recule(); delay(1000); TourneGauche(); delay(300); Arrete(); delay(1000); } }
Ping : Bolide Arduino | Arduino en classe