Und Software wird sich immer mehr in den mobilen Bereich verlagern. Das ist durch die mobilen Hardwareverkäufe und Marktforschungen ersichtlich. Ein guter Entwickler sollte sich immer an den neusten Technologien orientieren. Ein neuer Trend tendiert eindeutig in Richtung Hardware-Entwicklung. Heute stellen wir euch ein Tutorial zur Verfügung, wie ihr ohne weitreichende Elektrotechnik-Kenntnisse mit Arduino-Technologie Hardware entwickeln könnt, die per Smartphone gesteuert wird. Dabei fallen typische Arbeiten der Elektrotechnik weg: Platinenlayout, ätzen und weitere "Lower-Level-Logik".
Benötigte Hardware


- Ein Arduino Mega ADK
- Ein Breadboard
- Zwei isolierte Drähte
- Eine LED
- Einen 220 Ohm Widerstand
- Ein Android-Smartphone mit der Betriebssystem-Version 2.3.3 oder größer.
Hardware-Setup

Als Widerstand selbst reicht eine Stärke von 220 Ohm mit einer Toleranzschwelle von 5 Prozent. Ihr erkennt diesen an den farbigen Bändchen (gold, braun, rot, rot). Eine LED verfügt über ein langes und ein kurzes "Bein". Der längere Draht kennzeichnet den Plus-Pol (Anode) und der kürzere Draht der LED den Minus-Pol (Kathode).
Programmierung des Arduino Mega ADK und Konfiguration der Arduino IDE
- AndroidAccessory
- UsbHost
/* * Tutorials by www.softwaresupply.de * * Lets the ADK blink when device is connected. * * V = R * I * Resistpr 220 ohm (gold brown red red) * * Because: * LED has 30mA to 50mA. We take 30mA. * Pinout usually is on 5V. * R = V / I = 5V / 30mA = 1V/6mA = 1V/0,006A = 166 Ohm. * Next higher is 220 ohm * * Connect the cathode (short leg) to the GND * Generall red wires: anode; black wires: cathode */ #include #include #define LED_PIN 2 void setup() { // set communiation speed Serial.begin(115200); pinMode(LED_PIN, OUTPUT); } void loop() { Serial.println("New loop, accessory is connected."); digitalWrite(LED_PIN, HIGH); // turn off light delay(1000); digitalWrite(LED_PIN , LOW); // turn off light delay(1000); digitalWrite(LED_PIN, HIGH); // turn off light delay(1000); digitalWrite(LED_PIN , LOW); // turn off light delay(1000); }
Im oberen Teil befindet sich ein Kommentar mit Hinweisen, wie sich die Stärke des Widerstands berechnen lässt. Der eigentliche Code beginnt mit der Integration der Bibilotheken Max3421.h und Usb.h. Diese werden für die spätere USB-Verbindung benötigt. Weiter definieren wir eine Konstante LED_PIN, welche genau den numerischen Wert des PINs trägt, an dem die Anode der LED angeschlossen ist. Die setup()-Methode zu Beginn eines Arduino-Programms beinhaltet das Codestück, welches initial nach dem Aufspielen des Programmcodes ausgeführt wird. Darin definieren wir die baud-Rate der seriellen Verbindung auf den Wert 115200. Im Monitor müssen wir in der Dropdown-Liste die baud-Rate auf diesen Wert stellen, um die richtige Konsolen-Ausgabe zu erhalten.
pinMode(LED_PIN, OUTPUT);
wird PIN 2 des Boards als Ausgangs-PIN bestimmt, da das Board das Signal an die LED abgibt.
Serial.println("...");
ermöglicht eine Ausgabe auf dem seriellem Ausgabegerät - unserer Konsole. Mittels
digitalWrite(LED_PIN, HIGH); // turn off light digitalWrite(LED_PIN, HIGH); // turn oon light
wird das digitale Signal HIGH = 1 bzw. LOW = 0 auf den Ausgang von PIN 2 geschaltet. und damit die LED ein- bzw. ausgeschaltet. Um zu vermeiden, dass der Wechsel zu jedem Taktschlag des Prozessors stattfindet, wir jeweils eine Verzögerung von einer Sekunde eingebaut:
delay(1000);
Um diesen Code zu kompilieren und auf das Board zu spielen, reicht ein Klicken auf den Pfeil-Button. Die LED fängt jetzt im Sekundentakt an zu blinken. Damit der Upload funktioniert müssen sämtliche Fehlerquellen ausgeschlossen werden. Achtet insbesondere auf die korrekte Einbindung der Bibilotheken.
Entwicklung der Android App
Initial werden einige Instanz- und Klassenvariablen definiert. Der Toggle-Button soll die LED ein- und ausschalten. Alle anderen Werte sind Konstanten oder werden im Folgenden erläutert.
In onCreate() werden erste Initalisierungen vorgenommen. Der UsbManager behandelt die USB-Verbindung. Der PermissionIntent ist ein Intent, welcher für die Erlaubnis zuständig ist, die App zu starten, sobald ein USB Gerät mit dem Smartphone verbunden wird. Der Benutzer wird dann gefragt werden, ob er die USB-Verbindung auch wirklich zulassen möchte. Der Receiver wird registriert und die View geladen. Den Code der View posten wir hier nicht - es ist ein triviales Layout, welches lediglich den Toggle-Button beinhaltet. Diesem wird noch der onCheckChangedListener zugewiesen. Bei einem Schalterwechsel wird die folgende Methode sendLedSwitchCommand aufgerufen.
In der onResume()-Methode wird nach dem verbundenen Accessory, dem ADK-Board, in mUsbManager.getAccessoryList() gesucht. Wenn noch eine Benutzererlaubnis erforderlich ist, wird diese durchmUsbManager.requestPermission(accessory, mPermissionIntent) angefragt. Ist die Erlaubnis allerdings bereits schon vorhanden, so wird die Verbindung durch openAccessory (siehe unten) hergestellt.
Wird die Activity pausiert oder beendet werden die Accessory-Verbindung durch closeAccessory (siehe unten) getrennt, bzw. der Receiver deregistriert.
Das Herstellen der Verbindung wird durch den FileDescriptor des UsbManagers erreicht. Dieser FileDescriptor ist erforderlich für die Erzeugung eines Inputstreams und eines Outputstreams. Mit diesen Streams kann, z.B. in einer Schleife, die serielle textuelle Verbindung zwischen dem ADK-Board und der Smartphone gelesen und geschrieben werden. Soll heißen: Der Inputstream liest, was das Board an das Smartphone senden, der Outputstream sendet Text vom Smartphone an das Board. In der closeAccessory-Methode werden alle offenen Verbindungen geschlossen.
Entscheidend ist nun noch das Versenden der Nachricht vom Smartphone an das Board. Hierfür definieren wir zunächst ein eigenes Nachrichten-Protokoll:
- Das erste Byte der Nachricht definiert den Nachrichtentyp. Unsere Konstante 0x2 definiere der Nachrichtentyp LED-Schaltung.
- Das zweite Byte der Nachricht ist das target, welches einfach den Ziel PIN angibt, an welchem die LED als Ausgang angeschlossen ist.
- Das dritte Byte trägt entweder den numerischen Wert 1 (Licht an) oder 0 (Licht aus)
Der Vollständigkeit halber wird hier noch der BroadcastReceiver für die USB-Verbindung initialisiert. Dieser öffnet bzw. schließt die serielle Verbindung zum Accessory beim Anlegen oder Trennen der USB-Verbindung.
Hier noch die Manifest-Datei, die erforderlich sind, dass die USB-Intents auch die App erreichen:

In dieser wurde auf einen Accesory-Filter verwiesen. Hier die accespry-filter.xml:

Anpassung des Arduino Codes
Der Arduino Code muss nun so angepasst werden, dass das Mega ADK die Nachrichten des Smartphones über die serielle USB-Verbindung entgegennimmt und verarbeitet:#include <Max3421e.h> #include <Usb.h> #include <AndroidAccessory.h> #define COMMAND_ANALOG 0x3 #define TARGET_PIN_2 0x2 AndroidAccessory acc("Manufacturer", "Model", "Description", "1.0", "URI","Serial"); byte rcvmsg[6]; AndroidAccessory acc("Manufacturer", "Model", "Description", "1.0", "URI","Serial"); byte rcvmsg[255];Wir haben nun zusätzliche ein Android Accessory. Die Konstanten des Nachrichten-Protokolls sind analog zur Android-Implementierung. Die Parameter, welche für die acc-Instanz genutzt werden, müssen mit dem obigen Filter der Android-Resourcen übereinstimmen. Das Array rcvmsg ist ein Puffer zu lesen der ankommenden Nachricht in einem Stream.
void loop() { delay(5); if (acc.isConnected()) { acc.read(rcvmsg, sizeof(rcvmsg), 1); Serial.println(rcvmsg[0]); Serial.println(rcvmsg[1]); Serial.println(rcvmsg[2]); Serial.println("#"); if (rcvmsg[0] == COMMAND_LED && rcvmsg[1] == TARGET_PIN_2) { byte value = rcvmsg[2]; if (value == VALUE_ON) { digitalWrite(PIN, HIGH); } else if (value == VALUE_OFF) { digitalWrite(PIN, LOW); } } } }
Sofern das Accessory verbunden ist, wird per acc.read die einkommende Nachricht gelesen. Wurde der richtige Nachrichtentyp übergeben, so wird die Nachricht gelesen. Sie befindet sich im Array, an der Stelle mit Index 2. Dieser Wert wird an die LED am Target-Ausgang weitergegeben mittels digitalWrite. Damit wird die LED ein- bzw. ausgeschaltet.
Übetragung und Fehlerbehebung
Den vollständigen Sourcecode findet Ihr im Anhang.An dieser Stelle sollte nun die Android App auf dem Smartphone installiert sein und der Arduino Code sollte auf dem Arduino Mega ADK ausgeführt werden.

Auf dem Smartphone erscheint nun, wenn noch nicht erteilt, ein Permission-Request für den USB-Intent. Nachdem dieser erteilt ist, lässt sich die LED nun von dem Smartphone aus über den Toogle-Button ein- und ausschalten.
Insbesondere das Erkennen des Smartphones kann Schwierigkeiten bereiten, z.B. dass der Monitor keine Reaktion auf das Device anzeigt. In diesem Fall sollte die Verbindung idealerweise mit einem anderen Smartphone oder auch mit einem anderen USB-Kabel getestet werden. Bei Geräten, wie dem Galaxy S3 kommt es zu Schwierigkeiten, die auf die oben genannten USB-Treiber zurückzuführen sind. Leider ist eine Reparatur im Treiber-Code meist bei einem Firmware-Update bereits nicht mehr wirksam. Wenn ihr hier aber Schwierigkeiten habt, hilft euch das Team von softwaresupply gerne beim Verbindungsaufbau.