Inhaltsverzeichnis 1. Vorwort 3 2. Übersicht 5 3. Grundlagen 13 4. LEDs & Tasten 16 5. Analog-Digital Umsetzer 29 6. I2C BUS 39 7. Tasten & Prellen 51 8. Relais 61 9. Rotationsgeber 69 10. OLED 75 1.1 2.1 3.1 3.2 4.1 4.2 4.3 4.4 4.5 4.6 4.7 4.8 5.1 5.2 5.3 5.4 5.5 6.1 6.2 6.3 6.4 6.5 6.6 7.1 7.2 7.3 7.4 7.5 8.1 8.2 8.3 8.4 8.5 9.1 9.2 9.3 10.1 10.2 10.3 10.4 10.5 10.6 10.
1.1 Sicherheitshinweise 11. Digital-Analog Umsetzer 12. Anwendungen 101 13. ANHANG 111 14. Ausblick 141 1. Vorwort 11.1 11.2 11.3 11.4 11.5 11.6 12.1 12.2 12.3 12.4 12.
Übersicht 2.1 Bausteine In dem Baustein sind zwei LEDs (Light Emitting Diode) untergebracht. Zusätzlich wird je ein Vorwiderstand von 2.2 KOhm verwendet, der die Dioden vor zu hohem Stromfluss schützt. Sie sind für 2mA Strom optimiert. Die beiden Widerstände sind mit Masse verbunden. So kann man den Baustein direkt an ein Ausgangspaar vom Arduino Nano Brick anschließen. Zusätzlich werden die beiden Signale an das andere Ende weitergeleitet, so dass sich dort weitere Steuerungen durchführen lassen.
Adr:8x,Xx +9V I²C OLED 64x48 SC L SC L SD A SD A OLED: Organische Leuchtdiode. Genaugenommen sind 64x48 Leuchtdioden in einer Matrix angeordnet und können einzeln mit Hilfe von Befehlen durch den I2C angesteuert werden. Damit lassen sich mehrzeilige Texte darstellen, aber auch einfache monochrome Grafiken. Mit dem Eck-Brick werden zwei angrenzende Seiten miteinander verbunden. 7-Segment-Anzeige: Sie besteht aus 7 Leuchtbalken und einem Punkt. Dahinter verbirgt sich je eine Leuchtdiode.
- + 1A 9V Ein weiterer Versorgungs-Brick ist der abgesicherte Netzteiladapter. Er liefert eine stabilisierte Gleichspannung von 9V und einen maximal möglichen, kurzschlusssicheren Stromfluss von 1A. Die Masse ist auf der Seite der Anode, dem Minuspol, durchverbunden, so dass kein weiterer Masse-Brick verwendet werden muss. Eine Kontroll-LED leuchtet, sobald der Netzteil-Brick Spannung bereitstellt.
G D IPD079N06L3 n-MOS 100 Gate max. 60V 50Apeak Mit diesem Brick werden separat belegte Kontakte in der Mitte gentrennt kontaktiert. Durch die Trennung und Überkreuzung der Leitungen können diese zum Wechseln der Verbindungen genutzt werden. Oben und unten sind beide Mittelkontakte miteinander verbunden. Doppelte Kreuzung nicht verbunden Verbindet die jeweils gegenüberliegenden Mittelkontakte einzeln. Im Zentrum sind die Leitungen isoliert.
3. Grundlagen 3.1 Das Brick‘R‘knowledge System Der Masse-Brick ist ein besonderer Baustein des Brick‘R‘knowledge Systems. Er spart zusätzliche Verbindungen mit Hilfe anderer Bricks oder Leitungen. Hier wird das Geheimnis unserer vierpoligen Verbinder offenbart. Die mittleren zwei Kontakte sind für die Signalübertragung reserviert, so wie es der Aufdruck verrät. Die äußeren Kontakte werden zum Schließen des Stromkreises, also der Rückführung des Stromflusses zur Spannungsquelle benutzt.
4.1 On Board LEDs Der Arduino Nano besitzt eine Vielzahl von Ein- Ausgabepins, einige davon sind bereits auf der Nano Platine verdrahtet. Die LED auf dem Arduino ist an Port 13 verdrahtet (=PB5). In unserem einfachen Beispiel werden wir sie blinken lassen. - Den Ardunio Nano kann man entweder über den USB-Port oder durch eine extra Versorgungsspannungsquelle mit der benötigten Energie versorgen. Dafür eignet sich das beiliegende Netzteil.
4.2 Doppelte LED 4.3 Taste & LED Nun schliessen wir einen unserer Bricks direkt an den NANO an. Dazu gibt es im Set einen Baustein mit zwei Leuchtdioden. Der NANO-Brick verwendet neben den üblichen Masseanschlüssen (die äußeren Kontakte des Brick-Bausteins) die beiden inneren Kontakte getrennt. Es gibt beim diesem Brick auch Kontakte die unten liegen, doch dazu später mehr. Die beiden LEDs sind mit den Portausgängen PD2 und PD3 verbunden, dies entspicht auch der Nummerierung 2 und 3 im Sketch.
4.4 Mehrere LEDs binär blinken lassen - 9V Genaugenommen zeigen die LEDs einen Binärcode an. Dazu wird im Programm ein Zähler von 0 bis 15 verwendet. Die einzelnen Bits werden abgefragt und den LEDs dann entsprechend zugeordnet. Zu beachten ist, dass die LEDs in der Reihenfolge 2, 3, 5, 4 liegen, was im Code auch entsprechend zugeordnet wird. Im Code ist die Variable „counter“ als static deklariert, damit der Inhalt zwischen zwei Schleifen-Durchläufen erhalten bleibt, wie bei einer globalen Variable.
4.5 Binäres Zählen - durch Taste gesteuert Das Zählen geschieht im Sekundentakt. Man kann nun eine primitive Stoppuhr bauen, indem man einen Taster zur Freigabe des Zählvorgangs verwendet. Unten noch eine kleine Tabelle, die beim Umrechnen hilft. Wir werden später noch eine komfortablere Stoppuhr mit dezimaler Ausgabe bauen. Die Taste ist diesmal mit Port 6 und 7 verbunden, wir verwenden hier Port 7, der „Kurzschluss“ zu Port 6 stört nicht weiter, da er auch als Eingang geschaltet ist (ohne Pullup).
4.6 Zählgeschwindigkeit steuern Nun kann man mit der Taste auch noch mehr tun, zum Beispiel die Geschwindigkeit des Zählvorgangs einstellen. Die Änderung im Programmcode ist minimal. Anstatt den Zähler freizugeben, wird nun der delay() geändert. Hier als Beispiel zwischen schnellem Zählen mit 200ms und dem Zählen mit 1000ms = 1sec. Insgesamt ist es wichtig, bei dieser Vorgehensweise zu wissen, dass die Zählgeschwindigkeit nicht ganz genau ist. Der Delay verzögert die Ausführung um die vorgegebene Zeit, i.A.
4.7 Einfaches Lauflicht Unsere Schaltung kann auch zu einem Lauflicht ausgebaut werden. Dazu wird hier noch ein weiterer DoppelLED-Brick dazugesetzt. Hier kommt noch ein Spezialbaustein zum Einsatz, der auch an der Unterseite Kontakte hat. Diese bleiben aber in diesem Fall ungenutzt und dienen nur zur Weiterleitung der beiden LED Signale von Port 6 und 7 auf der Oberseite. Man beachte die Zuordnung von Port 6 und 7 über die Leitung.
4.8 Lauflicht Geschwingkeit steuern Mit einer zusätzlichen Taste soll die Lauflichtgeschwindigkeit umgeschaltet werden können. Dazu verwenden wir einen der B-Ports, der multifunktional belegt ist. Hier bezeichnet als das Signal MOSI, welches von Port B3 kommt und mit #11 als Parameter angesprochen werden kann. MOSI steht für „Master Out Slave In“ und wird eigentlich für die eingebaute SPI Schnittstelle verwendet (bestehend aus MOSI+MISO+SCK).
5. Analog-Digital Umsetzer 5.1 AD Umsetzer - prinzipieller Aufbau AD steht für Analog - Digital. Ziel ist es, analoge Werte, wie zum Beispiel eine beliebige Spannung, in einen digitalen Wert also Zahlen umzusetzen. Diese Zahlen kann ein Computer dann weiterverarbeiten. Mit analogen Werten kann ein normaler Computer nichts direkt anfangen.
5.2 A/D Umsetzer und Potentiometer - 9V Hier wird der Wert des eingebauten A/D-Umsetzer mit dem Sketch-Befehl analogRead() eingelesen. Der Wandler liefert einen Wert zwischen 0 und 1023, dabei 0 für 0V und 1023 für 5V. Die Ausgabe erfolgt über die serielle Schnittstelle am PC. Dazu muss man in der Arduino Programmierumgebung den seriellen Monitor aktivieren (CTRL-SHIFT-M), dann sieht man die Zahlenwerte vorbeilaufen. Wir erreichen mit der Schaltung einen maximalen Wert von ca. 920 statt 1023.
5.3 A/D Umsetzer und lichtempfindlicher Widerstand LDR Der LDR03 ist ein lichtempfindlicher Widerstand. Er verringert seinen Widerstand umso mehr, je heller er beleuchtet wird. In der Schaltung bildet er zusammen mit dem 10 KOhm Widerstand einen Spannungsteiler. Am A/D-Umsetzer steht ein Wert von Vad = Rldr/(Rldr+R10k)*VBatt an. Wird der Widerstand kleiner, so wird auch die Spannung am A/D-Umsetzer kleiner. Zu beachten ist noch, dass der A/D-Umsetzer des Arduinos maximal 5V messen kann, bzw.
5.4 AD Umsetzer - Temperatur messen mit NTC Verwendet man einen NTC (Heißleiter) als variablen Widerstand, kann man mit der Anordnung auch Temperaturen messen. Zunächst läßt sich der Widerstand wie gehabt ermitteln. Dann benötigt man aber eine komplexere Formel zur Bestimmung der Temperatur. Für Heißleiter gilt näherungsweise: RT = RN * eB(1/T-1/TN) daraus läßt sich folgendes ableiten: R= B *TN /(B+ln(RT/RN)*TN) TN ist i.A: 298.15K die Nenntemperatur.
5.5 Voltmeter mit AD Umsetzer und Kalibrierung - PC Schnittstelle Unser Baustein ist auch hervorragend als Voltmeter geeignet. Man muss dazu nur noch Messleitungen anschliessen. Der Klemm-Brick eignet sich dazu sehr gut und ist in der Schaltung eingebaut. Nun kann man auch beide A/D-Umsetzer an den Ports A0 und A1 verwenden. Im Programm wird die Spannung aus dem digitalisierten Wert berechnet und ausgegeben. Als einfachen Schutz haben wir hier einen Doppelwiderstand eingebaut.
6. I2C BUS 6.1 I2C Bus Aufbau Prinzip und Befehle Der I2C Bus ist eine serielle Schnittstelle, die mit zwei Leitungen auskommt. Der Taktleitung SCL und der Datenleitung SDA. Die Leitungen arbeiten bidirektional, man unterscheidet zwischen Master und Slave. Der NANO ist in unserem Fall der Master und die anderen Bricks sind Slaves. Die Bausteine werden über I2C Adressen angesprochen, 128 sind pro Bus möglich. Dabei können einzelne Bausteine auch mehrere Adressen belegen.
6.2 I2C Bus und IO Port Baustein Der Bausteine PCF8574 ist ein sogenannter IO Extender. Der beinhaltet 8 IO Ports, die man als Ausgang aber auch als Eingang verwenden kann. Den Baustein PCF8574 gibt es in zwei Ausführungen, den PCF8574T (40-4E) und PCF8574AT (70-7E), dabei haben die beiden einen unterschiedlichen Adressbereich. Nach dem Öffnen des Deckels, gibt es auf der Oberseite noch einen DIL-Schalter mit dem sich die Unteradresse einstellen lässt. (40,42,44,46,48,4A,4C,4E).
6.3 I2C Bus und IO Port Baustein LOW Activ - 9V Der 8574 hat open drain Ausgänge mit einem ganz weichen pullup (100uA) nach +5V. Daher ist es eigentlich besser, Lasten nach 0V ziehen zu lassen, und nicht wie vorher auf einen hohen Pegel. Hier eine trickreiche Schaltung dazu. Die LEDs sind mit der Kathode an die Ausgänge des Treibers geschaltet. Nun benötigt man noch eine positive Versorgungsspannung für die Anoden.
6.5 Siebensegment-Anzeige als I2C Brick - Aufbau und Adressen 6.4 Die Siebensegment-Anzeige - Prinzip In den Anfängen der Computertechnik machte man sich Gedanken, wie man Ziffern darstellen kann. Am einfachsten waren damals 10 Lampen, die von 0 bis 9 beschriftet wurden. Später hat man dann die Lampen zum Beleuchten kleiner Glasplatten mit entsprechenden Bohrungen verwendet.
// DE_15 7segment Anzeige als I2C Brick #include
6.6 Siebensegment-Anzeige - zählen - 9V In dem Beispiel wollen wir einen einfachen Zähler realisieren. In der Variable „counter“ wird der Zählerstand gespeichert. Das Programm erhöht den Wert alle 500ms um eins. Auf einer zweistelligen SiebensegmentAnzeige kann man aber nur maxmial den Wert 99 darstellen. Daher wird in einer Schleife der Zählerstand von „counter“ mit 99 verglichen, wenn dieser höher sein sollte, wird er wieder auf 0 zurückgesetzt.
7. Tasten & Prellen 7.1 Tasten können prellen Wenn man einen mechanischen Taster betätigt, so kann es zu sogenanntem Kontaktprellen kommen. Beim Drücken federn die Kontakte etwas, so dass die Taste mehrfach auslöst, also den Kontakt schliesst, dann erneut öffnet und wieder schließt... drücken // DE_17 Tasten koennen Prellen #include // 8574T #define i2cseg7x2alsb1 (0x40>>1) #define i2cseg7x2amsb1 (0x42>>1) ..... wie vorher ...
7.2 Entprellen von mechanischen Tasten per Software Das Entprellen von Tasten kann man einfach über Delays durchführen. Man muss dazu die Zeit warten, die einen Prellzyklus dauert. drücken Algorithmus zum Entprellen: Das Signal wird erstmal auf den Übergang nach Low abgefragt, dann wird wie im vorherigen Programm gewartet bis es auf High geht (also die Taste vermeindlich losgelassen wird), danach muss man aber nun warten (hier 40 ms), bis eine neue Abfrage auf einen High->Low Übergang durchführt wird.
7.3 Die Siebensegment-Anzeige - erweiterter Zähler Mit zwei Siebensegment-Anzeigen kann man schon von 0 bis 9999 zählen. Dabei muss man am vorherigen Programm nicht viel ändern. Die Umrechnung des Zählerstands geschieht wieder mit dem „sprintf()“ Befehl, diesmal aber im Format %04d um vier Stellen mit Vornullen zu erzeugen. Die Taste wird auch wieder abgefragt, diesmal ist die Abfrage etwas anders aufgebaut. Der Delay wird in zwei Hälften zerlegt, was ggf.
7.4 Siebensegment-Anzeige - mit erweitertem up und down Zähler Mit diesem Zähler kann man auf- und abzählen. Dazu werden zwei Taster verwendet, die im Prozessor abgefragt werden. Im Prinzip die gleichen Routinen wie vorher nur mit einem weiteren Zweig für das Runterzählen. Dabei wird bei einem Zählerstand < 0 wieder mit 9999 begonnen. Also nur der Bereich 00000 bis 9999 angezeigt. // DE_20 7segment Zaehler Up und Down. #include
7.5 AD Umsetzer und Display mit Siebensegment-Anzeige als Voltmeter Der Wert des A/D-Umsetzers wird eingelesen und im Programm in Milivolt umgerechnet. Es ergibt sich ein Bereich von 0 bis 5000mV. Dabei müsste man den Bereich noch kalibrieren. Es wird die Spannung am Schleifer des Potentiometers angezeigt. Den Wert von 5000 wird man hier aber nicht erreichen, wenn man eine 9V Batterie verwendet.
8. Relais 8.1 Reed Relais Relais werden auch heute noch eingesetzt, wenn entweder große Leistungen geschalten werden oder es auf eine gute Trennung zwischen dem Anrege- und Schaltkreis ankommt. Die Übertragung der Information ob ein Relaiskontakt schließt oder nicht, geschieht über ein magnetisches Feld. Eine Spezialausführung des normalen Relais ist das Reed-Relais, mit den speziell dort verwendeten Reedkontakten. 8.
8.3 Reedrelais steuert Anzeige Mit dem Reedrelais kann man die Anzeige steuern. Hier wird bei einer Annäherung des Magnets der Zählerstand um eins erhöht. Wird der Magnet an einem Rad befestigt, lässt sich so die Zahl der Umdrehungen anzeigen. Reedkontakte muss man prinzipiell entprellen, auch wenn die Kontakte meist sehr gut konstruiert sind und durch die magnetischen Eigenschaften die Presszeit extrem kurz sein kann. Hier ist unser normales Zählprogramm eingesetzt.
8.4 Stoppuhr mit 7-Segment-Anzeigen Die 7-Segment-Anzeige als Stoppuhr mit zwei Tastern Start/Stopp und einer Auflösung von 1/10 Sec = 100ms. Bisher haben wir immer Tastendrücke oder die Tastendruckdauer gezählt. Die klassische Stoppuhr ist aber auch nicht weiter kompliziert. Eine Taste löst den Zählvorgang aus, die andere hält ihn wieder an. Dazu gibt es eine weitere statische Variable „startflag“ genannt. Wenn diese auf 1 ist, wird gezählt, sonst nicht. Eine Taste setzt den Wert auf 1, die andere auf 0.
8.5 Stoppuhr mit Reedrelais Auslösung Diese Variante der Stoppuhr lässt sich mit einem Reedrelais anhalten. Dazu wird der Magnet über das Reed-Relais geführt. Mit so einer Anordnung kann man auch Zeiten gut stoppen, wenn ein Gegenstand vorbeikommt. Idealerweise wird in der Praxis dann mit zwei Reed-Relais gearbeitet. Hier kann man sich einmal unterschiedliche Möglichkeiten der Zeitnahme ausdenken. Das Programm ist identisch zu dem vorherigen, denn am Algorithmus ändert sich nichts.
9. Rotationsgeber 9.1 Der Incrementalgeber Brick Incremental Drehgeber, oder englisch incremental encoder. Solche Bausteine werden gerne bei Bedienteilen verwendet. Durch zwei phasenverschobene Kontakte lässt sich z.B. mit einem Prozessor die Drehrichtung bestimmen. Durch den Knopfdruck, wird zusätzlich ein Tastkontakt geschlossen, mit dem man auch eine beliebige Aktion auslosen kann. Je nach Bautyp werden pro Umdrehung ca. 18 bis 36 Kontaktvorgänge ausgelöst.
9.2 Incrementalgeber mit Wertausgabe Das Programm wird nun erweitert. Hier wird ein Zähler rauf- und runtergezählt und der Wert auf der Konsole des PC ausgegeben. Dazu müssen nun die einzelnen Phasen in Zähleraktionen umgerechnet werden. In der Praxis entwickelt man dazu ein Statediagramm. Im Programm gibt es zwei Variable, die den Durchlauf steuern - „state“ hält den augeblicklichen Status von A und B fest und hat die Werte 0,1,2,3 für alle Kombinationen.
9.3 Incrementalgeber und Siebensegement-Anzeigen zur Ausgabe Hier eine besonders komfortable Art, die Werte des Zählerstands auszugeben. Es werden einfach die Siebensegment-Anzeigen dazu verwendet. Dann brauchen wir auch die Konsolen-Ausgabe nicht mehr. Der Zählvorgang wird wie vorher über das Statesystem durchgeführt. Aber die Ausgabe erfolgt nun auf den beiden Siebensegment-Anzeigen.
10. OLED 10.1 Aufbau einer grafischen Anzeige Die 7-Segment-Anzeigen werden normalerweise nur für Ziffern verwendet und ganz eingeschränkt auch für Buchstaben. Mit 14- und 16-Segment-Anzeigen lassen sich auch Buchstaben brauchbar darstellen. Danach gab es dann die ersten Rasteranzeigen, mit einer Matrix von 5x7 Punkten konnte man die Schriften schon viel besser darstellen, aber auch erste graphische Symbole waren hiermit möglich.
10.2 OLED Brick Bibliothek Wir haben zahlreiche Befehle vorbereitet, mit denen man die OLED einfacher ansprechen kann, als mit reinen I2C Befehlen. Die basieren auf dem internen Controller und man kann damit jedes Pixel ansteuern, Helligkeiten programmieren und vieles mehr. Ausgabe von Zeichen, Schriften, Linien usw. ist nicht im OLED vorgesehen, daher muss es dann extern programmiert werden, dabei hilft unsere eine kleine Bibliothek.
10.3 OLED Display über I2C Hier wird eine Sinus-Funktion auf dem Display dargestellt. Dabei wird nach jedem Bildaufbau die Phase des Sinus leicht geändert, so dass der Sinus durchzulaufen scheint. Wir verwenden dazu ein paar praktische Elemente aus unserer Bibliothek. Der Aufruf disp_buffer_clear() löscht den Displaybuffer. Man kann eine Löschfarbe (Schwarz oder Weiss) als Parameter angeben. Dies geschieht aber nur in einem Buffer auf dem NANO nicht auf der OLED selbst.
10.4 OLED Display und Zeichensatz Will man Zeichen darstellen, so kann man auf unsere Zeichenroutinen zurückgreifen. Mit disp_print_xy_lcd() lässt sich ein Text auf dem Display darstellen. Dazu wird als Parameter die Koordinate der linken oberen Ecke des ersten Zeichens angegeben (x,y). 0,0 links links oben. Die Zeichenhöhe kann man mit ca. 10 Pixeln annehmen, wenn man mehrere Zeilen schreibt, so muss man einen entsprechenden Offset eingeben. In dem Programmbeispiel werden mehrere Textzeilen ausgegeben.
10.5 Das OLED Display mit A/D-Umsetzer als Voltmeter Früher hatten wir ja schon die 7-Segment-Anzeigen zur Anzeige verwendet, nun kann man das Display auch komfortabler gestalten. Hier wird der Wert in mV ausgegeben. Dazu wird zunächst der A/D-Umsetzer A0 verwendet und dann der Wert vom Bereich 0..1023 auf 0..5V umgerechnet. Dazu wird die Formel verwendet: double mverg = (double)poti * 5000.0 / 1023.0; Der Wert 5000.0 kann auch angepasst werden, wenn man eine genauere Ausgabe sehen möchte.
10.6 Das OLED Display mit A/D-Umsetzer als einfaches Mini-Oszilloskope Wenn man die Messwerte in einem Buffer speichert, kann man ein kleines Mini-Oszilloskope aufbauen. Die maximale Frequenz ist in dem Fall ziemlich klein, wenn man wie hier nach jeder Messung das Bild ausgibt. Oben wird die Spannung in V angezeigt und unten ist das Bild des gemessenen Spannungsverlaufs zu sehen. Links sieht man ein kommerzielles Oszillsokope von Rigol.
10.7 Das OLED Display und der A/D Umsetzer als Dual Voltmeter Diesmal werden beide A/D-Umsetzer Kanäle A0 und A1 verwendet und sind auch getrennt ansprechbar. Die Werte werden in V auf dem OLED angezeigt. Mit dem Universalbrick kann man zwei analoge Quellen anschliessen und messen. Der Spannungsbereich liegt zwischen 0V bis 5V. Achtung: Trotz der Schutzschaltung, bestehend aus dem 2.2k Ohm Widerstand und der Diode, deshalb bitte keine Spannung außerhalb des zulässigen Bereichs von 0-5V anschließen.
11. Digital-Analog Umsetzer 11.1 Digital Analog Umsetzer und Funktion Bisher haben wir analoge Werte, wie Spannung mit einem Analog/Digital Umsetzer in binäre Werte übersetzt. Es geht aber auch umgekehrt, also digitale Werte in analoge Werte umzusetzen. Den Umsetzer nennt man Digital-Analog Umsetzer oder umgangssprachlich D/A-Wandler.
11.2 Einfacher DA Umsetzer mit PWM Der NANO hat selbst einen einfachen DA Umsetzer vorgesehen, er arbeitet mit der sogenannten Pulsbreitenmodulation. Das Signal ist eigentlich noch digital, die Pulsbreite entspricht aber dem analogen Wert. Mit einem Kondensator könnte man den Wert noch glätten und in einen „echten“ analogen Wert umwandeln. Wenn man eine einfache LED anschließt, kann man aber auch ohne Kondensator die Helligkeit der LED durch die Pulsbreitenmodulation steuern.
11.3 Der DA-Umsetzer Brick und Ansteuerung per I2C Unser DA-Umsetzer hat eine höhere Auflösung als der über den PWM realisierte Ausgang, nämlich 4096 Stufen, also 12 Bit. Mit dieser Beispielschaltung kann auch die Helligkeit der LEDs gesteuert werden. Sie beginnen allerdings erst ab einem bestimmten Schwellwert zu leuchten, der je nach LED unterschiedlich sein kann. Deshalb leuchten die beiden LEDs unten auch nicht gleichmäßig. LEDs müsste man eigentlich mit einer Stromregelung ansteuern. Die 2.
11.4 Der DA Umsetzer Brick und Poti In dem Beispiel wird der A/D-Umsetzer verwendet, um den Spannungswert am Poti einzulesen und dann in der Schleife an dem D/A-Umsetzer auszugeben. Nun hat der A/D-Umsetzer des Nano einen Wertebereich von 0..1023 also 10Bit, der D/A-Umsetzer aber 0..4095 also 12 Bit. Im Programm muss der Wertebereich umgerechnet werden. Dazu kann der Wert des A/D-Umsetzer mit 4 multipliziert werden, im Programm geschieht dies durch eine Schiebeoperation (<<2).
11.5 OLED und DA Umsetzer am AD Umsetzer Wenn man den D/A-Umsetzer mit dem eingebauten A/D-Umsetzer und einer OLED kombiniert, kann man ganz interessante Experimente durchführen. Hier ist das Mini-Oszilloskope-Beispiel zur Darstellung eingesetzt. Der D/A-Umsetzer wird mit einer Rampe angesteuert, das heißt die Spannung steigt von 0V auf 5V an. Der Wert wird mit dem A/D-Umsetzer gemessen und als Text ausgegeben oder grafisch dargestellt.
11.6 OLED und DA Umsetzer am AD Umsetzer Sinus Hier ein Beispiel für die Ausgabe eines Sinus-Signals über den D/A-Umsetzer. Die Anzahl der Punkte und damit auch die Frequenz definiert man über SINAUFLOES. Die Frequenz ist auch durch die Periodendauer der Schleife bestimmt, hier begrenzt die Ausgabe der OLED die maximale Frequenz, die im Hz Bereich liegt. // DE_36 OLED Beispiele - DA Umsetzer am AD Umsetzer mit Sinus #include #include
12. Anwendungen 12.1 Entladekurve messen - Anzeige auf OLED Der Kondensator wird alle 3 Sekunden im Wechsel geladen und dann wieder entladen. Auf dem Mini-Oszilloskop Display sieht man die Lade- und Entladekurve dargestellt. Zur Zeitnahme wird diesmal der eingebaute Timer millis() verwendet, der die abgelaufene Zeit seit dem Start des Programms in ms enthält (alle 54 Tage hat der Timer einen Überlauf auf 0). Die Messwerte werden wie früher beim Mini-Oszilloskop aufgezeichnet und ausgegeben.
12.2 OLED und einfache Diodenkennlinie - 9V Man kann auch die Kennlinie eines Bauteils aufnehmen. Hier eine ganz einfache Methode für den positiven Teil der Kennlinie. Der Strom durch die Diode wird indirekt über den Spannungsabfall am Widerstand gemessen. Die Spannung wird über den D/A-Umsetzer zugeführt. Man erkennt die typische nichtlinieare Kennline der Diode in Durchlassrichtung. Diese Anordnung zur Messung kann man noch beliebig verfeinern.
12.3 OLED und Transistor in Emitterschaltung - 9V Die Aufnahme einer Kennlinie am Beispiel eines Transistors. Wichtig: Der Transistor wird hier mit der Spannung des D/A-Umsetzers angesteuert, die über den Widerstand zur Basis geleitet wird. Er bestimmt schließlich den Stromfluss in die Basis. Der Transistor verstärkt den Strom durch die Basis zum Emitter (je nach Typ z.B.100x) und bestimmt damit den Strom der zwischen Emitter und Kollektor fließt.
12.4 Schalten von Lasten 1 Der Ausgang des NANOs sollte normalerweise mit nicht mehr als 20mA belastet werden. Will man Lasten schalten, die mehr Strom brauchen, wird ein elektronischer Schalter mit einer höheren Belastbarkeit benötigt. Dies kannn z.B. mit einem Transistor geschehen. Der BC817 kann normalerweise mit 500mA (Peak 800mA) belastet werden. Der Maximalwert sollte nicht auf Dauer erreicht werden.
12.5 Schalten von Lasten 2 Mit MOSFETs kann man elegant große Lasten schalten, dabei wird nur mit einem Spannungspegel gearbeitet. Man braucht also das Gate nicht mit einem Widerstand zu schützen.
13. ANHANG 13.1 Listing - Sieben-Segment-Anzeige -- Bibliothek mit Beispiel Hier der vollständige Code inklusive der allgemeinen Bibliothek für die Sieben-Segment-Anzeige. Der eigentliche Bibliothekscode ist in schwarz gedruckt, ein Beispielcode in Blau. Den schwarzen Bereich dann in die Beispiele auf den Experimentalseiten kopieren die dort nur mit „...“ angedeutet sind. Wir können hier leider nicht jedes Beispiel abdrucken, da es sonst den Umfang sprengen würde.
display_seg1x(i2cseg7x2cmsb2,‘7‘); // 70..7C display_seg1x(i2cseg7x2clsb2,‘8‘); display_seg1x(i2cseg7x2dmsb2,‘7‘); display_seg1x(i2cseg7x2dlsb2,‘C‘); 0x08, // 5E _ 0 // 5F OHNE }; // Umrechnen ASCII Code in Tabellenindex unsigned int get_7seg(unsigned char asciicode) { // Umrechnen 0..255 auf // 7 seg Tabellenindex // Dabei nur Zahlen und Grossbuchstaben // 20..
13.2 Listing OLED Bibliothek mit Beispiel Hier der vollständige Code inklusive der Bibliothek für die OLED-Anzeige. Der eigentliche Bibliothekscode ist in schwarz gedruckt, das Beispiel in Blau. Entsprechende Teile dann in die Beispiele kopieren die dort nur mit „...“ angedeutet sind. // DE_27 OLED Beispiele - Pixelroutinen #include // I2C Bibliothek #include
0x88, 0x88, 0x70, 0x00, 0x00, 0x00, /* character 0x0031 (‚1‘): [width=6, offset= 0x00FC (252) ] */ 0x00, 0x00, 0x00, 0x20, 0x60, 0xA0, 0x20, 0x20, 0x20, 0x20, 0x20, 0x00, 0x00, 0x00, /* character 0x0032 (‚2‘): [width=6, offset= 0x010A (266) ] */ 0x00, 0x00, 0x00, 0x70, 0x88, 0x08, 0x08, 0x10, 0x20, 0x40, 0xF8, 0x00, 0x00, 0x00, /* character 0x0033 (‚3‘): [width=6, offset= 0x0118 (280) ] */ 0x00, 0x00, 0x00, 0x70, 0x88, 0x08, 0x30, 0x08, 0x08, 0x88, 0x70, 0x00, 0x00, 0x00, /* character 0x0034 (‚4‘): [width=6
0x88, 0x88, 0x84, 0x00, 0x00, 0x00, /* character 0x004C (‚L‘): [width=6, offset= 0x0284 (644) ] */ 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0xF8, 0x00, 0x00, 0x00, /* character 0x004D (‚M‘): [width=8, offset= 0x0292 (658) ] */ 0x00, 0x00, 0x00, 0x82, 0xC6, 0xC6, 0xAA, 0xAA, 0xAA, 0x92, 0x92, 0x00, 0x00, 0x00, /* character 0x004E (‚N‘): [width=7, offset= 0x02A0 (672) ] */ 0x00, 0x00, 0x00, 0x84, 0xC4, 0xA4, 0xA4, 0x94, 0x94, 0x8C, 0x84, 0x00, 0x00, 0x00, /* character 0x004F (‚O‘): [width=8
0x40, 0x40, 0x40, 0x00, 0x00, 0x00, /* character 0x0067 (‚g‘): [width=6, offset= 0x040C (1036) ] */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x68, 0x98, 0x88, 0x88, 0x98, 0x68, 0x08, 0xF0, 0x00, /* character 0x0068 (‚h‘): [width=6, offset= 0x041A (1050) ] */ 0x00, 0x00, 0x00, 0x80, 0x80, 0xB0, 0xC8, 0x88, 0x88, 0x88, 0x88, 0x00, 0x00, 0x00, /* character 0x0069 (‚i‘): [width=2, offset= 0x0428 (1064) ] */ 0x00, 0x00, 0x00, 0x80, 0x00, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, /* character 0x006A (‚j‘): [widt
0x40, 0x60, 0x98, 0x00, 0x00, 0x00, /* character 0x00A5 (‚¥‘): [width=6, offset= 0x0594 (1428) ] */ 0x00, 0x00, 0x00, 0x88, 0x88, 0x50, 0x50, 0xF8, 0x20, 0xF8, 0x20, 0x00, 0x00, 0x00, /* character 0x00A7 (‚§‘): [width=6, offset= 0x05A2 (1442) ] */ 0x00, 0x00, 0x00, 0x70, 0x88, 0x40, 0xE0, 0x90, 0x48, 0x28, 0x10, 0x88, 0x70, 0x00, /* character 0x00A9 (‚©‘): [width=8, offset= 0x05B0 (1456) ] */ 0x00, 0x00, 0x00, 0x3C, 0x42, 0x9D, 0xA1, 0xA5, 0x99, 0x42, 0x3C, 0x00, 0x00, 0x00, /* character 0x00AC (‚¬‘): [widt
0x00, 0x00, 0x0F, 0x00, 0x30, 0x80, 0x28, 0x80, 0x20, 0x80, 0x28, 0x80, 0x17, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, /* character 0x2640 (‚?‘): [width=8, offset= 0x072A (1834) ] */ 0x00, 0x00, 0x00, 0x3C, 0x42, 0x42, 0x42, 0x44, 0x38, 0x10, 0x10, 0x3C, 0x00, 0x00, /* character 0x2642 (‚?‘): [width=8, offset= 0x0738 (1848) ] */ 0x00, 0x00, 0x02, 0x0E, 0x06, 0x0A, 0x08, 0x78, 0x44, 0x44, 0x44, 0x78, 0x00, 0x00, /* character 0x266B (‚?‘): [width=8, offset= 0x0746 (1862) ] */ 0x00, 0x00, 0x00, 0x06, 0x1E, 0x
1064, 1078, 1092, 1106, 1120, 1134, 1148, 1162, 1176, 1190, 1204, 1218, 1232, 1246, 1260, 1288, 1302, 1316, 1330, 1344, 1358, 1372, 1386, 1400, 1414, 1428, 1442, 1456, 1470, 1484, 1498, 1512, 1526, 1540, 1554, 1568, 1582, 1596, 1610, 1624, 1638, 1652, 1666, 1680, 1694, 1708, 1722, 1736, 1750, 1764, 1778, 1806, 1834, 1848, 1862, 127 /* /* /* /* /* /* /* /* /* /* /* /* /* /* /* /* /* /* /* /* /* /* /* /* /* /* /* /* /* /* /* /* /* /* /* /* /* /* /* /* /* /* /* /* /* /* /* /* /* /* /* /* /* /* /* 428 436 44
6, 6, 6, 6, 11, 8, 7, 7, 7, 6, 6, 8, 7, 2, 5, 7, 6, 8, 7, 8, 6, 8, 7, 7, 6, 7, 8, 11, 7, 8, 7, 3, 3, 3, 5, 6, 4, 6, 6, 6, 6, 6, 4, 6, 6, 2, 2, 5, 2, 8, 6, 6, 6, 6, 4, 129 /* /* /* /* /* /* /* /* /* /* /* /* /* /* /* /* /* /* /* /* /* /* /* /* /* /* /* /* /* /* /* /* /* /* /* /* /* /* /* /* /* /* /* /* /* /* /* /* /* /* /* /* /* /* /* < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r 003C 003D 003E 003F 0040 0041 0042 0043 0044 0045 0046 0047 00
void i2c_oled_write_command(unsigned char i2cbaseadr, unsigned char cmdvalue) { Wire.beginTransmission(i2cbaseadr); Wire.write(0x80); // 1000 0000 co=1 DC =0 kommando Wire.write(cmdvalue); Wire.
i2c_oled_write_command(i2cbaseadr,0xff); // 0..ff // i2c_oled_write_command(i2cbaseadr,0xD9); // set precharge period i2c_oled_write_command(i2cbaseadr,0xF1); // F1 flacher staerker, 11//22 weniger stark // i2c_oled_write_command(i2cbaseadr,0xDB); // COM Deselect level i2c_oled_write_command(i2cbaseadr,0x40); // 0.
// // // // x,y dabei row col organisation 132 x 64 pixel dabei 8 pixel in y-richtung mit 0 beginnend auf einem byte x horizontal y vertikal // 64 x 48 pixel !! // void disp_setpixel(int x, int y, unsigned short col1) { // COL =0 dunke =1hell // 1 pixel setzen (little endian) // col1 =0 hell =1 dunkel // Tabelle 8 bytes per zeile // eintrag 0 ist rechte pixelgruppe // y=0 ist unten links aber physicalisch von oben nach unten (row 7 bit 7 -> y=0) unsigned char *dest; // zielpointer lcdbuffer int yoff = 0;
return(x1); } // Linien Zeichnen void disp_line_lcd(int x0, int y0, int x1, int y1, unsigned short col) { // disp_setpixel(x+b1,y+i,color); // disp_setpixel(x+b1,y+i,color); // schnelles fill // // x1,y1 und x2,y2 swappen ggf.
int y=0; // Sinuskurve berechnen und in Radiant umrechnen von Phase y = (int)(23.0*sin(((double)i*3.141592*2.0)/64.0+phase/360.0*2.0*3.141592)+24.
14. Ausblick Das BrickRKnowledge-System wurde entwickelt und erfunden von Dipl. Ing. Rolf-Dieter Klein. Er hat das Amateurfunkrufzeichen DM7RDK (bzw. Ausbildungsrufzeichen DN5RDK - Seite Bundesnetzagentur, Mitglied DARC), daher taucht dieses kürzel auch öfters auf den Leiterplatten auf. Die Entwicklung des Brick‘R‘knowledge Systemes geschah 2014 im Rahmen der Nachwuchsförderung und Ausbildung im Bereich Amateurfunk und Industrie.