Verbinden und Steuern eines Arduino Boards mit Cascades

IMG_20140228_094623Hallo, hier ist @leaschnherr und heute will ich im Rahmen von Mobile Computing Plattformen erklären, wie man den USB Host Mode des Z30 nutzen kann um ein Arduino Uno Board zu steuern. Um es einfach zu halten, war zunächst mein Ziel die Intensität einer LED zu kontrollieren.

Der Code für den Arduino kann unverändert aus dem Dimmer Beispiel von Arduino übernommen werden, das du hier mit hilfreichen Erklärungen findest.

Wenn du das erste mal mit einen Arduino arbeitest, lese die Anweisungen auf der Website hier. Stelle sicher, dass das Programm korrekt läuft und teste einige Beispiele, um dich an die Umgebung zu gewöhnen.

Der Code für die BlackBerry 10 App ist etwas komplexer und im ersten Teil will ich nur erklären, wie USB Geräte erkannt werden und wie man auf diese zugreift.

Nachdem ein neues Cascades Projekt erstellt worden ist, muss zunächst die Peripheral Discovery Library hinzugefügt werden. Wenn Momentics verwendet wird, kann diese einfach durch einen Rechtsklick auf den Projektordner hinzugefügt werden. Dann wähle aus: configure->Add Library->Standard BlackBerry platform library und auf ‘next’. In der Suche libperipheral_discovery eingeben und diese anschließend auswählen und auf ‘finish’ klicken. Dann wird die Library automtaisch in der config.pri Datei hinzugefügt, die in die .pro Datei eingebunden wird.

Im ersten Teil wird noch keine GUI benötigt, so das wir uns nicht darum kümmern brauchen. Ich werde diese dann im zweiten Teil erklären. Das einzige was getan werden muss, ist eine Instanz einer Klasse zu erstellen, die ich Discover genannt habe. Hier ist der Konstruktor dieser Klasse:

Die Funkion bps_initialize() muss aufgerufen werden, wenn irgendein Service der BPS Schicht verwendet wird. Für unser Projekt brauchen wir den Peripheral Discovery Service. Dann muss dieser Service selbst initialisiert werden, indem pd_initialize(0) aufgerufen wird. Um zu erkennen wenn der Arduino verbunden oder getrennt wird, wird im nächsten Schritt ein Signal Handler (m_sigEvent) und eine dazugehörige Funktion (signalHandler()) mittels bps_add_sigevent_handler() verbunden. signalHandler() wird nun jedes mal aufgerufen, wenn zuvor definierte Ereignisse auftreten.

Danach muss überprüft werden, ob der USB Host Mode unterstützt wird:

Das kann über die Funktion pd_is_bus_supported() getestet werden. Die App wird auch auf anderen Geräten laufen, allerdings wird es nicht möglich sein ein externes USB Gerät zu steuern. Wenn die Anfrage erfolgreich war und das BlackBerry 10 Gerät den USB Host Mode unterstützt, ist der nächste Schritt, die benötigten Events zu registrieren:

Bevor irgendeine Funktion mit pd_class_t als Parameter aufgerufen wird, muss die Methode pd_is_class_supported() aufgerufen werden. In diesem Fall mit PD_CLASS_SERIAL als Parameter, für Serielle Kommunikation. Wenn kein Fehler zurück gegeben wird, ist es möglich, m_sigEvent mit PD_CLASS_SERIAL zu registrieren. Die Variable m_sigEvent ist vom Typ struct sigevent und der Signal Handler (siehe Konstruktor). Nach diesen Schritten wird jedes mal wenn ein USB Gerät angeschlossen oder getrennt wird, die im Konstruktor definierte Funktion signalHandler() aufgerufen:

Da die signalHandler() Funktion static sein muss und es somit nicht möglich ist nicht-static Variablen zu nutzen, wird einfach ein Funktionspointer zu einer anderen Funktion verwendet. Diese überprüft, ob der Arduino angeschlossen oder getrennt wurde:

Wenn das Gerät angeschlossen wurde, wird eine Peripherie mit der erkannten pd_peripheral_t allokiert (Weiter Erklärungen, siehe unten). Im anderen Fall, wenn das Gerät getrennt wurde, wird die pd_free_peripheral() Methode aufgerufen und andere Vorbereitungen für die nächste Verbindung getroffen (Die Variable m_serial, welche für die spätere Kommunikation benötigt wird, wird auf -1 gesetzt).

Unser angeschlossenes Gerät wird in einer Klasse Peripheral gespeichert. Diese einfache Klasse beinhaltet den Pfad, welcher von der zuvor allokierten  pd_peripheral_t Variable ausgelesen werden kann. Später ist es möglich, diese Klasse auch für weiter Informationen zu verwenden. Im Konstruktor werden eine Reihe von Anweisungen aufgerufen, die nötig sind um den Pfad herauszufiltern.

Der Pfad ist eine Eigenschaft aus einer Liste von Eigenschaften. Also ist das erste was getan werden muss die gesamte Liste zu lesen. Anschließend wird jede Eigenschaft angeschaut und nach Variablentyp gefiltert: Der Pfad ist der einzige String, so sehen wir wenn es sich um die richtige Eigenschaft handelt. Gute Programmierer würden natürlich noch den String überprüfen, z. B. ob er “/dev” beinhaltet :-)

Jetzt ist es möglich den Arduino zu Verbinden und zu erkennen. Wie diese Schnittstelle verwendet wird um Anweisungen an den Arduino zu senden wird in Teil II erklärt.

Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">