Hallo
Ja, es lag zum einen am "Übersprechen" der Signale und zum Anderen daran, das man eine Bibliothek auch richtig einbinden muss.
Ich habe nun auf Lichtwellenleiter umgerüstet. Die Lampe habe ich zwar gekauft, aber mehr als eine Testfaser habe ich nicht abschneiden dürfen. (Anweisung meiner Frau die diese Lampe toll findet und sie in unserem Wohnzimmer plaziert hat). *grummel*
Inzwischen weis ich, die Fasern der Lampe sind zu dünn. Deshalb war ich kurz beim C ( vorteil der Grosstadt mit eigener Finiale) und habe Lichtwellenleiter als Meterware gekauft; zwischen 0,5 und 1 mm kosten ca. 0,50 bis 1€ pro Meter. Den Aufbau werde ich euch in einem anderen Thread schildern, das Ergebniss sieht so aus:
Bild hier
(Anklicken für 17 Sek. AVI, 2MB)
Die Idee ist aus diesem Thread, allerdings habe ich nur einen Sensor und kann deshalb noch nicht erkennen, wenn das Blatt zur Seite ausweicht.
Hier noch der Code:
Code:
#include "../inc/ir-asuro.h"
unsigned char dist, dist_soll, dist_max, m_power, m_dir_l, m_dir_r, step;
int main(void)
{
Init();
step=0;
do {
switch (step) {
// init
case(0): m_dir_l=m_dir_r=FREE; m_power=200; dist_max=0x50; dist_soll=150;
DDRD |= (1 << DDD1); // Port D1 als Ausgang
PORTD &= ~(1 << PD1); // PD1 auf LOW
OCR2 = dist_max;
step=10; break;
// etwas vor der Nase?
case(10): MotorSpeed(m_power,m_power); dist=0xFF; step++; break;
case(11): if (dist>dist_max) dist--; else step=20;
DDRD |= (1 << DDD1); PORTD &= ~(1 << PD1); OCR2==dist;
if (!(PIND & (1 << PD0))) step=12; break;
// Fahren
case(12): StatusLED(GREEN); m_dir_l=m_dir_r=FREE;
if (dist < dist_soll) { StatusLED(RED); m_dir_l=m_dir_r=FWD; }
if (dist > dist_soll) { StatusLED(YELLOW); m_dir_l=m_dir_r=RWD; }
MotorDir(m_dir_l,m_dir_r); step=10; break;
// Kante suchen
case(20): StatusLED(RED); MotorDir(FWD,FWD); step=10; break;
}
} while(1);
return 0;
}
(ir-asuro.h und .c sind die Libarys aus dem IR-Abstandsmessungsthread)
und das Hex-File im Anhang.
Gruß
mic
Lesezeichen