Controllare più pin contemporaneamente – Arduino

ArduinoUno_R3_Front_450px

Da tempo ormai abbiamo imparato a smanettare con il nostro Arduino. Controlliamo apparecchiature complicatissime o accendiamo semplicemente un led. Siamo comunque sperimentatori…degli inventori….dei creativi….dei Makers 🙂

Il punto di forza di Arduino è come abbiamo detto molte volte…la semplicità…la praticità. Per far lampeggiare un led si impiegano pochi secondi….

Semplicità non vuol dire poca potenza…o giochi da bambini 🙂

Infatti … volendo … e’ possibile dialogare con il processore Atmega anche in maniera un po più diretta e “meno semplice”…il tutto per scoprire nuove funzioni e portare al massimo la CPU.

Se vogliamo accendere un led procediamo come segue:

settiamo il pin come output : pinMode(Pin, OUTPUT);
e poi portiamo il livello ALTO o BASSO con  : digitalWrite(Pin, HIGH);

magari se siamo più addentrati mettiamo un cliclo e facciamo lampeggiare il led alla velocità che decidiamo noi….

….e fin qui tutto ok!

Ma se vogliamo cambiare lo stato di 2 o più pin contemporaneamente????
Voi direte….metto 2 o più righe di digitalWrite.

Si ma……sono più righe di codice e comunque sono istruzioni separate…che il processore, per quanto veloce, fa una dopo l’altra.

Non mi piace….voglio un comando che in una riga mi cambia lo stato di tutte le uscite contemporaneamente!

E se si cerca…il comando c’e’ !!!

Vi mando alla pagina ufficiale….se ve la volete leggere tutta!

Se no ve la spiego io ….

Arduino ha 3 porte :

  • B uscite digitali da 8 a 13
  • C ingressi analogici
  • D uscite digitali da 0 a 7

Iniziamo a parlare alla CPU a suoni di 1 e 0…..parliamo semplicemnte….1 e’ abilitato…0 disabilitato.

Voglio settare i pin da 1 a 7 come output e lo 0 come input in un unico comando?

Ecco come :
DDRD = B11111110;
Voglio settare i pin 7,5 e 3 come HIGH e tutti gli altri LOW….in un unico comendo???

Ecco :
PORTD = B10101000;

Notate che gli 1 sono in corrispondenza dei pin da settare…

Semplice no??????

I programmi creati saranno più snelli, corti….e di conseguenza occuperanno molto meno spazio nella preziosa e limitata memoria del nostro Arduino.

Il semplice programma per far lampeggiare il led che trovate tra gli esempi dell’IDE, opportunamente modificato per far lampeggiare 3 led contemporaneamente, occupa circa 1400 byte se scritto nel modo classico….e solo 600 byte se compilato usando questo metodo alternativo!

Buon Lavorooooo 🙂

 

14 thoughts on “Controllare più pin contemporaneamente – Arduino

  1. Ciao purtroppo sono alle primissime armi, potresti farmi un esempio concreto, con quello che hai scritto, di codice per accendere 4 led, due a due? Esempio: pin 1 e 3 due led che si accendono contemporaneamente e quando si spengono si accendono altri due led su altre due uscite tipo 9 e 11, tipo flipflop. Mi servirebbe per far accendere più led facendoli lampeggiare. Ti allego solo un mini codice preso su internet che funziona ma vorrei ampliarlo. Grazie mille. Mauri

    // Project 1 – Police Lights by Dave1324

    int ledDelay = 50; // delay by 50ms
    int redPin = 9;
    int bluePin = 11;

    void setup() {
    pinMode(redPin, OUTPUT);
    pinMode(bluePin, OUTPUT);

    }

    void loop() {

    digitalWrite(redPin, HIGH); // turn the red light on
    delay(ledDelay); // wait 50 ms

    digitalWrite(redPin, LOW); // turn the red light off
    delay(ledDelay); // wait 50 ms

    digitalWrite(redPin, HIGH); // turn the red light on
    delay(ledDelay); // wait 50 ms

    digitalWrite(redPin, LOW); // turn the red light off
    delay(ledDelay); // wait 50 ms

    delay(100); // delay midpoint by 100ms

    digitalWrite(bluePin, HIGH); // turn the blue light on
    delay(ledDelay); // wait 50 ms

    digitalWrite(bluePin, LOW); // turn the blue light off
    delay(ledDelay); // wait 50 ms

    digitalWrite(bluePin, HIGH); // turn the blue light on
    delay(ledDelay); // wait 50 ms

    digitalWrite(bluePin, LOW); // turn the blue light off
    delay(ledDelay); // wait 50 ms

    }

  2. Mauri….per un programmino cosi semplice come quello che hai postato…o come quello che vorresti fare…ha poco senso il tutto. Mi spiego meglio..scriveresti meno codice e quindi risparmi memoria…ma su un programmone…non su un paio di righe per far lampeggiare due led.
    In questo listato basta aggiungere altri 2 int per dichiarare altri 2 led e metterli di seguito nel listato. L’occhio non vedrebbe nessuna differenza e non avresti aumenti consistenti come occupazione di memoria.

  3. Scusa il ritardo nella risposta ma sono stato occupato con il lavoro.
    Si questo era solo un esempio preso in rete anche perchè io non lo saprei neppure fare.
    Grazie mille per i consigli che mi hai dato. Alla prosima.
    Mauri

  4. Ciao!
    Sono Marta. Dovrei realizzare un progetto in cui accendere 9 matrici LED contemporaneamente. Possiedo un arduino MEGA 2560. Purtroppo essendo una principiante ho qualche difficoltà nel trovare un metodo adatto per realizzare quanto detto.
    Devo fare praticamente un tris: le 9 matrici devono mantenere contemporaneamente uno stato X o O durante il gioco.
    Mi sembra che l’articolo di questa pagina http://www.danilolarizza.com/controllare-piu-pin-contemporaneamente-arduino/ possa effettivamente essermi d’aiuto ma sinceramente non so come implementarlo.
    Riuscirebbe a darmi uno spunto?

    Marta

  5. Ciao io avrei bisogno di un consiglio per un progetto…
    Vorrei che quando alimento arduino..

    1) Si accende e tiene acceso un led
    2) 2 Emetta un suono con un bunzer per qualche secondo
    3) Si accende un secondo led (e tiene acceso anche il primo led)
    praticamente deve dare l’effetto quanto segue..
    corrente
    led 1 acceso
    suono magari 10 secondi
    led 2 acceso

    Ho provato vari modi ma cosi facendo mi manda in ciclo anche il bunzer all’infinito
    come posso risolvere?

  6. Ma non devi fare un ciclo…e’ solo una sequenza.

    posta il listato o mandamelo via email e ci ragioniamo su.

  7. Ciao Danilo

    leggendo il tuo articolo sull’uso contemporaneo dei pin d’uscita di arduino in particolare sull’uso del comando PORTD = B10101000; in cui sono attivi in contemporanea i pin 7,5,3 ti chiedo se e possibile avere uno sketch completo d’esempio in cui i pin da 1 a 7 di arduino siano attivi alti ( high ) .

    ringraziandoti anticipatamente colgo l’occasione per inviarti i piu cordiali saluti

    alessandro

  8. Salve, ma se si 7 output volessi far cambiare di stato solo alcuni pin e gli altri non cambino di stato, come si può fare?
    Grazie
    Claudio

  9. Ciao Claudio, ogni valore 1 é un valore alto…ogni 0 é basso. Creo stringhe con uno e zero….e il gioco é fatto.

  10. Buona sera,
    Premetto che sono un neofita che sta cercando di comprendere il linguaggio Arduino. Mi sono cimentato a costruirmi con i neopixel utilizzando un Arduino uno un orologio e sono riuscito dopo numerosi fallimenti e lettura di Internet nel mio intento evidenziando anche ogni cinque minuti il relativo led acceso. Però desidero fare accendere anche i led a parte giorni del mese, giorno della settimana mese e se fattibile anche l’anno utilizzando dei neopixel da 8, da 12 e da 32 (8*4), ma come era prevedibile mi sono perso, potrebbe darmi un aiuto.grazie

  11. Buongiorno Pasquale, naturalmente lei comprende che da un commento e’ impossibile darle una risposta. Il progetto che lei ha seguito e’ composto da uno schema e da un circuito. Non sapendo di che si tratta…dare una risposta è cosa ardua. Buona Giornata.

  12. Cerco di spiegarmi meglio. Ho creato una codifica su arduino uno. Come detto precedentemente ho utilizzato un cerchio di 60 neopixel per creare l’orologio. Allo scadere delle ore 24,00 dovrebbero accendersi il neopixel per il giorno del mese (1/31) e contemporaneamente accendersi il megapixel del giorno della settimana (1/7). Al successivo giro di boa spegnersi i led armadietti e accendere i neopixel successivi e così via

  13. Buongiorno, il sistema di strisce led neopixel basa il funzionamento su un indirizzo da dare a ciascun led. L’articolo scritto ha un altro obiettivo, ovvero quello di comandare due o più pin dell’arduino contemporaneamente. Per risolvere il suo problema e’ tutta questione di codice non riconducibile pero’ al suddetto articolo.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *