Bolide téléguidé

Arduino permet de réaliser plusieurs types de projets, nous décrivons ici (avec l’aide de Jean-François Garneau) comment utiliser une carte dérivée d’Arduino du nom de NodeMCU pour se créer un système contrôlé par wifi.

Attention! Ce projet n'est pas à faire programmer de zéro par les élèves (à moins qu'ils soient avancés en programmation), car on doit programmer en mode Arduino (texte), non pas en blocs. On peut leur (élèves 2e cycle du secondaire) demander de jouer (copier/coller/modifier) dans le programme par contre pour l'ajuster/améliorer...

Matériel

Voici le matériel de base pour se créer un petit bolide tout simple qui est téléguidé par wifi.

  • Nodemcu à 10$
  • Fil usb mini (exemple) 1m est suffisant
  • Bloc pile pour alimenter les moteurs
  • Adapteur 9V pour alimenter la carte
  • Moteurs

Avec un peu d’imagination on peut contrôler plusieurs types de systèmes.

Montage

Voici le schéma pour connecter les moteurs et les sources de courant.

Photo d’un prototype dérivé de notre robot labyrinthe.

Avec ce châssis.

Programmation

Note : On ne peut pas programmer la carte NodeMCU avec Blockly@rduino.

La carte NodeMCU n’est pas reconnue par défaut par l’Arduino IDE. Voici comment l’ajouter.

Il faut se rendre sur ce site pour avoir la dernière version du lien à insérer dans les préférences du logiciel Arduino IDE. Ce lien ressemble à ceci (il doit toujours être présent dans les préférences pour que la carte soit accessible) :

http://arduino.esp8266.com/stable/package_esp8266com_index.json

Coller ce lien dans le menu «préférences – URL de gestionnaire de cartes supplémentaires». Enregistrer les préférences.

Par la suite, dans le menu «Outils – Type de carte – Gestionnaire de cartes», rechercher ESP8266 et installer la carte proposée. Voir l’image animée ci-dessous pour les détails.

Le programme

Note : Des librairies (voir le programme pour leurs noms) seront à ajouter à votre logiciel Arduino IDE, voir la vidéo ci-dessous pour le tutoriel.

 

Voici le programme, inspiré des liens dans le haut du script, qu’a fait Jean-François Garneau (CSDPS):

/* Inspiré de http://arduino-er.blogspot.ca/2016/05/nodemcuesp8266-implement.html
ainsi que http://arduino-er.blogspot.ca/2016/05/nodemcuesp8266-act-as-ap-access-point_3.html
*/

/* adresse à insérer dans le navigateur après être connecté au bolide
 * 192.168.4.1
 */
// include libraries, voir tutoriel https://www.youtube.com/watch?v=poAKFeqIaYI
#include <ESP8266WiFi.h>
#include <WiFiClient.h> 
#include <ESP8266WebServer.h>
//les éléments à modifier au besoin
int vitesse = 1023; // valeur entre 1 et 1023 pour la vitesse du moteur
const char *ssid = "bolide01"; //nom du réseau wifi du bolide
const char *password = "bolide01";//mot de passe pour accéder au bolide
 
// configure server
ESP8266WebServer server(80);

//Construction de la page Web. Changer le titre de la page web ci-dessous (nom du bolide), à vous de mettre ça beau!

const char *form = "<center><form action='/'>"
"<h1 style='font-size:5em'>Bolide 01</h1><br><br>"
"<br><br><br><button name='dir' style='font-size:3em;padding:1em' type='submit' value='4'>Avance</button><br><br><br>"
"<button name='dir' style='font-size:3em;padding:1em;margin-right:2em' type='submit' value='1'>Gauche</button>"
"<button name='dir' style='font-size:3em;padding:1em' type='submit' value='2'>Droite</button><br><br><br><br>"
"<button name='dir' style='font-size:3em;padding:1em' type='submit' value='3'>Recule</button><br><br><p>"
"<button name='dir' style='font-size:3em;padding:1em' type='submit' value='5'>Arret</button>"
"</form></center>";
 
void stop(void)
{
 analogWrite(5, 0);
 analogWrite(4, 0);
}
 
void forward(void)
{
 analogWrite(5, vitesse);
 analogWrite(4, vitesse);
 digitalWrite(0, HIGH);
 digitalWrite(2, HIGH);
}
 
void backward(void)
{
 analogWrite(5, vitesse);
 analogWrite(4, vitesse);
 digitalWrite(0, LOW);
 digitalWrite(2, LOW);
}
 
void left(void)
{
 analogWrite(5, vitesse);
 analogWrite(4, vitesse);
 digitalWrite(0, LOW);
 digitalWrite(2, HIGH);
}
 
void right(void)
{
 analogWrite(5, vitesse);
 analogWrite(4, vitesse);
 digitalWrite(0, HIGH);
 digitalWrite(2, LOW);
}
 
void handle_form()
{
 // only move if we submitted the form
 if (server.arg("dir"))
 {
 // get the value of request argument "dir"
 int direction = server.arg("dir").toInt();
 
 // chose direction
 switch (direction)
 {
 case 1:
 left();
 break;
 case 2:
 right();
 break;
 case 3:
 backward();
 break;
 case 4:
 forward();
 break;
 case 5:
 stop();
 break;
 }
 
 // move for 300ms, gives chip time to update wifi also
 delay(300);
 }
 
 // in all cases send the response 200ms
 server.send(1, "text/html", form);
}
 
void setup()
{
 delay(200);
 Serial.begin(9600);
 Serial.println();

 WiFi.softAP(ssid, password);

 IPAddress apip = WiFi.softAPIP();
 Serial.print("visit: \n");
 Serial.println(apip);
 
 // set up the callback for http server
 server.on("/", handle_form);
 
 // start the webserver
 server.begin();
 
 pinMode(5, OUTPUT); // 1,2EN aka D1 pwm left
 pinMode(4, OUTPUT); // 3,4EN aka D2 pwm right
 pinMode(0, OUTPUT); // 1A,2A aka D3
 pinMode(2, OUTPUT); // 3A,4A aka D4
}
 
void loop()
{
 // check for client connections
 server.handleClient();
}

 

Utilisation du robot

Le programme est téléversé dans la carte, vous pouvez donc allumer les sources de courant pour le démarrer. Le bolide devient donc une borne d’accès wifi avec le nom bolidexx et mot de passe bolidexx (à modifier pour chaque robot de votre classe). Connectez vous à votre bolide et rendez-vous à l’adresse 192.168.4.1 dans un navigateur. Une page Web avec des boutons «Avance, recule, gauche, droite, arrêt» seront présent et contrôleront votre robot.

Amusez-vous!

Plus loin?

Le programme ci-haut peut être modifié pour mieux répondre à vos besoins. Par exemple on pourrait faire avancer seulement pendant un certain temps le robot lorsqu’on clique sur le bouton «avance» pour lui faire parcourir une courte distance à chaque clic. On pourrait ajouter des DEL à notre robot et les contrôler (allumer, éteindre, clignoter…) aussi par wifi. Des capteurs pourraient être ajouter. Bien des défis pour vos classes!