Fabrication industrielle
Internet des objets industriel | Matériaux industriels | Entretien et réparation d'équipement | Programmation industrielle |
home  MfgRobots >> Fabrication industrielle >  >> Manufacturing Technology >> Processus de fabrication

Oscilloscope DIY Arduino Nano (10 Hz – 50 kHz) avec écran LCD 128×64

Composants et fournitures

Composant Quantité
Arduino Nano R3 1
Condensateur 100 µF 1
Écran LCD ST7920 128×64 1
Potentiomètre rotatif 2
Bouton poussoir momentané 3

Outils nécessaires

Applications et services en ligne

À propos de ce projet

Ce projet décrit la réalisation d'un oscilloscope simple couvrant une plage de 10 Hz à 50 kHz. Une gamme étendue pour un dispositif n'utilisant aucun convertisseur numérique-analogique externe, seulement l'Arduino.

L'affichage s'effectue sur un écran LCD ST7920 128×64 pixels. La zone de mesure occupe 96×64 pixels, la zone d'informations (fréquence, Vpp, etc.) 32×64 pixels.

Construction extrêmement simple avec peu de composants :

Fonctionnalités : déclenchement automatique (affichage très stable), vitesse de balayage : 0,02 ms/div ~ 10 ms/div (9 paliers selon la règle 1-2-5), fonction Hold (gel de la forme d'onde et des paramètres).

Basé sur le blog de Wu Hanqing (code original). J'ai apporté des modifications mineures pour l'adapter à mon matériel. Comme le montre la vidéo, l'instrument offre une excellente lisibilité grâce au grand écran et un déclenchement automatique performant. La position verticale est réglée par un potentiomètre 50 kΩ, le contraste par un 10 kΩ. Testé avec générateur de signaux sinusoïdaux et carrés.

Bien que non professionnel, cet oscilloscope reste utile à des fins éducatives ou en laboratoire pour tester des signaux basse fréquence, d'autant qu'il est très facile à construire et peu coûteux.

Code

#include <U8glib.h>
U8GLIB_ST7920_128X64_4X u8g(6, 5, 4);

int Input = A0;
int Key_add = 8;
int Key_sub = 9;
int Key_hold = 10;
int x, y;
int i, i1, i2, V_min, V_max, V_mid, t, t0, t1, sta, Key = 1, hold = 0;
long Freq;
float Vpp;
int Y[96];
int Buffer[192];

// Police bitmap pour l'écran de démarrage (tronquée pour lisibilité)
const uint8_t L[] PROGMEM = { /* données bitmap */ };

void setup() {
  pinMode(Key_add, INPUT); digitalWrite(Key_add, HIGH);
  pinMode(Key_sub, INPUT); digitalWrite(Key_sub, HIGH);
  pinMode(Key_hold, INPUT); digitalWrite(Key_hold, HIGH);
  
  ADMUX = 0x60;  // Configuration ADC
  ADCSRA = 0xe2; // Activation ADC, prescaler
  
  u8g.setFont(u8g_font_5x7);
  u8g.firstPage();
  do {
    u8g.drawBitmapP(0, 0, 16, 64, L);
  } while (u8g.nextPage());
  delay(2000);
}

void loop() {
  sample();
  Measure();
  Transform();
  Key_scan();
  if (hold == 0) {
    u8g.firstPage();
    do {
      draw();
    } while (u8g.nextPage());
  }
}

void sample() {
  for (i = 0; i < 192; i++) {
    Buffer[i] = ADCH;
    switch (Key) {
      case 1: break;
      case 2: delayMicroseconds(4); break;
      case 3: delayMicroseconds(10); break;
      case 4: delayMicroseconds(23); break;
      case 5: delayMicroseconds(60); break;
      case 6: delayMicroseconds(123); break;
      case 7: delayMicroseconds(248); break;
      case 8: delayMicroseconds(623); break;
      case 9: delayMicroseconds(1247); break;
      default: break;
    }
  }
}

void Measure() {
  V_max = Buffer[0]; V_min = Buffer[0];
  for (i = 0; i < 192; i++) {
    if (Buffer[i] > V_max) V_max = Buffer[i];
    if (Buffer[i] < V_min) V_min = Buffer[i];
  }
  V_mid = (V_max + V_min) / 2;
  Vpp = (V_max - V_min) * 5.0 / 255.0;
  
  for (i = 0; i < 97; i++) {
    if (Buffer[i] < V_mid && Buffer[i+1] >= V_mid) { i1 = i; break; }
  }
  for (i = i1 + 1; i < 98 + i1; i++) {
    if (Buffer[i] < V_mid && Buffer[i+1] >= V_mid) { i2 = i; break; }
  }
  t = i2 - i1;
  Freq = (t > 0) ? 8000 / t : 0;
}

void Transform() {
  for (sta = 0; sta < 96; sta++) {
    if (Buffer[sta] < 128 && Buffer[sta+2] > 128) break;
  }
  for (i = 0; i < 96; i++) Y[i] = 63 - (Buffer[i+sta] >> 2);
}

void draw() {
  for (x = 0; x < 95; x++) u8g.drawLine(x, Y[x], x, Y[x+1]);
  u8g.drawFrame(0, 0, 97, 64);
  u8g.drawLine(48, 0, 48, 63);
  u8g.drawLine(0, 32, 96, 32);
  for (x = 0; x < 96; x += 8) u8g.drawLine(x, 31, x, 33);
  for (y = 0; y < 64; y += 8) u8g.drawLine(47, y, 49, y);
  for (x = 8; x < 96; x += 8)
    for (y = 8; y < 64; y += 8)
      u8g.drawPixel(x, y);
  
  u8g.drawStr(98, 7, "MS/div");
  u8g.drawStr(98, 23, "V/div");
  u8g.drawStr(98, 30, "0.324");
  u8g.drawStr(98, 40, "Vpp");
  u8g.setPrintPos(98, 47); u8g.print(Vpp);
  u8g.drawStr(118, 47, "V");
  u8g.drawStr(98, 55, "F(HZ)");
  
  switch (Key) {
    case 1: u8g.drawStr(98, 14, "0.02"); u8g.setPrintPos(98, 62); u8g.print(Freq * 50); break;
    case 2: u8g.drawStr(98, 14, "0.05"); u8g.setPrintPos(98, 62); u8g.print(Freq * 20); break;
    case 3: u8g.drawStr(98, 14, "0.1");  u8g.setPrintPos(98, 62); u8g.print(Freq * 10); break;
    case 4: u8g.drawStr(98, 14, "0.2");  u8g.setPrintPos(98, 62); u8g.print(Freq * 5); break;
    case 5: u8g.drawStr(98, 14, "0.5");  u8g.setPrintPos(98, 62); u8g.print(Freq * 2); break;
    case 6: u8g.drawStr(98, 14, "1");    u8g.setPrintPos(98, 62); u8g.print(Freq); break;
    case 7: u8g.drawStr(98, 14, "2");    u8g.setPrintPos(98, 62); u8g.print(Freq / 2); break;
    case 8: u8g.drawStr(98, 14, "5");    u8g.setPrintPos(98, 62); u8g.print(Freq / 5); break;
    case 9: u8g.drawStr(98, 14, "10");   u8g.setPrintPos(98, 62); u8g.print(Freq / 10); break;
    default: break;
  }
}

void Key_scan() {
  if (digitalRead(Key_add) == LOW) {
    while (digitalRead(Key_add) == LOW);
    Key++; if (Key == 10) Key = 9; delay(10);
  }
  if (digitalRead(Key_sub) == LOW) {
    while (digitalRead(Key_sub) == LOW);
    Key--; if (Key == 0) Key = 1; delay(10);
  }
  if (digitalRead(Key_hold) == LOW) {
    while (digitalRead(Key_hold) == LOW);
    hold = ~hold; delay(10);
  }
}

Schémas

Schéma de câblage : Arduino Nano, écran ST7920, potentiomètres, boutons et condensateur.

Processus de fabrication

  1. Construisez votre propre LUMAZOID : Visualiseur musical DIY Arduino
  2. Construire un oscilloscope Arduino 20 kHz sur écran Nokia 5110 – Guide DIY facile
  3. Construire un Iron Man animé avec Arduino : capteurs, sons et relais
  4. Find Me : Localisateur d'objets intelligent avec Arduino et Bluetooth
  5. Affichage LED matrice interactif porte avec capteur PIR - Salutations fêtes Arduino
  6. Contrôleur d'humidificateur DIY avec Arduino et relais – Installation haute tension sécurisée
  7. Construire un voltmètre DIY avec Arduino et écran Nokia 5110
  8. Mesure de distance en temps réel par sonar Arduino et visualisation Processing
  9. MobBob : Construisez votre propre robot Arduino, contrôlé via smartphone Android