Utiliser un arduino pour faire un oscilloscope (du pauvre)
Peut-être que je vais prendre le temps de rédiger un petit billet sur ce sujet mais pendant que j'essayai de comprendre comment marche un composant électronique je me suis dis qu'un oscilloscope aurait pu m'aider !
Ça coûte cher un oscillo ... et la dernière fois que j'en ai touché un c'était au lycée pendant les cours de physique ... hé oui je suis un vieux con qui se dit que l'enseignement général qu'on a eu était quand même sacrément sympa car 30 ans plus tard j'applique enfin des choses apprises à cette époque ... j'ai appris à souder des composants en EMT et je m'éclate aujourd'hui avec Arduino et autres ESP32 avec les tonnes de composants à y connecter.
Je n'ose même pas imaginer ce qu'auraient été nos cours de physique avec tous ces objets qui permettent d'appliquer directement tous ces enseignements ...
Enfin la page "nostalgie" étant tournée me voilà donc face au besoin d'un oscilloscope et je lis avec beaucoup d'intérêt les pages suivantes:
- https://www.instructables.com/Arduino-Oscilloscope-poor-mans-Oscilloscope/
- http://www.miupanel.com/advanced-oscilloscope/
- https://fr.flossmanuals.net/arduino/oscilloscope/
et plein d'autres ... finalement je m'arrête sur 2 projets:
- lxardoscope
- arduino-oscilloscope pas possible de faire plus simple
lxardoscope
Super propre, s'amuse à singer une interface d'un véritable oscilloscope ... mais finalement je le laisse tomber pour les raisons suivantes:
- inutilisable sur mon écran 4k
- pas possible de faire un "zoom arrière" pour afficher 20 minutes de données (oui je suis gourmand) sur ce coup là
Par contre je vous invite à l'essayer, vraiment, c'est un très beau projet. Passez donc par le blog-du-grouik pour avoir l'astuce qui permet de l'utiliser et pensez bien à brancher vos broches sur A1/A2 et pas sur A1/GND comme j'ai pu le faire au début
Le plus simple de tous
C'est vraiment ultra basique, ça ne donnera pas une plage d'analyse bien large mais dans mon cas (je souhaite monitorer un retour d'alarme d'un composant d'ESP8622) c'est parfait :
Un petit peu de code à pousser sur votre Arduino (au passage je pense dédier un arduino à ce "job" d'oscilloscope du pauvre):
#define ANALOG_IN 0
void setup() {
Serial.begin(9600);
//Serial.begin(115200);
}
void loop() {
int val = analogRead(ANALOG_IN);
Serial.write( 0xff );
Serial.write( (val >> 8) & 0xff );
Serial.write( val & 0xff );
}
Et ensuite l'interface de l'oscilloscope est proposée via Processing (un bidule de plus à installer):
/*
* Oscilloscope
* Gives a visual rendering of analog pin 0 in realtime.
*
* This project is part of Accrochages
* See http://accrochages.drone.ws
*
* (c) 2008 Sofian Audry (info@sofianaudry.com)
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
import processing.serial.*;
Serial port; // Create object from Serial class
int val; // Data received from the serial port
int[] values;
float zoom;
void setup()
{
size(1280, 480);
// Open the port that the board is connected to and use the same speed (9600 bps)
port = new Serial(this, "/dev/ttyUSB1", 9600);
values = new int[width];
zoom = 1.0f;
smooth();
}
int getY(int val) {
return (int)(height - val / 1023.0f * (height - 1));
}
int getValue() {
int value = -1;
while (port.available() >= 3) {
if (port.read() == 0xff) {
value = (port.read() << 8) | (port.read());
}
}
return value;
}
void pushValue(int value) {
for (int i=0; i<width-1; i++)
values[i] = values[i+1];
values[width-1] = value;
}
void drawLines() {
stroke(255);
int displayWidth = (int) (width / zoom);
int k = values.length - displayWidth;
int x0 = 0;
int y0 = getY(values[k]);
for (int i=1; i<displayWidth; i++) {
k++;
int x1 = (int) (i * (width-1) / (displayWidth-1));
int y1 = getY(values[k]);
line(x0, y0, x1, y1);
x0 = x1;
y0 = y1;
}
}
void drawGrid() {
stroke(255, 0, 0);
line(0, height/2, width, height/2);
}
void keyReleased() {
switch (key) {
case '+':
zoom *= 2.0f;
println(zoom);
if ( (int) (width / zoom) <= 1 )
zoom /= 2.0f;
break;
case '-':
zoom /= 2.0f;
if (zoom < 1.0f)
zoom *= 2.0f;
break;
}
}
void draw()
{
background(0);
drawGrid();
val = getValue();
if (val != -1) {
pushValue(val);
}
drawLines();
}
Attention à changer "/dev/ttyUSB1" dans votre code par le point d'entrée de votre arduino connecté en USB ... ensuite branchez la pin A1 de votre arduino sur le bidule dont vous voulez afficher les données et lancez l'appli ... ça affichera une fenêtre toute simple:
Et pour finir
Si vous voulez aller plus loin je vous invite à aller voir ce projet : https://sebastiannilsson.com/k/projects/realtime-plotter/