PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Minimallösung: IR-Abstandsmessung



radbruch
21.01.2007, 20:21
Hallo

Die aktuellen Threads zur Abstandsmessung mit der IR-Funktion (nach vorne (https://www.roboternetz.de/phpBB2/viewtopic.php?t=11114) oder oben (https://www.roboternetz.de/phpBB2/viewtopic.php?t=26809)) sind ja recht inspirierend, hier mein minimaler Umbau:

http://img252.imageshack.us/img252/2356/dsc030306wa.th.jpg (http://img252.imageshack.us/img252/2356/dsc030306wa.jpg) http://img266.imageshack.us/img266/3328/dsc030312gk.th.jpg (http://img266.imageshack.us/img266/3328/dsc030312gk.jpg) http://img299.imageshack.us/img299/8346/dsc030329wd.th.jpg (http://img299.imageshack.us/img299/8346/dsc030329wd.jpg) http://img46.imageshack.us/img46/3690/dsc030334jo.th.jpg (http://img46.imageshack.us/img46/3690/dsc030334jo.jpg)

Ein Stück Alu-Folie auf einer Seite dreimal gefaltet und auf den Kondensator geklebt (blanke Seite unten!). Der "Reflektor" sollte über die IR-Sendediode hinausragen und ca. 45 Grad haben. Ein Stück Schrupfschlauch auf der IR-Sendediode verhindert Streulicht. (Runde Klebebandpads fertige ich mit einem Locher)

Hier der Testcode dazu:


#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;

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 Code basiert auf dem Democode von Waste aus oben erwähnten Betrag. Der Wert für die Modulation der IR-Diode ist etwas fummelig. Wenn alles klappt sieht das dann so aus:

http://img166.imageshack.us/img166/9888/ir15fw.gif
(Meine "Arena" ist ein zum Kreis gebundener Kabelkanaldeckel)

Video1(avi 0,6MB) (http://radbruch.roboterbastler.de/asuro/ir-umbau/imkreis1.AVI)
Video2(avi 1,6MB) (http://radbruch.roboterbastler.de/asuro/ir-umbau/imkreis2.AVI)

Flashen muss dann man natürlich von vorne. Viel Spass beim Nachbau.

Gruß

mic

[Edit] Videos neu verlinkt

damaltor
21.01.2007, 20:29
unglaublich einfach und genial. du bist hiermit mein erklärter held =)

stochri
21.01.2007, 20:57
Radbruch,

Gratulation ! Man kann immer noch eins draufsetzen. Ich hätte gedacht, das Thema Abstandsmessung wäre von waste schon perfekt erledigt worden. Aber Lösungen, bei denen der ASURO kompatibel bleibt, sind immer besser.

Gruss,
stochri

radbruch
21.01.2007, 21:36
Danke, danke,

ein "Held" will ich ja nicht sein, aber ein Lob von stochri ist fast schon wie ein Ritterschlag *grins*

gtacelt
21.01.2007, 22:27
Damit ich das richtig verstehe... (xD)
Arbeitschritte:
1.Schrumpfschlauch an die LED anbringen
2. Alufolie auf den Kondensator kleben (möglichst gefalten ->dicker, das es beim Fahrtwind nicht den Winkel ändert?)
3.Fertig?

Also "blinkt die Diode gegen die Alufolie, wird im 45°Winkel gespiegelt und "leuchtet" sozusagen nach vorne.
Falls eine Reflektion von vorne kommt, wird so über das Alu umgeleitet und komm zum IR-Empfänger?
Richtig so? (die Bilder sind unscharf, ich erkenn das ned so richtig, außerdem will ich mir sicher sein, bevor ich was umbau ^^')

radbruch
21.01.2007, 22:38
Ja, genau richtig so.

Der Schrumpfschlauch steckt nur auf der LED, es geht natürlich auch alles andere was das Streulicht abschirmt.

Die Faltung der Alufolie (nur am Rand der unteren Seite wo sie angeklebt ist) dient der Stabilität. Der "Reflektor sollte über der Diode und dem Transistor sein.

Das ist quasi der Prototyp, vielleicht kann man mit einer Krümmung der Folie noch was verbessern...

Ich raffe es einfach nicht mit meiner Cybershot scharfe Bilder zu machen *heul*

waste
21.01.2007, 23:32
Hallo radbruch!

Nicht schlecht! Eine gute Lösung für die, die den radikalen Umbau scheuen.
So in etwa sah auch mein erster Versuch aus. Allerdings habe ich es nicht geschafft, die Diode so abzuschirmen, dass es nicht doch noch ein Übersprechen gab. Gibt es bei dir kein Übersprechen bei voller Leistung (Pulsbreite 110)?

Gruß Waste

radbruch
21.01.2007, 23:46
Mehr als Pulsbreite 3 (0xFC) kann meine Lösung im Moment noch nicht. *rotwerd*

Es ist eher eine Lösung für Minimalisten die ohne großen Aufwand mit dem Standart-asuro die IR-Funktion testen wollen.

Vermutlich wird aber eh jeder Zweit-asuro grundsätzlich deinen IR-Umbau vorne drauf haben *hutzieh*

Asuro-n00b
22.01.2007, 08:41
Radbruch du bist echt genial und du natürlich auch waste!
Es funktionierte bei mir auch gleich auf Anhieb.

Ich wollte hier nochmal alle warnen. Passt auf, wenn ihr die Alufolie am Kondensator anbringt. Ich habe dabei auch einen Kurzen gebaut, sodass mein Asuro nix mehr gemacht hat, als zu flackern. Zum Glück war nach nem Neustart wieder alles OK.

Asuro-n00b
22.01.2007, 10:37
Hab nochmal scharfe Bilder aufgenommen:
http://home.pages.at/sandmann_daten/ir%20asuro1.jpghttp://home.pages.at/sandmann_daten/ir%20asuro2.jpg
http://home.pages.at/sandmann_daten/ir%20asuro3.jpg

Kann den Umbau von Radbruch nur empfehlen. Es ist ganz leicht. :-b
Aber ich werde bald ma in der Firma ein paar kleine Bleche biegen und so wie waste es vorgeschlagen hat zusammenbauen.

Ich bin immer noch ganz begeistert von der IR-Hinderniserkennung. =D>
Das erspart einem den Umbau auf Ultraschallsensor, wo man sogar noch auf die Linienverfolgung verzichten müsste.
http://www.youtube.com/watch?v=t6H29o5uVdg

radbruch
22.01.2007, 16:52
Irgendwie klappt das mit dem fotografieren nicht so recht:

http://img166.imageshack.us/img166/3743/dsc030399qm.th.jpg (http://img166.imageshack.us/img166/3743/dsc030399qm.jpg) http://img267.imageshack.us/img267/5092/dsc030400gy.th.jpg (http://img267.imageshack.us/img267/5092/dsc030400gy.jpg) http://img95.imageshack.us/img95/2613/dsc030417ys.th.jpg (http://img95.imageshack.us/img95/2613/dsc030417ys.jpg)

duc750
24.01.2007, 19:45
Hallo radbruch und alle anderen,
vielen Dank für die gute Idee. Ich wollte das sofort nachbauen, hatte aber irgendwie kein Klebeband da. Dafür habe ich festgestellt, dass die Masse aus einem fast eingetrockneten Klebe- (Pritt-) stift sich für sowas bestens eignet, wasserlöslich ist es auch noch. Schrumpfschlauch hatte ich auch keinen passenden, ein Stück Pappe (asuro-noob) tuts auch.
Alles lief auf Anhieb, bißchen Folie biegen - fertig! Die Reichweite ließe sich wohl nur über die Qualität des Reflektors beeinflussen?
Grüße,
duc750

Asuro-n00b
24.01.2007, 20:40
nicht nur über die qualität, eigentlich doch eher über den Winkel.
Oder irre ich mich da?

DanielSun
24.01.2007, 21:53
Respekt,

He, na das ist doch mal ne einfache Lösung. Hätte nicht gedacht das sowas einfaches funktioniert. Aber manchmal sind halt die einfachsten Lösungen auch die genialsten.

Werd es bei Gelegenheit mal an meinem Asuro ausprobieren.


DanielSun

radbruch
09.02.2007, 21:53
Hallo

Hier meine neuste Variante des Themas: Der Dickmann (http://www.dickmann.de/content/03_dicke_marken/02_mini-dickmanns.html)-Reflektor:

https://www.roboternetz.de/phpBB2/album_thumbnail.php?pic_id=1236 (https://www.roboternetz.de/phpBB2/album_pic.php?pic_id=1236) https://www.roboternetz.de/phpBB2/album_thumbnail.php?pic_id=1237 (https://www.roboternetz.de/phpBB2/album_pic.php?pic_id=1237) https://www.roboternetz.de/phpBB2/album_thumbnail.php?pic_id=1238 (https://www.roboternetz.de/phpBB2/album_pic.php?pic_id=1238) https://www.roboternetz.de/phpBB2/album_thumbnail.php?pic_id=1239 (https://www.roboternetz.de/phpBB2/album_pic.php?pic_id=1239)
(Weltraumtauglich, weil goldbeschichtet)

http://radbruch.roboterbastler.de/asuro/ir-umbau/dickmann-verfolgung1.gif (http://radbruch.roboterbastler.de/asuro/ir-umbau/dickmann-verfolgung1.avi)
Video2 (http://radbruch.roboterbastler.de/asuro/ir-umbau/dickmann-verfolgung2.avi)

Gruß

mic

[Edit] Videos und Bilder neu verlinkt

damaltor
09.02.2007, 22:08
coole sache, jetzt ist es nur noch ne frage der zeit wann die ersten asuros auf dem mond landen... gute sache, allerdings könnte es sein dass die doch recht große fläche vom "fahrtwind" so weit nach oben verdreht wird, dass der asuro nix mehr merkt?

radbruch
09.02.2007, 22:20
Ne, das ist sehr stabil. Der Karton ist übrigens am Kabelbinder des Motors festgemacht. Der "Rüssel" ist das Lichtleiterbündel aus meinem case-modding-Thread (https://www.roboternetz.de/phpBB2/viewtopic.php?p=252931). Pics folgen noch.

radbruch
15.02.2007, 13:28
Gar nicht so einfach, hier mal ein Zwischenstand:

http://img.youtube.com/vi/R-OMxzgNP6A/1.jpg (http://youtube.com/watch?v=R-OMxzgNP6A) http://img.youtube.com/vi/MlDhomglzmE/1.jpg (http://youtube.com/watch?v=x_cKoZtdHD4) http://img.youtube.com/vi/x_cKoZtdHD4/2.jpg (http://youtube.com/watch?v=MlDhomglzmE)
(Der asuro versucht mit IR-Abstandsmessung einem Blatt Papier zu folgen.)

Gruß

mic

URL der Vorschaupics aktuallisiert

Hans Z
15.02.2007, 14:32
Ganz schön sensibel Deine Regelung - macht den Asuro richtig wild.

Grüße, Hans

raid_ox
15.02.2007, 15:17
Hehehe, verfolgung nur mit einem ir-sensor?Er muss leider immer 360° rotation machen. Aber Cool!

lass mal dein asuro mit meinem duellieren (spaß ^^)
http://www.youtube.com/watch?v=DVgYreCle4M

damaltor
15.02.2007, 15:24
Ganz schön sensibel Deine Regelung - macht den Asuro richtig wild.

Grüße, Hans

Jetzt muss man ihm eigentlich nur noch das bellen beibringen... =)

radbruch
15.02.2007, 16:04
Das Filmchen hat mich dazu inspiriert es mit nur einem Sensor zu versuchen. Die Drehungen entstehen, weil ich mit geringer Tasteweite teste und mein asuro dann gelegentlich das Blatt nicht sieht und eine (oder mehrere) Ehrenrunden dreht.

Die zwei Hauptprobleme im Moment sind:

Große Steuung durch den Reflektor. Dadurch ist es schwierig die Kante genau zu erkennen. Mit dem Lichtleiter aus dem modding-Thread war die Bündelung des Lichts besser, deshalb werde ich wohl noch eine Version nur für die Sendediode basteln. (Habe noch fast nen Meter von dem Plexiglasprofil)

Viele Ausreiser in der IR-Messung. Obwohl ich die Messung dämpfe, werden doch manche Ausreiser noch nachgeregelt. Das lässt das Ganze recht hektisch aussehen. Auf den Videos fährt er mit MotorSpeed(150,150);.

robo.fr
14.12.2007, 18:18
Gerade eben habe ich das Video von raid_ox zum angeschaut. Besteht die Sensorik aus 2 oder einem Sensor?
http://www.youtube.com/watch?v=DVgYreCle4M

Jackie
15.12.2007, 10:50
So wie ich das verstehe könnte man sich also auch das Biegen eines Bleches/Stück Alufolie sparen und IR LED und Empfänger auslöten, sie auf die Experimentierplatine löten und mit Kabeln zusätzlich an ihrem alten Standpunkt verbinden. So kann man sie gleich richtig ausrichten und hat dennoch die Verbindung zum original Kontakt auf der Hauptplatine. ?!

Also so: http://www.stamm-wilbrandt.de/videos/070108_181333.jpg

radbruch
15.12.2007, 11:06
Hallo

Ja, das verstehst du richtig, aber eigentlich sollte es andersherum formuliert sein:

"Man kann sich das Auslöten der Bauteile ersparen und dafür ein Stück Alufolie auf den Kondensator kleben"

Die ursprüngliche Version der Abstandsmessung von Waste findet man hier:

https://www.roboternetz.de/phpBB2/viewtopic.php?t=11114

Gruß

mic

decti
12.04.2008, 22:50
bei mir funktioniert es nicht ... :(

hab dieses Code benutzt:

#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;
}

habs auch nicht richtig verstanden..

DDRD |= (1 << DDD1); // Port D1 als Ausgang
PORTD &= ~(1 << PD1); // PD1 auf LOW
OCR2 = 0xEF;

?? ..

auch wenn ich den reflektor so aufsetze dass es direkt auf dem empfänger reflektiert scheint es nicht zu erkennen...

hat jemand eine ahnung wie/was ich machen müsste um es zum laufen zu bringen.. ? ;)

decti
12.04.2008, 22:58
edit: jetzt habe ich mit meiner handy kamera geschaut ob der obere IR leuchtet... ist aber nicht der fall... kann es sein das im Code (auch der von radbruch geht nicht) was falsch ist ?

radbruch
13.04.2008, 00:28
Hallo

Das sollte so funktionieren, es ist genau das was Waste in seinem Thread gemacht hat. Es muss aber auch eine asuro-Lib mit der IR-Erweiterung verwendet werden!

Gruß

mic

damaltor
14.04.2008, 17:52
funktionniert denn das flashen noch? wenn dabei die led leuchtet, liegts schonmal nicht daran...

decti
14.04.2008, 18:08
ja.. das flashen funktioniert einwandfrei...
die erweiterte asuro-lib habe ich auch verwendet..

hmm.. keine andere ideen wo das problem liegen könnte ?

radbruch
14.04.2008, 19:09
Das Programm oben funktioniert mit meinem asuro. Schaltabstand ca. 30cm nach oben (ohne Umbau, lediglich mit Lichtschutz unter/neben dem IR-Empfänger und der Diode).

deeppurple
24.10.2008, 12:29
Hallo, ich habe das programm übernommen und den kleinen umbau durchgeführt. Doch leider passiert leider nicht mehr als stumpfes geradeaus fahren.

er erkennt zwar wenn von einem transceiver oder ähnlichem ein signal gesendet wird und reagiert entsprechend (zurücksetzen und co. )
aber die sache mit dem reflektieren scheint keinen effekt zu bringen.
habe mehrere asuros ohne weitere modifikationen getestet und überall das gleiche ergebnis :\

ich habe irgendwie die vermutung das nicht wirklich ein signal gesendet wird welches reflektiert werden sollte

hat jemand eine ahnung woran das liegen kann, weiß jemand rat?
wäre nett, danke schonmal :>

oberallgeier
25.10.2008, 08:57
Erster Test ist immer mit einer digitalen Kamera (Foto oder Handy) - dort erkennst Du am Display an einen violetten Schimmer, ob die irLED überhaupt sendet.

pinsel120866
25.10.2008, 15:56
Vermutlich hast du Anode und Kathode der IR-Diode vertauscht, ist mir auch schon passiert...

:-)

ScWeiNePaPSt.xD
29.12.2008, 15:50
ich hab gerade keinen schrumpfschauch zur hand.
Was kann icch sonst noch nehmen?

radbruch
29.12.2008, 16:55
Hallo

Ein dunkler Drinkhalm oder eine kleine Papierrolle funktionieren auch. Das Licht der IR-LED sollte möglichst nur nach oben abgestrahlt werden.

Achtung! Unbedingt eine Abschirmung zwischen IR-LED und IR-Empfänger bis unter den Empfänger anbringen. Ohne Abschirmung "kriechen" die IR-Lichtstrahlen über die Platine zum Empfänger.

Viel Spaß mit dem Nachbau.

mic

ScWeiNePaPSt.xD
31.12.2008, 11:59
hab es gestern noch nich hingebracht
mach im nächsten jahr weiter
:D

malediction
15.01.2009, 20:20
radbruch... du bist mein held... \:D/

ich hatte schon vor die ir-teile auszulöten und waste's umbau zu machen. mir war aber immer ein wenig mulmig dabei.
aber DIESE lösung!!!! GEIL!

ich habs auch schnell gemacht. ist ne sache von 3 minuten und es ist so cool!!!

hab das ganze noch etwas verändert, indem ich einen metallstreifen von einem heftstreifen genommen hab, diesen an den motor-kabelbindern befestigt hab und dann eine pappscheibe mit aufgeklebter alufolie angebracht hab. so ist das ganze noch etwas stabiler.

falls mir bald zufällig mal unser badspiegel runterfällt (auweia... 7 jahr pech, aber das ist es wert :D), nehm ich ein stück spiegelsplitter um die reflektion zu verbessern ;)

sind noch nen paar fotos dabei...

grüße, malediction

malediction
15.01.2009, 20:52
ich bin jetzt am experimentieren.

ehrlich gesagt blicke ich aber noch nicht so ganz durch das programm durch.
könnte mir mal bitte jemand erläutern, was diese stelle hier im einzelnen macht:


DDRD |= (1 << DDD1); // Port D1 als Ausgang
PORTD &= ~(1 << PD1); // PD1 auf LOW
OCR2 = 0xFC;

und was liefert mir dieser befehl?

ir=PIND & (1 << PD0);

wär mal nett, das zu wissen, damit ich nicht einfach nur try and error-programmiere, sonder das ganze auch durchblicke ;)

malediction
15.01.2009, 21:09
mal was ganz anderes, radbruch:

dein fertiges hex-file ist ein anderes programm, als das was du als code mit gepostet hast, oder?!
jedenfalls fährt mein asuro einfach nur ohne auszuweichen, wenn ich dein programm compiliere (hab die 2,8rc1 lib).

kannst du mal bitte das programm posten, mit dem ich auf die ir-signale reagieren kann?!

wäre super von dir...
thx

radbruch
15.01.2009, 22:29
Hallo


dein fertiges hex-file ist ein anderes programm...
Jain, das selbe Programm ist es eigentlich schon, aber mit der falschen Lib kompiliert. Das steht glaube ich irgendwo weiter unten...

DDRD |= (1 << DDD1); // Port D1 als Ausgang
PORTD &= ~(1 << PD1); // PD1 auf LOW

Setzt den TXD-Pin des Mega8 auf Ausgangsfunktion und gibt ein Low aus. An diesem Pin ist die Kathode IR-LED angeschlossen die deshalb nur leuchten kann, wenn dieser Pin Low ist.

OCR2 = 0xFC;

Das ist der eigentliche Trick der Sache. Die Anode der IR-LED ist (über R16) am OC2-Pin angeschlossen, das ist der Ausgangspin von Timer2. Hier wird nun ein (ich glaube 36kHz-)Signal mit variablem Puls-Pauseverhältniss erzeugt. Je größer dabei der Pulsanteil ist, desto empfindlicher wird die Abstandsmessung, 0xff ist unempfindlich wenn ich mich recht erinnere. Das alles funktioniert aber nur richtig, wenn man die von waste angepasste Lib (anderer PWM-Mode und Ausgangstogglen) verwendet. Das funktionierte bei mir zu Anfang nicht, deshalb funzt das Hex nicht.

ir=PIND & (1 << PD0);

Fragt den IR-Empfänger ab und speichert 1 oder 0 in ir. Dazu muß man aber wissen, dass der Empfänger das Signal invertiert! Wenn er kein 36kHz-Signal erkennt ist sein Ausgang high, deshalb prüft if(ir) ob die Bahn frei ist (kein IR-Echo erkannt) und if(!ir) prüft auf ein Hinderniss (Echo erkannt).

Gruß

mic

oberallgeier
15.01.2009, 22:47
Hi,

bei dieser Messung muss man noch beachten, dass nach Einstellen der neuen Puls-Pausen-Zeit der SFH5110 vier (bei älteren Sensoren sechs) Pulse braucht, bis sein Signal gültig ist. Das steht bei dem auch in der Doku:

.................https://www.roboternetz.de/phpBB2/files/ir-puls-signal.jpg

Die ganze Geschichte habe ich hier ziemlich ausgebreitet. (https://www.roboternetz.de/phpBB2/viewtopic.php?t=38009)

malediction
16.01.2009, 07:46
ok danke erst mal.
ich werd mich erst mal mit waste's thread auseinandersetzen. vllt kapier ich dann ja mehr ;)

malediction
16.01.2009, 09:00
ich hab das ganze jetzt noch mal überdacht.

ich verwende ja die lib 2.8rc1. da ist ja schon der ir-detektor eingebunden.
nun erst mal ne frage: sind da schon die veränderungen von waste dabei?
wenn nicht, wie kann ich die einbauen, sodass ich die aktuelle lib nutzen kann und trotzdem der ir-detektor richtig funzt?

nun ist ja bei der lib auch ein ir-testprogramm dabei.
dieses hier


/************************************************** *****************************
*
* 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 ocr2 = 0x91;

void InitIRDetect(void)
{
UCSRB = 0;
DDRD |= (1 << DDD1); // Port D1 als Ausgang
PORTD &= ~(1 << PD1); // PD1 auf LOW
OCR2 = ocr2;
}

void InitUart(void)
{
OCR2 = 0x91; // duty cycle fuer 36kHz
}

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;
}


das hab ich mal auf meinen asuro geflasht und getstet. man kann dort mit den tastern ja die pulsweite einstellen.
zuerst dachte ich, es würde gar nichts gehn, weil die status led immer grün war.
das einstellen der pulsweite ging. das konnte ich ja mithilfe meines transceivers feststellen, da asuro je nach tastendruck mir ja die pulsweite gesendet hat.
dass asuro was gesendet hat, hab ich auch mithilfe des transceivers feststellen können.
jedoch konnte ich machen was ich wollte, die status led blieb grün.

dann bin ich (mehr oder weniger durch zufall) ganz dich an meinen 45°-spiegel gekommen und siehe da: led rot!!!
also funktioniert es, es ist jedoch nicht empfindlich genug eingestellt.

das sollte man ja ansich mit den tastern machen können, aber ich hab - egal welche pulsweite ich verwendete - keine oder nur minimale veränderungen gemerkt. problem dabei: die objekterkennung erfolgt erst HINTER der platinenkante, also zu spät.

kann ich das mithilfe der OCR2-werte noch weiter tunen oder muss ich da noch was anderes beachten (wie z.b. die einstellugnen von waste, mit denen ich noch nicht so ganz klar komme)?!

wär toll, wenn mir wer helfen könnte. danke! ;)

malediction
20.01.2009, 20:24
*thread nach oben schieb in der hoffnung eine antwort zu erhalten...*

radbruch
20.01.2009, 21:16
Hallo

Ich verwende die 2.8er Lib nicht, deshalb kann ich dir nicht viel zum Zusammenspiel mit der IR-Erweiterung sagen. Allerdings scheint mir dein Beispielprogramm die etwas erweitete Demo von Waste zu sein, ich sehe keinen Hinweis auf eine Unterstützung durch die Lib.

Wichtig ist die Initialisierung des Timers in der Lib, bei der von Waste modifizierten Version sieht die entsprechende Stelle in asuro.c so aus:

TCCR2 = (1 << WGM20) | (1 << WGM21) | (1 << COM20) | (1 << COM21) | (1 << CS20);
In der Funktion Init()

Laut Datenblatt (Seite 177ff) ist das "Fast PWM" (WGM20+21) mit "Set OC2 on Compare Match, clear OC2 at BOTTOM, (inverting mode)" (COM20+21). Prescaler ist 1 (CS20) (Wie man dann auf 36kHz kommt ist mir grad auch nicht klar ;)

Diese Initialisierung sollte bei der 2.8er Lib gleich sein sonst funzt die IR-Abstandsmessung nicht.

Du kannst auch noch mit dem OCR2-Wert rumspielen, mein asuro fuhr mit 0x50 ziemlich optimal. Das hängt aber auch vom Reflektor und dem Gesamtaufbau ab.

Gruß

mic

malediction
21.01.2009, 08:30
hallo radbruch.

danke für deine antwort.

in meiner asuro.c-datei aus der 2.8er lib habe ich nur folgende 2 stellen gefunden:


#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;

für mich ja ansich uninteressant, weil ich den standard prozessor verwende und es hier um den atmega168 geht, oder?!

und dann dieses hier:


/*
PWM-Kanaele OC1A und OC1B auf 8-Bit einstellen.
Sie werden fuer die Geschwindigkeitsvorgaben der Motoren benutzt.
*/
TCCR1A = _BV(WGM10) | _BV(COM1A1) | _BV(COM1B1);
TCCR1B = _BV(CS11); // tmr1-Timer mit MCU-Takt/8 betreiben.

ich komme mit den ganzen operatoren in c noch nicht zu 100% klar, daher kann ich die oben genannte stelle schlecht interpretieren. dass diese jedoch nicht mit der von dir genannten übereinstimmt, ist eindeutig.

meinst du ich kann das einfach dazu schreiben?

mit der OCR2- Werten habe ich auch experimentiert. So habe ich auf die 6 Taster immer verschiedene Werte gelegt. Dabei habe ich die hex-werte von FF bis 00 laufen lassen und dabei von schlter zu schalter immer 33 abgezogen, sodass ich auf tasterbelegungen von FF, CC, 99, 66, 33, 00 kam. damit ist ja das ganze spektrum erst mal grob abgedeckt. es hat jedoch leider zu keiner veränderung geführt. :(

mit deinem fertigen programm vom anfang des thread geht es. nur ist mir nicht ganz wohl gänzlich auf wastes lib umzusteigen, weil ich mich gerade an die 2.8 gewöhnt habe.

vielleicht liegt es wirklich nur an der initialisierung. nur wundert mich das, weil man ja ansich mit der lib schon der ir-support bekommt. komisch, dass es dann nicht so funktioniert, wie gedacht.

grüße, malediction.

malediction
24.01.2009, 11:10
sooooooo...

da ich mal wieder keine antwort bekomme... :D ...hab ich mir selbst geholfen.

für alle, die wie ich die 2.8er lib benutzen und die ir-minimallösung "installiert" haben sei hier gesagt, dass ich mit dem "mitgelieferten" testprogramm zur ir-kollision große probleme hatte. es funktionierte zwar, jedoch war die pulsbreite so eingestellt, dass der sensor hindernisse nur ca. 5mm vor dem spiegel erkannt hat (und damit erst HINTER der platinenkante)!
die einstellung der pulsbreite mittels taster funktionierte bei mir in dem IRcollision-programm auch nicht.
ich hab das ganze mal auseinandergenommen und herausgefunden, dass das testprogramm funktioniert (jedenfalls bei mir), wenn man es so umschreibt:


/************************************************** *****************************
*
* 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>

int main(void)
{
unsigned char sw;

Init();

DDRD |= (1 << DDD1); // Port D1 als Ausgang
PORTD &= ~(1 << PD1); // PD1 auf LOW

UCSRB = 0;
OCR2 = 0xFE; //Anfangswert (entspricht Pulsbreite 1)

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;
}

hier muss man auch nichts mehr an der lib ändern. damit geht bei mir alles problemlos und man kann deutlich sehen, welche pulsbreite man einstellen muss für welche enfernung.

vielleicht könnte mal jemand, der auch die 2.8er lib hat das ganze testen, indem er zuerst das original programm zur IR-Kollision flasht und ausprobiert, und danach das o.g.. dann könnte man mal feststellen, ob es an mir liegt oder ob es ein allgemeiner fehler ist.

thx, malediction...

radbruch
24.01.2009, 13:50
sooooooo...
da ich mal wieder keine antwort bekomme... ...hab ich mir selbst geholfen.
Prima, so sollte es sein. Selber Nachdenken führt gelegentlich auch zum Ziel.

Deine vorige Programmversion mit Ausgabe der Tasten- und OCR2-Werte stolperte über den Mix aus IR-Abstandsmessung und IR-Kommunikation mit dem Terminal. So funktioniert es bei meinem asuro mit alter Lib:

/************************************************** *****************************
*
* 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 ocr2 = 0xFE;

void InitIRDetect(void)
{
DDRD |= (1 << DDD1); // Port D1 als Ausgang
PORTD &= ~(1 << PD1); // PD1 auf LOW
UCSRB = 0;
OCR2 = ocr2;
}

void InitUart(void)
{
OCR2 = 0x91; // duty cycle fuer 36kHz
}

int main(void)
{
unsigned char sw;

Init();
InitIRDetect();
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

if (sw)
{
OCR2 = 0x91;
PrintInt(sw);
SerWrite("-", 1);
PrintInt(ocr2);
SerWrite("\n\r", 2);
UCSRB = 0;
OCR2=ocr2;
}
Msleep(100);
}
return 0;
}
Das sollte auch mit der 2.8er Lib funktionieren weil sie den Timer richtig parametriert.

Gruß

mic

malediction
24.01.2009, 13:59
Prima, so sollte es sein. Selber Nachdenken führt gelegentlich auch zum Ziel.

ansich denk ich immer zuerst nach. nur ist das bei c so eine sache, da ich gerade erst dabei bin, mich reinzufuchsen ;)

was mich eben wunderte ist, dass das o.g. programm schon bei der lib dabei ist, allem anschein nach aber nicht ohne weiteres funktioniert. ich hab es dann so gemacht, dass ich für mich unlogisch erscheinende dinge (wie z.b. auch diese ausgabe in dem programm) schritt für schritt auskommentiert habe, sodass es am ende funktioniert hat und ich wusste woran es liegt.

danke aber trotzdem für die tipps.

Sir William
14.01.2010, 18:44
Ich hab mal ein paar Fragen (nicht nur an Radbruch):


DDRD |= (1 << DDD1); --> wozu macht man das genau?
bzw ist nicht PB3 schon ausgang und dann ausgang auf ausgang geschaltet?


PORTD &= ~(1 << PD1);--> weil PD1 Highpegel führt?

und wieso wird PD2 mit DDRD bezeichnet bzw PORTD?
in meinem Schaltplan find ich nur PD2(INT0) und PB3(MOSI/OC2)


if (ir || ir1)--> soll das genauer sein?
weil ich keine Veränderung feststelle, wenn ich es weglasse und wofür wird "ir2=ir1;" ir2 deklariert?ir2 wird nicht verwendet oder?

Gruß

radbruch
14.01.2010, 19:51
Hallo

Die IR-Led D10 ist mit der Kathode an PD1 angeschlossen. Dieser Pin ist auch der Sendepin TXD des USART. Die Anode von D10 liegt über den Vorwiderstand R16 (220R) am PB3, dies ist auch der Hardwareausgang OC2 des Timer2. Der Timer2 erzeugt die 36kHz-Trägerfrequenz des IR-Signals und gibt diese an PB3 aus (Ausgang PB3 wechselt mit 36kHz zwischen High und Low und zurück). Um dabei einen Stromfluß durch D10 zu ereichen, muss diese mit der Kathode mit GND verbunden sein. Normalerweise macht dies der USART, wenn er serielle Daten über TXD ausgibt (er moduliert dann das Trägersignal). Da bei der IR-Abstandmessung vom USART aber keine seriellen Daten abgesendet werden (das würde übrigends wohl auch funktionieren) muss das Programm diesen Pin auf Ausgang und low schalten.

Der IR-Empfänger liefert an seinem Ausgang ein invertiertes Signal, wenn er kein Trägersignal, also kein Echo, erkennt ist der Eingang PD0 gesetzt, in IR steht dann eine 1 (weil PD0 Bit 0 des Ports ist). Das IR-Echo rauscht ziemlich, deshalb werden mehrere Messungen durchgeführt. Die Ergebnisse der Mesungen stehen dann in IR, IR1, IR2... (je nachdem wie groß die Dämpfung sein soll, es ist ein Fifo). Vor jeder neuen Messung werden die alten Werte umkopiert: IR2=IR1, IR1=IR. Nur wenn alle gespeicherten Werte 0 sind, wurde sicher ein echtes Echo empfangen (0 bedeutet ja, der Empfänger hat was erkannt):
If (IR | IR1 | IR2... ) then kein Echo

Das kann man auch hier nachlesen:
https://www.roboternetz.de/phpBB2/viewtopic.php?p=419940#419940



und wieso wird PD2 mit DDRD bezeichnet bzw PORTD?
Keine Ahnung, wo du das her hast und in welchem Zusammenhang das zur Abstandsmessung steht. Generell ist es aber sehr hilfreich, wenn man die Quellen auch angibt, denn ich habe echt keinen Bock jedesmal den ganzen Thread zu durchforsten um den Codefetzen zu finden, auf den sich die Frage bezieht.

Gruß

mic

[Edit]
https://www.roboternetz.de/phpBB2/zeigebeitrag.php?p=473142#473142

Sir William
16.01.2010, 14:55
Um dabei einen Stromfluss durch D10 zu erreichen, muss diese mit der Kathode mit GND verbunden sein..., muss das Programm diesen Pin auf Ausgang und low schalten

und das entspricht dann GND???


Keine Ahnung, wo du das her hast und in welchem Zusammenhang das zur Abstandsmessung steht. Generell ist es aber sehr hilfreich, wenn man die Quellen auch angibt, denn ich habe echt keinen Bock jedesmal den ganzen Thread zu durchforsten um den Codefetzen zu finden, auf den sich die Frage bezieht.

das bezog sich auf die beiden Zuweisungen unmittelbar davor

DDRD |= (1 << DDD1);
und
PORTD &= ~(1 << PD1);

und ich meinte eigentlich PD1, weil es ja so in dem einen Post von dir steht:

DDRD |= (1 << DDD1); // Port D1 als Ausgang
PORTD &= ~(1 << PD1); // PD1 auf LOW

Aber hab ins Datenblatt geguckt, in dem steht, dass PORTD das Data Register von Port D sei und DDRD das Data Direction Register und jetzt gerafft :)

radbruch
16.01.2010, 15:02
Hallo

Ja, ein Ausgang der Low ausgibt ist quasi GND. Schön, dass du es "gerafft" hast, ein Blick ins Datenblatt ist eben oft hilfreich.


...ich meinte eigentlich PD1..
Aha, alles klar.

Gruß

mic

Dimmi
14.02.2010, 17:46
Super Sache!
Also muss man nur die IR Strahlung der IR-LED nach forne lenken, oder?
(Nur um sicher zu gehen^^)

yaro
14.02.2010, 22:21
Nur aus reiner Neugier: Wieso wird die Pulsbreite variiert, und nicht die Trägerfrequenz? Mit zunehmend abweichender Trägerfrequenz ändert sich die Sensitivität doch auch (Grafik im Datenblatt). Von Pulsbreiten steht im Datenblatt aber nichts (zumindest habe ich nichts gesehen), obwohl es natürlich logisch ist....

Gruß, Yaro

radbruch
14.02.2010, 22:38
Es wurde von Waste so vorgegeben und funktioniert auch zufriedenstellend. Das "Verbiegen" der Trägerfrequenz funktioniert auch, allerdings habe ich das noch nicht näher untersucht.

oberallgeier
15.02.2010, 08:22
Hi Yaro,

Nur aus reiner Neugier: Wieso wird die Pulsbreite variiert, und nicht die Trägerfrequenz ...Anfangs hatte ich diese spezielle Art der IR-Abstandsmessung nicht verstanden und deswegen Probleme damit. Dann hatte ich mir das genau angesehen. (https://www.roboternetz.de/phpBB2/viewtopic.php?t=38009&sid=65d6fbc9c2545a215fd8f80f36a4d3f7) Mit der Variation der Trägerfrequenz kann ich natürlich eine Abstandsmessung machen - aber das Ganze geht auch nicht annähernd linear sondern in irgendwie geformten Messfeldern, die (für mich) nicht sinnvoll handhabbar waren. Besonders der Nahbereich ist dann eher ein Würfelspiel. Eine gewisse Empfindlichkeitsanpassung der Messstrecke (https://www.roboternetz.de/phpBB2/zeigebeitrag.php?p=353905&sid=d680e871be077d10fec4f2a23d7e5f5c#353905) mit Betonung des Nah- oder Fernbereiches hatte ich noch als sinnvollste Möglichkeit gefunden, die habe ich mit Variation der Vorwiderstände der LE Ds besser in den Griff bekommen.

Hier ist vorgestellt, (https://www.roboternetz.de/phpBB2/zeigebeitrag.php?p=387767&sid=80f4de499cc895b5fbb884aa3822de66#387767) welche feine Abstufung der Lichtenergie durch unterschiedliche duty cycles im untersten Bereich möglich ist. Eine Zusammenfassung der Ergebnisse ist hier. (https://www.roboternetz.de/phpBB2/zeigebeitrag.php?p=399665&sid=80f4de499cc895b5fbb884aa3822de66#399665)

Die Ergebnisse hatte ich in einem kleinen Projektchen (https://www.roboternetz.de/phpBB2/viewtopic.php?p=390196&sid=7e60bc5f7a0a1ff80e29c2ccc2ca84cc#390196)genutz t mit einer Auswertung auf "Nah" und "Fern" mit der Interpretation "Nah => Kollisionsgefahr" und "Fern => Absturzgefahr" - dazwischen ist freie Fahrt. Wie schnell diese Sensoren messen können zeigt mein WALL R, (https://www.roboternetz.de/phpBB2/zeigebeitrag.php?t=45658&highlight=) der ausschliesslich mit drei >>völlig getrennten<< Sensoren munter durch die Gegend fährt.

yaro
16.02.2010, 11:04
Alles klar, wenn man eine so ausführliche Dokumentation mit Versuchsergebnissen und Schlussfolgerungen hat, dann lohnt es sich natürlich nicht, sich die Mühe zu machen, es anders zu machen.

Meinen Respekt für die ausführliche Beschäftigung mit dieser Art der Abstandsmessung hast du (ihr)!

Gruß, Yaro

mtzE
14.05.2010, 23:38
Habe das ganze gerade auch mal ausprobiert.. und nach einigen Schwierigkeiten (habe die 2.8 Lib) habe ich den Code von malediction genommen und siehe da es hat geklappt und die LED leuchtet Rot jedoch bei einem Abstand der ganz knapp vor der Alufolie ist also wäre der Asuro schon längst gegen das Hindernis gefahren..
Da ich neu in C bin hab ich einfach ein bisschen rumprobiert und bin dann auf das hier gekommen:



#include "asuro.h"
#include <stdlib.h>

int main(void)
{

Init();

DDRD |= (1 << DDD1); // Port D1 als Ausgang
PORTD &= ~(1 << PD1); // PD1 auf LOW

UCSRB = 0;
OCR2 = 0x90; //Anfangswert (entspricht Pulsbreite 110)

while(1){
if (PIND & (1 << PD0)){
StatusLED(GREEN);
MotorDir(FWD,FWD);
MotorSpeed(150,150);
}
else{
MotorSpeed(0,0);
StatusLED(RED);
Msleep(800);
MotorDir(RWD,BREAK);
MotorSpeed(150,0);
Msleep(500);
MotorSpeed(0,0);
}
}
return 0;
}


Jedoch bemekerkt er das Hindernis trotzdem erst 1 - 2 cm vor sich und dreht dann um.. Das ganze ist mir viel zu nah.. Gibt es eine Möglichkeit das ganze irgendwie noch weiter hochzuschrauben??

MfG. mtzE

josua
15.05.2010, 21:26
klasse idee, die einfache modifikation!!!!!!!!!!!!!!!!!

gruß josua

mtzE
17.05.2010, 16:49
Hat den niemand ne Lösung zu meinem Problem? :(
Siehe Post 2 Posts weiter oben...

MfG. mtzE

robo.fr
18.05.2010, 20:17
klasse idee, die einfache modifikation!!!!!!!!!!!!!!!!!

Welche Modifikation meinst Du? Das Programm oder die Hardware ?
Die Idee von "waste" mit der Abstandsmessung war genial.
Deine Atmega32 Platine kann es aber auch :-)

oberallgeier
18.05.2010, 22:12
... Welche Modifikation ... Die Idee von "waste" mit der Abstandsmessung war genial ...Ja, hard- und softwaremässig eine geniale Idee - einfach bom-wast-isch. Ich bin sogar der Meinung, dass ein Aufbau etwa in dieser Art empfohlen werden sollte:

.................http://oberallgeier.ob.funpic.de/asuro-torp_66.jpg(klick) (https://www.roboternetz.de/phpBB2/zeigebeitrag.php?p=343494&sid=bdfb0ee67a4befe70e071ffdcd318265#343494)

Der verhindert gelegentliche thermische und elektrostatische Probleme beim Zusammenbau. Und man bekommt als Draufgabe noch die Möglichkeit zur Abstandsmessung dazu.

robo.fr
19.05.2010, 07:16
Hallo Oberallgeier,

das ist auch eine sehr gute Idee, und so einfach ..

Gruß,
robo

josua
19.05.2010, 17:05
also oberallgeier, für alle die ihren asuro neu zusammenbauen ist deine version natürlich besser! ansonsten ist die von waste einfacher!!!

gruß josua

oberallgeier
19.05.2010, 18:34
Hallo robo.fr und josua,

danke für das Lob. Ich hatte aber nicht meine Lösung hier vorgestellt (https://www.roboternetz.de/phpBB2/viewtopic.php?p=502415&sid=4c4cdbebaa3780e5e5a64098d0cb51ca#502415) um nach Lob zu heischen sondern nur, um zu zeigen, was josua deutlich sagt: Anfänger können das Teilchen so aufbauen - da braucht man keine weiteren Teile dazu. Gut, eine Blende für die IRDiode sollte schon sein - Schrumpfschlauch ist gut - ist auch im Bild zu sehen, auch dunkles Klebeband (Textil oder Elektronikklebeband) geht. Später hatte ich Kupferrohr genommen, Øa 6 mm, Øi 5 mm, weil das WIRKLICH undurchsichtig ist - auch im IR-Bereich. Und ich hatte diese Abstandsmessung ja mit sternthalers CIRperei zu einer recht praktischen und schnellen Methode für mehrere Sensoren ausgebaut - als ich wastes Methode dann endlich verstanden (https://www.roboternetz.de/phpBB2/zeigebeitrag.php?p=351033&sid=19ec98252c0dd11ee6cf2ddae28a9b96#351033) hatte.

Ezalo
11.07.2010, 20:20
Super Idee diese kleine Modifikation. Hab ich gleich mal probiert ^^

Aber naja, er macht nicht das was er machen soll. Er fährt immer nur Rückwärts im Kreis wobei immer mal der Linke Motor zuschaltet und abschaltet. Weiß irgendwie nicht weiter was ich da machen soll.

Kann es vielleichtt an dem "Spiegel" liegen welcher die Infrarot-Strahlen auf den Gegenstand richtet?

mein Quellcode mit lib 2.8rc1:


#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

UCSRB = 0;
OCR2 = 0xFC;
speed=140;

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;
}

Und noch was anderes. Fährt euer Asuro auch nicht gerade sondern fährt z.B. immer eine rechtskurve? Und wenn er Rückwärts fährt scheint der linke Motor schwerer zu gehen als der rechte. Jemand Tipps hierzu?

MfG

Ezalo

radbruch
12.07.2010, 14:17
Hallo


Er fährt immer nur Rückwärts im Kreis wobei immer mal der Linke Motor zuschaltet und abschaltet.Das ist genau das Ausweichverhalten bei erkanntem Hinderniss: 1/2 Sekunde zurück, 1/2 Sekunde rückwärts schwenken. Das bedeutet, dein asuro erkennt ein Hinderniss.

Ganz wichtig ist, dass man den TSOP auch von unten abschirmt, also einen lichtundurchlässigen Streifen Irgendwas zwischen die IR-LED bis unter den TSOP reinfummelt. Sonst "kriechen" die IR-Strahlen über die Platine von der LED zum TSOP;)

Eine ausführliche Beschreibung der Funktion und zur Erzeugung der Trägerfrequenz beim asuro habe ich hier mal gepostet. Am Ende dieses Beitrages ist auch ein kleines Testprogramm das die OCR2-Werte zum Terminal sendet:

https://www.roboternetz.de/phpBB2/zeigebeitrag.php?p=473142#473142

Warum die aktuelle Library bei der IR-Abstandsmessung so zickt weiß ich leider auch nicht. Ich kann auch nichts dazu sagen, weil ich ja bekanntlich diese Lib nicht verwende. Grundsätzlich scheint es aber auch zu funktionieren, wie einige Beiträge in diesem Thread belegen:)

Das Material des Reflektors dürfte unkritisch sein. Grundsätzlich funktioniert es auch ganz ohne Reflektor als Abstandsmessung nach oben (https://www.roboternetz.de/phpBB2/viewtopic.php?t=26809).

Wegen mechanischen und elektrischen Toleranzen fahren fast alle asuros eine Kurve.

Gruß

mic

Ezalo
12.07.2010, 16:01
Danke füre deine ausführlich Antwort. Und sehr beruhigend das es "normal" ist das der Asuro kurven zieht beim geradesausfahren. Erinnert mich an: Wie heißt das? "Die gerade-Kurve? Der gerade-Kurve? Oder das gerade-Kurve?" ^^

ASUR0
26.09.2010, 11:59
Noch ein Hinweis für alle, bei denen es mit den Code von radbruch ganz am Anfang des Threads nicht funktioniert(mit AsuroLib2.8):

In der Init()-Funktion wir das Senden und Empfangen mit der IR aktiviert:


UCSRB = (1<<RXEN)|(1<<TXEN); // enable Rx & Tx

Danach klappt aber die IR-Hinderniserkennung nicht mehr.

Man muss demnach UCSRB zurücksetzen.

Es heißt also:


Init();
DDRD |= (1 << DDD1); // Port D1 als Ausgang
PORTD &= ~(1 << PD1); // PD1 auf LOW
UCSRB = 0; <---------------fehlt!
OCR2 = 0xFC;


Das gleiche gilt für den Code von waste. Anscheinend wurde in der ursprünglichen Lib dies anders gemacht

ASUR0