Que vaut un Arduino Chinois à 1,78 € ?

Pour le savoir, j'ai passé le cap. Et je me suis offert ce joujou. Commandé le 30 Mars 2016. Recu le 20 Avril. Assez fair pour des frais d'envoi offerts.

Le web regorge de site et de blog qui expliquent comment mettre en oeuvre ces petits machins. Certains disent que le driver CH340 est en natif sur Ubuntu. D'autres qu'il faut faire quelques manips.

Nous verrons.

En tous les cas : voici la bête quand je l'ai trouvée sur la toile…

Et voici comment elle est arrivée à la maison, une fois que les services de l'adoption, puis ceux de l'immigration avait validé son dossier. :-)

Première connection

OK. Je me lance à l'eau. D'après ce que j'ai lu à droite à gauche. Le driver du convertisseur CH340 (USB ⇔ Serie) semble installé en natif.

Comme il faut bien se lancer, je branche ma carte. Une diode rouge s'allume (POW, certainement pour Power), une deuxième clignote (L, certainement pour Light).

Avant d'envisager d'aller plus loin, il me faut un terminal “Port Serie” du type Hyperterm & co si j'étais sous windows.

Sous Ubuntu, Minicom semble faire l'affaire.

Je l'installe via la logitheque. Pas de surprise, ca marche.

Puis, je fais quelques recherches pour avoir comment le lancer (par exemple : https://doc.ubuntu-fr.org/minicom).

La commande dmesg était pré-installée. J'ai donc pu lancer :

dmesg | grep tty

Ca m'a permis d'identifier que le port d'intérêt est ttyUSB0.

Sans savoir si j'en avais vraiment besoin, j'ai (du) par contre installer setserial, via la commande :

sudo apt-get install setserial

Ensuite minicom semble fonctionner lorsque l'on tape :

minicom -D /dev/ttyUSB0

Allez, on va maintenant passer aux choses sérieuses. Je jete un oeil sur mon site référent : http://www.instructables.com/id/Arduino-Nano-CH340/ pour tout ce qui va avoir trait au “Arduino Nano CH340”…

L'objectif étant bien entendu de valider la communication avec la carte en identifiant, puis en lançant la commande permettant de connaître le n° de version du firmware pré-installé.

Sous Minicom, taper :

… AHHH… pour l'instant j'ai du mal à trouver.

Une autre approche - Installer l'IDE Arduino

Bon. Si je ne trouve pas comment communiquer simplement via le port serie pour l'instant, utilisons alors les grands moyens : Installons l'IDE d'Arduino sur le PC.

Ici le site Arduino

Puis choisir la version Arduino-1.6.8-linux32.tar.xz (car le PC que j'utilise est celui de Victoire P. au Sunlab, et qu'il tourne sous Ubuntu et en version 32bits.

J'extrais le dossier sur le bureau (d'abord le .tar.XZ en .tar, puis en “Arduino-1.6.8”.

Ouvrir un terminal, puis taper :

cd Bureau/arduino-1.6.8\\
source install.sh

C'est bon. Ca s'installe du premier coup. Que du bonheur.

Je lance IDE, puis je sélectionne le port comm concerné (il détecte à nouveau que ttyUSB0 est “actif”).

Puis j'ouvre le Moniteur Serie.

Ah… nouvelle erreur :

“Erreur durant l'ouverture du port série “Dev/ttyUSB0'. Consulter la documentation : http://playground.arduino.cc/Linux/All#Permission”.

Typique d'un problème de privilège d'accès.

D'ailleurs, le conseil d'Arduino est de regarder les propriétés associées au fichier /dev/ttyUSB0, via la commande

ls -l /dev/ttypUSB0

Et effectivement, les propriétés sont :

   crw-rw----- 1 root dialout 188, 0 avril 23 18:28 /dev/ttyUSB0
   

Pour connaitre mon username je tape:

ls -l /home

et j'obtiens

   drwxr-xr-x 28 victoire victoire 4096 avril 23 18:30 victoire
   

Je tape alors usermod -a G group-name username où dans mon cas, group-name = dialout et username = victoire - c'est marqué au dessus…

sudo usermod -a -G dialout victoire

Puis il faut rebooter pour que la modification prenne effet.

Après le reboot - Le Moniteur Serie d'Arduino IDE

Bon. C'est bon. Après le reboot, la fenetre de dialogue s'instaure.

Simplement, je ne suis pas plus avancé.

Il me faut : - la vitesse de transmission etc…

Mais aussi cette fameuse commande “Firmware version”…

OK. C'est bon pour ce soir. La suite demain.

Bon. On reprend à l'étape précédente

Alors, avant de penser qu'il y a peut-être moyen de voir si le RS232 réagit à quelques commandes clefs. Reprenons le dossier une étape ou deux préalables. En effet. Maintenant que l'IDE arduino est installée. Pourquoi ne pas essayer de téléverser un petit programme type blink.ino et voir si la procédure se passe bien.

Pour rappel, l'exemple Blink se trouve dans le menu “Fichier / Exemple / 01 - Basic”.

A toute fin utile, voici le code associé :

// the setup function runs once when you press reset or power the board
void setup() {
  // initialize digital pin 13 as an output.
  pinMode(13, OUTPUT);
}

// the loop function runs over and over again forever
void loop() {
  digitalWrite(13, HIGH);   // turn the LED on (HIGH is the voltage level)
  delay(50);              // wait for a second
  digitalWrite(13, LOW);    // turn the LED off by making the voltage LOW
  delay(50);              // wait for a second
}

Bien entendu, dans l'exemple original delay avait été mis à delay(1000), c'est à dire 1 seconde.

Néanmoins, après avoir réalisé “Vérifier/compiler” puis “Téléverser” sans avoir obtenu de message d'erreur apparent, le clignotement de la led L à une telle fréquence ressemble assez proche à ce qu'elle faisait au moment du premier branchement.

Avec un clignotement à 50 ms. Le doute n'est plus permis et ca marche donc très bien.

Avant de lancer d'autres tests plus complexes, je note les paramètres que j'ai intuitivement sélectionné dans IDE arduino, à savoir :

  • Type de carte : Arduino nano
  • Processeur : ATMega328
  • Port : /dev/ttyUSB0

Essai d'activation de la liaison Série

Bon. On reprend donc le train vers la maîtrise de la liaison RS232. En particulier, nous allons essayer la fonction serial.write, en combinant le clignotage de la led L avec l'envoi d'une trame “Hello” sur le port série. 1000 millisecondes de delay nous semblera déjà un bon rythme. Car le but, c'est de capter le signal sur MiniCom, pas encore d'en faire une véritable application.

void setup() {
  // initialize digital pin 13 as an output.
  Serial.begin(9600);
  pinMode(13, OUTPUT);
}

// the loop function runs over and over again forever
void loop() {
  digitalWrite(13, HIGH);   // turn the LED on (HIGH is the voltage level)
  delay(1000);              // wait for a second
  digitalWrite(13, LOW);    // turn the LED off by making the voltage LOW
  delay(1000);              // wait for a second
  Serial.write(45);
}

Verification/Compil + Téléversement.

On observe bien sur le moniteur Série d'IDE Arduino une série de signe ”-“ qui s'inscrivent toutes les deux secondes.

Idem si on lance sur un terminal minicom, avec la commande:

sudo minicom -D /dev/ttyUSB0 -b 9600

Validation de la fonction "Convertisseur Analogique/Digitale

Pas très compliquée… Et ca marche effectivement. Lecture sur Pin 3 ⇒ lecture entre 0 et 1023 selon la résistance que l'on place entre 0V - 3,3 V et la pin en question.

Après le reboot - Le Moniteur Serie d'Arduino IDE

Bon. C'est bon. Après le reboot, la fenetre de dialogue s'instaure.

Simplement, je ne suis pas plus avancé.

Il me faut : - la vitesse de transmission etc…

Mais aussi cette fameuse commande “Firmware version”…

OK. C'est bon pour ce soir. La suite demain.

Bon. On reprend à l'étape précédente

Alors, avant de penser qu'il y a peut-être moyen de voir si le RS232 réagit à quelques commandes clefs. Reprenons le dossier une étape ou deux préalables. En effet. Maintenant que l'IDE arduino est installée. Pourquoi ne pas essayer de téléverser un petit programme type blink.ino et voir si la procédure se passe bien.

Pour rappel, l'exemple Blink se trouve dans le menu “Fichier / Exemple / 01 - Basic”.

A toute fin utile, voici le code associé :

// the setup function runs once when you press reset or power the board
void setup() {
  // initialize digital pin 13 as an output.
  pinMode(13, OUTPUT);
}

// the loop function runs over and over again forever
void loop() {
  digitalWrite(13, HIGH);   // turn the LED on (HIGH is the voltage level)
  delay(50);              // wait for a second
  digitalWrite(13, LOW);    // turn the LED off by making the voltage LOW
  delay(50);              // wait for a second
}

Bien entendu, dans l'exemple original delay avait été mis à delay(1000), c'est à dire 1 seconde.

Néanmoins, après avoir réalisé “Vérifier/compiler” puis “Téléverser” sans avoir obtenu de message d'erreur apparent, le clignotement de la led L à une telle fréquence ressemble assez proche à ce qu'elle faisait au moment du premier branchement.

Avec un clignotement à 50 ms. Le doute n'est plus permis et ca marche donc très bien.

Avant de lancer d'autres tests plus complexes, je note les paramètres que j'ai intuitivement sélectionné dans IDE arduino, à savoir :

  • Type de carte : Arduino nano
  • Processeur : ATMega328
  • Port : /dev/ttyUSB0

Essai d'activation de la liaison Série

Bon. On reprend donc le train vers la maîtrise de la liaison RS232. En particulier, nous allons essayer la fonction serial.write, en combinant le clignotage de la led L avec l'envoi d'une trame “Hello” sur le port série. 1000 millisecondes de delay nous semblera déjà un bon rythme. Car le but, c'est de capter le signal sur MiniCom, pas encore d'en faire une véritable application.

void setup() {
  // initialize digital pin 13 as an output.
  Serial.begin(9600);
  pinMode(13, OUTPUT);
}

// the loop function runs over and over again forever
void loop() {
  digitalWrite(13, HIGH);   // turn the LED on (HIGH is the voltage level)
  delay(1000);              // wait for a second
  digitalWrite(13, LOW);    // turn the LED off by making the voltage LOW
  delay(1000);              // wait for a second
  Serial.write(45);
}

Verification/Compil Téléversement.

On observe bien sur le moniteur Série d'IDE Arduino une série de signe ”-“ qui s'inscrivent toutes les deux secondes.

Idem si on lance sur un terminal minicom, avec la commande:

sudo minicom -D /dev/ttyUSB0 -b 9600

Validation de la fonction "Convertisseur Analogique/Digitale

Pas très compliquée… Et ca marche effectivement. Lecture sur Pin 3 ⇒ lecture entre 0 et 1023 selon la résistance que l'on place entre 0V - 3,3 V et la pin en question.

Session du 27 Avril 2016

On complexifie un peu le projet. Introduction de boucles conditionnelles. La fréquence de clignotement varie en fonction de la valeur de la résistance variable :

int analogPin = 3;
int val = 0;

// the setup function runs once when you press reset or power the board
void setup() {
  // initialize digital pin 13 as an output.
  pinMode(13, OUTPUT);
  Serial.begin(9600);

}

// the loop function runs over and over again forever
void loop() {
  //digitalWrite(13, HIGH);   // turn the LED on (HIGH is the voltage level)
  //delay(100);              // wait for a second
  //digitalWrite(13, LOW);    // turn the LED off by making the voltage LOW
  //delay(100);              // wait for a second
  val = analogRead(analogPin);
  Serial.println(val);
  if (val<100)
    {
      digitalWrite(13, HIGH);
      delay(50);
      digitalWrite(13,LOW);
      delay(60);
    }
    else if(val>=100 and val<700)
    {
      digitalWrite(13, HIGH);
      delay(200);
      digitalWrite(13,LOW);
      delay(200);
    }
    else
    {
      digitalWrite(13,HIGH);
    }
  Serial.write(10);
}

Session du 24 Aout 2016

Test avec Niki. Connection d'un moteur DC à un relais, lui même relié à la sortie D13 d'une carte Nano, activable par une touche du clavier du pc.

/*
  Blink
  Turns on an LED on for one second, then off for one second, repeatedly.

  Most Arduinos have an on-board LED you can control. On the Uno and
  Leonardo, it is attached to digital pin 13. If you're unsure what
  pin the on-board LED is connected to on your Arduino model, check
  the documentation at http://www.arduino.cc

  This example code is in the public domain.

  modified 8 May 2014
  by Scott Fitzgerald
 */

int monChar = 0;
  
void setup() {

  // initialize digital pin 13 as an output.
  Serial.begin(9600);
  pinMode(13, OUTPUT);
}

// the loop function runs over and over again forever
void loop() {
//  digitalWrite(13, HIGH);   // turn the LED on (HIGH is the voltage level)
//  delay(1000);              // wait for a second
//  digitalWrite(13, LOW);    // turn the LED off by making the voltage LOW
//  delay(100);              // wait for a second
 // Serial.write(45);
  
        // send data only when you receive data:
 
if (Serial.available() > 0) {
                // read the incoming byte:
                monChar = Serial.read();

                // say what you got:
                Serial.print("I received: ");
                Serial.println(monChar, DEC);
if (monChar == 114) {        
  digitalWrite(13, HIGH);   // turn the LED on (HIGH is the voltage level)
}
if (monChar == 115) {        
  digitalWrite(13, LOW);   // turn the LED on (HIGH is the voltage level)
}
  //Serial.print('2');
  //Serial.write(65);
  //Serial.print(" - ceci est un mot");
  //Serial.println(" - et voici la difference");
  
}
}