Fertigstellung des Heliumquadrocopters

Ziel der Ingenieurpraxis war die Fertigstellung des HeQuCopters - einem Quadrocopter mit Heliumballon. Er besteht aus einem kohlenfaserverstärkten Kunststoffring an dem die vier Quadrocoptermotoren angebracht sind. Am Ring ist ein Nylonnetz aufgespannt, das den im Ring befindenden Heliumballon fixiert. Der Quadrocopter wird ferngesteuert: Ein Graupner gr-12 Funkmodul empfängt die Steuerungseingaben. Diese werden dann von einem Arduino Pro Mini mit der Software Multiwii weiterverarbeitet. Zur Berechnung der passenden PWM-Signale für die Motoren werden dazu die Messwerte der IMU von Multiwii mitberücksichtigt. (Vgl.: http://www.daedalus.ei.tum.de/index.php/de/dokumentation/projekte/quadrocopter/mit-helium/uebersicht-9)

Um die Stabilität des Quadrocopters zu verbessern wurde eine Dreiecksplatte entworfen und mit dem 3D-Drucker gefertigt. Auf ihr sind die einzelnen elektronischen Komponenten (Microcontroller, Funkmodul, IMU, Akku) befestigt. Zentral angeordnet verlagert sie den Schwerpunkt näher in die Mitte des Quadrocopters. Designed wurde die Dreiecksplatte mit OpenSCAD.

 

Rendering der DreiecksplatteFertige Dreiecksplatte mit Komponenten

 

OpenSCAD Quelltext der Dreiecksplatte:

altitude = 0.3;
length = 60;
ylength = length;
xlength = length*cos(30);
radius = 1;
circle_distance = 5;
ank = circle_distance*cos(30);
gek = circle_distance*sin(30);
edge_distance = 5;
edge_radius = edge_distance * sin(30);
tang_1_x = edge_distance-(cos(60)*edge_radius);
tang_1_y = sin(60)*edge_radius;
tang_2_x = edge_distance*cos(30)*cos(30);
tang_2_y = edge_distance*cos(30)*sin(30);
edge_2_circle_x = edge_radius;
edge_2_circle_y = edge_distance * cos(30);

linear_extrude(height = altitude, center = true, convexity = 1, twist = 0, slices = 1){
  difference(){
    union(){
      polygon(points=[[tang_1_x,ylength/2-tang_1_y], [tang_1_x,ylength/2+tang_1_y], [xlength-tang_2_x,ylength-tang_2_y], [xlength,ylength-edge_2_circle_y], [xlength,edge_2_circle_y], [xlength-tang_2_x, tang_2_y]], paths=[[0,1,2,3,4,5]]);
      translate([edge_distance,(ylength/2)]) circle(r=edge_radius, $fn=50);
      translate([xlength-edge_2_circle_x,ylength-edge_2_circle_y]) circle(r=edge_radius, $fn=50);
      translate([xlength-edge_2_circle_x,edge_2_circle_y]) circle(r=edge_radius, $fn=50);
    }
    translate ([(circle_distance*radius), (length/2),0])  circle(r = radius, $fn=50);
    translate ([(xlength-gek), ank]) circle(r = radius, $fn=50);
    translate ([(xlength-gek), (length-ank)]) circle(r = radius, $fn=50);
  }
}



Das Netz aus Nylonschnüren wurde zu einem Hexagramm weiterentwickelt. Dadurch sitzt der Ballon fester im CFK-Ring. Durch die festere Verknotung ist das Netz zwar nicht mehr so leicht abnehmbar, dafür behält es seine Form.

Gewichtseinsparungen wurden durch eine Erneuerung der Verkabelung erreicht. Zum leichteren Arbeiten am Quadrocopter wurde eine Halterungsvorrichtung gebastelt. Mit der Software gEDA wurde die Verbindung der elektronischen Komponenten untereinander dokumentiert.

Ursprünglich lief Multiwii auf einem Arduino Pro Mini 16 MHz. Da dieser allerdings bei der vorhandenen Akkuspannung von 3,7V übertaktet, sollte er durch einem Arduino Pro Mini 8 MHz ersetzt werden. Dafür wurde die Multiwii-Software angepasst.

In der originalen Output.ino der 2.2 Version von Multiwii steht nun ab Originalzeile 266 anstatt:

  #if (NUMBER_MOTOR > 0)
      #ifndef EXT_MOTOR_RANGE
        OCR1A = motor[0]>>3; //  pin 9
      #else
        OCR1A = ((motor[0]>>2) - 250);
      #endif
    #endif
    #if (NUMBER_MOTOR > 1)
      #ifndef EXT_MOTOR_RANGE
        OCR1B = motor[1]>>3; //  pin 10
      #else
        OCR1B = ((motor[1]>>2) - 250);
      #endif
    #endif
    #if (NUMBER_MOTOR > 2)
      #ifndef EXT_MOTOR_RANGE
        OCR2A = motor[2]>>3; //  pin 11
      #else
        OCR2A = ((motor[2]>>2) - 250);
      #endif
    #endif
    #if (NUMBER_MOTOR > 3)
      #ifndef EXT_MOTOR_RANGE
        OCR2B = motor[3]>>3; //  pin 3
      #else
        OCR2B = ((motor[3]>>2) - 250);
      #endif

folgender Code:

   #if (NUMBER_MOTOR > 0) // Timer 1 A & B [1000:2000] => [8000:16000]
        OCR1A = motor[0]<<2; //  pin 9    //Geaendert
    #endif
    #if (NUMBER_MOTOR > 1)
        OCR1B = motor[1]<<2; //  pin 10    //Geaendert
    #endif
    #if (NUMBER_MOTOR > 2)
        OCR2A = motor[2]>>3;
    #endif
    #if (NUMBER_MOTOR > 3)
        OCR2B = motor[3]>>3;
    #endif



Nach Originalzeile 432 wurde folgender Code eingesetzt:

      // phase correct mode: TOP Wert wird in ICR1 gesetzt
   
      TCCR1A |= (1<<WGM11);   // WGM11 Bit auf 1 setzen
      TCCR1A &= ~(1<<WGM10);  // WGM10 Bit auf 0 setzen
      TCCR1B |= (1<<WGM13);   // WGM13 Bit auf 1 setzen
      TCCR1B &= ~(1<<WGM12);  // PHASE CORRECT MODE
      TCCR1B &= ~(1<<CS11);
      
      ICR1 |= 0x2000;
      


Nach Originalzeile 438 folgt dann:

      // Timer 2 wird eingestellt:
      // Versuchsweise auf FAST PWM
      
      TCCR2B &= ~(1<<WGM22);
      TCCR2A |= (1<<WGM21);  
      TCCR2A |= (1<<WGM20);  

 

Während der Arbeit wurde auch eine Lösung gefunden, um die Multiwii-Software automatisch zu "armen". Dazu muss man in der Multiwii.ino nach Zeile 798 folgenden Code einfügen:

f.ARMED = 1;
headFreeModeHold = heading;




    






Anhänge:
Diese Datei herunterladen (HeQuCop_v1_1.ps)HeQuCop_v1_1.ps[ ]%2013-%11-%27 %0:%Nov%+01:00