Show Posts
Pages: 1 2 3 [4] 5 6 ... 23
46  International / Generale / Re: Meeting robotica amatoriale e Arduino a Roma on: February 11, 2014, 06:27:16 am
Bellissima iniziativa  smiley
Un'occhiata vengo di sicuro a darla.

Riccardo
47  International / Megatopic / Re: Ardu-Acquarium Controller v. 3.0 on: February 11, 2014, 04:29:39 am
Eagle ftp://ftp.cadsoft.de/eagle/program/6.5/eagle-win-6.5.0.exe, è il migliore che abbia mai usato, ma nella versione free limita le dimensioni dei Pcb a cm 8x10, quando ho bisogno di farne di più grandi passo a Designspark http://www.designspark.com/.
Avevo iniziato ad usare Kicad, tutto lo schema generale è disegnato così, ma poi mi sono accorto che il passaggio dallo schema al pcb è macchinoso e personalmente, non mi sono trovato bene.

Ciao
48  International / Megatopic / Re: Ardu-Acquarium Controller v. 3.0 on: February 10, 2014, 03:28:06 am
Ciao Michele,
se sei riuscito a comandare i pcf, hai già fatto un passo verso la scrittura della tua procedura, se hai visto il mio codice, vedrai che c’è una procedurina LetturaDataOra(); che ad ogni ciclo legge l’RTC e aggiorna le variabili “ora” e “minuti” che puoi sfruttare per i confronti per quando devi eseguire i comandi di attivazione dei dosatori.
I dosatori stessi, li puoi pilotare per intervalli di tempo prestabiliti sfruttando la funzione millis() tra gli esempi dell’IDE File/Esempi/02.Digital/BlinkWithoutDelay c’è questo che ti spiega come fare ed a questo link: http://www.leonardomiliani.com/2013/programmiamo-i-compiti-con-millis/ trovi un approfondimento del nostro moderatore che ti mette al riparo anche dall’overflow di millis() che da solo si azzera ogni xx giorni.
Comincia da qui per scrivere la procedura che comanderà i dosatori, quando avrai qualcosa di funzionante potrai scrivere la procedura che attraverso un’interfaccia a display permetterà ad un utente di impostare i parametri che desidera per il funzionamento dei dosatori e che salverà le impostazioni nella eprom di Arduino.
Fatte le due cose precedenti, integrerai tutto nel mio codice.
Insomma fai un passo alla volta, vedrai che arrivi a dama…  smiley
Purtroppo, malgrado l’argomento dosatori mi intrighi, io non riesco a trovare il tempo per avanzare con il progetto attuale  smiley-sweat, ancora meno per scrivere codice ad altri, oltretutto non avendo nemmeno i dosatori, non potrei fare prove veramente efficaci, ma ti ho dato credo i suggerimenti più indicati perché tu possa farlo da solo e ti assicuro che non è difficile, serve solo un po’ di tempo e pazienza per acquisire il minimo di rudimenti necessari.
Ho visto il tuo PCB…
La prima cosa che mi viene di dirti è abbandona Fritzing!!!
La seconda è che le piste dei mosfet che comanderanno le strip led anche così ad occhio sono troppo sottili, questo è un limite delle strip, sono comodissime da usare, montare e scaldano relativamente poco (soprattutto se confrontate ai power led), ma richiedono un sacco di corrente, quindi in base alla lunghezza di quelle che userai, dovrai sapere la corrente che devi erogare e di conseguenza dimensionare le piste.
Il resto faccio un po’ fatica a capirlo, senza schema è un po’ difficile, oltretutto non è che io sia poi così bravo in elettronica, ti ricordo che sono un’autodidatta…  smiley-red
Ciao Riccardo.
49  International / Megatopic / Re: Ardu-Acquarium Controller v. 3.0 on: February 08, 2014, 02:07:25 pm
Ciao Michele,
hai la procedura che comanda le pompe?

50  International / Generale / Re: Lettura Tasti con PCF8574 on: February 08, 2014, 02:06:18 pm
Ciao a tutti,
grazie anche al contributo del buon Leouz, sono arrivato ad una versione dello sketch più stabile, la metto in allegato.
Cosa ne pensate?

Code:
#include <Wire.h>

#define buzzer 14
#define keyboard 0x39 //PCF8574AP A0 VCC A1,A2 GND

byte appoggio,tasto;
volatile boolean counter = false;
boolean rstpcf;
const byte sx = 193;
const byte dx = 194;
const byte dec = 196;
const byte inc = 200;
const byte ok = 208;
const byte esc = 224;
const byte Null = 192;
unsigned long oldtasto;

void statotasto()
{ counter = !counter;
}

byte read_pcf(int indirizzo)
{ byte statoIOpcf;
Wire.beginTransmission(indirizzo); // prima lettura per resettare il pcf ed attivare il piedino int
Wire.requestFrom(indirizzo, 1);
if(Wire.available())
statoIOpcf = Wire.read();
Wire.endTransmission();
return statoIOpcf;
}

void leggitasto()
{ if (counter)
{ if (millis() - oldtasto >= 250)
{ appoggio = read_pcf(keyboard);
rstpcf = true;
switch (appoggio)
{ case sx:
Cicalino(240);
tasto = appoggio;
break;

case dx:
Cicalino(240);
tasto = appoggio;
break;

case dec:
Cicalino(220);
tasto = appoggio;
break;

case inc:
Cicalino(220);
tasto = appoggio;
break;

case ok:
Cicalino(200);
tasto = appoggio;
break;

case esc:
Cicalino(180);
tasto = appoggio;
break;

default:
counter = false;
read_pcf(keyboard);
tasto = 0;
rstpcf = false;
break;
}
oldtasto = millis();
}
}
else { 
if (rstpcf)
{ read_pcf(keyboard);
tasto = 0;
counter = false;
rstpcf = false;
}
}

}

void Cicalino (byte tono)
{ for (int i = 0; i < 90; i++)
{ digitalWrite(buzzer,HIGH);
delayMicroseconds(tono);
digitalWrite(buzzer,LOW);
delayMicroseconds(tono);
}
}

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

pinMode(buzzer, OUTPUT);

read_pcf(keyboard);

attachInterrupt(0, statotasto, FALLING);

}

void loop()
{ leggitasto();

}

Ciao Riccardo.
51  International / Generale / Re: Lettura Tasti con PCF8574 on: February 05, 2014, 02:33:04 pm
Ciao a tutti,
chiedo scusa, ma mi sono accorto che lo sketch non funziona bene, soprattutto se integrato in sketch più grandi tipo quello del mio controller, di seguito metto lo sketch ulteriormente rielaborato:
Code:
#include <Wire.h>

#define buzzer 14
#define keyboard 0x39 //PCF8574AP A0 VCC A1,A2 GND


const byte sx = 193;
const byte dx = 194;
const byte dec = 196;
const byte inc = 200;
const byte ok = 208;
const byte esc = 224;

unsigned long oldtasto;
byte tasto;
volatile byte counter = 0;
boolean rstpcf;

void readpcf()
{ Wire.beginTransmission(keyboard); // prima lettura per resettare il pcf ed attivare il piedino int
Wire.requestFrom(keyboard, 1);
if(Wire.available())
tasto = Wire.read();
Wire.endTransmission();
}

void statotasto()
{ counter++;
}

void leggitasto()
{ if (counter == 1)
{ if ((millis() - oldtasto >= 300) || (millis() - oldtasto >= 10) && tasto == 0)
{ readpcf();
rstpcf = true;
Serial.print("Tasto usatoo: ");
switch (tasto)
{ case sx:
Cicalino(240);
Serial.println("SX");
break;

case dx:
Cicalino(240);
Serial.println("DX");
break;

case dec:
Cicalino(220);
Serial.println("DEC");
break;

case inc:
Cicalino(220);
Serial.println("INC");
break;

case ok:
Cicalino(200);
Serial.println("OK");
break;

case esc:
Cicalino(180);
Serial.println("ESC");
break;
}
oldtasto = millis();
}
}

else {
if (rstpcf==true)
{ counter = 0;
readpcf();
tasto=0;
Serial.print("Tasto usato: "); Serial.println(tasto);
rstpcf = false;
}
}

}

void Cicalino (byte tono)
{ for (int i = 0; i < 90; i++)
{ digitalWrite(buzzer,HIGH);
delayMicroseconds(tono);
digitalWrite(buzzer,LOW);
delayMicroseconds(tono);
}
}

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

pinMode(buzzer, OUTPUT);

readpcf();

attachInterrupt(0, statotasto, FALLING);

}

void loop()
{ leggitasto();

}

e qui quello che succede nel seriale:

Code:
Tasto usatoo: INC
Tasto usato: 0
Tasto usatoo: INC
Tasto usatoo: INC
Tasto usatoo: INC
Tasto usatoo: INC
Tasto usato: 0
Tasto usatoo: SX
Tasto usatoo: SX
Tasto usato: 0
Tasto usatoo: SX
Tasto usato: 0
Tasto usatoo: ESC
Tasto usato: 0
Tasto usatoo: ESC
Tasto usato: 0
Tasto usatoo: ESC
Tasto usatoo: ESC
Tasto usatoo: ESC
Tasto usato: 0
Tasto usatoo: DX
Tasto usato: 0
Tasto usatoo: DX
Tasto usato: 0
Tasto usatoo: DX
Tasto usatoo: DX
Tasto usato: 0
Tasto usatoo: OK
Tasto usato: 0
Tasto usatoo: OK
Tasto usato: 0
Tasto usatoo: OK
Tasto usatoo: OK
Tasto usatoo: OK
Tasto usatoo: OK
Tasto usato: 0
Tasto usatoo: ESC
Tasto usato: 0

In pratica se premo i tasti “normalmente” tutto funziona apparentemente a dovere, singola pressione e pressione mantenuta va tutto benne, ma se premo velocemente i tasti ecco che, perdo il controllo dell’INT del PCF e/o della variabile counter, poi a volte continuando a premere la situazione si normalizza di nuovo, altre la lettura tasti smette di funzionare completamente ovvero INT va fuori controllo credo alto e la ISR non funziona più., ecco il seriale

Code:
Tasto usatoo: DEC
Tasto usato: 0
Tasto usatoo: DEC
Tasto usato: 0
Tasto usatoo: DEC
Tasto usato: 0
Tasto usatoo: Tasto usatoo: Tasto usatoo: Tasto usatoo: Tasto usatoo: Tasto usatoo: Tasto usato: 0
Tasto usatoo: Tasto usatoo: Tasto usatoo: Tasto usatoo: Tasto usatoo: Tasto usatoo: Tasto usato: 0
Tasto usatoo: Tasto usatoo: Tasto usatoo: Tasto usatoo: Tasto usato: 0
Tasto usatoo: Tasto usatoo: Tasto usatoo: Tasto usato: 0
Tasto usatoo: DEC
Tasto usato: 0
Tasto usatoo: DEC
Tasto usato: 0

Notate che quando scrive usatoo con due è rimane dentro la if dei,
quando scrive usato con una o sola è dentro l’else.
A pagina 9 di questo link:
http://www.ti.com/lit/an/scpa032/scpa032.pdf
C’è qualcosa sull’INT del PCF che non riesco a tradurre, forse qualcuno di voi riesce a farmi capire qualcosa…

Grazie in anticipo per il tempo che vorrete dedicarmi.
52  International / Generale / Re: Lettura Tasti con PCF8574 on: February 01, 2014, 12:57:22 pm
Ciao e scusa,
il 7 è un mio errore di battitura, la sigla giusta è PCF8574 o PCF8574A.

Riccardo
53  International / Generale / Re: Lettura Tasti con PCF8574 on: February 01, 2014, 08:17:19 am
Ho aggiornato scheda e pcb, seguendo il consiglio di Etemenanki...
Metto in allegato quì e sul primo post.

Ancora grazie a tutti.
54  International / Generale / Re: Lettura Tasti con PCF8574 on: February 01, 2014, 05:56:14 am
@ leo72
Figurati no problem...

@ Etemenanki
Grazie ancora!!!
55  International / Generale / Re: Lettura Tasti con PCF8574 on: February 01, 2014, 05:45:46 am
@Etemenanki
Grazie per il tempo che mi stai dedicando...  smiley
ti scrivo come ho ragionato, ma ricorda che sono un autodidatta, quindi ti prego non scatenare una delle tue guerre termonucleari  smiley-razz ...
1. Leggo i tasti con il pcf, quindi l'isteresi di arduino di cui avevo letto qualche tempo fa anche io non l'ho considerata
2. Ho pensato che i rimbalzi dei tasti potessero a lungo andare o generare errori di lettura del pcf stesso o comunque danneggiarlo in qualche modo
3. Nei miei esperimenti iniziali proprio il bouncing mi ha dato più di un grattacapo (leggi tastini o bread di scarsa qualità o mia incapacità stessa), il tarlo/ansia del debouncing ormai mi accompagna, ma ho cercato cmq una soluzione relativamente semplice.
4. Ho voluto usare la porta logica proprio per mandare al PCF uno stato logico pulito e blindarne la lettura, poi l'SN74HC14 costa veramente una sciocchezza.
5. Ho visto anche io soluzioni in cui si usano gli zener, ma proprio per avere un circuito un pochino più semplice li ho evitati, leggendoti poi in relazione alla lunghezza dei cavi, se guardi il pcb il problema non lo ho quindi preferisco non metterli ma implementare la resistenza che mi hai suggerito.
Grazie ancora.

@leo72
Grazie, ho imparato un'altra cosa anche io.

Ciao Riccardo.

Ciao Riccardo.
56  International / Generale / Re: Lettura Tasti con PCF8574 on: February 01, 2014, 04:09:12 am
Ciao Etemenanki,
grazie, mi stai suggerendo quindi un circuito come quello in allegato?

Ciao Riccardo.
57  International / Generale / Re: Lettura Tasti con PCF8574 on: February 01, 2014, 03:41:20 am
1. Ho visto che esegui un blocco di codice solo se la pressione del pulsante è avvenuta a più di 200 ms dalla precedente. E' una specie di debounce, per evitare che l'utente si diverta a pigiare sui pulsantini magari 2 volte, o mi sbaglio?
Comunque, tu fai un'assegnazione a oldtasto del valore di millis, poi esegui tutta la pappardella del blocco di codice. Se la metti in fondo al blocco, quell'assegnazione, in questo modo la prox volta il controllo viene eseguito su 200 ms dal termine del blocco di codice. Consideri, cioè, una specie di "comporto" tutto qui  smiley-wink

2. if (counter) equivale ad un if(counter>=1) oppure a if(counter!=0).
Non vedo perché non debba funzionare, a meno che non abbia tralasciato qualche altra porzione del tuo codice che fa qualcos'altro.

Ciao Leo,
ora ho compreso la parte 1 ed ho modificato lo sketch.
Per la parte 2, non ho tralasciato nessuna parte di codice.
Provo a spiegare cosa succede nello sketch:
1. premo il tasto e la ISR statotasto() incrementa counter a 1
2. leggitasto verifica counter ed esegue la lettura del pcf, qui di fatto può effettivamente valere solo la condizione if (counter == 1) ciò è dovuto al fatto che la ISR si riattiva anche se rilascio a causa del fatto che INT del PCF si disattiva e dopo una lettura torna basso ed ecco quindi che la condizione if (counter) equivale ad un if(counter>=1) oppure a if(counter!=0) mi fa rientrare nella lettura effettiva del tasto e non reset del PCF che di fatto esegue si una lettura ma ha lo scopo di riattivare appunto l'INT del PCF, non o se sono riuscito a farmi capire, ma di fatto è ciò che succede.
3. rilascio il tasto INT del PCF va basso per il motivo di cui sopra, la ISR statotasto incrementa nuovamente counter che diventa 2 ed attiva l'else in cui resetto il pcf con una lettura a vuoto ed azzero la variabile tasto.

Complimenti e grazie per la condivisione.
Una cosa pero'
Nel titolo citi pcf8574 ma nel post PCF8774AP, quale usi?

Hai ragione, in effetti esistono due versioni di questo expander: PCF8574 e PCF8574A, i miei hanno anche una P finale ma non so cosa significhi.
Di fatto in ogni caso le differenza tra le due versioni è unicamente nell'indirizzamento degli IC, in allegato ti ho messo delle immagini che spero spieghino quello che ho appena scritto  smiley-wink

Ciao Riccardo.

P.S. In allegato anche il codice corretto con il suggerimento di Leo sulla variabile oldtasto.

58  International / Generale / Re: Lettura Tasti con PCF8574 on: January 31, 2014, 02:19:05 pm
Intanto mi segno e ti faccio i complimenti per la realizzazione.
Nel fine settimana leggo tutto con calma.

Grazie Paolo, aspetto le tue conclusioni  smiley

Complimenti!  smiley

Grazie, ma non è che abbia fatto poi chissa cosa, ho voluto però condividere per i principianti come me..

Complimenti per il progettino.
Due suggerimenti, sono sciocchezze, ma mi preme dirle perché poi te le ritrovi anche in altri progetti  smiley-wink
1. Quando nei casi in cui usi millis per il debounce, io suggerisco di fare l'assegnazione alla variabile che contiene il momento dell'attivazione all'uscita del blocco di codice.
Tu fai un oldtasto = millis() prima di eseguire diverse cose che ti portano via del tempo, comprese accesi sul bus I2C e scritture seriali. Perdi poco, ma quel poco in caso di un intoppo potrebbe diventare molto. E sfalsarti il dato.

2. Fai un controllo if (counter == 1) per controllare se è stato premuto un tasto, ma c'è la possibilità che counter possa diventare maggiore di 1?
Per evitare questi dubbi, farei un controllo generico sul fatto che counter sia 0 o maggiore, quindi metterei un semplice if(counter), che risulta vero in tutti i casi in cui counter abbia un valore diverso da 0.

Grazie Leo, ma perdonami se non ho capito bene cosa vuoi dirmi...
1. Non ho usato millis per fare il debounce, di fatto è proprio quello che ho cercato di evitare complicando, ma nemmeno poi tanto, la parte hardware, in realtà oldtasto lo uso per fare un timing sulla ripetizione del valore del tasto nel caso lo si tenga premuto, appena lascio tasto torna=0.
2. Appena ti ho letto, ho subito pensato che era così, ma appena ho provato, leggitasto() ha smesso di funzionare, ma non ho capito perché...  smiley-red

Ciao Riccardo.
59  International / Generale / Lettura Tasti con PCF8574 on: January 31, 2014, 12:55:53 pm
Ciao a tutti,  smiley
purtroppo, con il mio progetto, per motivi vari sono un po’ fermo, così mi concentro un po’ sulle ottimizzazioni…
Una cosa che volevo fare da tempo, era migliorare la lettura dei tasti: attualmente, nel mio sketch, vengono letti utilizzando la libreria IOexp che interroga a ripetizione il PCF8774AP a cui sono collegati i tasti sperando che prima o poi venga premuto un tasto, di fatto il bus I2C è perennemente spazzolato inutilmente e questo non mi piaceva affatto…
L’obiettivo quindi era interrogare il PCF incriminato solo se effettivamente premo un tasto ed ho avuto il compito facilitato dal PCF stesso che ha un bel piedino INT open drain, ovvero attivo quando è basso (ha bisogno di una R di pull up da 4K7).
Mi ha un po’ messo in difficoltà perché a causa di un’errata traduzione del datasheet, non avevo capito che ad ogni lettura l’INT si disabilita, poi però è andato tutto bene, in allegato c’è lo sketch (che poi implementerò in quello del controller), nel quale è incluso anche l’utilizzo di un buzzer per avere un feedback sonoro quando viene premuto un tasto.
Non contento del lavoro fatto, mi sono dedicato sul lato hardware al debouncing dei tasti, attualmente, sempre nel mio progetto, uso un semplice circuito basato su RC, ma non ero soddisfatto, così ho voluto migliorare anche questa parte; ho fatto un po’ di ricerche ed alla fine ho scelto di realizzare quello che ho trovato a questo link: http://www.ikalogic.com/de-bouncing-circuits/
Fatte un po’ di prove su breadboard, ho disegnato il circuitino ed il PCB in allegato che poi diventerà il modulo tasti del mio progetto. Non sono ancora però sicuro di aver fatto un buon lavoro, così eccomi a chiedervi cosa ne pensate.  smiley-red
Grazie in anticipo per il tempo che vorrete dedicarmi.

Documentazione:
http://www.ti.com/lit/ds/symlink/pcf8574a.pdf
http://www.settorezero.com/wordpress/utilizzare-l-io-expander-pcf8574/
http://www.ti.com/lit/ml/scyb031/scyb031.pdf
http://www.ikalogic.com/de-bouncing-circuits/

P.S. Ho postato in “Generale” generale perché tratto sia di hardware che di software e non nel topic del mio progetto, perché ho pensato che l’input con i tasti così come l’ho realizzato può tornare utile in altre applicazioni, spero di aver fatto la cosa giusta.


60  International / Megatopic / Re: Ardu-Acquarium Controller v. 3.0 on: January 18, 2014, 02:02:16 pm
Ciao Michele,
perdonami ma no ti capisco, cosa intendi per

ma non riesco a capire dove e come inserire ImpostaDosatore

Se intendi la funzione/procedura la puoi mettere ovunque purché al di fuori del setup e del loop. poi la richiami nel loop dove ti serve, di più non so cosa dirti.
Mi pare di capire poi che userai una seconda scheda relè giusto? non so come funziona un dosatore, ma sono un pò perplesso...
poi che senso ha modificare tutto lo scketch principale se ti manca ancora la procedura/funzione che pilota i dosatori e la procedura/funzione che acquisisce i dati di funzionamento dei dosatori, diciamo che quest'ultima la puoi non fare se inserisci dati direttamente nello sketch, rimane scomodo pero questo caso perché ogni volta che vuoi aggiornare i dati in questione devi riflashare Arduino.
In pratica ti ridò il consiglio che ti ho dato inizialmente, non partire dalla fine, scrivi prima cio che ti serve per far funzionare i dosatori quando avrai qualcosa di funzionante modifichi lo sketch principale per inserire ciò che hai fatto.
Ciao e buon fine settimana  smiley
Pages: 1 2 3 [4] 5 6 ... 23