Go Down

Topic: Tacometro, funciona por separado pero no cuando lo incluyo en el codigo golbal. (Read 272 times) previous topic - next topic

AbelMartinez90

Hola, Buenos Dias, llevo un tiempo dandole vueltas a este asunto y no consigo solucionarlo, a ver si alguien me puede echar una mano o darme alguna pista.

He construido un banco de pruebas para probar motores brushless de drones. El mismo cuenta con varios sensores: corriente, voltaje, fuerza etc...

Los problemas me los esta dando el sensor de RPM que he construido con un led ir y un fotoswitch.

Encontre un tutorial en el que usaban el mismo codigo que en un ejemplo de Arduino playground, pero un poco mejorado. El codigo por seoparado funciona muy bien, en problema es que cuando lo incluyo en el codigo global del banco de pruebas, con los demas sensores haciendo varias medeciones y tomando a media y algun que otro delay, me desbaratan el contador de rpm y ya no funciona. He conseguido darme cuenta de que los delays son la casusa, pero no puedo quitarlos. Aqui pongo en codigo que funciona por separado

Code: [Select]
int sensorvalue;
int state1 = HIGH;
int state2;
float rps;
float rpm;
long prevMillis = 0;
long interval = 200;
long currentTime;
long prevTime = 1;
long diffTime;
int sensorthreshold = 30; 

// this value indicates the limit reading between dark and light,
// it has to be tested as it may change according to the
// distance the leds are placed.
// to see what number is good, check the sensor value variable value
// as printed out in the serial monitor

void setup()
{
  Serial.begin(9600);
 }

void loop()
{
  sensorvalue = analogRead(0); // read from pin 0
  if(sensorvalue < sensorthreshold)
    state1 = HIGH;
   else
    state1 = LOW;
 
   if(state2!=state1){      //counts when the state change, thats from (dark to light) or
                            //from (light to dark), remember that IR light is invisible to us.
     if (state2>state1){
       currentTime = micros();   // Get the arduino time in microseconds
       diffTime = currentTime - prevTime;  // calculate the time diff from the last meet-up
       rps = 1000000/diffTime;   // calculate how many rev per second, good to know
       rpm = 60000000/diffTime;  // calculate how many rev per minute
       
       unsigned long currentMillis = millis();
       
       // print to serial at every interval - defined at the variables declaration
       if(currentMillis - prevMillis > interval){ // see if now already an interval long
       prevMillis = currentMillis;       
       Serial.print(rps); Serial.print(" rps  "); Serial.print(rpm); Serial.println(" rpm");
       }
              prevTime = currentTime;
     }
     state2 = state1;
   }



Sin embargo cuando intento incluirlo en mi codigo del banco de pruebas ya no:

Code: [Select]
//Libaries
#include <Servo.h>
#include <HX711.h>

//Esc:
Servo esc;
#define pwm_min 1000
#define pwm_max 1900
#define pwm_idle 1145
#define esc_signal 8  //Port where ESC is connected
#define pwm_increment 20 //Value of pwm value will be increased in each iteration
int val;

//Load cell
HX711 scale(5, 6); //Arduino pin 5 -> HX711 DT and Arduino pin 6 -> HX711 SCK
float calibration_factor = 389; //This calibration factor was obtained during a previous calibration
float units;

//Current Sensor
int analogIn1 = A0; //Select the pin to attach the Current Sensor
int zero;
int mVperAmp = 138; //For my faulty Chinese Sensor 138 mv/amp
int RawValue= 0;
double voltage = 0; //Voltage of the Current Sensor signal wire
double I = 0;

//25V Voltage Sensor
int analogIn2 = A1; //Select the pin to attach the Voltage Sensor
float vout = 0.0;
float vin = 0.0;
float R1 = 30000.0;
float R2 = 7500.0;
int value = 0;

//Watt-meter
float wat;

//Timer
float time;

void setup() {
 
  Serial.begin(9600);
 
  //LED
  pinMode(13, OUTPUT);

  //Load cell
  Serial.println("Tare the thrust sensor");
  scale.set_scale(); //Start scale
  scale.tare(); //Reset the scale to 0
  delay(500);
  Serial.println("Done!");
  delay(500);

  //Current Sensor
  Serial.print("Zeroing the Current Sensor, please disconnect the power ");
  int _zero = 0; //Get initial point
  for (int i = 0; i < 20; i++) { //Take the average of 20 measurements
    _zero += analogRead(analogIn1);
    delay(10);
  }
  _zero /= 20;  //Divide by 20
  zero = _zero; //Current Sensor Zero Offset
  delay(500);
  Serial.println("DONE!!!");
  Serial.print("zero  ");
  Serial.println(zero);
  delay(500);
 
  Serial.println("please connect the power");
  digitalWrite(13, HIGH);
  delay(5000);
  digitalWrite(13, LOW);
 
  //25V Voltage Sensor
  pinMode(analogIn2, INPUT);
  Serial.println("DC 25V Voltage Sensor ready");
  delay(500);
 
  //Esc
  esc.attach(esc_signal, pwm_min, pwm_max); //Attach ESC to certain pin, and defines the maximum an minimum values
  esc.writeMicroseconds(pwm_min); //Initialize the signal to 1000us (0% throttle), to arm the ESC   
  Serial.println("Starting motor in Idle");
  val = pwm_idle;  //Start the motor in Idle
  esc.writeMicroseconds(val);
  delay(500);
 
  Serial.println("Starting measurements");
  Serial.println();
}

void loop() {

  //Timer
  time = (millis()/1000-9); //-9 because the timer starts before Void Setup, due to delays, Void Setup lasts 6s
  Serial.print("Time: ");
  Serial.print(time); Serial.println(" seconds");
 
  //ESC pwm
  Serial.print("PWM: ");
  Serial.println(val);
 
  //Load cell
  scale.set_scale(calibration_factor); //Adjust to this calibration factor
  units = scale.get_units(10); //Get the average of 10 readings from the ADC minus the tare weight, and stores it in the variable units
  if (units < 0)
  {
    units = 0.00;
  }
  Serial.print("Thrust: ");
  Serial.print(units);
  Serial.println(" g");
   
  //Current sensor
   int _RawValue = 0;
  for (int i = 0; i < 10; i++) { //Loop to take the average of 10 measurements
    _RawValue += analogRead(analogIn1);
    delay(5);
  }
  _RawValue /= 10;
  RawValue = _RawValue;
  voltage = ((RawValue-zero) / 1024.0) * 5000; //Get you mV  of the Current Sensor signal wire
  I = ((voltage) / mVperAmp); //Get you real current value in amp
  if (I < 0)
  {
    I = 0.00;
  }
  Serial.println(String("I = ") + I + " A");
 
  //25V Voltage Sensor
  int _value = 0;
  for (int i = 0; i < 10; i++) { //Loop to take the average of 10 measurements
    _value += analogRead(analogIn2);
    delay(5);
  }
  _value /= 10;
  value = _value;
  vout = (value * 5.0) / 1024.0;
  vin = vout / (R2/(R1+R2));
  Serial.print("V = ");
  Serial.print(vin,2);
  Serial.println(" V");
 
  //Watt-meter
  wat = vin*I; 
  Serial.print("Power = ");
  Serial.print(wat);
  Serial.println(" W");
  Serial.println();
   
  //Esc
  val += pwm_increment; //Increase the pwm signal of the ESC by pwm_increment value
  delay(500);
  esc.writeMicroseconds(val); //Using val as the signal to ESC

  if (val > pwm_max+pwm_increment) {
    esc.writeMicroseconds(pwm_min); //Disarm ESC
    Serial.end(); //Disable serial communication
  }
}






Swift

Cosas como esta:
Code: [Select]
delay(500);
te está generando fallos, utilizas millis en tu anterior código y en el otro utilizas delay, este te está deteniendo el programa y hasta que no pase eso no va a leer el sensor de RPM.

AbelMartinez90

Cosas como esta:
Code: [Select]
delay(500);
te está generando fallos, utilizas millis en tu anterior código y en el otro utilizas delay, este te está deteniendo el programa y hasta que no pase eso no va a leer el sensor de RPM.
Gracias por contestar. Me han dicho que puedo hacerlo usando interrupt, pero no se muy bien como hacerlo.

Go Up