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

Was ihr zunächst braucht ist ein Arduino Board. Ein Arduino Board ist eine "fertige" Platine, welche alle nötigen Module bereits verbaut haut: Mikrocontroller, Prozessor, Speicher, Eingänge, Ausgänge, u.a. Soll heißen: Diese Boards können mit der eigenen Arduino-Code Programmiersprache programmiert werden. Man kann zum Beispiel LEDs, Motoren, Temparatursensoren oder andere Module per Draht anschließen und diese dadurch über die Ein- und Ausgänge ansprechen. Um die Kommunikation mit Android Smartphones zu vereinfachen, bietet sich das Arduino Mega ADK-Board an. Dieses hat einen USB-Anschluss, welcher direkt mit dem Smartphone verbunden werden kann und auf die Kommunikation mit Android ausgelegt ist. Es ist ab ca. 60 Euro erhältlich.

Das Arduino Mega ADK ist optimiert für die Entwicklung mit Android

Im folgenden Beispiel werden wir eine Android App bauen, welche per USB mit dem Anschluss auf der oberen linken Seite verbunden ist. Diese App kann Nachrichten mit dem Mega ADK über die verfügbare serielle Schnittstelle austauschen. Um dies testen zu können, benötigt Ihre noch weitere Hardware-Teile. Drähte, Widerstände und eine LED. Idealerweise werden die Teile auf einem Breadboard verbunden. Ein Breadboard ist ein Steckbrett, das ermöglicht Drahtverbindungen durch das Stecken von Drähten in das Board herzustellen. Das macht die Arbeit stabiler und lässt die Entwicklung testen, ohne das man die Verbindungen bereits löten muss:

Ein Breadboard ermöglicht Steckverbindungen zwischen den Bauteilen

Was wir also nun brauchen:
  • 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.
Unsere Empfehlung, einige gute Hardware für viele Arbeiten immer griffbereit zu haben, sind die Starter-Kits von FRITZING.


Hardware-Setup

Wir beginnen nun mit dem Aufbau. Ziel ist es per Smartphone App eine LED ein- und ausschalten zu können:

 

Mega ADK Board Setup

 

Am PIN 2 des ADK-Boards ist der rote Draht angeschlossen. Dieser leitet eine geringe Spannung < 3 Volt zum Breadboard - kurz vor den Widerstand. Damit das Board Strom weiterleiten kann muss, es per USB an euren Computer angeschlossen sein. Das Breadboard verbindet den Draht mit dem Ende des Widerstands, welcher sich direkt daneben befindet. Die Strom-Linien auf dem Breadboard verlaufen in der Mitte "senkrecht". Demzufolge ist das andere Ende des Widerstands mit der LED verbunden.

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).

 

Durch den Widerstand wird die Stromstärke, welche von PIN 2 des Boards kommt, so verringert, dass die Lampe nicht kaputt geht. Die LED, welche 30 - 50 mA Strom benötigt und verträgt, ist mit ihrer Anode, also dem längeren "Bein" mit dem Widerstand verbunden. Nachdem der Strom durch sie geflossen ist, muss der Schaltkreis noch geschlossen werden. Dies geschieht, indem die Kathode der LED nun mit dem Ground (GND) des Boards verbunden wird. Fertig - alle Hardware-Vorkehrungen sind nun getroffen.

 

Programmierung des Arduino Mega ADK und Konfiguration der Arduino IDE

Der nächste Schritt liegt in der Programmierung des Boards. Wir wollen die LED zunächst ohne Einwirkung eines Smartphones einfach blinken lassen. Dafür müsste ihr euch zunächst die neuste Arduino-Software von arduino.cc downloaden und die Gerätetreiber auf euren Betriebssystem installieren.
Zu Beginn müssen noch einzelne Einstellungen vorgenommen werden:

 

Damit das Arduino-Board mit dem sogenannten Accessory (Android-Smartphone) kommunizieren kann, werden externe Bibilotheken benötigt:
  1. AndroidAccessory
  2. UsbHost

Ihr findet diese ebenso auf der Arduino-Webpräsenz unter http://labs.arduino.cc/ADK/AccessoryMode Die Order, AndroidAccessory bzw. UsbHost müsste ihr nun in euren Dokument-Ordner packen. Zum Beispiel C:/Users/MaxMustermann/Documnets/Arduino/libraries.

 

Öffnet nun den Editor. Unter Tools - Board wählt ihr das Mega ADK aus. Weiter wählt Ihr unter Tool - Serieller Port die Verbindung aus: Das ist bei einem Windows-Rechner beispielsweise COM1. Um nun einen Konsolenausgabe zu erhalten, öffnet ihr den seriellen Monitor: Tools - Serial Monitor. Damit sollte die Verbindung zum ADK konfiguriert sein. Verwendet nun folgenden Code-Schnipsel:

 

/*
* 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.

Mittels
pinMode(LED_PIN, OUTPUT);

wird PIN 2 des Boards als Ausgangs-PIN bestimmt, da das Board das Signal an die LED abgibt.

Die loop()-Methode ist eine Schleifen-Methode die, während das Board an eine Stromzufuhr angeschlossen ist, immer wieder ausgeführt wird.
 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

Nachdem wir unser erstes Arduino-Programm geschrieben haben, wollen wir nun, dass die LED per Smartphone gesteuert werden kann. Dafür soll es einen Toggle-Button geben, welcher die LED ein- und ausschalten kann. Entscheidend ist hierfür, dass ein Android-Smartphone der Betriebssystem-Version 2.3.3 oder größer vorhanden ist. Andernfalls wird die USB-Verbindung wegen veralteter Treiber nicht unterstützt. Dafür wird folgender Android-Code verwendet:

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:

  1. Das erste Byte der Nachricht definiert den Nachrichtentyp. Unsere Konstante 0x2 definiere der Nachrichtentyp LED-Schaltung.
  2. Das zweite Byte der Nachricht ist das target, welches einfach den Ziel PIN angibt, an welchem die LED als Ausgang angeschlossen ist.
  3. Das dritte Byte trägt entweder den numerischen Wert 1 (Licht an) oder 0 (Licht aus)
Sind alle Parameter gesetzt wird die Nachricht über den OutputStream versendet.

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:

Manifest-Datei der Android App
In dieser wurde auf einen Accesory-Filter verwiesen. Hier die accespry-filter.xml:

Resource-Filter


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.

Schaut nun in den Monitor der Arduino IDE (Tools - Serial Monitor). Wenn ihr nun zusätzlich das Android Smartphone mit dem Board per Mikro-Usb verbindet sollte es direkt eine grafische Ausgabe auf dem Monitor geben:

 



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.

 


Marc-Chagall-Straße 194
40477 Düsseldorf, , 

Tragen Sie sich in den softwaresupply Newsletter ein und erhalten Sie alle News und Angebote zum Thema Android und App Entwicklung.

(C) 2018 softwaresupply.

Disclaimer: Die Inhalte unserer Seiten wurden mit größter Sorgfalt erstellt. Für die Richtigkeit, Vollständigkeit und Aktualität der Inhalte können wir jedoch keine Gewähr übernehmen. Alle Inhalte unterliegen dem Copyright und allgemein geltenden Urheberrecht.

Impressum
Datenschutzerklärung

Bewölkt

13°C

Duesseldorf

Bewölkt

Luftfeuchtigkeit: 81%

Wind: 11.27 km/h