Controllare una mini turbina eolica con arduino uno

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

Grazie Leo72!

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.

Hai un datasheet di questo encoder ?

Ciao Brado!

quì c'è il link del prodotto il mio è OSS-03-2S risoluzione 300P/R con due pin di lettura A e B
http://hydq88888.en.b2b168.com/shop/supply/12396358.html

grazie mille per l'aiuto

Forse desideri ottimizzare la posizione del rotore in funzione della direzione del vento?

no non mi interessa la direzione del vento, mi basta sapere quanti giri al minuto fa

Comincia a leggere questa pagina:

http://playground.arduino.cc/Main/RotaryEncoders

Grazie cyberhs !!!

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à.

Più o meno una cosa del genere:

#define encoderPinA  2
#define encoderPinB  4

const byte ImpulsiGiro= 200;
const byte Intervallo = 1;
unsigned long Timer = 0;
volatile unsigned int encoderPos = 0;
float Velocita = 0.0;

void setup() { 
  pinMode(encoderPinA, INPUT_PULLUP); 
  pinMode(encoderPinB,  INPUT_PULLUP); 

  attachInterrupt(0, Conta, FALLING );  // encoder pin on interrupt 0 - pin 2
  Serial.begin (9600);
} 

void loop() {
  if (millis() - Timer > Intervallo) {
    Velocita = float(encoderPos / ImpulsiGiro / Intervallo);
  }
  if (encoderPos > 200) encoderPos = 0;
  Serial.println (encoderPos, DEC);
  Serial.println (Velocita);
}

void Conta() {
  if (digitalRead(encoderPinA) == digitalRead(encoderPinB)) encoderPos ++;
  else encoderPos --;
}

buongiorno cyberhs!
e grazie tanto,
saresti cosi gentile di spiegarmi tutti i passaggi del codice che mi hai scritto in modo da capire meglio?

sono duro di comprendonio perdonami

ti ringrazio anticipatamente

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
}

buongiorno cyberhs!
grazie per l'utilissimo aiuto sei un grande.

dopo ti farò vedere il risultato

grazie ancora e a presto