Android-Steuerung für Mini-Quadrocopter

 

In diesem Artikel werden 2 verschiedene Ansätze beschrieben, um den Mini-Quadrocopter Udi RC U816 per Android-App zu steuern.  Im erste Ansatz wird versucht, dass Funkprotokoll der beiliegenden Funkfernsteuerung zu ermitteln und dann nachzubilden. Im zweiten Ansatz sollen die Spannungswerte an den Potentiometern der Funkfernsteuerung gesteuert werden.

 

Verwendete Materialien:

  • Udi RC U816 Quadrocopter
  • Raspberry Pi
  • Arduino Duemilanove
  • WLAN Stick TP-Link TL-WN722N
  •  USB-Hub
  • Jumper-Kabel
  • Android-Gerät mit Android 4.x
  • 4x 630kΩ Widerstände
  • 4x 10nF Kondensatoren

 

Android-App:

Zur App siehe auch den Beitrag Android.

Die App sendet einen String mit vier Werten (Throttle, Yaw, Pitch, Roll) über WLAN zum Raspberry Pi. 

ACHTUNG: Wichtig ist, dass der TCP-Client in der App die passende IP-Addresse für das WLAN und den selbern Server-Port wie der Server verwendet.

Bei Kompatibilitätsproblemen mit späteren AndroidStudio-Versionen ist es am einfachsten, ein neues Projekt zu erstellen und den Code aus dem alten Projekt zu kopieren.*

Das Android-Studio-Projekt sowie eine ausführbare .apk-Datei befinden sich im Anhang.

Funkprotokoll des U816:

Zur Ermittlung des Funkprotokolls wurde ein LogicAnalyzer an die Funkfernbedienung angeschlossen und verschiedene Lenkbewegungen durchgeführt. 

Es werden pro Sendevorgang 13 Byte an Daten an das Funkmodul übermittelt.

Relevant für den Flug sind dabei die Bytes 6, 7 und 8. Sie beinhalten die Werte für Gas, Drehung um die eigene Achse, sowie Bewegungen nach links, rechts, vor und zurück.

Die Aufteilung, welche Bits für welchen Befehl stehen, kann nachfolgendem Bild entnommen werden. Eventuell haben auch noch andere Bytes eine Bedeutung, beispielsweise Trimmung.

 

Raspberry Pi:

Mit dem Raspberry wird ein Hotspot erstellt, mit dem sich das Android-Gerät verbinden kann, um darüber dann die Kontroll-Daten zum Raspberry Pi zu senden. Zum WLAN-Setup siehe den Beitrag Raspberry Pi.


Auf dem Raspberry Pi läuft ein in Python 3 geschriebener Server. Der von der App empfangene String (in data gespeichert) wird zunächst aufgetrennt

var = data.split('\n')
var = var[0].split(',')

wobei var eine Liste mit 4 Elementen ist.

Dann werden die Listenelemente, die bisher als String gespeichert sind, in eine Integer umgewandelt.

var[0] = int(var[0]) #Pitch-Wert
var[1] = int(var[1]) #Roll-Wert
var[2] = int(var[2]) #Yaw-Wert
var[3] = int(var[3]) #Throttle-Wert

Für die Variante 2 genügt dies.
Will man die Variante über das Funkmodul wählen, müssen die viel Werte nun noch zu 3 Werten, die für das Funkmodul verständlich sind, zusammen gefügt werden. Je nach dem, in welchem Wertebereich die App die Daten versendet, kann es nötig sein, die Werte noch anzupassen.

var[0] = var[0]/8 + 16
var[1] = var[1]/8 + 16
var[2] = var[2]/8 + 16
var[3] = var[3]*100/255
send_data.append(var[3]) send_data.append((var[2]<<3) + (var[0]<<1)) send_data.append((var[0]<<6)&xff)+ (var[1]<<1))
 

Wenn dann alle Kontroll-Daten in passender Form vorliegen, können sie zum Arduino gesendet werden. Dies ist zum Beispiel über I²C möglich. Zur Konfiguration von I²C auf dem Raspberry Pi ist hier alles erklärt.

Um Daten dann an den Arduino zu senden, wird im Python-Programm eine Funktion writeNumber implementiert.

def writeNumber(addr, value):
   try:
      bus.write_block_data(addr, cmd, value)
      flag = 0
   except IOError:
      subprocess.call(['i2cetect','-y','1'])
      flag = 1
   return

Das 'except IOError' ist notwendig, da es gelegentlich zu einem IOError kommt. Dabei bricht die I²C-Verbindung ab und das Programm würde normalerweise abgebrochen. Mit 'subprocess.call' wird die Verbindung wieder hergestellt.

Verkabelung:

Arduino <-----> Raspberry Pi
Pin 4(SDA) <-----> GPIO 0(SDA)
Pin 5 (SCL) <-----> GPIO 1(SCL)
GND <-----> GND

Der gesamte Code für beide Varianten zum ausführen auf dem Raspberry befindet sich im Anhang.

 

Arduino:

Der Arduino soll die Daten vom Raspberry empfangen. Dies wird mit Wire.read() realisiert. 

Um die Steuer-Befehle dann zum Quadrocopter zu senden, gibt es zwei Möglichkeiten:

Variante 1:

Für Variante 1 muss das Funkmodul aus der Funkfernbedienung ausgebaut werden.

Dieses wird dann per SPI mit dem Arduino wie folgt Verbunden:

Arduino <----> Funkmodul
Pin 8 <----> IRQ
Pin 9 <----> CE
Pin 10 <----> CSN
Pin 11 <----> MOSI
Pin 12 <----> MISO
Pin 13 <----> SCK
GND <----> GNC
3,3V <----> Vcc

 

Variante 2:


Bei Variante 2 wird die komplette Elektronik aus der Funkfernsteuerung ausgebaut. An den Lötstellen der Potentiometer werden Kabel angelötet, die mit dem Arduino verbunden werden können. Außerdem muss auch die Stromversurgung an den Arduino angeschlossen werden.

Der Arduino soll dann die Spannungen an den Potis steuern.

 

 

Außerdem ist es nötig, einen einfachen Tiefpass zwischen Arduino und Funkelektronik zu schalten. Dafür sind nur 4 630kΩ Widerstände und 4 10nF Kondensatoren nötig.