Archiv verlassen und diese Seite im Standarddesign anzeigen : Anfänger braucht Hilfe
Crystal Eye
04.08.2011, 15:57
Hallo RoboterNETZ Community,
ich habe mir heute ein RP6 gekauft. Ich habe jetzt wie es in der Bedienungsanleitung beschrieben ist, die Software installiert.
Nun habe ich den RP6 Loader gestartet & versucht in mit dem RP6 zu verbinden. Leider bekomme ich folgende Fehlermeldung:
ERRORCODE 2: Falsche ID empfangen!
Kommunikationsproblem!
Im Log ist folgendes zu finden:
RP6 Loader is ready to go.
Trying to open port: USB0 | RP6 USB Interface | ARTO3W26
USB0 | RP6 USB Interface | ARTO3W26 open @38400baud
Baudrate is set to: 38400
Try to get ID...
Connected to target!
Target ID received:
[RP Board ID 54, Firmware Version 66.79, Board Rev.: 79
FEHLER (2) ||| Falsche ID empfangen!
Kommunikationsproblem!
Bitte lesen Sie in der Bedienungsanleitung unter "Fehlerbehandlung" nach!
Setup High Speed...
Wenn ich auf verbinden klicke, dann kommuniziert er aber, denn die LED blinkt dann..
Ich bin ein absoluter Anfänger an diesem Gerät.
Weiß jemand rat, bzw. hat jemand das selbe Problem (gehabt)?
Die Suchfunktion hat mich bis jetzt leider auch noch nicht weiter gebracht.
Vielen Dank im voraus!
Crystal Eye
Crystal Eye
04.08.2011, 19:23
Hallo, ich bin es nochmal!
Jetzt habe ich es nach langem suchen geschaft, mich mit dem RP6 zu verbinden.
Ich bin wie folgt vorgegangen:
In der config-Datei war die Board ID auf 1 eingestellt. Ich habe sie dann auf 54 eingestellt, da die Rückmeldung "[RP Board ID 54......" erschien.
Jetzt klappt es mit dem verbinden. Leider bekomme ich eine Timeout - Meldung beim Upload eines Programms.
Kann mir da evtl. jemand helfen?
Vielen Dank für Eure Unterstützung!
Crystal Eye
Hallo,
die ID ändern bringt nichts das liegt daran das der RX Pin nicht korrekt funktioniert (Kabel, schlechte Lötstelle o.ä.), der RP6Loader interpretiert dann die [READY] Meldung als die Reaktion des Bootloaders auf eine Anfrage was natürlich nicht klappt.
s.a.
http://www.arexx.com/forum/viewtopic.php?f=19&t=1482
MfG,
SlyD
Crystal Eye
06.08.2011, 23:31
Hallo SlyD,
vielen Dank für die schnelle Antwort.
Nachdem ich das Kabel "verkehrtrum" angesteckt habe und danach der RP6 ausging, kam mir das dann doch sehr verdächtig vor, kurze Zeit später habe ich das Kabel durchgemessen und nun lag der Defekt auf der Hand.
Ich habe mir nun ein neues Kabel besorgt, und jetzt funktioniert es einwandfrei.
Nachdem ich die ganze Nacht versucht habe den Compiler ans laufen zu bekommen (und es mittlerweile auch geschafft habe. Welches Programm zu programme schreiben bzw. compilieren benutzt Ihr denn? AVR Studio oder das Notepad??), versuche ich nun dem Roboter das geradeaus fahren "beizubringen".
Wie kann ich das am besten einstellen?
Also der RP6 fährt eine rechtskurve....
Jetzt habe ich mir die Justierungsanleitung geladen, da wird gezeigt wie man das Problem mechanisch beheben kann/soll.
Ich habe jedoch auch gelesen, dass man das in der RP6RobotBaseLib.h - Datei (ich glaube das war die) i-wie eingestellt werden kann...
Gibt es da jetzt zwei verschiedene Varianten um das Problem zu beheben? - Sprich einmal mechanisch zu justieren oder einmal "Softwaretechnisch" (fahre ein Schritt gerade aus = rechts 1 Umdrehung und links 1,5 Umdrehungen, oder wie??).
Liege ich da richtig, hat man diese Möglichkeiten?
Ich hoffe mir kann jemand helfen und eine Variante Empfehlen.
@SlyD: Wie haben Sie das Problem gelöst?
Einen schönen Abend noch!
Crystal Eye
radbruch
07.08.2011, 00:00
Hallo
Der RP6 fährt eher selten wirklich geradeaus:
https://www.roboternetz.de/community/showthread.php?45898-Rp6-f%E4hrt-nichtgerade-aus...
Ich verwende KamAVR (http://www.avrfreaks.net/index.php?module=Freaks%20Tools&func=viewItem&item_id=632), schlank und spartanisch.
Gruß
mic
Crystal Eye
07.08.2011, 13:35
Hallo,
danke für den Link!
Jedoch habe ich noch eine Frage:
Wenn ich den Selbstest durchführe, genauer gesagt Prog. 8 im Selbstest, dann ist alles OK! Sprich die Speed Left & Right sind einigermaßen gleich, klar abweichungen aber mit denen kann man glaube ich sehr gut leben. (Das Programm sagt auch alles ok! - Die Signale sind ebenfalls ok)
Jedoch wenn ich die Geschwindigkeit selbst vorgebe (Prog. "c"), dann sind das schon sehr große Unterschiede und die Signale sehen nicht gut aus.
Bedeutet das, dass der RP6 eigentlich geradeaus fahren kann (auch richtig) aber nur mit einer speziellen Regelung?
Wo finde ich diese bzw. wie kann ich sie aufrufen?
Muss/sollte ich dennoch den Robby aufschrauben und justieren?
Ich würde gerne folgendes ausprobieren:
Den Robby 1m gerade ausfahren lassen, dann dort für 10 sec. stehen lassen und dann wieder zurückfahren.
Kann mir jemand helfen dies zu verwirklichen, denn im Moment bekomme ich das geradeaus fahren ohne Hilfe nicht gebacken.
Bitte seht mir nach, ich bin noch ein blutiger Anfänger;-)
Dennoch vielen Dank für Eure Unterstützung!
Gruß
Crystal Eye
Hallo,
Jedoch wenn ich die Geschwindigkeit selbst vorgebe (Prog. "c"), dann sind das schon sehr große Unterschiede und die Signale sehen nicht gut aus.
Man gibt im "c" Test keine Geschwindigkeit an, sondern den PWM Wert.
Da wird dann also eine fixe Spannung an die Motoren angelegt und nichts geregelt (geht in dem Test ja auch nicht anders, da die Drehgeber eingestellt werden müssen).
Abweichungen sind ohne Regelung völlig normal: leicht unterschiedliche Kettenspannung (es sind Gummiketten daher sind hier Abweichungen normal), links ein Stellring fester angezogen als Rechts, Motoren leicht anders, o.ä.
Das sind eben alles keine Präzisionsteile sonst könnte man den Roboter nicht zu solch einem Preis anbieten.
Die Regelung die standardmäßig mit dabei ist, gleicht die Geschwindigkeiten NICHT aneinander an, sondern regelt die für jede Kette einzeln auf den Sollwert ein und ist auch relativ langsam eingestellt.
Hab ich hier aber schon öfters erläutert --> Forum Suchfunktion verwenden ;)
Muss/sollte ich dennoch den Robby aufschrauben und justieren?
Poste mal die Ausgabe des "c" Tests hier bei unterschiedlichen PWM Werten.
(und Suchfunktion benutzen - es gibt ein gutes VIDEO wo man sehen kann wie das justiert wird)
MfG,
SlyD
Crystal Eye
07.08.2011, 17:55
Hallo,
ok, stimmt das war nicht die Geschwindigkeit.
Ich habe nun mal den Robby aufgeschraubt, und gesehen, dass das linke zahnrad etwas locker war, nun sitzt es fest. Nun fährt der Roboter auch schon viel besser.
(Hoffentlich war in dem Programm nicht die Regelung drinnen ;-)) - Also ich tu mich noch etwas schwer mit den Befehlen usw.
I-wie vergesse ich immer etwas... Es hört sich vielleicht blöd an, aber ein einfaches Programm mit 1 m fahren, stoppen und dann wieder den Meter zurückfahren ist noch ein Problem.
Wo kann ich denn die Encoder Auflösung ändern? - Ich habe zwar schon viel jetzt gelesen, aber ich verstehe es noch nicht.
Im Anhang die Ausgabe des c-Tests.
Das Video habe ich leider noch nicht gefunden...
Ich hoffe, dass ich das Programm heute noch ans laufen bekomme...
Grüße
Crystal Eye
I-wie vergesse ich immer etwas...
Wenn Du noch nix programmiert hast vorher ist das normal.
Du köntest auch erstmal an Textausgaben im Terminal die generelle C programmierung üben...
Das Video habe ich leider noch nicht gefunden...
z.B. hier:
https://www.roboternetz.de/community/showthread.php?44032
PWM=25 ist übrigens relativ wenig - Du musst die Drehgeber mit verschiedenen Werten testen.
...
DCL: 86:13 |DCR: 73:26
...
Sollte man besser neu einstellen wenns denn probleme gibt.
Alles im Bereich 60:40 bis 40:60 passt.
Wo kann ich denn die Encoder Auflösung ändern?
In der RP6Lib/RP6common/RP6Config.h
Das ist aber nur ein UMRECHNUNGSWERT für die Makros direkt darunter (DIST_MM rechnet dann die Drehgeber zählschritte in Millimeter um anhand des Wertes den man eingibt - steht aber in der Anleitung)
Der Rotation Factor weiter unten ist um bei drehungen die "Reibungsverluste" auszugleichen denn jeder Kettenantrieb reibt beim drehen über den Boden und die Motoren müssen länger drehen als beim geradeausfahren um die gleiche Strecke (auf dem Kreisradius) zurückgelegt zu haben. Das ist abhängig vom Untergrund - steht alles dabei und auch in der RP6 Anleitung.
Ich hoffe, dass ich das Programm heute noch ans laufen bekomme...
Es gibt da schon Beispielprogramme die sowas in der Art machen. Schau Dir die doch mal an.
MfG,
SlyD
Crystal Eye
07.08.2011, 18:39
Hallo SlyD,
sorry, ich hatte vergessen die anderen Zeilen mit reinzukopieren.
Anbei nun nochmal die Werte nun mit anderen PWM - Werten
Wegen der RP6Config.h Datei werde ich gleich nochmal schauen.
Ja, diese Beispielprogamme sind ja wirklich nicht schlecht, jedoch bekommt man schnell Fehlermeldungen (wegen fehlen eines ";") - Anfängerfehler ;-)
Gruß
Crystal Eye
Nachtag: Warum funktioniert am Anfang die 25 nicht richtig, später aber wieder???
Nachtag: Warum funktioniert am Anfang die 25 nicht richtig, später aber wieder???
Die Ausgabe "SPEED RIGHT IS TOO LOW!!!!"
Heisst hier das der Motor nicht läuft!
Du musst einmal zu beginn einen etwas höhren Wert einstellen um den Anlaufstrom des Motors erreichen zu können.
Wie schon gesagt in dem Test ist keine Regelung aktiv die das automatisch machen würde ;)
Die Werte sehen jedenfalls besser aus.
Aber bitte beachten das Umgebungslicht (bei abgeschraubtem Mainboard) die Werte verändern kann.
MfG,
SlyD
021aet04
07.08.2011, 18:48
Motoren haben einen relativ hohen Einschaltstrom. Wenn die Spannung bzw PWM Wert zu niedrig ist erreichst du den Wert nicht, damit das Drehmoment ausreicht das der Motor zu drehen beginnt. Du musst deswegen eine höhere PWM wählen damit der Motor anläuft. Damit der Motor weiter dreht braucht man ein nicht so hohes Drehmoment und somit kann man die PWM verringern.
MfG Hannes
Crystal Eye
08.08.2011, 00:24
Guten Abend,
ich war heute sehr fleißig und habe sehr viel Probiert....
Nun bin ich seit ca. 3 Std. an einem kleinem Programm dran, welches folgedes machen soll:
Der Robby fährt einfach los, und wenn ein Hindernis kommt, soll er ihm ausweichen, zudem wenn die Bumper aktivert werden soll er zurückfahren und drehen....
Soweit so gut, könntet Ihr da mal kurz drüber schauen, denn mein Robby fährt los, und wenn ein Hindernis kommt, bleibt er stehen, dreht sich und dann macht er aber nix mehr....
(Ich glaube auf die Bumper reagiert er auch nicht richtig, weiß ich aber nicht genau.)
Versteht Ihr wo mein Problem liegt?
Eine Frage hätte ich zusätzlich noch:
Wenn ich einen Winkel fahren will (rotate), dann muss ich z.B. bei 90° etwas mehr angeben. Wo kann ich das einstellen, auch in der Config? - Da hab ich aber noch nix gefunden :-(
Vielen Dank, mein Code fürs Programm ist in der Anlage;-)
Crystal Eye
Hallo,
Eine Frage kann ich dir schonmal Beantworten:
In der RP6Config.h - Datei findest du ab Zeile 36 verschiedene Encoder-Auflösungen. Um herauszufinden, welche Auflösung dein RP6 hat machst du zum Beispiel folgendes:
- Du schreibst ein kleines Programm, das den RP6 eine bestimmte Distanz fahren lässt. ( mit move(<Speed>,<Direction>,DIST_MM(<Distanz>),true); )
- nach der Distanz soll er anhalten und über die Schnittstelle die gezählten Encoder-Schritte (links und rechts) ausgeben.
- Miss die tatsächlich zurückgelegte Distanz.
- Widerhole diese Testreihe 3-mal und mach einen Mittelwert der tatsächlichen Distanz und der Encoder- Schritte.
- Die Encoder- auflösung berechnet sich nun: Distanz / Enc.Schritte.
- Mach denselben Test noch ein zweites Mal. Bei mir waren es dann durchschnittlich 9 mm zuviel auf 2m !
Rotieren:
PR6Config.h zeile 48 - 64 lesen.
Es ist eigentlich nur durch Experimentieren möglich. versuche es einfach mit grösseren und kleineren Werten.
Da 90° etwas kurz sind, kannst du ja 360° oder mehr drehen. Dann spielt die Toleranz der Motoren auch weniger mit.
Zu deinem Programm:
Ev. Hilft es dir weiter, die Move_04 Beispiele genau anzuschauen und abzugucken.
MfG
Filou
Crystal Eye
08.08.2011, 01:58
Hallo Filou89,
vielen Dank für die Antwort. Ich habe das mit dem Programm heute gemacht, also 300 mm fahren, stoppen.
Daraufhin habe ich die RP6Config.h - Datei abgeändert. Aber evtl. sollte ich das wirklich mehrmals & mit einem mittelwert genauer einstellen. Warscheinlich auch längere Strecken, obwohl es bei 30 cm schon eine große Abweichung war.
Aber sehr gute Anleitung, Spitze! - Danke!
Wegen dem Rotieren, das werde ich später durchprobieren.
Mir macht eher das Programm noch zu schaffen. Kann es sein, dass er einfach nicht weiß was er machen soll wenn er das Hindernis erkannnt hat und rotiert hat? - Sprich ich müsste ihm i-wie "beibringen" wie er da wieder in das einfache geradeaus fahren geht....
Wie stelle ich das am Besten an? - Wie gesagt, ich bin noch ein blutiger Anfänger.... Aber ich will das hinbekommen...
Gruß
Crystal Eye
Gute Nachrichten:
Ich hab dein Programm mal auf meinen RP6 geladen. Hindernisse erkent er ja schon ganz gut. Einfach wie er weiterfahre soll ist ihm nicht ganz klar.
in deiner fahrenFunction() hast du nur gesagt, dass die geschwindigkeit beider Raupen 90 sein soll, nich aber in welche Richtung. Deshalb nimmt er dieselbe Richtung, die er gerade zuletzt hatte.
Folglich dreht er sich immer im Kreis!
mit changeDirection(FWD) kannst du das Problem beheben.
Zudem habe ich dir bei den Bumern noch eine kleine änderung gemacht.
Mir wurde beigebracht, dass man denselben Code möglichst nur einmal verwenden soll.
So bleibt es übersichtlicher.
#include "RP6RobotBaseLib.h"
void acsStateChanged(void) //ACS
{
// Hindernis links
if(obstacle_left){
rotate(50, RIGHT, 49, true); // um 45° nach rechts drehen
}
// Hindernis rechts
if(obstacle_right){
rotate(50, LEFT, 45, true); // um 45° nach links drehen
}
// Mitte?
if(obstacle_left && obstacle_right) {
rotate(50, LEFT, 188, true); // um 180° nach links drehen
}
statusLEDs.LED6 = obstacle_left && obstacle_right;
statusLEDs.LED3 = statusLEDs.LED6;
statusLEDs.LED5 = obstacle_left;
statusLEDs.LED4 = (!obstacle_left);
statusLEDs.LED2 = obstacle_right;
statusLEDs.LED1 = (!obstacle_right);
updateStatusLEDs();
}
//Bumpers
void bumpersStateChanged(void) {
if(bumper_left || bumper_right){ //Wenn ein Bumper berührt wurde, dann mal das machen, egal welcher.
moveAtSpeed(0,0); //Nicht unbedingt nötig, aber ich würde die beiden Zeilen zur Sicherheit schreiben.
mSleep(500);
move(60, BWD, DIST_CM(25), true); //25 cm Rückwärts
}
if(bumper_left && bumper_right)
rotate(50, LEFT, 188, true); // um 180° nach links drehen
else if(bumper_left)
rotate(50, RIGHT, 49, true); // um 45° nach rechts drehen
else if(bumper_right)
rotate(50, LEFT, 45, true); // um 45° nach links drehen
}
void fahrenFunction(void){
// Geschwindigkeit einstellen !!Richtung nicht vergessen!!
changeDirection(FWD);
moveAtSpeed(90,90);
}
int main(void) {
initRobotBase();
setLEDs(0b111111);
mSleep(2500);
setLEDs(0b001001);
// ACS Event Handler registrieren:
ACS_setStateChangedHandler(acsStateChanged);
// Set Bumpers state changed event handler:
BUMPERS_setStateChangedHandler(bumpersStateChanged );
// ACS Empfänger einschalten (und Encoder etc.)
powerON();
// ACS auf mittlere Sendeleistung stellen.
setACSPwrMed();
// Main loop
while(true){
// Aus der Hauptschleife ständig die motionControl Funktion
// aufrufen – sie regelt die Motorgeschwindigkeiten!
task_motionControl();
// ADC Wird wegen den Motorstromsensoren aufgerufen!
task_ADC();
// Bumper automatisch alle 50ms auswerten
task_Bumpers();
// ständig die task_ACS Funktion aufrufen!
task_ACS();
//Fahren
fahrenFunction();
}
return 0;
}
Hoffe, bei dir klappts,
Viel Erfolg,
MfG
Filou
Crystal Eye
08.08.2011, 03:17
Vielen Dank!
Jetzt funktioniert es, der HAMMER... Ok, das mit den Bumpern habe ich jetzt auch verstanden....
Jetzt habe ich ihn durch mein Zimmer fahren lassen, und dann ist er in eine Ecke gefahren, und kam nicht mehr raus....
Jetzt müsste man doch einen Timer einstellen, für solche Fälle, oder? - Sprich er muss drehen....
Einfacher wäre es natürlich wenn man ihm hier:
if(obstacle_left && obstacle_right) {
rotate(50, LEFT, 188, true); // um 180° nach links drehen
gleich das Rückwärts fahren + Drehung angibt, oder?
Aber wie bzw. welches Ereignis startet den Timer?
Ist das zu realisieren?
Denkansatz:
Wenn das Hindernis in der Mitte ist und er rechts und links auch nicht weiter kommt, dann soll er nach 5 sec. zurückfahren.
Ist das vom Ansatz her richtig?
ABER, nochmal rechtherzlichen Dank. Ich bin einfach noch nicht soweit bzw. hab das Problem nicht erkannt....
Mit ein bisschen Übung bekomme ich das hoffentlich schon bald gebacken....
Gruß
Crystal Eye
danimath
08.08.2011, 10:47
Moin Crystal Eye,
von Anfänger zu Anfänger:
> Jetzt habe ich ihn durch mein Zimmer fahren lassen, und dann ist er in eine Ecke gefahren, und kam nicht mehr raus....
Nur so'ne Idee (weil ich gerade das gleiche Problemchen hatte, und das so demnächst ausprobiere): Bei einem Bumper-Ereignis einfach eine zufällige Strecke zurückfahren und dann eine zufällige Drehung machen - "zufällig" heißt hier natürlich "pseudo-zufällig" :)
Die libc hat eine random-Funktion, und wenn Du Spaß haben willst :evil: dann google mal nach "knuth random".
viele Grüße
Andreas
Crystal Eye
08.08.2011, 11:07
Moin danimath,
Eine gute Idee mit dem Bumper, jedoch wird der Bumper ja nicht aktiviert....;-) Die Sensoren checken es ja viel früher, so wie es auch sein sollte.
Im moment bin ich noch beschäftigt mit den Rotationseinstellungen, wie Filou89 geschrieben hat, muss man dan Faktor in Zeile 64 der RP6Config.h - Datein ändern.
Sie war bei mir auf 688 eingestellt, jetzt habe ich die zahl verändert (nur leicht, sprich 100 dazu usw.) Aber da tut sich gar nix, der dreht nicht weit genug. Probe halber habe ich 1950 eingesetzt, aber auch hier keine Reaktion, wie unverändert... :-(
Weiß jemand wo dran das liegen kann??
Das mit dem Radom ist ja eine Lustige angelegenheit, wenn ich es richtig verstanden habe, sieht das wie folgt aus:
int random_number = random () % 200;
Bedeutet, es wird eine zufällige Zahl zwischen 0 und 199 gesucht (&gefunden = ausgegeben)?
Gruß
Crystal Eye
danimath
08.08.2011, 11:20
Statt der Bumper kannst Du bestimmt auch das Kollisionssystem verwenden (wie gesagt - was Roboter angeht bin ich auch noch Anfänger)
int random_number = random () % 200;
Bedeutet, es wird eine zufällige Zahl zwischen 0 und 199 gesucht (&gefunden = ausgegeben)?
Das ist richtig. Im Programm im Initialisierungteil solltest Du allerdings noch "srandom (123456);" (oder eine andere Zahl) aufrufen; ohne das wird immer "1" als Startwert benutzt. Weil ich gerade im Büro sitze, kann ich kein komplettes (getestetes) Programm posten - vielleicht bekomme ich heute abend was hin.
viele Grüße
Andreas
Crystal Eye
08.08.2011, 11:31
@radbruch:
ich habe gedacht, die RP6Config.h - Datei wird in der RP6RobotBaseLib.h eingebunden? Muss ich zusätzlich nochmal einbinden?
Make All habe ich gemacht, da fällt mir noch etwas ein, was ich noch nicht ganz kapiert habe... lt. Anleitung sollte man ja auch eine "Make Clean" erstellen, wofür ist die genau da? - Ich habe sie selber (noch) nicht aufgerufen. Soweit wie ich das verstanden habe, entfernt Sie sachen, die nach dem Compilieren nicht mehr gebraucht werden.... Wenn ich die Make Clean datei nach dem compilieren aufrufe, was bringt mir das? Ändert die was am Code, ne oder?
@danimath: Kein Streß, jo, wäre prima, wenn Du da noch was finden könntest ;-)
Ich bin sehr interessiert daran, das Prinzip & alles war halt dazu gehört zu (er)-lernen..
Crystal Eye
Also bei mir bleibt er auch stecken.
Viele Wege führen ins Ziel.
In der Dokumentation wird gut beschrieben, wie man die Stopwatches einsetzt. Das wäre das, wonach du suchst.
Ich würde aber eher dazu tendieren, eine überwachung zu machen, ob er jetzt immer nur nach links / rechts ausweicht. Wenn er dann nur links/rechst Bewegungen macht, ist er in einer Ecke.
Wenn man diese Situation erkennt, müsste man so reagieren, wie wenn beide bumper gedrückt wurden.
Grüsse,
Filou
radbruch
08.08.2011, 11:33
ich habe gedacht, die RP6Config.h - Datei wird in der RP6RobotBaseLib.h eingebunden?Vollkommen richtig, daran hatte ich nicht gedacht. Clean räumt nur die Festplatte auf und ändert nichts am Programm.
Crystal Eye
08.08.2011, 11:46
Stimmt, guter Tipp mit den Stopwatches...
Hier ma ein Auszug von der RP6Config.h Datei:
/**
* Defines a Factor for the rotation error.
* As you may have read in the Manual, the rotation is unprecise
* because of wheel/track slippery. This Factor allows you to
* make it roughly precise.
* The Problem is: You need to use different rotation factor
* for different surfaces, as the Robot behaves different on
* different surfaces (e.g. carpet vs. wooden floor).
*
* You need to do some experiments with this until you get
* good results. Let the Robot rotate by 90°, 180° and 360°
* and change the rotation factor depending on if it works
* good or not.
*
* If you want to make it really precise, you will have to
* use a Mouse sensor, electronic compass or gyroscope.
*/
#define ROTATION_FACTOR 950
Mache ich da was falsch, oder warum dreht der nicht 90°?
Crystal Eye
Du musst bei jeder Änderung in den RP6Lib HEADER Dateien einmal Make clean (und danach natürlich wieder make all) ausführen sonst wird das nicht übernommen!
danimath
08.08.2011, 19:52
Ein komplettes Programm habe ich nicht hinbekommen, weil ich mit den komischen WinAVR :MistPC gekämpft habe - ich bin dann wieder auf Bewährtes (vi und make) gewechselt :twisted:; aber 'ne Zufallszahlen-Demo habe ich in Wieder-ein-Neuer-Vorstellung-und-Fragen (https://www.roboternetz.de/community/showthread.php?54306-Wieder-ein-Neuer-Vorstellung-und-Fragen) gestellt.
viele Grüße
Andreas
Crystal Eye
08.08.2011, 20:34
Hallo,
@SlyD: Ich habe es noch nicht ganz verstanden, muss ich da jetzt jede (".c") Datei, die im RP6Lib Ordner ist einmal mit Make clean und dann mit make all bearbeiten?
Oder wie ist das gemeint?
Welche Dateien muss ich denn ändern?
@danimath: Ist nicht schlimm...
Nachdem ich jetzt mein Programm mit dem Ausweichen bzw. Umgehen von Hindernissen für meine Verhältnisse sehr gut erledigt habe, suche ich den nächsten Schritt.
Ich habe folgendes vor:
(Immer die Ziele klein Stecken) Es wäre toll, wenn der RP6 (bzw. ein Sensor) erkennen kann, wenn ein Tisch zu ende ist, oder wenn eine Treppe anfängt und dann stehen bleibt, und zurückfährt.
Es gibt zwar schon viele Themen, aber i-wie finde ich immer etwas anderes.
Könntet ihr mir ein Sensor empfehlen? Welchen habt ihr drin?
Als nächstes würde ich gerne das heißberühmte LCD-Display anschließen & dort Werte ausgeben.
Was empfehlt ihr mir hier? Gleich dieses http://www.conrad.de/ce/de/product/190911/?insert=62&insertNoDeeplink&productname=LC-DISPLAY-16-X-2-KONFEKTIONIERT in Kombination mit der Erweiterungsplatine? http://www.conrad.de/ce/de/product/191550/RP6-MEGA32-ERWEITERUNGSSATZ/?ref=reco
Was verwendet Ihr?
Zudem möchte ich mich bei allen in diesem Forum nochmals bedanken, dass ihr mir so viele Tipps gebt, und mich beim Einstieg in die Robotik unterstützt!
Jetzt habe ich das Ausweichen von Hindernissen mal gefilmt, was meint Ihr dazu?
http://www.youtube.com/watch?v=M9VrkYFbo60
Crystal Eye
Crystal Eye
08.08.2011, 22:52
Abend,
ich bins mal wieder...
Wenn ich 3 weiße LED´s an den RP6 anbauen möchte, wie gestalte ich das am Besten?
Brauche ich da Widerstände? - Wie bzw. wo schließe ich sie an den RP6 an?
Ich bin noch etwas zu ungeschickt, und wollte deswegen hier nachfragen...
Crystal Eye
021aet04
09.08.2011, 08:49
Einfache Standard oder superhelle Leds kannst du mit einem Vorwiderstand anschließen. Wenn du Hochleistungsleds (z.B. 1W) anschließen willst brauchst du Ledtreiber (Konstantstromquelle).
Den Vorwiderstand musst du aber berechnen.
MfG Hannes
danimath
09.08.2011, 09:55
Moin Crystal Eye,
wie cool!!!!! (Du bist ja schon viel weiter als ich ;)) Über die Erweiterungsplatine mit LCD habe ich auch schon nachgedacht. Und der Anschluss weiterer LEDs interessiert mich auch. Auch mir ist nicht klar, wo ich die wie anschließe und ansteuern kann. In irgendeinem Video (finde ich jetzt auf die schnelle nicht wieder) habe ich einen RP6 in der Dämmerung mit weißen LEDs als Scheinwerfer gesehen und gleich gedacht "Das will ich auch". ;)
viele Grüße
Andreas
Crystal Eye
09.08.2011, 10:08
Morgen allerseits,
@021aet04: Danke für die Antwort! Ich habe diesen Rechner hier gefunden: http://www.led-store.ch/vorwiderstand-rechner.php Wenn ich z.B. 3 Weiße LED´s (Standard) an meinen RP6 anschließen möchte, wie gehe ich da am besten vor? Der Rechner benötigt noch ein paar Angaben, über z.B. Stromaufnahme und Betriebsspannung.... Wie viel beträgt denn die Betriebsspannung beim RP6? (6x1,2V Akkus habe ich drinnen, ist dass dann auch die Betriebsspannung?) Wo schließe ich Sie dann an, dass ich sie auch so ansprechen kann wie z.B. die Standard LED´s (die die schon verbaut sind)? Könnte man diese an eine Platine anschließen, und diese dann an den RP6 bauen (z.B. die Experimentierplatine oder auch eine andere, habe hier noch ein paar ;-))
@danimath: Ja, dieses Video hatte ich glaube ich auch gesehen... Ich möchte jetzt einfach mal was an der Hardware "ändern" basteln... ;-)
Ja, diese Erweiterungsplatine finde ich echt cool, da sind doch recht viele Anschlüsse... Das LCD-Display ist halt schon krass auf dem Ding dann;-)
Wenn Du auch soweit bist, kannst ja auch gerne ein Video machen und hochladen..
Beste Grüße
Crystal Eye
021aet04
09.08.2011, 10:36
Damit du die Led betreiben und den Widerstand richtig berechnen kannst brauchst du verschiedene Angaben. Du hast bei einer Led einen bestimmten Maximalstrom. Bei Standard und superhelle Leds sind diese meist zwischen 20 und 40mA. Das ist der Maximalwert, diesen darfst du nicht bzw sehr kurz (z.B. zum Multiplexen) überschreiten. Den tatsächlichen Wert darfst du (natürlich nur bis zum Maximalwert) selbst festlegen. Ein weiterer Wert den du brauchst ist die Flussspannung. Diese hängt von der Led ab die du verwendest. Die Flussspannung hängt auch vom Strom ab den du verwendest (es gibt eigene Kennlinien), diese sind bei Standard/ superhelle Leds nicht so notwendig. Ein weiterer Wert der den Strom beeinflusst ist die Temparatur. Diese ist bei Standard/superhelle Leds ebenfalls zu vernachlässigen. Diese Dinge sind eher bei Hochleistungsleds (über 1W) zu beachten, da diese selbst Wärme erzeugen und je höher die Temparatur desto niedriger wird der Widerstand der Led.
Hast du schon Grundlagen durchgelesen. Du solltest nicht den Rechner verwenden wenn du die Grundlagen noch nicht kennst (meine Meinung). Wie du es berechnest findest du im Internet. Z.B. hier http://de.wikipedia.org/wiki/Leuchtdiode
Zur Flussspannung z.B. hier http://www.led-treiber.de/html/vorwiderstand.html#Flussspannung
MfG Hannes
Crystal Eye
09.08.2011, 11:13
Danke für die viele Information. Ich werde mir das heute noch genauer zu gemüte führen. Also ich habe vor "nur" die Standard LED´s zu verwenden. Wo (an welchem Eingang) schließe ich sie an. Ich weiß nicht genau, ob Du es jetzt schon beantwortet hast, aber wie hoch ist denn die (Standard) - Betriebsspannung? *Sorry*
Danke auch für die Links;-)
Beste Grüße
Crystal Eye
021aet04
09.08.2011, 11:24
Die Betriebsspannung eines µCs ist normalerweise von ca. 1,8V-5V. Beim RP5/RP6, Asuro,... wird 5V verwendet. Welchen Pin du verwenden kannst weiß ich nicht, da ich keinen RP6 habe. Das findest du in der Anleitung. Wie du die jeweiligen Pins ansteuerst findest du auch dort.
Wenn du zu wenige Pins hast kannst du auf Erweiterungen mit entweder Schieberegister oder andere Buserweiterungen (z.B. via I2C) umssteigen. Diese Pins sollten am µC natürlich frei sein oder du verwendest einen Software Bus (z.B. SoftI2C oder SoftSPI). Dannn kannst du jeden beliebigen Pin verwenden.
MfG Hannes
danimath
09.08.2011, 11:25
Vielen Dank auch vom danimath!
viele Grüße
Andreas
radbruch
09.08.2011, 11:58
Hallo
Die Akkuspannung UB beim RP6 beträgt bis zu 8,4V. Mit dem 5V-Spannungsregler wird dann die Bordspannung VDD erzeugt. Die Belegung der Erweiterungssteckplätze kann man sich im Schaltplan (http://arexx.com/rp6/downloads/RP6_Schematics.zip) anschauen.
Eine Übersicht der Pinbelegung hat Dirk zusammengestellt:
https://www.roboternetz.de/community/showthread.php/29402-RP6-Verwendung-der-Ports-des-ATMega32
Eine Auflistung der Anschlussmöglichkeiten und einen Belegungsvorschlag für den USRBus gibts natürlich auch von mir:
https://www.roboternetz.de/community/showthread.php/47102-Sensor-anschlie%C3%9Fen?p=453061&viewfull=1#post453061
Gruß
mic
Ganz viele Infos zum RP6 findest du auch im RN-Wissen (http://www.rn-wissen.de/index.php/RP6).
Wenn du die Led's am Sensorpanel Befestigen willst, findest du die Schemas auf der Arexx-RP6 Webseite (http://www.arexx.com/rp6/html/de/docs.htm)
Schau einfach mal genau auf dein Mainboard. Überall wo VDD steht, kannst du geregelte 5V "abzapfen".
Wenn du aber die Leds gerne ein/und ausschalten willst (davon gehe ich ja mal aus), leg sie direkt an einen I/O. Wo die sind, siehst du auch hier (http://www.rn-wissen.de/index.php/RP6#IO1..IO4)!
Wenn du im Schema des Mainboards (Seite 2/4) in den Feldern E2-4 nachsiehst, wirst du die I/O's auch sehen.
Du kannst aber auch den ADC0 / 1 Port verwenden. Die ansteuerung ist aber etwas weniger simpel. (Kann dir auch nicht zu 100% sagen, wie das geht, aber es geht! (vergleiche Servos) :)
MfG
Filou
Crystal Eye
09.08.2011, 22:07
Vielen Dank für die viele Information. Ihr seit echt SPITZE!! Ich werde das mir jetzt erstmal alles durchlesen, und dann sehe ich weiter. Evtl. schildere ich Euch dann noch wie ich es vor habe zu bewerkstelligen.
Ich habe heute mal probiert, mein Programm zum Ausweichen von Hindernissen zu optimieren. (Das Video, welches ich weiter oben gepostet habe, war schon gut, jedoch war da einprogrammiert, dass er sich um 45° drehen soll usw.) Jetzt versuche ich es so zu basteln, dass er solange z.B. nach links fährt/rotiert, bis der Gegenstand nicht mehr im Wege ist. Das habe ich auch schon zum Teil recht gut gemacht, wie ich meine. Das Problem ist, dass wenn er in einer Ecke ist, bekommt er Probleme.. Er weiß einfach nicht wie er da raus kommen soll & ich weiß nicht, wie ich es ihm am besten beibringen kann.... Die Beispielcodes verstehe ich nicht ganz, somit hänge ich da gerade.
Wenn Ihr Euch den Code evtl. mal anschauen wollt(?) Bei der Gelegenheit hätte ich noch eine Frage: Warum leuchten die LED´s (die Roten Standard) nicht auf, wenn er ein Hinderniss erkennt? - Habe ich doch ins Programm geschrieben... (Anders machen sie es ja auch nicht in den Beispielen)
Hier der Code:
#include "RP6RobotBaseLib.h"
void acsStateChanged(void) //ACS
{
// Hindernis links
if(obstacle_left){
rotate(50, RIGHT, (obstacle_left = false), true); // dreht sich so lange bis der linke Sensor kein Hinderniss mehr hat
}
// Hindernis rechts
if(obstacle_right){
rotate(50, LEFT, (obstacle_right = false), true); // dreht sich so lange bis der rechte Sensor kein Hinderniss mehr hat
}
// Mitte?
if(obstacle_left && obstacle_right ){
move(60, BWD, DIST_CM(10), true); //10 cm Rückwärts
rotate(50, LEFT, 180, true); // um 180° nach links drehen
}
//if(getDirection() == LEFT && getDirection() == RIGHT){
//startStopwatch1(); // Stopwatch1 starten
//}
}
//Bumpers
void bumpersStateChanged(void) {
//if(bumper_left || bumper_right){ //Wenn ein Bumper berührt wurde, dann mal das machen, egal welcher.
//moveAtSpeed(0,0); //Nicht unbedingt nötig, aber ich würde die beiden Zeilen zur Sicherheit schreiben.
//mSleep(500);
//move(60, BWD, DIST_CM(25), true); //25 cm Rückwärts
//}
if(bumper_left && bumper_right){
mSleep(500);
move(60, BWD, DIST_CM(10), true); //10 cm Rückwärts
rotate(50, LEFT, 188, true); // um 180° nach links drehen
}
else if(bumper_left){
mSleep(500);
move(60, BWD, DIST_CM(5), true); //5 cm Rückwärts
rotate(50, RIGHT, 49, true); // um 45° nach rechts drehen
}
else if(bumper_right){
mSleep(500);
move(60, BWD, DIST_CM(5), true); //5 cm Rückwärts
rotate(50, LEFT, 45, true); // um 45° nach links drehen
}
}
void fahrenFunction(void){
// Geschwindigkeit einstellen !!Richtung nicht vergessen!!
changeDirection(FWD);
moveAtSpeed(90,90);
if(getStopwatch1() > 3500) // Sind 3500ms (= 3,5s) vergangen?
{
// Bewegungsrichtung ändern:
if(getDirection() == FWD) // Fahren wir vorwärts...
changeDirection(BWD); // dann Rückwärts einstellen!
else if(getDirection() == BWD) //... oder Rückwärts?
changeDirection(FWD); // dann Vorwärts einstellen!
setStopwatch1(0); // Stopwatch1 auf 0 zurücksetzen
}
}
int main(void) {
initRobotBase();
setLEDs(0b111111);
mSleep(2500);
setLEDs(0b001001);
// ACS Event Handler registrieren:
ACS_setStateChangedHandler(acsStateChanged);
// Set Bumpers state changed event handler:
BUMPERS_setStateChangedHandler(bumpersStateChanged );
// ACS Empfänger einschalten (und Encoder etc.)
powerON();
// ACS auf mittlere Sendeleistung stellen.
setACSPwrMed();
// Main loop
while(true){
// Aus der Hauptschleife ständig die motionControl Funktion
// aufrufen – sie regelt die Motorgeschwindigkeiten!
task_motionControl();
// ADC Wird wegen den Motorstromsensoren aufgerufen!
task_ADC();
// Bumper automatisch alle 50ms auswerten
task_Bumpers();
// ständig die task_ACS Funktion aufrufen!
// task_ACS();
task_RP6System();
//Fahren
fahrenFunction();
/////////////////////////Bumper//////////////////////////
statusLEDs.LED6 = bumper_left; // Bumper links gedrückt
statusLEDs.LED4 = !bumper_left; // links nicht gedrückt
statusLEDs.LED3 = bumper_right; // Bumper rechts gedrückt
statusLEDs.LED1 = !bumper_right; // rechts nicht gedrückt
// Beide Bumper gedrückt:
statusLEDs.LED2 = (bumper_left && bumper_right);
statusLEDs.LED5 = statusLEDs.LED2;
updateStatusLEDs(); // LEDs aktualisieren...
/////////////////////////Obstacle////////////////////////////
statusLEDs.LED6 = obstacle_left && obstacle_right; // Mitte?
statusLEDs.LED3 = statusLEDs.LED6;
statusLEDs.LED5 = obstacle_left; // Hindernis links
statusLEDs.LED4 = (!obstacle_left); // LED5 invertiert!
statusLEDs.LED2 = obstacle_right; // Hindernis rechts
statusLEDs.LED1 = (!obstacle_right); // LED2 invertiert!
updateStatusLEDs();
}
return 0;
}
Ist der Code so einigermaßen in Ordnung? Ich hoffe, dass Ihr mir helfen könnt. Könnte mir jemand nochmal auf die Sprünge helfen, wie das mit den prioritäten war? Obwohl ich diese hier nicht beachtet habe, reagiert er trotzdem auf die "Bumper" & die "Obstacles" ;-)
Beste Grüße
Crystal Eye
Hallo Crystal Eye,
Ich schaue gerade deinen Code an und möchte dir dazu ein Paar Worte sagen. Starten wir bei main():
mit task_RP6System(); rufst du alle anderen Tasks auch auf. Du machst das also 2 mal.. (langsam)
fahrenFunktion();
if (GetStop...>3500) wirst du garnie haben, da sie nirgends im Programm gestartet wurde. (Hast du sicher aus der Anleitung kopiert ;)
setzen der statusLeds: Wenn du das Programm so laufen lässt, werden die Leds nur die Obstacle-Meldungen anzeigen, da die Bumper-meldungen gerade wieder überschrieben werden.
Da müstest du ev eine art wechselblinker machen,der immer 1sec Bumper- und 1sec Obstacle-meldungen anzeigt.
bumpersStateChanged(void) scheint gut.
acsStateChanged(void)
Auszug aus RP6RobotBaseLib.c
void rotate(uint8_t desired_speed, uint8_t dir, uint16_t angle, uint8_t blocking)
{
motion_status.move_L = true;
motion_status.move_R = true;
uint16_t distance = (uint16_t) (((uint32_t)(ROTATION_FACTOR) * (uint16_t)angle)/100);
preDecelerate_L = distance - 100;
preDecelerate_R = distance - 100;
preStop_L = distance;
preStop_R = distance;
if(distance < 40) {
distance = 40;
preStop_L = 20;
preStop_R = 20;
preDecelerate_L = 10;
preDecelerate_R = 10;
}
moveAtSpeed(desired_speed,desired_speed);
changeDirection(dir);
mleft_dist = 0;
mright_dist = 0;
distanceToMove_L = distance;
distanceToMove_R = distance;
motion_status_tmp = motion_status.byte;
MOTIONCONTROL_stateChangedHandler();
if(blocking)
while(!isMovementComplete())
task_RP6System();
}
Du siehst, das 3. Argument (uint16_t angle) ist eine Ganze Zahl,Integer.
Deshalb kannst du nicht schreiben ....,(obstacle_left=false),.... (wäre ja sowieso eine Zuweisung, kein Vergleich)
Da hast du wohl nur eine Lösung:
Du willst solange Rotieren, bis das ACD freie Bahn meldet.
Was heisst denn rotieren? Das hat garnichts mit dem Winkel zu tun, in unserem Fall.
Wann rotiert der RP? Wenn eine Raupe Vorwärts und die andere rückwärts dreht.
Das machst du mit:
setMotorDir(uint8_t left_dir, uint8_t right_dir); --> überzeige dich selbst, steht in der RP6RobotBaseLib.c, sogar wie anwenden.
Oder changeDirection(LEFT/RIGHT);
Wenn du jetzt also die Richtungen unterschiedlich eingestellt hast, machst du nur noch:
moveAtSpeed(uint8_t desired_speed_left, uint8_t desired_speed_right) bis die bahn frei ist, oder solange du noch ein Hindernis erkennst.
Crystal Eye
10.08.2011, 00:03
Hallo Filou89,
danke für die Hinweise!
1.
mit task_RP6System(); rufst du alle anderen Tasks auch auf. Du machst das also 2 mal.. (langsam)
Das ist mir jetzt wirklich peinlich, das hatte ich schonmal richtig, das habe ich jetzt auch sofort verbessert/ausgebessert.
2.
fahrenFunktion();
if (GetStop...>3500) wirst du garnie haben, da sie nirgends im Programm gestartet wurde. (Hast du sicher aus der Anleitung kopiert
Stimmt ;-) Aber auch hier ist es nicht mehr aktuell. Ich hatte die zeit auf 500 gestellt, besser?
3.
setzen der statusLeds: Wenn du das Programm so laufen lässt, werden die Leds nur die Obstacle-Meldungen anzeigen, da die Bumper-meldungen gerade wieder überschrieben werden.
Das Problem ist aber genau andersrum. Die LED´s blinken nicht auf wenn ein Hinderniss erkannt wird, nur wenn die Bumper aktiviert werden (ist glaube ich doch so "fest" einprogrammiert, oder?
So, nun zu dem Teil, den ich noch immer nicht ganz kapiert habe.:
Du siehst, das 3. Argument (uint16_t angle) ist eine Ganze Zahl,Integer.
Deshalb kannst du nicht schreiben ....,(obstacle_left=false),.... (wäre ja sowieso eine Zuweisung, kein Vergleich)
Ok, das leuchtet mir jetzt ein, thx!
Das machst du mit:
setMotorDir(uint8_t left_dir, uint8_t right_dir); Wann bzw. wo muss ich das einbauen? Hier:
// Hindernis links
if(obstacle_left){
setMotorDir(30,60);
//rotate(50, RIGHT, (obstacle_left = false), true); // dreht sich so lange bis der linke Sensor kein Hinderniss mehr hat
}
Also, ich verstehe (eigentlich) ganz gut was du meinst, aber ich weiß noch nicht, wie bzw. wo ich die "setMotorDir(uint8_t left_dir, uint8_t right_dir);" Funktion und "moveAtSpeed(uint8_t desired_speed_left, uint8_t desired_speed_right)" einsetzten soll.
Sorry, bin doch noch sehr im Anfangsstadium ;-)
Beste Grüße
Crystal Eye
Hallo Crystal Eye,
zu 2.:
das Problem ist jicht die Zeitdauer, sondern, dass du mit startStopwatch1() die Stoppuhr erstmal starten musst. Diese Zeile hast du auskommentiert.
zu 3.:
Richtig, das ist zwar nicht programmiert, sondern direkt auf der Platine angeschlossen.
Zum Teil mit dem Rotieren: (eventuell erkläre ich hier sachen, die du schon lange kennst)
bei der funktion rotate übergibst du vier Argumente:
1. Gewünschte Geschwindigkeit
2. Richtung (Rechts oder Links)
3. Winkel
4. blocking oder nicht
da du ja solange rotieren willst, wie du ein Hindernis erkennst, kennst du ja den Winkel nicht, was du aber für rotate müsstest.
Der RP dreht sich ja, wenn eine Raupe vorwärts, die andere rückwärts dreht.
Mit setMotorDir(FWD,BWD); kannst du eine Rechtsdrehung einstellen. Der RP bewegt noch nicht.
Anstelle setMotorDir() kannst du auch changeDirection(Right); schreiben.
Damit der RP sich bewegt, befiehlst du: moveAtSpeed(60,60);
Jetzt drehen beide Raupen mit 60, links vorwärts, rechts rückwärts. Das Gibt eine Rechts-Rotation an Ort.
Sind die Geschwindigkeiten rechts und links nicht gleich, dreht er nicht mehr an Ort, sondern fährt ein Wenig.
Mit einer while - Anweisung, lässt du den RP solange mit der gewünschten Geschwindigkeit drehen, bis du keine Obstacles mehr hast.
Irgendwie sowas ähnliches:
if(obstacle_left){ //wollen wir rechts drehen
stop(); //mal anhalten
setMotorDir(FWD,BWD); //Rechtsdrehung einstellen
while (obstacle_left){ //solange wir das Hindernis haben
moveAtSpeed(80,80);//Geschwindigkeit einstellen
task_motionControl();//Motoren Starten
}
stop(); //dann wieder anhalten, sonst wird moveAtSpeed(); beibehalten, glaube ich zumindest =)
} else if (obstacle_right){
//......
}
Hoffe, du verstehst wie ich es meine. Nochmehr hoffe ich, dass meine Überlegungen aber auch richtig sind =)
MfG
Filou
Crystal Eye
10.08.2011, 00:51
Halllo Filou89,
zu2.:
ok, verstehe;-) = blöder Fehler, wieder einmal hehe
Jup, die rotate-Funktion verstehe ich schon (ok, bis auf das blocking <= Wird hier die Schleife z.B. angehalten?)
zum Hindernis-Teil:
An Hand deines Beispiels verstehe ich es jetzt! - Ich hatte den zusammenhang nicht ganz verstanden ;-), aber jetzt PERFEKT!
Von Dir kann man sehr gut lernen. Du erklärst es richtig gut! Wird bestimmt mehreren hier helfen! DANKE dafür!
Das Prinzip ist verstanden. Jetzt versuche ich es selbst mal, und werde gleich meine Ergebnisse/Erkenntnisse schildern.
Beste Grüße
Crystal Eye
Danke, danke
Ich tu was ich kann.
Das mit dem Blocking geht bei mir auch noch nicht so. Wollte mal während dem fahren immer ausgaben über die Schnittstelle zum PC machen. Hab ich aber nicht geschafft.
eventuell hast du da ja etwas gelesen, das ich nicht gesehen habe.
MfG
Filou
radbruch
10.08.2011, 00:58
Irgendetwas war mal mit dem Stop() nicht so einfach zu lösen:
https://www.roboternetz.de/community/showthread.php/49623-Bumper-betätigt-RP6-ignoriert-moveAtSpee-Befehl
Crystal Eye
10.08.2011, 01:27
Also ich habe es abgeändert. Der Robby erkennt das Hinderniss und rotiert schön, jedoch hört er nicht mehr auf. Dann hat ja radbruch den Link gepostet, mit dem Stop. Ich habe mir den Durchgelesen & nicht alles verstanden aber dann habe ich das mit der move - Funktion versucht.
Der folgende Code beinhaltet die "Stop();" - Funktion:
if(obstacle_left){ //wollen wir rechts drehen
stop(); //mal anhalten
setMotorDir(FWD,BWD); //Rechtsdrehung einstellen
while (obstacle_left){ //solange wir das Hindernis haben
moveAtSpeed(80,80); //Geschwindigkeit einstellen
task_motionControl(); //Motoren Starten
}
stop(); //dann wieder anhalten, sonst wird moveAtSpeed(); beibehalten, glaube ich zumindest =)
}
Und dieser die move(); - Funktion:
if(obstacle_left){ //wollen wir rechts drehen
stop(); //mal anhalten
setMotorDir(FWD,BWD); //Rechtsdrehung einstellen
while (obstacle_left){ //solange wir das Hindernis haben
moveAtSpeed(80,80); //Geschwindigkeit einstellen
task_motionControl(); //Motoren Starten
}
move(0,FWD,0,BLOCKING); //Stop
mSleep(1500); //dann wieder anhalten, sonst wird moveAtSpeed(); beibehalten, glaube ich zumindest =)
}
Habe ich da ein fehler im Code, oder warum hört er nicht auf zu drehen... der dreht Kreise wie wild ;-)
Beste Grüße
Crystal Eye
radbruch
10.08.2011, 01:30
while (obstacle_left){
obstacle_left wird vom task_motionControl() nicht aktuallisiert.
Crystal Eye
10.08.2011, 01:45
Ok, aber ich rufe doch immer die task_motionControl() auf (im Hauptprogramm = task_RP6System();) auf, oder?
Oder stehe ich gerade auf dem Schlauch?
radbruch
10.08.2011, 01:54
Das macht task_RP6System:
// System control routine
/**
* Calls all important system tasks.
*/
void task_RP6System(void)
{
task_ADC();
task_ACS();
task_Bumpers();
task_motionControl();
}
Du willst drehen und gleichzeitig das ACS auswerten. Also musst du auch beide Tasks ausführen:
while (obstacle_left){ //solange wir das Hindernis haben
moveAtSpeed(80,80); //Geschwindigkeit einstellen
task_motionControl(); //Motoren Starten
task_ACS(); //ACS auswerten
}
ungetestet
Crystal Eye
10.08.2011, 02:03
Ach, jetzt verstehe ich was Du mit...
while (obstacle_left){
obstacle_left wird vom task_motionControl() nicht aktuallisiert. ...meinst. Ist ja i-wie klar jetzt. Ich habe schon überlegt, wie bekomme ich das task_motionControl() dazu die obstacle(s) zu aktuallisieren... OMG
*Sorry*
Crystal Eye
Nachtrag:
Da ich mit Eurer Hilfe es geschafft habe Hindernissen noch besser auszuweichen, hier das "Beweisvideo" in meinem Youtube Kanal ;-)
http://www.youtube.com/user/Robottechnik90
Mal sehen wann ich mich dann an die LED´s mache...
Beste Grüße
Crystal Eye
danimath
10.08.2011, 16:23
Klasse Video! BTW: mein zufäliges-Fliehen (https://www.roboternetz.de/community/threads/54390-zuf%E4lliges-Fliehen?p=521250#post521250) ist auch fertig. Leider weiß ich (noch) nicht wie ich ein Video herstelle und hier zeigen kann (Smartphone wackelt zu sehr, und zu einem youtube-Account kann mich noch nicht durchringen).
viele Grüße
Andreas
Crystal Eye
10.08.2011, 16:33
Das zufällige Fliehen hört sich super interessant an, und funktioniert auch gut!
Also, die Videos mache ich über eine Lumix TZ10. Die macht super aufnahmen.... HD!
Wenn ich nicht so eine schnelle Internet - Verbindung hätte (VDSL 50), könnte ich diese Sachen wohl kaum hochladen. 300 MB (6M)...
youtube-Account kann mich noch nicht durchringen) Warum?
Beste Grüße
Crystal Eye
danimath
10.08.2011, 16:37
Warum?
Ich bin in so viel Foren und Netzwerken unterwegs, dass ich so schon mit Spam zugeballert werde. Und für zwei/drei Videos? (OK - das ist jetzt off topic ;))
viele Grüße
Andreas
Das zufällige Fliehen hört sich super interessant an, und funktioniert auch gut!
Also, die Videos mache ich über eine Lumix TZ10. Die macht super aufnahmen.... HD!
Wenn ich nicht so eine schnelle Internet - Verbindung hätte (VDSL 50), könnte ich diese Sachen wohl kaum hochladen. 300 MB (6M)...
Was glaust Du warum ich mir so etwas bei 574 kB ert gar nicht anschaue. :-( Angeblich kommt meine Adresse im Oktober ans VDSL Netz?
Gruß Richard
Crystal Eye
10.08.2011, 18:17
Was glaust Du warum ich mir so etwas bei 574 kB ert gar nicht anschaue. :-( Angeblich kommt meine Adresse im Oktober ans VDSL Netz?
Kann ich gut verstehen. Was ist wenn Du die Qualität des Videos anders einstellst? Obwohl ich muss sagen, dass die Youtube - Server schon manchmal etwas langsam sind. Somit habe selbst ich nicht immer das Vergnügen eines ruckelfreien videos ;-)
Beste Grüße
Crystal Eye
Crystal Eye
28.08.2011, 18:14
Hallo Community,
leider hatte ich die letzte Zeit wenig Zeit für meinen RP6, jedoch soll sich das jetzt ändern.
Eine Frage, kennt sich jemand mit dem Asuro Ultraschallsensor von AREXX aus? Der wird ja nicht zusammengebaut geliefert. Jetzt meine Frage, wie bekomme ich den jetzt an meinen RP6? Wie baue ich das Ding ordnungsgemäß zusammen und wie schließe ich es richtig an, und wo?
Ich besitze die Erweiterungsplatine und die M32, kann mir jemand einen Rat geben, wie man das am besten angeht?
Hat jemand das Ding auch an seinem RP6? - Vielen Dank!
Beste Grüße
Crystal Eye
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.