85

Transferring up to 24 digital signals using your computer’s USB interface is simple with the multifunction cable described here. You can also sample up to eight analog signals, generate PWM and servo signals and more besides. This article offers a simple protocol for controlling the cable and covers PC programming in the C# language as well.

Transferring up to 24 digital signals using your computer’s USB interface is simple with the multifunction cable described here. You can also sample up to eight analog signals, generate PWM and servo signals and more besides. This article offers a simple protocol for controlling the cable and covers PC programming in the C# language as well.

 
 
 

Mail from author 5-3-2012

ich habe die Tage eine Einladung zum Expert-Meeting der Elektor bekommen - eine sehr schöne Idee und ich werde da natürlich auch gerne teilnehmen :) Dabei ist mir eingefallen, dass ich schon längst wieder eine Idee für einen Artikel habe, die ich Ihnen hiermit gern vorstellen möchte.

Es handelt sich um ein USB-IO24 Kabel. An sich ist das nichts spektakuläres, aber ich habe so ein Kabel bisher noch nigends gefunden! Viele Bastler haben früher kleine Steueraufgaben über den Parallelport ihres Computers erledigt
- das geht heute zu Zeiten von USB jedoch viel besser. Zu diesem Zweck habe ich in einem DSUB25-Gehäuse einen kleinen Microcontroller vom Typ R8C verbaut, der über ein USB-TTL-Kabel der Firma FTDI mit dem PC verbunden wird. Der Controller übernimmt die Kommunikation mit dem PC und stellt an 24 Pins (3 Ports) verschiedene Signale zu Verfügung.

Im einfachsten Fall könnte man mit dem Kabel also 24 digitale Ein- oder Ausgänge am PC realisieren (Relais, etc.). Darüber hinaus stehen alternativ aber auch 8 Analogeingänge mit 10 Bit Auflösung und 8 PWM-Ausgänge, auch mit
10 bit, sowie 4 schnelle Zähler mit 16 Bit zur Verfügung. Man kann die PWM-Ausgänge auch nutzen, um damit RC-Servos zu steuern, was Modellbaufans sicher interessieren könnte. Schließlich gibt es dann noch die Möglichkeit, LED-Anzeigen zu steuern, eine Funktion, die ich zusätzlich benötigte, aber die auch für Bastler interessant sein könnte. Entsprechende LED-Anzeigen wurde bereits in der Elektor vorgestellt.

Der besondere Vorteil dieses Kabels ist die Leichtigkeit seiner Verwendung!
Man benötigt keine spezielle DLL und auch keine tiefgreifenden Kenntnisse in Windows-Programmierung! Das Kabel ist gleichermaßen unter Windows als auch unter Linux nutzbar! Die Steuerung der IOs erfolgt über lesbare Textbefehle
- der Befehl "P0.0=1" schaltet das erste Pin des ersten Ports ein. In der Form gibt es eine ganze Reihe von Befehlen. Ich würde dazu einfache Beispielprogramme in Delphi und C# erstellen, damit die Leser einen leichten Einstieg haben. Man könnte das Kabel auch aus Visual Basic oder sogar aus Excel heraus ansteuern...nicht jeder der mal etwas steuern will, will auch gleich ein eigenes Programm schreiben...

Das Kabel kann schon viel, aber es gibt ja doch immer spezielle Wünsche.
Deshalb würde ich auch die C-Quellen des Controllerprogramms bereitstellen, sodass geneigte Anwender eigene Kommandos hinzufügen können. Natürlich besitzt der Controller dafür bereits eine Downloadfunktion, mit der man die Software ohne Programmiergerät in den Controller laden kann. Der C-Compiler für den R8C ist ja schon mehrfach in der Elektor besprochen worden - überhaupt ist der R8C auch schon in verschiedenen Projekten verwendet worden. Ich habe bei dem Kabel lediglich eine etwas größere Variante verbaut, damit genügend Reserven bleiben.

Ein Projekt, bei dem das USBIO24-Kabel bereits gute Dienste geleistet hat, ist ein Roboter speziell für Kinder, den ich zusammen mit meiner Tochter gebaut habe. Sie hat das Design des Roboters maßgeblich mitbestimmt und nebenher die Programmierung in Delphi gelernt. Den Roboter mit dem Namen iQ [Aikju] könnte ich, bei Interesse, auch in der Elektor vorstellen.

Ich hoffe, Sie finden die Ideen gut und ich würde mich natürlich sehr freuen, wenn ich wieder mal einen Artikel für die Elektor schreiben könnte.

Viele Grüße
Uwe Altenburg

Mail from author for testing all functions:

An der D-Sub Buchse sind 3 Ports des Mikrocontrollers herausgeführt: P0, P1 und P2 (siehe Bild DSub.jpg). Die Pins aller drei Ports können einzeln als Inputs oder Outputs betrieben werden. Zunächst sind alle Pins Eingänge. Sie können den Zustand eines Ports lesen, indem Sie P0 im Fenster des PioCable Tools eingeben. Als Antwort kommt dann eine Zahl zwischen 0 und 255 zurück. Entsprechend können Sie P1 oder P2 eingeben Alle Befehle werden immer mit abgeschlossen. Es ist auch möglich, gleich mehrere Befehle auf einmal einzugeben - z.B. P0P1P2. Als Antwort kommen dann 3 Zahlen.  
 
Die jeweilige Richtung der Pins wird über die Register R0 bis R2 eingestellt. Mit dem Befehl R0=255 werden alle Pins von Port 0 auf Ausgang geschaltet, entsprechend legen R1 und R2 die Richtung der Pins von Port1 und Port2 fest. Einzelne Pins können mit einem Punkt adressiert werden - also P0.0=1 setzt das Pin0 von Port0 auf 1. Portpins können auch getoggled werden, indem man z.B.: P0.0~ eingibt.
 
Die möglichen Kommandos sind im Bild Help.jpg aufgelistet. Diese Ansicht erscheint auch, wenn Sie die Help-Taste im PioCable Tool klicken. Die Taste macht im Grunde nichts anderes als ? zu senden - die Ausgabe der Hilfe kommt dann direkt vom Controller. Das PioCable-Tool ist im Grunde also nur ein Terminal-Programm :) Trotzdem funktioniert es nicht unbedingt mit jedem anderen Terminal-Programm. Der Grund ist der Zustand der RTS-Leitung, die am Controller einen Reset auslösen kann. Die Taste Reset im PioCable-Tool zieht die RTS-Leitung kurz auf low.
 
Port0 kann alternativ auch als 8 Analogeingänge verwendet werden. Dazu geben Sie einfach A0 ein und erhalten als Antwort eine Zahl zwischen 0 und 1023, welche dem Analogwert an Pin P0.0 entspricht. Entsprechend liefern A1..A7 die anderen Analogwerte. Analogeingänge und digitale Pins können gleichzeitig verwendet werden.
 
Port2 kann alternativ bis zu 8 PWM Signale ausgeben. Das Kommando W0=512 gibt ein PWM-Signal mit 50% Pulsbreite aus. Standardmäßig ist die PWM-Frequenz auf 1kHz eingestellt. Über das Register R4 kann man die Frequenz auch auf 2 bzw. 4kHz stellen. Eine Besonderheit der PWM-Ausgabe ist die Möglichkeit, Änderungen der Pulsbreite zu verlangsamen. Über das Register R5 kann man dazu eine Slope-Rate einstellen: 0 ist aus und 99 bewirkt sehr langsame Änderungen. So kann man etwa den Anlauf eines Motors verzögern, wenn man diesen über PWM in der Drehzahl regelt. Die Slope-Rate bewirkt aber auch eine Verlangsamung von Servo-Bewegungen, wenn man mit dem Kommando S Servos steuert. Es können entweder 8 PWMs oder 8 Servosignale oder 4 Servosignale und gleichzeitig 4 PWMs erzeugt werden. Jeweils die 4 unteren und die 4 oberen Pins von Port2 müssen das gleiche Signal ausgeben, ansonsten können aber PWMs und digitale Signale gleichzeitig verwendet werden. 
 
An Port1 können alternativ Impulse gezählt werden. Dazu dienen die Pins P1.0..P1.3. Die Zähler werden durch das Kommando C initialisiert - also C0+ initialisiert die Impulszählung an P1.0. Der entsprechende Zähler zählt sowohl die steigende als auch die fallende Flanke und zählt aufwärts - mit C- zählt er dann abwärts. Der Zahlenbereich ist 0..65535 - also 16Bit. Mit C0 wird der Zähler ausgelesen und es kann auch jeder Zeit ein neuer Wert in den Zähler geladen werden - z.B. mit: C0=1000. Eine mögliche Anwendung wäre die Steuerung eines Motors - wenn man die Drehrichtung umkehrt, wechselt man auch die Zählrichtung. Dann kann man die Position einer Achse immer mitlaufen lassen. Die Zähler zählen sehr schnell, aber die maximale Frequenz hängt von der sonstigen Belastung des Controllers ab. Wenn z.B. 8 PWMs mit 4kHz erzeugt werden und zusätzlich noch Slope aktiviert ist, muss der Controller schnell mehrere tausend Interrupts pro Sekunde bearbeiten! Im Normalfall sollten die Zähler aber schon 5..10kHz schaffen.
 
Ein besonderes Kommando (noch undokumentiert) ist das Kommando X. Mit diesem Kommando kann man Befehle mehrfach ausführen. Folgendes Kommando erzeugt beispielsweise 1000 Impulse an P0.0: X1000P0.0~. Damit kann man u.a. auch schnelle Messkurven aufnehmen, in dem man schreibt: X1000A0. Man erhält dann 1000 Messwerte so schnell aufgenommen, wie es die serielle Übertragung erlaubt. Vor dem Kommando X können auch noch andere Befehle stehen - also kann man z.B. die Ladekurve einer RC-Kombination an P0.0 aufnehmen, indem man schreibt: P0.0=1X1000A0 Die maximale Länge es Kommandostrings liegt bei 40 Zeichen.
 
Soweit erstmal zu den bisherigen Möglichkeiten des PioCables. Es sind noch viele weitere Ideen denkbar... Deshalb habe ich die Update-Funktion vorgesehen, so kann man die Software später noch aktualisieren. Für geneigte C-Programmierer ist das PioCable auch gleich eine kleine Entwicklungsplattform. Man kann die Software ja mit der Embedded Workbench von Renesas compilieren und mit dem PioCable-Tool auf den Controller laden...
 
Unedited article from author (18-9-2012, Figures+Listings in Bilder+Listings.zip)

 

USB-IO24 – Ein Kabel zwischen den Welten...

Von Dr.-Ing. Uwe Altenburg

Titelbild (z.B. Montage aus USB-IO24 Kabel mit Blick auf die Stecker und Software im Hintergrund )

Das hier vorgestellte USB-IO24 Kabel ermöglicht es, bis zu 24 digitale Signale oder wahlweise bis zu 8 analoge Signale auf einfachste Art und Weise über die USB-Schnittstelle eines PCs zu verarbeiten. Der Artikel beschreibt neben dem inneren Aufbau und der Funktion des Kabels auch die Programmierung anhand der Sprache C#.

Heutzutage gibt es Computer in jeder erdenklichen Form – sei es als Desktop, Laptop oder als Tablet. Außerdem haben sie in so ziemlich jedem Bereich Einzug gehalten. Das wirkt sich erfreulicherweise auch positiv auf die Preisentwicklung aus. Hat man als Hobby-Bastler vor einigen Jahren noch darüber nachgedacht, ob man nicht vielleicht den alten ausgemusterten Mini-Tower dazu verwenden könnte, um damit die Beleuchtung seines ach so geliebten Aquariums zu steuern, so würde man das heute selbstverständlich mit einem kleinen schicken Box-PC mit einer extra dafür entworfenen Touch-Oberfläche realisieren. Keine Frage, die Zeiten ändern sich!

Aber halt, wer schon einmal versucht hat, eine eigene Schaltung an einen modernen PC anzuschließen, der hat schnell festgestellt, dass man nicht ohne einen Mikrocontroller auskommt und auch kaum ohne grundlegende Kenntnisse zum USB-Bus. Und wenn man dann erstmal einen Mikrocontroller verwendet, dann wird die eigentlich so schöne Touch-Oberfläche der Einfachheit halber meist durch ein paar Tasten und ein schlichtes LCD-Textdisplay ersetzt. Man tröstet sich mit den Argumenten, dass ein PC ohnehin keine zeitkritischen Signale erzeugen kann und das die Lösung mit dem LCD-Display ja auch viel günstiger sei. Dabei hätte es doch eigentlich so schön sein können...

Wie kann man seine eigenen Elektronikprojekte an einen PC anschließen und diese dann auch möglichst bequem per Programm steuern? Wie kann man zeitkritische Signale erzeugen, ohne dass man dafür in die tiefsten Abgründe der PC-Betriebssysteme absteigen muss? Wie lässt sich die Programmierung soweit vereinfachen, dass man sich voll und ganz auf sein Projekt konzentrieren kann? Genau aus diesen Überlegungen heraus entstand die Idee für das USB-IO24 Kabel!  

Schaltung

Von der britischen Firma FTDI werden seit einigen Jahren USB-RS232 Kabel mit TTL-Pegel TTL-232R-5V-WE [1] angeboten. Mit Hilfe dieser Kabel, die neben den Signalen RxD, TxD, RTS und CTS auch eine 5V Betriebsspannung zur Verfügung stellen, ist es ein Leichtes einen Mikrocontroller an einen PC anzuschließen. Die Kabel enthalten den USB-Seriell-Wandler FT232R, der sich im vergossenen USB-Stecker befindet. Es bietet sich geradezu an, dass man am anderen Ende des Kabels eine 25pol. Sub-D Buchse vorsieht, in derem Gehäuse man einen Mikrocontroller unterbringt. Der hier verwendete 8 Bit-Mikrocontroller ist ein Derivat der in der Elektor schon mehrfach vorgestellten R8C-Familie. Der R8C25 [2] bietet mit 64kB Flash und 3.5kB Ram einen ausreichend großen Speicher. Mit seinem 10 Bit-Analogwandler sowie einer leistungsfähigen Timer-Struktur ist er ideal für Steuerungsaufgaben geeignet. Die 25 Anschlüsse der Sub-D Buchse reichen für 3 komplette Ports des Mikrocontrollers sowie für die erforderliche Masseverbindung. Im Gehäuse der Sub-D Buchse ist genug Platz, um darin eine kleine Leiterplatte mit den Maßen 37x20mm unterzubringen und diese direkt mit den Lötpins der Buchse zu verbinden. Bild 1 zeigt das Layout der Platine. Neben dem Mikrocontroller befinden sich auf der Platine nur noch ein 18,432MHz Quarz sowie einige wenige diskrete Bauelemente. Fertig ist das USB-IO24 Kabel!

Bild 1: Schaltung und Layout der Platine im 25pol. Sub-D-Gehäuse

Schaltungstechnisch gibt es nur wenige Besonderheiten. Die Reset-Schaltung des Mikrocontrollers beschränkt sich auf eine RC-Kombination. Über die Diode D1 wird aber zusätzlich die RTS-Leitung des USB-Seriell-Kabels mit dem Reset-Pin verbunden. Somit ist es möglich, über die USB-Schnittstelle einen Hardware-Reset am Mikrocontroller auszulösen. Die Signale TxD und RxD des USB-Seriell-Kabels werden für die Kommunikation zwischen PC und Mikrocontroller verwendet. Die Übertragung erfolgt mit einer Datenrate von 115200 Baud bei 8 Datenbits, 1 Stopbit und ohne Parität (115200,8,N,1).

Die Ports P0 bis P2 des Mikrocontrollers sind auf die D-Sub-Buchse geführt. Damit stehen alle wesentlichen Signale des Mikrocontrollers zur Verfügung.

Bild 2: Pinbelegung der 25pol. Sub-D Buchse

Port0 kann alternativ als Analogeingang geschaltet werden, sodass bis zu 8 Analogsignale erfasst werden können. Der Referenzspannungseingang des Analog-Digital-Wandlers ist standardmäßig über eine RC-Kombination mit der 5V Versorgung aus der USB-Schnittstelle verbunden. Das ist für die meisten Anwendungsfälle ausreichend genau und ermöglicht einen Messbereich von 0..5V. Für den Fall, dass man auf eine höhere Genauigkeit bei der Messung analoger Signale Wert legt, kann aber auch eine Referenzspannungsquelle vom Typ LM4040 bestückt werden.

Port1 bietet alternativ bis zu 4 Interrupt-Eingänge, über die beispielsweise schnelle Zähler realisiert werden können. Zusätzlich befindet sich an Port1 eine serielle Schnittstelle, die neben dem UART Modus (Universal Asynchronous Receiver Transmitter) auch als SPI (Serial Peripheral Interface) betrieben werden kann.

An Port2 befinden sich die Ausgänge der beiden 16 Bit-Timer des R8C25. Damit ist es möglich, bis zu 8 PWM (Pulse Width Modulation) Signale gleichzeitig zu erzeugen. Ein PWM-Signal ist überaus universell verwendbar und wird beispielsweise bei der Drehzahlsteuerung von Gleichstrommotoren oder bei der Erzeugung von Analogssignalen verwendet. Damit bietet unser USB-IO24 Kabel eine Vielzahl von Möglichkeiten. Wie sieht es nun aber mit der Software aus?

Firmware

Die Datenübertragung zwischen PC und Mikrocontroller erfolgt seriell über die beiden Leitungen RxD und TxD. Die übliche Vorgehensweise wäre zunächst ein Datenprotokoll zu definieren. Meist haben solche Protokolle eine feste Struktur und neben den Daten selbst gibt es einen Rahmen, der Informationen über die Art und Länge der Daten sowie eine Prüfsumme enthält. Diese Lösung hätte jedoch einen entscheidenden Nachteil – man benötigt auf dem PC eine entsprechende Kommunikationsschicht, z.B. in Form einer DLL (Dynamically Linked Library). Damit würde man sich aber auf ein Betriebssystem festlegen, außerdem gäbe es schon nach kurzer Zeit verschiedene Versionsstände und schließlich ist die Anwendung einer DLL auch nicht unbedingt einfach.

Wer sich vielleicht noch an die frühen Telefonmodems zurückerinnern kann, dem fällt jetzt sicher der AT-Befehlssatz ein [3]. Alle Modems hatten zu der Zeit eine eigene textbasierte Kommandosprache. Dieser Ansatz ist sehr flexibel, leicht verständlich und zudem unabhängig vom Betriebssystem des PCs. Natürlich ist der AT-Befehlssatz nicht zur Steuerung von digitaler und anloger Hardware gedacht, deshalb musste eine eigene Kommandosprache erstellt und auf dem Mikrocontroller programmiert werden.

Nach dem Reset beginnt der Mikrocontroller mit der Initialisierung seiner Hardware. Viel ist dabei nicht zu tun, weil die genaue Funktion der Ports und Timer ja erst durch die einzelnen Kommandos festgelegt wird. Lediglich die Takterzeugung und natürlich die serielle Schnittstelle für die Verbindung zum PC müssen initialisiert werden.

Listing 1: Main-Routine mit Kommando-Interpreter

Nach der Initialisierung besteht das Hauptprogramm nur noch aus einer Endlos-Schleife – dem Kommando-Interpreter. Ein Kommando ist dabei eine Folge von ASCII-Zeichen, die von einem CR (Carriage Return) abgeschlossen wird. Genau genommen können auch mehrere Kommandos aufeinander folgen und nur das letzte von einem CR abgeschlossen werden. Das bietet mehr Flexibilität bei der Anwendung. Die Zeichenkette: X10 P0.0=1 P0.0=0 8   ist dabei ein gültiges Kommando und bedeutet: Setzte 10 Mal Port0.0 auf 1 und wieder zurück.

Die Funktion ReadCmd() liest eine Kommandosequenz bis zum CR ein. Aus der Sequenz werden mit SkipBlanks() alle Leerzeichen entfernt und anschließend wird die Funktion Execute() aufgerufen. Wenn die Funktion alle Kommandos erfolgreich ausführen konnte, gibt sie einen positiven Wert zurück, anderenfalls eine Null – entsprechend wird dann OK oder ERROR zum PC zurückgesendet.

Die Ausführung einer Kommandosequenz kann eine gewisse Zeit in Anspruch nehmen. In der Zeit dürfen aber schon weitere Zeichen über die serielle Schnittstelle vom PC gesendet werden. Bei der eingestellten Baudrate von 115200 Baud dauert die Übertragung eines Zeichens gerade mal 90µs! Der Empfang erfolgt deshalb in einer Interrupt-Routine, die die Zeichen in einem Ringpuffer ablegt. ReadCmd() liest die Zeichen dann aus dem Ringpuffer.

Die möglichen Kommandos werden anhand des ersten Zeichens unterschieden. So beginnt das Port-Kommando mit einem P, die Abfrage der Analogeingänge mit A, Zähler mit C usw., wobei jeweils Groß- als auch Kleinschreibung zulässig ist. Für jedes Kommando gibt es eine spezielle Funktion, die die mögliche Syntax erkennt. Im Listing 2 sind die Funktionen für das Port-Kommando aufgeführt.

Listing 2: Interpretation des Port-Kommandos

Im einfachsten Fall wird der aktuelle Zustand eines Ports mit P0, P1 oder P2 abgefragt. Als Ergebnis sendet der Interpreter eine Zahl von 0..255 zurück. Um den Zustand eines Ports zu ändern, kann man dem Port auch einen Wert zuweisen P0 = 0..255. Ob es sich um eine Zuweisung oder eine Abfrage handelt, erkennt die Funktion PortCmd() also am ’=’. Darüber hinaus ist es auch möglich, nur einzelne Bits eines Ports zu adressieren. Dazu wird nach der Portnummer die Pinnummer angegeben P0.0, P0.1,..,P0.7. Auch hier erkennt die Funktion am ’.’, ob der gesamte Port oder nur ein Pin gemeint ist. Schließlich kann man mit dem Kommando auch ein Portpin toggeln – das wird durch die Angabe von ’~’ erreicht – P0.0~.

Befehlssatz

Mit dem bereits beschriebenen Port-Kommando lässt sich sehr gut eine digitale I/O-Karte mit Relais und Optokopplern betreiben. Allerdings muss dazu noch die Datenrichtung der einzelnen Pins des USB-IO24 Kabels konfiguriert werden. Nach einem Reset sind alle Pins grundsätzlich auf Eingang programmiert. Dieser Umstand muss beim Entwurf eigener Hardware berücksichtig werden – Leistungsstufen müssen dann unbedingt einen sicheren Zustand einnehmen. Mit dem Kommando R können verschiedene Steuerregister beschrieben werden. Die Register R0, R1 und R2 beeinhalten die Datenrichtungen der drei Ports. Bit 0 von R0 legt die Datenrichtung des Pins P0.0 fest, Bit 1 die des Pins P0.1, usw. Eine 1 bedeutet Ausgang und eine 0 Eingang. Der Befehl R0 = 158  ändert die Datenrichtung der unteren 4 Pins von Port 0 auf Ausgang. Alternativ kann man auch schreiben R0 = $0F8  oder R0 = %000011118 . Mit dem Dollarzeichen werden hexadezimale Zahlen eingeleitet und mit % binäre Zahlen.

In Tabelle 1 sind alle derzeit unterstützten Kommandos des USB-IO24 Kabels aufgeführt. Neben den bereits erwähnten Kommandos für Ports und Register gibt es weitere elementare Kommandos.

Tabell 1: Kurzreferenz der unterstützten Kommandos

Für Sensor-Anwendungen besonders wichtig ist sicher das Kommando A zur Abfrage der Analogeingänge. Bis zu 8 Analogwerte können ausgewertet werden. Die entsprechenden Pins AI0..AI7 müssen dazu nicht extra konfiguriert werden – sie werden beim ersten Kommando An automatisch auf Analogeingabe programmiert.

Da es prinzipiell möglich ist, mehrere Befehle auf einmal zu senden, ist es auch möglich, mehrere Analogeingänge mit einem Kommando abzufragen. Die Befehlsfolge: A0 A1 A28  fragt die ersten drei Analogeingänge ab und sendet die Werte in einer Antwort zurück. Mehrere Werte in einer Antwort werden jeweils durch ein Leerzeichen getrennt.

Das Pendant zur Analogeingabe wäre eine Analogausgabe. Der verwendete Mikrocontroller unterstützt zwar keine direkte Analogausgabe, man kann jedoch über den Umweg der Erzeugung von PWM-Signalen bis zu 8 Analogwerte generieren. Die PWM-Signale werden mit dem Kommando Wn eingeschaltet. Wie bei den Analogeingängen, ist auch hier keine extra Konfiguration erforderlich; über das Steuerregister R4 kann man aber die PWM-Frequenz einstellen. Um aus einem PWM-Signal einen Analogwert abzuleiten, benötigt man einen Tiefpass. Im einfachsten Fall reicht dazu eine RC-Kombination; besser ist jedoch die Verwendung eines Operationsverstärkers, um ein Tiefpass 2. Ordnung aufzubauen – z.B. ein Butterworth-Filter.   

Mit den bisher vorgestellten Befehlen lassen sich bereits viele Standard-Anwendung mit digitaler oder anloger Ein- und Ausgabe abdecken. Wenn man bedenkt, dass man theoretisch bis zu 127 USB-IO24 Kabel an einen Computer anschließen kann, wären das 127*24 = 3048 Datenpunkte! Dennoch bedarf es mitunter spezieller Lösungen für Anforderungen, wie sie gerade im Bereich eines Hobby-Elektronikers häufig vorkommen. Genau dafür wurden weitere leistungsfähige Befehle implementiert, die nachfolgend an Beispielanwendungen erläutert werden sollen.

Befehle für RC-Servos

Die aus dem Modellbau bekannten und in allen Leistungsstufen erhältlichen RC-Servos werden inzwischen auch gern für Robotik-Projekte oder andere mechanische Antriebe verwendet. Sie regeln ihre Position entsprechend eines vorgegebenen Sollwertes. Der Sollwert für RC-Servos wird durch einen Impuls mit einer Breite von 1..2ms codiert, der alle 20ms wiederholt wird.

Bild 3: Impulsfolge für RC-Servos

Diese Impulsfolge zu erzeugen, ist eine Aufgabe, die man nicht direkt vom PC aus programmieren kann. Das Timing ist sehr kritisch – insbesondere die Impulsbreite. Schon geringes Jittern führt am Servo zu deutlich hörbarem Brummen und damit verbunden zu einer erhöhten Leistungsaufnahme. Deshalb gibt es das spezielle Kommando Sn, mit dem man alternativ zu den PWM-Signalen bis zu 8 Servo-Signale generieren kann. Es ist auch möglich PWM- und Servo-Signale gleichzeitig zu erzeugen. Auf Grund der Timerstruktur im R8C25 müssen dann aber immer vier Pins von Port 2 das gleiche Timing haben – also P2.0..P2.3 erzeugen PWM-Signale, während P2.4..P2.7 Servo-Signale erzeugen.

Neuere RC-Servos zeichnen sich durch eine sehr hohe Stellgeschwindigkeit aus. Das ist prinzipiell ein Vorteil, wobei dann für gewollt langsame Bewegungen sehr viele Sollpositionen vorgegeben werden müssen. Dabei kommt es jedoch zu einer Art Ruckeln der Servos, was bei einem Roboter-Arm zu erheblichen Schwingungen führen kann. Mit dem Steuerregister R5 kann man deshalb die Stellgeschwindigkeit gezielt reduzieren. Die Verzögerung, geht direkt in die Impulserzeugung mit ein und reduziert somit das Ruckeln der Servos ganz erheblich. Der Wert in R5 wirkt sich gleichzeitig auch auf die Erzeugung der PWM-Signale aus.

Position oder Drehzahl

Ein weites Gebiet ist die Ansteuerung von Gleichstrommotoren mit kleiner Leistung, wie sie in vielen Bastelprojekten zum Einsatz kommen. Im einfachsten Fall reicht dafür ein Bipolar- oder bei höheren Strömen auch ein Feldeffekttransistor und wenn die Drehrichtung umgeschaltet werden soll, noch ein Relais oder gleich eine Vollbrücke. Die Drehzahl wird dann mit Hilfe eines PWM-Ausgangs variiert. Die Schwierigkeiten beginnen, wenn man die Drehzahl regeln oder eine genaue Position anfahren möchte. Dazu ist es erforderlich, dass man einen Impulsgeber auf der Achse anbringt, z.B. eine Taktscheibe, die eine Lichtschranke unterbricht. Die dabei entstehenden Impulse (Flanken) müssen dann gezählt werden. Sie ergeben akkumuliert die Position oder bezogen auf ein Zeitintervall die Drehzahl. Beides lässt sich mit dem Kommando Cn ermitteln. Das USB-IO24 Kabel besitzt 4 Eingänge CNT0..CNT3, die jeweils auf einen 16 Bit-Zähler programmiert werden können. Der Befehl C0+8  aktiviert den Zähleingang CNT0, wobei der Zähler vorwärts zählen soll; mit C0-8  würde er dagegen rückwärts zählen. Der Zählerstand wird mit C08  ausgelesen.

Die Zählrichtung kann jederzeit umgeschaltet werden, wobei der aktuelle Zählerstand unverändert bleibt. Damit wird es möglich, dass der Zähler immer der aktuellen Position einer Achse folgt. Man muss lediglich vor der Richtungswechsel des Motors, die Zählrichtung umkehren. Um dagegen die Drehzahl zu ermitteln, setzt man den Zähler zunächst mit C0=08 auf Null und liest ihn nach einer geeigneten Zeit wieder aus. Der Zählerwert ist dann ein Maß für die Drehzahl des Motors.

LED-Anzeigen

Mit dem MAX7219 [4] bietet Maxim einen universellen Schaltkreis an, mit dem man bis zu 64 LEDs ansteuern kann. Dazu ist bis auf einen Widerstand keine äußere Beschaltung nötig – nur das IC und die Leuchtdioden. Die Elektor stellte in [5] eine universell verwendbare 7-Segment Anzeige mit diesem Chip vor, häufig werden aber auch Matrix-Anzeigen damit realisiert.

An unser USB-IO24 Kabel können zwei dieser Chips angeschlossen (kaskadiert) werden. Damit ist es möglich, bis zu 128 einzelne LEDs anzusteuern oder zwei 8-stellige Ziffernanzeigen oder auch Kombinationen aus beiden. Die Daten werden seriell an die Anzeigen übertragen. Dazu müssen lediglich die 3 Leitungen DATA, CLK und LOAD mit den gleichnamigen Pins des MAX7219 verbunden werden. Mit dem Kommando Dn werden dann 8 Datenbytes auf einmal übertragen – z.B. D0=48,109,121,51,91,958. Jedes Bit in den Datenbytes entspricht einer angeschlossenen LED. Wie die genaue Zuordnung aussieht, steht im Datenblatt des MAX7219.

PIOCable Tool

Wie kompliziert ist die Inbetriebnahme? Woher bekommt man die erforderlichen Treiber? Muss man erst selbst ein Programm schreiben, um die Funktion mal testen zu können? Alles typische Fragen, wenn man neue Hardware an den PC anschließen möchte. Zum Glück ist die Inbetriebnahme des hier vorgestellten USB-IO24 Kabels sehr einfach. Nach dem Anschließen des USB-Steckers sucht Windows® nach einem passenden Treiber. Die Treiber von FTDI werden inzwischen so gut unterstützt, dass man bei bestehender Internet-Verbindung keine weiteren Aktionen ausführen muss. Die erforderlichen Treiber werden automatisch installiert. Bei Problemen findet man aber auf der Webseite von FTDI Hinweise zur Installation der benötigten VCP-Treiber (VCP = Virtual Com Port).

Anschließend startet man das Programm PIOCable Tool, welches speziell für die Inbetriebnahme und den Test aller Funktionen erstellt wurde. Mit dem Connect-Button wird das Kabel gesucht. Sollte die Suche erfolglos bleiben, dann muss man im Geräte-Manager nachsehen, über welchen COM-Port das Kabel adressiert wird und diesen dann manuell im PIOCable Tool einstellen.

Bild 4: PIOCable Tool

Das PIOCable Tool ist im Grunde ein sogenanntes Terminal-Programm. Alle Eingaben werden direkt zum Mikrocontroller des USB-IO24 Kabels gesendet, der dann seinerseits direkt antwortet. Somit kann man alle Befehle manuell eingeben und dabei, evtl. auch mit einem Oszi, die Reaktionen an den Pins testen.

Da die Entwicklung des USB-IO24 Kabels weitergeht, ist es möglich, mit dem PIOCable Tool neuere Software-Versionen in den Mikrocontroller zu übertragen. Der Mikrocontroller verfügt dazu über einen eingebauten Bootloader, der auch nicht überschrieben werden kann. Neue Softwarestände können über die TinyBasic-Webseite [6] bezogen werden.

Die Quellen des PIOCable Tools sowie auch alle anderen verwendeten Quellen können von der Elektor-Webseite zu diesem Artikel geladen werden. Das Tool ist mit Delphi XE2 erstellt worden.

Demo-Applikation

Für einfache Anwendungen, wie vielleicht einen Servo-Tester, reicht es aus, wenn man die Befehle mit Hilfe des PIOCable-Tools eingibt. Für alle anderen Anwendungen ist es natürlich sinnvoll eine passende Applikation zu schreiben, die dann die entsprechenden Befehle an das USB-IO24 Kabel sendet. Für die Delphi-Programmierer unter den Lesern empfiehlt es sich natürlich, die Quellen des PIOCable Tools als Basis zu verwenden.

Besonders einfach lassen sich eigene Anwendung aber auch mit Microsoft’s C# erstellen. C# bietet neben den üblichen Fenster-Elementen wie Menüs, Buttons oder Labels auch schon eine komplette Schnittstellen-Komponente, über die unser Kabel sehr einfach angesprochen werden kann.

Bild 5: Demo-Applikation in C#

Zunächst zieht man eine Komponente vom Typ SerialPort auf das aktuelle Formular. Die Komponente muss einen Namen bekommen, z.B. PIOPort. Alle anderen Einstellungen macht man dann im Quelltext. Dazu zieht man einen Button auf das Formular und schreibt in dessen OnClick-Routine die folgenden Zeilen:

      PIOPort.ReadTimeout = 100;

      PIOPort.BaudRate = 115000;

      PIOPort.NewLine = "\r\n";

      PIOPort.PortName = "COM5";

      PIOPort.Open();

Als PortName muss man den Port eintragen, über den das Kabel aktuell adressiert wird. Wenn alles geklappt hat, ist damit die Verbindung zur Hardware hergestellt. Im Quelltext der Demo-Applikation werden diese Zeilen aufgerufen, wenn in der DropDown-Box eine der verfügbaren Schnittstellen ausgewählt wird.

Die Einstellung PIOPort.NewLine = "\r\n"teilt dem PIOPort mit, dass die nachfolgenden Aufrufe von PIOPort.WriteLine() und PIOPort.ReadLine()immer mit der Zeichenfolge CR+NL enden sollen. Das heißt beim Senden eines Befehls muss man diese Zeichen nicht extra angeben und beim Lesen einer Antwort wird bis zum Ende einer Zeile gelesen.

Damit lässt sich nun eine einfache Funktion schreiben, die das Portpin P0.0 auf 1 setzt. Man zieht wieder einen Button auf das Formular und schreibt folgende Zeile in die OnClick-Routine:

PIOPort.WriteLine("r0=1p0.0=1");

Das Kommando setzt zunächst das Pin auf Ausgang und dann sofort auf High – Fertig! Das Schreiben eigener Applikationen wird so, dank der SerialPort-Komponente von C#, sehr einfach. Etwas komplizierter wird es, wenn man z.B. Analogwerte lesen möchte. Hier muss man zunächst die Antwort abwarten und diese dann mit PIOPort.ReadLine()einlesen.

Zusammenfassung

Das hier vorgestellte USB-IO24 Kabel ermöglicht es, eigene digitale oder auch analoge Schaltungen über USB mit einem PC zu verbinden. Ein PC bietet Grafik und Rechenleistung satt, aber es ist praktisch nicht möglich, damit Relais oder gar einen Motor zu steuern. Hier soll unser Kabel eine Brücke schlagen und die zeitkritischen Signale erzeugen, die ein PC trotz seiner Rechenleistung nicht erzeugen kann. Dabei stehen eine einfache Anwendung und die Möglichkeit, damit eigene Applikationen zu entwicklen, im Vordergrund.

Nicht zuletzt verfügt unser Kabel über eine Update-Funktion. Damit eröffnen sich zunehmend mehr Einsatzmöglichkeiten, die über die einfache Ansteuerung von Relais weit hinaus gehen.

Für geneigte Anwender stehen zudem alle Quellen zur Verfügung – auch die des Microcontrollers selbst. Der eingebaute Bootloader macht das Kabel zu einer kompletten  kleinen Entwicklungsplattform. Den passenden C-Compiler kann man von der Renesas-Webseite laden. Die kostenlose Version ist auf 64kB(!) limitiert. 

Fertige Kabel sind über den Elektor-Shop erhältlich.

 

Quellen und Weblinks

[1] http://www.ftdichip.com/Products/Cables/USBTTLSerial.htm

[2] http://www.renesas.com/products/mpumcu/r8c/r8c2x/r8c25/index.jsp

[3] http://de.wikipedia.org/wiki/AT-Befehlssatz

[4] http://www.maximintegrated.com/datasheet/index.mvp/id/1339

[5] http://www.elektor.de/081154

[6] http://www.tinybasic.de


From the LAB
 
Resistor
R1= 100 kΩ, 125 mW, 5 %, SMD 0805
R2 = 4k7, 125 mW, 5 %, SMD 0805
R3 = 100 Ω, 125 mW, 5 %, SMD 0805
 
Capacitor
C1,C2,C5 = 100 nF, 50 V, 10 %, X7R, SMD 0805
C3,C4 = 22 pF, 50 V, 5 %, NP0, SMD 0805
 
Semiconductor
D1 = LL4148 Minimelf
IC1 = R8C/25 SMD TQFP52 (R5F21258SNFP#U0 Renesas)
 
Other
K1 = 25way D-Sub-connector, socket, solder (77SD B25S Amphenol)
K3 = Socket, top entry, 10way, Micro-match (8-215079-0 TE Connectivity/Amp)
X1 = 18.432 MHz, Cload 18 pF, 50ppm
 
Misc.
K1 = Hood for D-Sub-connector, 25way, flip-top (A-FT 25 Assmann)
K3 = Connector, male, 10way, Micro-Match (8-215083-0 TE Connectivity/Amp)