Contagiri con Arduino

I sensori a infrarossi a riflessione sono componenti molto versatili, che possono tornare utili in diverse situazioni.

Nel video vediamo come realizzare un contagiri da utilizzare come misuratore della velocità di rotazione di un elettro-utensile.

Di seguito trovate il firmware per il funzionamento del progetto. Potete scaricare il file, oppure copiare ed incollare il codice nell'IDE di Arduino.

Il software è abbastanza semplice, ma potrebbe sembrare incomprensibile per chi non ha una conoscenza approfondita dei micro-controller. Vediamo quindi di chiarire alcuni aspetti.

Iniziamo con la linea

#define DISPLAY_TYPE U8G2_SH1106_128X64_NONAME_F_HW_I2C

Dal momento che l'elenco dei display supportati dalla libreria u8g2 è infinito, occorre definire il modello che si sta utilizzando. In questo caso indichiamo un display basato sul chip SH1106, con una risoluzione di 128x64 pixel, di un produttore sconosciuto (NONAME) e che utilizza un connessione I2C hardware.

L'unica modifica necessaria potrebbe consistere nel sostituire SH1106 con SSD1306 (la maggior parte dei display OLED si basano su uno di questi due chip).

Le linee

#define TCCR1B_CAPTURE_RISING 0x07
#define TCCR1B_CAPTURE_FALLING 0x06
#define TCCR1B_OFF 0x00

sono macro che serviranno ad impostare il funzionamento di uno dei timer del micro-controller ATMega328.

I timer di solito non vengono utilizzati direttamente, ma attraverso funzioni di Arduino (sono ad esempio alla base della funzione delay) o librerie specifiche (ad esempio la libreria Servo).

In questo caso, invece, useremo il Timer1 direttamente per contare gli impulsi provenienti dal sensore ottico. Il timer verrà quindi impostato come contatore avente per ingresso il piedino 5 dell'Arduino.

Per calcolare la velocità, vengono contati gli impulsi nell'intervallo di un secondo. I giri al minuto vengono calcolati moltiplicando il numero di impulsi per 60 e dividendolo per il numero di tacche dell'encoder (in questo caso 15). Questo equivale a moltiplicare per 4 (60/15), per cui viene impostata la macro PULSE_MULTIPLIER

#define PULSE_MULTIPLIER 4

La modalità di funzionamento del Timer1 viene impostata nel blocco di setup con la riga

TCCR1A = 0x00;

Sempre nel blocco di setup viene anche inizializzato il display, coi comandi

u8g2.begin();
u8g2.setFont(u8g2_font_logisoso28_tr);

(la seconda riga serve a selezionare il carattere).

Nel ciclo loop vengono poi eseguite in continuazione le seguenti operazioni:

  1. Il Timer 1 viene azzerato

    TCCR1B = TCCR1B_OFF;
    TCNT1 = 0;


  2. Viene avviato il conteggio degli impulsi per 1 secondo

    TCCR1B = TCCR1B_CAPTURE_RISING;
    delay(1000);
    TCCR1B = TCCR1B_OFF;


  3. La velocità in giri al minuto viene calcolata moltiplicando il numero di impulsi per l'opportuno moltiplicatore

    rpm = ( TCNT1 * PULSE_MULTIPLIER );

  4. La velocità viene visualizzata sul display

    u8g2.clearBuffer();
    ...
    u8g2.sendBuffer();


Commenti

Post popolari in questo blog

Dimmer per strisce led con Arduino

Caratteri giganti per i display LCD