Construire un oscilloscope Arduino 20 kHz sur écran Nokia 5110 – Guide DIY facile
Composants et fournitures
| Arduino Nano R3 | × | 1 |
| Écran LCD Nokia 5110 (PCD8544) | × | 1 |
| Résistance 10 kΩ | × | 4 |
| Résistance 4,75 kΩ | × | 1 |
| Résistance 330 Ω | × | 1 |
| Bouton poussoir momentané | × | 4 |
Outils et machines nécessaires
- Fer à souder (générique)
- Fil à souder, sans plomb
Applications et services en ligne
- Arduino IDE
À propos de ce projet
Cette fois, je vais vous montrer comment réaliser un oscilloscope Arduino simple. La fréquence de signal maximale que l'oscilloscope peut afficher est de 20 kHz, et la tension d'entrée maximale est de 5 V sans diviseur de tension.
L'oscilloscope est contrôlé par quatre boutons :
- Bouton "HOLD" – qui permet de figer l'état actuel de l'écran
- Bouton de synchronisation qui permet de régler le niveau de synchronisation.
- Boutons "+" et "-" qui contrôlent le balayage, le niveau de synchronisation et déplacent l'image du signal en mode HOLD.
Sur l'écran Nokia 5110, verticalement chaque case représente 1 V, horizontalement une case équivaut à la résolution de balayage, qui a les valeurs suivantes : 0,1 ; 0,2 ; 0,5 ; 1,0 ; 2,0 ; 5,0 ; 10,0 ; 20,0 et 50,0 ms. La valeur de balayage est modifiée avec les boutons "+" et "-", qui s'affiche dans le coin supérieur gauche. Le niveau de déclenchement est affiché sous forme de petite barre sur le côté gauche de l'écran, et la tension de déclenchement est affichée dans le coin supérieur droit. Ce projet est publié sur la page arduino.ru où vous pouvez lire plus de détails.
L'appareil est extrêmement simple à construire et ne consiste qu'en quelques composants :
- Microcontrôleur Arduino Nano
- Écran LCD Nokia N5110
- Quatre boutons
- Quatre résistances de tirage vers le bas (pull-down)
- Prise d'entrée
- Interrupteur d'alimentation et LED
J'ai testé l'oscilloscope avec un générateur de signaux sinusoïdaux et rectangulaires. Bien qu'il ne s'agisse pas d'un instrument professionnel ou très utilisable, il peut encore être utilisé à des fins éducatives ou dans votre laboratoire, pour tester des signaux de basse fréquence, d'autant plus que l'appareil est très facile à fabriquer et extrêmement bon marché.
Finalement, l'appareil est placé dans un boîtier approprié en PVC et recouvert de papier peint autocollant.
Code
Code Arduino (C/C++)
#include <Adafruit_GFX.h>
#include <Adafruit_PCD8544.h>
#include <SPI.h>
Adafruit_PCD8544 display = Adafruit_PCD8544(7, 6, 5, 4, 3); // CLK, DIN, DC, CE, RST |||| VCC +3.3V, BL ++ 200 OM ++ 3.3V
int izm, x, y, u, i2, zz, hold, h0, h1, h2, raz = 0, menu, sss = 512, u_dig, data[168] = {};
unsigned long time, times;
float per;
byte i;
void setup() {
Serial.begin(9600);
display.begin();
display.clearDisplay();
display.display();
display.setContrast(40); // réglage du contraste
display.setTextSize(1); // taille de police
display.setTextColor(BLACK); // couleur du texte
pinMode(10, INPUT); // +
pinMode(11, INPUT); // -
pinMode(12, INPUT); // hold
pinMode(13, INPUT); // synchro
ADMUX = 0b01000000; // 10 bit A0
ADCSRA = 0b11110010; // CLK/4
analogWrite(9, 127); // PWM 9 OUTPUT
}
void loop() {
///////////////////////////CONTRÔLE BOUTONS//////////////////////////////
if (menu == 0) {
if (digitalRead(10) == HIGH) {
if (hold == 0) { raz++; }
if (hold == 1) { i2 = i2 + 1; }
delay(100);
}
if (digitalRead(11) == HIGH) {
if (hold == 0) { raz--; }
if (hold == 1 && hold > 0) { i2 = i2 - 1; }
delay(100);
}
}
if (digitalRead(12) == HIGH) { hold++; i2 = 0; delay(100); }
if (digitalRead(13) == HIGH) { menu++; delay(100); }
if (hold > 1) { hold = 0; }
if (menu > 1 || menu < 0) { menu = 0; }
if (raz <= 0) { raz = 0; }
if (raz > 8) { raz = 8; }
if (menu == 1) {
hold = 0;
if (digitalRead(10) == HIGH) { sss += 24; delay(100); }
if (digitalRead(11) == HIGH) { sss -= 24; delay(100); }
if (sss > 1023) { sss = 1023; }
if (sss < 0) { sss = 0; }
}
display.setCursor(0, 0); // position du curseur
/////////////////////////TEMPS DE BALAYAGE calibré par générateur////////////////////////////
if (raz == 0) { zz = 1; h2 = 2; per = 0.1; }
if (raz == 1) { zz = 1; h2 = 1; per = 0.2; }
if (raz == 2) { zz = 12; h2 = 1; per = 0.5; }
if (raz == 3) { zz = 32; h2 = 1; per = 1; }
if (raz == 4) { zz = 75; h2 = 1; per = 2; }
if (raz == 5) { zz = 200; h2 = 1; per = 5; }
if (raz == 6) { zz = 380; h2 = 1; per = 10; }
if (raz == 7) { zz = 750; h2 = 1; per = 20; }
if (raz == 8) { zz = 1900; h2 = 1; per = 50; }
//////////////////////////////////////////////////////////////////
if (hold == 0 && millis() - time > 0) {
ads();
while (izm < sss) { ads(); h0++; if (h0 > 5000) { break; } }
h0 = 0; // SYNCHRONISATION
times = micros();
while (i < 167) {
i++;
delayMicroseconds(zz);
ads();
data[i] = izm; // MESURE 10 bit
}
i = 0;
times = micros() - times;
Serial.println(times);
}
////////////////////AFFICHAGE SUR ÉCRAN///////////////////////////////
if (millis() - time > 100) {
display.clearDisplay();
if (sss < 204 && sss > 100) { u_dig = 10; display.setCursor(0, 40); display.print("0.4V"); }
else if (sss < 100) { u_dig = 5; display.setCursor(0, 40); display.print("0.2V"); }
else { u_dig = 25; }
display.setCursor(0, 0);
while (i < 167) {
i++;
setka();
display.drawLine(i * h2 - i2, 47 - data[i] / u_dig, i * h2 - i2 + h2 - 1, 47 - data[i + 1] / u_dig, BLACK);
}
i = 0;
display.print(per, 1);
display.print(" mS ");
if (menu == 0) {
if (hold == 1) { display.print("HOLD "); }
else { display.print("AUTO "); }
}
if (menu == 1) { display.print(sss / 200.0, 1); display.print(" V "); }
if (menu == 1) { display.drawLine(0, 48 - sss / u_dig, 4, 48 - sss / u_dig, BLACK); }
time = millis();
}
display.display();
} // loop
void ads() {
//////// 10 bit ///////////
do { ADCSRA |= (1 << ADSC); } while ((ADCSRA & (1 << ADIF)) == 0);
izm = (ADCL | ADCH << 8);
////////////////// 8 bit ///////////
// VARIABLES REQUISES (sss, u_dig)
// while ((ADCSRA & 0x10) == 0); // ADCSRA|=0x10; // izm = ADCH;
}
void setka() {
for (y = 8; y < 47; y = y + 8) {
for (x = 0; x < 83; x = x + 4) {
display.drawPixel(x, y, BLACK);
}
}
for (x = 0; x < 83; x = x + 26) {
for (y = 10; y < 47; y = y + 4) {
display.drawPixel(x, y, BLACK);
}
}
}
Schémas

Processus de fabrication
- Stores intelligents : contrôle automatisé de la lumière avec Arduino et énergie solaire
- Capteur d'obstacle IR simple avec Arduino — LED IR + Photodiode
- Construire un voltmètre DIY avec Arduino et écran Nokia 5110
- Oscilloscope DIY Arduino Nano (10 Hz – 50 kHz) avec écran LCD 128×64
- Construire une roue de mesure précise avec Arduino Nano et encodeur rotatif
- Chronomètre Arduino Simple : Construisez un Chronomètre Activé par Bouton
- Multimètre capacimètre auto-étendant DIY (10 pF – 10 µF) – Construction Arduino facile
- Circuit d'entrée analogique isolée pour Arduino : Protection contre les parasites industriels
- Construire un Réveil Fiable avec RTC DS1302 et Arduino UNO