0

Mini oscilloscopio con Arduino AI.

Share

Cos’è un mini oscilloscopio?

Un mini oscilloscopio è un dispositivo utilizzato per visualizzare e analizzare segnali elettrici. A differenza degli oscilloscopi tradizionali, un mini oscilloscopio, specificamente costruito con un microcontrollore come Arduino, è più compatto, portatile e versatile, rendendolo ideale per hobbyisti e tecnici.

Perché utilizzare Arduino per costruire un oscilloscopio?

Arduino è una piattaforma open-source che permette una facile programmazione e personalizzazione. Usando Arduino per costruire un mini oscilloscopio, gli utenti possono amplificare la loro comprensione dell’elettronica attraverso l’esperienza pratica. Questo progetto è accessibile anche a chi non ha una solida base in ingegneria elettrica. I circuiti possono essere costruiti facilmente e i costi rimangono contenuti, rendendo il mini oscilloscopio un ottimo strumento educativo.

Componenti necessari per il progetto

Per iniziare a costruire il tuo mini oscilloscopio, avrai bisogno di alcuni componenti fondamentali. Questi includono un Arduino (preferibilmente Uno o Nano), un display LCD, resistenze, e vari cavi per le connessioni. Un modulo ADC (convertitore analogico-digitale) potrebbe essere necessario per migliorare la precisione della visualizzazione dei segnali. Connettendo correttamente questi componenti, sarai in grado di creare un oscilloscopio funzionante, capace di misurare vari segnali elettrici.

Arduino Uno / Nano
Display OLED 128×64 I2C con driver SSD1306
Segnale in ingresso su A0


Questo non è un oscilloscopio professionale, ma va bene per vedere forme d’onda lente o medie, fare test didattici e controllare segnali semplici.


Collegamenti
OLED I2C
VCC → 5V
GND → GND
SDA → A4
SCL → A5
Ingresso segnale
Segnale → A0
GND del segnale → GND Arduino


Attenzione: su Arduino Uno/Nano non superare 5V su A0.
Se il segnale è più alto o anche negativo, serve un partitore/protezione.


Librerie da installare
Da Arduino IDE installa:


Adafruit GFX Library
Adafruit SSD1306

#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET -1
#define SCREEN_ADDRESS 0x3C

Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

const int inputPin = A0;

// Buffer campioni
uint8_t wave[SCREEN_WIDTH];

// Parametri visualizzazione
float vRef = 5.0;          // riferimento ADC per Uno/Nano classico
bool showGrid = true;

// Funzione per mappare il valore analogico sul display
int analogToY(int value) {
  // value: 0..1023
  // y display: 63..0 (invertito)
  return map(value, 0, 1023, SCREEN_HEIGHT - 1, 0);
}

void drawGrid() {
  // linea centrale orizzontale
  display.drawLine(0, SCREEN_HEIGHT / 2, SCREEN_WIDTH - 1, SCREEN_HEIGHT / 2, SSD1306_WHITE);

  // linee verticali ogni 16 pixel
  for (int x = 0; x < SCREEN_WIDTH; x += 16) {
    display.drawPixel(x, SCREEN_HEIGHT / 2 - 1, SSD1306_WHITE);
    display.drawPixel(x, SCREEN_HEIGHT / 2 + 1, SSD1306_WHITE);
  }

  // linee orizzontali leggere ogni 16 pixel
  for (int y = 0; y < SCREEN_HEIGHT; y += 16) {
    for (int x = 0; x < SCREEN_WIDTH; x += 4) {
      display.drawPixel(x, y, SSD1306_WHITE);
    }
  }
}

float readVoltage() {
  int raw = analogRead(inputPin);
  return (raw * vRef) / 1023.0;
}

void captureWaveform(int sampleDelayUs) {
  for (int x = 0; x < SCREEN_WIDTH; x++) {
    int val = analogRead(inputPin);
    wave[x] = analogToY(val);
    delayMicroseconds(sampleDelayUs);
  }
}

void drawWaveform() {
  for (int x = 1; x < SCREEN_WIDTH; x++) {
    display.drawLine(x - 1, wave[x - 1], x, wave[x], SSD1306_WHITE);
  }
}

void drawInfo(int sampleDelayUs, float voltage) {
  display.fillRect(0, 0, SCREEN_WIDTH, 10, SSD1306_BLACK);
  display.setTextSize(1);
  display.setTextColor(SSD1306_WHITE);
  display.setCursor(0, 0);
  display.print("V:");
  display.print(voltage, 2);
  display.print("  T:");
  display.print(sampleDelayUs);
  display.print("us");
}

void setup() {
  pinMode(inputPin, INPUT);

  if (!display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS)) {
    while (true); // blocca se display non trovato
  }

  display.clearDisplay();
  display.setTextSize(1);
  display.setTextColor(SSD1306_WHITE);
  display.setCursor(10, 25);
  display.println("Mini Oscilloscopio");
  display.display();
  delay(1500);
}

void loop() {
  // Tempo di campionamento: più basso = più veloce
  // Puoi cambiarlo per vedere segnali diversi
  int sampleDelayUs = 80;

  float voltage = readVoltage();

  captureWaveform(sampleDelayUs);

  display.clearDisplay();

  if (showGrid) {
    drawGrid();
  }

  drawWaveform();
  drawInfo(sampleDelayUs, voltage);

  display.display();
}

Come funziona
Il programma:
legge 128 campioni dal pin A0
li trasforma in coordinate verticali sul display
disegna la forma d’onda sull’OLED
mostra anche:
la tensione istantanea
il tempo tra i campioni (T: 80us)
Come regolare la velocità
Nel loop() trovi:
C++
Copia codice
int sampleDelayUs = 80;
Puoi cambiarlo così:
20–50 us → segnali più rapidi
80–200 us → segnali medi
500–2000 us → segnali lenti
Più alto il valore, più “allunghi” il tempo visualizzato sullo schermo.