Débugger à l'aide du port série (via USB)

Introduction
Une fois votre programme téléchargé dans Arduino, le programme fonctionne en toute autonomie.
Tout le monde est content s'il fonctionne comme attendu... par contre, si ce n'est pas le cas, il faut commencer à comprendre ce qui se passe.
Il faut faire preuve d'imagination et élaborer des hypothèses... et il faut bien avouer que c'est une tâche fastidieuse car le board ne possède ni débugger, ni affichage de message de debugging!
Pourtant il y a le port série... il est donc possible d'envoyer des messages et de les recevoir sur un PC.
Il est donc possible d'envoyer des messages (message de debugging) depuis Arduino et de les lire sur le PC.

Port série Arduino et Port USB
Maintenant, la communication série avec Arduino est établie au travers d'une connexion USB.
Ainsi donc, il est possible de communiquer via le port série d'Arduino (c'est ce que le micro-contrôleur croit) mais en fait, tous les messages sont renvoyés via le périphérique USB vers le PC.
Donc, si l'on ouvre le port série d'Arduino pour envoyer des messages, ces derniers atterrirons sur le port USB raccordé au PC. Ne reste plus qu'a écouter le port USB.

Note: c'est d'ailleurs cette même connexion USB sert également a alimenté le board.


Comment afficher les messages du port série
S'il est possible d'envoyer des message depuis Arduino, il faut aussi être capable de les afficher (capturer) sur un PC.

Arduino IDE
L'environnement de développement d'Arduino dispose d'un moniteur.
Il suffit de l'activer pour afficher tous les messages passant sur le port série.
Ces messages sont visibles directement dans l'environnement Arduino.

Attention: activer le moniteur envoi un signal Reset au micro-contrôleur, ce qui a pour effet de redémarrer votre programme.

Terminal sous Linux
Sur les systèmes Linux, il est assez facile de se connecter avec un terminal sur un périphérique, même s'il s'agit d'un périphérique USB.

Lisez l'article "Utiliser un terminal Linux avec Arduino" pour savoir comment visualiser les message envoyés par Arduino.

Les instructions nécessaires
Voici les deux instructions nécessaires pour envoyer des messages de debugging.

  Serial.begin(9600); // Démarrage de la communication série  
  Serial.print("Démarrage du programme\n");

A noter qu'il est préférable de ne pas utiliser des caractères accentuée car il ne s'affichent pas correctement dans le console du moniteur serie (voir capture plus bas dans l'article).

Réservation des pins 0 et 1 pour la communication série
Lors de l'établissement d'une connexion série, les Pin0 et 1 sont automatiquement re-configurées en RX (pin0) & TX (pin1).
Il est important de le savoir parce que lors de l'utilisation du port série, il n'est plus possible d'utiliser les pins 0 & 1  à d'autres fins.
 
A noter que s'il est possible de monitorer les communications séries via le port USB, c'est parce que l'information circulant sur les pins 0 & 1 (communication série) est capturée pour être aussi renvoyée via la port USB.
 
Exemple
Voici un montage tout a fait rudimentaire ou on essaye de détecter la pression sur le bouton (Pin 2). Un message de Debug est envoyé via le port série lorsque l'utilisateur enfonce ou relache le bouton.
Montage

Programme
Source: SerialDebug.pde
/*
 * Script montrant l'usage de la communication série 
 * pour débugger du code
 */

int pinBouton = 2;
int etatBouton;

void setup(){
  pinMode( pinBouton, INPUT ); // Bouton d'entrée
 
  etatBouton = digitalRead( pinBouton );
  
  Serial.begin(9600); // Démarrage de la communication série  
  Serial.print("Démarrage du programme\n"); 
  Serial.print("Presser le bouton.\n"); 
}

int lecture1, lecture2;

void loop(){
  // --- Lecture du bouton avec déparasitage logiciel ---
  // Si pas de parasite, lecture1 egal lecture2
  lecture1 = digitalRead( pinBouton ); // première lecture du bouton
  delay( 10 ); // attendre 10 milli-secondes
  lecture2 = digitalRead( pinBouton ); // deuxieme lecture du bouton
    
  // changement d'état ?
  if( (lecture1==lecture2) && (lecture1 != etatBouton) )
    changeEtatBouton( lecture1 );
}

void changeEtatBouton( int nouvelEtat ){
  if( nouvelEtat == LOW )
    Serial.print( "Bouton relache!\n" );
  else
    Serial.print( "Bouton enfonce\n" );
  
  etatBouton = nouvelEtat; 
}

Resultat sur le "moniteur série"
Voici ce qui est capturé dans le moniteur de l'Arduino IDE.

Resultat sur un terminal Linux
Pour savoir comment configurer le terminal Linux, référez-vous à l'article "Utiliser un terminal Linux avec Arduino".
Ressources