Multiwii und xBee

Nitram4

Neuer Benutzer
#1
Hallo Leute,

ich hab hier ein kleines Problem: Ich baue mir zur Zeit einen Quadrocopter, der funktioniert auch ganz gut, nur ich hab immer probleme mit der fernsteuerung. Und da ich noch 2 xBee pro hier rumliegen hab, kam mir die frage: kann man nicht einfach die xbees als fernsteuerung nehmen? was muss ich da ggf. in der software ändern?

Schonmal danke für eure Antworten!
Gruß,
Martin
 

konus123

Erfahrener Benutzer
#2
hi,
na wenn du mit deinem Copter nur im Netzwerk fliegen willst geht das bestimmt. :)

nee ehrlich ein xbee ist doch nur für die Anbindung der fc mit dem rechner.

Alex
 

kritzelkratzel

Erfahrener Benutzer
#3
Ich denke, mit zwei xbee's kann man schon eine Menge machen. Hier mal ein Beispiel aus meiner Prä-FPV Zeit:

http://letsmakerobots.com/node/26860

Speziell das Video meine ich. Der Trick ist, die eine xbee so zu programmieren, dass permanent die Stellungen des Joysticks ausgelesen werden. Das macht die xbee völlig autonom. Die zweite xbee nimmt dann die Signale auf und sendet sie per UART an einen Prozessor, in meinem Falk der Parallax Propeller. Der macht dann die PWM für die Motoren.
 

ernieift

Erfahrener Benutzer
#4
Hallo Martin,
aktiviere einfach serial (oder war es rcserial) in der config. Dann kannst Du mit dem normalen Protokoll die rc-Kanäle schreiben. Ich habe mal die multiwiiconfig dafür umgeschrieben. Ging gut, ist also möglich.
Gruß
Ernieift
 

Nitram4

Neuer Benutzer
#5
Hallo ich bins nochmal.
Erstmal viielen Dank für eure Antworten:)!! So ganz hab ich des aber noch nicht verstanden.
Ich glaube ich habe mich da ein bisschen zu mickrig ausgedruckt...
Mein Plan ist es, einen Arduino mit xBee in eine alte fernsteuerung zu bauen, so dass der Arduino permanent die Steuerknüppel ausließt und die Daten über den xBee versendet. Den zweite xBee schließe ich an den Arduino im Quadrocopter an. Das Problem hier ist jetzt es zu schaffen das der Quadrocopter etwas mit den daten anfangen kann. Hat da jemand ne idee?:D
Liebe Grüße,
Martin

PS: Ernieift, kannst du das nochmal genauer erklären, was meinst du mit dem "normalen Protokoll"? Dankeschön!
 

kritzelkratzel

Erfahrener Benutzer
#6
Also für die Fernsteuerung brauchst du keinen Arduino. Wie schon gesagt - die XBee hat mehrere analoge und digitale Eingänge und man kann sie so programmieren, dass diese permanent z.B. alle 10ms ausgelesen werden. Dann rotzt dir diese XBee ständig die Daten rüber und die zweite XBee fängt sie wieder auf.

Was die 2. Seite deines Problems betrifft - da muss ich leider passen.
 

ernieift

Erfahrener Benutzer
#7
Mit normalem Protokoll meine ich die Kommunikation von multiwiiconfig. Die fängt mit "$" glaub ich an. Danach kommt ein Befehl + Daten und eine Prüfsumme. Die configsoftware schreibt nur eepromdaten und liest meistens Register aus. Es gibt aber auch die Möglichkeit die rc-Daten zu schreiben. Im Netz liegt irgendwo eine PDF zum protokoll. Du brauchst also nur die Daten vom xbee zu lesen und mit einem kleinem arduino aufzubereiten. Du kannst natürlich auch gleich einen ppm Empfänger vorgaukeln. Blöd wäre nur das wandeln in pulslängen plus damit verbundenen jitter. Außerdem spart die Aktivierung von rcserial eine Menge Speicher beim compilieren.
 

ernieift

Erfahrener Benutzer
#8
Habe nochmal nachgesehen,
das Kommando zum Glück heißt 'MSP_SET_RAW_RC'. Der Wert ist 200. In der Multiwiiconfig.pde kannst Du einfach das Auslesen der rc-kanäle ausblenden und statt dessen folgendes in die draw() routine einfügen.
Damit habe ich über Bluetooth meinen Copter laufen lassen. Bin natürlich nicht geflogen. Mit der Mouse an den Reglern schieben ist nicht praktikabel. Eigentlich sollte daraus mal eine App fürs iphone werden. Fliegen wollte ich mit den RN-17x von roving Networks. Die haben aber einen firmwarebug bei dem sich der stream nach einer Weile aufhängt. Mit xbee kann das was werden.

Code:
    if ((time-time3)>40 && ! toggleRead && ! toggleWrite) {
      sendRequestMSP(requestMSP(MSP_ATTITUDE));

     // MSP_SET_RAW_RC
      rcThrottle = rcStickThrottleSlider.value(); rcRoll = rcStickRollSlider.value(); rcPitch = rcStickPitchSlider.value(); rcYaw = rcStickYawSlider.value();
      rcAUX1 = rcStickAUX1Slider.value(); rcAUX2 = rcStickAUX2Slider.value(); rcAUX3 = rcStickAUX3Slider.value(); rcAUX4 = rcStickAUX4Slider.value();
      int j;
      payload = new ArrayList<Character>();
      j = round(rcRoll); payload.add(char( j%256 )); payload.add(char( j/256 ));
      j = round(rcPitch); payload.add(char( j%256 )); payload.add(char( j/256 ));
      j = round(rcYaw); payload.add(char( j%256 )); payload.add(char( j/256 ));
      j = round(rcThrottle); payload.add(char( j%256 )); payload.add(char( j/256 ));
      j = round(rcAUX1); payload.add(char( j%256 )); payload.add(char( j/256 ));
      j = round(rcAUX2); payload.add(char( j%256 )); payload.add(char( j/256 ));
      j = round(rcAUX3); payload.add(char( j%256 )); payload.add(char( j/256 ));
      j = round(rcAUX4); payload.add(char( j%256 )); payload.add(char( j/256 ));
      sendRequestMSP(requestMSP(MSP_SET_RAW_RC,payload.toArray( new Character[payload.size()]) ));       
      time3=time;
    }
Na dann viel Erfolg
ernieift
 

Nitram4

Neuer Benutzer
#9
Hallo Leute!

jetzt kapier ich wenigstens mal ein bisschen was! Ich hab mich jetz mal über das msp protokoll informiert. Ich erzähl grad mal was ich herausgefunden hab: Das Protokoll fängt immer mit "$M" an, danach kommt ein "<" oder ein ">". Nun kommt ein Byte das die länge des payloads angibt. danach kommt ein byte das den Typ der Nachricht angibt, dann kommt der payload selber und dann noch eine prüfsumme. Leide steht nirgends wie die daten im payload stehen! ein kleines beispiel: wenn ich zwei steuerknüppel auslesen möchte, was steht im payload? stehen da für jedes poti zahlen? Wie groß sind diese zahlen? wie werden sie voneinander abgegrenzt? ich tu mich damit grad wahnsinnig schwer und ich bin am verzweifeln...
Ich brauch nochmal eure hilfe:???:

Gruß,
Martin
 

ernieift

Erfahrener Benutzer
#10
Na ganz einfach,
"$M<" ist der Header fürs Übertragen des Kommandos zum Multiwii. Dann kommt die Länge der Daten. Danach das Kommando und falls nötig noch Parameter. Am Ende noch die Prüfsumme. Wenn Du also die Servokanäle mit 1500 schreiben willst, dann sollte die Sequenz etwa so aussehen:
0x24 0x4d 0x3c len 0xc8 0x0c 0x05 0x0c 0x05 0x0c 0x05 0x0c 0x05 0x0c 0x05 0x0c 0x05 0x0c 0x05 0x0c 0x05 crc
wobei 0xcrc die XOR-Prüfsumme von len bis zum vorletzten Byte ist (len und crc spare ich mir mal). 16 Bit-Daten immer LSB,MSB.
Das ganze muss mit 115200 Baud an einen seriellen Port geschickt werden. Als Antwort kommt ein "$M>". Das kannst Du aber ignorieren. Für mehr Information versuch mal die Serial.ino im Multiwii zu verstehen. Hilft manchmal mehr als eine Doku.
 

Nitram4

Neuer Benutzer
#11
Hallo Ernieift,
vielen vielen Dank für die Erklärung und auch den Code für die Config!! Der is echt super!!!:D
Wenn ich noch fragen hab, lass ich es euch wissen:)

Martin
 

Nitram4

Neuer Benutzer
#12
Hey,

es tut mir leid aber ich hab wohl doch noch ne frage: Wenn man sich aus deiiner Sequenz (0x24 0x4d 0x3c len 0xc8 0x0c 0x05 0x0c 0x05 0x0c 0x05 0x0c 0x05 0x0c 0x05 0x0c 0x05 0x0c 0x05 0x0c 0x05) nur den Payload ansieht is der ja für 8 Kanäle (throttle, pitch, roll, yaw, aux 1, aux 2, aux 3, aux 4). Folgich muss "0x0c 0x05" ja im prinzip 1500 sein (kommt ja 8 mal vor). Wenn ich 1500 in hexadezimal umrechne kommt nur schrott raus. Wie kommst du auf "0x0c 0x05"? Tut mir echt leid!:???:

Martin
 

ernieift

Erfahrener Benutzer
#13
Das liegt nur daran, dass ich das zwischen tür und angel geschrieben habe. Natürlich sind 1500=0x5dc und folglich in der Sequenz 0xdc 0x05 (wegen LSB,MSB).
Gruss
ernieift
 

ernieift

Erfahrener Benutzer
#16
Hallo,
LSB = least significant bit/byte, also hier das niedrigstwertige Byte.
MSB = most significant bit/byte, das höchstwertige Byte.
Das bedeutet für Dich, dass Du alle Mehrbytedaten andersherum übertragen musst nämlich "Little Endian".
"Little Endian" = littlest end goes first.
 

ArduPros

Neuer Benutzer
#17
Hallo zusammen,

Ich arbeite an einem ähnlichen Projekt, denn auch ich will meinen Quadrokopter mit einem Arduino Uno über 2 XBees steuern.
Dann bin ich auf die MultiWii-Software gestoßen, doch mir fällt es ziemlich schwer diese an die XBees anzupassen...

Könnte mir bitte jemand weiterhelfen?

Vielen Dank schon mal im Vorraus ;)
 

ernieift

Erfahrener Benutzer
#18
Falls noch mehr daran interessiert sind, wie man die Multiwii über eine serielle Verbindung fernsteuern kann, hier mal eine gepachte Fassung der Multiwiiconf.pde. Die Version ist schon etwas älter und für 2.1 geschrieben. Die paar Zeilen Code kann man aber auch in die 2.2er einbauen. Wichtig ist das Kommando MSP_SET_RAW_RC.
In der Multiwii-Software muss nur RCSERIAL auskommentiert werden, dann klappt es schon.

Viel Spass damit
ernieift

Anhang anzeigen MultiWiiConf_2_1_RCserial.pde.zip
 
FPV1

Banggood

Oben Unten