
|
![]() | #1 (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 | |
![]() | ![]() |
![]() | #2 (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 | |
![]() | ![]() |
![]() | #3 (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. |
![]() | ![]() |
![]() | #4 (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! |
![]() | ![]() |
![]() | #5 (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 ![]() |
![]() | ![]() |
![]() | #6 (permalink) Top | |
User Data registr.: 08-08-2011 Residenza: Roma
Messaggi: 5.805
| Citazione:
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 | |
![]() | ![]() |
![]() |
Bookmarks |
Strumenti discussione | |
Visualizzazione | |
| |
![]() | ||||
Discussione | Autore discussione | Forum | Commenti | Ultimo Commento |
problema con arduino | fabiano2007 | Circuiti Elettronici | 15 | 23 marzo 14 02:15 |