INPUT DIGITALE: Esempio Ricevitore 4 canali

Per costruire il seguente circuito occorre avere un ricevitore a 4 canali e il corrispondente telecomando.

Ricevitore 4 Canali Remote Control - 4 Canali

Codice Sorgente A

Obiettivo progetto: Mostrare sul Serial Monitor di un circuito ricevitore a 4 canali, connesso ad Arduino, il pulsante schiacciato sul telecomando.

soluzione: Costruiamo il seguente circuito:

4CH Receiver/Remote Control

Chiaramente prima della stesura del codice è necessario effettuare delle prove per stabilire la relazione tra i pin D0 ... D3 e i pulsanti del telecomando (nel nostro caso D0 => B ; D1 => D ; D2 => A ; D3 => C ;):

/* Programma che visualizza sul Serial Monitor il bottone premuto sul telecomando */
// Imposto la connessione tra i Pin VT, D0...D3 <
// sul ricevitore wireless e i pin di ARDUINO
#define Pin_D0 6
#define Pin_D1 5
#define Pin_D2 4
#define Pin_D3 3
#define Pin_VT 2
// Variabili globali
int out[4]={0}, prec_out[4]={0};
int PB=0;

void setup()
{ 
    Serial.begin(9600);
    pinMode(Pin_D0, INPUT); // Imposto i pin del ricevitore come INPUT
    pinMode(Pin_D1, INPUT); 
    pinMode(Pin_D2, INPUT); 
    pinMode(Pin_D3, INPUT); 
    pinMode(Pin_VT, INPUT);
    StampaStato();          // Stampo stato iniziale
}

void StampaStato()
{
      boolean AlmenoUno;
      // Mostro sul Serial Monitor lo stato dei pin D0 ... D3 e PB
      // PB è high quando viene inviato un segnale corretto
      // ovvero se uno dei pulsanti A, B, C e D è premuto
      Serial.print("PB="+String(PB)+" || "); 
      for (int i=0 ; i<4 ; i++)
          Serial.print("D"+String(i)+"="+(out[i]==0 ? "_" : String(out[i]) )+" "); 
      // Determina il pulsante premuto
      Serial.print(" || Pulsanti premuti: ");
      AlmenoUno=false;
      if (out[2]==1) { Serial.print("A "); AlmenoUno=true; } // D2 è HIGH quando premo A
      if (out[0]==1) { Serial.print("B "); AlmenoUno=true; } // D0 è HIGH quando premo B
      if (out[3]==1) { Serial.print("C "); AlmenoUno=true; } // D3 è HIGH quando premo C
      if (out[1]==1) { Serial.print("D "); AlmenoUno=true; } // D1 è HIGH quando premo D
      if (!AlmenoUno) Serial.print("Nessuno");
      Serial.print("\n");
}

// Leggo i pin di Arduino per capire se è stato premuto qualche pulsante
void LeggiPINReceiver()
{
   PB = digitalRead(Pin_VT);
   out[0] = digitalRead(Pin_D0);
   out[1] = digitalRead(Pin_D1);
   out[2] = digitalRead(Pin_D2);
   out[3] = digitalRead(Pin_D3);
}

boolean ECambiataLaPressioneSuQualchePulsante()
{
  for ( int i=0 ; i<4 ; i++ )
     if (out[i]!=prec_out[i])
        return true;
  return false;
}

void loop() 
{
   int i;
   LeggiPINReceiver();
   if ( ECambiataLaPressioneSuQualchePulsante() )
      StampaStato();
   for (i=0 ; i<4 ; i++)
      prec_out[i]=out[i];
}

Il codice proposto produce sul Serial Monitor il seguente output.
Si noti che è possibile premere in contemporanea più bottoni ma una volta premuti non è possibile aggiungerne altri con un'ulteriore pressione.

Output 4Channel Receiver