AndroidBallMaze

Android Ball Maze

Von am 30.03.2014

Im Wintersemester 2013 beschäftigte ich mich mit der Verbindung zwischen Android Smartphone und Arduino Mikroprozessor um damit ein Kugellabyrinth zu steuern. Mein Ziel war es, die Daten des Accelerometer-Sensors auszulesen und somit durch Kippen und Neigen des Smartphones das Holzlabyrinth mittels zwei Motoren zu bewegen.

bluetooth-modul

Nach einigem Recherchieren, habe ich mich für eine Bluetooth Verbindung zur Kommunikation entschieden. Dazu wurde das Kiblue Serial Bluetooth Modul verwendet.Dieses lässt sich sehr einfach mit dem Arduino über die TX/RX Schnittstelle verbinden und mit einer 5 Volt Spannungsquelle versorgen.
Weitere Möglichkeiten einer Android-Arduino Kommunikation hat Ewald in seinem Artikel beschrieben.

Um das Kugellabyrinth zu bewegen, habe ich zwei Servomotoren eingesetzt. Ein Servomotor ist ein spezieller Elektromotor, der mit einem Sensor zur Positionsbestimmung ausgestattet ist. Dadurch ist es möglich die Bewegung der Drehung genau zu steuern. In diesem Fall wird der Motor zwischen 0° und 180° angesteuert um die Bedienelemente des Kugellabyrinths zu drehen.

Ein Servomotor erhält normalerweise alle 20 Millisekunden einen Impuls zwischen ein und zwei Millisekunden. Der Motor bleibt dann 20ms in der eingestellten Position bis der nächste Befehl kommt.

ppm
Dieses Verfahren wird Pulsphasenmodulation genannt und ist über einen digitalen Ausgang des Arduinos möglich. Um die Impulse nicht selbst berechnen zu müssen, stellt Arduino dafür eine eigene servo library zur Verfügung. Dadurch ist es leicht möglich die Position zu bestimmen.
Bsp für Neutralposition:
servo.write(90);

Die Servomotoren werden mit 5 Volt versorgt. Wichtig beim Betrieb, vor allem bei mehreren Motoren, ist eine eigene Spannungsquelle. Der 5V Ausgang des Arduinos reicht dafür nicht aus. In meinem Beispiel werden daher ein 12V Netzteil für das Arduino selbst, sowie ein 5V Netzteil für die Motoren und das Bluetooth Modul verwendet. Zu beachten ist, dass dabei der Ground des Arduinos mit dem Ground der externen Spannungsquelle verbunden wird.

Schaltplan:

schaltplan_Steckplatine

Die native Entwicklung des Android Apps war nicht ganz so einfach. Die Android Entwicklerseite bietet zum Glück aber einen guten Überblick über die wichtigsten Bluetooth Funktionen.
Um auf die Bluetooth Funktion zugreifen zu können, wird der BluetoothAdapter benötigt.
BluetoothAdapter mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
Um sich mit einem Gerät zu verbinden, wird bei einem click auf den connect button eine weitere View geöffnet welche alle Bluetooth Geräte in Reichweite auflistet. Beim click auf eines davon wird die Verbindung gestartet.
BluetoothDevice device = mBluetoothAdapter.getRemoteDevice(address);
ConnectThread connect = new ConnectThread(device);
connect.start();

Sobald die Verbindung erfolgreich aufgebaut ist, wird der connectedThread gestartet.
ConnectedThread connectedThread = new ConnectedThread((BluetoothSocket)msg.obj);
connectedThread.start();

Dieser bietet eine write() Methode an, über die die Werte des Accelerometers als byte gesendet werden können.
byte[] command = new byte[2];
command[0]=(byte) ypos;
command[1]=(byte) xpos;
connectedThread.write(command);

Der Arduino Mikrocontroller liest bei bestehender Verbindung die empfangenen Werte ein und mappt diese für die Servomotoren auf 0-180.
int incomingValue = Serial.read();
values[currentValue] = incomingValue;
currentValue++;
if(currentValue > 1){
currentValue = 0;
}

Hier noch ein kurzes Funktionsvideo:

Den Sourcecode für Arduino und Android gibt es hier zum Download.

The comments are closed.