Progetto Cassaforte

Ciao a tutti sono Edoardo uno studente di elettronica.

Vorrei chiedervi una mano con questo progetto: una cassaforte fatta con 2 Arduino Uno usando I2C.
Ciò che non riesco a fare è mettere la password programmabile da tastierino. Spero che possiate illuminarmi sul problema.

Lascio qua i link del programma:

Master

Slave

Buongiorno e benvenuto sul forum,
essendo il tuo primo post, nel rispetto del regolamento, ti chiedo cortesemente di presentarti QUI (spiegando bene quali conoscenze hai di elettronica e di programmazione ... possibilmente evitando di scrivere solo una riga di saluto) e di leggere con MOLTA attenzione il su citato REGOLAMENTO ... Grazie.

Guglielmo

P.S.: Qui una serie di link utili, NON necessariamente inerenti alla tua domanda:
- serie di schede by xxxPighi per i collegamenti elettronici vari: ABC - Arduino Basic Connections
- pinout delle varie schede by xxxPighi: Pinout
- link generali utili: Link Utili

Ho scaricato i tuoi sorgenti ma non ho capito cosa fa il programma :wink:
Per inserire e controllare un PIN-PASSWORD si potrebbe fare in poche righe di codice, acquisisco una stringa e la confronto col codice segreto, il tutto si farebbe con poche righe di codice...

Visto la quantità di codice scritto e la sua complessità "giustificata o inutile è da stabilire o relativo", sarebbe saggio descrivere il comportamento del programma con uno PSEUDOCODICE, per capire come si dovrebbe comportare il programma e riuscire a capire i sorgenti.

Quindi penso che tu debba descrivere passo passo cosa dovrebbe fare il programma, altrimenti non penso che qualcuno perda tempo per cercare di capirlo dai pochi commenti presenti :slight_smile:

Ho commentato tutto il programma.
Comunque:
Ho usato 2 arduino Uno perchè non mi bastavano i pin digitali.
Sul secondo Arduino ho collegato il Display,
sul primo ho collegato il tastierino, il LED RGB, il buzzer e il servo.

ho un tastierino numerico 3x4 e lo controllo usando la libreria keymap.h,
come output visivo uso un display a cristalli liquidi
(nel file “Slave.ino” ho impostato 4 lingue che cambio con un pulsante).

Quando devo inserire il pin visualizzo sul display “Inserisci il PIN”.
Per confermare il pin uso la key “" e per resettare la key “#”.
Quando premo un tasto del tastierino (key) lampeggia una volta il LED RGB di blu ed emetto una nota con il buzzer, e ad ogni key inserita aggiungo un "
” sul display nella riga sotto a “Iserisci il PIN”.
Se il codice inserito è corretto accendo il LED RGB di verde e ruoto il servo di 90°,
e visualizzo sul display “Codice Corretto!” (nella lingua selezionata).
Dopo disabilito gli imput, le note e il lampeggio del LED RGB a tutte le key tranne quella del reset.
Se è errato faccio lampeggiare il LED RGB di rosso e emetto un allarme con il buzzer,
e visualizzo sul display “Codice Errato!” (nella lingua selezionata) e poi si resetta.

Se proprio non ci capite niente, potete aiutarmi a metterla usando solo il tastierino, poi ci penso io ad adattarlo nel mio programma.
Il controllo del tastierino lo ho adattato da questo:

#include <Keypad.h>

const byte ROWS = 4; //four rows
const byte COLS = 3; //three columns
char keys[ROWS][COLS] = {
  {'1','2','3'},
  {'4','5','6'},
  {'7','8','9'},
  {'#','0','*'}
};
byte rowPins[ROWS] = {5, 4, 3, 2}; //connect to the row pinouts of the keypad
byte colPins[COLS] = {8, 7, 6}; //connect to the column pinouts of the keypad

Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );

void setup(){
  Serial.begin(9600);
}

void loop(){
  char key = keypad.getKey();

  if (key != NO_KEY){
    Serial.println(key);
  }
}

Schema Elettronico

Grazie 1K per la disponibilità.

Francamente, non capisco perche' non ti dovrebbero bastare i pin ... arduino ha 14 pin utilizzabili ... ...un paio per un display I2C, se vuoi metterlo ... per il tastierino ne pui usare 7 (matrice), e siamo a 9 ... uno per il motore dei chiavistelli (apre ad 1 e chiude a 0, ad esempio, con due micro che fanno da finecorsa in modo da arrestare il motore quando arriva tutto aperto o tutto chiuso) e sei a 10 ... un'altro micro per sapere se lo sportello e' completamente chiuso o no (in modo da non azionare il chiavistello in chiusura quando lo sportello e' aperto) e sei ad 11 ... te ne avanzano ancora tre per il resto ... :wink:

Sono 19 i pin digitali che uso guarda lo schema:
Schema Elettronico

ok, ma se tu facessi come dice @etem.... con solo una UNO risolvi


e non è che un adattatore I2C per LCD csta una fortuna link

scusa ma non sapevo della loro esistenza, grazie per avermelo detto e anche dello schema;
ho provveduto ad acquistarne uno, mi hai semplificato il progetto.
Comunque il mio problema non era questo ma creare una password programmabile possibilmente usando la libreria Keymap

eppure ad usare google vengono fuori decine di esempi cercando "password keypad arduino"

http://playground.arduino.cc/Main/KeypadPassword

http://www.arduinotronics.com/password-di-accesso-con-arduino-tramite-keypad/
etc etc etc

Ciao, ieri mi è arrivato l'adattatore I2C (il chip sul modulo è il PCF8574A1), allora lo provo usando l'esempio "Hello word" della libreria liquidcrystalI2C. Il problema è che non va: sullo schermo del display (LCM1602C) sulla prima riga rimangono accesi tutti i led (ho provato anche a regolare il trimmer ma non cambia nulla). Ho anche provato a usare lo scanner I2C (per trovare l'indirizzo) ma non trova niente. Ho controllato anche i contatti col tester e sono a posto. Come potrei risolvere? Vi allego foto.
Grazie per la disponibilità.

20170511_162326[1].jpg

Ho anche provato a usare lo scanner I2C (per trovare l'indirizzo) ma non trova niente

Avrai invertito l' SCL con l' SDA

brunello22:
Avrai invertito l' SCL con l' SDA

Esatto, oppure quell'interfaccia I2C usa un indirizzamento diverso dal solito 0x27. Oppure non ha inizializzato correttamente la libreria o ha usato un esempio per una libreria diversa da quella effettivamente installata (purtroppo ce ne sono almeno 2 di librerie che si chiamano LiquidCrystal_I2C...)..

Vedere QUI.

Ho ricontrollato i collegamenti, li ho rifatti, ho provato svariate librerie liquidcrystalI2C, ho rifatto più volte la scansione dei moduli i2c, a questo punto potrebbe essere difettoso il modulo che ho ricevuto.
Se volete vedere codici e modulo:
IIC/I2C/TWI/SPI Serial Interface Board Module Port Arduino 1602 2004LCD Display
I2C Scanner

P.S. Il modulo funziona su tutti i display? io ho il display dello starter kit.

TheVezz:
... ho rifatto più volte la scansione dei moduli i2c ...

... e ? ? ? Quale è stato il risultato della scansione ? Individuato l'indirizzo I2C del modulo (... dalla descrizione, se non lo hai cambiato, dovrebbe essere 0x20) ? Hai messo le resistenze di pull-up (... la descrizione NON dice che sono già a bordo) ?

Guglielmo

Il risultato dell scansione è questo:

I2C Scanner
Scanning...
No I2C devices found

Comunque non ho messo resistenze di pull-up perchè non cerano negli schemi.
E di indirizzi ho provato da 0x20 a 0x27.

Ok, quindi ... o hai invertito SCL ed SDA o NON hai messo le resistenze di pull-up ... quale delle due ?

Guglielmo

Uhm, sul discorso delle resistenze non capisco bene, io ho usato almeno 4 display con I2C, sia già cablati sia acquistati separatamente e saldati da me e non ho mai usato resistenze di pullup, e tutti erano con indirizzo 0x27.
Per cui secondo me o, come dici tu, ha invertito SDA con SCL, o non ha fatto bene qualche saldatura, o sta usando la libreria sbagliata.

docdoc:
Uhm, sul discorso delle resistenze non capisco bene, io ho usato almeno 4 display con I2C, sia già cablati sia acquistati separatamente e saldati da me e non ho mai usato resistenze di pullup, e tutti erano con indirizzo 0x27.

Mah … se leggi la descrizione di quell’interfaccia vedi che NON parla mai delle pull-up (… però potrebbero effettivamente esserci e non essere indicate) e dice che l’indirizzo di default è 0x20 ma può essere impostato nel range 0x20 … 0x27 (difatti ha tre piazzole a saldare A0, A1, A2).

La libreria non c’entra nulla con lo scanner I2C che NON rileva la schedina … o è sbagliato il collegamento SCL/SDA o non è alimentata correttamente o non ci sono le pull-up oppure è guasta …
… altre cose, a livello I2C scanner non ce ne sono. ::slight_smile:

Guglielmo

gpb01:
Mah ... se leggi la descrizione di quell'interfaccia vedi che NON parla mai delle pull-up (... però potrebbero effettivamente esserci e non essere indicate)

Beh confermo che io, pur avendone usate 4 o 5 diverse e da fornitori diversi, non ho mai avuto necessità di pull-up.

e dice che l'indirizzo di default è 0x20 ma può essere impostato nel range 0x20 .. 0x27 (difatti ha tre piazzole a saldare A0, A1, A2).

Beh giusto per mia curiosità, queste sono le connessioni e la tabella per l'indirizzamento (e che conservo nella mia "libreria" di schemi e connessioni, magari è utile anche ad altri):

Quindi è strano perché nelle schedine che ho io, ho sempre trovato l'indirizzo a 0x27 (come indicato anche in questa immagine), ossia le piazzole disconnesse.
D'altronde, mia ipotesi, se fosse 0x20 significherebbe tutti i ponticelli saldati e sarebbe difficile dissaldare le connessioni, è più semplice fare saldature ponticellando i pin liberi.

La libreria non c'entra nulla con lo scanner I2C che NON rileva la schedina ...

Giusto, usa solo la Wire quindi se non la rileva, il problema è più "grave".

A questo punto direi che resta solo o una saldatura non corretta/fredda dell'interfaccia (o un residuo di stagno che mette in corto due pin), o il collegamento SCL/SDA sbagliato (questo è il più facile da verificare e correggere), o la schedina è difettosa.

docdoc:
....nelle schedine che ho io, ho sempre trovato l'indirizzo a 0x27 (come indicato anche in questa immagine), ossia le piazzole disconnesse ...

Riporto testualmente:

I2C Address: 0X20~0X27 (the original address is 0X20,you can change it yourself)

ora, o è un idiota il venditore e da indicazioni errate (... cosa estremamente probabile :grin: ) , oppure hanno usato una logica inversa ... mah ::slight_smile:

Comunque, come si diceva ... il problema è ancora più a monte ... lo scanner I2C NON vede nulla e questo è a livello collegamento !

Guglielmo