XX. Oscilloscope▲
Ce projet va vous permettre de réaliser un oscilloscope minimaliste et d'expérimenter la communication série avec un autre logiciel que celui d'Arduino, en l'occurrence, Processing. Un oscilloscope permet de visualiser les variations d'une tension dans le temps, sous forme d'une courbe. Le principe de fonctionnement de ce projet est le suivant :
- l'Arduino mesure une tension sur une entrée analogique ;
- il transmet la valeur de cette entrée à l'ordinateur via la communication série à travers le port USB ;
- le programme Processing récupère la donnée transmise et l'affiche sous forme de courbe.
XX-A. Précautions▲
L'oscilloscope ainsi réalisé ne sera capable de mesurer que des tensions comprises entre 0 et 5 V. Pour mesurer des tensions plus importantes, ou des courants, il sera nécessaire d'ajouter des circuits supplémentaires comme un pont diviseur de tension, ou une résistance (voir chapitre « Les bases de l'électroniqueLes bases de l'électronique »).
XX-A-1. Éléments nécessaires▲
XX-A-2. Montage électronique▲
Comme expliqué ci-dessus, le montage se résume à deux fils connectés à l'Arduino, qui vont servir à mesurer un autre montage soumis à une tension variable. Un des fils sera connecté a la pin « GND », qui correspond au 0 V. Le second sera connecté à la pin Analog in 0. Les extrémités libres vont servir à faire les contacts avec le circuit à mesurer.
XX-B. Première étape▲
Copiez le programme suivant dans Arduino.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
/*
Ce programme consiste simplement à mesurer l'entrée analogique 0, et à transmettre le résultat via une communication série.
Il ressemble beaucoup au programme décrit dans la première étape du projet "la petite bête qui a peur".
*/
//déclaration des variables
//stockage du numéro de pin où sera branché l'entrée de la mesure
int
PinDeMesure=
0
;
//conteneur pour stocker la mesure
int
tension=
0
;
// délai entre deux mesures
int
periodeDeMesure=
20
;
void
setup(){
// Initialisation du programme
// établir la connection série à 19200 baud
Serial.begin(19200
);
// définir le PinDeMesure comme une entrée
pinMode(PinDeMesure, INPUT);
}
void
loop() {
//boucle principale
tension =
analogRead(PinDeMesure); // Lit la tension du pin DeMesure et stocke le résultat dans la variable tension
Serial.println(tension); // communique la valeur de la tension au port série
delay(periodeDeMesure); //attendre jusqu'à la prochaine mesure
}
Après avoir compilé et téléchargé ce programme dans la carte Arduino, en ouvrant le moniteur sériel, on pourra voir apparaître les mesures successives défiler. Les valeurs varient entre 0 et 1023 quand la tension aux pointes de touches varie entre 0 et 5 V.
XX-C. Deuxième étape▲
Après avoir téléchargé et installé Processing, copiez le programme suivant dans Processing. Vous ne devriez être pas trop dépaysé par l'interface, car Processing et Arduino sont des programmes frères.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
/*
oscilloscope minimaliste avec un Arduino
récupère les valeurs via une liaison série
*/
import
processing.serial.*; // importation de la bibliothèque de communication séerie
//variables
Serial maConnection; // Crée un objet de communication série
int
tension=
0
; // variable ou sera stockée la valeur de la tension
//affichage
int
fenetreTemps=
12000
; // temps pour parcourir la largeur de l'écran en millisecondes
int
x=
0
;
int
y=
0
;
void
setup() {
size(650
, 400
); // taille de l'écran
String NomDuPort =
Serial.list()[0
]; // récupère la première interface série trouvée
println("connection a "
+
NomDuPort);
maConnection =
new
Serial(this
, NomDuPort, 19200
); // création de la connexion série
background(255
); // fond d'écran blanc
smooth(); // lisser les dessins
strokeWeight(2
); // largeur de trait
stroke(40
); // couleur du trait gris
}
void
draw() {
//boucle de dessin principale
//détermination du X actuel
int
oldx =
x;
x =
(millis() %
fenetreTemps) *
width/
fenetreTemps;
if
(oldx >
x) {
// reprise au début de l'écran
oldx =
0
; background(255
);
// fond d'écran blanc
}
//determination de la valeur de Y
int
oldy =
y;
y =
int
(map(tension, 0
, 1023
, 380
, 20
)); // mise à l'échelle de la tension pour entrer dans l'écran
line(oldx, oldy, x, y); // dessine le trait
}
void
serialEvent (Serial maConnection) {
// si des données arrivent par la connexion série
String retour=
maConnection.readStringUntil('
\n
'
); // lit la donnée jusqu'à la fin de ligne
if
(retour !=
null) {
//si le retour n'est pas vide
retour =
trim(retour); // enlever les espaces
tension =
int
(retour); // converti le texte en nombre entier
}
}
Pour exécuter le programme, il suffit de cliquer sur le bouton « play ». Vérifiez auparavant que le moniteur sériel du programme Arduino est bien fermé, sans quoi la communication avec Processing ne voudra pas s'initialiser. En effet, la communication sérielle avec l'Arduino est exclusive, ce qui signifie qu'un seul programme à la fois peut ouvrir et communiquer sur un port sériel avec l'Arduino. En fermant le moniteur sériel, la connexion sérielle est fermée et ainsi libre pour une autre application. Il est possible d'utiliser plusieurs ports sériels différents (notamment avec les pins digitales de l'Arduino) pour établir plusieurs connexions avec différents logiciels.
Le programme, en s'exécutant affichera la fenêtre suivante :
La courbe affichée dépend du circuit que vous mesurez avec l'oscilloscope. Si vous n'avez rien de spécial à mesurer, vous pouvez essayer avec un potentiomètre, en prenant la mesure sur sa patte du milieu, et en reliant les deux autres bornes respectivement au GND et au 5 V.
XX-D. Pour aller plus loin▲
Dans ce projet, vous avez compris comment transmettre une information de l'Arduino à un programme quelconque sur l'ordinateur. Vous avez réalisé un magnifique oscilloscope. On peut imaginer compliquer ce programme pour avoir :
- accès à plus d'entrées simultanément ;
- mémoriser les enregistrements de courbes ;
- faire des pauses ;
- changer les échelles d'affichage ;
- etc.
Ces améliorations peuvent prendre du temps. En fait, grâce à la magie du logiciel libre, une âme charitable a déjà effectué tout ce travail, et l'a partagé. Il s'agit du projet arduinoscope : http://code.google.com/p/arduinoscope/. Peut-être êtes vous déçu d'avoir travaillé pour rien ? En fait, cet exemple nous montre également qu'avant d'entamer un projet, il est toujours utile de se documenter sur Internet pour voir les réalisations déjà existantes autour de la même problématique ; inutile de réinventer la roue !