war ne idee da ich ein altes Auto hab wo der Servo für die Lenkung Defekt ist
war ne idee da ich ein altes Auto hab wo der Servo für die Lenkung Defekt ist
An Radbruch!
Hi,
das Demoprogram zur Ansteuerung von Servos habe ich soweit verstanden. Da geht es ja drum ein Positives Signal zu senden aber ich möchte eines empfangen. Wie geht das? ( Mit den gleichen Ports: SCL, SDA) Der Empfänger dessen Signal hier ausgewertet werden soll sendet ganz normale Servo Impulse. Mir geht es eben nur darum zu wissen wie ich dass Empfängersignal auswerten kann.
Danke!!
Nichts existiert durch sich allein!
Bild hier
Hallo
Schon klar, dass du die Impulslängen der Servosignale des RC-Empfängers messen und auswerten willst. Aber wenn du kapiert hast, wie die Impulse in der ISR erzeugt werden, ist der Schritt zur Impulslängenmessung mit der selben ISR nicht mehr weit:
https://www.roboternetz.de/phpBB2/vi...=356247#356247
bzw. wird hier der Code in einer Timer0-ISR verwendet und ist deshalb nicht mit der RP6-Lib verträglich. Eine Kombination mit der Timer1-Overflow-ISR wäre der optimale Kompromiss:
https://www.roboternetz.de/phpBB2/vi...=328824#328824
Damit geht dann das:
Bild hier
http://www.youtube.com/watch?v=A_GYUeFAgY8
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!
Hallo nchmal,
Ich habe mir gestern die oben verlinkte Fernsteueranlage von Conrad gekauft. Sie funktioniert wunderbar und auch das Fernsteuerprogramm von Radbruch läuft super. Nur wollte ich auch mal ein "eigenes" Program schreiben um den RP6 fernsteuern zu können. Es funktioniert leider nicht so wie ich es mir vorgestellt hatte. Deswegen brauche ich noch ml Hilfe!!
Undzwar hatte ich das Teilprogramm um die Signale auszulesen von Radbruch. ( In dem Program werden Werte von SCL und SDA ausgegeben)
Dieses habe ich ein wenig gekürzt und wollte mithilfe einer Ergänzung erreiche, dass die Signalwerte in Motorbefehle umgewandelt werden. Doch wenn ich das Program starte und die Fernsteuerrung anschalte macht der RP6 was er will. Manchmal dreht sich die rechte Kette dann wieder die Linke ohne das ich es beeinflussen kann. (Ein Hardware Problem liegt definitiv nicht vor, weil das rb-programm ja tadellos funktioniert.)
Noch was zu den Variablennamen: Ich habe die absichtlich umbenannt, weil ich jeden Motor einzelnd ansteuern will. (pwrr= rechter Motor, pwrl= linker Motor.)
Die anderen Variablen(y,x,c,v) Sind als Eingrenzung gedacht, damit man die ausgewerteten Signale auch VERWERTEN kann. Ich glaube allerdings nicht, dass das Problem daher kommt. Denn ich habe schon ein Program zum einlesen der Variablen rc_input... laufen lassen und die Eingrenz-Variaben danach ausgerichtet.
Hier ist nun der Code: (mir ist es wichtig die orginal RP6.h Lib zu verwenden, deshalb benutze ich auch nicht Radbruchs Programm mit der rb-Lib als Ansatz.)
Diejenigen von euch deMir helfen wollen und eine eigene Fernsteuerung besitzen können das Programm ja mal ausprobieren und rumprbieren. Ich bin wirklich dankbar wenn ihr mir helfen könnt.Code:#include "RP6RobotBaseLib.h" volatile uint8_t rc_input_pwrr=26, rc_input_pwrl=26; int main(void) { initRobotBase(); TIMSK |= (1 << TOIE1); // Die Timer1 Overflow-ISR zur Signalauslesung powerON(); uint8_t y=29; uint8_t x=26; uint8_t c=24; uint8_t v=28; while(1) { if (rc_input_pwrl>y ) {changeDirection(BWD); while (rc_input_pwrl<y) {moveAtSpeed(0,60);}} if (rc_input_pwrl<x ) {changeDirection(FWD); while (rc_input_pwrl>x) {moveAtSpeed(0,60);}} if (rc_input_pwrr<c ) {changeDirection(BWD); while (rc_input_pwrl<c) {moveAtSpeed(60,0);}} if (rc_input_pwrr>v ) {changeDirection(FWD); while (rc_input_pwrl>v) {moveAtSpeed(60,0);}} task_motionControl(); } return 0; } ISR (TIMER1_OVF_vect) // RC-Signale an SCL und SDA messen { static uint16_t rc_temp_pwrl=0; static uint16_t rc_temp_pwrr=0; if (PINC & 1) rc_temp_pwrl++; else if (rc_temp_pwrl) { rc_input_pwrl=rc_temp_pwrl-1; rc_temp_pwrl=0; } if (PINC & 2) rc_temp_pwrr++; else if (rc_temp_pwrr) { rc_input_pwrr=rc_temp_pwrr-1; rc_temp_pwrr=0; } }
Nichts existiert durch sich allein!
Bild hier
Hallo
Bei x/y stimmen die > und < nicht. Wäre diese Abfrage nicht besser?
(ungetestet, drehen mit beiden Motoren geht so aber auch nicht)Code:if (rc_input_pwrl>y ) { changeDirection(BWD); pwr_l=60; } else if (rc_input_pwrl<x ) { changeDirection(FWD); pwr_l=60); } else pwr_l=0; if(pwr_l || pwr_r) moveAtSpeed(pwr_l, pwr_r); else stop();
Schön dass es quasi auf Anhieb funktioniert ;)
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!
Hi,
Die Werte für x und y stimmen schon. Die sind nur anders weil ich Die Laufrichtung der Servos geändert habe, aber deine Anregung habe ich umgesetzt und folgendes ist dabei rasgekommen:
Funktiniert ganz ausgezeichnet =D>Code:#include "RP6RobotBaseLib.h" volatile uint8_t rc_input_pwrr=26, rc_input_pwrl=26, rc_input_schalt; int main(void) { initRobotBase(); TIMSK |= (1 << TOIE1); // Die Timer1 Overflow-ISR zur Signalauslesung powerON(); setACSPwrHigh(); setLEDs(0b111111); uint8_t y=21; uint8_t x=29; uint8_t c=22; uint8_t v=29; uint8_t pwr_l=0; uint8_t pwr_r=0; void acsStateChanged(void) { if(!obstacle_left && !obstacle_right) { move(160, FWD, DIST_MM(50), true); } while(true) { if(!obstacle_left && !obstacle_right) { move(160, FWD, DIST_MM(50), true); } else { if(obstacle_right) { rotate(160, LEFT, 2,true); } else { while((obstacle_left && obstacle_right) || obstacle_left) { rotate(160, RIGHT, 2,true); } } } task_Bumpers(); if(getBumperLeft() && getBumperRight()) // Beide Bumper { move(160, BWD, DIST_MM(30), true); rotate(160, LEFT, 35,true); } if(getBumperLeft()) // Bumber Links { move(160, BWD, DIST_MM(30), true); rotate(160, RIGHT, 25,true); } if(getBumperRight()) // Bumber Rechts { move(160, BWD, DIST_MM(30), true); rotate(160, LEFT, 25,true); } mSleep(10); } } while(1) { task_motionControl(); task_ACS(); if (rc_input_schalt>x) // Umschalten auf Autopilot { while (rc_input_schalt>x) { ACS_setStateChangedHandler(acsStateChanged); // ACS Event Handler registrieren } } if (rc_input_pwrr<17 && rc_input_pwrl<17 && rc_input_pwrr>32 && rc_input_pwrl>32) { stop(); } if (rc_input_pwrr<c && rc_input_pwrl<y) { while (rc_input_pwrr<c && rc_input_pwrl<y) { rotate(60, LEFT, 1, true); } } if (rc_input_pwrr>v && rc_input_pwrl>x) { while (rc_input_pwrr>v && rc_input_pwrl>x) { rotate(60, RIGHT, 1, true); } } if (rc_input_pwrr<c ) { changeDirection(FWD); pwr_r=60; } else if (rc_input_pwrr>v ) { changeDirection(BWD); pwr_r=60; } else pwr_r=0; if (rc_input_pwrl<y ) { changeDirection(BWD); pwr_l=60; } else if (rc_input_pwrl>x ) { changeDirection(FWD); pwr_l=60; } else pwr_l=0; if(pwr_l || pwr_r) { moveAtSpeed(pwr_l, pwr_r); } else stop(); } return 0; } ISR (TIMER1_OVF_vect) // RC-Signale an SCL und SDA messen { static uint16_t rc_temp_pwrl=0; static uint16_t rc_temp_pwrr=0; static uint16_t rc_temp_schalt=0; if (PINC & 1) rc_temp_pwrl++; else if (rc_temp_pwrl) { rc_input_pwrl=rc_temp_pwrl-1; rc_temp_pwrl=0; } if (PINC & 2) rc_temp_pwrr++; else if (rc_temp_pwrr) { rc_input_pwrr=rc_temp_pwrr-1; rc_temp_pwrr=0; } if (PINA & 16) rc_temp_schalt++; else if (rc_temp_schalt) { rc_input_schalt=rc_temp_schalt-1; rc_temp_schalt=0; } }
Nichts existiert durch sich allein!
Bild hier
Glückwunsch. Das Auswerten der RC-Signale hast jetzt echt gut im Griff. Die Umschaltung zwischen Autopilot und Fernsteuerung ist eine prima Idee.
Bild hier
Atmel’s products are not intended, authorized, or warranted for use
as components in applications intended to support or sustain life!
Lesezeichen