Wie schon in Aller Anfang ist schwer geschrieben, beginne ich derzeit, einen eigenen kleinen Roboter zu bauen. Nachdem vor ca. einer Woche meine Reichelt-Bestellung angekommen ist, hatte ich schon mal ein paar Dinge zum Basteln. Mit 2 CNY70 Reflexoptokopplern kann ich jetzt genau zählen, wie viele Schwarz-Weiß-Wechsel auf einer entsprechenden Encoder-Scheibe passiert sind und somit auf die vom Rad zurückgelegte Strecke schließen.
ISR(INT0_vect){
if (MCUCR & (1<<ISC00)){ // if rising edge...
// set to falling edge
MCUCR &= ~(1<<ISC00);
// increase counter
left_counter++;
// start_timer(left);
// turn on led
PORTC |= (1<<PC5);
} else { // if falling edge...
// set to rising edge
MCUCR |= (1<<ISC00);
// stop_timer(left);
// turn off led
PORTC &= ~(1<<PC5);
}
}
int main(void){
// ...// enable external interrupts
MCUCR = (1<<ISC01)|(1<<ISC00); // rising edge of INT0 generates interrupt
GICR |= (1<<INT0); // enable external interrupt INT0
// ...
}
(Sorry, für die grauselige Übersichtlichkeit, aber irgendwie mag Wordpress keinen C-Code... oder ich hab noch nicht raus, wie es geht :( )
In einer zusätzlichen Timerfunktion wird regelmäßig der aktuelle Zählerstand ausgelesen (, in Zukunft ausgewertet) und dann wieder auf Null gesetzt. Darüber lässt sich dann die Zahl der Umdrehungen der Räder (hier nur exemplarisch des linken) messen. Dafür bereitet mir die Abstandsmessung mittels Ultraschall noch einige Probleme: Ich kriege zwar einen Ultraschall-Impuls gesendet, allerdings klappt es mit der Detektion noch nicht so ganz, da ich im Moment keine passenden OPs habe :(
In der Theorie soll es so ablaufen, dass ich einen 3ms langen Ultraschall-Impuls aussende und dann einen Timer starte. Der Timer zählt die Takte, die der Impuls braucht, um wieder detektiert zu werden. Sobald der Impuls erkannt wurde, wird der Timer gestoppt und die Entfernung berechnet: dist = COUNTER / 2 * ULTRASONIC_SPEED * PRESCALER / OSCILLATOR_FREQ;
Sobald der Empfang dann mal funktioniert, müsste die Formel oben noch ein wenig angepasst werden, um den Fehler durch den 3ms langen Impuls herauszurechnen. Naja, es könnte ja so leicht sein, wenn da nicht das Problem des Empfangs wäre :(