Astroinseguitore: prove tecniche di programmazione di Arduino

Il mio amore per la scienza – e l’astronomia in particolare – mi è stato di stimolo per apprendere – e anche sperimentare – un’infinità di cose tra loro molto diverse. In gioventù toccò alla elettronica applicata alle onde radio 1 che mi avvicinò anche al mondo radioamatoriale. Poi fu la volta dei computer e della loro capacità di elaborazione (fondamentale in astronomia) ad attirare la mia attenzione. E se è vero che la vecchiaia è una seconda gioventù, alla soglia dei cinquanta non devo farmi cogliere impreparato.

Lo schema da me usato per il circuito di test. Credit: Il Poliedrico.

Lo schema da me usato per il circuito di test.
Credit: Il Poliedrico.

Progettare un astroinseguitore (o tavoletta equatoriale) pone dei limiti progettuali piuttosto importanti, di cui il principale è senz’altro l’errore tangenziale nella velocità di guida che rischia di vanificare la bontà di qualsiasi buon lavoro di costruzione.
Per questo ho scelto di pilotare il motore con un sistema che fosse programmabile. Così posso decidere se, quando e quanto variare la velocità del braccio pilota. Ma essendo io quasi a digiuno di elettronica, di controllori programmabili e di robotica, da buon sperimentatore ho deciso di addentrarmi anche in questo campo, armato del buon spirito da autodidatta che da sempre mi si confà 2
Poter programmare una scheda come in questo caso un Arduino UNO R3 (clone) non è difficile; i programmi sono piuttosto semplici da leggere per chi sa programmare in C, anche a livello elementare.
Qui in fondo troverete lo sketch (si chiamano proprio così i programmi scritti per Arduino) infarcito ben bene di commenti 3 per rendere meglio l’idea su come esso funzioni. In pratica il programma istruisce Arduino a leggere lo stato di alcune porte per vedere se viene premuto un qualsiasi tasto e in tal caso accendere o spegnere il LED corrispondente, pilotato questo dalla commutazione di un’altra porta digitale della scheda.
Può apparire, ed in effetti lo è, un’operazione piuttosto banale ma comprendere come cambiare stato logico ad una porta digitale, poterne pilotare gli effetti (in questo caso accendere un LED) e come funziona tutta la circuiteria elettronica di contorno, non è poi così ovvio. Al posto dei LED potremmo scegliere di fare un’altra cosa, come azionare un motorino elettrico, controllarne la direzione e la velocità di rotazione. Oppure accendere una luce di casa, controllare una tapparella o ruotare una cupola di un osservatorio astronomico. Le possibilità sono infinite.

I materiali usati per il circuito descritto in questo articolo:

  • una bread board (basetta sperimentale senza saldature) da 400 reofori.
  • 4 resistenze da 1 kΩ 1/2 W.
  • 4 pulsanti n.a. (normalmente aperti) del tipo SMD/SMT a 4 pin.
  • 4 diodi LED di recupero.

Questi sono materiali poveri, incluso il costo di una scheda clone di Arduino UNO R3, che per le prove va più che bene, in totale sono appena 10 euro, tutto sommato una cifra davvero ridicola.
Spero così di stuzzicare la vostra curiosità così come è stata solleticata la mia, cieli sereni.

#define LED1  9                    // Led 1 collegato alla porta digitale  9
#define LED2 10                    // Led 2 collegato alla porta digitale 10
#define LED3 11                    // Led 3 collegato alla porta digitale 11
#define LED4 12                    // Led 4 collegato alla porta digitale 12
#define PULSANTE1 1                // Pulsante 1 collegato alla porta digitale 1
#define PULSANTE2 2                // Pulsante 2 collegato alla porta digitale 2
#define PULSANTE3 3                // Pulsante 3 collegato alla porta digitale 3
#define PULSANTE4 4                // Pulsante 4 collegato alla porta digitale 4

int porta1 = 0;                    // Azzera la variabile per la porta digitale 1
int porta2 = 0;                    // Azzera la variabile per la porta digitale 2
int porta3 = 0;                    // Azzera la variabile per la porta digitale 3
int porta4 = 0;                    // Azzera la variabile per la porta digitale 4

void setup() {                     // Inizializza il programma
  pinMode(LED1, OUTPUT);           // Attribuisce lo stato di scrittura alla porta digitale  9
  pinMode(LED2, OUTPUT);           // Attribuisce lo stato di scrittura alla porta digitale 10
  pinMode(LED3, OUTPUT);           // Attribuisce lo stato di scrittura alla porta digitale 11
  pinMode(LED4, OUTPUT);           // Attribuisce lo stato di scrittura alla porta digitale 12
  pinMode(PULSANTE1, INPUT);       // Attribuisce lo stato di lettura alla porta digitale  1
  pinMode(PULSANTE2, INPUT);       // Attribuisce lo stato di lettura alla porta digitale  2
  pinMode(PULSANTE3, INPUT);       // Attribuisce lo stato di lettura alla porta digitale  3
  pinMode(PULSANTE4, INPUT);       // Attribuisce lo stato di lettura alla porta digitale  4
}

void loop() {                      // Avvia il ciclo principale
  porta1 = digitalRead(PULSANTE1); // Legge lo stato del pulsante 1 e lo assegna alla variabile porta1
  porta2 = digitalRead(PULSANTE2); // Legge lo stato del pulsante 2 e lo assegna alla variabile porta2
  porta3 = digitalRead(PULSANTE3); // Legge lo stato del pulsante 3 e lo assegna alla variabile porta3
  porta4 = digitalRead(PULSANTE4); // Legge lo stato del pulsante 4 e lo assegna alla variabile porta4

  if (porta1 == HIGH) {            // Se lo stato letto prima è ALTO allora
    digitalWrite(LED1, HIGH);      // accendi il led 1
  } else {                         // altrimenti
    digitalWrite(LED1, LOW);       // spegni il led
  }
  if (porta2 == HIGH) {            // Se lo stato letto prima è ALTO allora
    digitalWrite(LED2, HIGH);      // accendi il led 2
  } else {                         // altrimenti
    digitalWrite(LED2, LOW);       // spegni il led
  }
  if (porta3 == HIGH) {            // Se lo stato letto prima è ALTO allora
    digitalWrite(LED3, HIGH);      // accendi il led 3
  } else {                         // altrimenti
    digitalWrite(LED3, LOW);       // spegni il led
  }

  if (porta4 == HIGH) {            // Se lo stato letto prima è ALTO allora
    digitalWrite(LED4, HIGH);      // accendi il led 4
  } else {                         // altrimenti
    digitalWrite(LED4, LOW);       // spegni il led
  }
}

Note:

Note:

  1. L’idea originale partiva dalla consapevolezza che l’attività solare influenza la ionosfera terrestre, quindi studiare la propagazione delle emittenti nelle onde corte (intensità del segnale, distanza etc.) avrebbe potuto restituire informazioni sullo stato della nostra stella. In realtà le variabili in gioco sono tantissime e molto complesse ma l’idea l’ebbi a tredici anni ed era piuttosto originale.
  2. Le mie conoscenze nel campo dell’elettronica sono molto elementari, quindi spero che vorrete perdonarmi se includo qualche strafalcione.
  3. Io in genere odio scrivere i commenti nel mio codice, in genere sono piuttosto arruffone, pessima abitudine appresa agli albori dell’informatica casalinga, quando i programmi e la RAM erano in tutto appena 16 kB e si usavano le musicassette come memoria di massa.
Rate this post

Umberto Genovese

Autodidatta in tutto - o quasi, e curioso di tutto - o quasi. L'astronomia è una delle sue più grandi passioni. Purtroppo una malattia invalidante che lo ha colpito da adulto limita i suoi propositi ma non frena il suo spirito e la sua curiosità. Ha creato il Blog Il Poliedrico nel 2010 e successivamente il Progetto Drake (un polo di aggregazione di informazioni, articoli e link sulla celebre equazione di Frank Drake e proposto al l 4° Congresso IAA (International Academy of Astronautics) “Cercando tracce di vita nell’Universo” (2012, San Marino)) e collabora saltuariamente con varie riviste di astronomia. Definisce sé stesso "Cercatore".

Commenti chiusi