Nutzung der Phidgets-API (Teil 2: Programmiersprache C#)

 
 
Im ersten Teil haben wir uns das prinzipielle Konzept der API-Programmierung von Phidgets-Komponenten in C angeschaut. In diesem Teil werden wir die Programmiersprache C# mit der Entwicklungsumgebung Visual Studio Express 2012 verwenden. Die Nutzung unterschiedlicher Programmiersprachen macht die zugrundeliegende Strategie deutlicher und es wird leichter, das Prinzip auf beliebige Sprachen zu übertragen.
 
Zunächst erstellen wir ein neues Projekt und nennen es "PhidgetDistanzMessung". Was wir als erstes tun müssen, ist das Einbinden der Phidgets-Assembly "Phidget21.NET". Dazu klicken Sie mit der rechten Maustaste im Projektordner auf den Eintrag "Verweise" und wählen "Verweis hinzufügen". Im folgenden Dialog suchen Sie den Ort der Datei, üblicherweise liegt sie im  Installationsverzeichnis "..\program files\Phidgets\.." 
 
Nach dem Einbinden sollte der Verzeichnis-Eintrag folgendermaßen aussehen: 
 
Bild_1
 
Als Oberfläche bauen wir uns zunächst ein simples Formular mit einer Checkbox und einem ProgressBar. Die Checkbox, die wir  "cBAttach" nennen zeigt an, ob ein Modul angeschlossen ist, der ProgressBar (pBDist) ist unser Abstandsanzeiger. 
 
Form_1
 
Die Assembly ist eingebunden und wir können die Bibliotheken durch eine "using-Anweisung " am Anfang des Programms einbinden. Wir benötigen "Phidgets" und "Phidgets.Events". Nun folgen die gleichen Schritte, die wir auch in C ausgeführt haben. Nur das wir keine Struktur im Speicher anlegen, sondern mit einem Objekt arbeiten. Das Programm sieht wie folgt aus:
 
Bild_2
 
Zeile 13: Wir definieren ein Objekt vom Typ "InterfaceKit" in der obersten Ebene der Klasse, damit wir aus allen Methoden darauf zugreifen können. Da wir mit einer Objektinstanz arbeiten, brauchen wir dieses Mal keinen Handle. 
 
Zeile 18: Im Konstruktor unseres Formulars erzeugen wir die Instanz "ifKit". 
 
Zeile 19 + 20: Auch hier brauchen wir wieder Event-Handler, die beim Auftreten der jeweiligen Ereignisse ausgeführt werden sollen. Wird das Modul mit der USB-Schnittstelle verbunden, wird ein Attach-Event ausgelöst und dieses verbinden wir mit dem Handler "ifKit_Attach". Trennen wir das Modul löst das Ereignis detach-Ereignis analog dazu die "ifKit_Detach"-Methode aus. 
 
Zeile 21: Danach öffnen wir das InterfaceKit mit der Methode "open()". 
 
Zeile 24 - 32: Jetzt erstellen wir noch die beiden Event-Handler, die dafür sorgen, dass beim Einstecken die Checked-Eigenschaft der Checkbox auf true gesetzt wird, es erscheint ein Häkchen, lösen wir die Verbindung wird das Häkchen wieder entfernt. 
 
Bei einem intuitiven Konzept können wir die Arbeitsweise schon im Vorfeld erahnen. Prüfen wir einmal, wie intuitiv das Phidget-Konzept ist. Dazu überlegen wir, was zu tun wäre, wenn wir den Messwert des Sensors erfassen wollen:
 
1. Wir brauchen ein pasendes Ereignis. 
2. Wir ordnen diesem Ereignis einen Handler zu. 
3. Der Handler führt die gewünschte Aktion durch. 
 
In der API-Dokumentation finden wir für die InterfaceKit-Klasse insgesamt acht Events und das, was wir brauchen heißt: "SensorChange". 
 
Hinweis: Als Alternative zur Ereignisbehandlung können wir die Eingänge natürlich auch einfach abfragen. Das hat allerdings den großen Nachteil, dass das Programm auch dann mit der Abfrage beschäfigt ist, wenn sich der Sensorwert gar nicht ändert. 
 
Probieren wir aus, ob es mit dem gefundenen Ereignis genauso klappt, wie mit dem Attach- und Detach-Event. Eine Frage taucht dabei allerdings noch auf: "Wenn es nur ein "SensorChange"-Event gibt, wie erkennt das Programm dann, welcher Sensorwert sich geändert hat? Für diese Auswertungen können wir die Ereignis-Argumente nutzen. Wenn der Treiber ein Event feuert, übergibt er Argumente und beim SensorChange-Event heißen die "SensorChangeEventArgs". Da wir damit gleichzeitig die Werte beider Sensoreingänge erhalten, wollen wir das auch nutzen und deshalb ändern wir unser Formular wie folgt:
 
Form_2
 
 
Wir fügen 2 Label und 2 Textboxen hinzu, die wir tBSensor1 und tBSensor2 nennen und mit denen wir die Sensorwerte darstellen werden. Als 2. Sensor schließen wir einen Infrarot-Näherungsschalter Phidgets 1103 an, der eine Annäherung im Bereich zwischen 0 und 10 cm erkennt. Das Programm erweitern wir wie folgt:
 
SensorChange
 
Zunächst erweitern wir unsere Liste mit Delegaten um den EventHandler für das SensorChange-Event. Den Handler nennen wir "ifKit_ValueReceived". Und der sieht dann folgendermaßen aus:
 
ValueReceived
 
Wie schon erwähnt, werden beim Aufruf des EventHandlers die SensorChangeEventArgs übergeben. Diese Klasse liefert uns 2 Fehler: Index und Value. Mit Index können wir den Sensor identifizieren, in Value befindet sich der Sensorwert. Beim 1. Sensor (Index  0) handelt es sich um unseren Distanzmesser. Wenn das Event durch diesen Sensor ausgelöst wurde, reagieren wir nur auf Werte zwischen 50 und 550 (das entspricht ungefähr dem Messbereich von 4 bis 30 cm). Liegt der Wert in diesem Bereich, wird der Sensorwert über die Formel aus dem Sharp-Datenblatt in eine cm-Entfernung umgerechnet und ausgegeben. Außerdem wird der Sensorwert selbst auf der Balkenanzeiger dargestellt. Liegt der Wert außerhalb des sinnvollen Bereichs wird die Anzeige und der Balken gelöscht. 
 
Beim 2. Sensor (Index 1) sieht es anders aus. Der Sensor gibt einen Wert größer 900 aus, wenn kein Objekt erkannt wird und 0, wenn sich ein Objekt nähert. Bei Objekterkennung färben wir die Textbox rot, ist kein Objekt in der Nähe wird sie grün. 
 
Programm_komplett
 
 
Polling der Sensoreingänge
 
Es kann aber auch sinnvoll sein, den Wert nicht bei jeder Änderung einzulesen, sondern ganz gezielt zu einem bestimmten Zeitpunkt oder manuell. Auch das ist natürlich mit einem Phidget-Modul möglich und Sie brauchen dafür nur eine einzige Zeile. 
 
Ergänzen Sie Ihr Formular z. B. um einen Button, wechseln durch Doppelklick auf den Button in den Ereignis-Handler und geben Sie den folgenden Code ein:
 
Polling_1
 
Unser InterfaceKit-Objekt "ifKit" bietet uns eine Sensor-Collection, die wiederum über das Feld "RawValue" verfügt. Dahinter versteckt sich der Eingangwert am Sensor 0. Wir lesen ihn ein, wandeln ihn in einen String und übergeben ihn der Textbox. Mit einem Klick auf den Button ermitteln wir nun den jeweils aktuellen Sensorwert. 
 
 
 
Copyright © Böcker Systemelektronik