GPIO Pins verwenden

Aus Sure DSP Wiki
Wechseln zu: Navigation, Suche

In diesem Artikel wird erklärt, wie General Purpos Input and Output (GPIO) Pins verwendet werden können. Mit diesen Pins ist es möglich, LEDs, Taster, Schalter, Drehencoder, etc. anzuschließen. Dieser Artikel baut in Teilen auf Potentiometer verwenden auf.

Grundgerüst

Zur Verwendung der GPIO Pins müssen Einstellungen im Register Window gemacht werden. Es kann im Hardware Konfiguration Tab durch Rechtsklicken auf den ADAU1701 Block aufgerufen werden. Für diesen Beitrag wird nur die Sektion "GPIO" auf der linken Seite benötigt. Jeder GPIO oder auch Multipurpose (MP) Pin hat mehrere Funktionen, zum Beispiel die Verwendung eines Potis sprich einen analoge Spannung einlesen, digitale Audiosignale einlesen oder ausgeben oder die Verwendung als digitaler Ein- oder Ausgang (GPIO). Nicht jede Funktion kann an jedem Pin genutzt werden, welche Funktion für welchen Pin zur Verfügung steht kann der Dropdown-Liste oder auch dem Datenblatt des DSPs entnommen werden. Wird der Pins als digitaler Input verwendet, gibt es die praktische Möglichkeit, den Pin zu debouncen, auf deutsch zu entprellen. Wenn zum Beispiel ein Taster gedrückt oder ein Schalter umgeschalten wird, schaltet dieser nicht schlagartig von dauerhaft nicht leitend auf dauerhaft leitend. In einer Übergangsphase kommt es im Schalter zu mechanischem Federn des Kontaktes, dem sogenannten Prellen, das den Kontakt immer wieder unterbricht und wieder herstellt. Wenn der Taster nur eine LED einschaltet, ist das für den Menschen weit außerhalb des wahrnehmbaren Bereichs. Wenn allerdings ein Zähler hochgezählt wird, entstehen Probleme. Denn der Zähler wird in der Regel ausgelöst, wenn es einen Übergang von leitend auf nicht leitend, oder andersherum gibt. Durch die Schwingungen wird der Zähler somit durch einmaliges Drücken mehrfach ausgelöst. Das sogenannte Debouncen macht nichts anderes, als nach einem erkannten Wechsel von high nach low (oder in die andere Richtung) eine gewisse, einstellbare Zeit abzuwarten, bevor die nächste Aktion erkannt werden kann. Die normal eingestellten 20 ms geben dem Schalter oder Taster ausreichend Zeit, um zu Ende zu Prellen, die abgewartete Zeit ist aber ausreichend kurz, um sicherzustellen, dass in dieser Zeit nicht eine zweite Eingabe erfolgt. 20ms entsprechen 50 Tastendrücke pro Sekunde, das wird im Normalfall nicht benötigt.

Register Window


GPIO als Eingang nutzen

Anschluss eines Tasters

Der DSP misst, ob an der MP Pin auf einem hohen Niveau ist (High bzw. 3,3 V), oder auf einem niedrigen (Low bzw. 0 V oder GND). Wird bespielsweise per Taster umgeschaltet, ergibt sich das Schaltbild auf der rechten Seite. Der Taster wird an Ground und einen MP Pin angeschlossen. Intern ist der MP Pin über einen Widerstand (einen sogenannte Pullup) mit Vin verbunden. Für den Anschluss wird also kein zusätzlicher Widerstand benötigt. Wenn der Taster nicht gedrückt ist, ist also der grüne Bereich auf dem Niveau von Vin, also High. Wird der Taster betätigt, fällt der grüne Bereich auf Low. Das Signal muss nicht unbedingt von einem Taster kommen, es kann auch von einem Mikrocontroller wie einem Arduino stammen. So wäre es beispielsweise möglich, mit einem Mikrocontroller und einem Display zwischen verschiedenen Audioprofilen zu wechseln. Damit beide Geräte die selbe Referenzspannung haben, müssen deren Groundpins verbunden sein. In der Regel ist das durch die gemeinsame Versorgungsspannung gegeben.

Taster als Lautstärkeregelung

An Hardware werden lediglich zwei Taster und ein paar Kabel benötigt. Der Taster wird, wie im vorherigen Abschnitt beschrieben angeschlossen. Im Register Window kann nun geprüft werden, ob der Taster ordnungsgemäß angeschlossen ist. Der jeweilige Pin muss auf "Input GPIO Debounce" gesetzt sein. Durch einen Klick auf "Read All" im linken oberen Eck des Fensters kann ausgelesen werden, ob ein Pin High oder Low ist. Wenn der Taster nicht gedrückt ist, sollte beim jeweiligen Pin "High" stehen, wenn bei gedrücktem Taster ausgelesen wird "Low". Im Schematic Tab wird der Block "PushButton Volume" verwendet, zu finden unter "GPIO Conditioning"-"Volume Control"-"Push Button". Da die GPIO Pins standartmäßig High sind, muss der Haken bei "InvertGPIO" gesetzt sein. Der GPIO Eingang findet sich unter "IO"-"GPIO"-"General Purpose Input". Es wird zusätzlich noch eine Verbindung zum Interface benötigt, welches unter "IO"-"GPIO"-"Input"-"Interface Read", bzw. "IO"-"GPIO"-"Output"-"Interface Write" zu finden ist. Mit den Tastern wird durch Einträge in einer Tabelle navigiert. Der jeweilige Eintrag ist ein Multiplikator mit dem das Signal geschwächt wird. Ist der Eintrag Null, wird kein Signal an den Ausgang geleitet, ist der Eintrag Eins, wird das Eingangssignal unveränndert ausgegeben. Durch die Tabelle hat der Benutzer die volle Kontrolle über die Lautstärke. So kann neben der Anzahl der Einträge auch die Kurve variiert werden, zum Beispiel linear oder logarithmisch. Da das Erstellen der Tabellen je nach gewünschter Kurve mühselig ist, finden sich unter Lookup Tables Werte zum kopieren. In dem unten abgebildeten Beispiel verwendet die Lautstärkenregelung nur zwei Einträge, 0 und 1. Wenn gewünscht, kann über den Block "Push Button Volume, Mute" noch eine Mute Funktion hinzugefügt werden. Diese wird ausgelöst, wenn beide Taster gleichzeitig gedrückt werden.

Schematic Taster als Lautstärkeregelung

Lookup Table Lautstärkeregelung mit Tastern

Schalter als Mute

Es werden neben einem Schalter nur passende Kabel zum anschließen benötigt. Ein Signal mit einem Schalter zu muten ist sehr einfach, hierzu wird lediglich ein Volume Control Block "Single slex ext vol" benötigt. Dessen Steuereingang wird mit einem "GPIO Input" Block verbunden, an die beiden Audiosignalanschlüsse kommt entsprechend das Audiosignal, welches stummgeschalten werden soll. Wird nun der Schalter umgelegt und das GPIO Pin auf GND gezogen liegt eine 1 am Volume-Block an, entsprechend wird das Signal unverändert weitergegeben. Wird der Schalter in die andere Paosition gebracht liegt eine 0 an, das Signal wird somit mit 0 multipliziert und ist stumm.

Mute per Schalter

Taster als Mute

Als Materialien werden nur ein Taster und ein paar Kabel benötigt. Ein eigener Taster zum Muten des Lautsprechers ist überraschend kompliziert, da in SigmaStudio kein eigener Block dafür vorhanden ist. Der Kern des Programms ist der Volume Control Block "Single slew ext vol", welcher die Lautstärke abhängig vom Eingangssignal am orangenen Pin einstellt. An diesen kann direkt das Signal des GPIO angeschlossen werden, allerdings muss dann zum Muten der Taster gedrückt gehalten werden. Deshalb wird noch zusätzlich ein Toggle Block benötigt, der den Wert 0 oder 1 hält, auch wenn der Taster losgelassen wird. Der Wert muss im 5.23 Format weitergegeben werden. Dieser Block braucht zusätzlich noch Anschluss an das Interface. In der Abbildung "Schematic Taster zum Muten" ist die Verbindung der Blöcke dargestellt. Der Toggle Block befindet sich unter "GPIO Conditioning"-"PushButton"-"Toggle OnOff".

Schematic Taster zum Muten

Drehencoder als Lautstärkeregelung

Anschluss eines Encoders

Zur Lautstärkeregelung kann auch ein Drehencoder verwendet werden. Dieser ist äußerlich einem Potiometer ähnlich, lässt sich aber ohne Anschlag drehen und funktioniert digital. Auch in diesem Projekt wird außer dem Encoder und ein paar Kabeln keine weitere Hardware benötigt. Ein normaler Encoder hat 5 Pins. Drei davon sind für die Drehfunktion notwendig, die verbleibenden zwei sind für den integrierten Taster und von den anderen getrennt angeordnet. Der Encoder muss wie in Abbildung "Anschluss eines Encoders" verkabelt werden. Im Register Window müssen die zwei MP Pins für die Drehbewegung auf "Input GPIO No Debounce" gesetzt werden. Wenn der Debounce aktiviert ist, funktioniert die Lautstärkeregelung nur bei sehr geringen Drehgeschwindigkeiten. Der Rotary Volume Block für den Encoder findet sich unter "GPIO Conditioning"-"Volume Control"-"Rotary". Er wird analog zum "PushButton Volume" angeschlossen. In diesem Beispiel wird eine Tabelle mit 11 linear verteilten Werten verwendet. Dahintergeschaltet ist noch die Schaltung aus "Taster als Mute".

Schematic des Encoders

Lookup Table des Encoders


GPIO als Ausgang nutzen

LEDs anschließen

Kleinere LEDs, zum Beispiel um bestimmte Zustände zu signalisieren, können direkt an den GPIO Pins angeschlossen werden. Hierzu wird die LED mit ihrer Anode (langes Bein, plus) an den gewünschten GPIO Pin angeschlossen, die Kathode (kurzes Bein, minus) an GND. Praktischerweise liegen im Wannenstecker J4 jeweils GPIO Pin un GND gegenüber, sodass eine LED einfach mit einem Jumperkabel angeschlossen werden kann. Im Register Window wird für den entsprechenden Pin "Output GPIO" ausgewählt

Es gilt zu beachten, dass jeder Pin nur maximal 2 mA liefern kann.

Für größere Lasten wird ein Transistor verwendet, siehe nächster Abschnitt.

Größere Lasten mit Transistoren

Für größere Lasten, wie zum Beispiel ein Relais, kann ein Transistor zwischengeschaltet werden. Dabei steuert der GPIO Pin über einen Vorwiderstand die Basis eines NPN Bipolartransistors. Dessen Emitter ist mit GND verbunden, die zu schaltende Last ist mit der Betriebsspannung (Pluspol der Last) und dem Kollektor (Minuspol der Last) verbunden.

Auch ein N-Kanal MOSFET kann für diese Aufgabe verwendet werden, vorausgesetzt er lässt sich mit den 3,3 V des GPIO Pins bereits schalten. In diesem Fall steuert der GPIO Pin direkt das Gate des MOSFETs, Source liegt auf GND und die Last ist ähnlich wie beim Bipolartransistor zwischen Versorgungsspannung und Drain angeschlossen. Des Weiteren sollte beim MOSFET ein Widerstand, zum Beispiel 100k, zwischen Gate und GND angeschlossen werden, damit der MOSFET zuverlässig sperrt.