Recuento rápido de objetos de sensor con Arduino

0

Necesito contar objetos de 5-10 mm con el uso de 2 sensores en el mega board de arduino. He usado un sensor fotoeléctrico pero es realmente muy lento. Tengo que usar los comandos de retardo (1000) después de contar un objeto porque no está listo para contar un nuevo elemento antes de este período (no sé si este problema está relacionado con el sensor o con mega). Si no uso este período de espera, entonces cuenta con 2-3 elementos, aunque solo 1 artículo pasa por el sensor.

Necesito contar 2 o 3 elementos cada segundo. Incluso no pude usar 1 sensor correctamente y necesito usar dicho sensor 2 en 1 mega board. ¿Qué me ofrece YPU? ¿Los sensores capacitivos son mejores y más rápidos? ¿O no es Arduino lo suficientemente rápido para este proyecto?

Aquí está mi código: (Yo también uso Ethernet Shield)

#include <Ethernet.h>
#include <SPI.h>

int sensorPin = A2;    
int ledPin = 13;      
int MachineID=2;
int sensorValue = 0;  
int dummy=0;
unsigned long TimerB=0;
unsigned long LastTime=0;
unsigned long CurrentTime =0;
unsigned long ElapsedTime =0;
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xE0 };
byte ip[] = { 10, 10, 10, 113 };
byte server[] = { 10, 10, 10, 112 }; 
//byte server[] = { 10, 10, 10, 30 }; 
EthernetClient client;

void setup()
{
    Ethernet.begin(mac, ip);
    Serial.begin(9600);
    digitalWrite(ledPin, LOW);
    delay(1000);
    if (client.connect(server, 8080)) {
        Serial.println("connected");
        digitalWrite(ledPin, HIGH);
        LastTime = millis();    
    } else {
        Serial.println("connection failed");
    }
}

void loop()
{
    dummy=0;  
    dummy=SensorControl();
    if (dummy>0) {
       //Send data to SQL
    }
}

int SensorControl()
{
    sensorValue=0;
    sensorValue = analogRead(sensorPin);
    if (sensorValue>1020) {
        // Sometimes objects stays in front of sensor for a while.
        // So i have to wait until objects leave
        while (sensorValue>1020) {
            sensorValue = analogRead(sensorPin);
        }
        //Here i have to wait 1 seconds
        TimerB=millis();
        while (millis()-TimerB <= 1000) { }
        return MachineID;  
    } else {  
        return 0;
    }
}
    
pregunta Murat

2 respuestas

0

No sé si has resuelto esto, pero aquí está mi pensamiento.

Para empezar, usar el analógico para leer una señal es muy inexacto, especialmente porque es un fotorresistor. Recomendaría agregar un comparador con histéresis para obtener un pulso digital limpio, como se muestra a continuación:

simular este circuito : esquema creado usando CircuitLab

Esto tiene los valores correctos.

Luego, agregaría una rutina de código basado en interrupciones que detectará el flanco ascendente de la señal y permanecerá inactivo mientras tenga algo al frente. El código siguiente se realiza con el arduino attachInterrupt() para simplificar.

attach interrupt(0, isr, RISING); 

 volatile int flag = 0;

void isr(){
flag = 1;  // set the flag when a rising edge exists
}

void loop(){
// other code
  dummy = SensorControl2();
 if(dummy > 0){
  // do something
}

  else{
  return 0;
   }
}

void SensorControl2(){    

if(flag){

flag = 0;

return MachineID;

    }  

else{

return 0;

  }

}

Este método produce resultados muy confiables y no tiene retraso en la función. También es preciso que los objetos se muevan rápidamente debido a la interrupción.

    
respondido por el RSM
0

Creo que es su código el que está causando la desaceleración, especialmente ese bucle while (ya está anidado dentro de loop ()). También podría ser Ethernet pero lo dudo.

Prueba esto. Use una bandera para determinar si un objeto fue detectado previamente o no, por lo que no tiene que escribir un bucle while anidado.

int objDetected = 0;    // flag
int detection = 1020;   // detection threshold

void loop()
{
    dummy=0;  
    dummy=SensorControl2();
    if (dummy>0) {
    //Send data to SQL
    }
}

int SensorControl2()
{
sensorValue = analogRead(sensorPin);

if (sensorValue > detection) {
    // Sensor senses something for the first time, sets flag
    if (objDetected == 0) {
        Serial.println("object detected");
        objDetected = 1;
        return MachineID;
    }
    // Sensor senses something but object is still there
    else {
        return 0;
    }
}
// There is no object detected, reset the flag
else {
    objDetected = 0;
}
    
respondido por el John Fu

Lea otras preguntas en las etiquetas