INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 0 Bewertungen - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
Multikopter
11.12.2014, 22:29
Beitrag #9
RE: Multikopter
So, das erste Päckchen ist angekommen und wurde gleich mal zusammengebaut.


Angehängte Datei(en) Thumbnail(s)
   

Falls ich mit einer Antwort helfen konnte, wuerde ich mich freuen, ein paar Fotos oder auch ein kleines Filmchen des zugehoerigen Projekts zu sehen.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
12.12.2014, 19:35 (Dieser Beitrag wurde zuletzt bearbeitet: 12.12.2014 19:36 von Plexxart.)
Beitrag #10
RE: Multikopter
(11.12.2014 22:29)Thorsten Pferdekämper schrieb:  So, das erste Päckchen ist angekommen und wurde gleich mal zusammengebaut.
Na ja das gilt nicht, einfach so bestellt und dann auf die schnelle zusammen gebaut Big Grin

[Bild: attachment.php?aid=720]
Webseite des Benutzers besuchen Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
13.12.2014, 23:45
Beitrag #11
RE: Multikopter
Da mir noch ein paar wichtige Teile fehlen konnte ich bisher nur ein bisschen Grundlagenarbeit machen. Das heißt, mal meine Kenntnisse zu Kalman-Filtern aufgefrischt und nachgesehen, wie die Fluglagenstabilisierung per PID grundsätzlich funktioniert.
Damit die Arduino-Programmierung nicht zu kurz kommt, habe ich mal meinen Empfänger (AR6115) an einen Uno angeschlossen. Der Arduino muss nachher 4 Kanäle lesen können und vier "Servos" (eigentlich Motoren) steuern. Dazwischen kommt dann noch ein bisschen Sensor-Lesen und einiges an Berechnungen. Da geht natürlich mit "pulseIn" nichts mehr, da ich mir die jeweilige Wartezeit nicht leisten kann. Der Trick scheinen die "Pin Change Interrupts" und Zeitmessung per micros() zu sein.
Das hat dann den folgenden Sketch ergeben.
Code:
#define NO_PORTB_PINCHANGES // Port B wird nicht fuer Pin Change Interrupts gebraucht
#define NO_PORTC_PINCHANGES // Port B wird nicht fuer Pin Change Interrupts gebraucht
#define NO_PIN_NUMBER       // Pin Change Interrupts: Wir brauchen die Pin-Nummer nicht
#include <PinChangeInt.h>   // Pin Change Interrupts Library

#include <Servo.h>          // Servo-Library zur Motor-Ansteuerung

#define THRO 4      // Throttle
#define AILE 5      // Querruder
#define ELEV 6      // Hoehenruder
#define RUDD 7      // Seitenruder
#define THROBIT 1   // Bits fuer Signalisierung, dass Empfaenger-Impuls gelesen
#define AILEBIT 2
#define ELEVBIT 4
#define RUDDBIT 8

volatile unsigned long durThro = 0;   // gelesene Dauer in Mikrosekunden
volatile unsigned long durAile = 0;
volatile unsigned long durElev = 0;
volatile unsigned long durRudd = 0;
byte received = 0;                    // Signalisierung, welche Empfaenger-Kanaele gelesen wurden

// Motors
#define PINMOTORVL 8   // Vorne Links
#define PINMOTORVR 9   // Vorne Rechts
#define PINMOTORHR 10  // Hinten Rechts
#define PINMOTORHL 11  // Hinten Links
Servo motorvl;         // Das ganze als Servo-Instanzen
Servo motorvr;
Servo motorhr;
Servo motorhl;



void setup() {
  // Empfaenger: Pins auf Input und Pin Change Interrupts setzen
  pinMode(THRO, INPUT);  
  PCintPort::attachInterrupt(THRO, &throHandler, CHANGE);  
  pinMode(AILE, INPUT);
  PCintPort::attachInterrupt(AILE, &aileHandler, CHANGE);  
  pinMode(ELEV, INPUT);
  PCintPort::attachInterrupt(ELEV, &elevHandler, CHANGE);  
  pinMode(RUDD, INPUT);
  PCintPort::attachInterrupt(RUDD, &ruddHandler, CHANGE);  

  // Motor-"Servos" mit Pins verbinden
  motorvl.attach(PINMOTORVL);
  motorvr.attach(PINMOTORVR);
  motorhr.attach(PINMOTORHR);
  motorhl.attach(PINMOTORHL);

  Serial.begin(9600);
  Serial.println("---------------------------------------");
}


void loop() {
  
  static unsigned long last = 0;
  static unsigned long count = 0;   // Fuer Zeitmessung: Was haben wir noch uebrig?
  unsigned long now = millis();    
  
  count++;     // Zaehlt jeden loop()-Durchlauf
  
  static unsigned long tmpThro = 0;   // lokale Kopien der Impuls-Laengen
  static unsigned long tmpAile = 0;
  static unsigned long tmpElev = 0;
  static unsigned long tmpRudd = 0;
  byte tmpReceived;                   // Lokale Kopie fuer Signalisierung
  

  if(!received) return;    // Keine Kanaele gelesen? -> Tschuess    
  cli();                   // Interrups verhindern
    tmpReceived = received;  
    if(received & THROBIT) tmpThro = durThro;   // Falls was empfangen: Impulsdauer kopieren
    if(received & AILEBIT) tmpAile = durAile;
    if(received & ELEVBIT) tmpElev = durElev;
    if(received & RUDDBIT) tmpRudd = durRudd;
    received = 0;                               // Damit nicht immer wieder kopiert wird
  sei();
  
  // Ausgaenge setzen, wenn auf dem entsprechenden Kanal was empfangen
  // Im Prinzip ist das natuerlich Quatsch, nur zur Zeitmessung etc.
  if(tmpReceived & THROBIT) motorvl.writeMicroseconds(tmpThro);  
  if(tmpReceived & AILEBIT) motorvr.writeMicroseconds(tmpAile);
  if(tmpReceived & ELEVBIT) motorhr.writeMicroseconds(tmpElev);
  if(tmpReceived & RUDDBIT) motorhl.writeMicroseconds(tmpRudd);
  
  // Einmal pro Sekunde was nach Serial ausgeben
  if(now - last < 1000) return;
  last = now;
  
  char out[25];
  sprintf(out,"%4lu %4lu %4lu %4lu %lu", tmpThro, tmpAile, tmpElev, tmpRudd, count);
  Serial.println(out);
  count = 0;
  tmpThro = 0;
  tmpAile = 0;
  tmpElev = 0;
  tmpRudd = 0;
}


// Interrupt-Handler fuer einzelne Pins
// Bloed, das auf vier Funktionen aufzuteilen, aber so ist's wahrscheinlich
// am schnellsten (Was zu ueberpruefen waere)
void throHandler() {
  
  static unsigned long wentHigh = 0; // wann ging der Pin auf HIGH?
  
  if(PCintPort::pinState == HIGH) {  // Pin ging auf HIGH
    wentHigh = micros();             // Zeit merken
  }else{                             // Pin ging auf LOW, also Impuls fertig
    durThro = micros() - wentHigh;   // Zeit messen
    received |= THROBIT;             // Signal-Bit setzen: Wir haben was ermittelt.
  }
}


void aileHandler() {
  
  static unsigned long wentHigh = 0;
  
  if(PCintPort::pinState == HIGH) {
    wentHigh = micros();
  }else{  
    durAile = micros() - wentHigh;
    received |= AILEBIT;
  }
}

void elevHandler() {
  
  static unsigned long wentHigh = 0;
  
  if(PCintPort::pinState == HIGH) {
    wentHigh = micros();
  }else{  
    durElev = micros() - wentHigh;
    received |= ELEVBIT;
  }
}


void ruddHandler() {
  
  static unsigned long wentHigh = 0;
  
  if(PCintPort::pinState == HIGH) {
    wentHigh = micros();
  }else{  
    durRudd = micros() - wentHigh;
    received |= RUDDBIT;
  }
}


Die Ausgabe von dem Ding sieht so aus:
Code:
1464 1500 1500 1500 101066
1464 1504 1500 1504 101442
1464 1500 1500 1500 102373
1464 1500 1500 1500 102364
1464 1500 1504 1500 102370
1460 1500 1504 1504 101066
1464 1504 1504 1500 101443
1464 1504 1500 1504 101067
1464 1500 1504 1500 101441
1464 1504 1500 1500 101063
1908 1500 1500 1504 101446
1916 1360 1812 1272 102361
1512 1376 1452 1504 102364
920 1312 1324 1512 102363
924 1504 1500 1500 101069
920 1500 1504 1500 101461
920 1500 1504 1500 102373
920 1500 1500 1500 102366
Die ersten vier Zahlen sind die "Knüppelstellungen". Die letzte Zahl ist die Anzahl der loop()-Durchläufe pro Sekunde. Das habe ich eingebaut, um ein Gefühl dafür zu bekommen, wie viel Zeit noch übrig ist.
Der Sketch leitet die empfangenen Impulse direkt auf die Servos weiter, was natürlich Quatsch ist. ...aber ich wollte ja nur herausfinden, was das Lesen der Eingänge und Schreiben der Ausgänge verbrät.

Ich habe dabei auch herausgefunden, dass micros() nur eine Auflösung von 4 Mikrosekunden hat. Möglicherweise reicht das nicht aus. Theoretisch können die Timer 0,5 Mikrosekunden. Timer0 sollte man aber nicht ändern, da das die millis() und micros() kaputt macht. Timer1 wird schon von der Servo-Lib benutzt. Bleibt Timer2, der aber nur 8 Bit Auflösung hat. D.h. einen Überlauf alle 128Mikrosekunden. Es gibt dazu sogar schon eine Library: http://electricrcaircraftguy.blogspot.de...ction.html.
Eine andere Idee wäre, die Servos und die Zeitmessung für den Empfänger mit demselben Timer1 laufen zu lassen. Das könnte geschickter werden, da 16 Bit Auflösung. Außerdem müsste zwischendurch genug Zeit sein, Signale an die Servos zu schicken.

Gruß,
Thorsten


Angehängte Datei(en) Thumbnail(s)
   

Falls ich mit einer Antwort helfen konnte, wuerde ich mich freuen, ein paar Fotos oder auch ein kleines Filmchen des zugehoerigen Projekts zu sehen.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
17.12.2014, 20:52
Beitrag #12
RE: Multikopter
Hallo,

ich bin auch ein Freund von selber bauen, aber warum wollt ihr das Rad neu erfinden?? Schaut mal unter http://www.multiwii.com
Das benutzen sehr viele Leute und es gibt auch einen super quellcode bei dem alles fertig ist, bzw. wenn man will einiges selbst noch anpassen/optimieren kann. Fertig boards für ein paar € gibts auch, da die multiwii eine diesen Community ist.
fertige boards z.b hier: http://hobbyking.com/hobbyking/store/__2...C_MAG.html
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
18.12.2014, 01:42 (Dieser Beitrag wurde zuletzt bearbeitet: 18.12.2014 01:43 von Thorsten Pferdekämper.)
Beitrag #13
RE: Multikopter
Hi,
das MultiWii-Projekt kenne ich natürlich auch. Ich habe auch nicht vor, jedes Rad neu zu erfinden und werde wahrscheinlich die ein oder andere Routine aus verschiedenen Quellen übernehmen. Allerdings würde ich das gerne alles von Grund auf verstehen. Das bedeutet für mich, dass ich vieles selbst machen muss.
Gruß,
Thorsten

Falls ich mit einer Antwort helfen konnte, wuerde ich mich freuen, ein paar Fotos oder auch ein kleines Filmchen des zugehoerigen Projekts zu sehen.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
18.12.2014, 12:13
Beitrag #14
RE: Multikopter
Achso. Na dann viel Spaß und Erfolg Smile
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
19.12.2014, 20:18
Beitrag #15
RE: Multikopter
(11.12.2014 20:37)Thorsten Pferdekämper schrieb:  Hi,
also hier bin ich schon...
Der Bausatz mit Rahmen, Motoren und ESCs ist inzwischen da. Die ESCs können 15A, die Mototen können das auch und davon gibt's 4. Also maximal 60A... Meine besten Lipos sind 1300mAh mit 25C. Das reicht wohl nicht. Ich denke, da muss mindestens 2500mAh mit 30C her.
Wampo, hast Du da eine Empfehlung? Die Dinger sollten ja auch nicht so schwer sein.
Welche Stecker/Buchsen nimmt man denn da am besten? XT60?
Dann geht's weiter: Mein Balancer kann nur 800mA. Das dauert dann ja ewig für 2500er Akkus. Möglicherweise ist das für Lipos auch gar nicht sooo gut. Was wäre denn da zu empfehlen?
Danke&Gruß,
Thorsten

Hy hallo,

gehen wir mal davon aus das du die ESC´s voll forderst brauchst du also 60A + kleingedöns von empfänger, steuerung usw... sagen wir mal max 65A
Dann bist du mit nem 2500er Akku gut bedient, allerdings muss ich sagen das deine Flugzeit nich grad die längste sein wird. evtl hier nen 5000er draufschnallen, wichtig sind hier auch die Probs, meine Carbon Probs für mein Hexacopter haben 15 x 5.5 Inch... je stärker die steigung desto mehr Kraft benötigen die Motoren aber desto kräftiger wird er vom Abzug genauso auch andersrum.

Bei den Steckern reichen dir locker die XT60, es gibt auch noch 90er aber die brauche noch nichmal ich... habe 2x 6s 6300mAh Akkus Palalel. Wink

Welches ladegrät benutzt du momentan für LoPi´s?
Die meisten Ladegräte Balancen schon beim Laden und nicht erst im nachhinen.

Greez
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
20.12.2014, 10:38
Beitrag #16
RE: Multikopter
(19.12.2014 20:18)Wampo schrieb:  Dann bist du mit nem 2500er Akku gut bedient, allerdings muss ich sagen das deine Flugzeit nich grad die längste sein wird. evtl hier nen 5000er draufschnallen,
Ich denke, dass ich mir anfangs zwei davon bestellen werde: http://www.stefansliposhop.de/liposhop/S...:1009.html.

Zitat:Welches ladegrät benutzt du momentan für LoPi´s?
Das Ding sieht ungefähr so aus: http://modellflugwelt.de/e-flite-2-3-zel...oCyrPw_wcB, nur dass es tatsächlich 800mA kann und nicht nur 650mA.
Wie gesagt, dass würde für 2600mA mindestens 3 Stunden brauchen. Außerdem würde ich gerne ein Ladegerät haben, mit dem ich auch entladen kann und die Ladeschlussspannung sowie die Strombegrenzung einstellen kann. Das wäre auch wichtig für die Lagerung und Entsorgung.
Gruß,
Thorsten

Falls ich mit einer Antwort helfen konnte, wuerde ich mich freuen, ein paar Fotos oder auch ein kleines Filmchen des zugehoerigen Projekts zu sehen.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste