Tastiera con arduino uno per selezionare scene su un dispositivo elettronico

Salve.
Dovrei realizzare un sistema di selezione delle scene in un dispositivo, attraverso una tastiera interfacciata con arduino uno, cerco di essere più preciso:
Il dispositivo ha cinque ingressi, indicati con IN0,IN1,IN2,IN3,IN4, ed un ingresso di abilitazione IN5. Ora premesso che non ho molte info sul dispositivo, posso dire che gli ingressi se resi attivi con un +24 Vdc hanno rispettivamente un peso pari a : 1 -2 -4 -8 -16.
Attraverso questi ingressi, rendendoli attivi in maniera opportuna si potranno selezionare delle scene programmate nel dispositivo e numerate dal numero 1 al numero 32, cosi ad esempio: con attivo IN0 (peso 1), attivo IN1 (peso 2) ed attivo IN4 (peso 16) ed IN2 ed IN3 a zero, ottengo la selezione della scena numero 19.. e a seguire.
Ora viene la necessità di selezionare queste scene pertanto la combinazione rispettiva di 0/1 attraverso una tastiera, e qui mi è venuta l'idea di sfruttare arduino uno per convertire gli stati o meglio i tasti numerici della tastiera, nei rispettivi ingressi del dispositivo.
Ovviamente adatterei le uscite attivi di arduino uno ad un sistema per convertire i + 5V in +24 V magari utilizzando un relè a altra soluzione, fermo restando che devo ancora verificare se il dispositivo accetti o meno un segnale di atrtivazione con tensione di 5 V.

Domanda : qualcuno ha indicazioni da fornirmi in merito al possibile sketch da utilizzare per convertire i tasti numerici in relative uscite alte (+V) o basse(0V) su cinque uscite di arduino ?

Grazie in anticipo per ogni supporto/info/indicazione ricevuta.

:wink:

Ciao..beh semplicemente devi convertire un numero che imposti su arduino,(magari che scegli con encoder e visualizzi con un display tipo 16x2) in binario dove i 5 bit non sono altro che 5 uscite che colleghi nel tuo dispositivo...poi per fare una cosa super potresti mettere 2 encoder..cosi mentre stai visualizzando la scena dell'encoder A, puoi impostare sull'encoder B la successiva scena che switch con un pulsante o encoder stesso se ha pulsante incorporato :wink:

Vespamike:
Ciao..beh semplicemente devi convertire un numero che imposti su arduino..

Ciao Vespamike, e grazie per la risposta.
In effetti, è come dici dovrò convertire un numero decimale (da tastiera) in binario (ingressi 0-1-2-3-4-) del dispositivo, questi ingressi accettano tensioni positive (livello alto) che le dovrà fornire in prima istanza arduino.
Per il momento ho preparato arduino uno, la tastiera a matrice, e cinque diodi led, che simuleranno gli ingressi del dispositivo, con i quali andrò a verificare la corrispondenza del binario in uscita da arduino uno.
E fin qui non ci sono difficoltà, ovvero per la parte hardware non ho problemi, quello che mi frega .. :slight_smile: .. è la parte sofftware,che sto cercando di approcciare e in tal senso ho scaricato la libreria Keypad per gestire la tastiera, ora vedo se riesco a realizzare la combinazione .. tasto 1 (ecc) premuto da tastiera e uscite attive corrispondenti sui cinque diodi led predisposti .. :slight_smile:
Ovviamente ogni suggerimento è ben accetto. :wink:

Mi sembra di capire che devi solo fare una codifica da decimale a binario:
Tasto 1: 00001
Tasto 1: 00010
Tasto 1: 00011
Tasto 1: 00100
Tasto 1: 00101

Datman:
Mi sembra di capire che devi solo fare una decodifica da decimale a binario:
Tasto 1: 00001
Tasto 1: 00010
Tasto 1: 00011
Tasto 1: 00100
Tasto 1: 00101

Esatto, il numero decimale viene da una tastiera con matrice 4x4, ed il binario dovrà essere su 5 bit euindi su altrettante uscite di arduino.. la difficoltà che trovo è nella realizzazione del software che gestisce gli input o meglio i numeri digitati sulla tastiera e le relative uscite in binario

Aggiornamento .. :slight_smile:
Ho realizzato l'hardware con arduino uno, al quale ho collegato una keypad 4x4 ai pin 1..8, ed ai pin 9..13 dei diodi led.
Ho poi realizzato uno sketch per leggere le combinazioni dei tasti della keypad in binario dai cinque diodi led, o meglio a me interessa ottenere in uscita i numeri da 0 a 31 in binario per poi inviarli in un dispositivo..
ora il punto è che con lo sketch realizzato i numeri da 0..9 vengo letto e riprodotti in binario, ma quelli dal 10 al 31 no, è evidente che mi manca qualche nozione e pezzo di programma ..
..
idee..aiutino '.. :slight_smile:

#include <Keypad.h>
const byte ROWS = 4;
const byte COLS = 4;
char keys[ROWS][COLS] = {
  {'1', '2', '3','A'},
  {'4', '5', '6','B'},
  {'7', '8', '9','C'},
  {'*', '0', '#','D'}
};
byte rowPins[ROWS] = {8,7,6,5};
byte colPins[COLS] = {4,3,2,1};
Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );
void setup()
{
  pinMode(9,OUTPUT);
  pinMode(10,OUTPUT);
  pinMode(11,OUTPUT);
  pinMode(12,OUTPUT);
  pinMode(13,OUTPUT);
}
void loop ()
{
  char key = keypad.getKey();
  if(key == '0') {
    digitalWrite(13,LOW);
    digitalWrite(12,LOW);
    digitalWrite(11,LOW);
    digitalWrite(10,LOW);
    digitalWrite(9,LOW);
  }
  if(key == '1') {
    digitalWrite(13,LOW);
    digitalWrite(12,LOW);
    digitalWrite(11,LOW);
    digitalWrite(10,LOW);
    digitalWrite(9,HIGH);
  }
  if(key == '2') {
    digitalWrite(13,LOW);
    digitalWrite(12,LOW);
    digitalWrite(11,LOW);
    digitalWrite(10,HIGH);
    digitalWrite(9,LOW);
    }
  if(key == '3') {
    digitalWrite(13,LOW);
    digitalWrite(12,LOW);
    digitalWrite(11,LOW);
    digitalWrite(10,HIGH);
    digitalWrite(9,HIGH);
    }
  if(key == '4') {
    digitalWrite(13,LOW);
    digitalWrite(12,LOW);
    digitalWrite(11,HIGH);
    digitalWrite(10,LOW);
    digitalWrite(9,LOW);
    }
  if(key == '5') {
    digitalWrite(13,LOW);
    digitalWrite(12,LOW);
    digitalWrite(11,HIGH);
    digitalWrite(10,LOW);
    digitalWrite(9,HIGH);
  }
    if(key == '6') {
    digitalWrite(13,LOW);
    digitalWrite(12,LOW);
    digitalWrite(11,HIGH);
    digitalWrite(10,HIGH);
    digitalWrite(9,LOW);
  }
    if(key == '7') {
    digitalWrite(13,LOW);
    digitalWrite(12,LOW);
    digitalWrite(11,HIGH);
    digitalWrite(10,HIGH);
    digitalWrite(9,HIGH);
  }
    if(key == '8') {
    digitalWrite(13,LOW);
    digitalWrite(12,HIGH);
    digitalWrite(11,LOW);
    digitalWrite(10,LOW);
    digitalWrite(9,LOW);
  }
    if(key == '9') {
    digitalWrite(13,LOW);
    digitalWrite(12,HIGH);
    digitalWrite(11,LOW);
    digitalWrite(10,LOW);
    digitalWrite(9,HIGH);
  }
    if(key == '10') {
    digitalWrite(13,LOW);
    digitalWrite(12,HIGH);
    digitalWrite(11,LOW);
    digitalWrite(10,HIGH);
    digitalWrite(9,LOW);
  }
    if(key == '11') {
    digitalWrite(13,LOW);
    digitalWrite(12,HIGH);
    digitalWrite(11,LOW);
    digitalWrite(10,HIGH);
    digitalWrite(9,HIGH);
  }
  if(key == '12') {
    digitalWrite(13,LOW);
    digitalWrite(12,HIGH);
    digitalWrite(11,HIGH);
    digitalWrite(10,LOW);
    digitalWrite(9,LOW);
  }
    if(key == '13') {
    digitalWrite(13,LOW);
    digitalWrite(12,HIGH);
    digitalWrite(11,HIGH);
    digitalWrite(10,HIGH);
    digitalWrite(9,LOW);
  }
    if(key == '14') {
    digitalWrite(13,LOW);
    digitalWrite(12,HIGH);
    digitalWrite(11,HIGH);
    digitalWrite(10,HIGH);
    digitalWrite(9,LOW);
  }
    if(key == '15') {
    digitalWrite(13,LOW);
    digitalWrite(12,HIGH);
    digitalWrite(11,HIGH);
    digitalWrite(10,HIGH);
    digitalWrite(9,HIGH);
  }
    if(key == '16') {
    digitalWrite(13,HIGH);
    digitalWrite(12,LOW);
    digitalWrite(11,LOW);
    digitalWrite(10,LOW);
    digitalWrite(9,LOW);
  }
    if(key == '17') {
    digitalWrite(13,HIGH);
    digitalWrite(12,LOW);
    digitalWrite(11,LOW);
    digitalWrite(10,LOW);
    digitalWrite(9,HIGH);
  }
    if(key == '18') {
    digitalWrite(13,HIGH);
    digitalWrite(12,LOW);
    digitalWrite(11,LOW);
    digitalWrite(10,LOW);
    digitalWrite(9,HIGH);
  }
    if(key == '19') {
    digitalWrite(13,HIGH);
    digitalWrite(12,LOW);
    digitalWrite(11,LOW);
    digitalWrite(10,HIGH);
    digitalWrite(9,HIGH);
  }
    if(key == '20') {
    digitalWrite(13,HIGH);
    digitalWrite(12,LOW);
    digitalWrite(11,HIGH);
    digitalWrite(10,LOW);
    digitalWrite(9,LOW);
  }
    if(key == '21') {
    digitalWrite(13,HIGH);
    digitalWrite(12,LOW);
    digitalWrite(11,HIGH);
    digitalWrite(10,LOW);
    digitalWrite(9,HIGH);
  }
    if(key == '22') {
    digitalWrite(13,HIGH);
    digitalWrite(12,LOW);
    digitalWrite(11,HIGH);
    digitalWrite(10,HIGH);
    digitalWrite(9,LOW);
  }
    if(key == '23') {
    digitalWrite(13,HIGH);
    digitalWrite(12,LOW);
    digitalWrite(11,HIGH);
    digitalWrite(10,HIGH);
    digitalWrite(9,HIGH);
  }
    if(key == '24') {
    digitalWrite(13,HIGH);
    digitalWrite(12,HIGH);
    digitalWrite(11,LOW);
    digitalWrite(10,LOW);
    digitalWrite(9,LOW);
  }
    if(key == '25') {
    digitalWrite(13,HIGH);
    digitalWrite(12,HIGH);
    digitalWrite(11,LOW);
    digitalWrite(10,LOW);
    digitalWrite(9,HIGH);
  }
    if(key == '26') {
    digitalWrite(13,HIGH);
    digitalWrite(12,HIGH);
    digitalWrite(11,LOW);
    digitalWrite(10,HIGH);
    digitalWrite(9,LOW);
  }
    if(key == '27') {
    digitalWrite(13,HIGH);
    digitalWrite(12,HIGH);
    digitalWrite(11,LOW);
    digitalWrite(10,HIGH);
    digitalWrite(9,HIGH);
  }
    if(key == '28') {
    digitalWrite(13,HIGH);
    digitalWrite(12,HIGH);
    digitalWrite(11,HIGH);
    digitalWrite(10,LOW);
    digitalWrite(9,LOW);
  }
    if(key == '29') {
    digitalWrite(13,HIGH);
    digitalWrite(12,HIGH);
    digitalWrite(11,HIGH);
    digitalWrite(10,LOW);
    digitalWrite(9,HIGH);
  }
    if(key == '30') {
    digitalWrite(13,HIGH);
    digitalWrite(12,HIGH);
    digitalWrite(11,HIGH);
    digitalWrite(10,HIGH);
    digitalWrite(9,LOW);
  }
    if(key == '31') {
    digitalWrite(13,HIGH);
    digitalWrite(12,HIGH);
    digitalWrite(11,HIGH);
    digitalWrite(10,HIGH);
    digitalWrite(9,HIGH);
  }
}

Ti è sfuggito il code... :slight_smile:

A parte il fatto che dovresti usare degli else if o switch/case, indirizzando direttamente ad esempio la porta D ci vuole un attimo:

void loop ()
{
char key = keypad.getKey();
PORTD |= key&0b00011111;
PORTD &= key|0b11100000;
}

In questo modo usi gli I/O da 0 a 4, ma puoi modificare il codice per indirizzare altri bit o la porta B o C.

Grazie per l'intervento Datman.

Datman:
Ti è sfuggito il code...

vero .. :smiley:
Non sono molto ferrato nella realizzazione degli sketch , pertanto trovo difficoltà anche a seguire le tue indicazioni, che molto probabilmente danno per scontato una conoscenza ferrata delle istruzioni di programmazione, cosa che mi manca .. :confused:

Se vuoi usare quei pin (PB1...5), diventa:

void loop ()
{
char key = keypad.getKey();
PORTB |=  (key<<1) & 0b00111110;
PORTB &=  (key<<1) | 0b11000001;
}

Finito, nel loop non c'è altro... :slight_smile:

Per i numeri da 10 a 31, evidentemente devi acquisire una coppia di tasti, non uno solo. Ciò implica che non dovrai più scrivere semplicemente 1, ma 01; non 5, ma 05. Devi, quindi, leggere il primo tasto e metterlo in una variabile (d), poi attendere che venga premuto il secondo e metterlo in un'altra variabile (u). A quel punto fai key=10*d+u e imposti le uscite.
In alternativa, puoi omettere gli zeri iniziali usando il tasto * o # come enter.

P.s.: metti il code a quei 3GB di listato! :slight_smile:

Ragazzi, posto la soluzione al problema per il quale ho aperto questo thread; ovvero collegare una keypad matrice 4x4 ad arduino uno, digitare sulla keypad le cifre da 0..31 ed ottenere in uscita da arduino sui pin 9,10,11,12,13 l'equivalente in binario (5 bit) della cifra digitata.
Lo scketch per gestire quanto sopra descritto, e che pubblico di seguito, è stata cortesemente realizzata dall'utente Silente il quale ringrazio per la sua disponibilità.

#include <Keypad.h>
#define ROWS 4
#define COLS 3
const char keys [ROWS][COLS]={2,3,4,5,6,7,8,9,10,11,1,11};
const byte rowPins[ROWS] = {8,7,6,5};
const byte colPins[COLS] = {4,3,2};
Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );
const byte pin[5]={9,10,11,12,13};//Sostituirli con i numeri dei pin usati in ordine crescente di valore
byte numero;
byte conto;

void setup() {
  // put your setup code here, to run once:
  for (byte i=0;i<5;i++)
    pinMode (pin[i], OUTPUT);

}

void loop() {
  // put your main code here, to run repeatedly:
  char premuto=keypad.getKey();
  if (premuto<11 && premuto>0)
  {
    premuto--;
    if (conto==0)//Ho premuto il primo (terzo, quinto, settimo...) tasto
    {
      numero=premuto;
      conto=1;
    }
    else
    {
      numero=numero*10+premuto;
      conto=0;
      numero=numero%32;//Qualsiasi cosa accada il numero va da 0 a 31 (32=0, 33=1, 34=2...)
      for (byte i=0;i<5;i++)
      {
        digitalWrite (pin[i], numero%2);
        numero=numero/2;
      }
    }
  }

}

Ora devo solo realizzare il circuito di interfaccia delle uscite in binario verso il dispositivo che le utilizza in ingresso, in quanto la tensione di livello alto/basso ha un valore di gran lunga superiore ai 5 V delle uscite di arduino, e l'intento è anche quello di separare galvanicamente arduino dal dispositivo che controlla o pilota.
A circuito completo e realizzato posterò al soluzione adottata.

Ringrazio tutti gli utenti intervenuti ed il supporto offerto.
:wink:

mar65:
datman> Ti è sfuggito il code...
vero .. :smiley:

Ok, quindi?
Per favore, modifica il tuo post #5 (clicca su "More..." sotto al tuo messaggio, quindi "Modify") per includere tutto il codice nel tag [code], ossia selezionalo e clicca sul pulsantino in alto a sinistra "[/]".

docdoc:
Per favore, modifica il tuo post #5

Fatto. :wink: