Torna indietro   BaroneRosso.it - Forum Modellismo > Elettronica > Circuiti Elettronici


Rispondi
 
Strumenti discussione Visualizzazione
Vecchio 22 marzo 18, 10:35   #1 (permalink)  Top
User
 
L'avatar di pavmail
 
Data registr.: 19-02-2009
Residenza: Scorzè (VE)
Messaggi: 44
Immagini: 2
Help con arduino

Salve a tutti.

Mi servirebbe gentilmente una dritta su come realizzare un programmino che mi permetta di fare una cosa abbastanza banale, ma visto che per me è la prima volta che prendo in mano questa scheda e il suo software....... non ne vengo fuori.

In pratica devo applicare 2 finecorsa ad un motore che funzionano con questa logica:

SW1=OFF SW2=OFF -> Motore acceso
SW1=ON SW2=OFF -> Motore acceso
SW1=ON SW2=ON -> Motore fermo

A questo punto il motore deve ripartire quando entrambi ritornano in OFF.

Allego anche l'immagine esplicativa: in pratica devo riempire un tubo fino ad un certo livello, fermare il motore e fare in modo che riparta quando il tubo si svuota.

Grazie per l'attenzione.

Immagini allegate
Tipo file: jpg Immagine.jpg‎ (26,2 KB, 138 visite)
pavmail non è collegato   Rispondi citando
Vecchio 22 marzo 18, 12:39   #2 (permalink)  Top
User
 
L'avatar di madqwerty
 
Data registr.: 18-05-2013
Residenza: Chivasso (TO)
Messaggi: 2.352
ti serve una struttura "switch-case" https://www.arduino.cc/reference/en/...re/switchcase/ che rilevi le condizioni (i 2 stati dei finecorsa e lo stato del motore) e ne imponga di nuove, quando necessario e in accordo alla tua logica di funzionamento.

la struttura deve essere eseguita ciclicamente, o alla massima velocità nel ciclo while della funzione main(), oppure temporizzata agganciandola a un timer.

Switch-case richiede di funzionare con una sola variabile ma tu ne hai 3 e dovresti "impacchettarle" per ridurle a una (per gestire le tue condizioni ti servono 3 bit e qualsiasi variabile ne contiene minimo 8 ) la soluzione più semplice, anche se molto meno elegante, è una struttura if-else annidata https://www.arduino.cc/reference/en/...tructure/else/

esempio scritto in linguaggio "free"

if ((SW1==OFF) and (SW2==OFF) and (StatoMotore==SPENTO))
..{
....AccendiMotore();
....StatoMotore = ACCESO;
..}
else
..{
....if ((SW1==ON) and (SW2==ON) and (StatoMotore==ACCESO))
......{
........SpegniMotore();
........StatoMotore = SPENTO;
......}
..}


Per cosa ho capito delle tue specifiche, la tua seconda condizione "SW1=ON SW2=OFF -> Motore acceso" è ininfluente quindi non implementata, a meno che il motore non debba passare da spento ad acceso anche sul verificarsi di questa (sotto hai dettato una sola condizione per accendere il motore, e in elenco hai una sola condizione che lo spenga )
__________________
v911 - mCPX - PRȎTOS - TRex 450 500 550
A959B - Q32 - DF03 - LRP TC2 - XB4 - M06 - B5(M) - T8E - X1 - T4 - XB2C - GF01
madqwerty non è collegato   Rispondi citando
Vecchio 22 marzo 18, 16:06   #3 (permalink)  Top
User
 
L'avatar di CarloRoma63
 
Data registr.: 08-08-2011
Residenza: Roma
Messaggi: 5.782
Citazione:
Originalmente inviato da pavmail Visualizza messaggio
Salve a tutti.

Mi servirebbe gentilmente una dritta su come realizzare un programmino che mi permetta di fare una cosa abbastanza banale, ma visto che per me è la prima volta che prendo in mano questa scheda e il suo software....... non ne vengo fuori.

In pratica devo applicare 2 finecorsa ad un motore che funzionano con questa logica:

SW1=OFF SW2=OFF -> Motore acceso
SW1=ON SW2=OFF -> Motore acceso
SW1=ON SW2=ON -> Motore fermo

A questo punto il motore deve ripartire quando entrambi ritornano in OFF.

Allego anche l'immagine esplicativa: in pratica devo riempire un tubo fino ad un certo livello, fermare il motore e fare in modo che riparta quando il tubo si svuota.

Grazie per l'attenzione.

Apparentemente devi realizzare un sistema che non sia solo sensibile allo stato attuale dei sensori ma anche alla loro storia, ma semplificando non ne hai bisogno: devi semplicemente spegnere il motore quando entrambi vanno a ON e riaccenderlo solo quando entrambi vanno ad OFF.


Eccoti il codice che dovrebbe fare quello che ti occorre. Non l'ho testato ma il compilatore non mi ha dato errori.


// definisco le variabili di lavoro
boolean Stato1;
boolean Stato2;
boolean Stato;

// definisco quali sono i pin di ingresso per i due sensori
const int SW1 = 2;
const int SW2 = 3;
// definisco il pin di uscita per comandare il motore
const int PinMotore = 4;


void setup() {

// definisco in input i pin di ingresso per i due sensori
pinMode(SW1, INPUT);
pinMode(SW2, INPUT);

// definisco in output il pin di uscita per il motore
pinMode(PinMotore, OUTPUT);

// all'avvio il motore è spento
digitalWrite(PinMotore, LOW);
}

void loop() {
// Leggo lo stato dei due sensori
Stato1 = digitalRead(SW1);
Stato2 = digitalRead(SW2);

//Calcolo lo stato del motore, implementando uno XOR ESCLUSIVO
// tabella della verità:
// Stato1 Stato2 Stato
// Vero Vero Vero
// Vero Falso Falso
// Falso Vero Falso
// Falso Falso Vero

Stato = (Stato1 && Stato2) || (!Stato1 && !Stato2);

if (Stato){
digitalWrite(PinMotore, HIGH);
}else{
digitalWrite(PinMotore, LOW);
}
}


Carlo

EDIT: No, ho sbagliato. Aspetta che faccio le correzioni
__________________
Dai un pesce ad un uomo e lo avrai sfamato per un giorno, insegnagli a pescare e lo avrai sfamato per sempre. (Confucio)
I miei modelli: http://www.youtube.com/results?search_query=carloroma63
CarloRoma63 non è collegato   Rispondi citando
Vecchio 22 marzo 18, 16:45   #4 (permalink)  Top
User
 
L'avatar di CarloRoma63
 
Data registr.: 08-08-2011
Residenza: Roma
Messaggi: 5.782
Citazione:
Originalmente inviato da CarloRoma63 Visualizza messaggio
Apparentemente devi realizzare un sistema che non sia solo sensibile allo stato attuale dei sensori ma anche alla loro storia, ma semplificando non ne hai bisogno: devi semplicemente spegnere il motore quando entrambi vanno a ON e riaccenderlo solo quando entrambi vanno ad OFF.


Eccoti il codice che dovrebbe fare quello che ti occorre. Non l'ho testato ma il compilatore non mi ha dato errori.


// definisco le variabili di lavoro
boo.....
}


Carlo

EDIT: No, ho sbagliato. Aspetta che faccio le correzioni

Questo dovrebbe funzionare, in effetti dovevo tenere conto dello stato pregresso del motore ...


// definisco le variabili di lavoro
boolean Stato1;
boolean Stato2;
boolean StatoMotore;

// definisco quali sono i pin di ingresso per i due sensori
const int SW1 = 2; // sensore basso
const int SW2 = 3; // sensore alto
// definisco il pin di uscita per comandare il motore
const int PinMotore = 4;


void setup() {
// definisco in input i pin di ingresso per i due sensori
pinMode(SW1, INPUT);
pinMode(SW2, INPUT);

// definisco in output il pin di uscita per il motore
pinMode(PinMotore, OUTPUT);

// all'avvio il motore è spento
digitalWrite(PinMotore, LOW);
}

void loop() {
// Leggo lo stato dei due sensori
Stato1 = digitalRead(SW1);
Stato2 = digitalRead(SW2);

//Calcolo lo stato del motore,
// tabella della verità:
// Stato1 Stato2 StatoMotore StatoMotore Risultante
// Falso Falso Falso Vero
// Falso Falso Vero Vero
// Falso Vero Falso Condizione non prevista
// Falso Vero Vero Condizione non prevista
// Vero Falso Falso Falso
// Vero Falso Vero Vero
// Vero Vero Falso Falso
// Vero Vero Vero Falso

// semplificando con le mappe di karnaugh ottengo

StatoMotore = (!Stato1 && !Stato2) || (Stato1 && !Stato2 && StatoMotore);

if (StatoMotore){
digitalWrite(PinMotore, HIGH);
}else{
digitalWrite(PinMotore, LOW);
}
}

Carlo
__________________
Dai un pesce ad un uomo e lo avrai sfamato per un giorno, insegnagli a pescare e lo avrai sfamato per sempre. (Confucio)
I miei modelli: http://www.youtube.com/results?search_query=carloroma63
CarloRoma63 non è collegato   Rispondi citando
Vecchio 22 marzo 18, 22:53   #5 (permalink)  Top
User
 
L'avatar di Naraj
 
Data registr.: 25-07-2004
Residenza: Trieste
Messaggi: 5.652
Scusate la mia interferenza.
Se questo circuito serve per far pratica con Arduino, OK.
Ma questa pratica comporta un lungo esercizio di programmazione.

Personalmente, se Pavmail conosce i circuiti logici digitali (And, Or), lo schema dovrebbe essere molto più semplice ed intuitivo.
Sbaglio?

Naraj.
Naraj non è collegato   Rispondi citando
Vecchio 23 marzo 18, 00:04   #6 (permalink)  Top
User
 
L'avatar di pavmail
 
Data registr.: 19-02-2009
Residenza: Scorzè (VE)
Messaggi: 44
Immagini: 2
Ragazzi, devo davvero ringraziarvi!

Mi avete fornito una grossa mole di informazioni e soprattutto degli ottimi spunti su cui studiare Ora si tratta di mettere in pratica

@Naraj
In effetti quello che voglio fare con Arduino è stato già creato con uno stampato rudimentale e componenti ad hoc (NB.non da me) . Però ho preferito prendere la palla al balzo e cimentarmi in questa avventura per fare un po' d'esperienza

Ancora grazie!
pavmail non è collegato   Rispondi citando
Vecchio 14 aprile 18, 09:19   #7 (permalink)  Top
User
 
L'avatar di pavmail
 
Data registr.: 19-02-2009
Residenza: Scorzè (VE)
Messaggi: 44
Immagini: 2
Torno un'attimo sul mio sketch, risolto perfettamente utilizzando il suggerimento di Carlo.

Il primo switch (livello massimo) viene premuto per frazioni di secondo ad ogni passaggio di una sfera. Questo comporta che, con il secondo switch (livello minimo) premuto, il programma di blocca. Per risolvere ho utilizzato un delay, ma non mi sembra la soluzione definitiva, dato che poi ritardo si riperquote anche sul riavvio del motore.

Pensavo di inserire un debounce per cambiare lo stato del primo switch dopo x tempo, ma ho fatto diversi tentativi senza riuscire ad integrarlo correttamente. E' una soluzione applicabile?

Grazie
pavmail non è collegato   Rispondi citando
Vecchio 14 aprile 18, 12:55   #8 (permalink)  Top
User
 
L'avatar di CarloRoma63
 
Data registr.: 08-08-2011
Residenza: Roma
Messaggi: 5.782
Citazione:
Originalmente inviato da pavmail Visualizza messaggio
Torno un'attimo sul mio sketch, risolto perfettamente utilizzando il suggerimento di Carlo.

Il primo switch (livello massimo) viene premuto per frazioni di secondo ad ogni passaggio di una sfera. Questo comporta che, con il secondo switch (livello minimo) premuto, il programma di blocca. Per risolvere ho utilizzato un delay, ma non mi sembra la soluzione definitiva, dato che poi ritardo si riperquote anche sul riavvio del motore.

Pensavo di inserire un debounce per cambiare lo stato del primo switch dopo x tempo, ma ho fatto diversi tentativi senza riuscire ad integrarlo correttamente. E' una soluzione applicabile?

Grazie
Per quanto tempo rimane premuto il primo switch quando passa la sfera? Credo comunque che la soluzione migliore sia un delay.

Modifica la parti finale in questo modo.

if (StatoMotore){
delay(1000) // 1000 millisecondi, vedi tu quanto ti occorre
if (digitalRead(SW1)){ // se dopo il delay è ancora HIGH allora esegue
digitalWrite(PinMotore, HIGH);
}
}else{
digitalWrite(PinMotore, LOW);
}

Nota che questa soluzione implica necessariamente un ritardo nella risposta del motore, sia in accensione che in spegnimento. Se non puoi tollerare questo ritardo, specialmente per lo spegnimento, allora la soluzione è un pochino più complessa .

Carlo
__________________
Dai un pesce ad un uomo e lo avrai sfamato per un giorno, insegnagli a pescare e lo avrai sfamato per sempre. (Confucio)
I miei modelli: http://www.youtube.com/results?search_query=carloroma63
CarloRoma63 non è collegato   Rispondi citando
Vecchio 14 aprile 18, 19:27   #9 (permalink)  Top
User
 
L'avatar di pavmail
 
Data registr.: 19-02-2009
Residenza: Scorzè (VE)
Messaggi: 44
Immagini: 2
Grazie Carlo, sei stato gentilissimo
pavmail non è collegato   Rispondi citando
Rispondi

Bookmarks



Strumenti discussione
Visualizzazione

Regole di scrittura
Non puoi creare nuove discussioni
Non puoi rispondere alle discussioni
Non puoi inserire allegati
Non puoi modificare i tuoi messaggi

BB code è Attivato
Le faccine sono Attivato
Il codice [IMG] è Attivato
Il codice HTML è Disattivato
Trackbacks è Disattivato
Pingbacks è Disattivato
Refbacks è Disattivato


Discussioni simili
Discussione Autore discussione Forum Commenti Ultimo Commento
problema con arduino fabiano2007 Circuiti Elettronici 15 23 marzo 14 02:15



Tutti gli orari sono GMT +2. Adesso sono le 02:57.


Basato su: vBulletin versione 3.8.11
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
E' vietata la riproduzione, anche solo in parte, di contenuti e grafica. Copyright 1998/2019 - K-Bits P.I. 09395831002