Vai al contenuto
PLC Forum


aiuto programmazione rele con arduino


Francesco Querin

Messaggi consigliati

Francesco Querin
ciao ecco il mio programma non capisco perché i rele si accendono tutti sempre e quando chiaccio si spengono seguendo le istruzioni e poi non  si riaccendono più, invece dovrebbero accendersi solo i rele scelti e solo quando il pulsante e premuto. questi sono i rele che ho preso, presumo che la luce rossa sia il relo in stato di on https://www.amazon.it/gp/product/B00E370JAC/ref=oh_aui_detailpage_o00_s00?ie=UTF8&psc=1

int buttonD = 7;
int buttonE = 8;
int buttonF = 9;
void setup() {
 
  pinMode(buttonD, INPUT);
  pinMode(buttonE, INPUT);
  pinMode(buttonF, INPUT);
  pinMode(10, OUTPUT);
  pinMode(11, OUTPUT);
  pinMode(12, OUTPUT);
  pinMode(13, OUTPUT);
  
}
void loop() {
  if(digitalRead(buttonD)==HIGH)
   {
    digitalWrite(13, HIGH);
    digitalWrite(10, HIGH);
  }
  if(digitalRead(buttonE)==HIGH)
   {
    digitalWrite(13, HIGH);
    digitalWrite(11, HIGH);
  }
  if(digitalRead(buttonF)==HIGH)
   {
    digitalWrite(13, HIGH);
    digitalWrite(12, HIGH);
  }
 
}
 
Link al commento
Condividi su altri siti


Perchè non fai un reset delle condizioni iniziali con la funzione "setup".

Perchè comandi solo le uscite alte. Se vuoi che le uscite si spengano devi comandare le uscite basse.

Poi dovresti fare un antirimbalzo per leggere lo stato del pulsante.

 

Come si accende e si spegne un LED te lo mostra il seplicissimo esempio "blink" il primo che solitamente fa chi inizia ad usare arduino.

Link al commento
Condividi su altri siti

Francesco Querin

questo e il programma completo lasciando stare il servo che non uso quello messo tra i commenti e il programma che vi ho elencato sopra

int tempo = 10;
int buttonA = 4;
int buttonB = 5;
int buttonC = 6;
/*int buttonD = 7;
int buttonE = 8;
int buttonF = 9;
Servo myservo;
*/
void setup() {
 
  pinMode(buttonA, INPUT);
  pinMode(buttonB, INPUT);
  pinMode(buttonC, INPUT);/*
  pinMode(buttonD, INPUT);
  pinMode(buttonE, INPUT);
  pinMode(buttonF, INPUT);*/
  pinMode(0, OUTPUT);
  pinMode(1, OUTPUT);
  pinMode(2, OUTPUT);
  pinMode(3, OUTPUT);/*
  pinMode(10, OUTPUT);
  pinMode(11, OUTPUT);
  pinMode(12, OUTPUT);
  pinMode(13, OUTPUT);*/
 
 
 
}
void loop() {
  if(digitalRead(buttonA)==HIGH)
  for(int marciadestra; marciadestra=digitalRead(buttonC)==LOW; )
  {
    digitalWrite(0, HIGH);
    digitalWrite(1, LOW);
    digitalWrite(2, LOW);
    digitalWrite(3, LOW);
    delay(tempo);
    digitalWrite(0, LOW);
    digitalWrite(1, HIGH);
    digitalWrite(2, LOW);
    digitalWrite(3, LOW);
    delay(tempo);
    digitalWrite(0, LOW);
    digitalWrite(1, LOW);
    digitalWrite(2, HIGH);
    digitalWrite(3, LOW);
    delay(tempo);
    digitalWrite(0, LOW);
    digitalWrite(1, LOW);
    digitalWrite(2, LOW);
    digitalWrite(3, HIGH);
    delay(tempo);
  }
  if(digitalRead(buttonB)==HIGH)
  for(int marciadestra; marciadestra=digitalRead(buttonC)==LOW; )
  {
    digitalWrite(3, HIGH);
    digitalWrite(2, LOW);
    digitalWrite(1, LOW);
    digitalWrite(0, LOW);
    delay(tempo);
    digitalWrite(3, LOW);
    digitalWrite(2, HIGH);
    digitalWrite(1, LOW);
    digitalWrite(0, LOW);
    delay(tempo);
    digitalWrite(3, LOW);
    digitalWrite(2, LOW);
    digitalWrite(1, HIGH);
    digitalWrite(0, LOW);
    delay(tempo);
    digitalWrite(3, LOW);
    digitalWrite(2, LOW);
    digitalWrite(1, LOW);
    digitalWrite(0, HIGH);
    delay(tempo);
  }

  if(digitalRead(buttonD)==HIGH)
  
  {
    digitalWrite(13, HIGH);
    digitalWrite(10, HIGH);
  }
  if(digitalRead(buttonE)==HIGH)
  
  {
    digitalWrite(13, HIGH);
    digitalWrite(11, HIGH);
  }
  if(digitalRead(buttonF)==HIGH)
 
  {
    digitalWrite(13, HIGH);
    digitalWrite(12, HIGH);
  }
 
 
e funziona perfettamente per cui lo ricopio ma non funziona per i motivi elencati sopra
Link al commento
Condividi su altri siti

Quando parti le usicte, nel migliore dei casi, hanno uno stato indeterminato. Con arduino, se non ricordo male, invece sono a livello alto.

Poi la buona progettazione vuole che tutte le variabili siano inizializzate ad uno stato, o ad un valore, ben preciso.

 

Inoltre se vuoi che un'uscita, o una variabile, assuma uno stato od un valore ben preciso devi eseguire un comando specifico.

 

Un programma simile al tuo dovrebbe acquisire lo stato degli ingressi ad in tervalli di tempo prefissati, timicamente 10 ms, verificare che 2 acquisizioni consecutive abbiano il medesimo stato; se, e solo se, si verifica questa condizione si lega il comando allo stato.

Per tornare l tuo programma. Leggi gli ingressi, se un ingresso per 2 volte ha lo stato alto comandi alta l'uscita per il relè; idem se per 2 volte consecutive lo stato è basso comandi a livello basso l'uscita corrispondente.

 

 

Link al commento
Condividi su altri siti

Francesco Querin
quali sono le uscite alte e quali basse ? comunque ho notato che cosi non funziona
int pulsante = 5;
int carico = 3;
void setup() {
pinMode(pulsante,INPUT);
pinMode(5,OUTPUT); 
pinMode(5,HIGH); 
}
void loop() {
 digitalRead(pulsante = HIGH);
 digitalWrite(5, HIGH);
}
 
mentre col programma di sopra si cosi si accende tutte tranne una
int buttonD = 7;
int buttonE = 8;
int buttonF = 9;
void setup() {
 
  pinMode(buttonD, INPUT);
  pinMode(buttonE, INPUT);
  pinMode(buttonF, INPUT);
  pinMode(10, OUTPUT);
  pinMode(11, OUTPUT);
  pinMode(12, OUTPUT);
  pinMode(13, OUTPUT);
 
 
}
void loop() {
 
  if(digitalRead(buttonD)==HIGH)
  {
    digitalWrite(13, LOW);
    digitalWrite(10, LOW);
  }
  if(digitalRead(buttonE)==HIGH)
  {
    digitalWrite(13, LOW);
    digitalWrite(11, LOW);
  }
  if(digitalRead(buttonF)==HIGH)
 
  {
    digitalWrite(13, LOW);
    digitalWrite(12, LOW);
  }
cambiando in HIGH "funziona" perché si accendono e rischecchiano la condizione if ma non si resettano al cessare della condizione if, digitando low come impostazione uscita non funziona non riscpecchia il comando if ed e spento cambiando low con high e come non aver dichiaroto lo stato delle uscite, 
int buttonD = 7;
int buttonE = 8;
int buttonF = 9;
void setup() {
 
  pinMode(buttonD, INPUT);
  pinMode(buttonE, INPUT);
  pinMode(buttonF, INPUT);
  pinMode(10, OUTPUT);
  pinMode(11, OUTPUT);
  pinMode(12, OUTPUT);
  pinMode(13, OUTPUT);
  pinMode(10, HIGH);
  pinMode(11, HIGH);
  pinMode(12, HIGH);
  pinMode(13, HIGH);
 
 
}
void loop() {
 
  if(digitalRead(buttonD)==LOW)
  {
    digitalWrite(13, HIGH);
    digitalWrite(10, HIGH);
  }
  if(digitalRead(buttonE)==LOW)
  {
    digitalWrite(13, HIGH);
    digitalWrite(11, HIGH);
  }
  if(digitalRead(buttonF)==LOW)
 
  {
    digitalWrite(13, HIGH);
    digitalWrite(12, HIGH);
  }
 

}
 
praticamente e spento con o senza pressione del pulsante, cambiando high con low nel comando if e nel comando digital Write si accende e resta acceso con o senza pulsante non ha mai fatto queste cose finora e si che il pin 13 usato come uscita anche in un video tutorial con un programma uguale a questo non dava questi problemi e le uscite o-1-2-3 funzionano perfettamente, ho pensato che if si attiva quando ce la condizione ma non si resetta resta nel suo stato cosi con else ho fatto questo
int buttonD = 7;
int buttonE = 8;
int buttonF = 9;
void setup() {
 
  pinMode(buttonD, INPUT);
  pinMode(buttonE, INPUT);
  pinMode(buttonF, INPUT);
  pinMode(10, OUTPUT);
  pinMode(11, OUTPUT);
  pinMode(12, OUTPUT);
  pinMode(13, OUTPUT);
 
 
 
}
void loop() {
 
  if(digitalRead(buttonD)==HIGH) {digitalWrite(13, HIGH); digitalWrite(10, HIGH); }
  else {digitalWrite(13, LOW); digitalWrite(10, LOW);}
  if(digitalRead(buttonE)==HIGH) {digitalWrite(13, HIGH); digitalWrite(11, HIGH); }
  else {digitalWrite(13, LOW); digitalWrite(11, LOW);}
 
  if(digitalRead(buttonF)==HIGH) {digitalWrite(13, HIGH); digitalWrite(12, HIGH); }
  else {digitalWrite(13, LOW); digitalWrite(12, LOW);}
 
ma non si spegne mai un rele a meno che non siano premuti tutti e 3 i pulsanti contemporaneamete e poi resta da capire perché si accendono dovrebbero essere spenti di base ho visto con le fasi per il passo passo senza la funzione for che quando premevo il pulsante if faceva girare il motore quando lo toglievo si fermava e riprendeva quando era premuto con i rele niente di tutto cio ho dovuto usare else per resettarli
mi spiegate dove sbaglio
scusatemi per il monologo e che dovrei comandare con 3 pulsanti 3 elettrovalvole e una pompa ogni pulsante comanda solo una elettrovalvola e in contemporanea la pompa
Link al commento
Condividi su altri siti

Francesco Querin

  if(digitalRead(buttonD)==HIGH) {digitalWrite(13, HIGH); digitalWrite(10, HIGH); }
  else {digitalWrite(13, LOW); digitalWrite(12, LOW); digitalWrite(11, LOW); digitalWrite(10, LOW); }
  if(digitalRead(buttonE)==HIGH) {digitalWrite(13, HIGH); digitalWrite(11, HIGH); }
  else {digitalWrite(13, LOW); digitalWrite(12, LOW); digitalWrite(11, LOW); digitalWrite(10, LOW); }
 
  if(digitalRead(buttonF)==HIGH) {digitalWrite(13, HIGH); digitalWrite(12, HIGH); }
  else {digitalWrite(13, LOW); digitalWrite(12, LOW); digitalWrite(11, LOW); digitalWrite(10, LOW); }
 
cosi si spengono con tutti i pulsanti accesi e si resettono

  if(digitalRead(buttonD)==HIGH) {digitalWrite(13, HIGH); digitalWrite(10, HIGH); }
 
  if(digitalRead(buttonE)==HIGH) {digitalWrite(13, HIGH); digitalWrite(11, HIGH); }
 
  if(digitalRead(buttonF)==HIGH) {digitalWrite(13, HIGH); digitalWrite(12, HIGH); }
  else {digitalWrite(13, LOW); digitalWrite(12, LOW); digitalWrite(11, LOW); digitalWrite(10, LOW); }
 
cosi solo un pulsante funziona gli altri no

  if(digitalRead(buttonD)==HIGH) {digitalWrite(13, HIGH); digitalWrite(10, HIGH); }
 
  if(digitalRead(buttonE)==HIGH) {digitalWrite(13, HIGH); digitalWrite(11, HIGH); }
  else {digitalWrite(13, LOW); digitalWrite(11, LOW);  }
 
  if(digitalRead(buttonF)==HIGH) {digitalWrite(13, HIGH); digitalWrite(12, HIGH); }
  else {digitalWrite(13, LOW); digitalWrite(12, LOW);  }
 
cosi si spegne solo uno e funziona correttamente il 13 che e il rele 1 dove ce la pompa quello che non funziona si spegne quando i pulsanti sono premuti contemporaneamente
 

  if(digitalRead(buttonD)==HIGH) {digitalWrite(13, HIGH); digitalWrite(10, HIGH); }
 
  if(digitalRead(buttonE)==HIGH) {digitalWrite(13, HIGH); digitalWrite(11, HIGH); }
 
  if(digitalRead(buttonF)==HIGH) {digitalWrite(13, HIGH); digitalWrite(12, HIGH); }
  else {digitalWrite(13, LOW); digitalWrite(12, LOW);  }
 
cosi pero quel solo pulsante funziona se metto più come nell'esempio precedente non funziona il 13 non viene calcolato a meno che non siano tutti premuti, in oltre si attivano subito invece dovrebbero attivarsi quando sono premuti i pulsanti dovrebbe essere
if (condizione) for(condizione) attiva il relle, quando e finito si spenge e si riattiva quando la condizione if e vera come per le fasi nel post precedente
 
 

int buttonD = 7;
int buttonE = 8;
int buttonF = 9;
void setup() {
 
 
  pinMode(buttonD, INPUT);
  pinMode(buttonE, INPUT);
  pinMode(buttonF, INPUT);
  pinMode(10, OUTPUT);
  pinMode(11, OUTPUT);
  pinMode(12, OUTPUT);
  pinMode(13, OUTPUT);
 
 
}
void loop() {
  if(digitalRead(buttonD)==HIGH)
  for(int marciadestra; marciadestra=digitalRead(buttonF)==LOW; )
  {
    digitalWrite(13, HIGH);
    digitalWrite(10, HIGH);
  }
  
  if(digitalRead(buttonE)==HIGH)
  for(int marciadestra; marciadestra=digitalRead(buttonF)==LOW; )
  {
    digitalWrite(13, HIGH);
    digitalWrite(12, HIGH);
   
  }

}
codice delle fasi del motore ricopiato premendo pulsante 1 si spengono i rele selezionati premendo il pulsante 2 idem ma non si resettano alla pressione del pulsante di stop
con l'aggiunta di else e con digitalWrite(13, LOW); ecc per 10 e 12 una volta attivato il pulsante 1 parte ma non posso attivare anche il pulsante 2 finche non stoppo il ciclo
 
Link al commento
Condividi su altri siti

Francesco Querin
infatti caricando il programma per il motore finche tengo premuto il pulsante parte quando non e piu premuto non parte pin usati 0-1-2-3-4-5-6 e i rele sono sempre accesi fin da subito
Link al commento
Condividi su altri siti

Quote

quali sono le uscite alte e quali basse ?

 

Se siamo a questo livello è impossibile continuare.;)

 

Quote

e i rele sono sempre accesi fin da subito

 

ma come hai inizializzato i pin che comadano i relè?

Link al commento
Condividi su altri siti

Francesco Querin
  pinMode(10, OUTPUT);
  pinMode(11, OUTPUT);
  pinMode(12, OUTPUT);
  pinMode(13, OUTPUT);
come output i pin 10-11-12-13, non ho mai sentito di uscite alte e uscite basse nei tutorial o in qualche pdf che spiega come programmare arduino solo di HIGH e LOW
Link al commento
Condividi su altri siti

Ma dai , hai chiesto aiuto ad un forum in italiano ......e cosa vorranno dire High e Low ?

 

Pensavo che Livio avesse esagerato nella prima parte della sua ultima risposta , ma...

Link al commento
Condividi su altri siti

Francesco Querin
sentite non ho studiato queste cose le ho imparate sui tutorial, ho visto HIGH e LOW visti come comando per arduino di mandare alto o basso un pin quando livio ha detto uscite alte e basse mi sono chiesto di che cosa sta parlando vi ricordo che sto facendo da autodidatta non ho studiato elettronica ne programmazione a scuola ho fatto elettricista. Comunque i rele di base mi vanno accesi se li imposto di base LOW non riesco con i comandi HIGH a farli accendere
Link al commento
Condividi su altri siti

Visto che sei autodidatta, ti ho detto guarda l'esempio "blink" quello che fa lampeggiare un led, questo per intenderci

 

// the setup function runs once when you press reset or power the board
void setup() {
  // initialize digital pin LED_BUILTIN as an output.
  pinMode(LED_BUILTIN, OUTPUT);
}

// the loop function runs over and over again forever
void loop() {
  digitalWrite(LED_BUILTIN, HIGH);   // turn the LED on (HIGH is the voltage level)
  delay(1000);                       // wait for a second
  digitalWrite(LED_BUILTIN, LOW);    // turn the LED off by making the voltage LOW
  delay(1000);                       // wait for a second
}

 

Questo ti spiega come si comanda un'uscita par farla stare alta o bassa.

 

Poi carica l'esempio "button" ed impara a far accendere e spegnere un LED; poi sostituisci al LED un relè; infine, quando sei riuscito a far funzionare un relè come vuoi tu, ampli il programma per comandare 4 relè.

 

GUarda anche l'esempio "debounce" che ti insegnacome evitare che i rimbalzi del pulsante cuasino disservizi.

 

La prima cosa da imparare che un problema troppo grosso per essere masticato tutto assieme, come sta facendo tu, va diviso in tanti piccoli problemi che si possono affrontare e risolvere.;)

Link al commento
Condividi su altri siti

Quote

sentite non ho studiato queste cose le ho imparate sui tutorial,

Fortunato tu che ci sono i ''tutorial'' ,

Quote

sto facendo da autodidatta non ho studiato elettronica ne programmazione 

Siamo in tanti , ma con l'aiuto di San Google .....e '' qualche '' notte persa .......:thumb_yello:

Link al commento
Condividi su altri siti

Francesco Querin
const int buttonPin = 2;   
const int ledPin = 13;    
int ledState = HIGH;        
int buttonState;            
int lastButtonState = LOW;  
long lastDebounceTime = 0; 
long debounceDelay = 50;   
void setup() {
  pinMode(buttonPin, INPUT);
  pinMode(ledPin, OUTPUT);
  digitalWrite(ledPin, ledState);
}
void loop() {
 
  int reading = digitalRead(buttonPin);
  if (reading != lastButtonState) {
   
    lastDebounceTime = millis();
  }
  if ((millis() - lastDebounceTime) > debounceDelay) {
   
    if (reading != buttonState) {
      buttonState = reading;
    
      if (buttonState == HIGH) {
        ledState = !ledState;
      }
    }
  }
  digitalWrite(ledPin, ledState);
  lastButtonState = reading;
}
 
esmpio debounce a grandi linee ho capito che ha fatto diverse operazioni per creare delle condizioni ma non mi e chiaro tutte le operazioni che ha fatto, visto esempio blink e esempio button
 
Link al commento
Condividi su altri siti

Come ti ho scritto precedentemente, per prima cosa devi capire bene come si accende e si spegne un LED, perchè comandare un relè, dal punto di vista del Sw, è l'identica cosa.

 

Poi devi capire come si può fare affinchè con un pulsante si comandi l'accensione e lo spegnimento di un LED.

 

Nota queste dichiarazioni: "int lastButtonState = LOW;   int ledState = HIGH;  " oltre dichiarare le varibili ne dichiari lo stato iniziale. In altri termini, ogni volta che il programma ha inizio, dopo un reset o un power on, queste variabili assumono questo stato.

Nella funzione di setup, che viene eseguita una sola volta all'inizio, metti lo stto dell'uscita uguale allo stato dichiarato inizialmente, quindi parti con l'uscita alta.

 

Poi inizi a leggere lo stato dell'ingresso ed a filtrarlo (debouncing).

Leggi e verifichi lo stato attuale confrontando lo con l'ultimo stato memorizzato.

 

Però c'è una questione di metodo nell'impare.

Se tu non hai mai fatto programmi di nessun genere, dovresti seguire passo passo uno dei tanti tutorials su arduino e fare esattamente tutte le prove e gli esempi che questi tutorial prevedono.

Tu sei saltato direttamente ad un'applicazione che è banale per chi sa già programmare bene, ma è molto com plessa e difficile per uno che sta eseguendo i primi programmi.

E' come se una persona che non fosse mai salita su di una bicicletta pretendesse di fare una gimkana tra alcuni ostacoli, finirebbe o per cadere o per sbattere contro gli ostacoli.

Link al commento
Condividi su altri siti

Francesco Querin
grazie ripassero i tutorial e faro le prove con i led e poi con i rele ci risentiamo più avanti adesso mi mettero al lavoro con i led, penso che prima di risentirci passera almeno una settimana
Link al commento
Condividi su altri siti

Mi raccomando: fai un passo alla volta asicurandoti di aver ben compreso quello che ha fatto. Quando sei sicuro, passa la prossimo.

Link al commento
Condividi su altri siti

Francesco Querin
 
void setup() {
pinMode(9,INPUT);
pinMode(4,OUTPUT);
}
void loop() {
 /*
 
  if(digitalRead(9)==HIGH)
  {
  digitalWrite(4, HIGH);
  delay(6000);
  digitalWrite(4, LOW);
  }
  else { digitalWrite(4, HIGH); }
  cosi e come ho fatto per far
 lampeggiare un led 1 led per una volta
 a comando, funziona il led si accende
 e si spegne ma il rele parte subito acceso e
 poi si spegne

if(digitalRead(9)==HIGH)
  {
  digitalWrite(4, LOW);
  delay(6000);
  digitalWrite(4, HIGH);
  }
  else { digitalWrite(4, HIGH); }
cosi il rele parte spento quando premo
il pulsante si accende e poi si spegne
*/
il led quando lo atacco ad arduino e metto il programma parte spento e poi si accende, mentre con lo stesso programma il rele parte al suo stato iniziale come acceso quindi devo fare il programma per il led invertendo cioe dicendogli di spegnerlo, e normale ? ce un modo per farlo iniziare da spento e poi accenderlo senza usare il programma cosi che posso usare il programma premo e accendi ivece di premo e spegni ?

WIN_20170526_15_35_09_Pro.jpg

WIN_20170526_15_36_03_Pro.jpg

Link al commento
Condividi su altri siti

Bisogna vedere come funziona la tua scheda relè.

Se il LED parte spento significa che all'avvio l'uscita che lo comanda è bassa.

Probabilmente la scheda del relè, con il comando basso fa eccitare il relè. BIsogna verificare se è possibile, a livllo di scheda, invertire il comando.

 

Altrimenti ti basta invertire lo stato delle uscite.

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...