Archiv verlassen und diese Seite im Standarddesign anzeigen : Asuro: Umbau der IR-Schnittstelle zur Hinderniserkennung
Auf Wunsch beschreibe ich hier nochmal den Umbau der IR-Schnittstelle des Asuro zum IR-Hindernisdetektor. Es wurde zwar schon in diesem Thread
https://www.roboternetz.de/phpBB2/viewtopic.php?t=10026
vorgestellt, aber hier ist es jetzt in einem Beitrag zusammengefasst, im Detail beschrieben und mit Beispielcode.
Im Asuro ist bereits alles dafür vorhanden, die IR-Diode SFH415-U (D10) als Sender und der Baustein SFH5110-36 (IC2) als Detektor. Man muß nur die beiden Bauteile mechanisch nach vorne ausrichten. Vorsicht beim Auslöten von IC2, das geht nicht so ganz einfach. Man sollte das geeignete Werkzeug zur Hand haben, sonst könnte der Baustein kaputt gehen. Elektrisch kann die Schaltung bleiben, damit auch weiterhin das Flashen und die Funktion als serielle IR-Schnittstelle wie gewohnt möglich sind. Den mechanischen Umbau kann man recht gut in dem Bild erkennen. Befestigt ist der Aufsatz mit einem Gewindebolzen in dem bereits vorhandenen Loch in der Asuroplatine. Wichtig für eine gute Funktion sind der Mittelsteg und das so weit nach vorne gezogene untere Blech. Der Mittelsteg verhindert eine direkte optische Kopplung zwischen Sendediode und Empfänger und das vorgezogene Blech vermeidet Reflektionen von Bauteilen des Asuro bzw. vom Untergrund direkt vor dem Asuro. Die elektrischen Verbindungen werden einfach mit isolierten Litzen von der Asuroplatine zu dem Aufsatz gezogen (siehe auch Bild).
https://www.roboternetz.de/phpBB2/files/asuroir.jpg
Um nun ein Hindernis detektieren zu können, muss man nur die IR-Diode mit 36kHz versorgen. Das ist die Frequenz, die der IR-Empfänger SHF5110-36 braucht. Der Ausgang des IR-Empfängers wird dann auf LOW gezogen, wenn ein reflektiertes Signal erkannt wird. Das 36kHz-Signal ist im Asuro schon vorbereitet und steht am Ausgang PB3 an. Die IR-Diode ist über einen Vorwiderstand an PB3 und an PD1 angeschlossen. Man braucht also nur den Ausgang PD1 am Atmega auf LOW setzen und schon sendet die IR-Diode. Folgende 2 Zeilen im C-Programm sorgen dafür:
DDRD |= (1 << DDD1); // Port D1 als Ausgang
PORTD &= ~(1 << PD1); // PD1 auf LOW
Die Auswertung des IR-Empfängers erfolgt über den Eingang PD0 des Atmega mit z.B. folgendem Code:
if (!(PIND & (1 << PD0))) // prüft Eingang PD0 auf LOW
Das ist die einfache Version der Hinderniserkennung mit der unveränderten Library "asuro.c". Ich habe zusätzlich noch eine Erweiterung durchgeführt, damit die Intensität der IR-Diode gesteuert werden kann. Das ermöglicht auch eine Erkennung bei geringeren Entfernungen, denn in der einfachen Version ist die Empfindlichkeit maximal und die Hindernisse werden meist bei 1 Meter oder mehr erkannt. Dazu musste ich allerdings die Library "asuro.c" verändern. Wer die Erweiterung haben will, muss auch meine Lib verwenden. Die Lib ist auf der Weja-Lib aufgebaut, wer die bereits benutzt, braucht also auf nichts zu verzichten. Mit meiner Lib "asuro.c" kann man die Intensität der IR-Diode mit der Pulsbreite des 36kHz-Signals steuern. Die Pulsbreite wird mittels Output Compare Register (OCR2) programmiert. Im Prinzip ist es eine PWM für die IR-Diode. Die kleinste einstellbare Pulsbreite ist 125ns, was dem µC-Takt entspricht und die grösste sinnvolle Pulsbreite ist 13,75µs, was 50% Tastverhältnis entspricht. Hier einige Beispiele zur Programmierung:
OCR2 = 0xFE; //Pulsbreite 1 entspricht 125ns
OCR2 = 0xFD; //Pulsbreite 2 entspricht 250ns
:
OCR2 = 0x90; //Pulsbreite 110 entspricht 13,75µs
Die Pulsbreite entspricht also der Differenz aus 255 und dem OCR2-Register.
Mit der Programmierung der Pulsbreite ist es nun möglich die Empfindlichkeit so weit runter zu drehen, dass der Detektor auch erst bei Objekten in 3cm Abstand anspricht. Damit kann man sich relativ gut an Objekte annähern. Allerdings ist zu sagen, dass das Prinzip keine exakte Abstandsmessung zulässt, da die Stärke der Echos abhängig ist vom Reflexionsfaktor des Objektes. Je nach Farbe und Winkel wird ein stärkeres oder schwächeres Signal reflektiert. Das ist aber generell so bei IR-Detektoren, Ausnahme sind die Sharp-Detektoren, die nach einem anderen Prinzip arbeiten.
Meine Lib "asuro.c" und auch "asuro.h" sind in dem zip-File im Anhang zu finden.
Hier noch 2 kleine Testprogramme. Für beide ist meine Lib notwendig.
Mit dem 1. Testprogramm lässt sich anhand der Taster am Asuro die Pulsbreite und damit die Empfindlichkeit einstellen. Die Status-LED zeigt mit dem Wechsel von grün auf rot ein erkanntes Objekt an. Das Testprogramm verdeutlicht sehr schön die Wirkung der Pulsbreite.
#include "asuro.h"
#include <stdlib.h>
int main(void)
{
unsigned char sw;
Init();
DDRD |= (1 << DDD1); // Port D1 als Ausgang
PORTD &= ~(1 << PD1); // PD1 auf LOW
while(1)
{
if (PIND & (1 << PD0))
StatusLED(GREEN);
else
StatusLED(RED);
sw = PollSwitch();
if (sw & 0x01)
OCR2 = 0xFE; //Pulsbreite 1
if (sw & 0x02)
OCR2 = 0xFD; //Pulsbreite 2
if (sw & 0x04)
OCR2 = 0xFB; //Pulsbreite 4
if (sw & 0x08)
OCR2 = 0xF7; //Pulsbreite 8
if (sw & 0x10)
OCR2 = 0xEF; //Pulsbreite 16
if (sw & 0x20)
OCR2 = 0x90; //Pulsbreite 110
}
return 0;
}
Im 2. Testprogramm wird die Pulsbreite laufend von 1 bis 110 durchgesweept. Je nach Entfernung verändert sich die Farbe der Status-LED von rot über orange nach grün.
#include "asuro.h"
#include <stdlib.h>
int main(void)
{
float puls;
Init();
DDRD |= (1 << DDD1); // Port D1 als Ausgang
PORTD &= ~(1 << PD1); // PD1 auf LOW
puls = 1;
while(1)
{
if (PIND & (1 << PD0))
StatusLED(GREEN); // kein Hindernis
else
StatusLED(RED); // Hindernis erkannt
puls = 1.02 * puls; // Pulsbreite wird um 2% erhöht
if (puls > 110) puls = 1;
OCR2 = 255 - (int)(puls);
}
return 0;
}
Mit den beiden Testprogrammen kann man nun spielen und herausfinden wie der IR-Detektor auf verschiedene Objekte reagiert.
Ich hoffe es gefällt und freue mich auf Feedback und vielleicht sogar Verbesserungen.
Gruss Waste
Hallo Waste,
Tolle Arbeit =D> ,
ich denke, es werden Dir mehrere Asuro Besitzer dankbar sein !!
Gruß Sebastian
Hallo, das sieht hervorrgend aus, vor allem da man sich keine neuen teile zusammen suchen muss.
Ich nehme an die Taster musstest du aus platzgruenden nach unten setzen, aber warum hast du beim rechten eine bruecke eingebaut?
Hallo Jeanluc,
die Brücke ist nur ein Massebügel zum einfachen Anklemmen für die Masseklemme meines Tastkopfs.
Bei meinem Bausatz wurden spiegelverkehrte Taster mitgeliefert, das habe ich aber erst gemerkt nachdem ich schon 4 eingelötet hatte. Oben wären sie unsymmetrisch, also habe ich sie unten eingebaut.
Waste
Super waste!!!
Herzlichen Dank! :D
Jetzt muss ich nur noch umlöten.
So long
Andun
Ich werde mich auch mal ans umlöten machen. Muss mir nur noch das Blech schneiden, und dass kann bei mir länger dauern :D
Ja. Ich muss auch erstmal Teile beschaffen.
Hi! Coole Idee. Ich bekomme meinen asuro erst noch diese woche und bin somit am überlegen das gleich so zu bauen.
Nun meine Frage: Wie kann ich den IC2 noch für die serielle Schnittstelle nutzen (wie oben beschrieben) wenn ich ihn ausgelötet hab und für die Abstandserkennung nutze?
Du änderst nichts an der Schaltung, sie bleibt wie sie ist. Du baust nur den IC2 und die IR LED an eine anderen Stelle.
Wenn du den Asuro programmierst ist also noch alles wie sonst, nur dass die Bauteile nach vorne zeigen. Die Abstandserkennung wird erst im Programm aktiviert
Na aber der IC2 ist doch auf dem Infarot Transceiver eingelötet und die IR LED auf der Hauptplatine des Asuro. Das sind doch zwei getrennte Bauteile!?
Und nun löte ich den IC2 auch auf die Hauptplatine. Nun is doch der Transceiver ohne IC2 und hat keine verbindung zur Hauptplatine oder?
Sorry wenn ich das jetz falschsehe aber ich hab den asuro noch nich und berufe mich nur auf die Erkenntnisse aus der Anleitungs pdf.
Oh ich glaub ich habs jetz gesehen! Die teile sind zweimal vorhanden auf dem Tranceiver und auf der Hauptplatine stimmts? :-k Sorry!
Hä? Ich glaub du verwechselst da was.
Du machst einfach nur den IR Sender und Empfänger(IC2) an Kabel und richtest sie anders aus. Das ist schon alles. Im Programm kann man damit dann halt auch was machen.
hallo toby,
was hat da keine Verbindung zu Hauptplatine ?
Wenn Du Dir das Foto von Waste anschaust hat er wohl ein paar Drähte richtung Platine eingelötet oder?
Es ist wohl Wurst, od die 2 Bauteile direkt auf der Platine eingelötet sind, oder über ein paar Drähte verbunden sind.
P.S. Ich habe es gerade umgebaut und es klappt prima!
Ob Waste eine "Asuroumbauwelle" damit ausgelöst hat?
Gruß Sebastian
EDIT: Andun war etwas schneller...
Oh ich glaub ich habs jetz gesehen! Die teile sind zweimal vorhanden auf dem Tranceiver und auf der Hauptplatine stimmts? :-k Sorry!
Ja ich hab da was verwechselt! :-#
Du brauchst Dich nicht zu entschuldigen, jeder darf sich mal irren, Aber was ist da zweimal vorhanden?
Es gibt da kein Bauteil mehr, und kein weniger :-k
Gruß Sebastian
Danke! Na doch. Den IC2 sowie die IR LED gibt es doch jeweils auf der Hauptplatine sowie auf dem Tranceiver.
Ich habe eben fälschlicherweise gedacht die Bauteile gäbe es nur auf dem Tranceiver.
Ich hoffe der Science Shop liefert bald, ich will auch endlich basteln. :-)
bei mir haben die in 4 Tagen geliefert, kannst also bald anfangen
Hallo Waste!
Ist ja eine saugeile Idee! Wenn mir das vor zwei Jahren eingefallen wäre, hätte ich's gleich mit eingebaut!
CU, Robin
Hallo Robin,
falls es mal ein Upgrade oder eine neue Variante vom Asuro gibt, kannst es ja einbauen. Meinen Segen dazu hast.
Gruss Waste
Ich hab zwar meinen Asuro noch nich (ist erst letzte Woche bestellt worden), aber das hier bau ich gleich von Anfang an mit rein! Ist ein absolut super Mod!!! Hammergute Idee, danke auch von meiner Seite aus für die genial einfache Lösung!
Werd auch mal versuchen, mit kleinen Reflektoren um den Sender und Empfänger herum die Empfindlichkeit nochmal zu steigern (und damit türlich das "geradeaus" gucken).
Cooool! Dankööö! :)
Hallo! Ich finde die Idee mit der IR-Hinderneserkennung wirklich sehr gut, daher habe ich es auch meinem Asuro damit umgebaut. Nun habe ich ein Programm geschrieben (im Anhang), wo Asuro Hindernissen ausweicht (außer schwarze Hindernisse).
Also, wenn er ein Hindernis entdeckt, guckt er, in welcher Richtung er diese am Besten umfahren könnte und somit sucht er sich den Weg (z.B. durch die Wohnung) alleine. Wenn sich keine Hindernisse im Weg befinden, fährt er geradeaus. Wenn ihr noch verbesserungen habt, würde ich mich freuen, diese zu posten.
MfG julien
pebisoft
09.10.2005, 20:34
einfacher ist ein is471f. braucht weniger ressourcen vom avr. und ist einfacher zu steuern bzw zu regeln. auch für den anfänger in winavr-c ist er besser zu proggen. die asuro-grundprogramme haben langsam dimensionen, wo der speicher fast am überlaufen ist und an übersichtlichkeit zu wünschen übrig lassen. der anfänger hat es sehr sehr schwer.
mfg pebisoft
Lieber Pebisoft,
Du machst mich mal wieder neugierig, wieso der IS471 weniger Ressourcen in dieser Anwendung verbraucht. Kannst Du mir das anhand eines Beispielcodes erklären?
Gruß Waste
pebisoft
09.10.2005, 22:50
da wird extra timer2 verbraucht um die 36khz zu erzeugen.
der is471 braucht kein timer und es kann die entfernung am adc-port abgegriffen der auch für den anfänger leichter zu proggen ist und auch hier kann über pwm die entfernung abgetastet werden. der is471 reagiert nicht so empfindlich auf verschiedene materialien wie die zur zeit verwendete ir auf dem asuro. ist in der erkennung stabiler.
mfg pebisoft
Und wie soll dann weiterhin die serielle IR-Schnittstelle (flashen) funktionieren, wenn der IS471 die bisherige Schnittstelle ersetzt?
Und wie kann am IS471 die PWM eingestellt werden?
Waste
pebisoft
10.10.2005, 08:54
ich flashe meinem avr8 über isp, weil die interne routine zuviel speicherplatz wegnimmt. ich kann meine entfernung auf der is471-platine mit einem poti feststellen oder aber auch über pwm einstellen, geht beides.
man sollte sich beim asuro von dem flashen per ir-diode trennen.
ich wundere mich, das dieses noch keiner ernsthaft umgesetzt hat von den entwicklern dieser spielmaschine, wird höchste zeit.
ich habe einen null-kraftsockel draufgebaut.
mfg pebisoft
Lieber pebisoft,
ich glaube, Du hast den Thread gar nicht richtig gelesen oder ihn nicht verstanden. Es ist doch der Charme, dass eine schon vorhandene Funktionseinheit mit der IR-Hinderniserkennung erweitert wird. Es werden keine neuen Ressourcen gebraucht.
Nun zu deinem Vorschlag:
der is471 braucht kein timer und es kann die entfernung am adc-port abgegriffen Ein ADC-Port ist beim Asuro nicht mehr frei, es müsste eine bestehende Funktion entfallen --> also zusätzlicher Ressourcenverbrauch
ich kann meine entfernung auf der is471-platine mit einem poti feststellen oder aber auch über pwm einstellen, geht beides.Mit PWM wird doch wieder ein Timer verbraucht, also doch keine Einsparung. Ich bezweifle allerdings, dass der IS471 mit einem anderen Takt als dem eigenen richtig funktioniert.
Die IR-Schnittstelle beim Asuro ist nicht nur für das Flashen da, das ist Dir wohl entgangen. Man kann damit auch Daten übertragen. Ist sehr nützlich für eine Fehlersuche. Außerdem kann man damit den Asuro mittels Fernbedienung steuern. Warum sollte man auf diese Funktionalität verzichten und einen komplizierten Umbau auf ISP vornehmen. Nur um die IS471 verwenden zu können?
Also Pebisoft, Du hast mal wieder Stuss geschrieben und das zum wiederholten Male. Aus einem anderen Beitrag fehlt mir immer noch eine Antwort von Dir. Aber wenn Du merkst, du bist auf dem Holzweg, antwortest Du einfach nicht mehr. Ich würde es sehr begrüßen, wenn Du Dich in Zukunft aus meinen Beiträgen raushältst.
Waste
@pebisoft
Die Kunst ist es, mit aus vorhandenem das Beste zu machen.
Deine Roboter sind zwar interessant, aber leider auch technischer Overkill.
Und die Lösung von Waste ist
1. Einfach
2. hat einen Doppelnutzen
3. und man glaub im ersten Moment nicht , dass es geht
Und genau deshalb ist die Lösung von Waste genial.
Gruss,
stochri
Hallo,
Da muß ich endlich auch was dazusagen,
Und genau deshalb ist die Lösung von Waste genial.
Genau, so sehe ich das auch, ich bin froh, daß ich meinen Asuro auch umgebaut habe.
man sollte sich beim asuro von dem flashen per ir-diode trennen.
Lieber Pebisoft, ich weiß nicht, was Du gegen die IR-Schnittstelle hast,
nur weil Du es nicht auf die Reihe kriegst, damit zu arbeiten, soll es nicht heißen, daß sie abgebaut werden soll, ich hatte bis jetzt auch keine Probleme damit, sie hat immer super funktioniert, ich bin es leid, immer lesen zu müssen, daß man damit nicht klar kommt, Asuro sowieso nur dummes Spielzeug ist, jeder soll sich aus irgendwelchen Küchenbrettern einen Roboter zusammenbauen, und avr-gcc wohl das letzte ist.
Lass die Leute doch antun, es gibt noch welche, die den Asuro super finden,
und Deine dummen Bemerkungen nicht lesen wollen.
Gruß Sebastian
Als ich vor einige Tagen in 3Sat mir Nano angesehen habe, kam folgendes Thema:
Berufseinsteigern fehlt es (oft) an sozialer Kompetenz
Ein Drittel der Unternehmen trennt sich rasch wieder von den Berufseinsteigern, weil es diesen an sozialer Kompetenz fehlt. Das zeigen Studien des Nürnberger Instituts für Arbeitsmarktforschung (IAB) und der Deutschen Industrie- und Handelskammer. Fachliche Mängel beklagen nur 38 Prozent der befragten 2100 Unternehmen, aber mehr als die Hälfte die Mängel in der Sozialkompetenz. 20 Prozent der Auszubildenden und viele Hochschulabsolventen haben Probleme, sich sozial zu integrieren.
Ein Arbeitgeber gab ein Beispiel für solch einen Misserfolg.
Der Mitarbeiter wollte sich mit seinen Ideeen nicht nur bei den Kolegen sondern auch bei den Kunden unbedingt durchsetzen. #-o
Felix Konrad
20.10.2005, 20:30
Ich habe den robot zwar noch nicht, habe aber die ganzen beiträge gelesen. vielleicht ist es ja noch eine anregung für profis die IR sensoren so anzuordenen das der robot merkt, wenn er auf eine treppe zufährt und dann abbremst. meine idee ist es das die IR sender auch nach untenstrahlen kann (also das man das blech auf der entsprechenden seite etwas kürzt) und der empfänger somit immer einen leichten strahl durch die reflektion abbekommt.
wenn es föllig falsch war schlagt mich einfach :Haue
:D Leider ist deine Idee so nicht ganz erfolgreich. Weil der Empfänger kann nicht zwischen ein bisschen von Unten und direkt von vorne unterscheiden.
Der ist digital. Entweder 1 oder 0. Also entweder ist was in Reichweite, dass Reflektiert oder nciht. So würdest du den Boden als Dauer Hinderniss erkennen. Ein echtes Hindernis wäre dann nciht mehr zu erkennen.
@Felix Konrad
Für die Treppe kann man die Liniensensoren nehmen, die zeigen schon nach unten.
Waste
Hallo,
Ich hab den Umbau nun auch endlich hin bekommen =D> und bin sehr froh das ich es gemacht habe. O:) Danke an Waste und seiner Idee.
Da ich ja Probleme mit meinem IR Tranceiver hatte, hab ich mir den USB Tranceiver bestellt und nun geht es.
Meine Frage wäre nun da ich ja den Sender und den Empfäger noch übrig hätte, ob man diese noch mit verbauen könnte, oder wenigstens den 2. Empfänger damit das "Sichtfeld" villeicht nochmals verbessert wird oder ist das gar nicht möglich. Wenn doch müsste das Programm dann Umgeschrieben werden?? Wenn ja wo müsste ich das denn dann machen??
Ich freue mich auf Eure antworten.
Gruß Dom
(No5)
Den 2. Empfänger kannst du an die gleichen Pins wie den 1. schließen. Da drinnen scheint ein Pull-UP zu sein, wenn ein signal kommt wird es von einem oder beiden auf low gezogen, stört sich also nicht, wenn nur einer was empfängt.
Bei unserer Modellbahnanlage hier im Garten hab ich auch einige von den Teilen im Garten verteilt, damit man mit einer Fernbedienung steuern kann. Bis auf die geringe Reichweite geht das ganz gut.
Achso, die 2. Sendediode kannst du natörlich auch noch zur 1. dazuschließen.
Hm,
aber dadurch würde sich Asuros Sichtfeld ja nicht umbedingt verbessern oder doch?
Ich meine es so:
Sender in die Mitte 1Empfänger rechts 1 links kommt ein hinderniss von rechts kann so solle er z.B nach links ausweichen oder umgekehrt. Oder einfach schauen wie er es umfahren kann.
Wäre es so möglich oder eher nicht. So würde sich sein Sichtfeld doch erheblich verbessern oder?
Gruß Dom
Ach, so meinst du das.
Das Sichtfeld würde so schon auch größer, aber du willst auch noch unterscheiden können wo jetzt was ist.
Das geht schon auch, da musst du den 2. Empfänger halt an einen Eingang vom Mega hängen, beim Asuro ist da aber doch keiner mehr frei, oder? Also muss irgendwas anderes weg.
Und wenn du den dann dort angeschlossen hast kannst du ja schauen ob was enmpfangen wird.
@Ich_
Ja klar ich kann ihm so ja gar nicht sagen Hinderniss z.B. von rechts=Links ausweichen das kann er so ja nicht unterscheiden. Aber prinzipiell ist es doch egal, denn wenn er was mit dem rechten Empfänger als Hinderniss erkennt müsste er doch erst mal reagieren.
Wenn man Juliens Programm siehe Seite 1 nimmt und er nun mit irgend einem Empfänger etwas als Hinderniss erkennt würde er doch erst mal irgend eine Maßnahme ergreifen, also Ausweichen und nach einem Ausweg suchen.
Wäre hierbei die Anordnung von Sender und Empfänger Egal oder gäb es eine "BESTE" Anordnug.
ZB: Oben 2 Empfänger unten Sender - oder Sender Mitte und links u.rechts ein Empfänger, oder ist das völlig egal? Oder kann man das berechnen?
Gruß Dom
Hallo nochmal,
also ich hate das mit der Sichtfelderweiterrung nun versucht wie oben, allerdings geht seit dem nach dem Booten die Status LED kurz auf grün und Asuro zuckt nach vorne, gleich darauf geht die LED aber auf Oragne und er fährt nur noch zurück. Nun hab ich es wieder zurück gebastelt jedoch das Problem bleibt bestehen. Liegt das am überlauf von Julians Programm oder ist es was anderes?
Hallo! Ich finde die Idee mit der IR-Hinderneserkennung wirklich sehr gut, daher habe ich es auch meinem Asuro damit umgebaut. Nun habe ich ein Programm geschrieben (im Anhang), wo Asuro Hindernissen ausweicht (außer schwarze Hindernisse).
Also, wenn er ein Hindernis entdeckt, guckt er, in welcher Richtung er diese am Besten umfahren könnte und somit sucht er sich den Weg (z.B. durch die Wohnung) alleine. Wenn sich keine Hindernisse im Weg befinden, fährt er geradeaus. Wenn ihr noch verbesserungen habt, würde ich mich freuen, diese zu posten.
MfG julien
Also das Programm ist wirklich klasse Julien. Ich versuche allerdings noch ein paar sachen einzubauen z.B eine kleine Linienverfolgung und den Poll´s.
Ausserdem hab ich alle Lichter eingeschaltet, das ist aber nur für meinen 8 Monate alten Sohn (er will immer hinterher krabbeln).
Nun würde mich mal intressieren wo ich dei Poll´s am besten unterbringen könnte.
Hatt da jemand eine Idee??
Gruß Dom
netstedt
04.03.2006, 18:17
hallo!
ist es möglich zzgl. eine einheit IR anzulöten?!
bzw. würde ich dann unter der hauptplatine fein 2 anschlüsse anbringen, zzgl. zu den oben sitzenden IC2 und IRLED, sodass ich dann dort unten das kabel von der erweiterungsplatine anschließe.
auf der sitzt bei mir übrigens die linienverfolgung und -sogar schon alles fertig, nur diese frage muss beantwortet werde- eine IR hinderniserkennung. dacht mir, noja, wenn ich Ultraschall austausche, gegen linienverfolgung, dann hab ich ja gar keinen frühwarsystem mehr ;]
also IC2 und IRLED von der RS232 dingens geholt und noch mit druffgepackt. schöne flachkabel führen zum stecker.
nun die frage: kann ich den zzgl. zur schon vorhandenen IR einheit anschließen, die ich dann natürlich abdecke, damit sie den hindernisdetektor nicht stört.
grüße daniel, ein begeisterter frischling.
netstedt
06.03.2006, 10:58
also so direkt formuliert, möcht ich wissen, ob's möglich ist 2 IR-Einheiten (bestehend aus IC2 und IRLED) parallel zu schlaten ?!
danke für jeden tip.
Im Prinzip sollte es möglich sein, aber wahrscheinlich nicht ohne Probleme.
Die originale Einheit hat ein Übersprechen, das durch einfaches Abdecken nicht beseitigt wird. Da muss vermutlich richtig optisch isoliert werden. Zudem teilt sich der Strom durch das Parallelschalten der LEDs auch noch auf und je nach Streuung der Durchflussspannung auch noch unterschiedlich. Die abgestrahlte Leistung ist niedriger.
Das Parallelschalten des Empfängers sollte kein Problem sein.
Waste
Es ist mit Sicherheit sinnvoller, zwei Sende-LED's in Reihe zu schalten. Dann muss der MC-Pin nicht mehr Strom treiben und statt die Verlustleistung am Vorwiderstand zu verbraten kann man den einfach verkleinern.
Gruss,
stochri
AysTerHay
13.08.2006, 20:51
Hallo, ich bin ein fölliger Neuling in Sachen C-Programmierung, Robotik und überhaupt Elektronik. Ich entschuldige mich schon einmal im Vorraus für meine noobige Frage.
Also ich habe die AVR-version die in der mitgelieferten CD zu finden wahr und die hat auch bis jetzt funktioniert.Jetzt bin ich auf diesen Thread gestoßen und ich finde die Idee echt super leider kapiere ich nichts außer if und else von den codes die ihr geschrieben habt. Also lad ich mir diese lib von waste und kopiere die asuro.h und asuro.c in die ordner FirstTry und FelfTest. dann kopiere ich den code von waste mit dem man die entfernung messen kann in Programmers Notepad 2 und führe das tool make aus dann kommt folgende fehlermeldung:
C:\ASURO_src\FirstTry>make all
set -e; avr-gcc -MM -mmcu=atmega8 -I. -g -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-ahlms=asuro.lst asuro.c \
| sed 's,\(.*\)\.o[ :]*,\1.o \1.d : ,g' > asuro.d; \
[ -s asuro.d ] || rm -f asuro.d
set -e; avr-gcc -MM -mmcu=atmega8 -I. -g -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-ahlms=test.lst test.c \
| sed 's,\(.*\)\.o[ :]*,\1.o \1.d : ,g' > test.d; \
[ -s test.d ] || rm -f test.d
-------- begin --------
avr-gcc --version
process_begin: CreateProcess((null), avr-gcc --version, ...) failed.
make (e=2): Das System kann die angegebene Datei nicht finden.
make: *** [gccversion] Error 2
> Process Exit Code: 2
Ist meine AVR-version veraltet?
oder habe ich einfach alles falsch gemacht?
danke für eure Gedult,
AysTerHay
Hallo AysTerHay,
hast du schon ein eigenes Programm erfolgreich compilieren können? Wenn ja, dann sollte das auch mit meinen Dateien funktionieren.
Vor dem Compilieren muss die Datei (z.B. test.c) gespeichert werden. Der Name der Datei muss mit dem "Target" im Makefile übereinstimmen.
Gruß Waste
gandalfsz
19.12.2006, 16:27
Tolle Idee werd ich bei meinem ASURO auch machen
Dass muß eh kein Blech sein oder? Es geht z.b. : Auch mit 1mm weißen undurchsichtigem Plastik oder ? Weil ohne das Blech wäre es noch einfacher wenn man es z.b. : aus einer alten Eisschachtel ( ich mein sowas : http://www.greiner-gpi.com/_img/EisIML187.jpg ) die drei Teile ausschneidet und fertig
mfg Daniel
Blech muss es nicht sein, aber lichtundurchlässig schon.
Waste
gandalfsz
20.12.2006, 17:23
Hab mal im Paint ne Zeichnung mit maßen gemacht sollte dadurch leichter sein deine (!Tolle!) Modifikation nachzubauen. ( Die roten teile sind Abfall)
HermannSW
08.01.2007, 22:05
Auf Wunsch beschreibe ich hier nochmal den Umbau der IR-Schnittstelle des Asuro zum IR-Hindernisdetektor.
...Vielen Dank für diese tolle Idee!
Habe meinen Asuro gleich so aufgebaut, wie von Dir vorgeschlagen.
Der Asuro ist bei Julien´s Programm (https://www.roboternetz.de/phpBB2/zeigebeitrag.php?p=121378&highlight=#121378) zum Umfahren eines Hindernisses gut, aber nicht besonders schnell.
Für einen flotten Linienverfolger wollte ich mal testen, wie schnell der Asuro auf Dauer fahren kann
(und da sollte er natürlich nirgendwo anstoßen).
Der folgende kleine Infrarot-Linksausweicher schafft in meinem Infrarot-Parcours (Küche) ca. 43cm/sec. =D>
Dabei dreht das rechte (Außen-)rad immer voll nach vorne (viel schneller wird es daher wohl kaum gehen):
/************************************************** ***************************
*
* Description: IR-Linksausweicher
* basierend auf dem "Asuro IR-Detektor Testprogramm" (asuro_v261)
*
************************************************** ***************************/
#include "asuro.h"
int main(void)
{
Init();
DDRD |= (1 << DDD1); // Port D1 als Ausgang
PORTD &= ~(1 << PD1); // PD1 auf LOW
OCR2 = 0xEF; // Pulsbreite 16
MotorSpeed(255,255); // volle Kraft
MotorDir(FWD,FWD); // voraus
StatusLED(OFF);
while (1)
{
if (PIND & (1 << PD0)) { // wenn kein IR-Echo
BackLED(OFF,ON);
MotorDir(FWD,FWD); // dann vorwärts
}
else { // sonst
BackLED(ON,OFF);
MotorDir(RWD,FWD); // nach links
}
}
return 0;
}
Hier die ersten 11 Sekunden eines Handy-Videos als animated .gif (nur 256 Farben): http://www.stamm-wilbrandt.de/videos/IR-anim.gif
Mehr (insbesondere Videos mit Audio) findet man hier:
http://www.stamm-wilbrandt.de/myIrAsuro.html
Zwei Fragen hätte ich auch noch: Hat jemand schon Erfahrung mit anderen Getriebezahnrädern (Moduln) gemacht?
Sind die Asuro-Motoren für größere Gummireifen-Drehzahlen stark genug?
[meine Motoren sind z.Zt. noch nicht mit Sekundenkleber, sondern nur mit Holzkeilen in den Kabelbindern fixiert ...]
Mit welchen durchschnittlichen Geschwindigkeiten werden Linienfolge-Parcours wie diese (http://www.robotchallenge.at/reglement/parallelslalom/) von den Spitzen-Robotern bewältigt?
Hallo Hermann,
sieht gut aus, dein Umbau!
Wenn ich mir die Linienparcours von RobotChallenge so anschaue, dann denke ich, bist du ganz vorne mit dabei, wenn du es schaffst den Asuro mit Vollgas drüber zu jagen. Da braucht es gar keine höhere Geschwindigkeit. Die Schwierigkeit wird eher sein, einen Linienfolger zu programmieren, der nicht aus den Kurven fliegt.
Gruß Waste
HermannSW
10.01.2007, 09:36
Hallo Waste,
Hallo Hermann,
sieht gut aus, dein Umbau!danke, Deine Vorlage war gut!
Wenn ich mir die Linienparcours von RobotChallenge so anschaue, dann denke ich, bist du ganz vorne mit dabei, wenn du es schaffst den Asuro mit Vollgas drüber zu jagen. Da braucht es gar keine höhere Geschwindigkeit. Die Schwierigkeit wird eher sein, einen Linienfolger zu programmieren, der nicht aus den Kurven fliegt.Das glaub ich auch. Der sehr einfache Linienfolger aus https://www.roboternetz.de/phpBB2/viewtopic.php?t=26088
schafft aber auch schon ca. 18 cm/sec auf kurvigem Parcours (siehe mein Avatar), und da ist die Startgeschwindigkeit ja eher niedrig eingestellt ...
P.S:
Im Thread 26629 (https://www.roboternetz.de/phpBB2/viewtopic.php?t=26629) gibt's Bilder einer einfachen on-board camera einer IR-Linksausweicherfahrt ...
HermannSW
15.01.2007, 21:32
Hi,
Videos eines Ausflugs meines Asuros mit IR-Linksausweicher im 1. Klasse-Abteil eines Regional-Expresses (und auch, warum ein Linksausweicher manchmal rechts abbiegt) findet man hier:
http://www.stamm-wilbrandt.de/myIrAsuro.html#RE
Hi,
8)
wann kommt die nächste Ausbaustufe, so dass er erkennt, ob er nach rechts oder links ausweichen muss? Also erkennt, ob die Wand links oder rechts ist.
Gruß Waste
Hallo
Ich habe mir 2 asuro´s gekauft habe vom 2ten RS-232 beide teile noch über
die frage ist muss ich die anderen 2 ausbauen oder kann ich einfach ein kabel an die lötstellen an löten und alle 4 benutzen?
edtit: Sorry zuerst lesen dann schreiben habe es gelesen
So jetzt habe ich wirklich ein problem habe jetzt alles zusammen nur leider lässt er sich nicht mehr Flashen ich habe Diode und IC drinnen gelassen und habe unterdrunter die anderen zwei polungsgerecht verbunden einer ne ahnung was falsch ist oder habe ich was vergessen?
Gruss Danjo
Hallo Danjo,
parallel schalten geht nicht!
Ich weiß auch nicht, was das für einen Sinn haben sollte, wenn es ginge. Man will doch wissen, wo das Hindernis erkannt wurde und nicht noch rätseln, oben oder unten.
Gruß Waste
Sorry aber ich blick da nicht ganz durch wie bekomme ich jetzt hin das der ic mit 36 kHz versorgt wird und wie setzte ich den atmega Po... auf Low bitte helft mir noob? flashen funktioniert jetzt noch mal
Sorry, ich blick auch nicht durch, was du eigentlich willst. Welches IC soll mit 36kHz versorgt werden? Oder meinst du die IR-LED? Und welchen Po willst du auf LOW setzen? Wenn du Port D1 meinst, das ist in meinem Eingangsbeitrag genau beschrieben.
Waste
Um nun ein Hindernis detektieren zu können, muss man nur die IR-Diode mit 36kHz versorgen. Das ist die Frequenz, die der IR-Empfänger SHF5110-36 braucht. Der Ausgang des IR-Empfängers wird dann auf LOW gezogen, wenn ein reflektiertes Signal erkannt wird. Das 36kHz-Signal ist im Asuro schon vorbereitet und steht am Ausgang PB3 an. Die IR-Diode ist über einen Vorwiderstand an PB3 und an PD1 angeschlossen. Man braucht also nur den Ausgang PD1 am Atmega auf LOW setzen und schon sendet die IR-Diode. Folgende 2 Zeilen im C-Programm sorgen dafür:
DDRD |= (1 << DDD1); // Port D1 als Ausgang
PORTD &= ~(1 << PD1); // PD1 auf LOW
Die Auswertung des IR-Empfängers erfolgt über den Eingang PD0 des Atmega mit z.B. folgendem Code:
if (!(PIND & (1 << PD0))) // prüft Eingang PD0 auf LOW
Das verstehe ich nicht ich schreibe also irgendein programm und danndas dabei oder wie und wo hin?????
Ja, wenn dein Asuro die 36kHz senden soll, dann schreibst du die 2 Zeilen in dein Programm und der Asuro sendet. Soll er nicht mehr senden, dann PD1 mit folgender Zeile wieder auf HIGH setzen:
PORTD |= (1 << PD1);
Waste
sorry bin noch anfänger und unter was (wo) soll ich es eintragen?
Edtit: Sorry habe oben im quelltxt gelesen probiere es damit mal. Beim anderen hat nur mein Asuro gzittert und auf nichts reagiert
sorry bin noch anfänger und unter was (wo) soll ich es eintragen?
In dem Fall würde ich dir raten klein anzufangen und den ersten Schritt vor dem zweiten zu machen. Sonst verlierst du schnell den Spaß. Arbeite dich zuerst durch C-Tutorials und probier die mitgelieferten Beispielprogramme der Asuro-CD und der Beschreibung zu verstehen. Danach kannst dich dann an eigene Programme wagen.
Waste
die beispiel programme habe ich denke schon durch wenn du die in der anleituing meinst das einzigste was ich allerding nich kappiere ist Odometrie weil da kein beispiel dabei war etwas schade weil ich es eher brauchte vllt finde ich hier ja was dazu ich muss ein quelltext als beispiel haben um es richtig zu verstehen das ist mein problem
hallo Leute ich find das Thema auch toll, ich hab aber ein Problem, im Text ist an gesprochen, das für die bessere Version der programme, die asuro.c geändert werden muss. Nun meine Frage ist, was man bei der Asuro Lib machen muss, da ich diese benutze.
Vielen dank für die Antworten, im vorraus.
mfg liggi
damaltor
08.10.2007, 22:00
welche asuro lib benutzt du? die von der cd? die aus dem forum?
damaltor
09.10.2007, 13:42
hmm dann sollten denk ich alle notwendigen änderungen abgeschlosen sein... ist die änderung nicht das ersetzen der original lib durch die des forums?
HermannSW
10.10.2007, 22:39
Hallo,
die aus dem Forum 2.7 das Programm IR-Linksausweicher von oben funktioniert direkt mit der Asurolib 2.7.
Viel schnelleres Hindernisausweichen ist auch möglich, sogar, wenn zwei Asuro's zusammen unterwegs sind:
http://stamm-wilbrandt.de/Robertor.html
Bei Robertor, dem Asuro meines Sohnes, wurde die Asuro-Platine als Abschirmung für die Störeinstrahlung verwendet.
Einfach die IR-Sendediode unde den IR-Empfänger auf verschiedenen Seiten der Platine anbringen, dann benötigst Du kein Extrablech!
hi allerseits,
noch eine alternative:
der IR-empfänger ist mit heisskleber auf dem kondensator und die diode vor ihm auf den widerständen auf jeweils ganz kleinen platinchen aufgeklebt, so bleibt der platz für die erweiterungsplatine frei...
@inka:
funktioniert das genauso gut? ich mein, kann es da nicht zu abweichungen kommen, da der Empfänger ja direkt hinter der IR-LED ist..
Viele Grüße
Tobi
hi Tobi,
es funktioniert genauso gut, der platz für die diode(sender) auf den widerständen ist aber ungünstig (wackelig), ich habe die diode (mit längeren steckbrücken) auf den anderen großen kondensator auf die andere seite geklebt. Geht auch gut...
Danke!
Sollte ich dann noch ein bisschen was gegen die Streuung der IR-LED tun
(evtl. an der Seite zum IR-Empfänger hin etwas abschirmen?
Viele Grüße
Tobi
war bisher bei mir nicht notwendig, kannst aber sicher noch was tun. Ich kenne nicht die "strahlkeule" der LED, vielleicht würde eine bündelung ein präziseres ausweichen (nur hindernisse die wirklich vorne sind) bringen?
hm, kann sein. Ich werds mal ausprobieren und dann mal berichten!
Danke nochmal für die gute Idee!!
viele Grüße
Tobi
damaltor
15.12.2007, 18:45
die strahlenkeule liegt glaube ich bei einem abstrahlwinkel von 17°, also sehr schmal.
wirklich sehr nette idee und mehr oder weniger genau das was ich suche ^^ danke :D
Und hier kannst Du sehen, was man alles mit der IR-Hinderniserkennung machen kann:
http://de.youtube.com/watch?v=oscbdxMhX_4
http://de.youtube.com/watch?v=oscbdxMhX_4
Gruß,
robo
Sternthaler
06.01.2008, 00:03
Hallo zusammen, und ein 'Schönes neues Jahr'.
Und hier kann man sehen, dass man auch mit der IR-Hinderniserkennung, wie mit der Ultraschall-Erweiterung, chirpen kann.
Allerdings ist die Auflösung in dieser Version recht schlecht. Soll heissen, dass die Entfernung nur in ca. 6-cm-Schritten erkannt wird bei kleinen Abständen. Bei größeren Abständen wird es zwar besser, dafür aber pendeln die Ergebnisse ohne das der Asuro bewegt wird.
Dank der von robo.fr entwickelten Zusatzplatine, die nun auch an meinem Asuro steckt, habe auch ich nun das weite Feld der Fern-Sensorik entdeckt. Ich war/bin ja nie dafür gewesen den Asuro umzubauen, aber hier muss ich doch mal für die Platine von robo.fr ein bisschen Reklame machen, da sie OHNE am Asuro zu löten genutzt werden kann. ATmega aus Asuro raus; ATmega in Zusatzplatine rein; Zusatzplatine in Asuro. Fertig.
Ausserdem gibt es noch einen ISP-Programmierstecker obendrein.
Gruß Sternthaler
hi allerseits,
passt dann auch noch die erweiterungsplatine oben darüber?
Ich war/bin ja nie dafür gewesen den Asuro umzubauen, aber hier muss ich doch mal für die Platine von robo.fr ein bisschen Reklame machen, da sie OHNE am Asuro zu löten genutzt werden kann.
Hallo Sternthaler,
vielen Dank für den Hinweis O:) Deine Messungen sind auch ganz praktisch. Ich habe auch grobe Messungen durchgeführt, aber nur mit Joghurtbechern. Da ist die Kennlinie etwas anders, weil die Lichtmenge von der Größe der Reflektionsfläche abhängen kann.
hi allerseits,
passt dann auch noch die erweiterungsplatine oben darüber?
Hallo Inka, das weiss ich leider nicht, ich habe die Erweiterungsplatine noch nie ausprobiert. Ich muss mal nachsehen, wie die aussieht und moniert wird.
Gruß,
robo
@sternthaler,
begeisterung pur! Bei mir waren allerdings die angezaigten entfernungen ca. doppelt so groß wie die wirklichen, habe dann das hier gemacht:
if (puls_loop <= 6)
dist = (6 * puls_loop + 2)/2;
else
dist = (3 * puls_loop + 22)/2;
jetzt passt es besser, zumindest an meinem umgebautem asuro...
Allerdings ist die Auflösung in dieser Version recht schlecht. Soll heissen, dass die Entfernung nur in ca. 6-cm-Schritten erkannt wird bei kleinen Abständen. Bei größeren Abständen wird es zwar besser, dafür aber pendeln die Ergebnisse ohne das der Asuro bewegt wird.
kann ich so nicht bestätigen, die angezeigten werte verändern sich in 2 cm schritten, manchmal sogar mit 1cm, im gegensatz zum ultraschall gibt es so gut wie keine aussreiser...
@robo.fr
so wie ich deine platine nun in der freiburger seite gesehen habe kann man nicht die erweiterungsplatine einsetzen, ist aber kein wirkliches manko...
Sternthaler
06.01.2008, 12:55
Hallo robo.fr, hallo inka,
ja, das mit der Lichtmenge und der daraus abgeleiteten Entfernung ist so eine Sache. Ich habe zum testen ein schönes, graues Mauspad als Reflektor benutzt. Mit Joghurtbechern kenne ich mich nur theoretisch aus, da ich mir natürlich auch die Sumo-Kämpfer von dir robo.fr angesehen habe. Ist ne Superanwendung. Showeffekt spitzenmäßig.
@inka
Du hast ja schon die richtige Stelle gefunden, um die cm-Berechnung zu korrigieren.
Hier vielleicht ein Tipp, um Messungen besser zu justieren:
In der Funktion IRDetectChirp() wird über "#define PIN_LOOP 1000" eingestellt, wie häufig der Empfänger-Pin geprüft wird. Die 1000 hatten sich bei mir als relativ gut erwiesen.
Mit "if (pin_test < (PIN_LOOP / 4))" wird bestimmt, wie viele der Messungen zum Ergebnis 'Hindernis' benötigt werden. Auch hier kann gespielt werden.
Wenn bei dir der Entfernungsbereich nun halbiert ist, dann sollte auch der "#define PULS_LOOP 32" mal justiert werden. Wird hier ein größerer Wert benutzt, dann wird auch die Reichweite vergrößert.
Das bei dir inka, die Entfernung stabil angezeigt wird, macht mich neidisch ;-) Wahrscheinlich muss ich nur die Leuchtedinger ein bisschen verbiegen und schon geht es auch bei mir. Fußboden ausblenden oder so ähnlich.
That's all
Gruß Sternthaler
Hallo Sternthaler,
jetzt habe ich auch mal die Kennlinie für die Joghurtbecher vermessen:
http://www.roboterclub-freiburg.de/asuro/hardware/chAtmegaAdapter/SumoAdapter_html_6ebb3f2.gif
Ist ein wenig verbogen, aber trotzdem monoton steigend, was gut für die Entfernungsmessung ist.
Hier (http://www.roboterclub-freiburg.de/asuro/hardware/chAtmegaAdapter/SumoAdapter.html) habe ich ein Testprogramm abgelegt. Die Entfernung wird mit Hilfe der Status-LED und der Back-LEDs angezeigt. Die Messung ist durch eine eine spezielle Mittelung ziemlich stabil.Die Mittelung ist notwendig, weil der Empfänger manchmal etwas "spiked" ( mit Oszilloskop sichtbar )
Vielleicht kriegst Du damit die Abstandswerte auch etwas ruhiger.
Bester Gruß,
robo
oberallgeier
09.01.2008, 22:32
... von robo.fr entwickelten Zusatzplatine ...Gibt es zu dieser Platine ein besseres Bild oder irgendwie mehr als im Thread "Hilfe - mein Asuro folgt keiner Linie (https://www.roboternetz.de/phpBB2/zeigebeitrag.php?p=340380#340380)" ? ? So eine etwas grössere Draufsicht, oder eine Schaltplan-Skizze oder so? ich finde dazu einfach nix :(
Zu dieser Platine habe ich keinen Schaltplan veröffentlicht. Wie der Abstandssensor nach oben verlegt wird und wie das Verfahren funktioniert ist aber ausführlich im Thread von "waste" dokumentiert.
hi allerseits,
ich hab jetzt die platine aufgebaut, eingesetzt und sie läuft...
da kommt schon freude auf - ich würde vorschlagen dass man die platine zu den sinnvollen ergänzungen bei den wichtigsten downloads, dateien usw. dazutut, dass sie ohne große suche gefunden werden kann. Was haltet ihr davon?
habe noch etwas probiert: der große kondensator (220uF) baut ziemlich auf. Ich hab ihn erstmal nicht eingelötet und ohne getestet. Flashen ging, das senden zum HT auch - sind da irgendwelche risiken?
damaltor
11.01.2008, 01:08
nein, ich denke nicht. zum puffern solltest du überlegen einen 100µF oder zwei einzulöten. diese sind etwas kleiner.
wenn es ganz klein sein muss, aber du doch einen möchtest, es gibt auch 47µF elkos. diese haben meist den durchmesser von hunertern, aber sind nur halb hoch.
für die sammlung der quellcodes wäre das eine gute idee, sollte mal gevoted werden... :D
entschuldigt, wenn cih hier mal ein wenig OT geh weil ich auf die liniensensoren scharf bin, aber kann man die linien sensoren und die front LED nicht auch "modulieren" um sie zur abstandsmessung zu verwenden, oder z.B. bei der linienverfolgung unabhängig von streulicht zu machen ähnlich den IR-Dioden/Empfänger? oder wirkt das nur wegen den spezifischen eigenschaften der komponenten ?
damaltor
11.01.2008, 12:17
hmm gehen sollte es. zumindest versuchen kann man es ja mal :D
Sternthaler
11.01.2008, 18:43
Hallo Ceos,
du möchtest auch die Liniensensoren modulieren.
Natürlich geht dies auch, wenn du für die Linien-LED so etwas wie den PWM-Takt für die IR-Sendediode, selber machst, um die Lichtleistung zu steuern.
Ich frage mich nur, was du dann damit machen möchtest.
Wenn es für die 2-Rad-Balance sein soll, dann ist es dort ja nicht notwendig, da diese Funktion ja auch ohne PWM auskommt.
Wenn du die Linien-Leuchte plus Sensor nach vorne umbiegen willst, um eine Entfernung nach vorne zu messen, dann hat dies aber einen Nachteil.
Der IR-Empfänger ist ja schon so ausgelegt, dass er selber Umgebungslicht ausfiltert, da er ja nur auf getaktete Signale reagiert. Somit müsstest du dann auch diesen Filter noch selber auf der Sensorseite programmieren.
Lass dich von meinem Einwand bloß nicht abhalten es zu probieren.
Eine sinnvolle Anwendung hast du bestimmt parat, und ausserdem sind wir alle immer Neugierig auf weitere Software.
Gruß Sternthaler
oberallgeier
13.01.2008, 18:05
Hallo, alle,
mit meinem asuro (mit dem IR-Periskop) (https://www.roboternetz.de/phpBB2/zeigebeitrag.php?p=340373#340373) habe ich nun die Tests zur Hinderniserkennung mit den ersten Testprogrammen von waste gefahren. Danke, waste. Übrigens sieht das IR-Periskop mittlerweile eher torpedorohrmässig aus.
..........................https://dl.dropbox.com/s/udvlajsncm41bbq/asuro-torp.jpg?dl=0
Dabei habe ich festgestellt, dass mein asuro nicht mit 36 kHz blinkt sondern mit etwa 26 kHz (soweit man das im Oskar genau erkennen kann). Aber flashen geht (mit dem Torpedorohr sogar besser als vorher) und auch der Abstandstest nach waste klappt recht gut!
Frage: muss ich / kann ich / soll ich das auf 36 kHz einstellen?
Übrigens denke ich, dass meine Anordnung besonders für Anfänger, wenn die noch nicht gut und hitzesparend löten können, ideal ist.
Sternthaler
14.01.2008, 00:23
Hallo oberallgeier,
nix Torpedorohr, eher Lufteinlass vom aufgemotzten Porsche Carrera.
Da hat das Abstandhalten ja doch noch sein gutes Ende gefunden. :cheesy:
Aber warum du nur mit 26 kHz rumleuchtest, kann ich nicht verstehen.
Hast du das gemessen, als der Asuro auf Abstandstripp war, oder als Daten an den PC geflüstert wurden?
Ich hatte mal, als waste von 72 kHz auf 36 kHz umgebaut hatte, nachgemessen, und da sind aus dem Asuro noch die 36 kHz rausgekommen. Auch wenn man alle Register zieht und die Register zum Timer anschaut, sollten da die 36 kHz registriert werden.
Schau mal nach "SIGNAL (SIG_OVERFLOW2)" und dem darin gesetzten TCNT2 += 0x25;. Im waste-Code wird das Ding nicht geändert. Und auch die Register TCCR2 und TIMSK werden nur in Init() gesetzt und sonst nirgends. Einzig und alleine OCR2 wird zum Abstandsmessen verdreht.
Aber was soll's
a) ob Periskop oder Turboeingang
b) ob 36 oder 26 Takte
solange alles geht, müsste es in Butter sein.
Gruß Sternthaler
oberallgeier
14.01.2008, 01:35
Hallo Sternthaler,
ich habe noch mal die Blinkfrequenz bei meinem Porsche-Asuro nachgemessen. Diesmal korrekt bei dem Testprogramm von waste mit seiner lib (aus dem posting von waste) (https://www.roboternetz.de/phpBB2/zeigebeitrag.php?t=11114&postdays=0&postorder=asc&start=0). Einmal einen SFH300 in den aufgemotzten Lufteinlass gesteckt und einmal direkt am Bein des SFH-415. Beim Oszilloskop alles auf "Null". Beide Male kommt ein Flankenabstand von ziemlich genau 38 kHz heraus.
Die Initialisierung des Timer2 versteh ich noch nicht - dafür ist es jetzt auch zu spät :( muss ich nachholen - im Moment lese ich den Prescaler 1024 raus. Die restlichen Codeteile sind wie von Dir beschrieben - könnt ja nicht anders sein. Wie gesagt, den timer muss ich tagsüber nacharbeiten.
Ausserdem stimmt es ja - Hauptsache es geht so schön, wie ich es festgestellt hatte.
Nachtrag + Korrektur, 15:00 Uhr Die Messung des Mikrosekunden-Bereiches 50 µs .. 1 µs bei meinem Oskar ( ein alter ABB Metrawatt M6003, 2 Kanäle, 60 MHz ) hat mit verschiedenen Quarzen ein Nachhinken der Bildschirmanzeige um ziemlich genau 5 % ergeben. Daher sind die oben genannten 38 kHz DOCH 36 kHz. Sorry - man darf niemand nix glauben, ohne es selbst kontrolliert zu haben. Da ich kein Handbuch dazu habe, muss ich mit diesem Fehler leben :(.
die IR-Schnittstelle brauch ich leider zwecks kommunikation ... ich werde odometrie+kompass für die ortung verwenden linensensoren nach vorne für hindernis erkennung und IR/Funk für die kommunikation zu nem laptop/pocketPC und anderen asuros ... ziel des ganzen iss n kleiner schwarm asuros der ein gelände nach hindernissen absucht und dann evtl. als schwarm abfährt XD schreck lass nach auf was habe ich mich da nur eingelassen >_<
für die kommunikation werd ich sowas wie csma verwenden müssen -.- da schmerzt mir jetzt schon der bauch ... fürs erste werd ich aber bei einem asuro bleiben und die taster verwenden, da ich noch nicht ausreichend tests für die genauigkeit der ortung gemacht habe und den asuro nach jeder kollision wieder zum ausgangsort zurrückkerhren lasse so zwecks neuausrichtung.
eine frag an euch, könnte man nicht auch die liniensensoren mit IR-elementen bestücken ? evtl. braucht es ein wenig platine zum umbauen aber das wäre net SO schlimm.
oberallgeier
14.01.2008, 10:53
Hallo Ceos,
darüber hatte ich mal etwas gelesen - ich glaube es war radbruch. Jetzt könnte ich das für Dich suchen - aber das kannst Du sicher selber bestens. Der Umbau hardwareseitig beschränkte sich m.W. auf Austausch der D11. Hintergrund ist die Tatsache, dass T9 und T10 SFH300 sind, die bei 960 nm die maximale Empfindlichkeit aufweisen, aber im Bereich des roten Lichtes mit rund 600 nm nur noch 50% dieser Empfindlichkeit haben.
Die Wellenlänge im UV birgt also etwas - natürlich auch die Strahlstärke. Nachteil ist es, dass man nix mehr "sieht" - daher bevorzugen andere asuro-Besitzer einfach ne hellere LED.
das mit dem "nichtssehen" ist nicht der einziger nachteil. Ich habe es selbst umgebaut, gott sei dank ist das modul von unten steckbar, denn viele linienfolgeprogramme im forum laufen mit der IR-sendediode garnicht, man muss sie also anpassen...
oberallgeier
14.01.2008, 11:27
... viele linienfolgeprogramme ... also anpassen...Uuups, sorry, dachte nicht daran. Aber ist ja klar, anderer Sensor - anderes Signal - schon ist der Arbeitspunkt total verstellt. Danke für den Hinweis
oberallgeier
02.02.2008, 18:43
Hallo alle,
ich habe mal einen hübschen Versuchsaufbau gemacht, eine "Entfernungs-Messstrecke" mit dem SFH5110 und - tja, meinen einzigen SFH415 hatte ich bei einem Test gleich geschossen, nun ist der asuro "blind" bis zur nächsten Transplantation - also mit einem CQY99 (leider nur 11mW auf 50° statt 22mW auf 17°).
Der aktuelle PWM-Wert zum Ansteuern der IR-Diode wurde langsam hochgetickert und per RS232 ans Terminal gemeldet. Parallel dazu wurden die high bzw. low-Pegel zum Schalten einer LED genutzt. Ich hatte (leider eben nur als Test mit dem CQY/SFH5110) zwischen Dauer-Ein und Dauer-Aus einen erheblichen Übergangsbereich, bei dem Ein und Aus recht heftig blinzelten. Diese, erheblichen, Entscheidungsprobleme des SFH5110 hatte ich natürlich auch auf dem Oskar festgestellt. Ist das mit/von der SFH415 auch bekannt?
Sternthaler
11.02.2008, 03:45
Hallo oberallgeier,
so recht nachvollziehen kann ich deine Fragestellung nicht.
Meinst du mit dem Entscheidungsproblem, dass die zu ermittelnde Entfernung nicht richtig, oder (bei gleichem Abstand) unterschiedlich ist? Oder ist jede einzelne Messung wärend des 'hochtickerns' gemeint?
Der SFH5110 wird angegeben mit "Anwendbar bei Tastverhältnis <40%". (Warum werden im Asuro 50% benutzt?) Damit ist ja das empfangene 36-kHz-PWM-Signal gemeint. Wir schrauben nun an der Sendeseite an diesem Taktverhältnis recht kräftig rum.
Eventuell ist die Sendedieode CQY99 langsamer bei den Anstiegs-/Abfallzeiten als die SFH415 , so dass der Empfänger mehr Sinus als Rechteck sieht und da eher den Dienst verweigert.
Hier dürfte nur eine Messung mit beiden LEDs weiterhelfen. Sinnvollerweise mit einem normalen Empfänger, also ohne 36 kHz-Filter, um dort ein Signal für den Oska zu erhalten. Anstieg und Abfall bei beiden Sendern prüfen und sehen was raus kommt.
Ich hatte mal die Linien- und ODO-LED's auf diese Zeiten untersucht, und hatte dort ca. 150 us als Anstieg-/Abfallzeiten gemessen. Dabei war dann natürlich noch die Empfangshardware mit im Spiel. Diese Kombination wäre ja schon viel zu langsam um sie mit 36-kHz zu betreiben.
Oder komme ich hier viel zu spät, und du hast schon eine 'richtige' Ersatzdiode eingebaut?
Gruß Sternthaler
damaltor
12.02.2008, 23:16
das tastverhältnic lässt sich ja anpassen... siehe motorsteuerung =)
ich wollt mich nochmal zu wort melden ... ich habe meine Liniensensoren umgebaut (präzisockel statt direkt anlöten und winkelsockel nach vorn) und die rote LED durch ne IR-LED ersetzt .. ich mach kurz hintereinander 3 abfragen, mit IR ohne IR und wieder mit IR ich vergleiche die beiden IR werte, um nicht eventuell einem schnellen lichtwechsel zum opfer zu fallen, sind diese werte annähernd gleich zieh cih den "dunkelwert" ab und habe eine differenz, die ist FAST immer konstant, wenn die aussenbeleuchtung zu hell wird kommt nurnoch 0 raus, aber das liegt vermutlich daran das die FTransistoren dann voll durchschalten und es zwischen 1024hell und 1024dunkel keine unterschied mehr gibt ^^
damaltor
14.02.2008, 00:00
gute idee mit den dppelten werten. so kannst du relativ sicher ausschliessen dass falsche werte dazwischen sind. kannst du dazu evtl einen codeschnipsel posten?
inflames
29.04.2008, 17:41
hallo,
bitte kan mir jemand helfen!!!!
ich baue gerade einen asuro in der schule und will auch die lichtsensor funktion haben.
ich brauche die libs von waste.
es steht zwa das sie im anhang sind aber ich kan den anhang bwz die lib nicht finden.
habt ihr sonst noch irgentwelche tips was ich beim asuro verbessern kann??
gruß inflames
radbruch
29.04.2008, 18:46
Hallo
Ab Version 2.3 ist die Abstandsmessung nach waste Bestandteil der Lib:
http://downloads.sourceforge.net/asuro/asurolib_v23.zip?modtime=1135086743&big_mirror=0
Das ist die Änderung beim Timer:
//-------- seriell interface programmed in boot routine and already running -------
// prepare 36kHz for IR - Communication
TCCR2 = (1 << WGM20) | (1 << WGM21) | (1 << COM20) | (1 << COM21) | (1 << CS20);
OCR2 = 0x91; // duty cycle for 36kHz
TIMSK |= (1 << TOIE2); // 36kHz counter for sleep
(Aus init() in asuro.c: IR-PWM und 36kHz-Timer)
Alle Libs:
http://sourceforge.net/project/showfiles.php?group_id=155217&package_id=172835
Ich verwende übrigens auch Version 2.3
Gruß
mic
Sternthaler
07.05.2008, 01:28
Hallo zusammen.
Ich wollte hier nur mal kurz auf den Thread von oberallgeier (Abstandsmessung ähnlich wie IR-Schnittstelle des asuro (https://www.roboternetz.de/phpBB2/zeigebeitrag.php?t=38009)) hinweisen, da dort ja auch einiges in Punkto IR-Abstandsmessung läuft.
Angesprochen war dort unter anderem, dass die Messung iterativ erfolgen könnte. Es sind einige grundsätzliche technische Überlegungen vorhanden, und außerdem ist viel vom User OT zu lesen.
Wer also noch auf Abstandsuche ist, kann hier Abstände im Timerinterrupt (https://www.roboternetz.de/phpBB2/zeigebeitrag.php?p=371678#371678) finden.
Ja, ja, hätte ich auch hier unterbringen können ;-)
Gruß Sternthaler
Arthur S.
06.06.2008, 15:25
Hi Leute!
Ich mach zur Zeit eine Belegarbeit mit dem Asuro,allerdings in Assembler.
Assembler finde ich teilweise viel einfacher und verständlicher als C und der größte Vorteil ist,die Programme haben nur 1/10 der Größe eines vergleichbaren C Programmes.
Nun zu meiner Frage: ich werd nicht so richtig schlau aus der IRCollision in der Lib. Waste hat im Forum geschrieben er macht die PWM mittels dem OCR2,das liegt nahe,da der OC2 pin ja direkt an der Sendediode liegt.
Aber wo sind die Grundeinstellungen des Timers an sich versteckt?
Hab die includes durchsucht,und bin auf nichts gestossen. Man muss dem Timer doch durch Setzen der verschiedenen Bits sagen das er PWM machen soll,inklusive Vorteiler,TOP-Wert usw.
Wäre nett wenn jemand mal ne Hilfestellung gibt! =P~
Übrigens: Hab meinen Umbau nach Waste's Vorlage gemacht und muss sagen ,Absolut genial.
Der Thread zur Kompensation des Umgebungslichtes war für die Belegarbeit auch sehr hilfreich. Wir haben den Asuro im Kreis fahren lassen während die FrontLED mit bestimmten Takt blinkt. In einem gewissen Frequenzbereich wird die Differenz der beiden Messungen(also mit und ohne LED) nahezu konstant. Daraus folgt,wenn man Asuro fahren lässt und die FrontLED blinkt in gefundenem Hz-Bereich,ist das Umgebungslicht erfolgreich ausgegrenzt.
Also Grüße und postet mal wenn einer was hat über die Timer2 Grundeinstellung für PWM
Sternthaler
06.06.2008, 16:45
Hallo Arthur S.
die Grundeinstellung zum Timer findest du in der Init()-Funktion.
Für die IR-Abstandmessung werden, in der dazugehörenden Initialisierungsfunktion, nur einige Pins umkonfiguriert und die Änderung zum PWM-Ändern passiert in der Messfunktion selber. Das ist der OCR2-Wert, der dort angepasst wird. Dieser Beinflusst nun das Takten so, dass eben eine PWM entsteht.
Gruß Sternthaler
oberallgeier
06.06.2008, 16:57
http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#Die_PWM-Betriebsart
Arthur S.
06.06.2008, 17:38
Also erst mal danke,dass ihr euch gemeldet habt.
@Sternthaler: Ich hab mal in die Beispieldatei IRCollisiontest reingeschaut.
da heißt dann die Funktion void InitIRDetect(void).Hab aber nichts gesehen,sie müsste sich doch entweder in der stdlib.h oder in der asuro.h befinden. Die werden ja per include eingebunden.
Es muss ja schließlich möglich sein die PWM auch in Assembler mit Timer2 hinzubekommen.
Gruß
wie die Pwm ansich funzt ist klar,ich bekomm sie nur net zum laufen^^
trapperjohn
06.06.2008, 19:23
Da musst du wohl genauer gucken ;)
Die Datei test.c des IRCollisiontest fängt damit an:
void InitIRDetect(void)
{
UCSRB = 0;
DDRD |= (1 << DDD1); // Port D1 als Ausgang
PORTD &= ~(1 << PD1); // PD1 auf LOW
OCR2 = ocr2;
}
edit: Allerdings ist der Aufruf in meiner Version auskommentiert und der Inhalt der Funktion bereits im main() verstreut ...
Arthur S.
06.06.2008, 19:27
Sorry,aber das ist auch net,die erste zeile setz ucsrb zu 0, Zeile 2 und 3 definieren pd1 als ausgang und ziehen ihn auf low potential,letzte zeile dürfte nur aussagen das man im program OCR2 auch klein schreiben kann.
Nicht eine der Zeilen hat direkt was mit dem Timer2 zu tun.
trapperjohn
06.06.2008, 19:43
Hehe, die letzte Zeile sagt nicht aus, dass man das auch klein schreiben darf ;) ocr2 ist eine Konstante, die direkt darüber definiert wird.
edit: Hier noch mal der Vollständigkeit halber. Folgender Abschnitt ist in der Init() Funktion der Asuro-Lib zu finden - hier wird die grundlegende Einstellung vorgenommen:
/*
00117 Timer2, zum Betrieb mit der seriellen Schnittstelle, fuer die
00118 IR-Kommunikation auf 36 kHz eingestellt.
00119 */
00120 #if defined(__AVR_ATmega168__)
00121 // fast PWM, set OC2A on compare match, clear OC2A at bottom, clk/1
00122 TCCR2A = _BV(WGM20) | _BV(WGM21) | _BV(COM2A0) | _BV(COM2A1);
00123 TCCR2B = _BV(CS20);
00124 // interrupt on timer overflow
00125 TIMSK2 |= _BV(TOIE2);
00126 #else
00127 // fast PWM, set OC2A on compare match, clear OC2A at bottom, clk/1
00128 TCCR2 = _BV(WGM20) | _BV(WGM21) | _BV(COM20) | _BV(COM21) | _BV(CS20);
00129 // interrupt on timer overflow
00130 TIMSK |= _BV(TOIE2);
00131 #endif
00132 // 36kHz carrier/timer
00133 OCR2 = 0x91;
Und so sieht die main() aus, hier kann die Pulsbreite je nach Taste geändert werden:
int main(void)
{
unsigned char sw;
Init();
DDRD |= (1 << DDD1); // Port D1 als Ausgang
PORTD &= ~(1 << PD1); // PD1 auf LOW
// InitIRDetect();
while (1)
{
UCSRB = 0;
OCR2 = 0xFE;
if (PIND & (1 << PD0))
StatusLED(GREEN);
else
StatusLED(RED);
sw = PollSwitch();
if (sw & 0x01)
ocr2 = 0xFE; //Pulsbreite 1
if (sw & 0x02)
ocr2 = 0xFD; //Pulsbreite 2
if (sw & 0x04)
ocr2 = 0xFB; //Pulsbreite 4
if (sw & 0x08)
ocr2 = 0xF7; //Pulsbreite 8
if (sw & 0x10)
ocr2 = 0xEF; //Pulsbreite 16
if (sw & 0x20)
ocr2 = 0x90; //Pulsbreite 110
if (sw)
{
OCR2 = 0x91;
PrintInt(sw);
SerPrint(" ");
PrintInt(ocr2);
SerPrint("\r\n");
}
// Msleep(100);
}
return 0;
}
edit2: Irgendwas stimmt mit der main() aber nicht, wenn ich das richtig sehe, haben die Tasten überhaupt keine Funktion mehr, ausser dass ein nichtssagender Wert ausgegeben wird ...
Die Quelle kommt allerdings auch aus dem Release Candidate der Lib ... ;)
Arthur S.
06.06.2008, 19:56
Ja der erste schnipsel schaut gut aus,danke!
Mal sehen ob ich das irgendwie in assembler hingefriemelt bekomm! O:)
Arthur S.
06.06.2008, 20:10
Oh man,ich bin hier kurz vorm Notaus in der Rübe.
Irgendwie will Asuro net so wie ich gern will. Naja erst mal Schluss machen für heut und morgen noch mal Datenblatt durchlesen. Aber wenn es in C geht muss es doch auch in Assembler gehen.
Grüße an alle
Arthur S.
09.06.2008, 20:43
Also ich habs nach langem probieren immer noch net hinbekommen die PWM in Assembler zu realisieren. Bin für jeden Tipp dankbar. :mrgreen:
Gruß
Arthur S.
14.06.2008, 20:57
Hi Leute.
Nu ists geschafft. =P~ Hättet ihr ja auch verraten können das die 36kHz über nen Trick erzeugt werden. Naja,durch die Dokumentation in der Lib kommt man schließlich hinter dieses mysteriöse Geheimnis. Wenn man den Timer 2 in Assembler so initialisiert wie von Trapperjohn gezeigt spuckt die IR-Diode eine unmodulierte Frequenz von ca. 31,45kHz aus.
Erstaunlich ist,mein Assembler Programm ist 4 Seiten lang,dasselbe in C (IRCollisionsTest aus dem Example_Ordner) dagegen ist 30 Seiten lang.
Gott zum Gruße
trapperjohn
15.06.2008, 10:19
Wenn man den Timer 2 in Assembler so initialisiert wie von Trapperjohn gezeigt spuckt die IR-Diode eine unmodulierte Frequenz von ca. 31,45kHz aus.
Der Code da oben kommt doch 1:1 aus der ASURO Lib und sollte daher funktionieren ...
Die geringere Größe deines Assemblerprogramms liegt mit ziemlicher Sicherheit daran, dass bei der C-Anwendung wesentlich mehr Funktionalität eingebunden ist. Im Allgemeinen ist der GCC mittlerweile schon so gut, dass die Unterschiede in der Codegröße minimal sind.
Kannst ja mal versuchen, die ASURO Lib wegzulassen und exakt dein Assemblerprogramm nachbauen. Das Programm dürfte dann ähnlich klein sein.
Arthur S.
15.06.2008, 11:20
@ Trapper
Ich glaube du verstehst da was falsch,ich hab ja nicht behauptet das dein Codeschnipsel oben falsch ist. Musst ja bedenken,in Assembler stehen mir die Libs nicht zu Verfügung,ich musste meine eigenen Includes schreiben.
Die Initialisierung die du zeigst ist zu 100% richtig,es fehlt halt nur der "Trick". Deshalb hat es auch Anfangs nicht funktioniert und der Timer spuckte 31,45kHz aus und damit konnte man ja auch nichts empfangen. Und in diesem Falle (also ohne den Trick) hat auch das Output Compare Register keinen Nutzen.
Gruß
trapperjohn
15.06.2008, 12:06
Was für ein Trick ist das denn? Ich stecke ja in der Thematik überhaupt nicht drin - ich kann in den Quellen und der Doku der Lib nichts finden, dass außer dem o.g. Code gemacht wird.
Arthur S.
15.06.2008, 14:13
@Trapper
Also,wenn man den Timer 2 initialisiert,legt man ja die Frequenz über den Vorteiler fest. Das ergibt dann Systemtakt durch Vorteiler = Zähltakt.
Der Timer 2 kann aber in seiner Zählweise an sich nicht manipuliert werden.
Er zählt also von 0 bis 255. Das ergibt dann die 31,...kHz.
Man könnte einen Zählwert vorgeben,dann verbraucht man aber das OCR2.
Der zu zählende Wert wäre dann die Differenz zwischen Max (255) und dem Wert in OCR2. So kann man bequem ne bestimmte Frequenz einstellen,diese ist dann aber net mehr pulsweitenmodulierbar, da OCR2 ja schon benutzt wird.
Der Trick ist,den Timer Overflow zu nutzen. Man muss nur eine Interupt Service Routine schreiben die angesprungen wird wenn er Max (255) überschreitet. In dieser Routine addiert man einfach die Differenz zu dem Zählerstand.
Zum Verständnis: Timer 2 zählt von 0 bis 255 -----> ergibt am OC2 pin 31,..kHz.
Beim Wechsel von 255 zu 0 (Overflow) wird ISR angesprungen und 0x25 drauf addiert, daraus folgt der Timer zählt von 0x25 bis 0xFF.
Differenz 218 (plus die 4Zyklen für die Sprünge etc.) ergibt dann 222.
222 entspricht bei Vorteiler 1 einer Frequenz von 36,036 kHz.
Und OCR2 kann nun für PWM genutzt werden.
Also Fazit ohne ISR gehts nicht. =P~
Arthur S.
15.06.2008, 14:21
Zusatz,im C Programm zu finden in der asuro.c!
Das müsste die Interupt Service Routine in C sein.
SIGNAL (SIG_OVERFLOW2)
{
TCNT2 += 0x25;
count36kHz ++;
if (!count36kHz)
timebase ++;
if (Ovr2IntFunc)
Ovr2IntFunc();
}
Sternthaler
16.06.2008, 19:11
Hallo zusammen,
falls es jemanden interessiert, wie der von Arthur S. oben gezeigte Code (das TCNT2) in der LIB zustande gekommen ist, um den 36 kHz Takt mit einem Ratio (an/aus-Verhältnis) von 50% hinzubekommen, kann mal (etwas versteckt) unter der ASURO als Wecker (Ab Punkt 2: beschrieben) (https://www.roboternetz.de/phpBB2/zeigebeitrag.php?p=364831#364831) eine Beschreibung finden.
Wer noch ein paar allgemeinere Infos zu Interrups benötigt findet etwas weiter vorher unter der ASURO als Wecker (mittendrin) (https://www.roboternetz.de/phpBB2/zeigebeitrag.php?p=341368#341368) auch dazu etwas.
Das hat nichts mit eurem Problem zu tun, könnte aber allgemein lesenswert sein und wurde 2 Post vorher auch von Arthur S. in Kurzform zusammengefasst.
Gruß Sternthaler
Arthur S.
16.06.2008, 20:22
AHHHHH,Sternthaler!
Ich dreh durch,hätte ich diesen sehr hilfreichen Thread von dir nur eher entdeckt. 8-[
Aber naja,so hab ichs selber hingefriemelt. Trotzdem Respekt zu diesem Thread,der ist wirklich sehr verständlich.
Gruß
Sternthaler
17.06.2008, 00:47
Hi Arthur S.,
danke für das Lob. Bekommst du gleich von mir zurück, da das 'selber hingefriemelt' nämlich eine mordsmäßige Wühlerei in der Doku und den Registern ist. Geschweige denn, wenn man so etwas selber hinbekommen würde. Aber die Leistung bleibt auf immer und ewig nun bei waste.
Um nun zu zeigen, was du so drauf hast ;-), wäre ich sehr stark an deinem Assembler-Code interessiert.
Bis jetzt war ich selber immer zu faul mal ein Grundgerüst anzulegen und auf dem mega8 mit Assembler zu beginnen. (OK, Grundgerüst ist ja im wiki.)
Dieses IR-Hindernis-Ding ja auch schon in einigen anderen Thread’s eingezogen, aber bis jetzt immer nur in C.
Bestimmt hast du ja Abstände im Timerinterrupt (https://www.roboternetz.de/phpBB2/zeigebeitrag.php?p=371678#371678) schon besucht. Und wenn nicht, wäre es mal eine Anregung, falls du es nicht schon in Assembler hast, das IR-Geraffel komplett in Assembler im Interrupt zu 'versenken'. Und alle werden dich ohne Ende loben ;-).
Egal wie, weiterhin viel Erfolg und Spaß
Gruß Sternthaler
Arthur S.
09.07.2008, 19:22
So hier wie von Sternthaler gewünscht erstmal der grundlegende Code für IR-Kollision in Assembler. Die _Inits am Start und die Inc-Dateien ganz oben sind selbst geschriebene Makros um nicht jedes mal die LED's ,Stack etc zu initialisieren. Programm funktioniert wie folgt: Sobald IR anschlägt gehen die Back LED's an. Sendeleistung müsste hier im Programm eingestellt werden,hatte noch keine Zeit mich weiter damit zu befassen (es ist Prüfungszeit).
Der Code:
.include "m8def.inc" ;Deklaration für Atmega8
.include "Stack.inc" ;Inc-Datei für Stack
.include "UART.inc" ;Inc-Datei für Uart
.include "Motor.inc" ;Inc-Datei für die Motoren
.include "BackLED.inc" ;Inc-Datei für Back LED's
.def temp0=R16 ;Benennung der
.def temp1=R17 ;Arbeitsregister
.def temp2=R18
.def temp3=R19
.def temp4=R20
.def temp5=R21
.def temp6=R22
.def temp7=R23
.def temp8=R24
.def temp9=R25
.CSEG ;Program-Flash
rjmp Start ;Sprung
reti ;rjmp EXT_INT0 ; IRQ0 Handler
reti ;rjmp EXT_INT1 ; IRQ1 Handler
reti ;rjmp TIM2_COMP ; Timer2 Compare Handler
rjmp TIM2_OVF ; Timer2 Overflow Handler
reti ;rjmp TIM1_CAPT ; Timer1 Capture Handler
reti ;rjmp TIM1_COMPA ; Timer1 CompareA Handler
reti ;rjmp TIM1_COMPB ; Timer1 CompareB Handler
reti ;rjmp TIM1_OVF ; Timer1 Overflow Handler
reti ;rjmp TIM0_OVF ; Timer0 Overflow Handler
reti ;rjmp SPI_STC ; SPI Transfer Complete Handler
reti ;rjmp USART_RXC ; USART RX Complete Handler
reti ;rjmp USART_UDRE ; UDR Empty Handler
reti ;rjmp USART_TXC ; USART TX Complete Handler
reti ;rjmp ADC ; ADC Conversion Complete Handler
reti ;rjmp EE_RDY ; EEPROM Ready Handler
reti ;rjmp ANA_COMP ; Analog Comparator Handler
reti ;rjmp TWSI ; Two-wire Serial Interface
Start:
Stack_Init temp0 ;Initialisierung als Makro
Uart_Init temp0 ;Initialisierung als Makro
Pwm_Init temp0 ;Initialisierung als Makro
Motor_Init temp0 ;Initialisierung als Makro
LED_Init temp0 ;Initialisierung als Makro
;--------------------------------------------------------------------------------
in temp0,ddrd ;PD1 als Ausgang
ori temp0,0b00000010 ;nach dem Read-Modify-Write
out ddrd,temp0 ;Prinzip
cbi portd,1 ;PD1 auf LOW
;-------- seriell interface programmed in boot routine and already running -------
; prepare 36kHz for IR - Communication using 8-bit timer 2
ldi temp0,(1 << WGM20) | (1 << WGM21) | (1 << COM20) | (1 << COM21)| (1 << CS20)
out TCCR2, temp0 ;Timer2 Einstellungen
ldi temp0,0xF7 ;einzustellender Wert für die PWM
out OCR2,temp0 ;in das Output Compare Register
in temp0, TIMSK ;Timer2
ori temp0, (1<<TOIE2); ;Overlow Interupt
out TIMSK, temp0 ;enable
sei ;global Interupts enable
loop: SWITCH_LEFT_BACKLED_OFF
SWITCH_RIGHT_BACKLED_OFF
sbic pind,0 ;Abfrage des Empfängers auf Null,da dieser auf LOW
rjmp loop ;gezogen wird bei Empfang
SWITCH_LEFT_BACKLED_ON
SWITCH_RIGHT_BACKLED_ON
rjmp loop
TIM2_OVF: ;Interupt Service Routine für den Overflow des Timers2
push temp0
in temp0,sreg
push temp0
in temp0,tcnt2
subi temp0,-0x25
out tcnt2,temp0
pop temp0
out sreg,temp0
pop temp0
reti
Für Fragen stehe ich jederzeit zur Verfügung! =P~
Sternthaler
10.07.2008, 03:52
Hallo Arthur S.
so als Muster sieht die Welt für einen C-Progger und meistens nur ASM-Leser doch schon viel übersichtlicher aus.
Nett finde ich deine Addition von 0x25 mit dem SUBI temp0, -[/b]0x25. Das hätte ich, wenn überhaupt, nur in den Outputs vom C-Compiler entnommen. Ansonsten hätte ich das ADD, mit einem weiteren LDI davor benutzt.
Mir fehlen hier natürlich die *.inc-Dateien als AVR-ASM-Starter ganz enorm. Ich gehe mal davon aus, dass auch die SWITCH_[LEF|RIGHT]_BACKLED_[ON|OFF] als Macro dort versteckt sind. Und was fehlt mir sonst noch?
Die eigentliche Arbeitsschleife könnte doch folgendermaßen auch funktionieren?
loop: SWITCH_LEFT_BACKLED_OFF
SWITCH_RIGHT_BACKLED_OFF
loop_0: sbic pind, 0 ; Abfrage des Empfängers auf Null, da dieser
rjmp loop2 ; auf LOW gezogen wird bei Empfang.
SWITCH_LEFT_BACKLED_ON
SWITCH_RIGHT_BACKLED_ON
loop_1: sbis pind, 0 ; Warten, bis das Hindernis wieder weg ist.
rjmp loop_1
rjmp loop
Wenn ich das so weit richtig eingebaut haben sollte, würde ich mir davon versprechen, dass die LED's nicht permanent an- und ausgeschaltet werden bei einem Hindernis, und so heller leuchten müssten. Kann das so gehen?
Und hier natürlich auch ein 'thanks a lot' für deinen Code.
Viel Erfolg bei den Prüfungen.
Gruß Sternthaler
little.r2d2
12.07.2008, 14:47
Hallo alle zusammen,
ich bin neu hir.
29 Jahe Alt Elektrotechniker.
habe seid 3 Tagen meinen Asuro.
habe alles schön zusammen gabaut, gelötet ( auch die finger verbrannt) bitte nicht lachen :-) .
Nach ein paar anlaufschwierigkeiten mit der übertragung geht nun alles.
Ausser ( nu kommts )
wenn ich das selftest übertrage oder mit der Easy asuro geht alles, alles was ich will.
Nur wenn ich sebst eins schreibe in c mit der mitgelieferten software, oder sogar die von hier geposteten mir stibitze.
Meine frage an euch:
Muss ich mehrere make und clean files erstellen.
Wie lege ich ein eigenes projet an? Ich nehme immer die test.c lösche da alles und schreibe wie in der anleitung beschrieben, nur dann geht nichts.
oder kopiere was fertig geschriebenes rein, dann werden immer beim Selftest 84 pages übertragen und und im first try 24 wobei da nur die Status LED grün bleibt.
Oder wie geht ihr vor.?
Wie gesatgt und Bei easy asuro hab ich schon ein ausweichen mit lansamen rückwerts faht drehung und wieder schneller Vorwertsfahrt hinbekommen. weil 1 kann die easy asuro nicht ; die lienien vervolgung und gerade das ist was ich nutzen möchte ( schwartze Fugen in der Wohnung) naja oder sehr dunkelgrau.
Für eine kleine stütze währ ich escht dankbar,
LG
Ps: wehr rechtschreibfehler findet kann sie behalten
Hallo little.r2d2,
ich bin neu hir.
29 Jahe Alt Elektrotechniker.
Spontan ist mir jetzt sofort ein Sketch der Gruppe "Badesalz" eingefallen, kennst Du die? O:)
Aber Scherz bei Seite: Am besten ist, wenn Du gleich AVR-Studio installierst und damit Deine ASURO-Projekte machst. Das Programm gibt's kostenlos von Atmel und man kann damit auch Debuggen.
Gruß,
robo
little.r2d2
13.07.2008, 12:34
hehe, Hi robo
ja kenne ich
Ich habe das originale Winavr installiert was bei dem lieverumfang dabei war
habe gestern ganzen tach drann gesessen und mir die finger blutig getippt.
Naja ich install mal das neue, aber hab kein ahnung was ich falsch mach.
little.r2d2
13.07.2008, 13:58
Soo habe nun avr studio 4 installier
Nun weiss ich nicht ob oder wo ich die make files brauche oder finde.
Da bei der Asuro software ja auch mehrere test Programme dabei sind, was ich gleich poste, würde ich die gern testen weil sie ja auch so heissen :)
#include "asuro.h"
#define SPEED 0x8F
int speedLeft,speedRight;
unsigned int lineData[2];
int ADOffset;
void LineLeft (void)
{
speedLeft += 1;
if (speedLeft > 0xFE) speedLeft = 0xFF;
}
void LineRight (void)
{
speedRight += 1;
if (speedRight > 0xFE) speedRight = 0xFF;
}
void LineDemo(void)
{
int i;
unsigned char j;
Init();
FrontLED(ON);
for (j = 0; j < 0xFF; j++) LineData(lineData);
LineData(lineData);
ADOffset = lineData[0] - lineData[1];
speedLeft = speedRight = SPEED;
for(;;) {
LineData(lineData);
i = (lineData[0] - lineData[1]) - ADOffset;
if ( i > 4) {
StatusLED(GREEN);
LineLeft();
}
else if ( i < -4) {
StatusLED(RED);
LineRight();
}
else {
StatusLED(OFF);
speedLeft = speedRight = SPEED;
}
MotorSpeed(speedLeft,speedRight);
}
}
__________________________________________________ ____________
nur wie bekomme ich jetzt vom avr erzeuten programme in eine hex datei oder wie übermittle ich das ganze? Diesen progamm konnte ich nicht mal mit der originalen Winavr nutzen ....
LG[/code]
Die Makefiles brauchst Du nicht. Du muss ein Projekt im AVR-Studio anlegen und asuro.c, asuro.h einbinden.
damaltor
14.07.2008, 17:17
du brauchst avrstudio nicht unbedingt. wichtig ist nur: ERST speichern, DANN kompilieren.
little.r2d2
15.07.2008, 05:58
hi,
joa mit dem AVR Studio komm ich nicht so zurecht
hab mir nochmal Winavr 2008... runtergeladen das sieht besser aus.
wobei ich nun alle demo programme übertragen, aba geht nicht 1
ich denke ich mache immer noch was falsch
Also ich nehme die originale test.c lösche da alles copiere die originale demo linienfolgen programm ein oder auch was anderes. geht aber nicht
wen ich was selbs schreibe aber nur die led, geht es. naja ab und zu.
füge ich dann wieder was ein was dann geht wieder nur die grüne sys led.
gehn die Originalen test programme?
Da ist auch 1 dabei wen ich die beschreibung richtig verstanden habe das
wenn ich es übertagen haben. k1 für sebsttest, k2 für lieniendemo k3 für irftest, drücke dann die programme ablaufen. aba gefunzt hts noch nicht,
aber danke für den tip mit dem speichern werd ich mal testen.
oberallgeier
15.07.2008, 09:35
Hallo little.r2d2,
... mit dem AVR Studio komm ich nicht so zurecht ... ich denke ich mache immer noch was falsch ...Ich hatte letzten September/Oktober bei NULL angefangen (hatte lediglich vor 15-20 Jahren sehr viel FORTRAN mit Assembler gemacht) und ich bin vom ersten Tag an prächtig mit AVRStudio zurandegekommen. Musste allerdings die neueste Version (https://www.roboternetz.de/phpBB2/zeigebeitrag.php?t=35437&highlight=)holen.
Ich hatte nie ein makefile bearbeitet oder ähnliche Dinge gemacht. Hatte in AVRStudio ein neues Projekt eröffnet, den Zielprozessor ausgewählt, die Projektdatei benannt (das ergibt dann eine neue, projektbezogene directory), dann einfach den Code geschrieben, erst in Assembler, später in C, compiliert und den Hexfile (liegt im subdirectory "default"), teilweise auch für den asuro, auf das Zielsystem geflasht. Beim asuro hatte ich mit dem Flash.exe über IR geflasht. Fazit zu AVRStudio:
... ich denke ich mache immer noch was falsch ...
Wenn Du NICHTS machst, machst Du es richtig.
PS: Du kannst, wenn Du magst, dies hier ausprobieren - bei mir läufts a) mit AVRStudio, mit Flash.exe und auf dem asuro.
1) Starte AVRStudio.
2) Mach im AVRStudio ein neues Direktory z.B. test-schleich auf.
3) gehe auf den normalen Desktopbildschirm
4) kopiere alle files aus dem *zip in dieses directory test-schleich
Einfach ALLES in das "neue" directory schreiben
5) Öffne die test.c im notepad (dem einfachen Editor).
6) Wähle den kompletten Text der test.c - kopiere mit paste & copy
7) Füge die test.c in das AVR-Codefenster ein
8 ) Drücke - im AVRStudio [F7]
9 ) Flashe den File mit Flash.exe - er liegt in ..\test-schleich\default.
10) vermutlich freust Du Dich danach
little.r2d2
15.07.2008, 19:28
ok habe nun das avr drauf und volge mal den anweisungen
das muss doch klappen vorallem die ariginal geschriebenen
soo test... :)
little.r2d2
15.07.2008, 20:13
hmmm so gehts nicht?
nur rote punkte 11 errors 9 warnungen
little.r2d2
15.07.2008, 21:01
ok noch mal aber etwas besser ( aber immer noch nicht)
bzw wo mache ich da ein neues directory
1-5 hab ich gemacht
dann öffne ich AVR Studio
wähle mein schon angelegtes projekt aus ( ist das noch richtig? )
öffne new file
Paste alles da rein Dann F7 / ratter ratter Ohne error
Aber nirgend wo eine hex zu finden die, die erzeut wird ist die von test.c original
Hmmpf
binn zu doof Aba muss doch klappen naja morgen wieder.
Lg
oberallgeier
15.07.2008, 22:26
binn zu doof Aba muss doch klappen naja morgen NEIN ! Sorry - es war mein Fehler !
hmmm so gehts nicht?
nur rote punkte 11 errors 9 warnungen
stimmt - ich hatte vor einiger Zeit meinen asuro-Pfad umgebogen, ich kenne Deinen nicht - also habe ich jetzt mal eine Holzfällermethode probiert (ich wohne in den Oberallgäuer Bergen, das ist Bayern, da sind die Holzfäller daheim). Diese unvorschriftsmässige Vorgehensweise ist hier beschrieben (http://oberallgeier.ob.funpic.de/c-to-asuro.pdf), aber sie ist wirklich unseriös. Halt quick and dirty - sorry - im Moment schaff ich es nicht sauber.
little.r2d2
16.07.2008, 05:57
ah ok,
ist ja kein ding, vieln dan für den link.
werde mich heute mittag mal drann machen.
Es eilt ja auch nicht, kann ja bissel experimentieren.
Lg
oberallgeier
16.07.2008, 08:18
Grüß Dich, little.r2d2,
die Fahrt des asuro ist bei mir mit den aktuellen Parametern recht holprig. Das Programm hatte ich geschrieben, um die Minimalgeschwindigkeit des asuro auszutesten - und aktuell ist er gestern bei mir recht seltsam gefahren - mal ein Motor vorwärts, mal der andere. Wenn das bei Dir auch so ist, dann liegt es also NICHT am flaschen *gggg* sondern am Programmierer . . . .
hallo little.r2d2,
ich hab mich mal in den problem hinein gelesen und ich kann nur sagen, es funktioniert auch ohne AVRStudio (nichts gegen dieses programm!!).
nun zu meiner version:
angefangen habe ich mit Programmers Notpade (original version von der CD) und den mitgeleiferten beispielprogrammen:
immer inhalt von test.c gelöscht und eigenes programm eingefügt, dann compiliert (laut anleitung, make und clean eingerichtet), test.hex aus dem verzeichnis kopiert und umbenannt, damit ich es später noch habe und dann wieder ein neues programm geschrieben.
später habe ich mir die erweiterte lib (v2.7 oder v2.8 ) von hier herunter geladen und auch die neuere version von programmers notpad
dadurch hat sich einiges geändert:
man braucht bei notpad keine make und clean einrichten, sondern kann die voreingestellten verwenden
als erstes kopiere ich mir einen ordner aus den exampels ( im verzeichnis der lid), zb. motortest und benenne ihn um, zb. eigenes_programm, dann öffne ich das test.c, ändere den programm-code um und kompiliere das ganze
zum übertragen auf den asuro verwende ich eine neuere version von flash (müsste aber mit der originalen auch funktionieren)
achso, hab ich glatt vergessen: immer vor dem kompilieren unbedingt speichrn!!!!!
hoffe, dass es dir weiter hilft
little.r2d2
16.07.2008, 20:33
hmm also bei mir fährt er nur im kreis.
obwohl
Init();
MotorDir(BREAK,BREAK);
MotorSpeed(120,120) <----- bedeutet doch beide motoren FWD
das linke rad bleibt stehn und das recht fähr bis ich ihn wieder aus mache.
selbst die geschwindigkeiten habe ich erhöt und veringert.
wenn ich dann am linke rad drehe dann bleibt das rechte mal stehn das linke zuckt usw...
wie ist das mit der lib brauch ich die neuste unbedingt?
angefangen habe ich mit Programmers Notpade (original version von der CD) und den mitgeleiferten beispielprogrammen:
immer inhalt von test.c gelöscht und eigenes programm eingefügt, dann compiliert (laut anleitung, make und clean eingerichtet), test.hex aus dem verzeichnis kopiert und umbenannt, damit ich es später noch habe und dann wieder ein neues programm geschrieben.
wenn ich die originale test ändere also was eigenes mache passiert nichts ausser grüne led. das mit der StatusLED(RED) geht aber mehr nicht selbs wenn ich fertige programme einfüge wie zb die demo versionen.
PS ich speicher immer erst dann kompiliere ich.
nein, du musst nicht immer auf dem neusten stand sein.
bei den neueren versionen stehen dir nur mehr funktionen zurverfügung (dh. wenn man weiß was es gibt muss man selber meist nicht so viel selber programmieren. das macht sich aber erst bei größeren prjekten bezahlt. außer die goturn funktion, die es da gibt, mit der man ihm eine strecke in mm oder einen winkel anschlaffen kann, den er fahren soll benutzte ich öfters)
aber du kannst natürlich auch alles selber programmieren, oder einfach auf solche aufgaben noch verzichten und erst später damit anfangen.
nun zu deinem code:
mit MotorDir() kannst du bestimmen, welche drehrichtung der motor haben soll:
FWD vorwärts
RWD rückwärts
FREE leerlauf eingestellte geschwindigkeit ist egal!!!!
BREAK bremse (beide anschlüsse des motors werden kurzgeschlossen, somit blockiert er von selbst) eingestellte geschwindigkeit ist egal!!!!
mit MotorSpeed() legst du nur die geschwindigkeit fest:
es werden nur zahlen von 0 bis 255 akkzeptiert, wobei die meitsen erst ab etwa 60 losfahren
wichtig: um einen motor zu steuern braucht man immer zwei angaben (geschwindigkeit und richtung). beides bestimmt dann, wie sich der motor dreht.
in deinem beispiel bedeutet das, dass sich eigentlich kein motor drehen soll (es sind doch beide auf BREAK - also bremsen)
noch eine frage zu dienem programm, hast du danach hoffentlich auch ein while(1)?
also so:
Init();
MotorDir(BREAK,BREAK);
MotorSpeed(120,120);<----- wert hier ist egal, da beide motoren bremsen
while(1); <----- damit er nicht im leeren speicher herum irrt (kann kommische aktionen verursachen, wenn man es nicht anfügt!)
Hi und Hallo,
mein erster beitrag nach 1ner woche wildem hier rumgestöbere und bisher immer ne anwort findend, hab ich nun mein erstes problem.
und zwar reagiert mein sensor einfach nicht. bei dem hex aus den 2.8 lib examples für den ir test funktioniert der sensor nur ganz knapp bevor man die hand bzw gegenstand am sensor dran hat, bei druck auf einen der taster geht reagiert er gar nicht mehr auf den gegenstand. bei ellen anderen ir programmen reagiert er auch nicht.
jemand eine idee wieso das so sein könnte?
PS: ich hab die woche auch das erste ma in C was gemacht. also ich binalles andere als ein profi ;-)
MfG
Hi little.r2d2,
wenn Du deinen Asuro testen willst, kannst Du auch AsuroFlash verwenden.
Forum Thread von AsuroFlash (https://www.roboternetz.de/phpBB2/viewtopic.php?t=25249)
AsuroFlash Webseite (http://secius.com/AsuroFlash)
In der Installation ist die Lib integriert und ein paar Demo-Projekte sind auch dabei.
Wenns installiert ist gehst Du auf Projekt öffnen
Dann wählst Du ein Projekt
Jetzt den Make all Button klicken
http://www.secius.com/AsuroFlash/images/Exmpl02IDE.png
und dann den Flash-Button
http://www.secius.com/AsuroFlash/images/Exmpl01FlashBarFlash.png
Das sollte eigentlich alles ohne Probleme gehn.
Durchhalten!! Irgentwann gehts plötzlich......
[flash width=640 height=480 loop=false:436cb750e7]http://www.secius.com/AsuroFlash/flash/AF_BuildAndFlashDemoPrj.swf[/flash:436cb750e7]
Gruss,
O.
Sir William
18.01.2010, 12:49
moin, hab den umbau auch nach der anleitung vollzogen. der code von waste hat auch funktioniert soweit. wollte jetzt noch einbinden, dass das hindernis schon früher erkannt wird und der asuro je nachdem links oder rechts daran vorbei lenkt. doch irgendwie funktioniert die ir-erkennung plötzlich so gut wie garnicht mehr. egal welche pulsweite ich einstelle, es werden nur noch stark reflektierende gegenstände unmittelbar vor meinem asuro erkannt. hab die led schon ausgetauscht, aber daran lag es nicht
oberallgeier
18.01.2010, 13:54
... doch irgendwie funktioniert die ir-erkennung plötzlich so gut wie garnicht mehr ...Mehrere Punkte. Bei meinem Aufbau mit einer Abstandsmessung ähnlich wie IR-Schnittstelle des asuro (https://www.roboternetz.de/phpBB2/zeigebeitrag.php?t=38009&highlight=&sid=d44b3bf82ad243e9e533346517bf8019) war mir auch einmal aufgefallen, dass meine vorher saubere Messung plötzlich Fehler zeigte. (https://www.roboternetz.de/phpBB2/zeigebeitrag.php?p=390902&sid=d44b3bf82ad243e9e533346517bf8019#390902) Als Grund hatte ich einen in der nähe stehenden (Flach-)Bildschirm identifizieren können (https://www.roboternetz.de/phpBB2/zeigebeitrag.php?p=391057&sid=d44b3bf82ad243e9e533346517bf8019#391057) - hier auch mal zwei Postings runterscrollen zum Bild des Messaufbaus mit meinem asuro. Überlege, ob ähnliche, getaktete Lichtquellen bei Dir der Grund für die Fehlfunktion sein können.
Als Testfahrt für die Abstandsmessung (bzw. die Sensorik zur Hinderniserkennung) mithilfe des Asuro könntest Du dies hier (https://www.roboternetz.de/phpBB2/download.php?id=13754&sid=d44b3bf82ad243e9e533346517bf8019) von Sternthaler nehmen. Dazu könntest Du Dir natürlich das ganze Posting ansehen. (https://www.roboternetz.de/phpBB2/zeigebeitrag.php?p=371678&sid=d44b3bf82ad243e9e533346517bf8019#371678) Zum Test einfach den Hexfile auf den asuro schaufeln und den vor die Wand stellen.
* Bedienung
* - Den Asuro mit den Tastern zur Wand stellen und einschalten.
* - Er fährt dann ca 1,5 Meter zurueck. In dieser Zeit werden Messwerte
* gesammelt.
* - Asuro zur Datenuebertragung in Sichtweite zum PC-Empfaenger stellen.
* - Taste druecken und loslassen
* - Die Messwerte werden uebertragen.
* Mit einem weiteren Tastendruck kann die Messung wiederholt werden.
Die Abstände werden über die IR-Strecke des asuro ausgegeben, können in einem Terminalprogramm angesehen und dann auf Glaubwürdigkeit geprüft werden.
Viel Erfolg.
Sir William
18.01.2010, 14:17
ok, mach ich mal gleich
danke erstmal
Sir William
18.01.2010, 14:38
Also an meinem Monitor liegt es nicht. das Problem besteht auch, wenn ich ihn ausgeschaltet habe.
Ich benutze die Lib 2.71 und verstehe die Anleitung nicht so ganz
Hinweis
* Hinweis
* -------
DIESE ZUWEISUNG IST NUR AB DER ASURO-LIB VERSION 2.80 MOEGLICH.
Ist noch eine aeltere LIB-Version vorhanden, muss in der Funktion
SIGNAL (SIG_OVERFLOW2) in asuro.c die Funktion CirIsr() aufgerufen
werden.
- DIE LIB MUSS DANN NEU UEBERSETZT WERDEN.
- DIESE ZUWEISUNG MUSS DANN RAUS.
oberallgeier
18.01.2010, 14:58
Also an meinem Monitor liegt es nicht ... Ich ... verstehe die Anleitung nicht so ganz ...Schön - oder fast schade - dass es nicht an Deinem Monitor liegt.
Die Anleitung bezieht sich auf die Abstandsmessung von Sternthaler. Mal langsam - und diesmal sauber auf Deine Frage abgestimmt. Dieser fertige, flashfähige Test geht davon aus, dass Deine Sensorik für die Abstandsmessung in Fahrtrichtung, gerade nach vorne ausgerichtet ist.
1) den hexfile von Sternthaler aus diesem Link (https://www.roboternetz.de/phpBB2/download.php?id=13754&sid=f70346f88b4790b6a3a7b7b07b8fd13a) downloaden und auf den asuro flashen
2) den so programmierten asuro vor eine Wand stellen - Abstandssensorik bzw. Front des asuro (=Tasterreihe) schaut zur Wand
3) asuro einschalten
4) asuro fährt ca. 1,5 m zurück und misst laufend den Abstand zur Wand
5) wenn der asuro wieder stehen bleibt, den asuro zum IR-Tranciever stellen (wie beim Programmieren)
6) Terminalprogramm am PC einschalten und auf die Baudrate des asuro eingesteen - bei mir läuft das gut mit 2400 Bd.
7) IRGENDEINEN Taster der asuro-Kollisionstaster drücken - es beginnt die Datenübertragung vom asuro zum PC. Der asuro schickt also die laufenden Messwerte von der letzten Testfahrt über die IR-Verbindung. Diese Messwerte sollten der zurückgelegten Fahrt entsprechen. Die Messmethode hat Sternthaler aufgebaut - es ist eine Mehrfachmessung, die gemittelt wird. Die Ergebnisse sind bei gleichen Hindernissen (Farbe, Struktur etc) und gleicher Beleuchtung recht gut reproduzierbar. Näheres hier. (https://www.roboternetz.de/phpBB2/zeigebeitrag.php?p=371678&sid=f70346f88b4790b6a3a7b7b07b8fd13a#371678)
WENN nichts übertragen wird, dann ist die die IR-Strecke (Transceiver oder asuro) defekt oder die falsche Schnittstelle eingestellt oder ? ?
Ist es jetzt klar(er) ?
Sir William
18.01.2010, 16:01
ja das hab ich schon verstanden
ich meinte eigentlich das, was man in der asuro.c ändern muss, wenn man nicht die lib 2.8 verwendet?
Sir William
18.01.2010, 16:10
also habs jetzt erstmal so gemacht und er zeigt folgendes an:
CKCKCKCK...
63
63
63
63
.
.
.
63
oberallgeier
18.01.2010, 16:55
Hallo Sir,
das sieht ja nicht wirklich gut aus. Ich setzte mal voraus, dass der asuro bei der Messfahrt wirklich die 1 bis 1,5 m mit etwa 20 cm/sec zurückgefahren ist. Da der hexfile mit der zutreffenden lib compiliert wurde (bei mir ist dieser file ein Standardtest, wenn mal was zur Abstandsmessung nicht geht) müsste auch alles stimmen - WENN die hardware korrekt läuft. Die IR-Datenübertragung zum Flashen und für Daten läuft aber - wie wir sehen. Da weiß ich im Moment leider auch nicht weiter.
Sir William
18.01.2010, 18:35
Also reagiert bei jeder Pulsbreite auf die gleich distanz, ca 1-3cm vor den tastern
Sir William
18.01.2010, 19:36
Hm, irgendwie geht es jetzt wieder. Sehr sehr komisch. aber ich habe einen neuen Fehler. hab den folgenden code:
while(1)
{
ir=PIND & (1 << PD0);
if (ir || ir1 || ir2 || ir3 || ir4) // ALLES OK
{
FrontLED(OFF);
BackLED(OFF,OFF);
MotorDir(FWD,FWD);
//MotorSpeed(speed,speed);
}
else // HINDERNIS!!!!!!!!!!!!!!
{
BackLED(ON,ON);
FrontLED(ON);
.
.
.
nun gehen sowohl die BackLED's, als auch die FrontLED in diesem Fall nur an, falls in unmittelbarer nähe ein Hindernis auftaucht. Wenn ich MotorSpeed nun aber wieder als Befehl nehme, sprich die Motoren anschmeiße, dann leuchten die LED's permanent. Es wird also immerzu ein Hindernis erkannt, auch wenn weit und breit keins in seiner Richtung ist
Was ist die förmel fur ir1, ir2, ir3 und ir4? Oder welcher wert bekommen sie am anfang? Bitte poste das ganzen program. Wir können die If regel nicht entscheiden ohne diese hinweis.
Sir William
18.01.2010, 22:01
also der code von radbruch ist ja folgender:
#include "asuro.h"
#include <stdlib.h>
int main(void)
{
unsigned char sw, speed;
unsigned char ir,ir1,ir2;
Init();
DDRD |= (1 << DDD1); // Port D1 als Ausgang
PORTD &= ~(1 << PD1); // PD1 auf LOW
OCR2 = 0xFC;
speed=140;
ir = 0;
ir1 = 0;
ir2 = 0;
ir3 = 0;
ir4 = 0;
while(1)
{
ir=PIND & (1 << PD0);
if (ir || ir1){
BackLED(OFF,OFF);
MotorDir(FWD,FWD);
MotorSpeed(speed,speed);
} else {
BackLED(ON,ON);
MotorDir(RWD,RWD);
MotorSpeed(speed,speed);
if (speed > 0) Msleep(500);
MotorDir(BREAK,RWD);
MotorSpeed(0,speed);
if (speed > 0) Msleep(500);
}
ir2=ir1; ir1=ir;
sw = PollSwitch();
/*
if (sw & 0x01)
OCR2 = 0xFE;
if (sw & 0x02)
OCR2 = 0xFD;
*/
if (sw & 0x04)
OCR2 = 0xFC;
if (sw & 0x08)
OCR2 = 0xFB;
/*
if (sw & 0x10)
OCR2 = 0xFA;
if (sw & 0x20)
OCR2 = 0xF9;
*/
}
return 0;
}
der funktioniert bei mir ausgezeichnet
jetzt hab ich wie gesagt versucht, den etwas auszubauen, bzw abzuwandeln(sind sicher auch noch einige andere fehler drin)
#include "asuro.h"
#include <stdlib.h>
int Abbiegtest();
int main(void)
{
unsigned char speed,Abbiegen;
unsigned char ir,ir1,ir2,ir3,ir4;
Init();
DDRD |= (1 << DDD1); // Port D1 als Ausgang
PORTD &= ~(1 << PD1); // PD1 auf LOW
OCR2 = 0xFE;
speed=100;
while(1)
{
ir=PIND & (1 << PD0);
if (ir || ir1 || ir2 || ir3 || ir4) // ALLES OK
{
FrontLED(OFF);
BackLED(OFF,OFF);
MotorDir(FWD,FWD);
MotorSpeed(speed,speed);
}
else // HINDERNIS!!!!!!!!!!!!!!
{
BackLED(ON,ON);
FrontLED(ON);
/*Abbiegen = 1 & rand();
if(Abbiegen == 0) // nach links lenken
{
MotorSpeed(110,130);
Msleep(300);
if (Abbiegtest() == 0) //wenn in die linke Richtung ein Hindernis kommt...
{
MotorSpeed(230,100); //...eine Sekunde nach rechts lenken
Msleep(800);
}
else
continue;
}
else
{
MotorSpeed(speed,130);
Msleep(300);
if (Abbiegtest() == 0) //wenn in die linke Richtung ein Hindernis kommt...
{
MotorSpeed(100,230); //...eine Sekunde nach rechts lenken
Msleep(800);
}
else
continue;
}*/
}
ir4 = ir3;
ir3 = ir2;
ir2 = ir1;
ir1 = ir;
}
return 0;
}
int Abbiegtest ()
{
unsigned char i,infr,infr1,infr2;
OCR2 = 0xDE;
infr = PIND & (1 << PD0);
for(i=1;i<=50;i++)
{
if (infr||infr1)
continue;
else
return 0; // Hindernis in der Richtung
}
infr2 = infr1;
infr1 = infr;
return 1; // kein Hindernis, Richtung kann weiterbehalten werden
}
ich hab erstmal den rest vom else-teil auskommentiert, um den fehlerbereich einzugrenzen
fakt ist, lass ich in dem teil
if (ir || ir1 || ir2 || ir3 || ir4) // ALLES OK
{
FrontLED(OFF);
BackLED(OFF,OFF);
MotorDir(FWD,FWD);
MotorSpeed(speed,speed);
} den MotorSpeed an, springt er jedes mal nach dem Anschalten in den else-teil
Kommentier ich es aus, Fangen die LEDs erst an zu leuchten, wenn ich zb mit der Hand vor meiner IR-Abteilung rumwinke
Sir William
19.01.2010, 00:08
ich verzweifel hier langsam echt mit diesem tollen gefährt...
Sir William
19.01.2010, 13:03
Ich hab jetzt folgende eine Zeile, die Radbruch auch drinne hatte, mitreingenommen, und plötzlich funktioniert es: sw = PollSwitch(); !!!! Kann mir das einer erklären?
while(1)
{
sw = PollSwitch(); // <-------------------------------- HIER
ir=PIND & (1 << PD0);
if (ir || ir1) // ALLES OK
{
FrontLED(OFF);
BackLED(OFF,OFF);
MotorDir(FWD,FWD);
MotorSpeed(speed,speed);
}
else // HINDERNIS!!!!!!!!!!!!!!
{
BackLED(ON,ON);
FrontLED(ON);
MotorSpeed(150,0);
Msleep(1000);
}
also lediglich der Variablen "sw" den Wert der Taster zugewiesen mit "sw = PollSwitch();"
radbruch
19.01.2010, 18:34
Hallo
Ich glaube nicht, dass PollSwitch() selbst diesen Effekt auslöst. Vielmehr scheint mir eine fehlende Verzögerung in der Hauptschleife in Verbindung mit IR-Störungen durch Fremdlicht (Leuchtstoff, Halogen, LCDs, CRTs..) die Ursache zu sein. Wenn solch ein verirrtes IR-Teilchen den Empfänger irritiert und er seinen Ausgang auf Low setzt, werden die IRx quasi in einem Rutsch eingelesen. Mit PollSwitch() wird das Einlesen der IRx aber durch ein paar zusätzliche Sleep()s verzögert. (ein Sleep() ist ein Takt Trägerfrequenz, der TSOP benötigt ca. 6-10 Takte der Trägerfrequenz für die Erkennung)
Ersetze mal in deinem Progamm sw=PollSwitch(); durch ein schlichtes Sleep(20);
/* function to read out switches */
unsigned char PollSwitch (void)
{
unsigned int i;
int ec_bak=autoencode;
autoencode=FALSE;
DDRD |= SWITCHES; // Switches as Output
SWITCH_ON; // Output HIGH for measurement
ADMUX = (1 << REFS0) | SWITCH; // AVCC reference with external capacitor
Sleep(10);
ADCSRA |= (1 << ADSC); // Start conversion
while (!(ADCSRA & (1 << ADIF)));// wait for conversion complete
ADCSRA |= (1 << ADIF); // clear ADCIF
i = ADCL + (ADCH << 8);
SWITCH_OFF;
Sleep(5);
autoencode=ec_bak;
//return ((unsigned char) ((( 1024.0/(float)i - 1.0)) * 61.0 + 0.5));
//return ((10240000L/(long)i-10000L)*61L+5000L)/10000;
return ((10240000L/(long)i-10000L)*63L+5000L)/10000;
}
Und noch die switches-Defines aus asuro.h dazu:
#define SWITCHES (1 << PD3)
#define SWITCH_ON PORTD |= SWITCHES
#define SWITCH_OFF PORTD &= ~SWITCHES
Die Funktion PollSwitch() aus der asuro-Library
Gruß
mic
Du muss auch nicht vergessen variabelen beim anfang mit neutrale werten zu initialisieren. Beim anschalten von Asuro kan in die speicherplatzen jeder art von wert stehen. Speicherplatzen sind nicht immer leer, oder 0. Gibb den werten selbst ein dammit du darauf verlassen kannst das die if-regeln nicht mit kwatsch werten anfangen.
Also:
ir = 0;
ir1 = 0;
ir2 = 0;
ir3 = 0;
ir4 = 0;
Sir William
20.01.2010, 19:04
jop, hatte ich jetzt schon gemacht
hab den code jetzt etwas abgewandelt. auffällig ist, dass er mit sehr dunklen hindernissen, wenn er sie seitlich anfährt, oftmals probleme hat, diese rechtzeitig zu erkennen, oftwohl ich teilweise impulsbreiten wie 0xD0 verwende
Naja, wenn ein Hindernis kein Licht zurückwirft ( also schwarz ist ), kann es auch nicht detektiert werden.
Wobei allerdings viele für uns "sichtbar" schwarze Objekte das IR-Licht immer noch reflektieren.
oberallgeier
20.01.2010, 19:53
@robo.fr, hallo Sir William,
... Wobei allerdings viele für uns "sichtbar" schwarze Objekte das IR-Licht immer noch reflektieren ...Nichts für ungut, robo.fr wenn ich meinen Senf dazugebe: Dein Einwand gilt natürlich auch bei weißen Flächen - die auf IR bezogen ziemlich "schwarz" - also mit geringer Reflexion - sein können (und beides auch umgekehrt). Das hatte ich bei meinem WALL R (https://www.roboternetz.de/phpBB2/zeigebeitrag.php?t=45658&highlight=) bei einigen Testfahrten deutlich gemerkt. Und schliesslich hatte ich weisse Wandfarbe mit viel IR-Rückstrahlung von weisser Wandfarbe mit wenig IR-Rückstrahlung einfach experimentell trennen können. Sozusagen der asuro mit Sternthalers CIRpendem IR-Belichtungsmesser *ggg*.
Halllo oberallgeier,
Du hast natürlich recht und ich war etwas unpräzisse mit meinen Ausführungen :-)
Vor kurzem ist mir ein neuer Algorithmus zur Auswertung eingefallen, der etwas schneller und weniger störanfällig sein könnte:
Man macht eine Schleife und beobachtet den IR-Signalpin. In der Schleife wird die Lichtstärke langsam erhöht. Bei jedem Mal, wenn der Signalpin aktiv ist, wird ein Zähler erhöht. Wenn ein bestimmter Zählerstand erreicht ist ( z.B. 10 ), wird die Schleife verlassen. Die Anzahl der Schleifendurchläufe ergbt den Messwert.
Vorteil des ganzen: Einzelne Störimpulse führen nicht zu einer Fehlmessung. Um so heller die LED ist, desto wahrscheinlicher, dass der Pin auf High ist.
Was meint Ihr dazu?
oberallgeier
21.01.2010, 13:48
... war etwas unpräzisse ...Bei meinem Einspruch wars mir recht unbehaglich, so etwas klingt manchmal nach I-Tüpfel-Reiterei. Das wollte ich Dir gegenüber keinesfalls - aber der Sir sollte eben auch die andere Seite kennen(lernen).
... neuer Algorithmus zur Auswertung eingefallen, der etwas schneller und weniger störanfällig sein könnte ...Das klingt mir etwas nach der CIRperei von Sternthaler. (https://www.roboternetz.de/phpBB2/zeigebeitrag.php?p=371678&sid=4fec4f8ef18554b1df428df278ae6b2c#371678) Wo ist der Unterschied zu Deinem Ansatz? Im Link ist ein zip vom Sternthaler. Mit dem dort enthaltenen hex kannst Du mit dem asuro die Funktion des Algorithmus prima testen. (Dazu/davor bitte in der test.c den Abschnitt Inhalt lesen).
Vorausgesetzt wird, dass die Empfindlichkeit des 5110 oberhalb 50% duty cycle sich sinngemäss verhält wie unterhalb. Das habe ich durch Messungen verifiziert. Gecirpt wird also mit PW M {0 .. 127}. Ein Messvorgang startet die LE D mit 64. Danach wird mit einer Bitschieberei iteriert, sodass man nach sieben Messungen an der Messgrenze des Sensors angelangt ist. Dieser Wert wird sechs bis zehn mal geholt - sprich: sechs bis zehn Iterationen - und arithmetisch gemittelt. Nach einem solchen Durchgang schalte ich zum nächsten Sensor weiter. Das Timing beim Weiterschalten des PW M-Wertes ist dabei so gewählt, dass der 5110 mehr als die im Datenblatt vorgeschriebenen 6 Pulse (https://www.roboternetz.de/phpBB2/zeigebeitrag.php?p=355675&sid=4fec4f8ef18554b1df428df278ae6b2c#355675) in einem Burst bekommt, sodass sein Antwortsignal einigermassen glaubhaft ist. Der WALL R zeigt, dass die Sensorik auch bei 1,5 m/s und den drei sequentiell abzuarbeitenden Sensoren damit im Bereich von knapp über 1 m Distanz ausreichend (zeitlich und distanzmässig) auflösen kann, um den Überblick nicht zu verlieren (siehe Video). (http://www.youtube.com/watch?v=_TFtP1Xxpzk) Verwendet wurde stets der m168 mit 20 MHz.
Die Sternthaler´sche Cirperei habe ich an meinem Dottie, (https://www.roboternetz.de/phpBB2/viewtopic.php?p=390196&sid=76a99d3f438b33d2c5eda85b731248f1#390196) am MiniD0 (vorgesehen, noch nicht eingebaut) und an meinem WALL R. (https://www.roboternetz.de/phpBB2/viewtopic.php?t=45658&sid=299ed593f50d2a1ab3bae734a0743e09) Immer habe ich drei komplette Sensoren (https://www.roboternetz.de/phpBB2/zeigebeitrag.php?p=371690&sid=4fec4f8ef18554b1df428df278ae6b2c#371690) mit IRLED SFH415 (Ausnahme WALL R: SMD SFH4600) und IREmpfänger SFH5110-36, die umlaufend gecirpt werden. Bei den Dosen sind die Sensoren in Blindenstockmanier (https://www.roboternetz.de/phpBB2/zeigebeitrag.php?p=363793&sid=4fec4f8ef18554b1df428df278ae6b2c#363793) angeordnet, sodass ich sowohl Hindernisse als auch Absturzstellen detektieren kann. Ein Sharp GP2D120 dient zur genaueren Kontrolle - der kontrolliert immer in die Richtung und dann, wo und wann ein Sensor glaubt, etwas erkannt zu haben.
Aber jetzt fehlt mir, wie erwähnt, der Durchblick, wo und wie sich Dein Ansatz vom CIRpen unterscheidet.
Sehr beeindruckend, Dein WALL R. Den kannte ich ja noch gar nicht.
Deiner Erklärung verwendet Sternthaler das "sukzesive Approximationsprinzip" wie es in AD-Wandlern bisweilen verwendet wird.
Das ist natürlich sehr schnell. Für 8 bit bräuchte es 8 Itereationen. Mittelt man über 10 Werte braucht man 80 Werte.
Mein Verfahren funktioniert anderst. Es wird einfach ein Zähler von 0 bis 256 hochgezählt und damit die Helligkeit erhöht. Es ist also langsam, weil 256 Schritte benötigt werden.
Soweit wäre es einfach, jetzt kommt aber noch der Grenzwertzähler dazu: erst bei 10 Highpulsen wird die Schleife gestoppt. Der Effekt ist eine Árt mitlaufende Mitttelung.
Mit 256 Messungen scheint das Verfahren im Nachteil. Ich habe allerdings festgestellt, dass es bei verschiedenen SFH5110 ein bauteilbedingtes "Spikeverhalten" gibt.
Ich bin mir nicht sicher, aber möglicherweise gibt es da Unterschiede im Ergebnis der beiden Verfahren, was das Störverhalten betrifft. Eventuell könnte man die Schrittweite statt auf 1 auf 4 setzen, da der Abstand ohnehin nicht so genau aufgeöst werden kann. Dann wäre das Verfahren mit 64 Messungen auch so schnell.
striker1985
19.02.2010, 14:23
Eine frage die ich habe die asuro lib v2.8 funktioniert der umbau und die hier gezeigten progs auch mit dieser lib???
MfG Striker1985
Sternthaler
22.02.2010, 22:06
Hallo striker1985,
willkommen im Forum.
Ich beziehe mich mal bei deiner Frage auf den Code von mir, den oberallgeier oben unter "CIRperei von Sternthaler" aufgeführt hat.
Der Code läuft mit dem dort vorhandenen Testprogramm vor allem mit der Version 2.8.
(Nur ältere Versionen benötigen eine Anpassung. Sieh dort in test.c)
@robo.fr
Ja, das "WALL R"-Dingsda von oberallgeier ist schon beachtlich.
Zum Thema Entfernungsmessung muss ich jetzt aber bei meinem Code noch hinzufügen, dass auch hier eine Bewertung von gemittelten Messungen vorhanden ist.
Es sind in cir.h 4 Defines angegeben, die das Verhalten steuern.
Hier mal die Kurzbeschreibung:
- CIR_ANZ_IR_PULSE = 6; Minimale Anzahl wegen des IR-Empfängers.
- CIR_ANZ_ITERATION = 6; 6 Bit Auflösung vom Ergebnis. Reicht bis ca. 1,5m
- CIR_ANZ_MESSWERTE = 10; Anzahl Messwerte pro Helligkeitsangabe
- CIR_ANZ_MESSWERTE_OK = 2; Filter für Messfehler
Hier also CIR_ANZ_ITERATION * CIR_ANZ_MESSWERTE Messungen. Nur 60 ;-)
Über CIR_ANZ_MESSWERTE werden bei mir die Messwerte "gemittelt" und mit CIR_ANZ_MESSWERTE_OK eben versucht, einen "guten" Wert zu finden. Der Ansatz ist nicht, dass irgendetwas gerechnet wird, sondern nur die "kein Hindernis erkannt"-Ergebnisse gezählt werden. Ist diese Anzahl kleiner/gleich zum CIR_ANZ_MESSWERTE_OK-Wert, gilt es als Hindernis.
Anders ausgedrückt müssen also (mit diesen Einstellungen) 8 von 10 Messungen ein Hindernis sehen, um es als Hindernis zu betrachten. Das ist meine Variante zum Mitteln.
Als Vorteil gegenüber deiner Variante sehe ich hier vor allem, dass ich dadurch eine konstante Messzeit bekommen. Die Geschwindigkeit könntest du ja auch per sukzessiver Annäherung erreichen. Aber dann geht ja wohl der von dir erhoffte Vorteil in Bezug zum Störverhalten wieder verloren.
Müstest du nicht auch 2 Abbruchkriterien berücksichtigen. Deine 10 Highpulse, und ein weiteres Kriterium, um im Extremfall überhaupt wieder aus der Messschleife raus zu kommen? Oder wirst du abbrechen, wenn die Lichtleistung bei 'volle Pulle' angekommen ist?
Deinen Vorschlag, dass die Schrittweite von 1 auf 4 gesetzt werden könnte, würde ich nicht machen, da du dann ja die Auflösung 'künstlich' reduzierst. Meine Messungen haben mir nahegelegt, dass man da sowieso zu wenig machen kann. Die Auflösung hängt nun mal genau an der Steuerbarkeit der Lichtleistung.
So, genug gelabert.
Viele Grüße
Sternthaler
oberallgeier
23.02.2010, 14:49
Hallo,
... Der Ansatz ist nicht, dass irgendetwas gerechnet wird, sondern nur die "kein Hindernis erkannt"-Ergebnisse gezählt werden ...Meiner Meinung nach ist eine Art Rechnerei doch da - es ist der "Analogrechner" mit den unterschiedlichen duty cycles der LED. Erst durch ihn erhalte ich den wertbehafteten Anhaltspunkt über die erkannte bzw. nicht erkannte Beleuchtungsstärke meiner Umgebung. Diese Werte werden dann gemittelt und als Messergebnis abgegeben - wenn die eingestellte "ja"-Statistik sie für glaubhaft erklärt.
... Über CIR_ANZ_MESSWERTE werden bei mir die Messwerte "gemittelt" und mit CIR_ANZ_MESSWERTE_OK eben versucht, einen "guten" Wert zu finden ...Vermutlich läuft bei anderen Entfernungsmessern eine ähnliche Statistik.
................https://www.roboternetz.de/phpBB2/files/05090004_.jpg
Der Sharp GP2Dxx (hier Messung der Sendediodenspannung durch Manf (https://www.roboternetz.de/phpBB2/viewtopic.php?p=110139&sid=e9271d753a0170e5bd0b3bde194ae367#110139)) misst ja offensichtlich 32 mal mit 1kHz, bevor er im ersten Drittel der Sendelücke seinen Messwert ausgibt. Dass sein Messverfahren mit einem PSD durchgeführt wird, ist da wohl eher Nebensache.
PS: Danke robo.fr und Sternthaler für die freundliche Anerkennung zum WALL R - Dingsbums.
Hallo ins Forum,
ich bin neu hier und habe Eure Beiträge der Umbauten für die Hindernisserkennung verfolgt und hoffentlich auch verstanden. Die Hindernisserkennung auf meinem Asuro funktioniert aber nur mit einer Auflösung im 2-3 cm Bereich und das auch nur bei direkten geraden Reflektion ?
Die Umschaltung der Pulsweite wird mir zwar im Terminal angezeigt, aber hat keinen Einfluss auf den Abstand für die Hindernisserkennung.
Ich benutze das Orginalprogramm aus: .....\examples\IRCollisionTest\test.hex und bekomme nur die 2-3 cm Auflösung.
Bitte kann mir jemand mit diesem Problem helfen ?
WolliK O:)
radbruch
09.05.2010, 16:35
Hallo
Extrem kurze Reichweite hatte ich auch als ich noch die falsche Version der Lib verwendet hatte [Link (https://www.roboternetz.de/phpBB2/zeigebeitrag.php?t=27013)]. Das Update von Waste in asuro.c erkennt man am Setup des Timer2:
//-------- seriell interface programmed in boot routine and already running -------
// prepare 36kHz for IR - Communication
TCCR2 = (1 << WGM20) | (1 << WGM21) | (1 << COM20) | (1 << COM21) | (1 << CS20);
OCR2 = 0x91; // duty cycle for 36kHz
TIMSK |= (1 << TOIE2); // 36kHz counter for sleep
und an der dazugehörigen ISR:
/* uses timer2 (36kHz for IR communication */
SIGNAL (SIG_OVERFLOW2)
{
TCNT2 += 0x25;
count36kHz ++;
if (!count36kHz) timebase ++;
}
Die Änderung ist seit ca. Version 2.3 Bestandteil der Lib:
http://sourceforge.net/projects/asuro/files/
Gruß
mic
Hallo radbruch,
ich habe mir folgende LIB von sourceforge herunter gezogen: V280rc1 von 208-4-1 mit 3,9 MB) und damit selbst compiliert. Aber auch wenn ich wie oben von mir beschrieben die HEX Datei (.....\examples\IRCollisionTest\test.hex) aus dem mit dieser LIB mitglieferten Beispielen verwende ändert sich da nichts, diese HEX wurde doch mit dieser LIB erstellt oder ?
Die Interrupt Subroutiene hab ich gefunden und ist mit dabei, aber beim TIMER2 wird da Folgendes verwendet:
#if defined(__AVR_ATmega168__)
// fast PWM, set OC2A on compare match, clear OC2A at bottom, clk/1
TCCR2A = _BV(WGM20) | _BV(WGM21) | _BV(COM2A0) | _BV(COM2A1);
TCCR2B = _BV(CS20);
// interrupt on timer overflow
TIMSK2 |= _BV(TOIE2);
#else
// fast PWM, set OC2A on compare match, clear OC2A at bottom, clk/1
TCCR2 = _BV(WGM20) | _BV(WGM21) | _BV(COM20) | _BV(COM21) | _BV(CS20);
// interrupt on timer overflow
TIMSK |= _BV(TOIE2);
#endif
// 36kHz carrier/timer
OCR2 = 0x91;
Ich habe keine Ahnung ob das bei dieser LIB mit den _BV Routinen so richtig ist !?!
Wenn die Änderungen seit 23 permanent enthalten sind, müsste das doch auch noch bei der LIB Version 28 funtionieren dachte ich.
Noch eine Idee ?
WolliK O:)
radbruch
09.05.2010, 18:32
Hallo
Ich vermute _BV steht für das | (1<<xxx), also für das Setzen eines Bits. Die selben Steuerbits und auch das OCR2 = 0x91; sowie die identische ISR deuten darauf hin, dass V2.8 den Timer2 richtig parametriert. Ich habe es mit dieser aktuellen version der Lib noch nicht versucht weil ich die Lib nicht verwende.
Kurze Abstände könnten auch auf eine Art IR-Kurzschluss hindeuten. Dabei "kriechen" die IR-Strahlen von der LED an oder unter Bauteilen zum Empfänger. Wie ist denn dein Aufbau?
Gruß
mic
oberallgeier
09.05.2010, 20:02
Hi WolliK,
willkommen im Forum.
... Umbauten für die Hindernisserkennung ... auf meinem Asuro ... nur ...Auflösung im 2-3 cm Bereich ...Also meine Abstandsmessung funktioniert mit nach vorn gerichteter IR-Schnittstelle, siehe (klick) hier für (m)eine (https://www.roboternetz.de/phpBB2/zeigebeitrag.php?p=343494&sid=bca64cd77a5c1b43cd6311176a75ee34#343494) Lösung, die Hardware sieht bei mir so aus:
................http://oberallgeier.ob.funpic.de/asuro-torp.jpg
Nun wirst Du sicher einen eigenen Aufbau haben; WENN die Sensorik bei Deinem asuro nach vorn gerichtet ist (macht ja Sinn *ggg*), dann wird diese hex von Sternthaler (https://www.roboternetz.de/phpBB2/zeigebeitrag.php?p=371678&sid=7ca483e05953b62ce18982973d40affb#371678) funktionieren. Runterscrollen bis zum Download-Fenster wo steht "Da ist das CIR-Zeug mit Test-Programm ...". Dort gibts 1. eine funktionierende Hex-Datei und 2. die dazugehörigen Quellen. In der test.c steht u. a.
* Inhalt
* ------
* Bedienung
* - Den Asuro mit den Tastern zur Wand stellen und einschalten.
* - Er fährt dann ca 1,5 Meter zurueck. In dieser Zeit werden Messwerte
* gesammelt.
* - Asuro zur Datenuebertragung in Sichtweite zum PC-Empfaenger stellen.
* - Taste druecken und loslassen
* - Die Messwerte werden uebertragen.
* Mit einem weiteren Tastendruck kann die Messung wiederholt werden.Und das funzt bestimmt - wenn die Hardware funzt! Diese Abstandsmessung verwendet eine gewisse Iteration der Messungen (ist im Quellcode beschrieben) und läuft bei mir von etwa 5 cm bis rund 1,5 m.
Viel Erfolg
Hallo radbruch,
meine Anordnung sieht wie bei oberallgeier aus, LED nach vorne erichtet.
Mit der mormalen test.hex kann ich über die Status LED zwischen 3-4 cm die Farbe von grün über orange auf rot ändern, indem ich mich mit der Hand dem Asuro nähere. Egal ob ich die LED in einnem LED Fassung oder einem Schrumpfschlauch oder ganz frei betreibe.
Hallo oberallgeier,
ich müsste zuerst die Reichweite erhöhen, bevor ich zwischen 1,5 m und 5 cm messen kann.
Noch eine Idee zu meinem "IR-kurzsichtigen" Asuro ?
Ich versuche jetzt noch mal auch die Rückwand der LED abzuschotten.
WolliK :)
oberallgeier
10.05.2010, 09:59
... ich müsste zuerst die Reichweite erhöhen, bevor ich zwischen 1,5 m und 5 cm messen kann ...Diesen Einwand verstehe ich nicht. Die von mir genannten Messwerte hatte ich an meinem asuro gemessen mit der Standardbeschaltung. WENN Du also Deinen asuro mit den üblichen Vorschaltwiderständen (nach Handbuch bzw. Schaltplan) an L ED SFH415 und Empfänger SFH5110 aufgebaut hast, dann sind Abstände zwischen 5 cm und 1,5 m messbar.
Hallo oberallgeier,
ich hatte die orginal Bestückung und hatte diese 3-4 cm. Danach wollte ich den Vorwiderstand zum IR Sensor von 470 Ohm auf 100 Ohm ändern, hatte aber nur einen 180 Ohm zur Hand, aber auch keine Verbesserung. Heute habe ich einmal ein Oszi drangehängt und sehe nur Nadelspitzen mit 1,5 Volt, wenn ich die Pulsbreite mittels Schalter verändere, sollte sich die Pulsbreite ändern, aber nur so lage einer der Taster gedrückt ist, ist ein symetrischen Rechteck zu sehen ( vermutlich weil wir dann die Werte per SerWrite senden). Nach dem Loslassen des Tasters sind wieder nur die Nadelimpulse zu sehen. Ich muss mir den Code nochmals ansehen, da scheinen die mit den Schalter eingestellten Pulsweiten nicht übernommen zu werden.
Mein Asuro ist erst 3 Wochen alt, evtl. sind nun andere Komponenten als die SFH416 und SFH5100 eingebaut, das kann ich ja nicht überprüfen. Eure Asuros sind laut den Beiträgen ja etwas älter.
WolliK :)
Hallo oberallgeier,
ich habe jetzt einmal den Code aus dem EXAMPLES Ordner für IRKollision leicht verändert und benutze nun:
/************************************************** *****************************
*
* Description: Asuro IR-Detektor Testprogramm
*
************************************************** ***************************/
/************************************************** *************************
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* any later version. *
************************************************** *************************/
#include "asuro.h"
#include <stdlib.h>
static unsigned char newocr2 = 0xFE;
void InitIRDetect(void)
{
UCSRB = 0;
DDRD |= (1 << DDD1); // Port D1 als Ausgang
PORTD &= ~(1 << PD1); // PD1 auf LOW
OCR2 = newocr2;
}
int main(void)
{
unsigned char sw;
Init();
InitIRDetect();
while (1)
{
UCSRB = 0;
OCR2 = 0xFE;
if (PIND & (1 << PD0))
StatusLED(GREEN);
else
StatusLED(RED);
sw = PollSwitch();
if (sw & 0x01)
newocr2 = 0xFE; //Pulsbreite 1
if (sw & 0x02)
newocr2 = 0xFD; //Pulsbreite 2
if (sw & 0x04)
newocr2 = 0xFB; //Pulsbreite 4
if (sw & 0x08)
newocr2 = 0xF7; //Pulsbreite 8
if (sw & 0x10)
newocr2 = 0xEF; //Pulsbreite 16
if (sw & 0x20)
newocr2 = 0x90; //Pulsbreite 110
if (sw)
{
OCR2 = 0x91;
PrintInt(sw);
SerPrint(" ");
PrintInt(newocr2);
SerPrint("\r\n");
OCR2 = newocr2;
}
// Msleep(100);
}
return 0;
}
Aber auch wenn ich nach dem SerPrint wieder die Pulsweite mittels OCR2 auf den neuen Wert, der laut Schalter nun verwendet werden soll, bekomme ich immer nur Nadelimpulst ?!? Ich hab auch schon versucht die Ausgabe an das Terminal auszukommentieren und in den Schalterabfragen direkt OCR2 zu setzen, aber immer nur Nadelimpulse.
Hast Du evtl. dazu noch eine Idee ?
Wolli O:)
radbruch
10.05.2010, 21:41
Hallo
...aber nur so lange einer der Taster gedrückt ist, ist ein symetrischen Rechteck zu sehenEin symetrisches Rechteck sollte man am Oszi nur sehen, wenn Pause:Puls genau 50:50 ist, das ist eben bei OCR2 = 0x91; der Fall. Vielleicht hilft dir das bei der Analyse des Programms.
Bei 36kHz dauert eine Periode 1/36000s. Die Anzahl der Countertakte einer Periode beträgt 8000kHz/36kHz=222. Bei OCR2 = 0x91 beträgt die Dauer einer Halbwelle genau 256-145=111 Countertakte. Bei OCR2=254 (0xFE) ist das Tastverhältniss 221:1 für Pause:Impuls, der Impuls dauert dann 1/36000/222! Wenn dein Oszi auf 36kHz triggert, können die "Peeks" des Impulsanteils schon mal mit 1,5V gemessen werden. Erhöhe mal die Zeitauflösung des Oszi.
Ach, noch eine Anmerkung zum SerPrint(): Die 36kHz mit ihrem Pause-Impulsverhältniss wird im Hintergrund erzeugt und durch das Senden von Zeichen über die serielle Schnittstelle nicht beeinflußt.
Noch ein schnelle Blick aufs Programm:
{
UCSRB = 0;
OCR2 = 0xFE;
damit überschreibst du OCR2 = newocr2; !
Gruß
mic
Hallo radbruch,
ich habe gerade festgestellt, das bei jedem neuen Durchgang der while schleife OCR2 wieder auf 0xFE gesetzt wird, das macht doch keinen Sinn oder ?
Wenn Daten per SerPrint auf die Reise geschickt werden wird doch OCR2 auf 0x91 gestellt, damit ist doch mein mittels Schalter eingestellte Pulsdauer auf 50/50 und ich muss nach dem Senden wieder auf meine Pulsweite gehen ist doch die gleiche IR LED oder ?
Wolli :)
radbruch
10.05.2010, 21:56
Hallo
Bin ich zu schnell oder zu langsam? *kopfkratz*
Wie oben schon als Edit eingefügt, das
{
UCSRB = 0;
OCR2 = 0xFE;
am Anfang der Endlosschleife überschreibt den OCR2-Wert von OCR2 = newocr2; Ich denke, das war letzlich auch dein Problem:)
Gruß
mic
Hallo radbruch,
ich habs gefunden, das Beispiel setzt die Pulsweite am Schleifenanfang immer wieder auf 0xFE (meine Nadelpulse) wodurch auch nach einem Schalterwechsel keine neue Pulsweite sichtbar ist.
D A N K E an alle ich habe jetzt auch eine Abstandsdetection wie ich es brauche.
WolliK :) :) :)
P.S. Am Besten selbst die grauen Zellen benutzen wenn die Codebeispiele nicht das machen was sie versprechen.
radbruch
10.05.2010, 22:21
Hallo
Na dann, Glückwunsch und viel Spaß damit. Die IR-Abstandsmessung ist für den asuro deutlich schonender als die Kollisionserkennung mit den Tastern.
Das hätten wir wohl auch einfacher haben können. Eine Schilderung des Problems zusammen mit dem Programm hätte uns die Raterei erspart. Aber egal, Hauptsache es läuft :)
Gruß
mic
@ Waste
gibt es eine moeglichkeit die IR-Erkennung auf einen "Yeti" zu transferierern ?
Mir erscheint das eleganter als mit Ultraschall. Zumal schon alle Bauelemente vorhanden sind.
Gib/gebt mal nen Nwecomer einen Tip...
Gruss Asko
radbruch
12.12.2011, 22:47
Hallo
Der yeti kann das auch. Der Schaltplan im Bereich der IR-Bauteile ist nahezu identisch (yeti mit R4 sogar besser ;) StatusLEDs sind ebenfalls identisch. Du brauchst nur das Timer2-Setup aus der Funktion Init() des asuro in die Initfunktion deiner yeti-Library kopieren:
//-------- seriell interface programmed in boot routine and already running -------
// prepare 36kHz for IR - Communication
TCCR2 = (1 << WGM20) | (1 << WGM21) | (1 << COM20) | (1 << COM21) | (1 << CS20);
OCR2 = 0x91; // duty cycle for 36kHz
TIMSK |= (1 << TOIE2); // 36kHz counter for sleep
(Initialisiung Timer2 nach Waste: https://www.roboternetz.de/community/attachment.php?attachmentid=3132)
Leider kenne ich die yeti-Library nicht und weiß deshalb nicht, ob er Timer beim yeti schon mit 36kHz läuft. Kann man die yeti-Library irgendwo runterladen? Dann könnte ich die Änderungen reinfummeln...
Gruß
mic
Hall radbruch
Sei mir nicht boese, wenn ich jetzt nicht weiss, welche Library Du meinst ..(yeti.c, yeti.h......?????)
Der timer muesste von Hause aus mit 36kHz laufen, denn wie sollte ich sonst eine IR-Kommunikation mit ersatzProzessor ohne Bootloader hinbekommen.
Ich dachte auch, das Teile des Bootloaders genutzt werden, aber es geht ja auch ohne.
Also muss die ganze Routine nach dem Bootloader neu aufgebaut werden. (schade um den Speicherplatz)
Ich werde mal weiter beide Treads verfolgen, vielleicht werde ich ja schlauer...;)
Hoffentlich komm ich nicht wieder vom Wege ab, sprich komme vom hundertsten ins tausende.
Gruss Asko.
radbruch
13.12.2011, 00:13
Hallo
yeti.h und yeti.c sind die yeti-Library, entsprechend asuro.h und asuro.c für den asuro.
36 oder 72kHz? Die IR-Led wird immer mit 36kHz angesteuert. Bei der alten asuro-Lib wurde dazu der Timer mit 72kHz betrieben, nach jedem Timerdurchlauf wurde die Led umgeschaltet. Die Änderung von Waste war der Umstieg auf den PWM-Mode des Timers. Dadurch wurde ein zweimaliges Umschalten der IR-Led innerhalb nur eines Timerdurchlaufs möglich. Der Timer läuft deshalb nur mit 36kHz und ich vermute, weil ich die yeti-Lib nicht kenne, dieses neue Timersetup wird auch beim Yeti verwendet. Der Unterschied im Timertakt macht sich nur bemerkbar, wenn man die Sleep()-Funktionen des asuro verwendet.
Also muss die ganze Routine nach dem Bootloader neu aufgebaut werden.Nicht wirklich. Das Setup für Timer2 und USART erledigt der Bootloader und bräuchte deshalb nicht nochmals durch das Programm gesetzt werden.
Gruß
mic
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.