Servo + pulsanti

salve a tutti sono nuovo e sto sperimentando le prime cose con il mio arduino uno, come da oggetto volevo far muovere un servo di 2 gradi verso destra o verso sinistra alla pressione del relativo bottone. penso di aver sbagliato qualcosa nella parte software perchè non succede niente :’( :’( :’( :’( :’( :’( qualche persona di buon cuore sarebbe disposta ad aiutarmi? probabilmente è una cavolata ma non ne vado fuori da stamattina.
Grazie

servopulsanti.ino (785 Bytes)

Buongiorno, essendo il tuo primo post, nel rispetto del regolamento (… punto 13, primo capoverso), ti chiedo cortesemente di presentarti QUI ([u]spiegando bene quali conoscenze hai di elettronica e di programmazione[/u] ... possibilmente evitando di scrivere solo una riga di saluto) e di leggere con MOLTA attenzione il su citato REGOLAMENTO ... Grazie.

Guglielmo

P.S.: Qui una serie di link utili, [u]NON[/u] necessariamente inerenti alla tua domanda: - serie di schede by xxxPighi per i collegamenti elettronici vari: ABC - Arduino Basic Connections - pinout delle varie schede by xxxPighi: Pinout - link [u]generali[/u] utili: Link Utili

om86ar: volevo far muovere un servo di 2 gradi verso destra o verso sinistra alla pressione del relativo bottone.

Allora, iniziamo intanto da alcune cose "accessorie" ma che secondo me ti sono utili/necessarie.

Per iniziare, i pin meglio definirli con #define e non con variabili, anche se costanti, consumano preziosa memoria. Ossia non:

int const destra=2; int const sinistra=6; // i pin a cui ho collegato i 2 pulsanti

ma (ovviamente poi cambierai anche i relativi riferimenti, i simboli per convenzione sono tutti in maiuscolo):

#define DESTRA 2 #define SINISTRA 6 // i pin a cui ho collegato i 2 pulsanti

In programmi così piccoli non importa, ma se ti abitui è meglio.

Poi inizia ad abituarti anche ad indentare bene, anche in questo caso non è particolarmente necessario per piccoli programmi ma quando aumenta la complessità lo è eccome, e se ti abitui a farlo fin dall'inizio poi ti troverai facilitato soprattutto per il debug!

A parte questo, tu nel loop() scrivi:

void loop() {
valoredx = digitalRead(destra);
valoresx = digitalRead(sinistra);
angolo=90;
servo1.write(angolo);
Serial.print(angolo);
while (valoredx==HIGH){
  angolo=(angolo)+2;}
while (valoresx==HIGH){
  angolo=angolo-2;}
  delay (100);
}

Primo, il valore di "angolo" lo cambi ma poi al loop successivo torna a 90 quindi non si muoverà mai. L'inizializzazione al valore 90 devi metterla nel setup() oppure direttamente nella dichiarazione iniziale: int angolo=90; // variabile per il valore angolo servo

Secondo, evita i while perché fatto così il programma incrementerà moooolto velocemente il valore (se tieni premuto il pulsante anche solo qualche decimo di secondo aumenta di 2 per migliaia di volte!). sostituiscili almeno con una "if()" e attendi con un delay() un tempo minimo prima di proseguire (non è il metodo migliore, ma in questa fase il più semplice da spiegare, poi imparerai a gestire meglio queste tempistiche magari con millis()).

Qualcosa del genere:

void loop() {
  valoredx = digitalRead(DESTRA);
  valoresx = digitalRead(SINISTRA);
  Serial.print(angolo);
  if (valoredx==HIGH) {
    angolo+=2;
    servo1.write(angolo);
    delay(200);
  }
  if (valoresx==HIGH) {
    angolo+=2;
    servo1.write(angolo);
    delay(200);
  }
}