
|
![]() | #1 (permalink) Top |
User | 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. ![]() |
![]() | ![]() |
![]() | #2 (permalink) Top |
User 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 ![]() 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 |
![]() | ![]() |
![]() | #3 (permalink) Top | |
User Data registr.: 08-08-2011 Residenza: Roma
Messaggi: 5.805
| Citazione:
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 | |
![]() | ![]() |
![]() | #4 (permalink) Top | |
User Data registr.: 08-08-2011 Residenza: Roma
Messaggi: 5.805
| Citazione:
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 | |
![]() | ![]() |
![]() | #5 (permalink) Top |
User Data registr.: 25-07-2004 Residenza: Trieste
Messaggi: 5.672
|
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. |
![]() | ![]() |
![]() | #6 (permalink) Top |
User |
Ragazzi, devo davvero ringraziarvi! Mi avete fornito una grossa mole di informazioni e soprattutto degli ottimi spunti su cui studiare ![]() ![]() @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! |
![]() | ![]() |
![]() | #7 (permalink) Top |
User |
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 ![]() |
![]() | ![]() |
![]() |
Bookmarks |
| |
![]() | ||||
Discussione | Autore discussione | Forum | Commenti | Ultimo Commento |
problema con arduino | fabiano2007 | Circuiti Elettronici | 15 | 23 marzo 14 02:15 |