Minikopter

Modifikation eines Mini-Helikopters

Dieses Projekt entstand aus einem Schnäppchen vom Flohmarkt: Ein Mini-Helikopter für wenige Euro, wegen fehlender Fernsteuerung. Daher musste eine eigene Steuerung her. Zuerst habe ich eine SMD-Platine für den ATtiny13, einige Widerstände und Transistoren (H-Brücke) entworfen und geätzt. Die Platine habe ich dann noch aus Gewichtsgründen auf ca. 1mm Dicke gefräst. Der Haupt- und der Heckrotor können jetzt mittels PWM fein gesteuert werden. Außerdem gibt es noch vier (zwei bisher montiert) Fotowiderstände als Lichtsensoren (als Spannungsteiler am ADC des ATtiny angeschlossen).

Die Idee war, einen Lichtsucher für den Luftraum zu realisieren. Die Idee eines Lichtsuchers kam daher, dass Sensoren für einen autonomen Flug (Beschleunigungssensoren und Gyroskope) viel zu schwer und wohl auch viel zu teuer sind. Wenn ich statt dessen Lichtsensoren (gewichtsmäßig noch vertretbar) verwende, könnte man den Helikopter immer in Richtung des am hellsten beleuchteten Sensors steuern und ihn deshalb z.B. mit einer Taschenlampe lotsen.

Mit einer externen Stromversorgung scheint der Auftrieb der Rotoren zu genügen. Ich kann am Kabel aber natürlich nicht ausprobieren, ob er wirklich fliegen würde. Bei Akkubetrieb sinkt leider die Spannung immer stark ab (von 3-4V auf 1-1,2V) und der Rotor dreht sich dann nicht schnell genug (siehe Video unten), d.h. der Minikopter kann nicht abheben. Aufgrund der Größe und des Gewichts des Akkus kann man aber auch nicht so einfach einen neuen oder besseren Akku kaufen, da man kaum so kleine und leichte Akkus findet. Zum Laden des Winzakkus verwende ich die Fernsteuerung eines gekauften Mini-Helikopters, in die ein Ladegerät integriert ist.

Software

Dieser Code für den ATtiny13 lässt eine LED blitzen und testet die Motoren:

#include <avr/io.h>
#include <util/delay.h>

int main (void)
{
  /*Pins PB0, PB1 und PB3 auf Ausgang schalten
  PB0 : PWM Ausgang
  PB1 : PWM Ausgang
  PB3 : LED nach Masse */

  DDRB = 0b001011;

  /*PWM Einstellungen:
  Lösche OC0A/OC0B bei Compare Match beim Hochzählen. Setze OC0A/OC0B bei
  Compare Match beim Herunterzählen. Phase Correct PWM, Prescaler = 256*/

  TCCR0A |= (1<<COM0A1) | (1<<COM0B1) | (1<<WGM00);
  TCCR0A &= ~((1<<COM0A0) | (1<<COM0B0) | (1<<WGM01));
  TCCR0B |= (1<<CS01);
  TCCR0B &= ~((1<<FOC0A) | (1<<FOC0B) | (1<<WGM02) | (1<<CS00) |(1<<CS02));

  /*AD-Converter Einstellungen
  Vcc als Referenz, Ergebnis rechtsbündig, PB4-Kanal, ADC enabled, Takt CLK/8*/

  ADMUX &= ~((1<<REFS0) | (1<<ADLAR) | (1<<MUX0));
  ADMUX |= (1<<MUX1);
  ADCSRA |= (1<<ADEN) | (1<<ADPS0) | (1<<ADPS1);
  ADCSRA &= ~(1<<ADPS2);
  ADCSRB &= ~((1<<ADTS0) | (1<<ADTS1) | (1<<ADTS2));

  /*ADC Konvertierung starten*/
  ADCSRA |= (1<<ADSC);

  /*LED ausschalten*/
  PORTB |= (1<<PB3);

  uint8_t pwmwert = 0;

  while(1)
  {
    //LED blinken lassen
    PORTB &= ~(1<<PB3);
    _delay_ms(50);
    PORTB |= (1<<PB3);
    _delay_ms(1000);

    //PWM-Wert ändern
    OCR0A = pwmwert;
    OCR0B = pwmwert; 

    //Bei Erreichen des Maximum wieder bei 0 starten 
    if(pwmwert >= 255)
    {
    pwmwert = 0;
    }

    //PWM-Wert hochzählen
    pwmwert += 6;
  }
  return 0;
}

Minikopter in Aktion:

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.

Bitte beantworte kurz folgende Frage, um zu zeigen, dass du kein Roboter bist: *