Schlagwort-Archive: AVRISP

UV-Sensor Logger selbstgebastelt

Loading

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

Loading

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.