Préparation d'un atelier de robotique

Du 30 Septembre au 2 Octobre 2016 aura lieu le Week-End du numérique à la Médiathèque de Viroflay.

Le SUNLAB organisera a cette occasion un atelier de robotique.

La présente page décrit la préparation de l'atelier en question, qui consistera a concevoir une petite voiture télécommandée à partir d'un navigateur Web, donc accessible par PC ou par Smartphone.

Le présent projet s'appuie sur le projet "Lolin Card / Nodemcu" décrit sur le dokuwiki du Hatlab ; ainsi que les autres projets de voitures télécommandées (adresse ici).

Description succincte de l'architecture

Le déroulé de l'atelier est décrit dans le document joint : presentationpetitevoiturediorren.pdf

L'architecture de la petite voiture y est décrite.

Choix des composants

Le projet consistera dans une petite voiture à télécommander par smartphone ou par un navigateur web tournant sur PC.

De base, il s'agira de s'appuyer sur un chassis en bois qui sera découpé en utilisant la découpeuse laser du SQYLAB (Gare de la Verrière).

Le coeur intelligent du système sera la NodeMCU - lolin V3 - ESP8266 décrite sur le dokuwiki (lolinCard). 2,60 sur Aliexpress.

s.aliexpress.com/vArYraaY

Un relai 3V trouvé sur Aliexpress et déjà utilisé pour le projet “Ouverture de porte”. (45 cts x 2 pièces). s.aliexpress.com/uM3ieArM

(attention: le relai proposé ici est en 5V et la carte délivre du 3V… point à valider avant de démarrer).

Des moteurs avec réducteur et roue intégrés (2,69 € * 2 pièces). AliExpress.cf http://s.aliexpress.com/YJ36buUZ|http://s.aliexpress.com/YJ36buUZ

Et un “caster-ball”, dit aussi “bouboule” pour servir de roue avant. 0,68 €. lien : http://s.aliexpress.com/6ZrIJvm2

Composition du kit

Après moultes réflexions et essais, la composition du kit est la suivante:

Pinout de la carte Nodemcu

A fin d'information, il est rappelé le pinout la carte ModeMcu :

Nous utiliserons ici les pins :

.ledPin1 = 2; ⇒ Ledbleue - D4

.ledPin2 = 13; ⇒ GPIO7 - D7

.ledPin3 = 5; ⇒ D1

.ledPin4 = 4; ⇒ D2

De l'intérêt de basculer sur un pont en H

Ronan m'a convaincu d'oublier les relais 3V pour basculer sur un dispositif de pont en H. En particulier, le SN75441one coute le même prix que 2 relais 3V ; permet d'alimenter la carte NoceMCU en 5V (sur la pin VIN) ; et dispose de 4 pont en H, donc alimenterait les moteurs gauche et droite en avant et en arrière.

Une présentation du fonctionnement d'un pont en H et de son utilisation pour alimenter un moteur est présenté par exemple ici :

http://www.planete-sciences.org/iledefrance/images/psidf/pdf/Fiche_F3_Controler_des_moteurs_diriger_un_robot.pdf

Pour ce qui concernera le cablage du L293D, j'ai trouvé sur la toile une illustration qui me semble assez facile à comprendre :

Autre site d'intérêt

Alain propose d'aller jeter un œil sur : http://www.instructables.com/id/Smartphone-Controlled-Arduino-Rover/

Il y aura peut-être des idées supplémentaires à recueillir.

Carte driver L293D intégrée

3 Juillet 2016 - Pour rebondir sur une discussion précédente (sur les drivers L293D qui seraient plus appropriés que les relais pour développer ce projet de petite voiture pilotée par smartphone), j'ai trouvé une petite carte compatible NodeMCU à 1,69€ chez Aliexpress (http://s.aliexpress.com/Nn6NnQBZ ce qui éviterait d'avoir à faire de la soudure ou une carte électronique dédiée.

Certes, c'est un peu plus cher que le driver seul (22 cents sur http://s.aliexpress.com/FFjqUra6), mais on évitera d'avoir à tâtonner.

Malheureusement, la carte que j'ai reçue n'a pas le bon footprint. Les deux cartes (nodemcu V3 et shield L293D ne s'emboitent pas entre elle). Exit donc cette prise pour le moment.

Code FINAL

#include <ESP8266WiFi.h>

const char* ssid = "freebox_Sunlab";
const char* password = "IciChangerLePassword"; //put it here in clear

int ledPin1 = 2; // Ledbleue - D4 
int ledPin2 = 13; // GPIO7 - D7
int ledPin3 = 5; // D1
int ledPin4 = 4; // D2

WiFiServer server(80);

void setup() {
  Serial.begin(9600);
  delay(10);

  pinMode(ledPin1, OUTPUT);
  pinMode(ledPin2, OUTPUT);
  pinMode(ledPin3, OUTPUT);
  pinMode(ledPin4, OUTPUT);

  digitalWrite(ledPin1, LOW);
  digitalWrite(ledPin2, LOW);
  digitalWrite(ledPin3, LOW);
  digitalWrite(ledPin4, LOW);

  // Connect to WiFi network
  Serial.println();
  Serial.println();
  Serial.print("Connecting to ");
  Serial.println(ssid);

  WiFi.begin(ssid, password);

  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.println("WiFi connected");

  // Start the server
  server.begin();
  Serial.println("Server started");

  // Print the IP address
  Serial.print("Use this URL to connect: ");
  Serial.print("http://");
  Serial.print(WiFi.localIP());
  Serial.println("/");

}

void loop() {
  // Check if a client has connected
  WiFiClient client = server.available();
  if (!client) {
    return;
  }

  // Wait until the client sends some data
  Serial.println("new client");
  while(!client.available()){
    delay(1);
  }

  // Read the first line of the request
  String request = client.readStringUntil('\r');
  Serial.println(request);
  client.flush();

  // Match the request

  int value = LOW;
  if (request.indexOf("/MOTOR=STOP") != -1)  {
    digitalWrite(ledPin1, LOW);
    digitalWrite(ledPin2, LOW);
  }
  if (request.indexOf("/MOTOR=AVANCE") != -1)  {
    digitalWrite(ledPin1, LOW);
    digitalWrite(ledPin2, HIGH);
    digitalWrite(ledPin3, LOW);
    digitalWrite(ledPin4, HIGH);
  }
  if (request.indexOf("/MOTOR=RECULE") != -1)  {
    digitalWrite(ledPin1, HIGH);
    digitalWrite(ledPin2, LOW);
    digitalWrite(ledPin3, HIGH);
    digitalWrite(ledPin4, LOW);
  }
  if (request.indexOf("/MOTOR=GAUCHE") != -1)  {
    digitalWrite(ledPin1, LOW);
    digitalWrite(ledPin2, HIGH);
    digitalWrite(ledPin3, LOW);
    digitalWrite(ledPin4, LOW);
  }
  if (request.indexOf("/MOTOR=DROITE") != -1)  {
    digitalWrite(ledPin1, LOW);
    digitalWrite(ledPin2, LOW);
    digitalWrite(ledPin3, LOW);
    digitalWrite(ledPin4, HIGH);
  }

// Set ledPin according to the request
//digitalWrite(ledPin, value);

  // Return the response
  client.println("HTTP/1.1 200 OK");
  client.println("Content-Type: text/html");
  client.println(""); //  do not forget this one
  client.println("<!DOCTYPE HTML>");
  client.println("<html>");

  client.println("<BR><BR><BR>");
  client.println("<a href=\"/MOTOR=AVANCE\"\"><button>-------------AVANCE-------------</button></a><br />");
  client.println("<BR>");
  client.println("<a href=\"/MOTOR=GAUCHE\"\"><button>GAUCHE</button></a>-----");
  client.println("<a href=\"/MOTOR=DROITE\"\"><button>DROITE</button></a><br />");
  client.println("<BR>");
  client.println("<a href=\"/MOTOR=STOP\"\"><button>--------------STOP-----------------</button></a><br />");
  client.println("<a href=\"/MOTOR=RECULE\"\"><button>--------------RECULE-----------------</button></a><br />");

  client.println("</html>");

  delay(1);
  Serial.println("Client disonnected");
  Serial.println("");
}

Troubleshooting / Problèmes

J'ai essayé de télécharger http://www.arduined.eu/files/CH341SER.zip et de l'installer.

Ca marche. Mais il faut ajouter une pile aux bornes VIN et G de la carte, car la liaison série est sinon instable.

Le port USB n'est pas visible

Vérifier si la carte est bien connecté au PC. Que le cable est de bonne qualité et que la carte est alimentée par une pile (ex 9V entre ses pin VIN et G. En effet, le mode wifi de la carte consomme relativement beaucoup et les port USB de certains PC peinent à alimenter la carte correctement, amenant des instabilités. Pour voir si le port USB est visible, vous pouvez aller soit dans l'interface IDE Arduino (et vérifier la sélection du port), soit sous XTERM (en commande linux taper :

ls -al /dev/ttyUSB*

Le port USB est visible

Si la commande précédente répond correctement et qu'un port USB semble visible, il est vraisemblable que les privilèges d'accès à la carte soit limités. En effet, sous ubuntu, nous avons la chance de disposer du driver du convertisseur (USB ⇒ Serial) qui est présent sur la carte (le CH340G), mais par contre, l'accès en lecture et en écriture est limité à root. C'est un peu ballot. Aussi, pour modifier cela, il faut taper :

sudo chmod 666 /dev/ttyUSB0

Nota: il faudra faire cela à chaque fois que l'on débranchera et rebranchera la carte…

Nota2 : si quelqu'un s'y connait bien en linux et pourrait me dire comment changer la configuration du port de manière définitive, je suis preneur !!!

Le driver pour le convertisseur CH430G n'est pas installé en natif sur Mac. Il faut l'installer. Certains membres ont utilisé le .zip qui se trouve page : http://kig.re/2014/12/31/how-to-use-arduino-nano-mini-pro-with-CH340G-on-mac-osx-yosemite.html et ca semble avoir marché sans problème. Le port USB apparait alors avec un nom du type /dev/tty.wchusbserial sous linux et juste wchusbserial sous l'IDE Arduino.