====== SDM-IO Ultraschall Distanz Sensor ======
{{:sensors:47027a.jpg?200x154 |SDM-IO Ultraschall Sensor}}
Der [[http://shop.boxtec.ch/product_info.php/products_id/40374|SDM-IO Ultraschall Sensor]] hat im Gegensatz zu den meisten anderen Ultraschall-Sensoren eine rel. kleine Blind-Zone. D.h. bei sehr kurzen Distanzen unter 1-2cm werden die Messwerte bei vielen Sensoren ungenau, dies nennt man die Blind Zone.
Leider ist der Sensor aber auch in anderer Hinsicht anders als z.B. der HC-SRC04 den Itead ebenfalls anbietet: D.h. im Klartext die Library "Ultrasonic" lässt sich für den SMD-IO nicht verwenden.
Ein Grund dafür ist u.a., dass der SDM-IO mit negativen Pulsen arbeitet, während der HC-SR04 und die meisten anderen Ultraschall Sensoren wie z.B. der [[http://shop.boxtec.ch/product_info.php/products_id/40323|Ultraschall Sensor von Seeed]] mit postiven Pulsen arbeiten, dies wird jedoch nur aus den Signal Diagrammen der beiden Sensoren ersichtlich:
== HC-SR04: ==
{{:sensors:hc_sr04_sig.png|Signal Diagramm HC-SR04}}
== SDM-IO: ==
{{:sensors:47027_signal.jpg?618x232|Signal Diagramm SDM-IO}}
===== Messwert Übermittlung SDM-IO =====
Ein weiterer Unterschied ist auch, dass beim SDM-IO nicht die Länge des Pulses den Messwert darstellt, sondern die Zeit bis zum Puls. Der Puls selber hat entweder eine Länge von 150us wenn die vorhergehende Zeit einen Messwert darstellt oder 10ms wenn kein Objekt detektiert wurde innerhalb der Messspanne von 150cm.
===== Arduino Code / Library =====
Der Sensor kann auch ohne Library relative einfach ausgelesen werden, der Offset ist dabei auf min 150 zu setzen, darauf aufbauend kann mit diesem Wert der Sensor noch leicht //feinkalibriert// werden:
// (c) 2012 boxtec internet appliances
// This code is under the BSD license
#define trig_pin A3
#define echo_pin 2
#define toffset 170
volatile long t0, t1;
long duration;
void setup() {
pinMode(trig_pin, OUTPUT);
pinMode(echo_pin, INPUT);
digitalWrite(trig_pin, LOW);
Serial.begin(9600);
Serial.println("Starting ranging...");
}
void loop() {
digitalWrite(trig_pin, LOW);
delayMicroseconds(2);
digitalWrite(trig_pin, HIGH);
delayMicroseconds(10);
digitalWrite(trig_pin, LOW);
attachInterrupt(0, timer_stop, FALLING);
t0 = micros();
delay(100);
Serial.print("Delay(us): ");
Serial.println(t1);
Serial.print("Distance: ");
Serial.println(t1 / 29.411 / 2);
detachInterrupt(0);
delay(1500);
}
void timer_stop() {
t1 = micros() - (t0 + toffset);
}
Die Verwendung eines Interrupts ist suboptimal um es vornehm zu sagen, aber auf die Schnelle ist uns keine andere Idee gekommen. Dies erschwert es notabene auch gleichzeitig die LCD Library oder andere Libraries welche **delayMicroseconds** einsetzen zu verwenden.
=== Update von Itead [10.2.2012] ===
Wir haben Itead benachrichtigt, dass die angebotene Library nicht mit dem Sensor funktioniert und haben darauf folgendes Code Beispiel von Itead erhalten, welches wir hier mit freundlicher Erlaubnis von Itead zur Verfügung stellen:
//---------------------------------------------------------------------------
//Code for using SDM-IO with Arduino
#define TIMEOUT_OVERFLOW 1000
int TrigPin = 2;
int EchoPin = 3;
unsigned long ultrasoundDuration;
void setup()
{
Serial.begin(9600);
}
void loop()
{
unsigned char pin = 0;
unsigned int time_flag = 0;
pinMode(TrigPin, OUTPUT); //pin is output
pinMode(EchoPin, INPUT); // pin is now input
digitalWrite(TrigPin, HIGH);
delayMicroseconds(2);
digitalWrite(TrigPin, LOW);
delayMicroseconds(10);
digitalWrite(TrigPin, HIGH);
// wait for a LOW pulse
//ultrasoundDuration = pulseIn(EchoPin, HIGH);// will not work for HIGH pulse
TCCR1A = 0x00;
TCNT1 = 0x0000;
TCCR1B = 0x01;
pin = digitalRead(EchoPin);
while(pin)
{
pin = digitalRead(EchoPin);
time_flag++;
if(time_flag > TIMEOUT_OVERFLOW)
break;
}
TCCR1B = 0x00;
ultrasoundDuration = TCNT1;
ultrasoundDuration = ultrasoundDuration / 16;
// get results
Serial.print(ultrasoundDuration);
Serial.print(" us, ");
//Serial.print(ultrasoundDuration/148, DEC); //divide with 148 and you get inches
//Serial.print(" inches, ");
Serial.print(ultrasoundDuration*0.017, DEC); //divide with 58 and you get cm
Serial.print(" cm");
Serial.println();
delay(100);
}
===== Referenzen =====
* [[http://letsmakerobots.com/node/28972|SDM-IO ultrasonic and PICAXE code headache]]
* [[http://letsmakerobots.com/node/28954|Need translator for SDM-IO arduino-to-PICAXE/ code help]]