Mit dem Ziel, dass die Biene Farben (minimal 2) erkennen kann - sind die beiden oberen Beiträge entstanden. Daneben war ich mehrmals im #roboternetz.de IRC-Chat, in dem ich auf Schumi gestoßen, der mich eine große Hilfe war. Einen besonderen Dank an ihn - an die anderen, die mir geholfen haben, aber auch! =D>
Das Resultat ist nun folgendes (leider in schlechter Qualität):
http://www.youtube.com/watch?v=Y2hlnTpRI9s
Der Aufbau ist folgender:
Ein grüner Gegenstand wird z.T. falsch erkannt, allerdings verwende ich auch grüne Legosteine - die sind etwas dunkel.Code:LED1: [AVR]--[R]--[+LED-]--[VCC] LED2: [AVR]--[R]--[+LED-]--[VCC] LED3: [AVR]--[R]--[+LED-]--[VCC] Sensor: [+5V]--[LDR]--+--[R]--[VCC] [AVR]-----------|
Ein Link zum Aufbau: http://img718.imageshack.us/img718/5...0108193606.jpg
Edit: ein Grund für die oben genannten Ungenauigkeiten sind, dass z.T. Licht direkt von der LED auf den Fotowiderstand fällt - deswegen auch die Papiere, allerdings sind diese nicht wirklich gut. Ich muss morgen mal meinen Schrumpfschlauch suchen, aber den muss ich irgendwie verlegt haben (gestern hab ich ihn nicht gefunden).
Edit2: Anbei noch mein Code (ich bin für Verbesserungen offen - ob der "Dummyreadout" so notwendig ist, sei an dieser Stelle dahingestellt):
Die 0,5 Sek Wartezeit sind wahrs. viel zu hoch dimensioniert, allerdings stört mich die Wartezeit momentan nicht, weshalb ich bisher keinen Grund sehe, diese zu reduzieren.Code:#define StatusLEDs_on PORTB |= (1 << PB1) | (1 << PB2); #define StatusLEDs_off PORTB &= ~((1 << PB1) | (1 << PB2)); #include <nibobee/iodefs.h> #include <nibobee/led.h> #include <nibobee/delay.h> #include <nibobee/analog.h> #include <nibobee/sens.h> #include <avr/io.h> // Aufbau: // Farbe1: [PA0]--[R]--[+LED-]--[GND] // Farbe2: [PA1]--[R]--[+LED-]--[GND] // Farbe3: [PA2]--[R]--[+LED-]--[GND] // Sensor: [+5V]--[LDR]--+--[R]--[GND] // Sensor: [PA3]---------| uint16_t getLightValue() { int Value = 0; int8_t i; // Auslesen for (i = 0; i < 11; i++) { Value = Value + analog_getValue(ANALOG_EXT3); delay(50); } // for return(Value / i); } // getValue() int main() { uint16_t grValue, blValue, reValue; int8_t i; led_init(); // LED initialisieren analog_init(); // Analoge Eingaenge initialisieren sens_init(); // Fuehler initialisieren enable_interrupts(); // Interrupts aktivieren DDRA |= 0b00000111; // PINs als Ausgaenge schalten DDRB |= 0b00000110; // PINs als Ausgaenge schalten // Dummyreadout for (i = 0; i < 11; i++) { grValue = analog_getValue(ANALOG_EXT3); delay(50); } while (1 == 1) { StatusLEDs_on; while ((sens_getLeft() != 0) | (sens_getRight() != 0)) { StatusLEDs_off; // Farbmessungen // 1. gruen PORTA = 0b00000001; // LED anschalten delay(500); // 0,5 Sek. warten grValue = getLightValue(); // Wert des Sensors abfragen // 2. rot PORTA = 0b00000010; // LED anschalten delay(500); // 0,5 Sek. warten reValue = getLightValue() - 25; // Wert des Sensors abfragen // 3. blau PORTA = 0b00000100; // LED anschalten delay(500); // 0,5 Sek. warten blValue = getLightValue() - 75; // Wert des Sensors abfragen // Auswertung if ((grValue > reValue) & (grValue > blValue)) { // gruener Gegenstand PORTA = 0b00000001; // gruene LED an } else if ((reValue > grValue) & (reValue > blValue)) { // roter Gegenstand PORTA = 0b00000010; // rote LED an } else if ((blValue > grValue) & (blValue > reValue)) { // blauer Gegenstand PORTA = 0b00000100; // blaue LED an } else { // keine Erkennung PORTA = 0b00000111; // alle LEDs an } // if } // while - Fuehler } // while - Endlosschleife return 0; }







Zitieren

Lesezeichen