Pagina 2 di 2

Re: Arduino - magie in pochi grammi e pochissimi Euro

MessaggioInviato: 17/05/2018, 11:49
da carloroma63
Bene, dopo un po di teoria, vediamo qualche applicazione pratica. Prenderò come esempio il lavoro fatto sul mio Titanic.


Nel 3D dedicato ho citato Arduino nella gestione del fumo dei camini, vediamo come Arduino gestisce questa parte. In allegato lo sketch completo, da cui estrarrò solo le parti che vado a spiegare.
Prima di illustrare il codice, vi riassumo come è composto il sistema. Nei camini ci sono tre bruciatori per sigarette elettroniche. questi bruciatori lavorano a c.c.a 3,5 Volt ed assorbono al massimo c.ca 1 Ampere. I tre bruciatori sono collegati in serie, in modo da poterli agevolmente pilotare con una tensione di 12V, modulata in PWM. Visto che Arduino NON è in grado di gestire ne questa tensione ne questa corrente, utilizzo un canale di un ponte ad H come modulo di potenza. Avrei potuto usare anche un singolo Mosfet, ma al momento non ne avevo.
In serie ai tre bruciatori, verso massa, ho messo una resistenza da qualche decimo di Ohm. Ai suoi capi si genererà quindi una tensione proporzionale alla corrente che circola nei bruciatori. Questo valore lo userò per verificare se non esagero con l'alimentazione per questo componente.
L'aria inviata ai bruciatori viene prodotta da una ventolina.

Ma ora passiamo al codice

innanzitutto dichiaro, nella parte iniziale del codice, la variabile che indica l'ingresso da cui misuro la corrente assorbita dai bruciatori. Questo pin è collegato direttamente al lato "positivo" della resistenza di cui sopra.

byte sensorPin2 = A2; // Input per la misura della tensione della corrente camini

Il valore "A2" è una costante di sistema, le ho presentate nel post del 7/5, ed indica l'ingresso analogico 2.

Poi dichiaro quale pin è collegato all'uscita del canale radio che pilota il motore
byte pinCH1 = 2; // motore

In mancanza della A davanti al numero, quest'ultimo fa riferimento all'ingresso digitale 2.

Definisco poi una variabile di appoggio ove memorizzare la durata dell'impulso letto dalla radio

unsigned int durationCH1;

Infine definisco su quale pin è collegato, attraverso il driver del ponte ad H, il gruppo dei tre bruciatori.
byte pinFumo = 11; // Generatore fumo

Definisco poi altre quattro dati (una variabile e tre costanti). Nei commenti leggete il loro scopo


int sensorValue2 = 0; // corrente camini
const float Trim2 = 4.7; //parametro di conversione corrente camini.
const unsigned long massimo0 = 1000; // soglia massima della corrente assorbita dal generatore di fumo.
const unsigned long minimo0 = 600;// soglia minima della corrente assorbita dal generatore di fumo.


Infine definisco delle variabili di appoggio.


int valFumo = 0;
int valFumoAtteso = 0;
int valVentola = 0;
int valMotore = 0;
int valMassimo = 220;


Il seguito nel prossimo post.

Re: Arduino - magie in pochi grammi e pochissimi Euro

MessaggioInviato: 17/05/2018, 12:14
da carloroma63
Siamo finalmente alla setup(), ove troviamo l'inizializzazione di alcuni pin

pinMode(pinCH1, INPUT); // clone del motore, usato per il generatore di fumo
pinMode(pinFumo, OUTPUT); // definisco il pin in Output
analogWrite(pinFumo, 0);

La prima riga definisce in input il pin ove è attaccato il canale 1 della radio,
la seconda definisce in output il pin a cui è collegato il gruppo dei bruciatori,
la terza riga imposta a 0 l'uscita di tale pin. N.B. avrete forse notato che scrivo un "analog" per un pin di tipo digitale. Per arduino significa che quel pin va trattato come un piedino PWM, che quindi simulerà un uscita analogica attraverso un segnale PWM.

Infine inizializzo meccanicamente i camini, mandandoli alla massima potenza per tre secondi

// stappo i condotti dell'aria azionando per tre secondi la ventola alla massima velocità.
analogWrite(pinVentola, 255);
analogWrite(pinFumo, 220);
delay (3000);
analogWrite(pinVentola, 0);
analogWrite(pinFumo, 0);

avrete notato che ho fatto riferimento anche al pinVentola. E' analogo al pinFumo, solo che alimenta la ventolina che produce l'aria soffiata nei bruciatori.

dopo la setup() è il turno della loop(), che viene eseguita continuamente.

Le prime righe che ci troviamo sono

sensorValue2 = analogRead(sensorPin2);
sensorValue2=sensorValue2*Trim2;


attraverso cui leggo la corrente assorbita dai bruciatori. Trim2 è un fattore di correzione che mi permette di convertire il valore di tensione letto dal pin in un valore di corrente.


ad un certo punto leggo il canale 1 della radio, usando una funzione molto comoda allo scopo, anche se non ottimale quando occorrono tempi di elaborazione molto rapidi (non è questo il caso): pulseIn(pin,modo);

durationCH1 = pulseIn(pinCH1, HIGH);

Questa funzione attende che il segnale sul pin diventi HIGH e che poi torni LOW. Al termine restituisce il valore letto espresso in microsecondi.

infine elaboro le informazioni ed applico ai pin del bruciatore e della ventolina i valori opportuni

if (valFumo>0 and sensorValue2>massimo0){ // verifico se il generatore di fumo assorbe troppa corrente. In caso positivo abbasso il valore massimo del pwm.
valMassimo=valMassimo-1;
}
valMotore = durationCH1 - 1455;
valFumoAtteso = abs(valMotore);

valVentola = map(valFumoAtteso,0,100,100,250);
if (valVentola > 255) { valVentola=255; }
valFumo = map(valFumoAtteso,0,100,70,valMassimo);
if (valFumo > valMassimo) { valFumo=valMassimo; }

analogWrite(pinVentola, valVentola);
analogWrite(pinFumo, valFumo);


Non commento le singole righe, tranne le due in rosso. Con queste righe ottengo il valore assoluto del numero dei giri del motore, indipendentemente dal suo verso di rotazione.

I più attenti avranno notato che, rispetto al contenuto del file che ho caricato precedentementee, ci sono delle piccole variazioni. Si tratta di correzioni a piccole imperfezioni del codice che ho con me adesso. Quello che è installato sul modello è già corretto.

Carlo