domingo, 12 de abril de 2015

Sensor Ultrasónico en Arduino sin pulseIn ni Interupciones

Este post es probable que no parezca interesante, pero tiene su gracia.

Arduino cuenta con intrucciones como micros(), millis() y seconds(); las cuales incrementan un contador desde que arranca el programa y de acuerdo a su resolución, el desbordamiento va desde minutos hasta días.

Por lo leido en los foros de Arduino, la función PulseIn, usada por algunos para la lectura de sensor ultrasonico.


El siguiente es un código que hice solo como prueba para no usar PulseIn, pero con la ayuda de la intrucción micros()


int trig = 7;
int echo = 6;
int led = 13;
void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
  pinMode (trig, OUTPUT);
  pinMode (echo, INPUT);
  pinMode (led, OUTPUT);
  

}
int count1=0, count2=0;
int valor;
void loop() {
  // put your main code here, to run repeatedly:
  count1 =count2 = 0;
  digitalWrite(trig,LOW);
  delay(1);
  digitalWrite(trig,HIGH);
  delayMicroseconds(10);
  digitalWrite(trig,LOW);
  
  
  while(!digitalRead(echo)){}
    count1 = micros();
  while(digitalRead(echo))
  {
  }
  count2 = micros();
  valor = count2-count1; 
  int cm = (valor/2)/29.1;
  Serial.print(valor);
  Serial.println(" ticks");
  Serial.print(cm);
  Serial.println(" cm");
  
  delay(250);
  digitalWrite(led,LOW);
}
Se realizo un comprativo entre este código y el que usa pulseIn, tal comparativo se utilizó un vaso con agua y en sensor como medido de distancia hacia el agua, la cantidad de muestras para ambos casos fue de 113 y se debe tomar en cuenta que la colocacion del sensor no fue la mas adecuada.