Pages: [1]   Go Down
Author Topic: Auito su codice per lettura potenziometro e relè  (Read 1332 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 46
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Buon pomeriggio a tutti.
Dopo il vostro prezioso aiuto ricevuto in questo post: http://arduino.cc/forum/index.php/topic,111010.msg834050.html#msg834050 sono finalmente riuscito nel mio intento.
Ho quindi acquistato un potenziometro rotativo 10k ohm 10 giri come questo: http://it.rs-online.com/web/p/potenziometri/4867093/ ed ho scritto subito il codice che però non fa esattamente ciò che voglio.
Questo è il mio codice:
Code:
const double sensore = 0;
double Ohm=0;
double giri = 0.0;

void setup() {
  Serial.begin(9600);
}
void loop() {
  Serial.print("Lettura: ");
  Ohm=(map(analogRead(sensore),0,1023,0,10000));
  Serial.print(Ohm);
  Serial.print(" Ohm");
  Serial.print(" equivalenti a ");
  giri=Ohm/1000;
  Serial.print(giri);
  Serial.print(" giri ");
  Serial.print(map((Ohm/1000),0,7.165,0,100));
  Serial.println("% di apertura");
  delay(200);
}

Questo è l'output:

Lettura: 0.00 Ohm equivalenti a 0.00 giri 0% di apertura
Lettura: 29.00 Ohm equivalenti a 0.03 giri 0% di apertura
Lettura: 68.00 Ohm equivalenti a 0.07 giri 0% di apertura
Lettura: 117.00 Ohm equivalenti a 0.12 giri 0% di apertura
Lettura: 156.00 Ohm equivalenti a 0.16 giri 0% di apertura
Lettura: 205.00 Ohm equivalenti a 0.20 giri 0% di apertura
Lettura: 254.00 Ohm equivalenti a 0.25 giri 0% di apertura
...

Lettura: 899.00 Ohm equivalenti a 0.90 giri 0% di apertura
Lettura: 948.00 Ohm equivalenti a 0.95 giri 0% di apertura
Lettura: 997.00 Ohm equivalenti a 1.00 giri 0% di apertura
Lettura: 1055.00 Ohm equivalenti a 1.05 giri 14% di apertura
Lettura: 1085.00 Ohm equivalenti a 1.09 giri 14% di apertura
Lettura: 1124.00 Ohm equivalenti a 1.12 giri 14% di apertura
...

Lettura: 1915.00 Ohm equivalenti a 1.91 giri 14% di apertura
Lettura: 1964.00 Ohm equivalenti a 1.96 giri 14% di apertura
Lettura: 2023.00 Ohm equivalenti a 2.02 giri 28% di apertura
Lettura: 2072.00 Ohm equivalenti a 2.07 giri 28% di apertura
Lettura: 2121.00 Ohm equivalenti a 2.12 giri 28% di apertura
...
Lettura: 2903.00 Ohm equivalenti a 2.90 giri 28% di apertura
Lettura: 2961.00 Ohm equivalenti a 2.96 giri 28% di apertura
Lettura: 3010.00 Ohm equivalenti a 3.01 giri 42% di apertura
Lettura: 3049.00 Ohm equivalenti a 3.05 giri 42% di apertura
...

Lettura: 3939.00 Ohm equivalenti a 3.94 giri 42% di apertura
Lettura: 3988.00 Ohm equivalenti a 3.99 giri 42% di apertura
Lettura: 4027.00 Ohm equivalenti a 4.03 giri 57% di apertura
Lettura: 4056.00 Ohm equivalenti a 4.06 giri 57% di apertura
...

Lettura: 4936.00 Ohm equivalenti a 4.94 giri 57% di apertura
Lettura: 4985.00 Ohm equivalenti a 4.99 giri 57% di apertura
Lettura: 5053.00 Ohm equivalenti a 5.05 giri 71% di apertura
Lettura: 5102.00 Ohm equivalenti a 5.10 giri 71% di apertura
...

Lettura: 5923.00 Ohm equivalenti a 5.92 giri 71% di apertura
Lettura: 5972.00 Ohm equivalenti a 5.97 giri 71% di apertura
Lettura: 6031.00 Ohm equivalenti a 6.03 giri 85% di apertura
Lettura: 6099.00 Ohm equivalenti a 6.10 giri 85% di apertura
...

Lettura: 6950.00 Ohm equivalenti a 6.95 giri 85% di apertura
Lettura: 6989.00 Ohm equivalenti a 6.99 giri 85% di apertura
Lettura: 7038.00 Ohm equivalenti a 7.04 giri 100% di apertura
Lettura: 7096.00 Ohm equivalenti a 7.10 giri 100% di apertura


Da ciò si evince primo che non è estremamente preciso e secondo che mancano molte altre percentuali stampando solo infatti queste: 0%, 14%,28%, 42%, 57%, 71%, 85% e 100%.

Il secondo problema che incontro invece è che per far aprire e chiudere la tenda mi sono collegato in parallelo ai già esistenti pulsanti con due relè. Uno per il segnale di apertura  ed uno per quello di chiusura.
Mi sono però accorto che premendo i pulsanti arriva il segnale alla tenda solo dopo circa tre secondi. Se durante il movimento (salita o discesa) pigio nuovamente il pulsante per un tempo inferiore ai tre secondi mi interrompe l'avanzamento e si ferma nella posizione da me desiderata.
Questo però non è possibile con arduino perchè inviando per esempio il segnale di apertura mi eccita per tre secondi il relè per poi diseccitarlo subito dopo (per non avere il pulsante sempre sotto tensione).

Code:
digitalWrite(RCH2, HIGH);
delay(2500);
digitalWrite(RCH2, LOW);

Come faccio quindi ad aprire la tenda solo parzialmente? Devo calcolare quanto tempo impiega ad aprirsi totalmente e da lì inviare il segnale solo per N secondi corrispondenti a quanti centimetri voglio che si apra?
Grazie infinite per i vostri preziosi consigli.
« Last Edit: November 17, 2012, 10:13:26 am by ziopippo » Logged

Selvazzano Dentro - Padova
Offline Offline
Edison Member
*
Karma: 45
Posts: 1517
"Chi sa fa, chi non sa insegna"
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Purtroppo hai fatto un acquisto errato: il potenziometro è di tipo logaritmico e non lineare.

E' del tutto normale che al 5° giro non segni il 50% ma un valore diverso (70%).

Per evitare di comprare un altro (costoso!) potenziometro, puoi compensare la curva logaritmica con una crescita anti logaritmica, ma è un po' complicato, senza conoscere il tipo di curva (sul datasheet è indicato solo la crescita per il tipo lineare).

Dovrebbe essere di tipo naturale, quindi logaritmo in base "e".
« Last Edit: November 17, 2012, 03:00:45 pm by cyberhs » Logged

Torino
Offline Offline
God Member
*****
Karma: 3
Posts: 766
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Bentrovato ziopippo,se il potenziometro che hai acquistato è proprio quello del link ha ragione cyberhs,è un logaritmico....
Logged

Torino
Offline Offline
God Member
*****
Karma: 3
Posts: 766
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Guardando bene i valori a me sembra però che il potenziomentro sia lineare.......
Quote
Lettura: 997.00 Ohm equivalenti a 1.00 giri 0% di apertura
Lettura: 2023.00 Ohm equivalenti a 2.02 giri 28% di apertura
Lettura: 3010.00 Ohm equivalenti a 3.01 giri 42% di apertura
Lettura: 7096.00 Ohm equivalenti a 7.10 giri 100% di apertura
Come si vede da quì, quando il potenziometro ha compiuto 1 giro ha 1K,quando ne ha compiuti 7 di giri ha come valore 7K....
Il fatto che leggi solo alcune delle percentuali da te attese
Quote
Da ciò si evince primo che non è estremamente preciso e secondo che mancano molte altre percentuali stampando solo infatti queste: 0%, 14%,28%, 42%, 57%, 71%, 85% e 100%
dipende dalla mappa che hai creato ovvero
Quote
Serial.print(map((Ohm/1000),0,7.165,0,100));
hai diviso un valore di 100 per 7,165 =14,28.    Quindi ogni valore di soglia della mappa è pari a circa 14 che arrotondando per difetto diventa 28,42,56,70,84,98.
Quindi secondo me devi solo modificare la mappa...
Ciao
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 46
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Innanzi tutto grazie per le risposte.
tonid ha centrato proprio in pieno il mio problema.
Il link che ho messo (haimè da ignorante in elettronica) non è il modello che ho io ma quello che più gli assomigliava esteticamente  smiley-red
Quando l'ho acquistato il negoziante mi chiese se lo volevo lineare o logaritmico ma come si dice... "non sapendo ne leggere ne scrivere" ho chiesto il lineare e credo mi abbia dato quello. Provandolo con un tester infatti un giro corrispondeva a 1k e mezzo a 0.5K.
Forse cyberhs è stato tratto in inganno sicuramente dall'errato link ma credo anche dal fatto che non ho trascritto tutti i valori dell'output durante il movimento della tenda per non far diventare il post chilometrico. Ho optato infatti di trascrivere solo due coppie di dati tra un cambio e l'altro delle percentuali.
Credo quindi che l'errore sia proprio nella mappa ed è questo l'aiuto che avevo chiesto  smiley-razz

dipende dalla mappa che hai creato ovvero
Quote
Serial.print(map((Ohm/1000),0,7.165,0,100));
hai diviso un valore di 100 per 7,165 =14,28.    Quindi ogni valore di soglia della mappa è pari a circa 14 che arrotondando per difetto diventa 28,42,56,70,84,98.
Quindi secondo me devi solo modificare la mappa...
Ciao


L'asta della tenda dove è collegato il potenziometro, quando è tutta aperta fa circa 7,5 giri. Ho pensato quindi di urare questa mappa poichè secondo me il mio 100% equivale a 7,5 giri ovvero  7.50 che poi ho modificato in 7.165 essendo l'ultimo valore letto da arduino.
« Last Edit: November 17, 2012, 08:28:55 pm by ziopippo » Logged

Torino
Offline Offline
God Member
*****
Karma: 3
Posts: 766
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ciao,io farei una proporzione così 7500ohm stanno a 10000ohm come 100% sta a "x"%
x=(10000x100)/7500=133,3 %
In pratica leggendo il potenziometro al suo massimo valore(10K) otterrai 133% mentre se il valore del pot è ad esempio 2,5K sarà 33,3%,a 5K sarà 66,6%,a 7,5K sarà 99,9%.
La mappa sarà quindi :    Serial.print(map((Ohm),0,10000,0,133.3));
ed otterrai una lettura ogni (10000/133=) 75ohm sul valore del pot.
Spero ti sia utile smiley-wink
Ciao

« Last Edit: November 18, 2012, 03:53:09 am by tonid » Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 46
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

 smiley-money GRANDIOSO! Funziona alla perfezione grazie mille! Però ho impostato il valore così Serial.print(map((Ohm),0,10000,0,140)); altrimenti al massimo valore non mi dava il 100% ma arrivava solo al 99%.
Grazie ancora!!!

Ora mi resta solo di capire come risolvere il problema dell'apertura parziale e mettere tutto su pachube.
A tutto questo accrocco ho anche infatti collegato due DHT11 uno per l'interno ed uno per l'esterno di cui uno (quello esterno) sicuramente lo cambierò con il DHT22. Voglio quindi capire come fare per mandare i valori a pachube visto che negli esempi si parla sempre di settare i pin analogici e solo per max due valori mentre io vorrei inviare sia la temperatura che l'umidità per entrambi i sensori.  smiley-razz
Logged

Torino
Offline Offline
God Member
*****
Karma: 3
Posts: 766
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
GRANDIOSO! Funziona alla perfezione grazie mille! Però ho impostato il valore così Serial.print(map((Ohm),0,10000,0,140)); altrimenti al massimo valore non mi dava il 100% ma arrivava solo al 99%.
Grazie ancora!!
Figurati !
Per l'apertura parziale cosa avevi in mente,ovvero come volevi gestire la cosa?
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 46
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Non ho postato il codice completo ma ho preso spunto dall'app DomoticHome di Bl4d3 che però mi da molti problemi specialmente con due sensori e con la versione 4 (Icecream ) di android.
Ho quindi adattato il codice alle mie esigente per creare un app (per ora senza grafica) per il mio telefono. Funziona tutto correttamente e appena ho un pochino di tempo in più mi dedico anche alla grafica ed a renderlo più generalizzato, nel senso che per ora se aggiungo un sensore sono costretto a riscrivere l'app.
Logged

Torino
Offline Offline
God Member
*****
Karma: 3
Posts: 766
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ho capito.
Per la gestione da parte di arduino nei confronti della tenda dicevi che avevi dei problemi ma non ho ben capito la storia del segnale.

Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 46
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ho capito.
Per la gestione da parte di arduino nei confronti della tenda dicevi che avevi dei problemi ma non ho ben capito la storia del segnale.



cosa non ti è chiaro?
Logged

Torino
Offline Offline
God Member
*****
Karma: 3
Posts: 766
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
Il secondo problema che incontro invece è che per far aprire e chiudere la tenda mi sono collegato in parallelo ai già esistenti pulsanti con due relè. Uno per il segnale di apertura  ed uno per quello di chiusura.
Mi sono però accorto che premendo i pulsanti arriva il segnale alla tenda solo dopo circa tre secondi. Se durante il movimento (salita o discesa) pigio nuovamente il pulsante per un tempo inferiore ai tre secondi mi interrompe l'avanzamento e si ferma nella posizione da me desiderata.
Questo però non è possibile con arduino perchè inviando per esempio il segnale di apertura mi eccita per tre secondi il relè per poi diseccitarlo subito dopo (per non avere il pulsante sempre sotto tensione).

Code:
digitalWrite(RCH2, HIGH);
delay(2500);
digitalWrite(RCH2, LOW);

Come faccio quindi ad aprire la tenda solo parzialmente? Devo calcolare quanto tempo impiega ad aprirsi totalmente e da lì inviare il segnale solo per N secondi corrispondenti a quanti centimetri voglio che si apra?
Grazie infinite per i vostri preziosi consigli.
Quello che non mi è molto chiaro è
-se premi il pulsante per aprire la tenda e lo rilasci subito,la tenda inizia il movimento ?
-oppure dopo che son trascorsi i 3 secondi con il pulsante mantenuto premuto?
-quando la tenda è partita e desideri che si fermi ,basta premere un qualunque pulsante o quello che avevi premuto prima ?
-hai per caso a disposizione un filo nella centralina che dia una qualche uscita che ti possa far capire che il motore è in movimento ?

Credo di aver capito che la tenda parte dopo 3 secondi che tieni premuto il pulsante (come fosse una sicurezza) e se tu ecciti il relè ed aspetti un qualche feedback di partenza motore dalla centralina (se lo hai) puoi usarlo per disattivare il relè che simula la pressione del pulsante ed inizi a leggere il potenziomentro fino ad arrivare al valore % di apertura/chiusura che desideri simulando una pressione del pulsante al momento giusto.
Il problema è riuscire a dire alla tenda fino a che punto deve muoversi ma visto che devi farti un'applicazione dovresti crearti una variabile grafica che abbia un valore compreso tra 0% e 100% ed appena la tenda inizia il movimento possa confrontare la variabile grafica con quella della lettura analogica del potenziometro .
In questo modo prima di far partire il comando apri/chiudi,setti il valore della variabile e poi mandi il comando alla tenda.

Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 46
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Quello che non mi è molto chiaro è
-se premi il pulsante per aprire la tenda e lo rilasci subito,la tenda inizia il movimento ?
-oppure dopo che son trascorsi i 3 secondi con il pulsante mantenuto premuto?
-quando la tenda è partita e desideri che si fermi ,basta premere un qualunque pulsante o quello che avevi premuto prima ?
-hai per caso a disposizione un filo nella centralina che dia una qualche uscita che ti possa far capire che il motore è in movimento ?

Credo di aver capito che la tenda parte dopo 3 secondi che tieni premuto il pulsante (come fosse una sicurezza) e se tu ecciti il relè ed aspetti un qualche feedback di partenza motore dalla centralina (se lo hai) puoi usarlo per disattivare il relè che simula la pressione del pulsante ed inizi a leggere il potenziomentro fino ad arrivare al valore % di apertura/chiusura che desideri simulando una pressione del pulsante al momento giusto.
Il problema è riuscire a dire alla tenda fino a che punto deve muoversi ma visto che devi farti un'applicazione dovresti crearti una variabile grafica che abbia un valore compreso tra 0% e 100% ed appena la tenda inizia il movimento possa confrontare la variabile grafica con quella della lettura analogica del potenziometro .
In questo modo prima di far partire il comando apri/chiudi,setti il valore della variabile e poi mandi il comando alla tenda.

La tenda parte solo dopo circa tre secondi dalla pressione del tasto, se lo premo solo per pochi secondi non accade nulla.
Quando la tenda è partita è sufficiente premere uno dei due tasti (salita o discesa) per arrestare il movimento.
Da quello che ho potuto notare dalla centralina arrivano in casa tre fili: un comune, uno per la salita ed uno per la discesa. Basta mettere a massa uno dei due fili (salita o discesa) con il comune per iniziare il movimento. Non so quindi se ne esiste uno che mi comunica se è in movimento o meno (proprio per questo ho deciso di collegarci il potenziometro).
Settare una variabile grafica non so se potrebbe essere una buona soluzione in quanto via wireless o soprattutto via internet (fuori casa) presumo che i tempi di risposta non siano in tempo reale per cui perderei "tempo prezioso" per arrestare il movimento.
Logged

Torino
Offline Offline
God Member
*****
Karma: 3
Posts: 766
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
La tenda parte solo dopo circa tre secondi dalla pressione del tasto, se lo premo solo per pochi secondi non accade nulla.
Quando la tenda è partita è sufficiente premere uno dei due tasti (salita o discesa) per arrestare il movimento.
Da quello che ho potuto notare dalla centralina arrivano in casa tre fili: un comune, uno per la salita ed uno per la discesa. Basta mettere a massa uno dei due fili (salita o discesa) con il comune per iniziare il movimento. Non so quindi se ne esiste uno che mi comunica se è in movimento o meno (proprio per questo ho deciso di collegarci il potenziometro).
Settare una variabile grafica non so se potrebbe essere una buona soluzione in quanto via wireless o soprattutto via internet (fuori casa) presumo che i tempi di risposta non siano in tempo reale per cui perderei "tempo prezioso" per arrestare il movimento.
Bhe era una idea su come si poteva impostare la cosa.....non ho mai fatto applicazioni di questo tipo ma credo che i dati,una volta iniziata la trasmissione, arrivino velocemente e mandando prima i dati relativi alla variabile e poi lo start non ci dovrebbe essere il problema ma come ti dicevo non ho esperienza diretta quindi non so darti certezza. 
Logged

Pages: [1]   Go Up
Jump to: