Archiv der Kategorie: Elektronikbastler

Beiträge über Bastelprojekte zum Thema Elektronik
zum Beispiel: Ein Radio mit Arduino, Geigerzähler…

UV-Sensor Logger selbstgebastelt

Kommt der Sommer, kommen neue Ideen. In den Sommermonaten ist ja bekanntlich die Sonnenscheindauer länger und auch die Intensität der Sonnenstrahlen höher. Viele nutzen diese Eigenschaft der Sonne, um ihre Vitamin-D Produktion des Körpers anzutreiben, andere wiederum legen sich unter die Strahlenquelle um durch den hohen UV Anteil ihrer Hautfarbe abzudunkeln. Dies wiederum steigert vermeintlich deren Attraktivität und regt die Hormonproduktion und die Paarungsbereitschaft an… Leider hat der nicht sichtbare UV Bereich im Spektrum des Sonnenlichts bekanntlich auch negative Auswirkungen auf den menschlichen Körper. Auch technisch kann das Sonnenlicht genutzt werden. Durchschnittlich wird die Leistung der Sonne pro Flächeneinheit mit 1000W pro m² angenommen. Großflächige P-N Übergänge in Halbleitermaterialien schaffen mittlerweile mit einem Wirkungsgrad von bis zu 22% daraus elektrische Energie zu erzeugen.

Man kann die Energie aber auch noch anders nutzen, bzw. den UV-Anteil. Vielen Retrosammlern ist sicherlich das Problem mit den vergilbten alten Kunststoffgehäusen bekannt. Um das in den Griff, bzw. wieder in den Ursprungszustand von vor 30, 40 Jahren zu bekommen, verwendet man H2O2 also Wasserstoffperoxid und UV Licht um so einen Bleichprozess in Gang zu bekommen. Und so kam ich zur Idee für folgendes Projekt.

Bei einem online-Elektronik-Laden fand ich im Abverkaufs Angebot ein UV-Sensor Board des Herstellers Waveshare. Darauf befindet sich ein LITEON OPTOELECTRONICS LTR390 Chip samt Levelshifter-Schaltung. Als Interface steht ein I²C Bus zur Verfügung. Ein Blick ins Datenblatt verriet mir, dass der Sensor zwei Wellenlängenbereiche erfasst und separat ausgibt.  Der ALS (Ambient Light Sensor von 500-600nm) und der UV (Ultra Violett Bereich von 300-350nm).  Damit kann man doch schnell ein einfaches Logging Board basteln – dachte ich mir.  So habe ich mir gedacht, das Board sollte folgendes können:

  • Spannungsversorgung von einer 18650er Zelle oder USB
  • USB soll den Akku auch laden können
  • einen Micro-SD Slot zum Aufzeichnen der Sensordaten
  • einen RS-232 Port, zum direkten Loggen am PC
  • ein cooles OLED Display
  • zwei Taster zum Bedienen des Loggers (Intervall, Start/Stop etc.)

Die Steuerung soll natürlich wieder einmal ein Chip von Atmega – der 328er übernehmen. Davon befinden sich einfach noch genügend Stück in meinen Sortiment Kästchen. Damit man sich schneller einen Überblick über den Aufbau verschaffen kann, habe ich das folgende Blockdiagramm gezeichnet:

Im nächsten Schritt habe ich aus dem Blockschaltbild einen Schaltplan erstellt, um aus dem dann wiederum ein Layout erstellen zu können.  Parallel zur Schaltplanerstellung habe ich einzelne Bereiche per „Luftverkabelung“ auch gleich probeweise zusammengeschaltet und getestet, ob das alles auch so funktioniert, wie ich mir das vorstelle. Und vor allem sollte auch alles im Flashspeicher des Microcontrollers Platz haben.

Im Bild oben ist der „luftige“ Aufbau bestehend aus fertigen Komponenten zu erkennen. Für die ersten Tests mit dem Sensor und dem OLED Display reichte ein Arduino vollkommen aus. Damit war es mir möglich, die gewünschten Funktionen zu testen. Somit stand der Erstellung des Schaltplanes nichts mehr im Weg. Eine 18650er Lithiumzelle soll als primäre Energiequelle dienen. Alternativ wird auch ein USB-Port vorhanden sein, der die Zelle laden kann bzw. den Sensor betreiben kann. Dafür, weil ich faul bin und auch ziemliche Bauteil Lieferengpässe ein großes Problem sind, verwende ich zum Laden des Akkus eine fertiges Wemos-D1-Mini Board. Das wird genauso wie das OLED Displayboard und das Sensorboard als fertige Komponente auf dem Design der Platine Platz finden.  Als Controller kommt wieder, wie schon erwähnt, ein Atmega328 im TQFP Gehäuse zum Einsatz. Dieser wird über die I²C Schnittstelle mit dem OLED Display (SBC-OLED01 mit SSD1306 Controller) und dem LTR390 UV-Sensorboard kommunizieren. OLED und Sensor sind 5V kompatibel. Die SD-Karte wird aber mit 3.3V betrieben. Dafür benötigt die Schaltung noch einen Spannungswandler von 5V auf 3.3V für die Versorgung und einen Levelshifter für den SPI-Datenbus, über den die SD-Karte mit dem Atmega die Daten austauscht. Da der Atmega dann auch mit seiner Firmware programmiert werden möchte, habe ich einen 2×4 Pinheader für den Anschluss eines Programmers vorgesehen. Sechs Pins davon (GND,5V, MOSI, MISO, SCK und RESET) benötigt der Programmer und die zwei verbleibenden Pins sind für die serielle Schnittstelle vorgesehen. Die beiden Interrupt-Eingänge des Atmega werden mit je einem Taster beschalten, der dann die Software bedienbar macht. Die Batteriespannung wird über einen Teiler an einem der ADC-Eingänge gemessen bzw. auch mitgeloggt. Das Ergebnis dieser Gedanken ist der folgende Schaltplan:

Ein Layout ist danach der nächste Schritt.  Bei einer Größe von 12 x 4,5 cm ist die Platine einigermaßen „handlich“. Die Leiterbahnführung findet auf beiden Seiten statt und die Module (Ladeschaltung, Display und UV-Sensor) sind über Pinheader steckbar ausgeführt.

Die beiden Bilder oben zeigen die Vorschau der „Top-“ bzw. „Bottom-“ Seite des Layouts. Aus den so erstellten Produktionsdaten konnte eine Platine erstellt werden.

Nach einiger Lötarbeit war die Hardware dann soweit fertig. Um diesem „Lötwerk“  letztendlich auch Leben einzuhauchen, bedurfte es einer Software, die auf dem Microcontroller ihre Arbeit verrichtet.

Beim Basteln der Software bediente ich mich der kostenlosen „Arduino IDE“ Entwicklungsumgebung.  Die Dokumentation des LTR390 beschreibt genau über welche Register welche Funktionen des Sensors zu bedienen sind. Es gibt aber auch schon für ganz Bequeme eine fertige Library – so wie für fast alle Sensoren und Aktoren, die an Microcontroller angeschlossen werden sollen. In der Arduino IDE findet man über den Boardmanager die „Adafruit LTR390 Library“ über die man einfach mit dem Sensor kommunizieren kann.  Die Ansteuerung des OLED Displays übernimmt in meinem Fall die SSD1306Ascii Library. Die Buskommunikation übernehmen die „Wire“ und “ SPI“ Library und die „SD“ spricht mit der SD – Karte.  Die Includes sehen dann so aus:

#include <LTR390.h>
#include <SD.h>
#include <SPI.h>
#include <Wire.h>
#include „SSD1306Ascii.h“
#include „SSD1306AsciiWire.h“

Den gesamten Code kann ich bei Bedarf gerne hier veröffentlichen. Er ist allerdings kein Hexenwerk, sondern simples und sicher nicht optimiertes Codezeilen Geschreibe 🙂 In der derzeitigen Code- (Firmware) Version 1.3d gibt es ein kleines Auswahlmenü, das es ermöglicht, das Logintervall der SD-Karten-Aufzeichnung einzustellen und natürlich auch die Aufzeichnung zu starten bzw. zu stoppen. Geloggt wird in ein Textfile. Die aufgezeichneten Daten sind UV-Index, Umgebungshelligkeit und die Akkuspannung.

Einen Auszug aus dem Datalog habe ich unten eingefügt:

 Ambient[lx], UV-indx, Batt[V], Loggingintervall[s]  
 691.60,0.01,3.77,20  
 691.60,0.03,3.76,20  
 1184.00,0.03,3.77,20  
 1184.00,0.03,3.75,20  
 1191.00,0.03,3.77,20  
 1191.00,0.03,3.75,20  
 1198.60,0.03,3.76,20  
 1198.60,0.03,3.73,20  
 1211.60,0.03,3.76,20  
 1211.60,0.04,3.75,20  
 1223.00,0.04,3.75,20  
 1223.00,0.04,3.76,20  
 1234.20,0.04,3.76,20  
 1234.20,0.04,3.74,20  
 1243.60,0.04,3.76,20  
 1243.60,0.04,3.76,20  
 1252.00,0.04,3.75,20  
 1252.00,0.04,3.73,20  
 1261.20,0.04,3.74,20  
 1261.20,0.04,3.72,20  
 1269.60,0.04,3.76,20  
 1269.60,0.04,3.76,20  
 1278.40,0.04,3.76,20  
 1278.40,0.04,3.75,20  
 1288.40,0.04,3.76,20  
 1288.40,0.04,3.75,20  
 1298.20,0.04,3.76,20  
 1298.20,0.04,3.74,20  
 1305.80,0.04,3.73,20  
 1305.80,0.04,3.73,20  
 1313.20,0.04,3.73,20  
 1313.20,0.04,3.75,20  
 1321.60,0.04,3.74,20  
 1321.60,0.04,3.75,20  
 1331.80,0.04,3.75,20  
 1331.80,0.04,3.75,20  
 1341.60,0.04,3.74,20  
 1341.60,0.04,3.76,20  
 1349.40,0.04,3.76,20  
 1349.40,0.04,3.76,20  
 1358.20,0.04,3.72,20  
 1358.20,0.04,3.76,20  
 1365.60,0.04,3.74,20  
 1365.60,0.04,3.73,20  
 1374.20,0.04,3.72,20  
 1374.20,0.04,3.75,20  
 1380.60,0.04,3.75,20  
 1380.60,0.04,3.76,20  
 1386.60,0.04,3.75,20  
 1386.60,0.04,3.76,20  
 1394.80,0.04,3.75,20  
 1394.80,0.04,3.75,20  
 1401.40,0.04,3.73,20  
 1401.40,0.04,3.74,20  
 1408.60,0.04,3.75,20  
 1408.60,0.04,3.74,20  
 1414.20,0.04,3.73,20  

 

Diese Daten lassen sich jetzt sehr einfach weiterverarbeiten und grafisch darstellen. Als Office-Nutzer kann man zum Beispiel auf Excel zurückgreifen und die Daten dort importieren und als Graphen darstellen. Es geht aber noch einfacher und auch sehr schnell mit Tools wie Matlab. Mit einem Script wie dem nachfolgenden kann man die Logdatei dann visualisieren.

 

 %% Setup the Import Options and import the data  
 opts = delimitedTextImportOptions("NumVariables", 4);  
 opts.DataLines = [3, inf];  
 opts.Delimiter = ",";  
 opts.VariableNames = ["Ambientlx", "UVindx", "BattV", "Loggingintervalls"];  
 opts.VariableTypes = ["double", "double", "double", "double"];  
 opts.ExtraColumnsRule = "ignore";  
 opts.EmptyLineRule = "read";  
 opts = setvaropts(opts, ["Ambientlx", "UVindx", "BattV"], "TrimNonNumeric", true);  
 opts = setvaropts(opts, ["Ambientlx", "UVindx", "BattV", "Loggingintervalls"], "DecimalSeparator", ",");  
 opts = setvaropts(opts, ["Ambientlx", "UVindx", "BattV"], "ThousandsSeparator", ".");  
 datalog = readtable("F:\ingmarsretro\datalog.txt", opts);  
 clear opts  
 x=size(datalog); % groesse der tabelle  
 measurement=x(1); % anzahl messungen   
 uvi=datalog{1:measurement,2};  
 ambient=datalog{1:measurement,1};  
 messzeit = linspace(0,(measurement*datalog{1,4}),measurement); %zeitvektor von 0 bis zeitintervall aus datalog spalte4 * messungen  
 figure(1);  
 title('UV - Index');  
 subplot(2,1,1);  
 plot(messzeit,uvi);  
 title('UV - Index');  
 xlabel('Zeit [s]');ylabel('UV - Index');  
 subplot(2,1,2);  
 plot(messzeit,ambient);  
 title('Beleuchtungsstärke');  
 xlabel('Zeit [s]');ylabel('Beleuchtungsstärke [lux]');  

Wird das Script ausgeführt, dann erhält man einen Plot, der die Messdaten visualisiert.

Die technischen Informationen zum Sensor sind dem Datenblatt des Herstellers zu entnehmen. Hier ein paar kurze Eckdaten:

Der LTR390 besteht aus zwei Fotodioden, einer für das sichtbare Spektrum des Lichtes und einer, die im UV-Bereich empfindlich ist. Der Strom der Photodioden wird in internen ADCs digitalisiert. Eine Interne Logic steuert die ADCs und über eine I²C Schnittstelle wird die Verbindung zur Außenwelt hergestellt. Die Auflösung von ALS und auch UVS ist in 13,16,17,18,19 und 20 Bit konfigurierbar. Der Sensor Chip ist in einem 2x2mm 6pin Gehäuse untergebracht. Die Detektoröffnung hat eine Kantenlänge von 280×280 µm.

Quelle: Datenblatt LTR-390UV https://optoelectronics.liteon.com/en-global/Led/LED-Component/Detail/926
Quelle: Datenblatt LTR-390UV https://optoelectronics.liteon.com/en-global/Led/LED-Component/Detail/926

 

 

Eigenbau Nixiuhr

Das in den letzten Jahren das Thema Retro immer mehr zum Trend wurde, ist auch mir nicht entgangen. Auch der „Industrial“- und „Steam“-Style hat in vielen Haushalten Einzug gehalten.  Man(n) stellt sich wieder viele Dinge ins Regal, die die robuste Technik und das Aussehen der vergangen Jahrzehnte repräsentieren. So flackern LED-Leuchtmittel in den Räumen, die optisch den Glühbirnen der Gründerzeit nachempfunden wurden. Die Messing Lampenfassungen werden von einem mit Stoffgeflecht ummanteltem Kabel gehalten. Anstelle der Kohle- oder Wolframglühfäden in den Birnen arbeitet modernes LED-Filament. Thematisch diesem Stil entsprechend, sind beispielsweise auch mechanische Uhren und elektrische Uhren mit Leuchtanzeigen aller Art wieder gefragt. Passend zu diesem Trend, habe ich in älteren Blogbeiträgen schon über die VFD-Uhren berichtet. (VFD = VaccumFLuoreszenzDisplay) Diese Anzeigetechnologie verwendete man zum Beispiel bis Ende der 90iger Jahre noch häufig in Videorecordern, HiFi Geräten und diversen Radioweckern. Danach war die LED und LCD Technologie Standard. Heute halten überall die kleinen OLEDs Einzug. Im Rahmen des Retro Revivals werden VFD´s in Form von Einzelziffer-Anzeigeröhren zu Uhren zusammengebaut. Diese Uhren gibt es als Fertiggeräte oder auch als Bausätze (grother.de).  Da diese Anzeigeröhren mittlerweile nicht mehr hergestellt werden und nur Altbestände (new old stock) verfügbar sind, steigen auch die Preise. Aber es geht preislich noch schlimmer – eine technische Entwicklung aus den 1920er Jahren ist eine Anzeigetechnologie nach dem Prinzip der Glimmlampe.  Hierbei wird in einem, mit Edelgas gefüllten, Glaskolben eine aus Draht gebogene Ziffer als Kathode, vor einem dünnen Metallgitter als Anode angebracht. Legt man eine Spannung an, so beginnt das Edelgas entlang des als Ziffer geformten Drahtes zu glimmen. So entsteht, von außen betrachtet, der Eindruck einer leuchtenden Ziffer. In einer solchen Röhre sind meistens die Ziffern von 0-9 untergebracht und für jede Ziffer ist natürlich auch ein separater Anschluss vorhanden. Viele von den Lesern werden diese Art von Röhre sicherlich kennen. Sie nennt sich NIXIE – Anzeigeröhre (stammt von der der Bezeichnung „Numeric Indicator eXperimental No. 1“

Eine Uhr mit solchen Anzeigeröhren fehlt noch in meiner Sammlung. Also möchte ich eine solche haben. Aber kaufen ist einfach – und außerdem auch sehr teuer. So habe ich mir vorgenommen, eine Nixieuhr selber zu bauen. Begonnen hat alles mit einer langwierigen Suche nach den Röhren, denn auch für diese muss man mittlerweile schon einiges hinlegen. Und ich benötige mindestens sechs Stück, da meine Uhr auch eine Sekundenanzeige haben soll. So habe ich also im Internet auf verschiedensten Plattformen gesucht – und in der Bucht wurde ich fündig. Dort wurde ein Board bestückt mit Nixieröhren angeboten, das aus irgendeinem alten Gerät herausgebrochen wurde. Die Funktion des Boards wurde als „unbekannt“ angegeben – dafür war es sehr günstig. Der Verkäufer hatte zwei davon. Also riskierte ich es und kaufte die beiden Platinen bestückt mit je fünf Nixies.

Die Röhren waren dann auch mit einiger Vorsicht erfolgreich ausgelötet. Die Type der Röhre ist die Z574M, zu der man im Netz auch die Datenblätter findet und somit auch die Sockelbeschaltung hat.

Mit Hilfe der Beschaltung lässt sie sich dann auch einfach kontaktieren und so Ziffer für Ziffer jeder Röhre überprüfen. Die Kenndaten der 574 sind:

  • Anodenzündspannug: 150V
  • Anodenbrennspannung: 140V
  • Anodenlöschspannung: 120V
  • Max Anodenspannung: 170V
  • Kathodenstrom min: 1.5mA
  • Kathodenstrom max: 2.5mA

Mit einem geeigneten Netzgerät konnte ich die notwendigen Versorgungsspannungen für den Funktionstest schnell einstellen.

Man sieht hier, dass die Röhre bei einer Brennspannung von knapp 140V einen Strom von 2.8mA zieht. Das entspricht einer Leistung von 392mW. Wenn ich also hochrechne und alle sechs Ziffern der Uhr dauerbestromt werden, dann muss die Spannungsversorgung für die Röhren ca. 2.3W bringen.

Die Röhren funktionieren also schon mal. Jetzt kann ich mir Gedanken machen wie die Uhr aussehen soll und noch mehr, wie ich sie konstruieren will.

Die Idee ist, dass ein Mikrocontroller alle sechs Röhren ansteuern soll.  Das will ich mit 8-Bit 4094er Schieberegistern realisieren, wovon je vier Bit für eine Röhre verwendet werden. Diese vier Bit aus dem Shift-Register sollen dann über Binary Coded Decimals (also BCD) die Röhren ansteuern. Da die Röhren aber für jede Ziffer einen Anschluss haben, müssen aus den vier BCD-Leitungen zehn separate Zifferansteuerungen generiert werden. Das wird ein CD4028 erledigen. Der IC CD4028 ist ein „BCD to Dezimal Decoder“. Um die relativ hohen Spannungen der Nixies zu schalten, wird der BCD-Dezimal Decoder einen geeigneten Transistor ansteuern. Hier wird der MPSA42 seinen Dienst verrichten. Das ist ein NPN Bipolar Transistor mit einer Kollektor-Emitter Spannungsfestigkeit von 300VDC bei einem maximalen Kollektorstrom von 500mA.  Um die Röhren möglichst flexibel einsetzen zu können, habe ich mir ausgedacht, für jede Röhre eine eigene Platine zu gestalten. Diese einzelnen Anzeigeplatinen sollen dann auf eine Hauptpatine gesteckt werden. So kann man, sollte ein Digit einmal defekt sein, das betreffende Board einfach herausziehen und es reparieren. Dann muss nicht am Mainboard herum gelötet werden.

Am Mainboard soll der Microcontroller Platz finden. Auch die Nieder- und Hochspannungsversorgung und die Schieberegister sollen am Mainboard untergebracht werden. Die Display-Platinen tragen lediglich die Nixieröhre samt deren Treibertransistoren und den BCD-Dezimal Decoder. Mittels Pfostensteckverbindern sollen sie einfach in das Mainboard einsteckbar sein. Um diese Formulierungen ein wenig einfacher darzustellen habe ich diese Skizze angefertigt:

Auf Basis dieser Idee begann ich nun, die Schaltpläne zu zeichnen. Mit dem Displayboard, auf dem sich die Röhre befindet fing es also an. Der Schaltungsaufbau ist sehr einfach. Über zwei gegenüber liegende Pfostensteckverbinder sollte das Board auf dem Mainboard einen stabilen Halt bekommen. Einer der Steckverbinder versorgt den BCD-Dezimaldekoder (CD4028N) mit den vier Dateneingängen und der 5V Versorgungsspannung für die Logik. Auf der anderen Seite des Boards wird die „Hochspannung“ für die Röhre bereitgestellt.

Daraus konnte ich dann einfach ein Layout erstellen und dieses dann als Prototyp als Platine herstellen.

Nach dem Ätzen und Bestücken der ersten Platine und fünf Weiteren war der erste Schritt der Nixieuhr getan:

Um den ersten Teil des Machwerks zu testen, hatte ich an meiner Arbeitsstelle ein DEB100 Digital-Experimentierboard zur Verfügung. Das folgende Kurzvideo zeigt das Testergebnis:

Nachdem dann alle sechs Boards bestückt und getestet waren, hatte ich mich mit der Planung des Mainboards beschäftigt. Zu Beginn stand natürlich wieder die Erstellung eines Schaltplanes. Aus einer externen einer 12VDC Quelle, die idealer Weise ein simples Steckernetzteil sein sollte, mussten die Versorgungsspannungen generiert werden. Zum einen benötigte ich eine 5VDC Versorgung für den Microcontroller, die Schieberegister und die BCD Decoder und zum anderen eine „Hochspannung“ von 140VDC für die Nixieröhren. Die 5V waren schnell erledigt – hier sollte ein 7805 Längsregler seinen Dienst verrichten. Da die Stromaufnahme der digitalen Komponenten relativ gering ist, bedurfte es hier keiner aufwendigen Maßnahmen. Die 7V Differenz am 7805 bei den paar Milliampere packte er ohne großartige Verlustleistungswärmeabgabe. Für die Erzeugung der 140V bastelte ich einen Step-Up – Konverter mit einem MC34062 (Inverting Regulator – Buck, Boost, Switching) Controller, der über einen FET eine 220uH Induktivität schaltet. Über einen Spannungsteiler mit Trimm Poti am Ausgang lässt sich eine Spannungsrückmeldung an den Komparator Ausgang des Controllers senden und somit die Ausgangsspannung einstellen. Als Microcontroller nehme ich für die meisten meiner Projekte (aufgrund des Lagerstandes 🙂 ) immer Atmega328 und Ähnliche. So auch hier. Das Ergebnis ist folgender Schaltplan:

Daraus habe ich wieder ein Layout gebastelt und wieder ein Board geätzt und bestückt. Allerdings wurde dieses Prototypen Testboard nur eine Version mit vier Digits. Der Grund war auch, dass ich keine größere Roh-Platine zur Verfügung hatte 🙂

Daraus habe ich wieder ein Layout gebastelt und wieder ein Board geätzt und bestückt. Allerdings wurde dieses Prototypen Testboard nur eine Version mit vier Digits. Der Grund war auch, dass ich keine größere Roh-Platine zur Verfügung hatte 🙂

Nach diversen erfolgreichen Tests mit dem Prototypen Board, bestellte ich mir beim Platinen Herstellers meines Vertrauens professionell gefertigte Boards. Nach dem Bestücken derselben erstellte ich mir dann ein Testprogramm das alle Digits ansteuern konnte. Ein kurzes Testvideo ist unten verlinkt:

Wie die Uhr dann mit den „schön“ gefertigten Boards aussieht, zeigen die folgenden Fotos. Um das ganze Werk noch etwas nostalgischer zu gestalten, hatte ich die Idee die Boards auf einer gefrästen Holzplatte zu montieren. (Danke an Gebhard für die Holzarbeiten). Um die Uhrenelektronik auch dauerhaft staubfrei zu halten, ließ ich mir eine transparente Plexiglashaube anfertigen.

Skizze für die Arcylglashaube

Die Software habe ich wie so oft mit der Arduino IDE gebastelt. Zum Flashen des Microcontrollers verwende ich den AVRISP mkII Programmer.  Wenn jemand am Code interessiert sein sollte kann ich ihn hier im Blog auch posten.

 

Videostreaming im Auto – Android Auto – die Billiglösung

Da in der zurzeit etwas wärmeren Jahreszeit meine Freizeitaktivitäten vermehrt im Outdoor Bereich stattfinden, leidet das Schreiben von den Weblogs ein wenig. Ich arbeite aber trotzdem an einigen Projekten, Reparaturen und Restaurationen. So kommt auch wieder einiges an Material zusammen, um daraus -in der kälteren Jahreszeit- Beiträge zu verfassen. Diesmal habe ich mich nur wieder über die Abzocke und Preisgestaltung im KFZ – Bereich geärgert und nach einer alternativen Lösung gesucht.

Es geht dabei um mein fünf Jahre altes Auto, das mit einem OnBoard Navigationssystem ausgestattet ist. Die Navigationsdaten sind auf einer im Fahrzeug gesteckten SD-Karte gespeichert. Soweit so gut. Die Kartendaten des Fahrzeuges sind mittlerweile allerdings auch in die Jahre gekommen und vieles ist nicht mehr aktuell. Sowas stört besonders wenn man sich auf einer Urlaubsreise befindet und das Navi das Ziel nicht kennt, oder den Weg dorthin nicht verzeichnet hat. Alles kein Problem dachte ich mir, Kartendaten sind ja auf der SD-Karte – da gibt´s doch sicher Updates. Und ja es gibt sie – allerdings kosten die Kartenupdates von 200Euro aufwärts und mehr. Dafür bekomme ich ja ein komplettes Navigationsgerät samt aktuellen Karten mit gratis Onlineaktualisierung.

Also habe ich versucht, mich schlau zu machen und eine aktuelle Karte im Netz zu finden und auf die SD-Karte zu speichern. Aber das klappt natürlich nicht. Hier werden einige Sicherheitsmechanismen angewandt. So ist zum Beispiel die Hardware ID der Speicherkarte im Navigationssystem hinterlegt (kodiert). So scheiterte mein erster Versuch die originale Navikarte als Image auf eine neue SD-Karte zu kopieren. Sie wird als nicht gültige Karte erkannt. Und mit Diagnosegerät VCP und VCDS im Navirechner ohne Anleitung herumzubasteln ist mir dann zu viel Aufwand. Also musste eine andere Möglichkeit her. So ist auf jedem Smartphone ein online Navi installiert – nennt sich Google Maps. Und zudem gibt es auch einige offline Navisystemen die kostenfrei von den Webstores zu laden sind.  So war nun meine Idee das Auto um eine Phone Mirror Funktion zu erweitern. (diese Dinge nennen sich Android Car Play in der Obstabteilung usw.) Da meine alte Kiste nichts davon im Entertainmentsystem bereitstellt gab es für mich folgende Alternativen:

Entweder kaufe ich ein China Navi zum Nachrüsten – und dabei meine ich die, den originalen Boardmonitoren des Autos nachempfundenen Bildschirme, in die dann ein Android Rechner eingebaut ist. Dort können dann die entsprechenden Apps zur Navigation und andere Spielereien installiert werden. Die Daten des originalen Bildes des Auto Infotainment Systems werden natürlich weiterhin dargestellt. Solche Systeme sind in der Größenordnung von 400-600 Euro zu bekommen. Dazu kommen dann noch ein paar Stunden an Einbau- (Bastel-) Arbeiten.

Eine andere Möglichkeit ist ein Retro Fit Umbau. Das bedeutet, ich baue das höherwertige Infotainment System mit dem entsprechenden Funktionsumfang in das Fahrzeug ein. Das wiederum bedeutet: das alte System ausbauen, ein neues System vom Fahrzeughersteller samt allen notwendigen Steuergeräten, Kabelbäumen, Abdeckblenden etc. zu kaufen, dann einzubauen und im Anschluss alles mit viel Aufwand codieren, Parameter einspielen usw. Die Kosten sind immens und rechnen sich auf keinen Fall (>2500,- wenn’s reicht) und dann noch die Arbeit für den Aus- und Einbau. -> alles kann man das vergessen.

MiraScreen Empfänger

Und hier die letzte Möglichkeit für alles zusammen gerade mal 50Euro und mit einem Aufwand von 30 Minuten Einbau bestehend aus folgenden Punkten:

 

 

  • die Video In Motion (VIM) Funktion des Displays bzw. der Radiounit freischalten
  • ein AMI Kabel mit Composite Video In und Audio In erwerben
  • einen MiraScreen WLAN-Receiver um gerade mal 40Euro erwerben, der imstande ist, das Videosignal auch per CVBS auszugeben
  • das ganze Teil (in diesem Fall) in der Ablage der Mittelkonsole einbauen
  • das Kabel für die Energieversorgung der Mirabox durch die Ablage zur 12V Steckdose verlegen und anschliessen.

Diese Arbeiten sind schnell gemacht und das Smartphone kann per „Stream“ (im Android Smartphone unter „Kabellose Übertragung in Bluetooth- & Geräteverbindung“) verbunden werden. Jetzt wird der Bildschirm und der Ton des Smartphones auch über das Infotainmentsystem des Fahrzeugs wiedergegeben.

AMI Videokabel

Das AMI-Videokabel wird an der AMI Buchse des Fahrzeugs angesteckt und die analogen Video- und Audioleitungen mit den Chinch-Steckern des MiraScreen Anschlusskabels verbunden.

Stecker für Versorgung, Video und Audio an den MiraScreen

Die Energieversorgung für den Mira Screen habe ich direkt von der 12V Steckdose hinter der Mittelarmlehne entnommen. Dazu habe ich den Stecker der 12V Dose ausgepinnt, je einen Draht an 12V und GND angelötet und wieder eingepinnt.  An das andere Ende der beiden Drähte habe ich eine 13,5mm Tamiya Kupplung gekrimpt. Zusätzlich hat die 12V Leitung auch noch eine Flugsicherung erhalten. An diese Tamiya Kupplung wird nun das, durch die Ablage gefädelte Mira Screen Anschlusskabel gefädelt und der entsprechende Tamiya Stecker aufgekrimpt. Um das Kabel durch die Ablage zu bekommen, habe ich einfach ein 7mm Loch gebohrt und einen Gummikantenschutz in das Loch gesteckt.

Kabeldurchführung

Ist das Kabel nun angeschlossen, dann kann die Box angesteckt und in der Ablage verstaut werden.

Im Bild oben ist die Box fertig angeschlossen und in der Mittelarmlehnenablage zu erkennen.

Ist die Lehne heruntergeklappt, so ist von der Box nichts mehr zu erkennen. Man kann sie nach Abziehen der Stecker auch wieder einfach und schnell entfernen.

Nachdem die Zündung nun eingeschaltet ist, kann man im Multimediasystem „Media“ auswählen und dort dann auf CVBS-Videoeingang anklicken. Jetzt sollte der Startschirm der Mira Screen Box zu sehen sein. Man kann die Mira Screen Box auch konfigurieren, indem man das Handy per WLAN mit der SSID „MIRAxxxx“ verbindet und die IP Adresse, die auf dem Startbildschirm angegeben ist im Browser des Smartphones eingibt. Das SSID Password steht ebenfalls am Startbildschirm.

Die Fotos oben zeigen das Innenleben der Box. Bei diesem Gerät hatte sich der Pinheader der Stack-Platine aus der Buchsenleiste teilweise gelöst und dies hatte zu Kontaktproblemen der beiden Platinen geführt. Der Messingabstandhalter (im letzten Bild unten links zu erkennen) ist 2mm zu lange, sodass die beiden Platinen nicht ordentlich zusammenhalten. Als Abhilfe habe ich die beiden Abstandhalter um diese 2mm gekürzt und wieder verschraubt. Somit kann ich die Google Maps problemlos im Auto benutzen.

 

 

 

Der Wetterfrosch 2.0 oder Umweltdatenlogger

Vor ein paar Jahren habe ich ein Projekt vorgestellt, in dem ein Raspberry Pi als Datenlogger arbeitete. An diesen Raspberry waren ein paar Sensoren angeschlossen, die Umweltdaten, wie Lufttemperatur, relative Luftfeuchte, den Luftdruck und auch die aktuelle GPS Position aufzeichneten. Die Sensoren bestanden größtenteils aus fertigen Breakoutboards, die über die diversen Busse (I²C, Serial, SPI…) an den RaspberryPi angeschlossen waren. Am PI selber liefen Python Skripten, die das Auslesen der Sensoren übernahmen, die Daten zusammenfassten und auf einen USB-Flashspeicher ablegten. Dieses Sammelsurium an Komponenten hatte ich dann in eine Kunststoffbox mit einer Größe von 150x80x50mm eingebaut.

Doch es geht auch um einiges kleiner. Im Rahmen eines kleinen Projektes war es die Aufgabe, diesen Sensor/Datenlogger zu verkleinern. Mein Ansatz, das zu realisieren, war ganz einfach: „Alles neu“. So habe ich das Konzept folgendermaßen geändert:

  • der RaspberryPi wird durch einen Microcontroller ersetzt
  • es wird eine Platine erstellt, auf der sämtliche Komponenten untergebracht sind
  • die erfassten Daten werden auf einer MicroSD Karte gespeichert
  • das Board ist auf die wesentlichsten Komponenten reduziert. Die Sensorelektronik und der SD-Card Reader wird direkt auf dem Board platziert
  • ein GPS-Empfänger (in Form eines Breakoutboards) soll optional aufgesteckt werden können
  • die Programmierung des Controllers wird durch eine ISP Schnittstelle durchgeführt
  • die Spannungsversorgung beträgt 5V DC

Daraus habe ich folgendes Blockschaltbild erstellt:

Blockschaltbild

Das zentrale Element ist, wie so oft, der Microcontroller Atmega328. Er benötigt als externe Beschaltung lediglich einen Quarz als Taktstabilisierung. (genauer gesagt bietet er aber auch die Optionen interne Oszillatoren zu benutzen…) Der Microcontroller kommuniziert über den I²C Bus mit den Sensoren HYT939 und BME280. Über die ausgeklügelte bidirektionale Levelshifter Schaltung mittels BSS138 Mosfet mit integrierter Body Diode wird die Anpassung der Pegel von 5V auf der Controller Seite zu den 3,3V auf der Sensorseite realisiert. Diese Schaltung wird sowohl für die SCL- (Serial Clock), als auch für die SDA-Leitung (Serial Data) angewendet.

Die Datenspeicherung findet auf einer MicroSD-Karte statt. Dafür wird ein Card Slot verbaut, der per SPI (Serial Peripheral Interface) mit dem Controller kommuniziert. Auch hier ist eine Anpassung der Signalamplituden notwendig. Das übernimmt dieses Mal jedoch der Chip TXB0108 von Texas Instruments. Das ist ein 8Bit Bidirektionaler Levelshifter.

Ein Taster wird die Datenaufzeichnung starten und stoppen und eine LED soll diverse Statusmeldungen durch Blinkfolgen darstellen.

Das optional aufsteckbare GPS Modul arbeitet mit 5V Spannungsversorgung und die Pegel der seriellen Datenkommunikation (RS232) sind ebenfalls 5V kompatibel.

Zu guter letzt ist natürlich auch die Spannungsversorgung zu planen. Hier soll lediglich eine externe, stabilisierte 5VDC Quelle angeschlossen werden, um den Logger zu versorgen. Die für die Sensoren und SD-Card benötigten 3,3VDC werden am Board mittels einem LDO (Low Drop Out) Regler erzeugt.

Sind alle Komponenten und deren Zusammenspiel definiert, dann wird daraus der Schaltplan gezeichnet. Für meine Bastelprojekte verwende ich hauptsächlich den Schaltplan- und Layout Editor „Eagle“.  Aus dem Blockschaltbild ergibt sich die unten abgebildete Schaltung.

Aus dem Schaltplan habe ich ein Layout mit zwei Layern erstellt, dessen Grundriss die Abmessungen 55x25mm hat. Bis auf die Steckverbinder befinden ausschließlich SMD Komponenten auf dem Board.

Im Layout Tool gibt es die Funktion, eine optische Vorschau der gefertigten Platine zu betrachten. So kann man vorab überprüfen, ob die Platine den Vorstellungen entspricht und gegebenenfalls die Lage der Bauteile optimieren. Ist das erledigt, wird aus dem Design ein Paket mit Produktionsfiles (Gerberdateien) erzeugt und das dann dem Platinen Hersteller seines Vertrauens gesendet. Da der auch sehr, sehr weit weg angesiedelt ist, dauert die Produktion auch ein paar Tage. Aber schlussendlich kommen die Platinen an und können sich auch sehen lassen.

Die beiden Bilder oben zeigen die Platine von der TOP und der BOTTOM Seite. Der nächste Schritt besteht darin, die Komponenten entsprechend der Planung zu bestellen und danach zu bestücken.

Die Bestückung erledige ich per Hand mit einem, für die SMD-Komponenten geeigneten Lötkolben mit entsprechend kleiner Spitze. Für die ganz kleinen Teile, wie den BME280 Sensor, kommt auch noch ein Mikroskop, bzw. eine Mikroskop Kamera zum Einsatz.

Wie die Platine nach der Bestückung aussieht, zeigen die beiden Bilder oben. Das folgende Foto zeigt den Größenunterschied des fertigen Loggers mit dem aufgesteckten GPS Modul im Vergleich zum alten „Wetterfrosch“Nach der Fertigstellung der Hardware, geht es nun an die Software. Die habe ich praktischer Weise mit dem Arduino IDE Tool gebastelt und per AVRISP mk2 über ISP auf den Controller geflashed. Um den AVRISP auf einem Windows 10 Rechner zum Laufen zu bekommen, muss ein geeigneter Treiber installiert sein. (hier hilft libusb-win32-1.2.6.0)

Programmcode mit der ArduinoIDE erstellt
Controller mit AVRISPmkII geflashed

Auf der SD-Karte wird nach Anlegen der Versorgungsspannung und nach Betätigen des Tasters die Datenaufzeichnung gestartet. Die Messwerte werden im Sekundentakt geschrieben. Wenn, wie in diesem Beispiel der GPS-Sensor gesteckt ist, so werden auch die GPS Daten mit aufgezeichnet. Die Software zeichnet auch auf, wenn der GPS Sensor noch keinen „fix“ hat. (Da in dem Beispiellog unten noch kein GPS-Fix vorhanden war, sind auch keine gültigen GPS Daten enthalten.)

Beispiel des Datenlogs:

Luftdruck962.41
Luftfeuchte37.05
Temperatur26.96
-----------------------------
$PGACK,103*40
$PGACK,105*46
$PMTK011,MTKGPS*08
$PMTK010,001*$GPGGA,235947.799,,,,,0,00,,,M,,M,,*71
$GPGLL,,,,,235947.799,V,N*73
$GPGSA,A,1,,,,,,,,,,,,,,,*1E
$GPGSV,1,1,00*79
$GPRMC,235947.799,V,,,,,0.00,0.00,050180,,,N*48
$GPVTG,0.00,T,,M,0.00,N,0.00,K,N*32
$GPGGA,235948.799,,,,,0,00,,,M,,M

-----------------------------
Luftdruck962.39
Luftfeuchte36.72
Temperatur26.95
-----------------------------
Luftdruck962.43
Luftfeuchte36.66
Temperatur26.97
-----------------------------

CO2-Messung mit SCD30, Arduino und Matlab

Dieses Projekt – eigentlich Miniprojekt – könnte vielleicht auch für den einen oder anderen interessant sein. Es handelt sich um den mittlerweile bekannten und häufig verwendeten Kohlendioxid Sensor SCD30 (CO2-Sensor) des Herstellers Sensirion. Es gibt etliche Projekte die man dazu im Netz findet. Im Rahmen eines schnellen Testaufbaues habe ich versucht, die Daten des Sensors mithilfe eines Arduino Uno Boards auszulesen, um sie dann mit der Software Matlab in einem Plot darzustellen. Die Datenübertragung erfolgt über die Serielle Schnittstelle bzw. über serielles Protokoll des USB-UART.

Um den SCD30 am Arduino anzuschließen, benötigt man die Spannungsversorgung und den I²C Datenbus – also in Summe gerade einmal vier Drähte. Damit ist die minimale Konfiguration erfüllt und die Daten können ausgelesen werden.

Der Sensor selbst arbeitet nach dem Prinzip der NDIR Technologie.  (NDIR = non-dispersive-infrared). Das bedeutet, der Sensor ist also ein kleines Spektrometer. Hierbei wird das zu untersuchende Medium in eine Probenkammer geleitet. Die Probenkammer wird von einer Infrarotquelle durchleuchtet und das IR-Licht durchstrahlt das Medium und einen sehr schmalbandigen Wellenlängenfilter und trifft dann auf den IR-Detektor auf. Die Wellenlänge des Filters ist dabei so ausgelegt, dass genau diejenigen Wellenlängen durchgelassen werden, die von den Molekülen des Mediums (Gases) absorbiert werden. Je nach Anzahl der Moleküle, oder Dichte des Gases, werden entsprechend weniger Lichtstrahlen vom Detektor erkannt.  Eine zweite Messkammer, die mit einem Referenzgas gefüllt ist, dient dabei als Referenz. Ein Controller am Sensor wertet diese Informationen aus und gibt sie in Form von ppm über die I²C (oder umschaltbar auch MOD-Bus) Schnittstelle weiter. Zusätzlich befindet sich auch ein Temperatur und Luftfeuchtesensor am Board, deren Daten ebenso über den Bus ausgelesen werden können. Die voreingestellte I²C Adresse des SCD30 ist 0x61. Die genauen Informationen zum Datenprotokoll sind in den Dokumentationen der Firma Sensirion zu finden.

Idealerweise gibt es, wie fast immer, schon eine fertige, studententaugliche Library für die diversen Microcontroller. So braucht man sich keine Gedanken mehr zu machen und kann die Daten des angeschlossenen Sensors direkt auslesen. Die Beispielprogramme findet man unter den Examples der Libraries.

electrical specifications

Für die Versorgungsspannung des Sensors kann der Arduino mit 3.3V oder 5V dienen. Vorsicht ist jedoch geboten, wenn man den I²C Bus, verwendet: Hier ist der Input High-Level mit 1,75-3.0V festgelegt und der Output High Level mit max. 2.4V. An einem Arduino sind die Pegel aber 5V!! Also muss hier ein Levelshifter eingebaut werden – oder zumindest, für einen schnellen Test geeignete Widerstände.

Der hier angeführte Programmcode stammt im Wesentlichen aus dem Beispiel der Library von Nathan Seidle von SparkFun Electronics:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
/*
By: Nathan Seidle SparkFun Electronics  
Library: http://librarymanager/All#SparkFun_SCD30  
*/

#include <Wire.h>
#include "SparkFun_SCD30_Arduino_Library.h" 
SCD30 airSensor;

void setup()  
{
  Wire.begin();
  Serial.begin(9600);
  //Serial.println("SCD30 Example");
  airSensor.begin(); //This will cause readings to occur every two seconds
}

void loop()  
{
  if (airSensor.dataAvailable())
  {
   // Serial.print("co2(ppm):");
   
    Serial.print(airSensor.getCO2());

    //Serial.print(" temp(C):");
    Serial.print(",");
    Serial.print(airSensor.getTemperature(), 1);

   // Serial.print(" humidity(%):");
    Serial.print(",");
    Serial.print(airSensor.getHumidity(), 1);

    Serial.println();
  }
  else
    //Serial.println("No data");

  delay(500);
}

 

Mit diesen Codezeilen im Arduino Uno und der korrekten Verdrahtung (SDA -> an Arduino A4 und SCL -> an Arduino A5 über einen geeigneten Pegelwandler) geht’s dann mit Matlab weiter. Der Arduino sollte jetzt in einem seriellen Terminal folgende Zeilen ausgeben: (Beispiel)

473,28.5,12.9
473,28.5,13.0
470,28.5,13.1
469,28.5,12.9
466,28.5,12.9
465,28.5,12.7
465,28.5,12.5
463,28.6,12.6
461,28.6,12.5
463,28.5,12.4 … und so weiter

Diese gilt es nun in Matlab einzulesen und über einen definierbaren Zeitraum aufzuzeichnen und gleichzeitig in einem Plot darzustellen. Das Matlabskript hier macht es möglich… (pn falls es jemand benötigt)

Als Ergebnis erhält man dann einen Plot, der den CO2 Verlauf im Raum (in dem Fall am Schreibtisch meines Büros) darstellt.

 

 

Spielemodul für die Vectrex selbstgemacht

Für die Vectrex – Spielekonsole einem Home-Arcade-Automat aus dem Jahr 1982 gibt, oder gab es eine sehr begrenzte Anzahl an Spiele Titeln. Die Vectrex selber, beziehungsweise die Restauration dieses Schätzchens werde ich in einem eigenen Beitrag vorstellen.

Die Spiele waren in Form von ROM-Modulen erhältlich und mussten seitlich in die Konsole gesteckt werden. Heute sind sie, wie auch die Konsole selber, ziemlich rar und schwer zu finden. Auch preislich sind sie meist keine Schnäppchen. Es gibt auch Nachbauten, Multiroms und einige DIY Projekte, die auf Basis der alten EPROMS das Spielprogramm oder auch mehrere Games gespeichert halten und so über ein „Modul“ spielbar waren.   Da ich auch noch alle möglichen Eproms mit unterschiedlichen Größen im Bauteilelager habe und auch von einem Kollegen (vielen Dank Jürgen) ein paar 27C512er Eproms gesponsert bekam, musste ich einfach versuchen, damit ein ROM-Modul zu basteln.

originale Vectrex ROM-Modul Platine

Also einmal schnell nachgedacht, was ich dafür alles benötige. Hier eine kleine Aufstellung:

  • alte EPROMS (ich verwende Eproms, die mit UV-Licht wieder gelöscht werden können)
  • einen Eprom Programmer (in der hintersten Ecke eines Kastens habe ich noch einen ChipLab Programmer mit paralleler Schnittstelle gefunden)
  • einen alten Rechner mit eben einer parallelen Schnittstelle und einem älteren Betriebssystem (Windows XP). Auch hier habe ich glücklicher Weise einmal mehr auf die Entsorgung verzichtet und einen alten Laptop wieder zum Leben erweckt.
  • eine Software für den Programmer (hier verwende ich „ChipLab“ die mit Hilfe von „porttalk22“ auf WindowsXP lauffähig ist)
  • die Binärdaten oder HEX-Files der originalen ROM-Module (hierzu kann man die Internetsuche bemühen)
  • ein Layout Tool (Autodesk Eagle)
  • eine Bastelbude, in der man Platinen ätzen kann, oder einen Account bei einem fernöstlichen PCB-Hersteller
  • Lötwerkzeug und Kleinteile
  • und natürlich eine Vectrex – sonst hat das alles keinen Sinn
EPROMs

Um den Speicherbedarf der Eproms zu ermitteln, muss ich zuerst einmal die Größe der Spiele kennen. Hier die Liste der Titel und deren Größe:

Spiele mit einer Größe von 4 kB (4 kilo Byte). Das entspricht einem Adressbereich von hex 0000 bis 0FFF

  • Armor Attack
  • Art Master
  • Bedlam
  • Berzerk
  • Clean-Sweep
  • Cosmic Chasm
  • Engine Analyzer
  • Hyperchase
  • Minestorm 2
  • Rip Off
  • Scramble
  • Solar Quest
  • Space Wars
  • Star Castle
  • Star Hawk
  • Star Trek

Spiele mit einer Größe von 8 kB (8 kilo Byte). Das entspricht einem Adressbereich von hex 0000 bis 1FFF

  • Animaction
  • Blitz
  • Fortess of Narzod
  • Heads Up
  • Melody Master
  • Pitchers Duel
  • Pole Position
  • Spike
  • Spinball
  • Tour de France
  • Web Wars

Spiele mit einer Größe von 12 kB (12 kilo Byte). Das entspricht einem Adressbereich von hex 0000 bis 2FFF

  • Dark Tower

Als nächstes sehe ich mir einmal die Eproms bezüglich Pinout und Größe an. Hier habe ich zwei Größen betreffend der Pin Anzahl zur Verfügung. Eproms mit 28pin und 32pin im DIL Gehäuse. Zu denen im 28poligen Gehäuse gehören folgende Typen:

  • 27c64         8k x 8 bit  also   64 kb (kilo Bit)
  • 27c128   16k x 8 bit  also 128 kb (kilo Bit)
  • 27c256   32k x 8 bit  also  256 kb (kilo Bit)
  • 27c512   64k x 8 bit  also  512 kb (kilo Bit)
Bild von (www.futurlec.com)
Bild von (www.futurlec.com)

 

Das Pinout ist, bis auf die unterschiedliche Anzahl der Addressleitungen, identisch. Die 1Mbit Variante 27C1001 (27C010) hat jedoch ein anderes Pinout.

Bild von (www.futurlec.com)

Der nächste Schritt ist, sich das Pinout des Vectrex Modulschachtes anzusehen. Die Pin – Nummern des Moduls sind im Bild unten zu gekennzeichnet.

Pin Nummerierung des Vectrex Moduls

Die den Pin-Nummern zugehörigen Signale sind dem Vectrex Schaltplan des Mainboards zu entnehmen. Im Bild unten ist ein Auszug des Schaltplans mit dem Bereich des 36 poligen Cartridge-Connectors dargestellt. (Quelle: console5.com)

Jetzt sind soweit mal alle nötigen Informationen gesammelt, um mit einem Schaltplan und Layout zu beginnen. Im Netz habe ich nach einem Eagle-Layout für den Platinen-Stecker gesucht. Es war aber nicht gleich etwas zu finden. Also musste ein originales ROM-Modul als Referenz für die Abmessungen und Abstände der Kontaktpads herhalten. Mit den so abgenommenen Massen war es dann schnell gemacht und ich hatte ein neues Eagle-Bauteil gezeichnet und in der Library gespeichert.

vectrex_connector.lbr

Ich habe zwei Varianten der Modulschaltungen gezeichnet. Eine für die EPROMs mit 28 Pins und eine für die 1Mbit ROMs mit 32 Anschlusspins. (Da hier ja auch mehr Games Platz finden) Um nun alle möglichen Größen an Spielen unterschiedlich auf dem EPROM verteilen zu können, habe ich die Adressbits 12,13 und 14 umschaltbar gemacht. Und zwar so, dass diese drei Adressleitungen wahlweise von der Vectrex angesteuert werden können, oder extern vom Bediener über DIP-Schalter (L/H) auszuwählen sind. Die Bits 15 und 16 (sind ebenfalls über DIP-Schalter auszuwählen).

Die folgende Tabelle zeigt ein paar Beispiele, wie die Startadressen der Spiele ausgewählt werden können.

bit
16
bit
15
bit
14
bit
13
bit
12
bit11-bit0
game adressen
adressen
start – ende (hex)
L L L L L bei 8k Spiel 0000 – 1FFF
L L L H L bei 8k Spiel 2000 – 3FFF
L L H L L bei 8k Spiel 4000 – 5FFF
L L H H L bei 8k Spiel 6000 – 7FFF
L H L L L bei 8k Spiel 8000 – 9FFF
L H L H L bei 8k Spiel A000 – BFFF
L H H L L bei 8k Spiel C000 – DFFF
L H H H L bei 8k Spiel E000 – FFFF
H L L L L bei 4k Spiel 10000-10FFF
und so weiter…
Ansicht im Hex Editor

Vorausgesetzt natürlich, die Spieledaten wurden auch so auf das EPROM geschrieben. Um das zu bewerkstelligen, verwende ich einen von vielen Freeware – Hex Editoren (HxD) und baue mir aus den einzelnen Game-Images ein Binärfile zusammen. Diese „Datei“ wird dann in der ChipLab-Software importiert, das korrekte EPROM aus der Datenbank ausgewählt, dann den Chip in den Programmer gesteckt und los gehts… (Vorher nochmal checken, ob der Chip auch leer ist. Ansonsten muss er „oben ohne“ in die Sonne, oder unter die UV-Lampe (für ca. 15-20min)

Eprom im Programmer

Ist der Chip mit Bits gefüllt und aus dem Schaltplan ein Layout gemacht, dann geht´s ans Ätzen eines Prototyps. Dafür konnte ich in einer kurzen Mittagspause die Ätzanlage unserer Firma heranziehen und das unnötige Kupfer der Platine ätztechnisch entfernen.

Platinen Layout auf Folie

Nach dem Belichten einer mit fotopositv Lack beschichteten doppelseitigen Platine und dem anschließenden Entwickeln derselben, kann wird das überflüssige Kuper mit EisenDreiChlorid entfernt. Übrig bleibt die gewünschte Struktur.

Mal ein Selfie zwischendurch. Die Belichtung der Platine mit UV – Licht dauert etwa 57 Sekunden. Genug Zeit um mit dem Handy dumme Fotos zu machen 😀

 

Weiter geht es dann mit dem Bohren der Löcher in das Board. Die Durchkontaktierungen (VIAs) vom Top- zum Bottom Layer werden bei dem Prototyp nicht durch galvanisches Auftragen von Kupfer in den Bohrungen realisiert, sondern per Hand durch Durchstecken eines Stückes Silberdraht durch das Loch und anschließendem beidseitigem Verlöten.

fertig geätzte Platine

Jetzt fehlt nur noch die Bestückung. Die ist aber sehr schnell erledigt. Denn bis auf den IC-Sockel, ein paar Pull-Up Widerstände und die DIP-Schalter ist auf dem Board ja nicht viel drauf. Also die paar Teile gelötet, den Chip in den Sockel gesteckt – und fertig ist das ROM-Modul.

fertig bestücktes ROM-Modul

Wie das fertige Modul an der Vectrex aussieht und vor allem funktioniert, werde ich beizeiten einmal als kurzes Video zeigen. Ich habe das Board auch ein wenig verschönert und als industriell gefertigte Platine bei einem fernöstlichen Leiterplattenhersteller in Auftrag gegeben…

(kleines Update am 20.Oktober 2020)
Die im fermem Osten gefertigten Platine sind gekommen und sehen meiner Meinung nach auch ganz passabel aus. Schnell ist ein Board bestückt … hier das Ergebnis:

Konfigurierbare Steckernetzteile

Dieser kurze Beitrag soll nur als Hilfe dienen, um gegebenenfalls schnell nachsehen zu können. Im Laufe der Zeit sammeln sich bei vermutlich jedem von uns unzählige Steckernetzteile und Adapter an. Einige sind Festspannungsnetzteile, andere wiederum sind im Bereich der Ausgangsspannungen einstellbar. Einstellen lassen sich die Ausgangsspannungen dieser Netzteile mit Schiebe- oder Drehschaltern oder auch mit kleinen Steckern (Jumpern) in denen Widerstände verbaut sind.

Auf den Jumpern ist auch immer die Spannung aufgedruckt, die damit eingestellt wird. Es gibt jedoch einen kleinen Haken an der Sache. Wenn man mehrere unterschiedliche Netzteile (unterschiedlich im Bereich der Leistung und auch im Ausgangsspannungsbereich) hat, dann hat man schnell ein Sammelsurium unterschiedlicher Widerstandsjumper. Das Problem ist jetzt, dass die Jumper alle gleich aussehen und auch mit gleichen Spannungswerten bedruckt sind. Sortiert man die nicht ordentlich zu den jeweiligen Netzteilen, dann ist das Malheur schnell passiert. Ein Beispiel: Ein Netzteil der Type SPS24-24W hat einen Jumper mit Aufdruck 9V. Der Jumper hat einen Widerstand von ca. 9kOhm. Ein anderes Netzteil der Type SPS12-23W hat ebenfalls einen Jumper mit Aufdruck 9V – allerdings einen Widerstand von nur 1.5kOhm. Und so ist es schnell passiert, dass man (oder ich) den Jumper vom falschen Netzteil einsteckt. In meinem Beispiel habe ich den 9V Jumper mit 1.5kOhm in das SPS24-24W Netzteil gesteckt. Bevor ich noch mit den Messstrippen an der Kabelbuchse war, gab es einen dumpfen Knall, eine allzu bekannte Rauchschwade und den dazugehörigen Geruch eines geplatzten Kondensators (Elkos).

Was war passiert? Der Wert des falschen Jumperwiderstandes war kleiner als der kleinste Wert des korrekten Jumpers (24V = 2.42kOhm). Also war die Ausgangsspannung deutlich höher als 24V und somit auch deutlich höher als die Spannungsfestigkeit des Sieb Elkos am Ausgang (der hatte bei 220µF eine Spannungsfestigkeit von 25V).

Um das zukünftig zu vermeiden, habe ich die Widerstandswerte passend zu den Netzteilmodellen der Reihe SPS herausgemessen.


Modell SPS12-12W-A
(von dem Modell habe ich leider kein Exemplar zur Verfügung – falls jemand eines zur Hand hat, würde ich mich freuen die Widerstandwerte hier in die Liste aufnehmen zu können)

Spannungen:
3V ………….  0.00k
4.5V………..  0.00k
5V…………… 0.00k
6V…………..  0.00k
7.5V……….  0.00k
9V …………  0.00k
12V………..  0.00k

Modell SPS12-24W-B
Spannungen:
3V …………. 373.0k
4.5V………..  6.01k
5V…………… 4.51k
6V…………..  3.08k
7.5V……….  2.04k
9V …………  1.54k
12V………..  1.02k

Modell SPS24-24W-A
Spannungen:
9V ………….  9.09k
12V…………  5.75k
13.5V……..  4.97k
15V…………  4.29k
18V…………  3.39k
20V ………..  2.98k
24V………..   2.42k

Modell SPS24-48W-B
Spannungen:
9V ………….  17.38k
12V…………  8.27k
13.5V……..  6.78k
15V…………  5.48k
18V…………  4.20k
20V ………..  3.60k
24V………..   2.78k

edit 10.52021: Bilder vom der Platine des  Netzteils SPS24-24W-A hinzugefügt:

VW-Audi Handyadapter USB Buchse Umbau

Universelle Ladeschale

Für viele VW und Audi Modelle gibt es als Zubehör eine universelle Handyladeschale für Mittelarmlehne. Diese Ladeschale ermöglicht es, die Antenne des Handys über eine in der Ladeschale integrierte Patch-Antenne zu koppeln und mit der Fahrzeugantenne zu verbinden. Dazu genügt es, das Telefon oder Smartphone einfach in die Schale zu legen und die Antenne ist gekoppelt. Diese „Schale“ besitzt unter einer Klappe auch einen USB Anschluss. Wenn man hier einfach ein beliebiges USB-Handyladekabel anschließt (z.B. USB auf USB-C) dann wird nichts passieren. Das Handy wird nicht geladen. Dafür kann man entsprechende Kabel als Zubehör erwerben.

Man kann diese „Ladeschale“ aber auch öffnen und sehen was in dem Gehäuse steckt und sich selber eine Lösung basteln. Dann sollte es möglich sein, jedes USB Kabel anzustecken und nicht wieder eines erwerben zu müssen. Zumal ja schon jeder etliche Kabel zu Hause hat. Also raus mit den Schrauben (sind übrigens Torx) und ‚runter mit dem Deckel.

Antennenplatine

Unter dem oberen Gehäusedeckel kommt eine schwarz lackierte Platine zum Vorschein. Diese stellt die Antennenstruktur dar und ist mit an den Enden verschmolzenen Kunststoff Bolzen befestigt.

Antennenplatine entfernt

Ist die Antennenplatine gelöst, so kann man sie vorsichtig herunterheben. Das Koaxialkabel ist an der Platine festgelötet. Man sollte also nicht zu fest daran ziehen.

Jetzt können die Schrauben des darunter liegenden Boards entfernt werden. Die Platine ist jetzt frei. Auf Ihr befindet sich unter anderen auch die DC-DC Converter Schaltung für die Stromversorgung der USB-Buchse.

Wenn man die Schaltung genauer untersucht so gibt es keine direkte Verbindung zum Minuskontakt der USB-Buchse. Die Masse des DC-Converters liegt am Shield der USB-Buchse an. Der Pluskontakt stimmt.

Eine kleine Modifikation schafft Abhilfe. Im Bild unten sind die Änderungen eingekreist.

An der rot markierten Stelle befindet sich ein SMD Kondensator. Diesen habe ich ausgelötet und damit er nicht verloren geht und ich ggf. wieder Rückbauen kann, an einer Seite an dem darunter befindlichen Kondensator festgelötet. (er befindet sich jetzt funktionslos an der grün markierten Position. An dessen ursprüngliche Stelle (rote Markierung) habe ich ein kleines Stück Draht gelötet. Dieser stellt eine niederohmige Verbindung zwischen dem Minus-Pin der USB Buchse und dem Schirm dar. Somit wird der USB Port auch ohne spezielles Kabel mit Energie versorgt.

 

IR-Thermokamera an Raspberry PI

Lepton Camera Module

Ein vielleicht interessantes kleines Projekt ist, ein Lepton Kameramodul mit einem Raspberry zu betreiben.  In meinem Fall verwende ich ein Lepton Modul mit 80×60 Pixeln bei einer Pixelgröße von 17µm und einer spektralen Empfindlichkeit im langwelligen Infrarot Bereich von 8µm bis 14µm. Die Framerate beträgt maximal 8,6 Hz. Das Kameramodul wird in ein Breakout-Board gesteckt und dieses mit dem Raspberry PI verbunden. Die Infos dazu gibt‘s weiter unten. Es gibt auch im Entwicklerbereich der Website flir.lepton.com eine Anleitung wie das Breakoutboard mit dem Raspi betrieben wird.

Camera Module mit Breakout Board V1.4

Benötigt wird ein Raspberry PI (in diesem Beispiel habe ich einen Raspberry PI4 verwendet), ein Lepton Thermal Kamera Breakout Board V1.4 und ein wenig Drahtwerk für die Verbindungsleitungen. Die genaue Teileliste (um auch alles Aufbauen und in Betrieb nehmen zu können) ist unten angeführt:

  • Raspberry PI (Modell 2,3 oder 4)
  • Micro SD-Karte (ab 8GB)
  • USB-Steckernetzteil mit Micro USB (oder USB-C) Kabel (je nach Raspberry PI Modell)
  • LAN-Kabel und Zugang zu einem Switch oder Router mit bestehender Internetverbindung
  • Idealerweise einen Rechner mit (SD-Karten-Slot) um das Image für den Raspberry vorzubereiten
  • Ein Monitor für den Raspberry PI mit HDMI oder MINI-HDMI-Kabel
  • USB-Tastatur, Maus
  • Lepton Thermal Kamera Breakout Board

Ist alles vorhanden, dann ist die Verdrahtung des Kamera Moduls mit dem PI herzustellen. Am einfachsten verwendet man die Jumper-Kabel (Female-Female) die in der Modulbastelwelt sehr beliebt sind. Ein Lötkolben ist für viele Demo- und Testaufbauten nicht mehr notwendig… Die folgende Skizze zeigt die herzustellende Verdrahtung:

Klicken zum Vergrössern

Das Pinning ist hier nochmals angeführt:

  • Raspi GPIO PIN01 (3V3)     –>    Lepton Pin VIN
  • Raspi GPIO PIN03 (SDA)    –>     Lepton Pin SDA
  • Raspi GPIO PIN05 (SCL)      –>    Lepton Pin SCL
  • Raspi GPIO PIN06 (GND)   –>     Lepton Pin GND
  • Raspi GPIO PIN19(MOSI)  –>     Lepton Pin MOSI
  • Raspi GPIO PIN21(MISO)  –>     Lepton Pin MISO
  • Raspi GPIO PIN23(CLK)      –>     Lepton Pin CLK
  • Raspi GPIO PIN24(CEO)     –>     Lepton Pin CS

Als Betriebssystem für den Raspberry Pi habe ich Raspbian installiert. Das geht entweder über den Download des RASPBIAN Images von der Webseite https://www.raspberrypi.org/downloads/raspbian oder auch über den NOOBS Installer. Mit dem Tool „etcher“ oder „win32diskimager“ kann die Image Datei auf die SD-Karte geschrieben werden. Wer mit NOOBS arbeitet braucht nur die zip-Datei auf die FAT32 formatierte SD-Karte zu entpacken. Ist das erledigt, dann einfach die SD-Karte in den Raspberry stecken, Monitor, Keyboard und Maus an den PI anstecken und zum Schluss die Stromversorgung aktivieren. Wenn NOOBS auf der Karte ist, dann wird nach dem Start eine Auswahl an zu installierenden Betriebssystemen angezeigt. Hier am besten auch RASPIAN auswählen und die Installation starten. Ist das abgeschlossen, dann ist je nach gewähltem Image entweder nur eine Konsole oder eben ein Desktop zu sehen. Im letzten Fall ist dann ein Terminal zu öffnen, damit in der Konsole weitergearbeitet werden kann.

Mit sudo raspi-config ist nach dem login in die Konsole das Raspberry PI Config – Tool zu öffnen. Darin sind folgende Services zu aktivieren:

  • SPI (unter Advanced Options)
  • SSH (unter Advanced Options)
  • I2C (unter Advanced Options)
  • Enable Camera (im Hauptmenu des raspi-config tools)

Danach ist der Raspberry zu rebooten. Nach dem erneuten Start und login (als User pi mit default Passwort raspberry) muss das Paket openCV installiert werden. Mit sudo apt-get install python-opencv ist das erledigt.

Auf GitHub habe ich eine Python Library von brandoncurtis und kekiefer für das Lepton Board gefunden. Die Library nennt sich pylepton und ist auf https://github.com/groupgets/pylepton zu finden.

Mit git clone https://github.com/kekiefer/pylepton.git legen wir das Repository  an und wechseln danach in das Verzeichnis cd pylepton. Jetzt kann das Setup Skript ausgeführt werden: sudo python setup.py install.

Mit dem folgenden kleinen Codebeispiel wird die Lepton Kamera ausgelesen, das 80×60 Pixel große Bild auf 800% skaliert und angezeigt.

 

 import numpy as np  
 import cv2  
 from pylepton import Lepton  
 with Lepton() as lepi:  
  a,_ = lepi.capture()  
 cv2.normalize(a, a, 0, 65535, cv2.NORM_MINMAX) # extend contrast  
 np.right_shift(a, 8, a) #daten in 8bit anpassen 
 cv2.imwrite("thermobild.jpg", np.uint8(a)) #bild schreiben 
 img=cv2.imread('thermobild.jpg')  
 cv2.imshow('Thermobild', img)  
 print('Originalabmessungen: ',img.shape)  
 scale_percent = 800  
 width = int(img.shape[1] * scale_percent / 100)  
 height = int(img.shape[0] * scale_percent / 100)  
 dim = (width, height)  
 resized = cv2.resize(img, dim, interpolation = cv2.INTER_AREA)  
 print('Achtfach vergroessert: ',resized.shape)  
 cv2.imshow("Thermobild 8x", resized)  
 cv2.waitKey(0)  
 cv2.destroyAllWindows()  
 exit()  

Das Ergebnis sieht dann zum Beispiel so aus:


 

 

Diodenkennlinie mit Sourcemeter und Matlab aufnehmen

Dieses Mal gibt es hier keinen Bericht über die Restauration oder die Vorstellung eines alten Gerätes. Im Rahmen meiner beruflichen Tätigkeit muss ich immer wieder Messaufbauten realisieren und diese nach Möglichkeit automatisieren, um die Messzeiten zu minimieren. Auch die Datenauswertung und das Postprocessing möchte ich immer gerne automatisieren. Dafür gibt es sehr viele unterschiedliche Lösungsansätze. Der Grundansatz ist aber immer gleich. Ein, oder mehrere Messgeräte sind über eine Schnittstelle mit einem Rechner oder Controller verbunden. Auf dem Rechner oder Controller läuft eine Software, die das Messgerät steuert und die gemessenen Daten an den Rechner zurücksendet. Auf dem Rechner werden die Daten dann gespeichert, den Anforderungen entsprechend aufbereitet und ausgegeben.

Die Schnittstellen zwischen Rechner und Messtechnik können je nach Ausstattung des Messgerätes dabei RS232, GPIP, IEEE1394, USB oder LAN sein. Bei vielen Geräten wird der einfache SCPI-Befehlssatz im ASCII Code zum Befehle senden und empfangen über das entsprechende Protokoll der gewählten Schnittstelle verwendet. Die Software am Rechner oder Controller muss in der Lage sein die Hardware anzusprechen und schon kann eine Datenkommunikation hergestellt werden. Als Software oder Skriptsprache kann hier beispielsweise NI-LabVIEW, Matlab, C-Code, C++ Code, C#, Python, etc. verwendet werden. Und die Rechner- oder Controllerhardware kann ein Windows, Mac, oder LinuxPC sein, aber auch ein einfacher Arduino, RaspberryPi, oder ein programmierter Mikro-Controller, der eine der benötigten Schnittstelleninterfaces besitzt.

Bei meiner Arbeit wird das gerne mit Matworks Matlab gemacht (bzw. ich mache es gerne mit Matlab, weil ich Programme und Skripten lieber tippe als sie zu zeichnen 😀 ), einer skriptorientierten Software. Im konkreten Beispiel habe ich ein SOURCEMETER des Herstellers Keithley, das Keithley2400 über die RS232 Schnittstelle an einem WIN10 PC mit Matlab 2017b angesteuert. Das Sourcemeter hat die Aufgabe eine Diodenkennlinie aufzunehmen. Das Sourcemeter ist imstande einen Strom zu sourcen, also eine steuerbare Stromquelle zu sein und gleichzeitig den gesourcten Strom und die an den Klemmen anliegende Spannung zu messen. Umgekehrt wiederum kann es auch als steuerbare Spannungsquelle eingesetzt werden, die Spannung an den Klemmen und den Strom durch den DUT (Device Under Test) messen.  Und das geht in allen vier Quadranten, also Stromquelle oder -Senke, oder Spannungsquelle oder -Senke sein.

Genau das benötigte ich in diesem supereinfachen Beispiel um die Kennlinie eines PN-Überganges aufzunehmen und zwar vom Diffusionsbereich bis in den Durchlassbereich und natürlich auch wenn der PN-Übergang unter Photonenbeschuss steht 🙂

Die folgenden beiden Matlab-Skripten ermöglichen diese einfache Kennlinienaufnahme. Der Messaufbau selbst besteht lediglich aus einer, an die Klemmen des K2400 angeschlossenen Diode (in diesem Fall eine Photozelle). Dabei stellt das erste Skript eine gesteuerte Stromquelle dar und im zweiten Skript wird die Spannungsquelle durchgesteuert und jeweils die Daten aufgezeichnet und zum Schluss als Plot dargestellt.

 Matlab Code stromgetrieben:

% IV Logger PN Kennlinie
% 2.05.2019 ingmarsretro
% der supereasysimple-code
% drive current and measure voltage
% with sourcemter über RS232 

 serialObject = serial('COM4','BaudRate',19200, 'DataBits',8);   

    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    % Sourcemeter 2400 setup                             %
    % serial config: 8N1, 19200, termchar CR+LF          %
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  
    fopen(serialObject)
    s.InputBufferSize = 6000;
    fprintf(serialObject,'*RST');
    
    mincurr = -15E-3;  % maximaler negativer strom (load an der Zelle) 
    maxcurr = 10E-4;   % maximaler positiver strom 
    step = 1E-5;       % schrittweite
    

    %%%%%%%%%%%%%%%%%%%%%%%%%%
    % Messgeraet einstellen  %
    %%%%%%%%%%%%%%%%%%%%%%%%%%
    % SOURCING ->  CURRENT
    %
    %fprintf(serialObject,':INIT:CONT OFF;:ABOR');
    fprintf(serialObject,':FORM:DATA ASCII');
    fprintf(serialObject,':SOUR:FUNC CURR');
    fprintf(serialObject,':SOUR:CURR:MODE FIX');
    fprintf(serialObject,':SOUR:CURR:RANG 10E-2'); % -> 000.000mA
    fprintf(serialObject,':SOUR:CURR:LEV 0.0'); % -> Starteinstellung 0 A
    
    % MEASUREMENT -> Spannung 
    fprintf(serialObject,':SENS:FUNC "VOLT:DC"');
    fprintf(serialObject,':SENS:VOLT:PROT 8');     % -> compliance 8V
    fprintf(serialObject,':SENS:VOLT:RANG 10E-1'); % -> 0.00000 V
    fprintf(serialObject,':TRIG:COUN 1');
    
    %fprintf(serialObject,':CONF:VOLT:DC');
    
    fprintf(serialObject,':OUTP ON');

        %% Messen und Daten abholen
    count = 1; 
    v(1)=0; i(1)=0;  %init der arrays 
   
       for curr = mincurr:step:maxcurr
           
          strom=num2str(curr);
          command = strcat(':SOUR:CURR:LEV ',{' '},strom);
          fprintf(serialObject,char(command));
         

          fprintf(serialObject,':READ?');
          data=fscanf(serialObject);  % gesamten buffer des device einlesen
          c = strsplit(data,',');          % gelesenen string nach ',' in zellen zerlegen
          i(count) = str2num(cell2mat(c(2)));                 % stromzelle 
          v(count) = str2num(cell2mat(c(1)));                 % spannungszelle
        

        count = count +1;
       end
   
    
    figure(1);
    plot(v,i);
    grid on; hold on;
    xlabel('voltage [V]'); ylabel('current [A]')
    title('IV - Kennlinie ');
    
    %% instrument in local mode schalten
    fprintf(serialObject,':OUTP OFF');
    fprintf(serialObject,'SYSTEM:LOCAL');
    fclose(serialObject);

 

Matlab Code spannungsgetrieben:

% IV Logger PN Kennlinie
% 3.05.2019 ingmarsretro
% der supereasysimple-code
% drive current and measure voltage
% wit sourcemter über RS232 

 serialObject = serial('COM4','BaudRate',19200, 'DataBits',8);   

    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    % Sourcemeter 2400 setup                             %
    % serial config: 8N1, 19200, termchar CR+LF          %
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  
    fopen(serialObject)
    s.InputBufferSize = 6000;
    fprintf(serialObject,'*RST');
    
    minvolt = -1;      % maximale negative spannung  
    maxvolt = 0.5;       % maximale positive spannung
    
    %mincurr = -20E-3;  % maximaler negativer strom (load an der Zelle) 
    %maxcurr = 10E-4;   % maximaler positiver strom 
    
    step = 1E-2;       % schrittweite
    
    % 
    %%%%%%%%%%%%%%%%%%%%%%%%%%
    % Messgeraet einstellen  %
    %%%%%%%%%%%%%%%%%%%%%%%%%%
    % SOURCING ->  VOLTAGE
    %
    %fprintf(serialObject,':INIT:CONT OFF;:ABOR');
    fprintf(serialObject,':FORM:DATA ASCII');
    fprintf(serialObject,':SOUR:FUNC VOLT');
    fprintf(serialObject,':SOUR:VOLT:MODE FIX');
    fprintf(serialObject,':SOUR:VOLT:RANG 10E-0');    % -> 00.0000 V
    fprintf(serialObject,':SOUR:VOLT:LEV 0.0');       % -> Starteinstellung 0 V
    
    % MEASUREMENT -> CURRENT 
    fprintf(serialObject,':SENS:FUNC "CURR:DC"');
    fprintf(serialObject,':SENS:CURR:PROT 40E-3');     % -> compliance 10.0000 mA
    fprintf(serialObject,':SENS:CURR:RANG 10E-2');     % -> 0.00000 mA  (muss kleiner als complience sein)
    fprintf(serialObject,':TRIG:COUN 1');
    
    %fprintf(serialObject,':CONF:VOLT:DC');
    
    fprintf(serialObject,':OUTP ON');


        %% Messen und Daten abholen
    count = 1; 
    v(1)=0; i(1)=0;  %init der arrays 
   
       for volt = minvolt:step:maxvolt
           
          spannung=num2str(volt);
          command = strcat(':SOUR:VOLT:LEV ',{' '},spannung);
          fprintf(serialObject,char(command));
           


          fprintf(serialObject,':READ?');
          data=fscanf(serialObject);  % gesamten buffer des device einlesen
          c = strsplit(data,',');          % gelesenen string nach ',' in zellen zerlegen
          i(count) = str2num(cell2mat(c(2)));                 % stromzelle 
          v(count) = str2num(cell2mat(c(1)));                 % spannungszelle
        
        

        count = count +1;
       end
   
    
    figure(1);
    plot(v,i);
    grid on; hold on;
    xlabel('voltage [V]'); ylabel('current [A]')
    title('IV - Kennlinie ');
    
    %% instrument in local mode schalten
    fprintf(serialObject,':OUTP OFF');
    fprintf(serialObject,'SYSTEM:LOCAL');
    fclose(serialObject);

 

Das Ergebnis der beiden Skripten ist der folgende Kennlinienverlauf: