Vai al contenuto
PLC Forum


dubbio su I2C


D80

Messaggi consigliati


  • Risposte 66
  • Created
  • Ultima risposta

Top Posters In This Topic

  • D80

    33

  • Livio Orsini

    21

  • ilguargua

    6

  • gabri-z

    2

me lo sono costruito da zero, a parte le palette che mi sono fatto stampare da un amico, ho fissato al perno un disco su cui ho incollato 8 magneti di quelli utilizzati per gli antifurto nelle porte, sul telaio invece è fissato un relè red, quindi in uscita all' anemometro non ho una tensione, ma un contatto pulito che si apre e si chiude , ora questo contatto lo uso per mandare  impulsi di tensione ad un convertitore F/V  ( ho usato un XR4151 che avevo già ) per ottenere una tensione proporzionale al numero degli impulsi ovvero alla velocità del vento,   ora a me serve una soglia minima ed una massima del vento, oltre ad una regolazione della luminosità, quindi ho deciso di crearmi un piccolo pcb con un quadruplo operazionale, con tre circuitini comparatori ho risolto il problema, non ho foto a disposizione ma spero di aver reso almeno l'idea,

 

ps.: ancora non riesco ad accedere dallo smartphone, avete qualche idea?

Link al commento
Condividi su altri siti

Quote

ps.: ancora non riesco ad accedere dallo smartphone, avete qualche idea?

 

Strano, perchè ogni giorno ci sono parecchi accessi da smarphone.

Io ho provato ad accedere al forum tramite il galaxi di mia moglie, senza alcun problema.

 

Quote

ora questo contatto lo uso per mandare  impulsi di tensione ad un convertitore F/V  ( ho usato un XR4151 che avevo già )

 

Non per criticare, ma no la vedo come soluzione ottimale.

Il reed ha comunque una vita limitata, specialmente in caso di commutazioni veloci; poi ha un limite di velocità non molto elevato.

Anche l'uso di XR4115 non è il massimo per stabilità e ripetibilità.

Forse, se proprio vuoi usare un livello analogico, è più semplice calettare le palette sull'albero di un motorino cc da modellistica, usandolo come tachimetrica.

 

Io pensavo di realizzarlo con un disco forato ed una forcella ottica, per poi contare gli impulsi. Quello che mi frega sempre è la realizzazione meccanica. Già son poco portato, poi con il trascorrere degli anni l'agilità dell dita è sempre meno ed anche l'acutezza visiva oramai dipende solo dalle lenti addizionali.:(

 

Link al commento
Condividi su altri siti

hai perfettamente ragione, sarà una delle prossime modifiche da apportare,è un progetto che è soggetto a modifiche sul momento, e non appena rientrerò a casa non vedo l'ora di vederlo funzionare,  anche se di persona non potrò finire di realizzarlo.

domani mattina dovrò entrare nella sala operatoria  per cui non so quando potrò riscrivere,  ma lo farò non appena possibile

 

Link al commento
Condividi su altri siti

ho provato ad accedere ieri ma ero ancora un po' ..."fuori forma "  , ora sto un pochino   meglio ed eccomi qui, oggi passo lo sketch a mio fratello che lo carica sull' arduino e mi fa sapere come funziona, gli ho scritto una per una tutte le operazioni che deve fare per montarlo, sperando che ci riesca , vi farò sapere non appena possibile cosa ne salta fuori,  

Link al commento
Condividi su altri siti

ho passato lo sketch a mio fratello che lo ha   caricato senza problemi, ho fatto fare una simulazione con degli interruttori al posto degli ingressi e dei led per simulare i motori ( ho seguito tutti i passi al telefono ), e con la modalità manuale funziona bene ( premo il pulsante di apertura e apre finchè non scatta il finecorsa, idem per la chiusura, e i sensori risultano esclusi) , con la modalità automatica invece funziona "a rate" nel senso che se sta aprendo e nel frattempo scatta un sensore qualsiasi , la tenda si richiude e aspetta il tempo prestabilito per ripetere la manovra, ma una volta su tre ( in maniera sistematica) la tenda si riapre anche se il sensore di vento o di pioggia stanno sul livello alto, invece di restare chiusa o chiudersi se aperta , probabilmente ho commesso qualche errore nel programma e lo sto cercando, non appena risolvo vi farò sapere

Link al commento
Condividi su altri siti

Come va? Ti stai riprendendo?

Certo che devi proprio avere una gran passione se fai i collaudi per procura.

 

Non è che hai messo dei ritardi bloccanti (delay) ?

Link al commento
Condividi su altri siti

ti ringrazio per l'interessamento, mi sto riprendendo un po' per volta, ma ci ho messo quasi due giorni a riprendermi totalmente dall'anestesia , i medici hanno detto che mi tratterranno ancora qualche giorno e poi finalmente a casa, si è rotto un gradino e sono caduto malamente da una scala,  rompendo tutto  quello che si poteva rompere dell' avanbraccio sinistro ( ulna e radio sia dal lato del polso che del gomito, + una doppia lussazione  nel gomito), oggi mi hanno tolto il gesso per medicarmi e veder i ferri che entrano dentro il polso ed escono dal gomito è stato più impressionante che vedere le lastre.

 

Nonostante tutto  pensare ai miei hobby, agli amici ed al lavoro mi aiuta a non pensare troppo a quello che mi è successo e ad andare avanti, spero solo di riprendermi totalmente il prima possibile,.

 

Tornando all' arduino ho fatto caricare lo stesso sketch che ho postato qualche giorno fa, in pratica dovrebbe funzionare così: per l'apertura automatica della tenda arduino controlla lo stato dei sensori e dei finecorsa, se stanno tutti a riposo ( non rilevano vento sopra la soglia minima, c'è il sole, non c'è pioggia e il contatto del finecorsa è chiuso) arduino da il comando al relè per aprire la tenda, se invece uno dei sensori cambia di stato, arduino lascia la tenda chiusa e aspetta un certo tempo, poi fa nuovamente un'altra verifica dello stato dei sensori e se vede che il sensore che precedentemente aveva cambiato stato risulta a riposo allora aspetta un tempo prestabilito ,fa un'ultima verifica e se conferma nuovamente lo stato di riposo di tutti i sensori apre la tenda, diversamente chiude la tenda se è aperta o non la lascia aprire se chiusa, 

 

per la chiusura automatica, se la tenda è aperta è sufficiente che uno qualsiasi dei sensori cambi di stato

 

so che lo sketch che avevo postato è abbastanza lungo,  e devo aver commesso qualche errore nelle condizioni di verifica dei sensori, lo sto controllando pezzo per pezzo ma qualcosa mi sfugge, non appena troverò la soluzione vi aggiornerò

 

 

 

 

 

 

Link al commento
Condividi su altri siti

ti ringrazio per l'interessamento, mi sto riprendendo un po' per volta, ma ci ho messo quasi due giorni a riprendermi totalmente dall'anestesia , i medici hanno detto che mi tratterranno ancora qualche giorno e poi finalmente a casa, si è rotto un gradino e sono caduto malamente da una scala,  rompendo tutto  quello che si poteva rompere dell' avanbraccio sinistro ( ulna e radio sia dal lato del polso che del gomito, + una doppia lussazione  nel gomito), oggi mi hanno tolto il gesso per medicarmi e veder i ferri che entrano dentro il polso ed escono dal gomito è stato più impressionante che vedere le lastre.

 

Nonostante tutto  pensare ai miei hobby, agli amici ed al lavoro mi aiuta a non pensare troppo a quello che mi è successo e ad andare avanti, spero solo di riprendermi totalmente il prima possibile,.

 

Tornando all' arduino ho fatto caricare lo stesso sketch che ho postato qualche giorno fa, in pratica dovrebbe funzionare così: per l'apertura automatica della tenda arduino controlla lo stato dei sensori e dei finecorsa, se stanno tutti a riposo ( non rilevano vento sopra la soglia minima, c'è il sole, non c'è pioggia e il contatto del finecorsa è chiuso) arduino da il comando al relè per aprire la tenda, se invece uno dei sensori cambia di stato, arduino lascia la tenda chiusa e aspetta un certo tempo, poi fa nuovamente un'altra verifica dello stato dei sensori e se vede che il sensore che precedentemente aveva cambiato stato risulta a riposo allora aspetta un tempo prestabilito ,fa un'ultima verifica e se conferma nuovamente lo stato di riposo di tutti i sensori apre la tenda, diversamente chiude la tenda se è aperta o non la lascia aprire se chiusa, 

 

per la chiusura automatica, se la tenda è aperta è sufficiente che uno qualsiasi dei sensori cambi di stato

 

so che lo sketch che avevo postato è abbastanza lungo,  e devo aver commesso qualche errore nelle condizioni di verifica dei sensori, lo sto controllando pezzo per pezzo ma qualcosa mi sfugge, non appena troverò la soluzione vi aggiornerò

 

 

 

 

 

 

Link al commento
Condividi su altri siti

buona sera a tutti 

finalmente questo pomeriggio  mi hanno dimesso e sto a casa :),

 

domani mi dedicherò nuovamente all' Arduino e se riesco a trovare qualcosa vi aggiornerò appena possibile

 

 

 

 

Link al commento
Condividi su altri siti

Se ti limiti alle prove ed al debug non corri rischi, solo che devi lavorare con una sola mano e la cosa credo sia un po' frustrante.

A me è capitato solo di stare 35 gg con la gamba ingessata, causa rottura del tendine di achille; era l'estate 2013 durante la lunghissima ondata di caldo (tanto per confermare che, come dicono dalle mie parti, "quand ul diavull pica ciapa la mira"). Anche se potevo usare tutte e 2 le mani dovevo interrompere ogni poco perchè se la gamba stava ferma in basso si gonfiava, se la metevo distesa non potevo lavorare al PC. Mi innervosivo tanto che dovevo smettere perchè non riuscivo a concentrarmi.

 

Comunque se fai delle prove ed hai dei problemi puoi sempre postare parte dle codice che vediamo se ti si può aiutre.

Link al commento
Condividi su altri siti

 eccovi nuovamente il programma:

 


const int manualmode = 31;    // interruttore man/auto: man = chiuso(HIGH), auto = aperto (LOW)
const int P1 = 33;            // pulsante apertura manuale (N.O.)
const int P2 = 35;            // pulsante chiusura manuale (N.O.)     N.B:  P1+P2 = pulsante doppio N.O.  con interblocco meccanico 
const int fcap = 37;          // finecorsa tenda aperta (N.C.)
const int fcch = 39;          // finecorsa tenda chiusa (N.C.)
const int sventomin = 41;     // contatto(N.C.)sensore vento soglia minima (soglia tarabile tramite potenziometro pot1)
const int sventomax =43;      // contatto(N.C.)sensore vento soglia massima (soglia tarabile tramite potenziometro pot2)
const int spioggia = 45;      // contatto  sensore pioggia (N.O. in assenza di pioggia)
const int slum = 47;          // contatto rele sensore luminosità (N.O. in condizioni di bassa luminosità tarabile tramite potenziometro pot3)
const int out1 = 49;          // uscita relè apertura
const int out2 = 51;          // uscita relè chiusura


// impostazione stati iniziali degli ingressi

int manualmodeState = 0;
int P1State = 0;         
int P2State = 0; 
int fcapState = 0;
int fcchState = 0;
int sventominState = 0;
int sventomaxState =0;
int spioggiaState = 0;
int slumState = 0;
 

// settaggio ingressi/uscite:

 
 void setup(){
pinMode(manualmode,INPUT);
pinMode(P1, INPUT);
pinMode(P2, INPUT);
pinMode(fcap, INPUT);
pinMode(fcch, INPUT);
pinMode(sventomin, INPUT);
pinMode(sventomax, INPUT);
pinMode(spioggia, INPUT);
pinMode(slum, INPUT);
pinMode(out1,OUTPUT);
pinMode(out2,OUTPUT);
}

// istruzioni:


void loop() {

 
if (out1 == HIGH )
   {digitalWrite(out2,LOW);}                                                                    // autoesclusione di chiusura se apertura è attiva

if (out2 == HIGH)
   {digitalWrite(out1,LOW);}                                                                    // autoesclusione di apertura se chiusura è attiva


   // modalità manuale:

   // apertura tenda
 
if (digitalRead(manualmode == HIGH),digitalRead(P1 == HIGH),digitalRead (fcap == HIGH)  )   // modalità manuale impostata,pulsante apertura premuto, finecorsa apertura a riposo
     {digitalWrite(out1, HIGH); }                                                                                                         // azionamento relè apertura tenda

if (digitalRead(manualmode == HIGH),digitalRead(P1 == HIGH),digitalRead (fcap == LOW)  )    // modalità manuale impostata,pulsante apertura premuto, finecorsa apertura attivo
   {digitalWrite(out1, LOW); }                                                                                                           // apertura non attiva se arriva a finecorsa e si continua a tenere premuto il pulsante

if (digitalRead(manualmode == HIGH),digitalRead(P1 == LOW),digitalRead (fcap == HIGH)  )    // modalità manuale impostata,pulsante apertura non premuto, finecorsa apertura a riposo
   {digitalWrite(out1, LOW); }                                                                                                            // apertura non attiva

if  (digitalRead(manualmode == HIGH),digitalRead(P1 == LOW),digitalRead (fcap == LOW)  )    // modalità manuale impostata,pulsante apertura non premuto, finecorsa apertura attivo
    {digitalWrite(out1, LOW); }                                                                                                          // apertura non attiva

 

 

                                                                                                                                     // chiusura tenda

 

 

if (digitalRead(manualmode == HIGH),digitalRead(P2 == HIGH),digitalRead (fcch == HIGH)  )    // modalità manuale impostata,pulsante chiusura premuto, finecorsa chiusura a riposo
     {digitalWrite(out2, HIGH); }                                                                                                         // azionamento relè chiusura tenda

if (digitalRead(manualmode == HIGH),digitalRead(P2 == HIGH),digitalRead (fcch == LOW)  )     // modalità manuale impostata,pulsante chiusura premuto, finecorsa chiusura attivo
     {digitalWrite(out2, LOW); }                                                                                                          // disinserzione relè chiusura tenda se arriva a finecorsa e si continua a tenere premuto il pulsante

if (digitalRead(manualmode == HIGH),digitalRead(P2 == LOW),digitalRead (fcch == HIGH)  )     // modalità manuale impostata,pulsante chiusura non premuto, finecorsa chiusura ariposo
   {digitalWrite(out2, LOW); }                                                                                                            // chiusura non attiva

if  (digitalRead(manualmode == HIGH),digitalRead(P2 == LOW),digitalRead (fcch == LOW)  )     // modalità manuale impostata,pulsante apertura non premuto, finecorsa apertura attivo
    {digitalWrite(out2, LOW); }                                                                                                           // chiusura non attiva

 

 

                                                                                                                                // modalità automatica:

 

 

                                                                                                                                          // apertura:
if (digitalRead(manualmode == LOW),digitalRead(sventomin == LOW),digitalRead(spioggia==LOW), digitalRead(slum==HIGH),digitalRead(fcap==HIGH)) //verifica stato sensori
   {delay (5000);}                                                                                                                                                                                                                            // attende 5 secondi
if (digitalRead(manualmode == LOW),digitalRead(sventomin == LOW),digitalRead(spioggia==LOW), digitalRead(slum==HIGH),digitalRead(fcap==HIGH)) //seconda verifica condizioni
   {digitalWrite(out1, HIGH);}  // apertura della tenda se si ripetono le condizioni iniziali

 

 

else
   {digitalWrite(out1, LOW);}                                                                                                                 // altrimenti non apre la tenda

 

// chiusura:

if  (digitalRead(manualmode == LOW),digitalRead(sventomin == LOW),digitalRead(spioggia==LOW), digitalRead(slum==HIGH),digitalRead(fcch==LOW)) // verifica stato sensori
{digitalWrite(out2, LOW);}                                                                                                                                                            // se sono rispettate le condizioni non chiude la tenda   

 

else
   {digitalWrite(out2, HIGH);}             // altrimenti chiude la tenda                                           
 }

 

 

 

 

non capisco se  è il ripetersi della verifica dello stato dei sensori dopo il delay a causare il problema, inoltre come vedete non usato istruzioni particolarmente complesse, riuscite per caso a vedere dove sta il problema? io  purtroppo non lo vedo

 

 

 

Link al commento
Condividi su altri siti

48 minuti fa, D80 scrisse:

if (digitalRead(manualmode == HIGH),digitalRead(P1 == HIGH),digitalRead (fcap == HIGH)  )

 

Questo codice, anche se sintatticamente corretto, sicuramente non fa quello che intendi. Se vuoi che tutte le condizioni siano vere devi mettere tra gli operandi un operatore "AND" , quindi :

 

if( (condizione1) && (condizione2) && (condizione3))

 

 

Ciao, Ale.

Link al commento
Condividi su altri siti

Ho seguito solo sporadicamente questa discussione, quindi non ricordo se ti siano già stati dati consigli in tal senso, credo che ora tu stia facendo delle prove simulando i vari sensori per provare il programma, e questo va anche bene, ma così come lo hai concepito tutto l'insieme a poche possibilità di funzionare una volta installato. Parli di pulsanti, sensori, fine corsa, tutta roba che dovrà essere installata con cablaggi piuttosto lunghi e quindi proni ad intercettare disturbi. L'assunzione sbagliata da parte dei principianti con arduino è che se ad un ingresso non porto il positivo questo sia necessariamente basso, ma non è così, un ingresso non collegato a niente è per sua natura indefinito. Per ovviare a questo devi garantire che ogni ingresso che usi abbia sempre uno stato definito da te imposto. Arduino ti viene incontro in questo con i suoi pull-up interni, che collegano internamente una resistenza verso il positivo. Si attivano usando pinMode(pin, INPUT_PULLUP). Fatto questo devi cablare tutti i tuoi pulsanti/sensori in maniera che chiudano verso il negativo, quindi nel tuo programma avrai digitalRead(pin) == HIGH per il pulsante inattivo e digitalRead(pin) == LOW per il pulsante attivo. Tieni conto che in caso di cablaggi particolarmente lunghi (qualche metro sicuramente, nel tuo caso) le resistenze interne di pullup possono non bastare, nel caso le devi aggiungere esternamente.

 

Mi associo a tutti gli altri negli auguri di pronta guarigione.

 

Ciao, Ale.

Link al commento
Condividi su altri siti

2 ore fa, D80 scrisse:

{delay (5000)

 

Questi ritardi sono bloccanti, è sempre consigliabile non usarli se non per brevissime temporizzazioni.

Io uso un interrupt a tempo generato dal timer1 (solitamente) per andare a veriifcare stati di variabili e/o condizioni che necessitano di temporizzazioni come, ad esempio, il debouncing degli ingressi da pulsante o da contatto elettromeccanico.

Link al commento
Condividi su altri siti

Vi ringrazio per tutti per i suggerimenti, ho avuto delle esperienze simili in precedenza riguardo allo stato dei contatti aperti, ( non con Arduino però ma con altre piattaforme meno note basate su micro  z8088), quindi avevo già forzato le uscite aperte ma  a livello basso ( con delle resistenze esterne da 2.2kohm tra GND e l'input), comunque ho recepito i messaggi e sto provvedendo a modificare lo sketch e lo schema , ve lo posterò appena finito

 

 

Link al commento
Condividi su altri siti

ho modificato lo sketch togliendo i delay e usando l'operato booleano and  al post6o della virgola, così sembra funzionare:

la devo collaudare però in condizioni instabili, non appena provo vi aggiornerò subito

 

 

 

const int manualmode = 31;    // interruttore man/auto: man = chiuso(HIGH), auto = aperto (LOW)
const int P1 = 33;            // pulsante apertura manuale (N.O.)
const int P2 = 35;            // pulsante chiusura manuale (N.O.)     N.B:  P1+P2 = pulsante doppio N.O.  con interblocco meccanico 
const int fcap = 37;          // finecorsa tenda aperta (N.C.)
const int fcch = 39;          // finecorsa tenda chiusa (N.C.)
const int sventomin = 41;     // contatto(N.C.)sensore vento soglia minima (soglia tarabile tramite potenziometro pot1)
const int sventomax =43;      // contatto(N.C.)sensore vento soglia massima (soglia tarabile tramite potenziometro pot2)
const int spioggia = 45;      // contatto  sensore pioggia (N.O. in assenza di pioggia)
const int slum = 47;          // contatto rele sensore luminosità (N.O. in condizioni di bassa luminosità tarabile tramite potenziometro pot3)
const int out1 = 49;          // uscita relè apertura
const int out2 = 51;          // uscita relè chiusura
int manualmodeState = 0;
int P1State = 0;         
int P2State = 0; 
int fcapState = 0;
int fcchState = 0;
int sventominState = 0;
int sventomaxState =0;
int spioggiaState = 0;
int slumState = 0;
 void setup(){
pinMode(manualmode,INPUT);
pinMode(P1, INPUT);
pinMode(P2, INPUT);
pinMode(fcap, INPUT);
pinMode(fcch, INPUT);
pinMode(sventomin, INPUT);
pinMode(sventomax, INPUT);
pinMode(spioggia, INPUT);
pinMode(slum, INPUT);
pinMode(out1,OUTPUT);
pinMode(out2,OUTPUT);
}
void loop() {
if (out1 == HIGH )
   {digitalWrite(out2,LOW);} 
if (out2 == HIGH)
   {digitalWrite(out1,LOW);}                                                                    
if (digitalRead(manualmode == HIGH)&&digitalRead(P1 == HIGH)&&digitalRead (fcap == HIGH)   )
     {digitalWrite(out1, HIGH); }                                                           
if (digitalRead(manualmode == HIGH)&&digitalRead(P1 == HIGH)&&digitalRead (fcap == LOW)  )  
   {digitalWrite(out1, LOW); }                                                              
if (digitalRead(manualmode == HIGH)&&digitalRead(P1 == LOW)&&digitalRead (fcap == HIGH)  )  
   {digitalWrite(out1, LOW); }                                                              
if  (digitalRead(manualmode == HIGH)&&digitalRead(P1 == LOW)&&digitalRead (fcap == LOW)  )  
    {digitalWrite(out1, LOW); }                                                             
if (digitalRead(manualmode == HIGH)&&digitalRead(P2 == HIGH)&&digitalRead (fcch == HIGH)  ) 
     {digitalWrite(out2, HIGH); }                                                           
if (digitalRead(manualmode == HIGH)&&digitalRead(P2 == HIGH)&&digitalRead (fcch == LOW)  )  
     {digitalWrite(out2, LOW); }                                                            
if (digitalRead(manualmode == HIGH),digitalRead(P2 == LOW)&&digitalRead (fcch == HIGH)  )
   {digitalWrite(out2, LOW); }                                                          
if  (digitalRead(manualmode == HIGH),digitalRead(P2 == LOW)&&digitalRead (fcch == LOW)  )
    {digitalWrite(out2, LOW); }                                                         
if (digitalRead(manualmode == LOW)&&digitalRead(sventomin == LOW)&&digitalRead(spioggia==LOW)&& digitalRead(slum==HIGH)&&digitalRead(fcap==HIGH))
      {digitalWrite(out1, HIGH);}                                                                                                         
else
   {digitalWrite(out1, LOW);}
if  (digitalRead(manualmode == LOW)&&digitalRead(sventomin == LOW)&&digitalRead(spioggia==LOW)&& digitalRead(slum==HIGH)&&digitalRead(fcch==LOW)) 
{digitalWrite(out2, LOW);}                                                                                                                       
else
   {digitalWrite(out2, HIGH);}                                                        
 }

Link al commento
Condividi su altri siti

Crea un account o accedi per commentare

Devi essere un utente per poter lasciare un commento

Crea un account

Registrati per un nuovo account nella nostra comunità. è facile!

Registra un nuovo account

Accedi

Hai già un account? Accedi qui.

Accedi ora

×
×
  • Crea nuovo/a...