Fernbedienung Gimbal

Um die Bedienung der Halterung zu vereinfachen wurde die Bodenstation, die aus einem Arduino und einem Funkmodul bestand, zu einen mobilen Fernbedienung erweitert.

 

 

Hardware:

Die Fernbedienung besteht aus vier Komponenten: Microcontroller, Funkmodul, Eingabegeräten und einer Stromversorgung:

 

 

Microcontroller & Funkmodul:

Der Microcontroller ist ein gewöhnlicher Arduino Pro mini mit dem AtMEGA328p und 16MHz Taktfrequenz und ein auf den Nordic Semiconductor NRF24L01+ basierendes Funkmodul an das der HF-Verstärker MCP01 angeschlossen ist.

Stromversorgung:

Ein wichtiger Punkt bei mobilen Geräten ist deren Stromversorgung. Es muss zum einen ein Kompromiss aus Gewicht, Größe und Laufzeit gefunden werden und zum anderen alle erforderlichen Spannungen bereitgestellt werden.

Für diese Fernbedienung sind die Spannungen 3.3V und 5V erforderlich. Diese müssen aus den 3.7 V- 4.2V  die der Lithium-Polymer Akku bereitstellt gewonnen werden. Dies erfolgt in zwei Schritten. Zuerst wird die Akku Spannung mittels des Step-Up-Reglers <NAME> auf 5V hochtransformiert und anschließend durch den Linearregler TS2940 auf 3.3V geregelt.

Um den Akku aufladen zu können ohne die Fernbedienung auseinander zunehmen, wurde ein USB Lipo Lader von Sparkfun Electronics verbaut. Durch einen Schalter kann dann zwischen den Positionen AUS/LADEN und EIN umgeschaltet werden.

In der Position AUS/LADEN ist der Akku nur mit dem Lader verbunden und kann einfach an einem USB-Port aufgeladen werden.

Eingeschaltet wird die Fernbedienung indem der Schalter in die Position EIN gebracht wird. Hier ist der Akku mit dem Step-Up-Regler verbunden. Der Akku befindet sich unterhalb der Zusatzplatine.

Eingabegeräte:

Zur Eingabe können drei Taster und ein Joystick mit einem internen Taster genutzt werden. Zudem befindet sich über jedem Taster eine Led, die z.B als Indikator für ein Ereignis genutzt werden kann.

Um  die Abmessungen möglichst handlich zu halten wurden die Tasten und der Joystick auf einer zusätzlichen Platine, die einfach abgesteckt werden kann, montiert.

Zum auslesen des Joysticks werden dessen Potentiometer als Spannungsteiler mit 5V beschaltet und mit jeweils einem Analog-Digital-Converter-Pin des Arduino beschaltet. Somit ist eine Positionsbestimmung mit einer Auflösung von 10bit möglich.

Die vier Taster sind in einer Active-Low-Konfiguration mit den internen Pull-Up-Widerständen des Arduino verschaltet. Dabei wird wenn der Taster gedrückt wird, der Input-Pin auf Masse gezogen. Ist der Taster offen, so bringt der interne Pull-Up-Widerstand den Eingang auf definiertes Potenzial.

 

Pinbelegung:
Die Pins der einzelnen Bausteine ist wie folgt mit denen des Arduinos verbunden:

Nordic:

Pin Arduino
CE  9
CSN 10
MOSI 11
MISO 12
SCK 13
INT 2

Eingabe:

Bezeichnung Arduino
Joystick hor A0
Joystick ver A1
Joystick Taster 8
Taster links 5
Taster mitte 6
Taster rechts 7
Led links A3
Led mitte A2
Led rechts 4

 

Software


Die Software basiert auf dem Code der Basisstation. Dieser wurde um die Eingabegeräte auswerten zu können, entsprechend erweitert:

Eingabegeräte

Taster

Um die Taster auszulesen wird zunächst in der Setup-Funktion die Richtung der jeweiligen Pins auf "Input" gestellt und anschließend der Pull-Up-Widerstand aktiviert:

 

pinMode(JOY_BUTTON_PIN,INPUT);
  digitalWrite(JOY_BUTTON_PIN,HIGH); // pullups

  pinMode(BTN_L_PIN,INPUT);
  digitalWrite(BTN_L_PIN,HIGH); // pullups

  pinMode(BTN_M_PIN,INPUT);
  digitalWrite(BTN_M_PIN,HIGH); // pullups

  pinMode(BTN_R_PIN,INPUT);
  digitalWrite(BTN_R_PIN,HIGH); // pullups

 

 Nun lässt sich der aktuelle Wert mit digitalRead bequem auslesen:

 

  btn_joy_raw = digitalRead(JOY_BUTTON_PIN);
  btn_l_raw = digitalRead(BTN_L_PIN);
  btn_m_raw = digitalRead(BTN_M_PIN);
  btn_r_raw = digitalRead(BTN_R_PIN);

 

Die Entprellung der Taster erfolgt durch eine Zeitmessung:

long t = micros();

  if(!btn_joy_raw && ( t - btn_joy_time > BTN_JOY_TIMEOUT  ) ){

    btn_joy = 1;
    btn_joy_time = t;

  }
  else{
    
    btn_joy = 0;
   
  }

 

Am Anfang der Funktion loop() wir die aktuelle Zeit in Mikrosekunden in einer Variable abgespeichert. Danach wird die Zeitdifferenz zum letzten gespeicherten Wert (hier : btn_joy_time) berechnet und mit einem Zeitintervall verglichen.

Ist der Taster gedrückt, und die Zeitdifferenz zum Letzten Druck größer als das Zeitintervall so wird die Variable btn_joy auf 1 gesetzt und die aktuelle Zeit zwischengespeichert.

In der nächsten Iteration von loop() wird btn_joy wieder auf zurückgesetzt und kann nicht mehr gesetzt werden, bis die in BTN_JOY_TIMEOUT definierte Zeit abgelaufen ist.

Auf diese weise wird nicht nur der Schalter entprellt, sondern auch die Erkennung von gedrückt gehaltenen Tasten vereinfacht, da lediglich die Anzahl der Pulse gezählt werden muss.

 

Joystick

Die Potentiometer des Joysticks lassen sich mit dem analogRead Befehl genauso auslesen. Eine explizite Festlegung der Pin-Richtung entfällt dabei:

 

  joy_y_raw = analogRead(JOY_Y_PIN);
  joy_z_raw = analogRead(JOY_Z_PIN);

 

In den Variable joy_y_raw und joy_z_raw steht nun ein Wert zwischen 0 und 1023. Die Mittelstellung der jeweiligen Achse korrespondiert zum Wert 512. Als nächstes wird der Rohwert auf das Intervall [-1;1] abgebildet:

 

#define JOY_Y_OFFSET 512
#define JOY_Z_OFFSET 501

#define JOY_RANGE 511.5f

joy_y = (float) ( (float) (joy_y_raw -JOY_Y_OFFSET) / JOY_RANGE); joy_z = (float) ( (float) (joy_z_raw -JOY_Z_OFFSET) / JOY_RANGE);

 

Anschließend muss noch die Position in Winkeldaten umgewandelt werden, damit sie an die Halterung verschickt werden können:

#define JOY_Y_VEL 7.0f

#define JOY_Y_THRES 0.3f
#define JOY_Y_BASETIME 300000L
#define JOY_Y_TIMESCALE 253000.0f

  byte sendnow = 0;

  if( abs(joy_y) > JOY_Y_THRES ){

    if( t - joy_y_time > (JOY_Y_BASETIME - (long)(JOY_Y_TIMESCALE * abs(joy_y)))   ){

      ang[Y] = (int) (sgn(joy_y) *((long) (JOY_Y_VEL * abs(joy_y) )));
      joy_y_time = t;
      sendnow = 1;
    }
    else{

      ang[Y] = 0;
    }

  }

 

Anstatt in einem festen Intervall eine Konstante Winkeländerung zu senden, wird hier sowohl das Intervall als auch die Amplitude variiert. So führt eine größere Auslenkung zu einer größeren Drehgeschwindigkeit der Halterung.

Schließlich wird das Datenpaket versendet:

if(sendnow){    
#if RADIO == 1

    radioSend(SRV_REMOTE_YZ_INCR,ang);

#endif

   sendnow = 0;

  }
  else{

    ang[X] = 0;
    ang[Y] = 0;
    ang[Z] = 0;

  }

 

 Inbetriebnahme

 Die Fernbedienung wird eingeschaltet indem der blaue Schalter auf der Linken seite nach oben geschoben wird. Danach ist sie betriebsbreit.

Die Tastenbelegung ist folgendermaßen:

Taste/LED/Stick Funktion
Joystick vertikal Kamera hoch und runter drehen
Joystick horizontal Kamera rechts und links drehen
Joystick Taster Nicht belegt
Taster links Nicht belegt
Taster mitte Position zurücksetzen
Taster rechts Stabilierung Ein-/Ausschalten
Led links blinkt (ohne Bedeutung)
Led mitte blinkt (ohne Bedeutung)
Led rechts EIN: Stab. aus AUS: Stab. ein

 

Zum Laden des Akku, Fernbedienung ausschalten und den Lipo-Charger an einen USB-Port anschließen.

 

 

 

Anhänge:
Diese Datei herunterladen (Remote.zip)Remote.zip[ ]%2013-%10-%31 %0:%Okt%+01:00