Effetto Fade con PIN ADC

Buongiorno a tutti,
la mia ignoranza insieme ai vostri consigli
https://forum.arduino.cc/index.php?topic=435970.new#new
https://forum.arduino.cc/index.php?topic=650645.new#new
https://forum.arduino.cc/index.php?topic=653379.msg4403631#msg4403631
hanno prodotto il mio primo progetto Arduino per le luci del presepio. Ha tutto funzionato molto bene e visto che l'appetito vien mangiando ho deciso di ampliare il tutto.
Di base ho:

  • Arduino Due
  • 2 ULN2803A
  • 2 alimentatori 12Volt (uno da 5 A e l'altro da 2 A)
    Facendo due rapidi calcoli con le mie "casette" e effetti vari e cercando di essere più sintetico possibile avrei bisogno di collegare:
  • 5 file da 2 con microlampade 12V 2Watt
  • 3 led, quindi PIN effetto fuoco (giallo, giallo, rosso)
  • 3 led bianchi (cometa-capanna-re magi)
  • 2 led gialli altre case
    praticamente tutti sfruttano la possibilità di dare un valore "analogico" o per effetto fade o per il tremolio e quindi mi sono ritrovato con Arduino Due che ha i PWD da 2 a 13 e quindi non mi basterebbero. Se non ho studiato male (di sicuro non abbastanza visto il mio post attuale) ho queste domande:
  • potrei utilizzare gli I/O DAC?
  • credo anche questi passando via ULN2803 giusto?
  • Ma come si usa? per riassumere uno stralcio che ho trovato in giro
void setup() {
 analogWriteResolution(12);  
}
void loop() {
 for (int i=0; i<4096; i++) 
 {
   analogWrite(DAC0, i);
   delay(2000);
 }
 delay(1000);
}

oppure studio anche da qui? Anche se parla di "ingressi" magari studiando a fondo...

come sempre scusate per le lungaggini, è chiaro che non ho il dono della sintesi ::slight_smile:
ciao
Emanuele

Parliamo di pin ADC o DAC?

Arduino2 vedo che ha, oltre ai soliti ingressi ADC, anche due uscite DAC, cioè analogiche reali (e non simulate in PWM).

Però... leggo che il range di tensioni in uscita non copre da 0 a Vcc ma un po' meno (0,55..2,75V), e senza l'aggiunta di elettronica analogica esterna (amplificatori operazionali + driver di potenza lineari o modulatori PWM aggiuntivi) ce ne facciamo ben poco.

L'alternativa può essere un PWM software, che però richiede che il loop giri sempre alla massima velocità senza essere bloccato da delay o lunghi cicli nel resto del programma.

Esempio che fa pulsare il LED on board variandone la luminosità tramite PWM software:

byte duty = 0;     // 0=spento, 100=acceso max
int  direz = 1;    // 1=aumenta, -1=diminuisce
byte counter = 0;  // conteggio passi PWM 0..99
uint32_t t;
byte out;


void setup() 
{
    pinMode(13, OUTPUT);
    t = millis();
}


void loop() 
{
    if (millis()-t >= 10)  // varia luminosita` ogni 10ms
    {
        t += 10;
        duty += direz;
        if (100 == duty  ||  0 == duty) { direz = -direz; }
    }

    out = (counter < duty) ? 1 : 0;
    digitalWrite(13, out);
    counter = (counter + 1) % 100;
}

Ma, senza fare cose strane, rischiando solo di fare danni alla DUE, usare una, o più di una (se ne possono mettere fino a 62 per un totale di 992 pin PWM), semplice schedina come QUESTA che, pilotata in I2C, mette a disposizione 16 uscite PWM no? ;D

Guglielmo

Claudio_FF:
Però... leggo che il range di tensioni in uscita non copre da 0 a Vcc ma un po' meno (0,55..2,75V), e senza l'aggiunta di elettronica analogica esterna (amplificatori operazionali + driver di potenza lineari o modulatori PWM aggiuntivi) ce ne facciamo ben poco.

Per prima cosa GRAZIE :wink:
ieri ho avuto un po' di tempo per dedicarmi allo studio ed alla pratica. Ho dovuto rifare un paio di saldature ma ora sembra tutto ok. Spiego cosa ho fatto:
ho messo un paio di ULN2803 come in figura

ed utilizzato le due porte DAC con questo codice:

void setup() {
  // nothing happens in setup
  pinMode(1, OUTPUT);
}

void loop() {

      // lavora sui pin DIGITALI
    digitalWrite(1, HIGH);
  // fade in from min to max in increments of 5 points:
  for (int fadeValue = 0 ; fadeValue <= 255; fadeValue += 5) {
    
    
    // lavora sui pin PWD
    analogWrite(13, fadeValue);
    analogWrite(12, fadeValue);
    analogWrite(11, fadeValue);
    analogWrite(10, fadeValue);
    analogWrite(9, fadeValue);
    analogWrite(8, fadeValue);
    analogWrite(7, fadeValue);
    analogWrite(6, fadeValue);
    analogWrite(5, fadeValue);
    analogWrite(4, fadeValue);
    analogWrite(3, fadeValue);
    analogWrite(2, fadeValue);

    // lavora sui pin ANALOGICI
    analogWrite(DAC0,fadeValue);
    analogWrite(DAC1,fadeValue);

    
    delay(30);
  }

  // fade out from max to min in increments of 5 points:
  for (int fadeValue = 255 ; fadeValue >= 0; fadeValue -= 5) {

    
    // lavora sui pin PWD
    analogWrite(13, fadeValue);
    analogWrite(12, fadeValue);
    analogWrite(11, fadeValue);
    analogWrite(10, fadeValue);
    analogWrite(9, fadeValue);
    analogWrite(8, fadeValue);
    analogWrite(7, fadeValue);
    analogWrite(6, fadeValue);
    analogWrite(5, fadeValue);
    analogWrite(4, fadeValue);
    analogWrite(3, fadeValue);
    analogWrite(2, fadeValue);

    // lavora sui pin ANALOGICI
    analogWrite(DAC0,fadeValue);
    analogWrite(DAC1,fadeValue);

    delay(30);
  }
       // lavora sui pin DIGITALI
    digitalWrite(1, LOW);
}

alle porte DAC ho collegato le microlampade. Funziona tutto, probabilmente come spiegavi te non parte da 0 e non arriva a Vcc però sono microlampadine e devono illuminare l'interno delle casette del presepio quindi per quanto mi riguarda va bene. Grazie comunque per la dritta che mi hai dato anche se come dice gpb01 a quel punto meglio le schedine moltiplicatrici a cui avevo pensato ma che non ho mai utilizzato. Grazie
Emanuele

P.S. non funziona solo il led in digitale ma credo perchè l'ho collegato al Pin 1 che invece fa altre cose o perchè ho spagliato lo sketch del test che ho fatto?

gpb01:
Ma, senza fare cose strane, rischiando solo di fare danni alla DUE, usare una, o più di una (se ne possono mettere fino a 62 per un totale di 992 pin PWM), semplice schedina come QUESTA che, pilotata in I2C, mette a disposizione 16 uscite PWM no? ;D

Guglielmo

Ha ragione, come sempre, ma le ho scoperte dopo che avevo già fatto il primo mezzo lavoro e solo dopo ho voluto "espandermi". A quel punto, come avevo accennato, ho trovato questo

sarebbe una cosa simile a quella che mi hai suggerito? Ho cominciato a leggere il tuo link, molto interessante grazie. ... forse per la versione 2.0 devo assolutamente stravolgere tutto e fare come dici.
Posso un'ultima domanda? A questo punto, funzionando tutto sia con la mia versione 1.0 che con la tua futura 2.0 (ci lavoro appena posso :slight_smile: ) devo fare attenzione agli Ampere che consumo giusto? pensavo di "doppiare" quasi tutte le uscite inserendo in parallelo almeno due lampadine o led (dipende dai pin) per motivi diversi: sulle microlampade mi permettono di gestire 2 case (con la ver.2.0 ognuno avrà il suo effetto) mentre per i led per avere più effetti fuoco (3 led ogni fuoco e ne vorrei accendere 3) e un paio di led bianchi per ogni capanna. Leggendo un po' in giro un po' di consumi, e comunque ho ordinato una pinza amperometrica per controllare, ed ho stilato questa tabellina

può andare? Posso distribuire con due alimentatori uno da 5A e l'altro da 2? (sono quelli che ho)
ciao
Emanuele