Vielen Dank auch vom danimath!
viele Grüße
Andreas
Vielen Dank auch vom danimath!
viele Grüße
Andreas
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 anschauen.
Eine Übersicht der Pinbelegung hat Dirk zusammengestellt:
https://www.roboternetz.de/community...s-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...l=1#post453061
Gruß
mic
Bild hier
Atmel’s products are not intended, authorized, or warranted for use
as components in applications intended to support or sustain life!
Ganz viele Infos zum RP6 findest du auch im RN-Wissen.
Wenn du die Led's am Sensorpanel Befestigen willst, findest du die Schemas auf der Arexx-RP6 Webseite
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!
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
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:
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"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; }
Beste Grüße
Crystal Eye
Wer braucht Fenster, um an einem Rechner zu arbeiten?
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
Du siehst, das 3. Argument (uint16_t angle) ist eine Ganze Zahl,Integer.Code: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(); }
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.
[Edit]Oder changeDirection(LEFT/RIGHT); [/EDIT]
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.
Hallo Filou89,
danke für die Hinweise!
1.
Das ist mir jetzt wirklich peinlich, das hatte ich schonmal richtig, das habe ich jetzt auch sofort verbessert/ausgebessert.mit task_RP6System(); rufst du alle anderen Tasks auch auf. Du machst das also 2 mal.. (langsam)
2.
StimmtfahrenFunktion();
if (GetStop...>3500) wirst du garnie haben, da sie nirgends im Programm gestartet wurde. (Hast du sicher aus der Anleitung kopiertAber auch hier ist es nicht mehr aktuell. Ich hatte die zeit auf 500 gestellt, besser?
3.
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?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.
So, nun zu dem Teil, den ich noch immer nicht ganz kapiert habe.:
Ok, das leuchtet mir jetzt ein, thx!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)
Wann bzw. wo muss ich das einbauen? Hier:Das machst du mit:
setMotorDir(uint8_t left_dir, uint8_t right_dir);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.Code:// 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 }
Sorry, bin doch noch sehr im Anfangsstadium
Beste Grüße
Crystal Eye
Wer braucht Fenster, um an einem Rechner zu arbeiten?
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:
Hoffe, du verstehst wie ich es meine. Nochmehr hoffe ich, dass meine Überlegungen aber auch richtig sind =)Code: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){ //...... }
MfG
Filou
Lesezeichen