programma comando servomotore

Dovrei comandare un servomotore che superata una certa soglia di tensione (es 1V) deve spostarsi ad un certo angolo per poi ritornare alla posizione iniziale ( di 0°) quando la tensione scende sotto questa soglia.Sto cercando da giorni la soluzione ma non riesco proprio sapete aiutarmi?
GRAZIE :slight_smile:

@luigi22021998: essendo il tuo primo post, ti chiederei cortesemente di presentarti QUI (spiegando bene quali conoscenze hai di elettronica e di programmazione ... possibilmente evitando di scrivere solo una riga di saluto) e di leggere con attenzione il REGOLAMENTO ... Grazie.

Guglielmo

Come leggi la tensione ? Da dove arriva ? Quale è lo schema ? Quale è il codice (... mi raccomando, racchiuso tra i tag CODE che, in fase di edit, ti inserisce il bottone </> ... primo a sinistra) ?

Se non ci dai nulla come pensi che possiamo aiutarti ?

Guglielmo

Scusa ha ragione lo faccio subito..Comunque per quanto riguarda quello che voglio fare con il servo sarebbe in pratica di usarlo come freno , si deve spostare ad un certo angolo quando la tensione che gli arriva da un motore (che uso come anemometro) supera 1V

Ok ...
... quindi leggi la tensione da un pin analogico, la compari con 1V e se maggiore muovi il servo da una parte altrimenti dall'altra.

Dove è la difficoltà ? Dove hai problemi ? Cosa non ti funziona ?

Guglielmo

se è maggiore si deve spostare di 90° se è minore deve restare a 0°.La mia difficoltà sta nel fatto che non conoscendo bene arduino e il linguaggio di programmazione il programma che ho steso non funziona mi puoi dare una dritta e correggerlo?

#include <Servo.h>

Servo myservo;
int palaEolica = A0; //Pin dove e' presente la tensione variabile 

int pos = 0;

void setup() {
myservo.attach(9);
delay(100);
myservo.write(0);
delay(3000);
}

int tensioneD;
float tensioneA, FS = 5.0; 
const float soglia = 3.0;
void loop() {
tensioneD = analogRead(palaEolica);
tensioneA = tensioneD *FS/ 1024.0;
if (tensioneA >= soglia)
 for(pos = 0; pos <= 90; pos++){
   myservo.write(pos);
   delay(15);
 }
}
  1. ti ricordo che in conformità al regolamento, punto 7, devi editare il tuo post (in basso a destra del post, bottone More -> Modify) e racchiudere il codice all'interno dei tag CODE (... sono quelli che in edit inserisce il bottone fatto così: </>, tutto a sinistra).

  2. vedo l'IF con cui confronti se superi la soglia, ma ... NON vedo l'ELSE nel caso la soglia non sia superata :wink:

Guglielmo

P.S.: Per sistemare bene le indentature e rendere più chiaro il codice, usa la funzione dell'IDE Tools -> Auto Format.

Non vorrei dire stupidaggini ma dato che finchè non raggiunge 1V non deve accadere niente la funzione else puo essere anche ignorata

Veramente tu hai detto un'altra cosa ...
... quando è sotto 1V : posizione iniziale
... quando è sopra 1V: posizione con un certo angolo

Ora, se non metti l'ELSE ... secondo te chi ce lo riporta in posizione iniziale quando la tensione scende sotto 1V ? ? ?

Guglielmo

P.S.: Terzo avvertimento ... poi mi costringi a prendere provvedimenti che NON amo prendere per mancato rispetto del regolamento ...
... ti ricordo che in conformità al regolamento, punto 7, devi editare il tuo post (in basso a destra del post, bottone More -> Modify) e racchiudere il codice all'interno dei tag CODE (... sono quelli che in edit inserisce il bottone fatto così: </>, tutto a sinistra).

Sisi non avevo capito come modificare ho fatto, allora forse non sono stato chiaro dato che quando arriva a 1V deve muoversi a 90 gradi se no deve restare fermo ..quindi l'else in teoria non serve dato che quando non è soddisfatta la condizione non deve accadere nulla

No, scusa, ma il servo, una volta che è andato a 90° ...
... resta fermo li così e non fa più nulla qualunque cosa accada ? ? ? :o :o :o

Guglielmo

Giusto..correggo un attimo e vedo come va grazie

Purtroppo c'è sempre lo stesso problema il servocomando va in loop e incomincia a muoversi da solo fin dall'inizio :confused:

Metti il codice aggiornato (... mi raccomando, sempre racchiuso tra i tag CODE) e vediamo ... ::slight_smile:

Comunque nel setup() sei tu che lo posizioni a 0 e poi nel loop(), facendo la analogRead() gli cambi posizione, quindi ...
... sicuro del valore che calcoli con ciò che leggi dalla analogRead() ?
Perché non aggiungi un po' di stampe sul monitor seriale che ti dicono cosa succede e che valori hai ?

Guglielmo