Zum test kannst ein kabel benutzen damit kannst du ihn auch Steuern :)
Zu den Wlan Modulen kann ich dir nichts sagen du könntest aber normale Funkmodule nutzen z.b. Rn-Funk und Xbee
Druckbare Version
Zum test kannst ein kabel benutzen damit kannst du ihn auch Steuern :)
Zu den Wlan Modulen kann ich dir nichts sagen du könntest aber normale Funkmodule nutzen z.b. Rn-Funk und Xbee
Wäre es billiger ein feriges Bluetooth modul (fertiges modul inkl. Spannungsregler) zum Steuern des RP6 zu nutzen?
Wenn ja, welches Bluetooth modul?
Das ist keine Frage von "billig" ...sondern von können!
WLAN ist Ethernet ... ein Netzwerkprotokoll... und Blauzahn üblicherweise UART.. also ein ganz anderes Protokoll... da der RP6 eine UART Schnittstelle hat, bietet sich Blauzahn an... Du kannst natürlich auch ein IP-Stack auf dein RP6 proggen um den mit WLAN zu steuern. Wie gesagt.. alles eine Frage von können... :)
Es gibt übrigends auch 6-10 m lange USB Kabel. Die sparen ne Menge Hirnschmalz sag ich Dir... :D
Hier geistern diverse Beiträge zum BTM222 rum. Das ist eins was Du verwenden kannst. Also "kannst" im Sinne von können... Ich würde es aber lassen denn die Dinger sind grottenlahm - gemessen an 500kbaud an USB. Da kann man auch gleich IRDA mit Softuart nehmen, das hat der RP6 quasi onboard...Dann lieber nen richtiges bidirektionales Funkmodul mit 200m Reichweite. Wirklich Sinn macht Blauzahn nur wenn man z.B. eine gute GPS-Maus mit Blauzahn hat oder ein PDA als "Brain" zum steuern bzw. als Interface verwendet. In Wohnungen ist GPS aber meist zu ungenau und der RP6 kaum geländegängig... bleibt also nur der PDA...
LG Rolf
Ich bin so gemein und gebe euch mal einen winzig kleinen Ausblick auf die Neuerungen der nächsten Version. (Das wird 2.0)
Ich werde hier jetzt regelmäßiger neue Infos zu RP6 Remotrol 2 bereitstellen.
Den Anfang macht ein sehr nützliches neues Feature: Der Einrichtungsassistent.
Der Einrichtungsassistent hilft euch beim Anpassen der Software an euren RP6 (und die Erweiterungen). Weiterhin kann er auch selbstständig die passende Firmware flashen. :)
Weitere Informationen gibt es für Beta-Tester in meinem Forum (--> 1. Post)
Achja, da Version 2.0 quasi komplett neu ist, werde ich vermutlich noch einige neue Beta-Tester brauchen.
Wer also Lust und Zeit hat, sich mit der unfertigen Software und ihren Fehlern zu beschäftigen und aktiv an der Entwicklung teilzunehmen, darf sich gerne bei mir melden.
Bis die neue Version als Beta verteilt wird, vergeht zwar noch einige Zeit, aber es gibt auch so viel zu diskutieren.
Liebe Grüße,
Fabian
Dann muss ich mich mit dem TWi ja doch mal beeilen. Es geht zwar schon aber Multimaster tut es noch nicht richtig.
Ich drück dir die Daumen. LG
Kein Stress, da dürfte dir noch einiges an Zeit bleiben ;)
Bin schon sehr gespannt auf die neue Version:-)
Ich würde mich gerne wieder als BETA Tester beteiligen.
Na sicher, schau einfach regelmäßig in mein Forum, da findest du die neusten Entwicklungen. :)
Hallo.
Habe es hinbekommen meinen RP6 über Bluetooth mit meinem Notebook zu verbinden und über remotrol zu steuern.
Jetzt meine frage, kann man die verbindung überwachen?
Damit meine ich, wenn die bluetooth verbindung zum PC abbricht das der rp6 dann stehen bleibt?
Momentan ist es so, wenn ich über remotrol den rp6 fahren lasse und mitten im Fahrbetrieb die verbindung abbricht, dann fährt er trotzdem weiter.
Das will ich vermeiden.
Kann mir jemand helfen?
kann man das z.B. mit movementcommand = true abfragen ?
gruß
Nein, das geht im Moment nicht einfach mal schnell so.
Ist aber für die nächste Version geplant. Problem dabei ist eben, dass der reine Verbindungsabbruch so nicht feststellbar ist.
Der RP6 muss quasi die ganze Zeit einen Ping vom PC und wenn der aufhört bleibt er stehen.
An sich nicht schwer, allerdings unpraktisch. Meine Funkmodule können z.B. nicht gleichzeitig senden und empfangen.
Das würde dann sämtliche Datenübertragung stark einschränken (je nach Intervall des Pings).
Werde ich aber dann wohl alles einstell- und abschaltbar machen.
PS: Schön, dass es auch mit Bluetooth geht! (Habe ich nie in Frage gestellt, aber du bist glaube ich der erste, der es wirklich gemacht hat ;) )
Hi, ich hab das selbe Problemm, bei mir bricht die Verbindung schon nach 3m ab. Ist aber ein anderes Thema, das Problem ist das der RP6 einfach weiterfährt, sehr schlecht.
Wann folgt denn die nächste Version?
Kann mir irgendjemand sagen, wie die Befehle sind, die der PC für die Servosteuerung an den RP6 schickt?
Ich finde sie nicht und in einer alten Version der Remotrol finde ich nur :
#2:0:0:3:1*
2 soll wohl "Servos" heißen, die zweite Null ist die Servonummer (0 bis 7), die 3 ist hier die Servoposition (0 bis 187) und 1 die Befehlsnummer (1 bis 99 ) .
Aber auf Befehle wie diese reagieren meine Servos überhaupt nicht...
Außerdem folgendes: Um den RP6 fern zu starten muss man \s senden.
Gibt es auch ein "RP6 Reset" Befehl? \e geht nicht.
Grüße
Hallo fabqu,
einen Reset Befehl gibt es nicht soweit ich weiß, aber du musst nur die RTS-Leitung der ser. Schnittstelle kurz auf High setzen, dann wird das Programm beendet.
Gruß Thomas
Ja, danke. Hat ich schon vermutet.
ich wollte es ferngesteuert abschalten, das könnte man ja mit nen transistor machen!
Danke dir.
Könnte jemand, der die remotrol benutzt, einem gefallen tun?
Einfach den rp6 mit remotrol verbinden und ein paar servos ansteuern. Auf dem lcd des rp6 sollten dann die servo-befehle auftauchen... Wär klasse.
Danke euch
Grüße
Hey sorry, dass ich dir so lange nicht geantwortet habe, aber mein Studium hat gerade angefangen und daher habe ich nicht wirklich Zeit für was anderes ;)
Warum siehst du dir denn nicht einfach den Quellcode an, da stehen schließlich alle Befehle drin?
Habe mir übrigens was neues gegönnt, dass könnte sehr interessant werden, auch im Zusammenhang mit dem RP6:
Anhang 20278
Das ganze findet ihr hier und hier in einem deutschen Shop.
Dort hab ich natürlich zuerst gesucht. Aber leider konnte ich nix finden, liegt aber sicher auch daran, dass ich es nicht ganz durchgestiegen habe.
Könntest du mir mal das c-File nennen, in dem die Befehle (1=Fahren, 2=Servos, ...) zugeordnet werden?
Das würde ordentlich weiterhelfen. Wobei ich glaube ich schon viele Befehle über die LCD-Ausgabe rausbekommen hab, danke dafür :D
Grüße
Hier sind die entsprechenden defines:
Inwieweit die jetzt mit deiner Version übereinstimmen weiß ich natürlich nicht.Zitat:
#define CMD_SET_SPEED 1
#define CMD_SET_SERVO 2
#define CMD_SET_LEDS 3
#define CMD_SET_BEEP 4
#define CMD_SET_START_MELODY 5
#define CMD_SET_FEATURE 6
#define CMD_SET_STOP 7
#define CMD_SET_CONNECTION_SPEED 8
#define CMD_SET_MELODY 9
#define CMD_SET_ACSPOWER 10
#define CMD_SET_TEST 11
#define CMD_RESET_ID_COUNTER 99
#define SET_FEATURE_RP6 0
#define SET_FEATURE_M32 1
#define SET_FEATURE_M128 2
#define SET_FEATURE_SERVOM32 3
#define SET_FEATURE_SERVOM128 4
#define SET_FEATURE_LCDM32 5
#define SET_FEATURE_LCDM128 6
#define SET_FEATURE_SRF02 7
#define SET_FEATURE_SRF02_1 8
#define SET_FEATURE_SRF02_2 9
#define SET_FEATURE_SRF08 10
#define LEDS_RP6 0
#define LEDS_M32 1
#define TEST_LCD 0
#define TEST_BEEPER 1
#define TEST_LED 2
#define TEST_EXTERNAL_MEMORY 4
#define TEST_I2CLED 5
#define TEST_I2CMOTOR 6
#define TEST_MIC 7
#define TEST_MOTOR 8
#define TEST_BATTERY 9
#define TEST_ACS 10
#define TEST_BUMPER 11
#define TEST_LIGHTSENSOR 12
#define ACS_POWER_OFF 0
#define ACS_POWER_LOW 1
#define ACS_POWER_MED 2
#define ACS_POWER_HIGH 3
#define ANSWER_OK 1
#define ANSWER_WRONG_ID 2
#define ANSWER_GENERAL_ERROR 3
Jeah! Klasse!
Danke dir!
Eins noch: Zu Beginn (oder eigentlich egal wann) erwartet ja dein Programm einen Feature-Update, oder? Also das Programm bekommt dann gesagt, dass M128 der Master ist, dass es ein LCD am M32 hat und Servos an allen Erweiterungen etc, etc.
Bei mir ist das so ne sache und funktioniert mal, mal nicht (man merkts an den Servos. Wenn ich ihm sage, dass die Servos der M128 aktiv sind, dann gehen sie mal und mal nicht).
Ist das ein allgemeines Problem, oder mache ich da was falch?
Hier der "Feature-Befehl" , den ich sende: #6:4:1:BEFEHLSNUMMER*
Puh, ganz ehrlich, da kann ich dir so ganz spontan gar nichts zu sagen...Was für versionen benutzt du denn?
Normalerweise hat das Programm auf dem RP6 immer eine ganze Liste an Features erwartet. Eben für jedes Features was es gibt ein ja oder ein nein ;)
Hmm, das mit der Version ist so ne Sache, da kam ich irgendwann total durcheinander. Hab hier drei verschiedene (1.3 und zwei andere), hab aber dummerweise (ich Depp) die neueste, die ich von dir hatte, verändert - ohne Sicherungskopie!!!
Würdest du mir vielleicht nochmal die neue Version schicken?
Wobei das mit dem Fehler vmtl dann doch daran liegt, dass ich lieber gleich eine ganze Liste schicken sollte.
Hat nur in LabView nicht so ganz geklappt, weil man dafür solche "endlichen Automaten" benutzen muss... Bei drei endlichen Automaten ineinande wirds unübersichtlich und Fehleranfällig, daher hab ich den innersten wieder raus genommen.
Aber wann der RP6 diese Liste erhält, ist doch egal, oder?
Hallo!
Ich verwende ja auch die Remote auf dem RP6, allerdings programmiere ich auf dem PC was eigenes mit LabView...
Nun "verliere" ich irgendwie ständig bei dem Wert für den linken Lichtsensor die letzte Ziffer, der Wert springt also z.B. immer zwischen 908 und 90 hin und her (ca. im Sekundentakt) oder zwische 883 und 88 etc.
Woran kann den so was liegen?
Passiert sowohl bei BT-Verbindung wie auch bei USB-Verbindung.
Danke Euch!
Lg
Wenns mit USB auch passiert wirds wohl an deinem eigenen Programm liegen ;)
Ich check das mal... ich kanns mir halt so wenig vorstellen, da ich den Stream, der vom RP6 kommt nehme, und ihn sofort Plotte.
Integrierst du in deinem Programm über mehrere Werte, ehe du plottest, um den Mittelwert der sagen wir letzten drei Werte zu erhalten, oder plottest du alles sofort?
Wenn sofort, dann würde das zumindest einen Fehler in der Übertragung und in deinen RP6-Programmen ausschließen...
Nein, bei mir wird nichts kummuliert oder irgendwelche Schnitte gebildet.
Das, was ankommt, wird auch dargestellt.
Ja, das hab ich auch grad gemerkt: Der Stream ist fehlerfrei, aber wenn ich sage: plotte das, was hinter "Lightl:" kommt, dann geht irgendwie gern mal ne Ziffer verloren. Keine Ahnung, wie das von Statten geht :( wie gesagt, im Stream steht sie noch.
Kennt sich da vielleicht jemand mit LabView aus?
Lg
Hallo,
ich hab nich alles mit gelesen, bin also nicht auf dem neusten Stand, aber wenn du mit LabView hilfe brauchst, dann schreib mal ne PN bin eingeltich recht fit vlt kann ich dir ja helfen.
vg
Hier mal ein Foto, wie das so aussieht...
Ich habe gerade die M128 und die Base mit der Remotrol am laufen, aber die M128 bekommt nix von den Bumpern und dem ACS mit. Wenn ich das richtig sehe, dann weil es nicht im Register steht.
Register Base:
Register M128:Code:/*****************************************************************************/
// I2C Registers that can be read by the Master. Their names should
// be self-explanatory and directly relate to the equivalent variables/functions
// in the RP6Library
#define I2C_REG_STATUS1 0
#define I2C_REG_STATUS2 1
#define I2C_REG_MOTION_STATUS 2
#define I2C_REG_POWER_LEFT 3
#define I2C_REG_POWER_RIGHT 4
#define I2C_REG_SPEED_LEFT 5
#define I2C_REG_SPEED_RIGHT 6
#define I2C_REG_DES_SPEED_LEFT 7
#define I2C_REG_DES_SPEED_RIGHT 8
#define I2C_REG_DIST_LEFT_L 9
#define I2C_REG_DIST_LEFT_H 10
#define I2C_REG_DIST_RIGHT_L 11
#define I2C_REG_DIST_RIGHT_H 12
#define I2C_REG_ADC_LSL_L 13
#define I2C_REG_ADC_LSL_H 14
#define I2C_REG_ADC_LSR_L 15
#define I2C_REG_ADC_LSR_H 16
#define I2C_REG_ADC_MOTOR_CURL_L 17
#define I2C_REG_ADC_MOTOR_CURL_H 18
#define I2C_REG_ADC_MOTOR_CURR_L 19
#define I2C_REG_ADC_MOTOR_CURR_H 20
#define I2C_REG_ADC_UBAT_L 21
#define I2C_REG_ADC_UBAT_H 22
#define I2C_REG_ADC_ADC0_L 23
#define I2C_REG_ADC_ADC0_H 24
#define I2C_REG_ADC_ADC1_L 25
#define I2C_REG_ADC_ADC1_H 26
#define I2C_REG_RC5_ADR 27
#define I2C_REG_RC5_DATA 28
#define I2C_REG_LEDS 29
/**
* This very important function updates ALL registers that the Master can read.
* It is called frequently out of the Main loop.
*/
void task_updateRegisters(void)
{
if(!I2CTWI_readBusy)
{
I2CTWI_readRegisters[I2C_REG_STATUS1] = (uint8_t)(interrupt_status.byte);
I2CTWI_readRegisters[I2C_REG_STATUS2] = (uint8_t)(status.byte);
I2CTWI_readRegisters[I2C_REG_MOTION_STATUS] = (uint8_t)(drive_status.byte);
I2CTWI_readRegisters[I2C_REG_POWER_LEFT] = (uint8_t)(mleft_power);
I2CTWI_readRegisters[I2C_REG_POWER_RIGHT] = (uint8_t)(mright_power);
I2CTWI_readRegisters[I2C_REG_SPEED_LEFT] = (uint8_t)(getLeftSpeed());
I2CTWI_readRegisters[I2C_REG_SPEED_RIGHT] = (uint8_t)(getRightSpeed());
I2CTWI_readRegisters[I2C_REG_DES_SPEED_LEFT] = (uint8_t)(getDesSpeedLeft());
I2CTWI_readRegisters[I2C_REG_DES_SPEED_RIGHT] = (uint8_t)(getDesSpeedRight());
I2CTWI_readRegisters[I2C_REG_DIST_LEFT_L] = (uint8_t)(getLeftDistance());
I2CTWI_readRegisters[I2C_REG_DIST_LEFT_H] = (uint8_t)(getLeftDistance()>>8);
I2CTWI_readRegisters[I2C_REG_DIST_RIGHT_L] = (uint8_t)(getRightDistance());
I2CTWI_readRegisters[I2C_REG_DIST_RIGHT_H] = (uint8_t)(getRightDistance()>>8);
I2CTWI_readRegisters[I2C_REG_ADC_LSL_L] = (uint8_t)(adcLSL);
I2CTWI_readRegisters[I2C_REG_ADC_LSL_H] = (uint8_t)(adcLSL>>8);
I2CTWI_readRegisters[I2C_REG_ADC_LSR_L] = (uint8_t)(adcLSR);
I2CTWI_readRegisters[I2C_REG_ADC_LSR_H] = (uint8_t)(adcLSR>>8);
I2CTWI_readRegisters[I2C_REG_ADC_MOTOR_CURL_L] = (uint8_t)(adcMotorCurrentLeft);
I2CTWI_readRegisters[I2C_REG_ADC_MOTOR_CURL_H] = (uint8_t)(adcMotorCurrentLeft>>8);
I2CTWI_readRegisters[I2C_REG_ADC_MOTOR_CURR_L] = (uint8_t)(adcMotorCurrentRight);
I2CTWI_readRegisters[I2C_REG_ADC_MOTOR_CURR_H] = (uint8_t)(adcMotorCurrentRight>>8);
I2CTWI_readRegisters[I2C_REG_ADC_UBAT_L] = (uint8_t)(adcBat);
I2CTWI_readRegisters[I2C_REG_ADC_UBAT_H] = (uint8_t)(adcBat>>8);
I2CTWI_readRegisters[I2C_REG_ADC_ADC0_L] = (uint8_t)(adc0);
I2CTWI_readRegisters[I2C_REG_ADC_ADC0_H] = (uint8_t)(adc0>>8);
I2CTWI_readRegisters[I2C_REG_ADC_ADC1_L] = (uint8_t)(adc1);
I2CTWI_readRegisters[I2C_REG_ADC_ADC1_H] = (uint8_t)(adc1>>8);
I2CTWI_readRegisters[I2C_REG_LEDS] = (uint8_t)(statusLEDs.byte);
I2CTWI_readRegisters[I2C_REG_RC5_ADR] = (uint8_t)((lastRC5Reception.device)|(lastRC5Reception.toggle_bit<<5));
I2CTWI_readRegisters[I2C_REG_RC5_DATA] = (uint8_t)(lastRC5Reception.key_code);
if(I2CTWI_dataWasRead && I2CTWI_dataReadFromReg == 0)
clearInterrupt();
}
}
Stimmt das? Was muss ich denn ändern, wenn ich sowohl die beiden ACS (left, right) haben will, als auch Bumper left, Bumper Right, Bumper back left und bimper back right?Code:// I2C Read Register des I2CSlave Programms:
#define I2C_REG_STATUS1 0
#define I2C_REG_STATUS2 1
#define I2C_REG_MOTION_STATUS 2
#define I2C_REG_POWER_LEFT 3
#define I2C_REG_POWER_RIGHT 4
#define I2C_REG_SPEED_LEFT 5
#define I2C_REG_SPEED_RIGHT 6
#define I2C_REG_DES_SPEED_LEFT 7
#define I2C_REG_DES_SPEED_RIGHT 8
#define I2C_REG_DIST_LEFT_L 9
#define I2C_REG_DIST_LEFT_H 10
#define I2C_REG_DIST_RIGHT_L 11
#define I2C_REG_DIST_RIGHT_H 12
#define I2C_REG_ADC_LSL_L 13
#define I2C_REG_ADC_LSL_H 14
#define I2C_REG_ADC_LSR_L 15
#define I2C_REG_ADC_LSR_H 16
#define I2C_REG_ADC_MOTOR_CURL_L 17
#define I2C_REG_ADC_MOTOR_CURL_H 18
#define I2C_REG_ADC_MOTOR_CURR_L 19
#define I2C_REG_ADC_MOTOR_CURR_H 20
#define I2C_REG_ADC_UBAT_L 21
#define I2C_REG_ADC_UBAT_H 22
#define I2C_REG_ADC_ADC0_L 23
#define I2C_REG_ADC_ADC0_H 24
#define I2C_REG_ADC_ADC1_L 25
#define I2C_REG_ADC_ADC1_H 26
#define I2C_REG_RC5_ADR 27
#define I2C_REG_RC5_DATA 28
#define I2C_REG_LEDS 29
Letztere werden in meiner Lib so eingeführt (wie vom nil.at) :
Danke euch schon mal!Code:uint8_t getBackBumperLeft(void)
{
PORTC &= ~SL2;
DDRC &= ~SL2;
nop();
uint8_t tmp = PINC & SL2;
if(statusLEDs.LED2) {
DDRC |= SL2;
PORTC |= SL2;
}
return tmp;
}
uint8_t getBackBumperRight(void)
{
PORTB &= ~SL5;
DDRB &= ~SL5;
nop();
uint8_t tmp = PINB & SL5;
if(statusLEDs.LED5) {
DDRB |= SL5;
PORTB |= SL5;
}
return tmp;
}
Hat jemand eine Ahnung, warum, wenn man die M128 benutzt, das Einstellen vom ACS nicht mehr funktioniert?
Es ist dauerhaft auf "Low" eingestellt;
Grüße
So, ACS (letzter Beitrag hier von mir) geht jetzt.
Aber ein neues Problem: Hat jemand schon mal die Remotrol mit SRF02 verwendet?
Ich erhalte dann nur Werte um -3500 herum.
"-" ist schon mal seltsam, aber eben auch, weil sich der Wert nie groß ändert, er geht von etwa -3200 bis -3800.
Gibts da Erfahrungen? Verbesserungen?
Grüße,
Fabian
Meine beiden SRF02 klappen wunderbar, hast du es mit meiner Library versucht?
Ja, das einzige, was ich verändert habe war, in deiner features-lib “has_srf02“ auf 1 zu setzen. Die beiden änderten srf02-diner (...02_1 und ...02_2) hab ich mal auf eins, mal auf null gelegt, hat nix geändert.
Hast du denn deine SRF02 auch auf die richtige I2C-Adresse gesetzt?
Ist doch die standard-adresse, oder?
Vergleiche sie halt? Keine Ahnung was ich da damals gesetzt habe :D
Auf jeden Fall sind nicht beide standard.... ;)
und:Code:#define I2C_SRF02_ADR_1 0xE0 //Standardadresse laut Datenblatt
#define I2C_SRF02_ADR_2 0xE2
HasSRF02 = 1;
HasSRF02_1 = 0;
HasSRF02_2 = 0;
HasSRF08 = 0;
Ich habe eben nur ein SRF02, geht es dann überhaupt?
schreibe den code halt so um, dass er nur einen benutzt. Im moment wird nur der mittelwert gebildet glaube ich :)
Funzt :D
Habs einfach so gemacht:
(bitte ned meckern, ich weiß, des is echt was für Dödels - Also für mich halt)
Danke!Code:void calculateAverageDist(void)
{
SRF02_2_dist = SRF02_1_dist;
SRF02_Dist = (SRF02_1_dist+SRF02_2_dist) / 2;
}