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:
Code:
LED1: [AVR]--[R]--[+LED-]--[VCC]
LED2: [AVR]--[R]--[+LED-]--[VCC]
LED3: [AVR]--[R]--[+LED-]--[VCC]
Sensor: [+5V]--[LDR]--+--[R]--[VCC]
[AVR]-----------|
Ein grüner Gegenstand wird z.T. falsch erkannt, allerdings verwende ich auch grüne Legosteine - die sind etwas dunkel.
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):
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;
}
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.
Lesezeichen