misurare RPM elica

Ciao,
avrei la necesstità di misurare gli RPM di un'elica, e mi stavo chiedendo quale fosse il metodo ideale. In particolare pensavo qualcosa stile fotocellula.
siamo intorno ai 7500 RPM al massimo, che con un elica bipala da circa 15000 passaggi al minuto. possiedo anche una tripala, quindi se il sensore arriva a 22500 passaggi al minuto sarebbe fantastico.

Vorrei che l'uscita del sensore fosse digitale, in modo da evitare il più possibile interferenze o analisi dei dati.

22500rpm sono 375Hz, quindi penso che un LED IR ed un TSSOP del tipo ad impulsi dovrebbero risolverti il problema

sì, alla fine ho usato un led IR (prima di aprire il post avevo provato con un comune led ma con scarsissimi risultati, troppo rumore) ma con il prescaler a 16 (circa 11000 letture al secondo)

poi i dati li ho analizzati con baudline, che mostra l'analisi di fourier delle frequenze.

con elica bipala 10x45:
MAX 7200rpm
MIN 2400rpm

rampa di salita: 100ms
rampa di discesa: 200ms

con elica tripla 9x5:
max 7700 RPM
min 1440 RPM
rampa salita: 370ms
rampa discesa: 1.2secondi

codice arduino (modificato da un vecchio codice):

 #include <Servo.h>
 
 Servo s;

void setup() {
  // initialize the serial communication:
  Serial.begin(460800);
  delay(1000);
  analogReference(EXTERNAL);
  ADCSRA &= B11111100; //prescaler to 16, about ~77 kHz sample rate
  s.attach(7);
}
unsigned long somma;
//int numeroSample = 300;
boolean stato = false;
int vel=0;
void loop() {
  if (Serial.available()>0){
    digitalWrite(13, stato?HIGH:LOW);
    stato=!stato;
    int i = Serial.read();
    switch(i){
      case 'm':
        vel=0;
        break;
      case 'M':
        digitalWrite(13, HIGH);
        vel=180;
        break;
      case '+':
        vel+=10;
        break;
    }
    s.write(vel);
  }
  /*
  somma=0;
  //for (int i=0; i < numeroSample;i++){
    somma+=analogRead(A0);
  //}
  
  // send the value of analog input 0:
  Serial.println((int)(somma/numeroSample));
  // wait a bit for the analog-to-digital converter
  // to stabilize after the last reading:
  //delay(2);
  */
  Serial.write( (byte)map(analogRead(A0), 0, 1024, 0, 256) );
  //Serial.write('\n');
}

codice processing (grafico +salvataggio del file in temp, che è in ram quindi nessuna lag):

import processing.serial.*;

Serial myPort;        // The serial port
int xPos = 1;         // horizontal position of the graph

FileWriter a;

void setup () {
  // set the window size:
  size(400, 300);        

  // List all the available serial ports
  println(Serial.list());
  // I know that the first port in the serial list on my mac
  // is always my  Arduino, so I open Serial.list()[0].
  // Open whatever port is the one you're using.
  myPort = new Serial(this, Serial.list()[0], 460800);
  // don't generate a serialEvent() unless you get a newline character:
  //myPort.bufferUntil('\n');
  // set inital background:
  background(0);
  try {
    a = new FileWriter("/tmp/dati.txt", false);
  }
  catch(Exception e) {
    e.printStackTrace();
  }
}
void draw () {
  // everything happens in the serialEvent()
}
int i=0;
long tempo = millis();
int stroke1;
char lettura[] = new char[1];
void serialEvent (Serial myPort) {

  i++;
  if (millis()-tempo>1000) {
    println("Letture al sec:"+i);
    i=0;
    tempo= millis();
  }
  
  lettura[0] = (char)myPort.read(); 
  int inRead = lettura[0];

  float finByte = map(inRead, 0, 256, 0, height);
  try {
    a.write(lettura, 0, 1);
  }
  catch(Exception e) {
    e.printStackTrace();
  }
  // draw the line:
  stroke(stroke1, 34, 255);
  line(xPos, height, xPos, height - finByte);

  // at the edge of the screen, go back to the beginning:
  if (xPos >= width) {
    xPos = 0;
    if (stroke1 == 127)
      stroke1=20; 
    else
      stroke1 = 127;
    background(0);
  }
  else {
    // increment the horizontal position:
    xPos++;
  }
}

void keyReleased() {
  if (key != CODED) {
    switch(key) {
    case 'z':
      println("MAX");
      myPort.write('M');
      break;
    case 'm':
      println("min");
      myPort.write('m');
      break;
    case '+':
      println("+");
      myPort.write('+');
      break;
    }
  }
}

notare che si può comandare il servo da processing, con + (+10 al servo), m (servo al minimo), z (servo al massimo)

lesto:
Ciao,
avrei la necesstità di misurare gli RPM di un'elica, e mi stavo chiedendo quale fosse il metodo ideale. In particolare pensavo qualcosa stile fotocellula.
siamo intorno ai 7500 RPM al massimo, che con un elica bipala da circa 15000 passaggi al minuto. possiedo anche una tripala, quindi se il sensore arriva a 22500 passaggi al minuto sarebbe fantastico.

Vorrei che l'uscita del sensore fosse digitale, in modo da evitare il più possibile interferenze o analisi dei dati.

Non puoi misurare la rotazione sul motore? Saresti indipendente dalle eliche e arriveresti piú semplicemente.
Potresti usare un sensore magnetico a effetto hall.
Ciao Uwe

no, a me interessa con le eliche, e non ho sensori hall in casa :grin:

lesto:
Vorrei che l'uscita del sensore fosse digitale, in modo da evitare il più possibile interferenze o analisi dei dati.

Devi usare un vero fotodiodo ricevitore nella banda del visibile, a meno che non usi illuminatore IR, e ti serve anche un opamp che fa da amplificatore e squadratore perché in realtà il segnale in uscita è quasi sinusoidale, alla fine ottieni degli impulsi con durata leggermente inferiore a quella del passaggio dell'elica sul sensore distanziati del tempo tra i passaggi delle varie pale.
Attenzione che sei fai il test in casa con la luce accesa il sensore legge i 50 Hz di rete.

io intuberei il sensore in modo da ridurre le interferenze della luce che proviene dai lati, come misura aggiuntiva a quelle che ti hanno già descritto.
per avere un segnale più "pulito", quando ne ho avuto la necessità, ho usato un semplice 7404 con un partitore in entrata che comprendeva un trimmer così da poter dosare la sensibilità al segnale in entrata su una delle porte usate come trigger di schmitt, e mi restituiva un segnale perfettamente pulito e squadrato.

BrainBooster:
io intuberei il sensore in modo da ridurre le interferenze della luce che proviene dai lati,

Ottimo consiglio.

l'IR38DM è un sensore impulsivo (emette un LOW appena si interrompe il fascio, ma ritorna subito su HIGH, anche se il fascio è ancora interrotto), il TSSOP34838 invece cambia stato per tutta la durata dell'interruzione; entrambi, dalle prove che feci al tempo della barriera, sono a mio modesto parere assolutamente insensibili ai 50Hz ed alla luce naturale e artificiale, una eventuale intubatura serve fondamentalmente per raggiungere distanze notevoli. Io ho lavorato fino ad un metro puntanto lampadine, portando il circuito al sole, ecc. mai avuta un'incertezza.

Non vanno bene per un contagiri, hanno la banda limitata e richiedono obbligatoriamente un illuminatore a frequenza fissa 36-42 kHz a seconda dei modelli, un contagiri per eliche sfrutta la luce ambientale per funzionare.

uwefed:

lesto:
Ciao,
avrei la necesstità di misurare gli RPM di un'elica, e mi stavo chiedendo quale fosse il metodo ideale. In particolare pensavo qualcosa stile fotocellula.
siamo intorno ai 7500 RPM al massimo, che con un elica bipala da circa 15000 passaggi al minuto. possiedo anche una tripala, quindi se il sensore arriva a 22500 passaggi al minuto sarebbe fantastico.

Vorrei che l'uscita del sensore fosse digitale, in modo da evitare il più possibile interferenze o analisi dei dati.

Non puoi misurare la rotazione sul motore? Saresti indipendente dalle eliche e arriveresti piú semplicemente.
Potresti usare un sensore magnetico a effetto hall.
Ciao Uwe

segui il consiglio di Uwe :grin: :stuck_out_tongue_closed_eyes:

mi correggo il led che ho usato non è un infrarosso ma un ultravioletto, non ho i datasheet ma si tratta di quei led che si vedono se sono accesi attraverso la cam del cellulare, quindi credo sui 400nm
Molto insensibile ai 50Hz di casa (problemi che ho avuto coi led a luce visibile, ma comunque nel programma con la trasformata di furier si vede un picco sui 50Hz, quando accedo all'altro pc vi passo le immagini)

segui il consiglio di Uwe

lo seguirei se ne avessi ancora bisogno, ma non ho esattamente idea di come procedere.
Potrei usare un potenzimetro o un motore dc usato come dinamo collegato al motore da misurare, ma poi come farei a mettre in relazione il votaggio misurato con gli RPM? senza contare che diventerebbe molto importannte la qualità della costruzione, altrimenti gli attriti della dinamo/potenziometro invaliderebbero i dati

ma il sensore ti serve solo per tests sul banco o deve essere embedded a qualcosa di volante?

lesto:
)

lo altrimenti gli attriti della dinamo/potenziometro invaliderebbero i dati

boh secondo me ti stai facendo dei problemo inutili, ma st'elica gira con un motore a scoppio?

"quasi" sicuramente si........ prendi il segnale sul cavo candele

proprio oggi sto facendo la stessa cosa devo contare i giri di un "albero" sto facendo un disco forato,

(disco di alluminio di un hardisk) fissato a una boccola, gli farò 10 fori e con un diodo e fotodiodio faro tutto
nessuna parte in contatto

BrainBooster:
ma il sensore ti serve solo per tests sul banco o deve essere embedded a qualcosa di volante?

nono, prove a banco, e mi son dimenticato di postare le foto... quando torno al pc le prendo, tra l'altro i test li salvavo in tmp quindi spero ci sia ancora qualcosa xD