Ich habe seit Monaten den Dagu Compound Eye auf meinem Basteltisch rumliegen und heute bin ich endlich dazu gekommen, ihn zu testen.
Als Controller kam ein ATmega328 mit Arduino Bootloader, schön verpackt auf einem Boarduino für Steckbrettmontage. Der Sensor benötigt vier analoge Eingänge und bei Bedarf einen digitalen Ausgang für Enable. Versorgt wird der Sensor mit meiner Lieblingsspannung 5Volt 😀 Zwischen den Versorgungsleitungen Vcc und GND habe ich noch zusätzlich einen 100nF Keramikkondesator gesteckt
Die Funktion des Sensors ist ziemlich einfach. Die 4 IR-LEDs in der Mitte strahlen IR-Licht ab, der von dem Gegenstand, der sich vor dem Sensor befindet, reflektiert wird. Je stärker die Reflektion, desto mehr Strom leiten die IR-Empfänger (Fototransistoren, insgesamt 4 Paare auf dem Board) und desto höhere Spannung liegt an den Widerständen an. Diese Spannung wird dann mit Analogeingängen des Controller gemessen. Je näher sich ein Gegenstand zu einem IR-Ampfänger Paar befindet, umso höher ist die Spannung an dem jeweiligen Analogeingang.
Dazu habe ich ein kleines Programm geschrieben, das die Werte im Terminal ausgeben soll.
Da der Sensor später mit Sicherheit auf einem Roboter landen wird, habe ich beim Programmieren, die Perspektive des Roboters eingenommen.
Pro Durchlauf wird es zweimal gemessen – einmal mit IR-Licht und einmal ohne. Die Differenz ist dann der Messwert, den man weiter verarbeiten kann (z.B. für Pan-Tilt) Das ist quasi eine einfachste Kalibrierung des Sensors, um die Störungen durch Umgebungslicht, das auch IR Anteile hat, auszufiltern.
Bei strahlender Sonne, habe ich es noch nicht ausprobiert, könnte mir aber schon vorstellen, dass es problematisch sein könnte. In der Wohnung mit LED Bleuchtung, kann man auch auf die Kalibrierung verzichten 🙂
Programmbeispiel
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 |
/* https://5volt-junkie.net Test compound eye Verdrahtung, Ansicht hinten GND EN I I I I Vcc | | | | | | | GND 13 A4 A3 A2 A1 Vcc */ int enable = 13; //Analoge Eingaenge int top = A1; int left = A2; int bottom = A3; int right = A4; //Variablen Umgebungslicht + Infrarot int absolute_top = 0; int absolute_left = 0; int absolute_bottom = 0; int absolute_right = 0; //Variablen nur Umgebungslicht int offset_top = 0; int offset_left = 0; int offset_bottom = 0; int offset_right = 0; //Variablen Differenz aus mit und ohne IR int relative_top = 0; int relative_left = 0; int relative_bottom = 0; int relative_right = 0; void setup() { pinMode(enable , OUTPUT); digitalWrite(enable , LOW); Serial.begin(9600); } void loop() { //Werte bei IR=AN einlesen digitalWrite(enable , HIGH); delay(5); absolute_top = analogRead(top); absolute_left = analogRead(left); absolute_bottom = analogRead(bottom); absolute_right = analogRead(right); //Werte bei IR=AUS einlesen digitalWrite(enable , LOW); delay(5); offset_top = analogRead(top); offset_left = analogRead(left); offset_bottom = analogRead(bottom); offset_right = analogRead(right); //Differenz berechnen relative_top = absolute_top-offset_top; relative_left = absolute_left-offset_left; relative_bottom = absolute_bottom-offset_bottom; relative_right = absolute_right-offset_right; //Und im Terminal ausgeben Serial.println("##########################"); Serial.print("top= "); Serial.println(relative_top); Serial.print("bottom= "); Serial.println(relative_bottom); Serial.print("left= "); Serial.println(relative_left); Serial.print("right= "); Serial.println(relative_right); Serial.println("##########################"); //Kurze Pause delay(2000); } |