Salve a tutti!
premessa ho arduino uno solo da un giorno,
come detto volevo controllare una mini turbina eolica con l'arduino, mi serve solo qualche piccolo spunto, devo collegare un encoder rotativo modello 0ss-03-2s risoluzione 300 P/R. ha solo 4 fili + - e A e B dal momento che leggo il valore dell'encoder devo trasformarlo in giri al minuto, in base a questi giri devo azionare un servo facendolo girare di x gradi a destra o a sinistra.
qualcuno di buona volontà che mi può aiutare???
ringrazio anticipatamente a chiunque mi da una mano..........
a presto spero
Ciao e benvenuto.
Questo è il regolamento, da leggere prima di postare...
Qui c'è il thread delle presentazioni
Se poi hai problemi, chiedi nello specifico: "qualcuno di buona volontà che mi può aiutare" porta alla risposta "non saprei come aiutarti" se non dici cos'hai in mano esattamente e qual'è la parte che ti da problemi
il mio problema è che non so come realizzare il codice per far vedere ad "arduino uno" l'encoder, ma forse è ancora presto per chiedere queste cose dovrei studiare un po prima.
Salve cyberhs!
come faccio a dirgli che ad ogni 300 impulsi deve considerare un giro e calcolare in quanto tempo sta facendo il giro???
con questo codice legge gli inpulsi di continuo e li fa vedere sulla seriale
aiutatemi please
//Encoder rotativo OSS-03-2S 5V 300P/R
//legge e visualizza il numero di impulsi sulla porta seriale
int val;
int encoder0PinA = 2; // Sig. A filo verde
int encoder0PinB = 3; // Sig. B filo bianco
int encoder0Pos = 0;
int encoder0PinALast = LOW;
int n = LOW;
void setup() {
pinMode (encoder0PinA,INPUT);
pinMode (encoder0PinB,INPUT);
Serial.begin (9600);
}
void loop() {
n = digitalRead(encoder0PinA);
if ((encoder0PinALast == LOW) && (n == HIGH)) {
if (digitalRead(encoder0PinB) == LOW) {
encoder0Pos--;
} else {
encoder0Pos++;
}
Serial.print (encoder0Pos);
Serial.print ("/"); //per scrivere i caratteri
}
encoder0PinALast = n;
attendo qualcuno di buona volontà mosso a compassione
Dovresti usare gli external interrupt (il secondo esempio nella pagina che ti ho segnalato).
In realtà, per la tua applicazione non è necessario determinare la direzione (la turbina fira sempre nella stessa direzione) e quindi il sensore potrebbe essere un semplice sensore Hall pilotato da uno o più magneti.
Comunque, nel loop dovrai controllare ogni secondo (oppure ogni tot secondi) quanti impulsi ha totalizzato il contatore ottenendo la velocità.
Non ho testato il programma: consideralo solo come linea guida di quello che devi fare.
#define encoderPinA 2 //
#define encoderPinB 4
const byte ImpulsiGiro= 200; // numero impulsi emessi con una rotazione completa
const byte Intervallo = 1; // secondi che devono passare prima di calcolare la velocità
unsigned long Timer = 0; // variabile usata per il timer
volatile unsigned int encoderPos = 0; // posizione encoder
float Velocita = 0.0; // velocità in giri/secondo
void setup() {
pinMode(encoderPinA, INPUT_PULLUP); // pin usato come input e inserimento resistore interno di pullup da 22k
pinMode(encoderPinB, INPUT_PULLUP);
attachInterrupt(0, Conta, FALLING ); // interrupt 0 sul pin 2 quando il segnale passa da HIGH a LOW
Serial.begin (9600);
}
void loop() {
if (millis() - Timer > Intervallo) { // controllo timer dopo tot secondi (Intervallo)
Velocita = float(encoderPos / ImpulsiGiro / Intervallo); // impulsi totalizzati diviso 200 in tot secondi
Timer = millis(); // timer ripartito
}
if (encoderPos > ImpulsiGiro) encoderPos = 0; // reset contatore dopo ogni giro
Serial.println (encoderPos, DEC);
Serial.println (Velocita);
}
void Conta() {
if (digitalRead(encoderPinA) == digitalRead(encoderPinB)) encoderPos ++; // determina direzione - somma impulso
else encoderPos --; // determina direzione contaria - sottrae impulso
}