pingpong

Salve a tutti :smiley:
sto cercando di creare un ping pong con un servo e 2 tastini.
ho realizzato questo codice http://codepad.org/Pmi01lp4
ma purtroppo, quando dico al servo di andare a destra lui va fino e infondo a destra e poi si attiva l'altro if. Come posso risolvere questo problema? vorrei che il servo sia reattivo ai pulsanti, nel senso che se cambio idea e lui sta già andando da destra verso sinistra e io voglio fargli fare il contrario, lui lo deve fare.

Ciao.
Il write accetta un angolo che va da 0 a 180, tu gli imposti 150 e 1900.

Secondo me all'inizio il servo lo devi impostare a metà strada (90) nel setup.
Ti memorizzi l'angolo in una variabile che passi al servo tramite il write, dopo averla incrementata o diminuita a seconda del bottone premuto.
Poi va aggiunto un controllo che impedisca alla variabile di uscire dal range 0 - 180.

Quello sketch verifica lo stato dei due pulsanti che chiudono verso i +5V con un resistore (ad esempio 10k) verso massa.

Se invece vuoi evitare il resistore usando quello interno di Arduino collega i due pulsanti verso massa e devi modificare un po' lo sketch:

#include <Servo.h>
const int buttonPin = 2;  
const int buttonPin1 = 3; 
Servo myServo;  
int buttonState = 0;    
int buttonState1 = 0; 

void setup() {
  myServo.attach(9);
  pinMode(buttonPin, INPUT_PULLUP);    // pulsante collegato verso massa
  pinMode(buttonPin1, INPUT_PULLUP);    
}

void loop() {
    buttonState = digitalRead(buttonPin);
    buttonState1 = digitalRead(buttonPin1);

    if (buttonState == LOW) {     // pulsante premuto
      myServo.write(150);
      } 
    if(buttonState1 == LOW) {     
      myServo.write(1900);
    }
}

cyberhs:
Se invece vuoi evitare il resistore usando quello interno di Arduino collega i due pulsanti verso massa e devi modificare un po' lo sketch:

scusa la mia ignoranza, ma cosa cambia con o senza resistore? intanto +1 karma grazie per lo sketch :grin:

Il resistore, come avrai imparato dai LED, serve a limitare la corrente che scorre in un circuito, ma ha anche altre funzioni,

Una di queste è quella di fornire un riferimento di tensione verso i +5V (resistore di pull-up) oppure verso ground (resistore di pull-down).

Ad esempio, un pin predisposto come ingresso digitale ovvero pinMode(pin, INPUT) non ha un riferimento di tensione certo: vale a dire che la sua lettura con digitalRead(pin) ti può fornire in momenti diversi sia LOW che HIGH.

Ecco che collegare un pulsante ad un ingresso digitale con l'altro capo verso i +5V oppure verso ground non garantisce che a riposo (non premuto) l'ingresso digitale assuma LOW (nel primo caso) oppure HIGH (nel secondo caso).

Si usano, perciò, i resistori di pull-up oppure di pull-down.

ok ho risolto inserendo una resistenza, lascio il topic aperto Screenshot by Lightshot si vedono i pulsanti.

prima invece:
Quello con 3 piedini collegati funziona correttamente, quello con 2 piedini collegati non funziona correttamente.
Per provare il funzionamento ho collegato il primo piedino ad un led, il programma semplice..se il pulsante è premuto accendi il led. Invece utilizzando il pulsante con 2 piedini collegati, pur collegandolo il led rimane sempre acceso, anzi si spegne quando lo clicki. Ho già provato a girarlo e rigirarlo... se utilzzo una resistenza dovrei risolvere il problema? e farlo funzionare correttamente come l'altro? l'altro a 3 piedini mi sembra un deviatore

Entrambi sono pulsanti finecorsa.
Quello a 3 fili deve essere un deviatore, mentre in quello a 4 terminali, secondo me, sono accoppiati a due a due ma solo un tester lo potrà confermare.

Ho domandato ad un mio amico e mi ha detto che il servo non dovrebbe prendersi una pausa tra un click e l'altro dei pulsanti. Perciò mi ha consigliato di non utilizzare gli if( il tasto destro è premuto vai a sinistra) e viceversa... mi ha detto di utilizzare interrupt e debouncing, il problema è che non so proprio come adattarli a 2 tasti e 1 servo.

lo sketch è questo http://codepad.org/KaDDC2kR
ho collegato assieme tutti i motori, tramite alimentazione esterna, poi li ho provati singolarmente con questo sketch C code - 32 lines - codepad sarebbe un potenziometro e 1 servo(funzionano tutti). Invece quando vado a collegare tutto su un solo sketch iniziano i casini, il servo C inizia a fare quello che vuole(con il primo sketch). Cosa potrebbe essere?