Per un progetto di gioco sto convertendo una vecchia centralina telefonica in un meccanismo che apra una serratura a 12v quando tutte le connessioni siano chiuse secondo una combinazione determinata di coppie.
Fisicamente sulla centraliba ho sei plug sulla sinistra che devono connettersi a sei plug sulla destra mediante jack 6,3. Quando la sequenza di connessioni si compie secondo una matrice preimpostata, allora la serratura si apre.
Ho cercato in vari modi di dare un giro al problema ma non arri vio a capo di nulla.
La mia domanda è:
è possibile connettere univocamente due pin (uno in entrata e uno in uscita) mediante un cavo e che l’arduino possa leggere la connessione senza cortocircuitare?
C e una maniera di inviare in uscita su un Pin digitale una informazione che non sia HIGH o LOW e che un altro Pin in entrata possa leggere come TRUE o FALSE?
Qualunque suggerimento o pista è più che ben venuto!
Vi lascio una prima foto del marchingengo su cui sto lavorando.
è possibile connettere univocamente due pin (uno in entrata e uno in uscita) mediante un cavo e che l’arduino possa leggere la connessione senza cortocircuitare?
Possibile.
C e una maniera di inviare in uscita su un Pin digitale una informazione che non sia HIGH o LOW e che un altro Pin in entrata possa leggere come TRUE o FALSE?
Certo. Potresti crearti un tuo codice. Se usi il PWM puoi avere dei livelli che poi interpreti.
Vi lascio una prima foto del marchingengo su cui sto lavorando.
ma non serve un arduino per questo
il sapientino di quando ero piccolo io faceva questo, e con pochi fili anche
anche l'allegro chirurgo faceva qualcosa di simile
comunque tempo fa uno cercava una cosa del genere con fili e viti di 6 colori... aspetta che cerco tra i miei vecchi post
fitzcarraldo:
2. C e una maniera di inviare in uscita su un Pin digitale una informazione che non sia HIGH o LOW e che un altro Pin in entrata possa leggere come TRUE o FALSE?
In serie a ogni uscita metti una resistenza da 1k in modo da non avere problemi di cortocircuiti ne verso massa ne tra le altre uscite.
Su ogni ingresso colleghi una resistenza da 10k verso massa in modo da avere lettura stabile LOW quando non collegato.
Comandi le uscite HIGH una alla volta in sequenza, e leggi cosa arriva sugli ingressi per vedere se è quello che ti aspetti, così sai non solo se sono stati collegati nel giusto ordine spaziale, ma, se servisse, anche nella corretta sequenza temporale.
@paulus1969, usando i pmw non riesco a leggere valori senza variazioni. L analogico in lettura non mi permette di leggere 6 variazioni tra 0v a 5v poiche in lettura i valori oscillano di +1v.
scusate per la foto ma con il telefono no riesco a ridurre sotto i 2mb le foto e alla fine non me le lascia aggiungere. Cerco di risolvere almeno questi oggi
@Standardoil, certo: sapientino e il chirurgo pazzo sono i miei referenti. Pero come faccio perche la condizione finale sia TRUE se tutti i contatti e solo quelli sono connessi correttamente? Non voglio che il circuito si chiuda solo se due punti sono connessi. Devono essere 12 e in ordine predeterminato.
Se trovi il post ti sarei grato!
Claudio_FF: quello che dici é quello che sto provando. Pero mi trovo con il problema di sopra: se ho sei contatti/ pin dal 1 al 6 in uscita e altri 6 dalla A alla F in entrata, come faccio a sapere e assicurarmi che solo si connettano la A con l 1, B con 2, C con 3 e cosi via, e solo quando sono tutti connessi allo stesso tempo allora la condizione é compiuta? (contando che la matrice comunque non é ordinata: 1 connette con C, 2 connette con F etc).
Hai 6 uscite e 6 entrate che devono essere collegati nella giusta combinazione tra di loro?
Come dice Claudio_FF metti ressistenze da 1kOhm come protezione sulle uscite e da 10kOhm come pulldown.
Se in sequenza metti HIGH uno delle uscite e tieni gli alri LOW e leggi le entrate puoi determinare quale uscita é collegata a quale entrata.
per la cronaca:
C e una maniera di inviare in uscita su un Pin digitale una informazione che non sia HIGH o LOW e che un altro Pin in entrata possa leggere come TRUE o FALSE?
C'é uno terzo stato di un pin oltre uscita HIGH o uscita LOW: entarata alta impedenza.
In questo caso un entrata non legge il terzo stato ma HIGH o LOW a secondo dei disturbi che passano. Serve sempre un Pullup/pulldown per far funzionare la laettura di un pin entrata non connesso.
fitzcarraldo: @paulus1969, usando i pmw non riesco a leggere valori senza variazioni. L analogico in lettura non mi permette di leggere 6 variazioni tra 0v a 5v poiche in lettura i valori oscillano di +1v.
Dipende da come e cosa hai collegato.
Volendo, se vuoi sfruttare gli ingressi analogici, puoi usare sei partitori di tensione differenti che ti forniscono sei diverse tensioni fra 0 e 5 V.
In alternativa, come suggerito, puoi usare porte digitali e fare la scansione. Vedi comunque la discussione suggerita da Standardoil.
Seguendo le vostre piste, sono arrivato a questo primo codice (per il momento ho fatto solo 3 combinazioni invece di 6 giusto per provare). Funziona e compie con le mie aspettative...pero:
Vorrei arrivare a usare le 17 righe che diceva Standardoil nell'altro post e fare qualcosa di meno ridondante Altre piste?
const int LedPin=13;
int Vin1;
int Vin2;
int Vin3;
void setup() {
Serial.begin(9600);
pinMode(LedPin, OUTPUT);
pinMode(9,OUTPUT);
pinMode(10,OUTPUT);
pinMode(11,OUTPUT);
digitalWrite(9,LOW);
digitalWrite(10,LOW);
digitalWrite(11,LOW);
digitalWrite(LedPin,LOW);
}
void loop() {
Vin1=digitalRead(2); //DUE VA CON DIECI
Vin2=digitalRead(3); //TRE VA CON NOVE
Vin3=digitalRead(4); //QUATTRO VA CON UNDICI
Serial.println(Vin1);
Serial.println(Vin2);
Serial.println(Vin3);
digitalWrite(9,HIGH);// SCRIVO SUL NUMERO 9
if (Vin2==1) { // SE IL PRIMO È CONNESSO GIUSTO ALLORA PASSO AL SUCCESSIVO
digitalWrite(9,LOW);
digitalWrite(10,HIGH);
if (Vin1==1) {
digitalWrite(10,LOW);
digitalWrite(11,HIGH);
if (Vin3==1) {
digitalWrite(LedPin,HIGH);
digitalWrite(11,LOW);
}
}
}
else {
digitalWrite(LedPin,LOW);
}
delay(200);
}
esattamente 16 righe, io non parlo mai a vanvera, un solo statement per riga
nessun commento e indentato da fare schifo
ecco la versione "bella"
// di Nelson "StandardOil"
// Idea da sviluppare:
// gioco similsapientino
byte i[10] = {}; // un array di 10 ingressi
byte buzzer = 0; // il pin di uscita del buzzer
byte o[5] = {}; //un array di 5 uscite
void setup(void)
{
for (byte j = 0; j < 5; j++)
{
pinMode(o[j], OUTPUT);
digitalWrite(j, 1);
}
for (byte j = 0; j < 10; j++)
{
pinMode(i[j], INPUT_PULLUP);
}
pinMode(buzzer, OUTPUT);
}
void loop(void)
{
for (byte j = 0; j < 5; j++)
{
// per ogni uscita
digitalWrite(o[j], 0);
// vediamo se sentiamo i due ingressi corrispondenti
if (!digitalRead(o[j * 2]) && !digitalRead(o[j * 2 + 1]))
{
// trovato, segnano basso tutti e due gli ingressi corrispondenti
// accendo un buzzer
digitalWrite(buzzer, 1);
// aspetto un poco
delay(300);
// stacco il buzzer
digitalWrite(buzzer, 0);
}
digitalWrite(o[j], 1); // a posto l'uscita
}
}
PS naturalmente alle vaiabili iniziali, serve di dare i numeri giusti dei piedini