Baubericht X525 Quadrokopter mir MultiWii SE 2.1 und GPS über I2C

Q-Man

Erfahrener Benutzer
#1
Ich möchte euch bitten diesen Baubericht zu Bewerten (weiter oben: Thema Bewerten).

Hallo Mitstreiter,

ich habe in der letzten Woche meinen X525 Bausatz von GLB (GoodLuckBuy) bekommen.
Hier werde ich alle Schritte die ich brauche bis zum Erstflug zusammenfassen und weiteren Newbies (wie mir) die Suche nach den richtigen Infos erleichtern. Das Problem ist ja meistens, das es Unmengen von Informationen gibt und man nicht weis welche man denn nun benötigt.

Da nich noch nicht fertig bin, werden die Punkte erst nach und nach eingetragen.

Es wird ein X-Copter werden.


1) Folgende Dinge habe ich als Bausatz, bzw. zusätzlich bestellt.
  • X525 V3 QuadCopter Friber Glass Folding ARF Set MWC SE Flight Control Multicopter
1x X525 V3 fordling frame
1x MWC Flight Control SE version 0.2
4x XXD 2212 KV1000 brushless motor
4x 3.17mm Shaft adaptor
4x GEMFAN Carbon Nylon 10x4.5" 1045 (2x rechts CW, 2x Links CCW) Propeller
4x Hobbywing 20A ESC
1x ESC Connect Board (Stromverteiler)
1x eine Tüte voll Schrauben

  • FTDI Basic Breakout Arduino USB-TTL 6 PIN 3.3 5V for MWC MultiWii Lite /SE
USB an Seriell. Treiber findest du hier: http://www.ftdichip.com/FTDrivers.htm


  • Crius CN-06 GPS Receiver Module
U-blox NEO-6M GPS module
seriell, 9600BAUD​

  • Crius I2C-GPS NAV Module Navigation Board
Anschluß zwischen GPS Modul und FC (Flight Controller: MultiWII SE)
Kabel sind dabei​

  • High Power LION Power 11.1V 2800mAh 35C Rechargeable Polymer Lithium Battery
Worst Case ESC + Boards: 4x20A +1A =81A
Max Amp der LiPos: 2,8Ah*35C=98A​

  • Schraubensicherungslack (Mittel)

  • Spektum DX6i
Mode 2, also Gas ist links​

  • OrangeRx R610 (Spektrum kompatibel) DSM2 6Ch 2.4Ghz Receiver (w/ Sat Port)
  • OrangeRx R100 Satellite Receiver

  • Lipo Battery Low Voltage Monitor Alarm Buzzer and LED Warning
für 2-4S Lipos, wird in den Balancer Anschluß gesteckt.
95dB Buzzer ab 3,3V einer Zelle.​


  • Devantech SRF02 Ultraschallsensor I2C

  • BlueTooth FTDI von Sparkfun



2) Des Zusammenbau des Rahmens
Ich bin dieser Anleitung gefolgt:
http://www.youtube.com/watch?v=p9oYwQyWYng
Da es hier noch viele andere Bericht gibt fasse ich mich hier kurz.

Was die Anleitung nicht zeigt, ist wie man denn die 4 Arme zwischen die Halter bekommt.
Ich habe Unterlegscheiben unter die Schrauben, die dei Kunststoff Bolzen (die den Stromverteiler und später den FC halten) von der Unterseite halten verwendet. Damit können die Ausleger zusammengeschraubt nicht mehr am Schraubenkopf vorbei.
Daher musste ich auch beim Zusammenbau der oberen und unteren Platte eine Unterlegscheibe verwenden.

Zuerst habe ich die 8 "dickeren" Imbusschrauben mit Unterlegscheiben durch das Unterteil des Rahmens gesteckt und mit Tesa fixiert. Dann legt man das ganze überkopf (Schrauben nach unten) auf den Tisch. Am besten in einen Karton (ein wenig kleiner als die höhe der Auslager mit Kufen). Das gibt mehr Stabilität.
Ob der Karton die richtige höhe hat zeigt sich wenn man jetzt versucht alle 4 Ausleger aufzustecken :) Wenn man jeden Arm von der Seite mit ein wenig Tesa auf die Bodenplatte klebt, geht es viel einfacher.
Dann kommen Unterlegscheiben und der schmale Rahmen. Dann das Oberteil (von der Seite auf der sich der Stromverteiler befindet) aufstecken, das ist eine echtes "Gefriemel". Es hilft auf jede Schraube sofort eine Mutter zu drehen. Wenn dann alle Schrauben drinnen sind, den Schraubensicherungslack aufbringen und alle Schrauben handfest andrehen. Die "fixen" in der Mitte etwas fester als die "beweglichen" im Schanier.
Die Schanierschrauben eine Umdrehung lösen. Dann die hintere Schraube soweit schrauben bis der Arm sich mit ein wenig Kraft (300g / 3N) bewegen läst. Dann die Schanierschraube wieder andrehen bis man merkt, das der Wiederstand steigt.

Gelenk.jpg

2.1 ESC
Die Motorregler haben wie die Motoren glücklicherweise den goldenen 3,5mm Stecker/Buchse.
Der Motor wird mit einem Kabel an den ESC angeschlossen, damt man weis wie weit man den ESC Richtung Mitte montieren kann. Die ESCs sind unter den Schienen montiert. Ich habe alles mit Kabelbindern befestigt.

Arm.jpg


Die Propeller noch nicht installieren!


3) MultiWii
Hier mal ein eigenes Bild, das schon einmal die I2C Anschlüsse zeigt, dazu aber später.

Wii.jpg

3.1) Software für den FC
Folgende Software habe ich herunter geladen:

Alle Pakete entzippen.
FTDI (USB an Seriell Adapter) auf den FC stecken. USB Stecker nach aussen.
ftdi.gif
USB Kabel an FTDI und PC anschließen. Man wird aufgefordert den Treiber zu installieren. Achtung: den COM Port merken (meiner ist COM20).

3.2 Neue Firmware anpassen und installieren
Starte arduino.exe und öffne MultiWii_2_1.ino

Dann unter Tools noch ein paar Anpassungen:
Board: Ardunio Duemilanove w/ATmega328
Serieller Port: bei mir COM20


Im Fenster MultiWii_2_1 habe ich folgende Änderungen vorgenommen, da mein Mindestwert 1119 ist und den default Wert von 1100 nicht erreichen kann. Damit war dann ein DIS-ARM (Motoren wieder unschaft stellen) nicht möglich.
// ******************
// rc functions
// ******************
#define MINCHECK 1115


Im Fenster config.h habe ich folgendes geändert:
Section 1:
//The type of multicopter
#define QUADX

//boards and sensor definitions
//Combined IMU Boards
#define CRIUS_SE

// ARM/DISARM
//kein Gas, ROLLEN nach links: Motoren Scharf
//kein Gas, ROLLEN nach rechts: Motoren UnScharf
#define ALLOW_ARM_DISARM_VIA_TX_YAW
//#define ALLOW_ARM_DISARM_VIA_TX_ROLL

Section 4:
//Aux 2 an Pin 12 aktivieren
//#define RCAUXPIN8
#define RCAUXPIN12 // AUX2 on PIN12

//GPS
//Kontrollieren ob beide aktiv sind
#define I2C_GPS
#define GPS_LED_INDICATOR

// Get your magnetic decliniation from here : http://magnetic-declination.com/
//Convert the degree+minutes into decimal degree by ==> degree+minutes*(1/60)
#define MAG_DECLINIATION 1.15f // BONN
// nach dem ersten Testflug gab es diese Änderung
#define GPS_LOW_SPEED_D_FILTER true

Im Fenster config.h habe ich folgendes geändert:
//PI and PID controllers for GPS
#define NAV_SPEED_MIN 50 // statt 100cm/sec
#define NAV_SPEED_MAX 200 // statt 300cm/sec
Erstmal speichern: Der Pfeil nach unter
Dann Kompilieren und auf das Board laden: Der Pfeil nach rechts

Dann blinken die LEDs auf dem FTDI und irgendwann steht im Arduino: upload abgeschlossen.

4.) GPS
Der Crius CN-06 GPS Receiver nutzt den Controller NEO-6 u-blox6M der Fa. ublox.
Beim Kaltstart hat er folgende Konfiguration:
9600,8,N,1
Daten werden im NMEA Protokoll gesendet​
Es gibt Tools mit denen man programmieren kann, bei Spannungsaufall, sprich wenn der kleine aufgelötete Accu leer ist, ist lles wieder vergessen.
Daher gehe ich den sichereren Weg.

4.1) BAUDraten FIX
Der Kontroller hat Konfigurationseingänge die man an VCC oder GND legen kann und die Bewirken, das beim Start eine andere Konfiguration verwendet wird.

NEO-6.gif

Wird der Pin 14 auf GND (Pin13) gelegt, dann startet der Controller mit einer Baudrate von 38400

GPS_Löt.jpg

4.2) I2C/GPS für FTDI erweitern
Das Crius I2C-GPS NAV Module Navigation Board besteht auch aus einem ATmega328 bei dem ein Serieller Port und ein I2C Port auf je einen Stecker herausgeführt werden.
Um die Software hier zu installieren muss an den vorhandenen FTDI Anschluß nur eine Stiftleiste angelötet werden.

I2c_Leiste.jpg


4.3) Software für I2C/GPS laden
Die Software I2C_GPS_NAV-v2.1rc2.zip von hier laden: http://code.google.com/p/i2c-gps-nav/downloads/list
Anschießend in ein eigenes Verzeichniss entpacken.

4.4) Neue Firmware anpassen und installieren
Starte arduino.exe und öffne I2C_GPS_NAV.ino
Im Fenster I2C_GPS_NAV, was immer zwischen void setup() und //Init i2c_dataset; steht durch folgendes ersetzen:
// Setup
// UBOX
//
void setup() {

uint8_t i;

delay(2000); //lets some time to GPS module to init
Serial.begin(38400);

//set GPS dynamic platform to "pedestrian" seems to be best for copter
PROGMEM prog_uchar conf2[]={0xB5, 0x62, 0x06, 0x24, 0x24, 0x00, 0xFF, 0xFF, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x10, 0x27, 0x00, 0x00, 0x05, 0x00, 0xFA, 0x00, 0xFA, 0x00, 0x64, 0x00, 0x2C, 0x01, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4F, 0x82};
Serial.write (conf2,sizeof(conf2));
delay(300);

//disable all default NMEA messages
PROGMEM prog_uchar conf3[]={0xB5, 0x62, 0x06, 0x01, 0x03, 0x00, 0xF0, 0x05, 0x00, 0xFF, 0x19};
Serial.write (conf3,sizeof(conf3));
delay(100);
PROGMEM prog_uchar conf5[]={0xB5, 0x62, 0x06, 0x01, 0x03, 0x00, 0xF0, 0x03, 0x00, 0xFD, 0x15};
Serial.write (conf5,sizeof(conf5));
delay(100);
PROGMEM prog_uchar conf6[]={0xB5, 0x62, 0x06, 0x01, 0x03, 0x00, 0xF0, 0x01, 0x00, 0xFB, 0x11};
Serial.write (conf6,sizeof(conf6));
delay(100);
PROGMEM prog_uchar conf7[]={0xB5, 0x62, 0x06, 0x01, 0x03, 0x00, 0xF0, 0x00, 0x00, 0xFA, 0x0F};
Serial.write (conf7,sizeof(conf7));
delay(100);
PROGMEM prog_uchar conf8[]={0xB5, 0x62, 0x06, 0x01, 0x03, 0x00, 0xF0, 0x02, 0x00, 0xFC, 0x13};
Serial.write (conf8,sizeof(conf8));
delay(100);
PROGMEM prog_uchar conf9[]={0xB5, 0x62, 0x06, 0x01, 0x03, 0x00, 0xF0, 0x04, 0x00, 0xFE, 0x17};
Serial.write (conf9,sizeof(conf9));
delay(100);


//enable UBX messages POSLLH, SOL, STATUS and VELNED as is in EOSBandi's config file
PROGMEM prog_uchar conf10[]={0xB5, 0x62, 0x06, 0x01, 0x03, 0x00, 0x01, 0x02, 0x01, 0x0E, 0x47};
Serial.write (conf10,sizeof(conf10));
delay(100);
PROGMEM prog_uchar conf11[]={0xB5, 0x62, 0x06, 0x01, 0x03, 0x00, 0x01, 0x03, 0x01, 0x0F, 0x49};
Serial.write (conf11,sizeof(conf11));
delay(100);
PROGMEM prog_uchar conf12[]={0xB5, 0x62, 0x06, 0x01, 0x03, 0x00, 0x01, 0x06, 0x01, 0x12, 0x4F};
Serial.write (conf12,sizeof(conf12));
delay(100);
PROGMEM prog_uchar conf13[]={0xB5, 0x62, 0x06, 0x01, 0x03, 0x00, 0x01, 0x12, 0x01, 0x1E, 0x67};
Serial.write (conf13,sizeof(conf13));
delay(100);

//set rate to 5Hz
// Der Chip kann nur alle 200ms neue Daten liefern.
//wer auch 10HZ stellt, bekommt immer 2mal hintereinander die selben Daten.
PROGMEM prog_uchar conf15[]={0xB5, 0x62, 0x06, 0x08, 0x06, 0x00, 0xC8, 0x00, 0x01, 0x00, 0x01, 0x00, 0xDE, 0x6A};
Serial.write (conf15,sizeof(conf15));

// set serial to 115200
PROGMEM prog_uchar conf1[]={0xB5, 0x62, 0x06, 0x00, 0x14, 0x00, 0x01, 0x00, 0x00, 0x00, 0xD0, 0x08, 0x00, 0x00, 0x00, 0xC2, 0x01, 0x00, 0x07, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC4, 0x96};
Serial.write (conf1, sizeof(conf1));
delay(1000);

Serial.end();
delay(500);

Serial.begin(115200); //bei jedem Booten wird der GPS Empfänger jetzt passend Konfiguriert
delay(100);

//Init i2c_dataset;

Im Fenster config.h
/* Serial speed of the GPS */
#define GPS_SERIAL_SPEED 115200

/* GPS protocol
//#define NMEA
#define UBLOX
//#define MTK

Erstmal speichern: Der Pfeil nach unter
Dann Kompilieren und auf das Board laden: Der Pfeil nach rechts

Dann blinken die LEDs auf dem FTDI und irgendwann steht im Arduino: upload abgeschlossen.


4.5) I2C an FC
Das MultiWii SE v2 hat leider keinen I2C Bus Anschluß mehr. Für den Anschluß des Crius I2C-GPS NAV Module Navigation Board müssen daher leider die 4 Kabel aufgelötet werden.
Auf dem Board habe ich nochmal die Anschlüsse oben links in grün markiert:

Wii.jpg

Nach dem Auflöten habe ich die Kabel mit einem Klebe-Streifen fixiert.
Gut zu erkennen ist auch der Schaumstoff über dem barometrischen Sensor, der sehr Temperatur- und Windempfindlich ist.

I2C anschluss.jpg

Zusammen gebaut sieht es dann so aus. Der Orange 6Kanal Empfänger ist auch schon angeschlossen.

FC_I2C_GPS2.jpg

Den Satelitenempfänger habe ich seitlich auf den Träger montiert.

MW.JPG

4.6)GPS-Shield
Die Infos werden hier eingefügt, wenn ich mit dem Zusammenbau fertig bin.
Ihr könnt euch aber gerne hier den aktuellen Status ansehen.

5.0 Configuration des FC
Das FTDI wieder an den FC anschließen und MultiWiiConf_2_1.exe starten.
Links den COM Port anklicken und dann auf Start drücken.
Als erste READ anklicken um die Standartwerte zu lesen und am besten auch einen Screenshot davon machen, fals man es später mal überschreibt.

An den Passenden Werten arbeite ich noch. Weiter unten tauchen immer mal wieder Beispiele auf. Wenn ich etwas passendes für Copter habe, werde ich es hier einstellen.



6.0) Motor/Propeller
Durch den Aufbau als X-Copter ist die Drehrichtung der Motoren vorgegeben.
(CW=rechtsrum, sprich im Uhgrzeigersinn, CCW=Linksrum

Vorne links (3) CW
Vorne rechts (10) CCW
Hinten links (11) CCW
Hinten rechts (9) CW​

Die CW Motoren bekommen die 1045 Propeller, die CCW Motoren die 1045R.

6.1 Gewicht/Antrieb
Ich habe das Modell mit Akku (also abflugbereit) gewogen und komme auf 750g.
Dann habe ich den Auftrieb bei Vollgas gemessen. Dazu habe ich mich mit Modell auf eine Waage gestellt, gemessen und dann nochmal bei Vollgas das Modell festgehalten. Der Unterschied beträgt 1700g.

Das Modell schwebt bei Halbgas und hat erhebliche Reserven.

7) Testflug

7.1 Ich habe mit einigen Standartwerten angelangen.
C001.gif

Leider dreht sich der Copter immer um die eigene Achse. Mit der YAW Trimmung wurde es besser, aber nicht gelößt.

GPS Hold mochte er garnicht. In 5m Höhe fing er wie wild an zu "tanzen".
Ich konnte ihn zwar noch einmal abfangen, legte aber eine harte Landung hin. Das hat einer der Motorträger nicht überlebt.
Also habe ich die Motoren mit den 4-armigen Motorhaltern direkt auf den Alu Ausleger geschraubt. Dazu mußte ich noch ein weiteres Loch bohren (1,0mm Vor und 2,9mm Fertig). Dabei habe ich dann auch die gesenkten Löcher der Motorhalterung noch ein wenig tiefer gesenkt, damit die Schrauen vollkommen versinken können.

Motor2.jpg


7.2 2. Test
Nach einigem Lesen und Trockentests, werde ich diese Einstellungen testen.
ACC ist immer an: verindert ein Abdriften
BARO ist immer an: verhindert Abdriften der Höhe
MAG ist immer an: hält die Richtung

HEADFREE ist zuschaltbar: Egal wohin der Copter gedreht ist, wenn ich den Pitchhebel nach vorne schiebe, bewegt sich der Copter von mir aus gesehen nach Vorne. Bei der Rotation wird das sicher hilfreich sein.

GPS HOLD jetzt mit moderaten Werten (Pos: 0.5/0.1)

C002.gif


---------------
KW37


Ich habe mir einen BlueTooth FTDI bestellt und hoffe das er in 2 Wochen ankommt.
Damit kann ich auch im Flug "Telemetrie" empfangen.
Schreiben natürlich nicht, weil er dann die Motoren abschaltet

---------------
KW38
Das neue Landegestell ist fertig und ich hoffe die Bilder heute Abend hier einstellen zu können.
Ohne Bilder ist der Text ein wenig trocken!

Ich habe die alten Landegestelle abgebaut.
Für jeden Arm habe ich ein 200mm langes 10x10mm ALU Vierkant gesägt, das in den 12x12mm Rahmen passt.
Erw1.JPG
In eines der Enden habe ich einen 8er Dübel versenkt und den Rand abgeschnitten.
Erw2.JPG

Dann habe ich die äußere Motorschraube gelößt, das kleinere Alu Vierkant bis zur nächsten Schraube durchgedrückt, und das Loch für die Schraube gebohrt und die Schraube wieder montiert.
Erw4.JPG Erw5.JPG

Aus dem Baukmarkt habe ich mir 1m Heizungs-Rohr-Isolierung ca 50mm Dick und wiederverschließbar besorgt.
Ich habe mir 240mm lange Stücke geschnitten. Auf der Rückseiter des Verschluß, in der Mitte habe ich mit einem Teppichmesser ein Loch für die Alu-Verlängerung geschnitten.
Dann habe ich die Isolierung auf das Alu geschoben.
Erw6.JPG

Als Halter für den Fuß habe ich einen 1mm dünnen und 240mm langen 8x10mm U-Kunstoff verwendet. In der Mitte habe ich ein 5mm Loch gebohrt. Dann habe ich den U-Kunstoff auf den Kopf der Alu Verlängerung gesteckt und mit einer 5x30mm Sechskant-Blechschraube nebst U-Scheibe im Dübel befestigt.
Der Kunststoff ist eine Sollbruchstelle und hällt das Isolierrohr gerade.

Dann habe ich die Isolierung über das Kunstoffbein gezogen und verschlosssen.

Als Verschluß für die Füße habe ich dann ein Stück herausgeschnitten, welches der Dicke der Isolierung entspricht.
ext3.JPG
Dies habe ich Axial halbiert und aufgeklebt. Für die Oberseite habe ein flaches Stück geschnitten.

ext1.jpg ext2.JPG

Bei den heutigen Testflügen habe ich nur einen Propeller geschreddert!
Und leider auch eine der Sollbruchstellen^^
Aber es hat sich wirklich gelohnt, denn es gab leider ein paar derbe "Landungen".

---------------
Ich habe heute die Isolierungen entfernt und musste feststellen, das allen 4 Kunsttoff Stangen die Löcher mehr oder weniger ausgerissen sind.
Die nächste Version wird also ein wenig stabiler.

Der Copter steht jetzt ruhiger in der Luft, der ALT Level war einfach immer noch zu hoch.
Auch die anderen Werte nähern sich langsam flugfähigen Zuständen.
c004.gif

Leider funktionier aber HEADFREE überhaupt nicht.
Und die ACC Werte sind im vergleich zu den Gyro Werten so schwach, das ich ein Abdriften nicht verhindern kann.
Das muss ich mir mal im Sourcecode suchen.
----------------
Zur besseren Ausrichtung des ACC habe ich mir eine "Libelle Dosenlibelle Wasserwaage 2,5 cm Ø" für 3€ gekauft.
libelle.gif

libelle.jpg

7.0 Sonar
Ich würde mir noch eine Landefunktion wünschen^^
> Das ist schonmal ein guter Ansatz:
http://fpv-community.de/showthread.php?10717-Conrad-Ultraschall-Abstandswarner-Bausatz-mit-Multiwii

Ich werde diesen Ultraschallsensor mal näher begutarten. Er sollte ende dieser Woche ankommen :)
SRF02 Ultraschallsensor

Srf02_germany[1].jpg
Programmierung und Anschluß
----------------
So der Sensor ist mittlerweile angekommen. Ich habe ihn im I2C Modus (also den Modus Anschluß frei lassen) an der I2C Bus angeschlossen. Er blinkt seine Adresse mit der LED. Auch in der Config ist er aktiviert. Es gibt nur noch keine Programmierung dazu.

Meine Idee ist eine Landefunktion. Wenn die Höhe 1m unterschreitet und Landung aktiv ist wird das Modell auf 1m stabilisert. Dann wird die Motorleistung leicht gedrosselt (ca. 10cm/sek Fallgeschwindigkweit). Wenn es nicht mehr weiter runter geht ist man wohl gelandet (Motoren in rlauf). Warten auf Throttle = minimalstellung (auch wenn der Landemodus deaktiviert wird, wir wollen ja keine Raketenstarts)

7.1 Sensors.imo
Hier habe ich mich mal an der Erstellung der Initialisierungs- und Auslese-Routine gewagt.
Die Einträge stehe sehr weit unten. Direkt vor void initSensors() {

/ ************************************************************************************************************
// I2C Sonar SRF02
// ************************************************************************************************************
// first try from Q-Man (09-24-2012) Version 0.01
// Version 0.02 : save old values
// Version 0.03 : Change resolution a result in micro-second has a resulution of 0.343mm. Theoretically :)
// Version 0.04 : Get the real time, use less variables, Add Debug values
// specs are here:http://www.robot-electronics.co.uk/htm/srf02techI2C.htm

#if defined(SRF02)

#define SRF02_ADDRESS 0xF2 // the default address is 0xE0, but 1Long, 9 short is 0xF2
#define SRF02_RANGE_WAIT 70000 // 70ms delay between Ping and Range Read commands

// registers of the device // READ //WRITE
#define SRF02_REV_COMMAND 0 // Software Rev. Command Register
#define SRF02_RANGE_HIGH 2 // Range High Byte N/A //from 16bit unsigned
#define SRF02_RANGE_LOW 3 // Range Low Byte N/A //from 16bit unsigned

// Command Register
//#define SRF02_RANGE 80 // Real Ranging Mode - Result in inches
//#define SRF02_RANGE 81 // Real Ranging Mode - Result in centimeters
#define SRF02_RANGE 82 // Real Ranging Mode - Result in micro-seconds


#endif

void Sonar_init() {
// send a ping via the general broadcast address
i2c_writeReg(SRF02_ADDRESS,SRF02_REV_COMMAND,SRF02_RANGE); // start ranging, result in micro seconds
SRF02_wait = micros(); + SRF02_RANGE_WAIT; // Valid at this time
}


void Sonar_update() {
if (micros() < SRF02_wait) return; //Ranging is still in progress

SRF02_VALID = 1; // Sonar Distance will be valid
// When read in the main loop, don't forget to set to false.

uint8_t SONAR_DIST_H = i2c_readReg(SRF02_ADDRESS, SRF02_RANGE_HIGH); // Read High Byte
uint8_t SONAR_DIST_L = i2c_readReg(SRF02_ADDRESS, SRF02_RANGE_LOW); // Read Low Byte
sonar_Dist = SONAR_DIST_L + SONAR_DIST_H * 256; // calculate the Int16
debug[0] = SONAR_DIST_L;
debug[1] = SONAR_DIST_H;

i2c_writeReg(SRF02_ADDRESS, SRF02_REV_COMMAND, SRF02_RANGE); // start ranging, result in micro seconds
SRF02_wait = micros() + SRF02_RANGE_WAIT; // At this time the next values are valid
sonar_Lap = SRF02_wait; // Transfer
debug[2] = word(SRF02_wait/1000);
}

7.2 MultiWii_2_1.imo
Jetzt geht es an des Programm.

Oben bei den Variablen suchst du nach:
#if defined(ARMEDTIMEWARNING)
static uint32_t ArmedTimeWarningMicroSeconds = 0;
#endif
Darunter habe ich das folgende Eingetragen

//************* SONAR **************************
#if defined(SRF02) // by Q-man
#define sonarALL 0 // calculated PID
#define sonarP 1 // select P
#define sonarI 2 // select I
#define sonarD 3 // select D
uint16_t sonarHigh[5]; // Last altitudes
uint32_t sonarTime[5]; // Time of altitude
int32_t sonarVario; // Direction and speed of last Test
uint8_t sonarHold = 0; // Hold is disamed
int16_t sonarPID[4]; // change rate of throttle
uint32_t SRF02_wait = 0; // Time needs to be higher then this. initialize to avoid wrong Sonar_init at startup
uint16_t SRF02_VALID = 0; // Is the SONAR_DIST valid? 0=NO
uint16_t sonar_Dist; // Transfer Value
uint32_t sonar_Lap; // Last time when loop ends
#endif

Dann im // ******** Main Loop *********


suchen nach: else { // not in rc loop

ein wenig tiefer zu case 4 und das folgende eintragen:

#if SONAR // SONAR is defined
Sonar_update(); // check for new value
if (SRF02_VALID ==1) // if there is a new value, VALID was set to 1
{
for(n=1;n<6;n++) // update values
{
sonarHigh[n+1] = sonarHigh[n]; // save the last 5 old
sonarTime[n+1] = sonarTime[n];
}

sonarHigh[1] = sonar_Dist; // save new value
sonarTime[1] = sonar_Lap; // and Time
SRF02_VALID = 0; // set data to not valid

sonarVario = 0;
for(n=1;n<5;n++) // calculate Vario in mm/sec : in 1 micro second sonic has gone 0,343mm
{
sonarVario = sonarVario +
// long(( ((sonarHigh[n] - sonarHigh[n+1])*3) / // altitude difference in 1mm (0.33mm *3) divide by
// ((sonarTime[n] - sonarTime[n+1])/1000/1000/2) // duration in seconds (0.001 * 0.001 * micro seconds) /2 because this is a round trip
// ) * (100/(1+(n*n))) // weight factor 100%/50%/20/10%
// THIS will generate to smal INT, so factors are better distribute as below:

long( ((sonarHigh[n] - sonarHigh[n+1])*60) / // *3 /(/1000 /1000 /2 ) *100 > [2 nach oben, 100/1000 und das nach oben] > = 3 *2 *10 / (/1000)
((sonarTime[n] - sonarTime[n+1])/1000) /
(1+(n*n)));

}
sonarVario = long(sonarVario/180); // weigth factor corrected varospeed in mm/s
}
debug[3] = sonarVario;
#endif
Weiter unten nach computeIMU(); suchen und darunter eintragen:

// ************************* SONAR Hold 1.0m ***********************
//
if (rcOptions[BOXLLIGHTS]) { // used here for activating "hold altitude at 1m"
if (SONAR && f.ARMED) { // if Sonar is installed and engine are armed
if (sonarHigh[1] > 8750) { // 8750us = 1,5m - Do nothing
sonarHold = 0; // Sonar Hold is disarmed
};

if (sonarHigh[1] < 8750 && sonarHigh[1] > 6410) { // between (8750us=1,5m) and (6410us=1,1m) DOWN
if (sonarHold = 1){ // only when Hold is Armed
rcCommand[THROTTLE] += sonarPID[sonarALL]; // adjust throttle
} //else do nothing
};

if (sonarHigh[1] < 6410 && sonarHigh[1] > 5270) { // between (6410us=1,1m) and (5270us=0,9m) HOLD
if (sonarHold = 0) { // when first reaching this range
sonarPID[sonarALL]=0; // initialize sonarPID
sonarPID[sonarP]=0;
sonarPID[sonarI]=0;
sonarPID[sonarD]=0;
}
else {sonarHold = 1;}; // Sonar Hold is armed
rcCommand[THROTTLE] += sonarPID[sonarALL]; // adjust throttle
};

if (sonarHigh[1] < 5270 && sonarHigh[1] > 2330) { // between (5270us=0,9m) and (2330us=0,4m) UP
if (sonarHold = 1){ // only when Hold is Armed
rcCommand[THROTTLE] += sonarPID[sonarALL]; // adjust throttle
} //else do nothing
};

if (sonarHigh[1] < 2330) { // 2330us=0,4m
sonarHold = 0; // Sonar Hold is disarmed
};
};
};
//-----------------------------------------------------------------------------------
Die Sensordaten sind jetzt immer aktuell:
Die letzte 4 Höhen [sonarHigh 0..3]
Die Höhenänderung unter berücksichtigung der letzten gewichteten Werte [SONAR_DIST]


Der Einsprungpunkt zum Testen ist:
1) wenn Landelicht (LLIGHTS), dann Höhe bei 100cm halten
2) Wenn LEDMAX, dann Landen wenn unter 100cm


7.3 IMU.imo
Jetzt muss noch der sonar PID Wert berechnet werden.

Ganz zum Ende von void computeIMU () {, also direkt vor:

}

// **************************************************
// Simplified IMU based on "Complementary Filter"
die PID Berechnung eintragen:

// ***** compute sonarPDI ************************
// really first test!
if (rcOptions[BOXLLIGHTS]) { // used here for activating "hold altitude at 1m"
//P
int16_t sonarGap = 5830 - sonarHigh[1]; // 8750..5830...2330 us = 1,5 ... 1,0 ... 0,4m
sonarGap = -constrain(sonarGap,(-100),100); // +/- 20 Throttle will be limit the change rate
sonarPID[sonarP] = int(sonarGap/5);

//I
sonarPID[sonarI] = 0;

//D
int16_t sonarVelo = -constrain(sonarVario,(-50),50); // +/- 50mm/s will be limit the change rate
sonarPID[sonarD] = int(sonarVelo/10);

//ALL
sonarPID[sonarALL]= sonarPID[sonarP] + sonarPID[sonarI] + sonarPID[sonarD];
}
else { sonarPID[sonarALL] = 0; }; // just to be save ;-)


------------------
KW41

Sorry war im Urlaub.
Heute ist dann endlich das BlueTooth FTDI von Sparkfun angekommen.
Kurz den mitbestellten Stecker angelötet, das BT-FTDI an den FC gesteckt, Accu angeschlossen und Win7 gesagt es soll mal nach neuen BT Sachen suchen. Es wird ein RN42-7797 gefunden. Zur Kopplung verwende ich das default Passwort 1234. Das steht natürlich auf der letzten Seite der Anleitung.
Das Blinken der Konfig-LED bleibt. Win7 sagt mir, das ich jetzt einen COM22 habe.
Dann habe ich den MultiWiiConf gestartet und COM22 angeklickt....und gespanntes warten.
Nach ca. 2 Sekunden sind nicht nur die COM ports grün, sondern auch das Modul zeigt die grüne Connect-LED. PUH :)
------------------

Zum Sonar habe ich mir noch ein paar Gedanken gemacht.
- Das BARO muss abgestellt sein, sonst versucht es gegenzusteuern.
- DAS GPS muss abgestellt sein, Ich will ja nur noch landen und nirgens mehr hin.

Ich habe noch ein wenig an der Sonar Auswertung gearbeitet. Die Änderungen habe ich weiter oben eingepflegt. Um die Geschwindigkeit zu errechnen, muss ich natürlich auch wissen welche Zeit zwischen den Messwerten vergangen ist.
Ich aktualisiere immer noch, aber bis zum ersten Test bitte noch nicht nachmachen.

------------------
KW42
Der Sonar Sensor und der I2C verstehen sich leider noch nicht gut. So konnte ich den neusten Softwarestand noch nicht ausprobieren.

------------------
KW03
Wie ich unten geschrieben habe, werde ich das SonarProjekt (Punkt7) erstmal auf Eis legen.
Ich werde mich erstmal dem BARO widmen und damm den GPS.

Ich habe auch eine gute Anleitung zum Einstellen gefunden.


Ich werde jetzt das Barologic2 (Final4) mit Autolanding versuchen.

Es ist ein wenig Gewöhnungsbedürftig, aber es funktioniert.

Das sind die aktuellen Einstellungen mit denen ich gerade gut zurecht komme.
c005.gif
 
Zuletzt bearbeitet:
Erhaltene "Gefällt mir": Karnee

klaus...

Neuer Benutzer
#3
Hallo Q-Man....:)

Danke das du dir die mühe gemacht und deinen Baubericht veröffentlicht hast, hat mir sehr geholfen *Daumenhoch*.

LG
-------
Klaus
 

Q-Man

Erfahrener Benutzer
#4
Hallo Klaus,
genau dafür habe ich ihn geschrieben.
Als ich den Karton mit den Einzelteilen gekommen habe wuste ich schon, das der Bastelspaß hier nicht zu kurz kommen würde.

Grüße Q-Man
 

klaus...

Neuer Benutzer
#5
Hallo Klaus,
genau dafür habe ich ihn geschrieben.
Als ich den Karton mit den Einzelteilen gekommen habe wuste ich schon, das der Bastelspaß hier nicht zu kurz kommen würde.

Grüße Q-Man


Ja, genau. Bin auch schon total Süchtig...:). Ich schätze deshalb deinen Bericht, weil du wirklich ins Detail gegenagen bist, sehr schön!

Kann es sein das du nen Ähnlichen FC noch rumfliegen hast, oder jemanden kennst der eins über hat? Sehr schön wäre z.b. ein Crius All-In-One, gerne auch mit GPS! Ich hab noch nie bei den Chinesen bestellt und bin ein wenig skeptisch...;-).


Ist ein Tolles Forum hier, hab schon rechteckige Augen vom einlesen.

LG
------
Klaus
 

Q-Man

Erfahrener Benutzer
#6
Ich habe diesen FC direkt mit dem "Bausatz" bekommen. I2C_GPS und GPD habe ich gleich mitbestellt.
Du kannst die Sachen auch in Deutschland kaufen, leider aber deutlich teurer, dafür aber keine 4 Wochen Lieferzeit.

Wie du sicher schon an den Nachträgen gesehen hast, ist der Zusammenbau das kleinste Problem gewesen.
Die Programmierung und Configuration des FC und des I2C-GPS braucht noch viel länger.

Ja, ich habe mir auch einige Foren angesehen, aber hier ist das Beste!

Grüße Q-Man
 

DerLange

Erfahrener Benutzer
#7
also von deinem landegestell werde ich mir glatt mal was abgucken. :) klasse idee.
 

DerLange

Erfahrener Benutzer
#9
na da bin ich mal gespannt... ich bleib hier mal dran :)
 

Q-Man

Erfahrener Benutzer
#10
Ich habe leider noch nicht weiter am Landegestell gebaut weil ich hoffe mit der Sonar Erweiterung das Landeverhalten zu verbessern.
Ich quäle mich hier noch durch die Programmierung da ich C nicht wirklich behersche.
 

Muhk

Erfahrener Benutzer
#12
Hi

ich habe hier auch noch einen SRF02 rumfliegen, den werde ich auch mal einbauen. Schreib mal bitte deine Erfahrungen damit, falls es schon welche gibt :)

Gruß Tobias
 

Q-Man

Erfahrener Benutzer
#14
Ich bin noch dabei die Sofware dazu zu schreiben.
Jeden Tag gibt es eine neue Version. Aber zum fliegen ist die noch nicht geeignet, das kommt erst noch.
 

Q-Man

Erfahrener Benutzer
#15
Ja, ich denke auch das mir einige Dinge fehlten. Die Feder war schon sehr vorgespannt.
Bei einer der Landungen hat es sie dann so auseinander gezogen, das sie nicht mehr zu gebrauchen waren.
 

Q-Man

Erfahrener Benutzer
#16
Ich bin mir der Software ein gutes Stück weiter gekommen und habe auch endlich rausbekommen, wie ich das mit der Ausgebe der Debugwerte in MultiWiiConf hinbekomme^^

Die ersten Tests haben aber leider gezeigt, das die I2C Adresse des Sonar eine Andere ist, das Kabel Errors erzeugt und der Trigger nicht erkannt wird. Ich muss also erstmal wieder an der Hardware arbeiten.
 

Q-Man

Erfahrener Benutzer
#17
Ich habe immer noch probleme mit der I2C Errors wenn ich das Sonar verwende. Es war zeitweise so schlimm, das die anderen Sensoren gestört wurden und das Modell unfliegbar wurde.

Zur Zeit arbeite ich an einer besseren Anbindung an den I2C. Daher schreibe ich hier gerade auch nicht viel.
 

Q-Man

Erfahrener Benutzer
#18
Endlich habe ich den Fehler gefunden.
Nachdem ich alles andere ausgeschlossen habe, habe ich das SONAR in der Software dekativiert, die Zykluszeiten wurden geringer und die I2C Fehler waren weg...
 

Q-Man

Erfahrener Benutzer
#20
Das Controller sieht sehr kompatibel aus. Aber ohne Test kann man natürlich nichts definitives sagen.

Zur Sprache habe ich das gefunden:

The Arduino programming language is an implementation of Wiring, a similar physical computing platform, which is based on the Processing multimedia programming environment.
 
FPV1

Banggood

Oben Unten