Elektronik


Diese Seite ist chronologisch aufgebaut. Die neusten Sachen kommen zuerst, älteres Zeug ist weiter hinten, und konsequenterweise ist dann eine kleine Einführung in Elektronik erst ganz am Schluss zu finden.

Alle Programme dieser Seite sind Opensource/Freeware.


Inhaltsverzeichnis:

Audioverzögerung
Wetterstation
GPS-Modul austesten
Bewässerung von Topfpflanzen
Bewässerung von Balkonpflanzen
Neuer Laderegler für Solaranlage
Bewegungssensor testen
Echtzeituhr (RTC) testen
Data-Logger mit Echtzeituhr und SD-Karte
Spritzenpumpe mit Schrittmotor
Akku-Ladegerät und Tester mit Raspberry Pi
RGB-LED-Matrix
Erste Versuche mit neuem ATtiny10
Reise-Wecker mit BCD-Anzeige
Text über RS232 auf TV-Monitor ausgeben
IR-Fernsteuerung
Kühlschrank-Thermometer
Grafik-LCD
Selbstbau-Taschenrechner
Quarzfrequenz-Messung mit Funkuhr
Eisenbahn-Steuerung
Modellbau-Servos
Scatter, Lichtstreuung-Messgerät
Solarzellen, Laderegler, Nachführung
Hardware-Zufallszahlengenerator
Licht-Wecker
AVR-Microkontroller
Alte Projekte (Funkuhr, Schachuhr, ...
kleine Einführung in Elektronik (noch unvollständig)

Audioverzögerung

Schaltschema

Prototyp-Schaltung um ein UKW-Radio mit einem DAB-Radio zu synchronisieren.
Hintergrund ist, dass ich in einem Raum ein UKW-Radio hatte und im andern Raum ein DAB+-Radio mit selbem Sender eingestellt. Das DAB+-Radio hinkt aber einige Sekunden hinterher.
Das UKW-Radio besteht aus einem Empfänger und einem Verstärker als zwei verschiedene Geräte. Mit der vorliegenden Schaltung wird das Signal aus dem Empfänger digitalisiert, in einem RAM zwischengespeichert und nach einstellbarer Verzögerungszeit wieder in ein Analogsignal umgewandelt, das dann an den Verstärker geschickt wird.

Als Controller wurde ein Arduino-Atmega2560-Board verwendet. Das RAM hat eine Grösse von 1MB. Das reicht um maximal 11.9 Sekunden lang ein Stereosignal zu speichern. (8 Bit je Kanal, 44kHz)
Um eingestellte Verzögerung anzuzeigen wird ein 4-Zeilen-LCD mit 16 Zeichen pro Zeile benutzt.

Quellprogramm: audioverzoegerung.tar.gz

AufgebautesGeraet
Bei der aufgebauten Schaltung ist entgegen dem Schaltschema der Eingang rechts und Ausgang links. Der in der Luft hängende Zusatz beim Eingang ist eine vereinfachte Eingangsschaltung mit nur einem 1uF Kondensator pro Kanal, statt dem ursprünglichen Vorverstärker im Schaltplan.
Der zweite Zusatz (links oben) ist zur Kontrolle der Stärke des Eingangssignals, bestehend aus 8 LEDs und ist bisher nicht im Schaltplan eingezeichnet.


Wetterstation

Schaltschema

Selbstbau-Wetterstation mit BME280-Modul um Temperatur, Feuchtigkeit und Luftdruck zu messen, sowie ein GPS-Modul für genaue Zeit und Höhe über Meer. Die Höhe wird benötigt um den gemessenen Druck in einen Druck auf Meereshöhe umzurechnen. Ohne GPS-Modul kann man auch eine fixe Höhe für den Standort der Wetterstation eintragen.
Als Controller wurde ein Atmega1284P verwendet. Zur Anzeige wird ein 4-Zeilen-LCD mit 20 Zeichen pro Zeile benutzt.

Quellprogramm: wetterstation.tar.gz


GPS-Modul austesten

Schaltschema

Austesten eines GPS-Moduls mit Hilfe eines Arduino-Nano (Atmega328p) und einem 4-Zeilen-LCD-Modul.
Die verwendeten Teile sind ein "GPS Modul NEO-6M kompatibel" von www.bastelgarage.ch und ein "Arduino Nano", sowie das LCD-Modul TC1604A-05 von Pollin.
Für die Pegelwandlung der Seriellen Daten vom GPS-Modul wurde ein BS270 verwendet. Das PPS-Signal vom GPS-Modul kann direkt an einen Atmega328p-Eingang angeschlossen werden (PB0/PCINT0).
Die seriellen empfangenen Daten entsprechen dem NMEA 183 Format. Zeit und Datum können vom $GPRMC Eintrag gelesen werden, Position, Höhe und Geschwindigkeit vom $GPGGA Eintrag. Im $GPGGA wird auch noch Empfangsqualität und Anzahl empfangene Satelliten angegeben.

Quellprogramm: gpsmodul.tar.gz


Bewässerung von Topfpflanzen

Prinzipschema Schaltschema

Eine kleine Schaltung mit einem ATiny13A, einfache Drähte um Wasserstand zu testen, und ein N-Channel MOSFET um eine kleine Pumpe einzuschalten. Damit kann man einige Blumentöpfe während den Ferien automatisch bewässern.

Quellprogramm: bewaesserung13.tar.gz


Bewässerung von Balkonpflanzen

Schaltschema Bestueckter_Print
(Schlatschema anklicken fuer grosse Version)

Eine etwas grössere Schaltung mit einem ATmega328P, vier Feuchtesensoren für die Töpfe auf dem Balkon, und ein P-Channel MOSFET um eine Pumpe einzuschalten. Damit kann man einige Blumentöpfe auf dem Balkon während den Ferien automatisch bewässern.
(nur für auf dem Balkon weil keine Überlauf-Absicherung vorhanden!)
Um die aktuelle Feuchtigkeit zu kontrollieren und nur tagsüber zu bewässern, wird noch ein Uhrenquarz und eine 4-Digit 7Seg-LED-Anzeige verwendet.
Dies ist mein erstes Projekt unter Verwendung von Kicad.

Quellprogramm: bewaesserung2.tar.gz


Laderegler für Solaranlage

Das Hauptproblem der Solarzellen ist noch das Speichern der Energie.
Eine typische Bleibatterie für kleine Solaranlagen hat eine Nennspannung von 12 Volt. Bei starker Belastung sinkt die Spannung auf etwa 10 bis 11 Volt.
Bei leerer Batterie sinkt die Spannung unter 10 Volt, bei voller Batterie ohne Belastung habe wir etwa 13.5 Volt.
Beim Laden sollte man gewöhnlich nicht über 14 Volt gehen.
Mit Lithium-Akkus habe ich noch keine Erfahrungen, meine Laderegler sind daher auf Bleiakkus ausgelegt.
Werden 10 NiMH-Akkus in Serie geschaltet, so sind Leerspannung und Spannung der vollen Batterie fast gleich wie bei Bleiakkus. Diese können also auch verwendet werden.

Aus finanzieller Sicht lohnt es sich nicht einen Laderegler selbst zu bauen.
Die einfachen käuflichen Regler sind inzwischen sehr günstig, die besseren sind auch nicht teurer als ein Selbstbau.
Aber ein Selbstbau lohnt sich, wenn man verstehen will wie es wirklich funktioniert.

Die einfachste Version eines selbst gebauten Ladereglers besteht aus einem Linear-Spannungsregler:
(Bild: Laderegler mit LM337)
Die 0.1 Ohm Widerstände sind optional zum Messen der Ströme. R3 R4 könnte man noch anpassen für andere Batteriespannungen.
Statt dem LM337 könnte man auch den LM317 nehmen und Polaritäten entsprechend vertauschen.

Ein auch noch einfacher Laderegler besteht aus einem kleinen Microkontroller und einem Leistungs-MOSFET der als einfacher Schalter funktioniert:
(Bild: Laderegler mit Tiny13)
Diese Art von Laderegler wird als PWM-Laderegler bezeichnet.
Das Schema ist vereinfacht (z.B. Programmierstecker und USB-Ausgang weggelassen) und in dieser Form nicht getestet.
Die Widerstände R2 R3 bilden einen Spannungsteiler um die Batteriespannung zu messen. Mit dem Ausgang PB4 wird dann, wenn die Spannung 14 Volt erreicht der P-Channel-MOSFET Q1 gesperrt. Die Diode wird benötigt um Nachts die Batterie nicht über die Solarzelle zu entladen. An PB1 könnte man noch einen weiteren P-Channel-Transistor schalten, um die Last abzuhängen wenn die Spannung unter 10 Volt sinkt.

Mein neustes Projekt ist ein sogenannter MPPT-Laderegler:
(Bild: MPPT-Laderegler mit Atmega8A) Klick fuer grosse Version
Damit wird laufend nach dem optimalen Arbeitspunkt der Solarzelle gesucht (MPPT=Maximum PowerPoint Tracking).
Da die Leistung Strom mal Spannung ist, kann die Solarzelle mehr leisten wenn sie auf höherer Spannung als die Batterie läuft. Wenn z.B. die Solarzelle bei 18 Volt 1 Ampere liefert, dann kann eine Batterie bei 12 Volt mit 1.5 Ampere geladen werden (ohne Verluste beim Spannungswandeln gerechnet).
Die aktuelle Schaltung läuft mit einem Atmega8A als Controller und einem LP324N für die 4 Operationsverstärker. Ein Atmega328P wäre wohl besser geeignet, und statt dem LP324N wollte ich eigentlich den LM324N nehmen. (Der LM358 wäre vielleicht die noch bessere Wahl, da eigentlich nur 2 OPV benötigt werden.) In der ursprünglichen Schaltung war der Messwiderstand zwischen TP4 und TP5, in aktueller Schaltung abgeändert so dass es auch mit dem LP324N läuft.
Den Uhrenquarz habe ich noch nicht eingelötet, damit könnte man noch Strom sparen. An PORTD könnte man noch ein LCD-Modul und einen Taster anschliessen und Programm entsprechend anpassen, um dann auf Tastendruck z.B. Batteriespannung und aktuellen Ladestrom anzeigen zu lassen.

Aktuelle Schaltung+Software: mpptreglermega8a.tar.gz
Entwurf mit Atmega328P und LM358: mpptregler-mega328p.tar.gz

Links: MPPT Wikipedia , Messen von Leistungsinduktivitäten , Dimensionierung Step-Up-Konverter , MOSFET-Übersicht , ,

Weitere Ideen:


Bewegungssensor testen

Erster Test der Sensoren auf dem "nano-rp2040-connect" und übertragen der Daten übers WiFi.
Ich habe ein LCD (2 Zeilen a 16 Zeichen) angeschlossen für Testausdrucke.
Ohne ein LCD kann man beim folgenden Beispielprogramm (wifisens.ino) das "#define DEBUG" auskommentieren.

Quellprogramm: wifisens.tar.gz
Variante mit Prüfsumme: wifisenschecksum.tar.gz

Das Programm mit der Arduino-IDE auf dem Controller installiert, sollte beim Starten nach etwa 10 Sekunden die grüne LED (RGB-LED) leuchten. (Wenn es rot leuchtet ist ein Fehler passiert.)
Am Computer (Linux, Ubuntu) wird Funknetzwerk aktiviert, dann nano-rp2040 ausgewählt und das Passwort, welches in "wifisens.ino" mit "char pass[]" definiert wurde, eingegeben.
Wenn das LCD benutzt wird und alles klappt, erscheint dann der Hinweis "Device connected".
Das Programm zum die Sensor-Daten empfangen wird mit "make" compiliert und mit "./httpclient" gestartet.
Auf dem LCD erscheint dann in schneller Folge "new client" und "client disconn." während das Programm die Daten 500 mal abfrägt und anzeigt.


Echtzeituhr (RTC) testen

Bild vom RTC-Tester Bild vom LCD-Anzeige

Eine Echtzeituhr (RTC = Real Time Clock) ist ein Chip auf dem eine Uhr auch weiter läuft wenn die Stromzufuhr fehlt. Es wird dazu eine Stützbatterie benötigt.

Eine der einfachsten Version ist der DS1307. Dieser benötigt als Taktgeber noch einen Quarz mit einer Frequenz von 32768 Hz.
Die Genauigkeit hängt von der Genauigkeit dieser Quarzfrequenz ab. Wenn ein Quarz mit korrekter Load-Kapazität eingesetzt ist sollte es auf etwa 20 ppm genau sein.

Ein etwas teureres IC ist der DS3231SN der den Quarz schon mit eingebaut hat. Es ist ein Temperaturkompensierter Quarz (TCXO) der eine Genauigkeit von 2 ppm haben sollte (im Bereich von 0 bis 40 Grad Celsius).
Dazu hat er einen eingebauten Temperatursensor, der allerdings nur eine Genauigkeit von 3 Grad hat.
Zum Feinjustieren gibt es noch ein Register (Aging Trim oder Aging Offset genannt) in diesem RTC.
Eine billigere Version vom DS3231 ist der DS3231M. Dieser hat keinen Quarz eingebaut, sondern ein MEMS-Resonator und ist etwas weniger genau (etwa 5 ppm nach Datenblatt). Auch kann er nur eine genaue Frequenz von 1 Hz ausgeben, im Gegensatz zur SN-Variante der auch Frequenzen von 1024, 4096, und 8192 Hz kann.

Ich habe Module mit diesen Chips (DS1307 und DS3231) drauf gekauft und festgestellt dass die Genauigkeiten wesentlich schlechter waren. Ich habe deshalb ein Programm geschrieben mit dem man diese RTCs etwas genauer testen kann. Da ist auch eine Software-Korrektur eingebaut um sehr starke Abweichungen zu korrigieren. Um letzte Stellzeit und Korrekturfaktor zu speichern werden beim DS3231 die Alarm-Register missbraucht. Beim DS1307 hat es ein RAM zu beliebigem Gebrauch, welches dann verwendet wird,

Quellprogramm: echtzeituhr.tar.gz (Version 0.3)

Das Programm geht davon aus dass ein Arduino-Mega (Atmega2560) benutzt wird. (für andere Controller wären noch kleine Änderungen nötig.)
Um Testresultate anzuzeigen wird ein 4-Zeilen-20-Zeichen LCD-Modul verwendet.
Zur Eingabe dienen 4 Tastschalter.

(Bisher nur mit einem DS3231M getestet, DS3231SN muss erst noch gelötet werden.)


Data-Logger mit Echtzeituhr und SD-Karte

Bild vom Aufbau Schaltschema

Der Aufbau besteht aus einem Arduino-Nano, einer 16-Tasten Matrixtastatur, ein DS1307-Modul, und ein 2-Zeilen-LCD welches über ein i2c-Backpack angesprochen wird. Die hauptsächliche Schwierigkeit hier war das Ansprechen der SD-Karte (Micro-SD).
Die bisher einzige funktionierende Version ist die Library, die beim Arduino-IDE mit dabei war.

Um zu compilieren muss man das Hauptprogramm in Name.ino umkopieren und in einem Ordner der gleich heisst speichern.

Quellprogramm: datalogger.tar.gz (Version 0.2)

Hier ist die Korrektur der stark abweichenden RTC noch realisiert indem letzte Stellzeit und Korrekturfaktor im EEPROM des Microkontrollers abgelegt werden.

Mit dem Programm (logger.cc) können Blutdruckwerte eingegeben werden. Dabei wird bei mehreren Messungen hintereinander der Durchschnitt berechnet und dann zusammen mit Zeit und Datum auf der SD-Karte in einer Textdatei gespeichert.
(Ich habe auch ein Programm unter Linux um diese Textdatei dann auszuwerten und eine Grafische Darstellung zu machen)

Mit dem zweiten Programm (logger2.cc) kann man Temperaturmessungen machen (mit I2C-Temperatursensor LM75A). Also z.B. jede Minute eine Messung und dann im EEPROM des Controllers oder auf der SD-Karte speichern.
(noch ungelöstes Problem ist das anschliessende Auslesen des EEPROM)


Spritzenpumpe mit Schrittmotor

Bild vom Aufbau Schaltschema

Der Aufbau ist noch ein handverdrahteter Prototyp mit ArduinoMicro (Version mit einem Atmega32u4), Schrittmotortreiber von Pololu, zwei Magnetsensoren SS495A und einem Temperatursensor LM75a in zugeschmolzener Glasröhre. Damit wird die Temperatur im Reaktionskolben kontrolliert. Der Schrittmotor wird von einem Steckernetzteil mit 7V betrieben. Der ArduinoMicro enthält einen Spannungsregler für 5V. Damit wird die Elektronik betrieben. (Der Spannungsregler für 3.3V auf dem ArduinoMicro wird nicht verwendet.)

Die 3D-gedruckte Halterung der Spritze ist noch nicht optimal. Hat etwas viel Spiel, und Haltebügel damit Spritze nicht rausrutschen kann fehlt noch.

Mit 3 Tasten können Einstellungen gemacht werden, und eine weitere Taste für start und stop. Der Status wird auf einem LCD-Textdisplay angezeigt (4 Zeilen a 16 Zeichen).
Quellprogramm: spritzpump32u4.tar.gz


Akku-Ladegerät und Tester mit Raspberry Pi

Schaltschema

Es können bisher 3 Akkus gleichzeitig getestet und geladen werden. Dabei werden Entladekurven und Ladekurven dargestellt. Das Ganze ist in Assembler programmiert.
Es können verschiedene Akku-Typen verwendet werden. Bei neuen Typen die entsprechenden Daten im Assemblerprogramm eintragen.

Quellprogramm: raspiakkulader.tar.gz (Version 0.2)

Speichern der Entlade-/Lade-Kurven geht noch nicht weil die entsprechenden Assembler-Routinen zum SD-Karte ansprechen noch fehlen.
Falls also jemand weiss wie man in Assembler die SD-Karte anspricht, wäre ich daran interessiert.


RGB-LED-Matrix mit ATmega1284P

Modul-Rueckseite Modul-Vorderseite-mit-Lichter LED-Matrix mit Nimm-Spiel
Diese LED-Matrix besteht aus 200 RGB-LEDs. Das ganze besteht aus 4 Modulen, die jeweils 50 LEDs enthalten und von einem Microkontroller ATmega1284P angesteuert werden. Die Anzeige besteht aus halbdurchsichtigem weissem Kunststoff, der mit dem 3D-Drucker ausgedruckt wurde. Damit erscheint jede LED als ein viereckiges Licht.

Quellprogramm: ledmatrix.tar.gz
Im Quellprogramm ist bisher nur ein Testprogramm und ein erstes einfaches Spiel (Nimm) enthalten.


Erste Versuche mit neuem ATtiny10

Der neue Tiny10 ist sehr klein, er hat nur 6 Pins. Es gab mal ein Tiny10 mit mehr Pins aber ohne RAM, oder zumindest ein Preliminary-Dokument dazu. Der neue hingegen hat wenigstens 32 Byte RAM. Die grösste Einschränkung ist wohl, dass er nur 16 Arbeits-Register hat, also nur r16 bis r31. Die Register r0 bis r15 fehlen!

Um zu compilieren waren ein paar kleine Änderungen in avra notwendig. Im Wesentlichen in device.c der neue Tiny10 definiert und der alte umbenannt. Entsprechende Dateien von avra-1.3.0-patch/ im folgenden Archiv nach avra-1.3.0/ kopieren und neu compilieren.

Der grösste Aufwand war es jedoch einen Programmer zum laufen zu bringen. Ich habe es nach längerem Probieren für den All-AVR geschafft.
Dazu musste die Datei 41-atmega.rules nach /etc/udev/rules.d/ kopiert werden, und ausserdem in der Datei /lib/udev/rules.d/69-libmtp.rules die Zeile, die mit ENV{ID_MTP_DEVICE} beginnt auskommentiert werden.

Nach all diesen Vorbereitungen ein kleines Testprogramm für folgende Schaltung erstellt:
Schaltschema-Tiny10-Test2
Die ersten 3 LEDs blinken lassen geht schon mal.
Nach setzen des Fusebits RSTDISBL blinkt auch die vierte LED. Neu programmieren geht dann aber nur noch mit Jumper J1 entfernt und J2 auf 12 Volt gesetzt.
(Wie man RSTDISBL wieder zurücksetzt habe ich noch nicht rausgefunden)

Quellprogramm: tiny10.tar.gz
Eagle-Library: tiny10.lbr
avra1.3-patch: avra-1.3.0-patch.tar.gz (neue Controller: ATmega2560, ATmega1284P, ATtiny10)

weitere Patchs:


Text über RS232 auf TV-Monitor ausgeben

Bei Pollin gibt es einen RS232-BAS-Bausatz. Damit kann man über die Serielle Schnittstelle einen Text ausgeben, der dann an einem Fernseher angezeigt wird. Es sind dabei 20 Zeilen a 27 Zeichen darstellbar.
Der Bausatz funktioniert mit einem Atmega8, einem MAX232 für die RS232-UART-Wandlung und je zwei Widerständen und Dioden für die Video-Ausgabe.

Es gab da beim Pollin-Bausatz ein paar kleine Unzulänglichkeiten:
Auf einem grossen Fernseher wackelte das Bild ziemlich stark.
Auf einem kleinen Monitor war die Schrift nur schlecht lesbar.
Es waren nur ASCII-Zeichen darstellbar, also keine Umlaute und keine Sonderzeichen.

Ich habe also den Atmega8 neu programmiert. Das Wackeln ist damit vollständig verschwunden. Die Schriftgrösse ist jetzt im Programm per Option einstellbar. Dabei resultieren folgende Zeilenanzahlen und Zeichen pro Zeile:
Mit kleiner Schrift: 22 Zeilen a 42 Zeichen
Mit grosser Schrift: 13 Zeilen a 27 Zeichen
Sehr grosse Schrift: 6 Zeilen a 16 Zeichen (die Zeichenbreite kann noch variert werden, so dass sich 14, 16, 18 oder 22 Zeichen ergeben)
Umlaute und diverse Sonderzeichen sind jetzt auch darstellbar. Der Zeichensatz besteht aus total 256 Zeichen.

Eine Version für Grafikausgabe von 320x256 Punkten in Schwarzweiss habe ich auch programmiert. Dazu wird aber ein Atmega1284P und somit eine neue Schaltung benötigt.

Quellprogramm: rs232bas.tar.gz (aktuelle Version: 1.5)
Testprogramm: seriell.tar.gz Serielle Schnittstelle unter Linux austesten (MacOSX sollte auch gehen, Windows braucht noch Anpassungen)
Fonteditor: fonteditor.tar.gz Hilfsprogramm zum eigene Fonts erstellen, die in rs232bas (Option in basi.asm) direkt verwendet werden können.

Farbiger Text und Grafik auf TV-Monitor ausgeben

Diese neue Variante funktioniert nur mit einem Atmega1284P. Hier die entsprechende Schaltung:
schaltung_1284p
Für die farbige Ausgabe wird ein RGB-Scart-Eingang benötigt. Normalerweise am Fernseher mit Ext1 bezeichnet.
Statt dem USB-UART-Modul könnte man natürlich auch RS232 verwenden. Bei Verwendung von USB sollte die USB-Spannungsversorgung ausreichen, so dass kein externes Netzteil benötigt wird.
Ausser farbigem Text können auch grafische Elemente gezeichnet werden: Punkte, Linien, Vierecke, Kreise und Ellipsen.

Quellprogramm: basirgb.tar.gz (aktuelle Version: 0.3)


IR-Fernsteuerung

Funktioniert gleich wie die IR-Fernbedienungen von TV, Radio usw. Aber fast jede Fernbedienung funktioniert jeweils wieder mit einem anderen Format. Ein gut dokumentiertes Format ist das RC5-Format
Bisher erst der Sender realisiert. (Universalfernbedienung, bisher nur 3 Formate)
Für den Empfangs-Teil gibt es günstige Module wie z.B. TSOP 4838.
Als Sender kann z.B. die IR-Diode LD274 genommen werden.
Sender: geschlossenes_Geraet   Innenleben: offenes_Geraet

Quellprogramm: irfernbedienung.tar.gz


Kühlschrank-Thermometer

Damit kann man die Temperatur im Kühlschrank überwachen, und den Temperaturverlauf aufzeichnen.

Quellprogramm: funkthermometer2.tar.gz
Auswerteprogramm: datenauswerten.tar.gz


Grafik-LCD mit AVR-Microkontroller ansteuern

Hier ist mein provisorischer Treiber für das Grafik-LCD auf dem myAVR-MK3-Board
und für die Grafik-LCDs EADOGM und EADOGL.

Quellprogramm: lcdtreiber.tar.gz


Selbstbau-Taschenrechner

Programmierbarer Taschenrechner im Eigenbau. Bisher gehen schon mal die Grundfunktionen sowie Winkelfunktionen und Logarithmus. Die Echtzeituhr für den Terminplaner funktioniert auch schon. Terminplaner ist aber bisher auf einen einfachen provisorischen Kalender beschränkt.
Geplant ist auch noch ein einfaches direktes Programmieren. Ausserdem noch Molekulargewichts-Berechnung (MG-Rechner).
Begonnen hatte ich auf einem ATmega32, dann ATmega644 und inzwischen habe ich auf den ATmega1284P gewechselt.
Selbstbau-Tastatur Tarech im Gehaeuse Tarech Tastaturbelegung Tarech Schaltschema
Programm: tarech.tar.gz

Neue Version mit AVR-Stamp jetzt auf separater Homepage: Selbstbau-Taschenrechner
Download: tarech2.tar.gz


Quarzfrequenz-Messung mit Funkuhr

Um die Frequenz eines Quarzes im Bereich 1MHz bis 16MHz zu messen, braucht man nur ein Funkuhrmodul, einen ATmega8 und ein LCD-Modul:
Funkuhr-Frequenzmesser-Schaltschema Funkuhr-Frequenzmesser
Der Quarz ist gesockelt. Man setzt also einfach den zu messenden Quarz in den Sockel und schaltet ein. Nach 20 Sekunden sollte die ungefähre Frequenz ermittelt sein. Danach wird je länger man die Schaltung laufen lässt, umso genauer die Frequenz ermittelt. Nebenbei wird noch abwechslungsweise Uhrzeit und Datum angezeigt.
Programm: funkuhr2.tar.gz

Alte Funkuhr mit digitaler Elektronik: Funkuhr


Eisenbahn-Steuerung

Dies ist eine einfache DCC-Zentrale um Modelleisenbahnen zu steuern. Sie funktioniert mit einem ATmega32-Microkontroller (im Bedarfsfall kann der auch durch einen ATmega644 oder ATmega1284 aufgerüstet werden), ein 128x64 Grafik-LCD fuer Text und Grafik-Anzeige und einer 4*5-Tastatur zur Eingabe. (Die Tastatur stammt von einem billigen Taschenrechner und enthält einen ATtiny2313 der über den UART die Tastencodes dem ATmega32 sendet.)

Bisher kann man damit 4 Loks steuern (wäre aber leicht auf mehr erweiterbar), es gibt bisher 14 Geschwindigkeitsstufen (es fehlt nur noch das entsprechende Umschaltkommando um auch 28 Stufen zu unterstützen), und Licht ein/aus-schalten geht auch schon.

Bild von DCC-Zentrale
Download: bahnsteuerung.tar.gz

Vorgesehene Erweiterungen sind: Positionserkennung mit RFID (erste Versuche waren schon mal vielversprechend), Weichensteuerungen (geht bisher über diskrete Elektronik mit separaten Schaltern), und schliesslich automatisches Anhalten und wieder Anfahren am Bahnhof. (bisherige Anlage auf der Bastelecke)

Informationen übers DCC-Protokoll:
DCC auf Wikipedia
DCC-Standards (english) S-9.1 und S-9.2 sind wohl die wesentlichen Infos

Zusammenfassung DCC-Standart:

Low und High wird durch Umpolung der Stromversorgung codiert. Es sollte mit mindestens 2V/us umgeschaltet werden. Stromversorgung ist 16V +- 4V.
1-Bits werden durch 58usec Low und 58usec High kodiert. Toleranz (des Empfängers) sollte +-6usec sein.
0-Bits werden durch 100usec Low und 100usec High kodiert. Toleranz sollte +9900,-10usec sein. (Sender +9800,-5)
(die 0-Bits-Verlängerungen können benutzt werden um eine DC-Lok fahren zu lassen)
Ein Datenpacket wird gestartet mit 14 1-Bits, dann 1 0-Bit. (Der Empfänger sollte mindestens 12 1-Bits sehen.) Dann folgen jeweils 8 Bit fuer ein Byte und als Abschluss ein 0-Bit. Nach dem letzten Byte statt dem 0-Bit ein 1-Bit als Abschluss.
Von diesen Bytes ist das erste die Lok-Adresse (1 bis 127 erlaubt). Das zweite Byte ist ein Kommando.
Beginnt das Kommando mit den Bits 01, dann haben die folgenden 6 Bits folgende Bedeutung: DCSSSS. Dabei ist D die Richtung, 1=vorwärts 0=rückwärts, SSSS die Geschwindigkeit und C ist entweder noch ein weiteres Geschwindigkeits-Bit (kleinste Wertigkeit) oder Licht an/aus.
Wenn SSSSC Geschwindigkeits-Einstellung ist: 0-1=Stop, 2-3=Notstop, 4=Stufe 1, 5=Stufe 2, ..., 31=Stufe 28. Wenn bei einem Stop C gesetzt ist, dann Richtung unverändert lassen, sonst D=neue Richtung.
(Wann C zum Licht ein/aus-schalten benutzt wird ist noch unklar)
Weitere Kommandos:
00000000 = wenn Lok-Nr==0: Reset an alle Loks
           wenn Lok-Nr==0xFF: Idle an alle Loks, nichts weiter tun
01DC000S = wenn Lok-Nr==0: Stop an alle Loks
Der Sender sollte mindestens alle 30ms ein Packet senden.

Das letzte Byte ist eine Prüfsumme. Exclusiv-Oder aller Bytes inklusive dieser Prüfsumme sollte 0 ergeben, sonst ist ein Übertragungsfehler aufgetreten.


Modellbau-Servos

Mit diesen kleinen Motoren kann man viele Dinge basteln. Am einfachsten zu verwenden sind sie, wenn man die Elektronik ausbaut und dann den Gleichstrom-Motor direkt ansteuert.

Mit einem Microkontroller ist es nun aber auch ziemlich einfach die enthaltene Elektronik anzusteuern. Als Steuersignal muss 50 mal pro Sekunde ein Puls von 500 bis 2500 Microsekunden gesendet werden. Die Pulslänge definiert dabei die gewünschte Position des Servos. Leider ist es von Hersteller und Modell abhängig welche Werte welchen Stellwinkeln entsprechen. Selbst zwei Servos vom selben Hersteller können da ganz verschieden sein. Sogar die Drehrichtung kann unterschiedlich sein.
Hier eine Schaltung um zwei Servos zu testen:
Servotester
Dafür wurde der kleinsten AVR-Kontroller (ATtiny13A) verwendet. Man kann damit sogar 2 Servos gleichzeitig ansteuern. Um die Stellwerte (Anzahl Microsekunden der Pulse) darzustellen war nur noch ein Pin frei. Deshalb wurde noch kurz eine Schaltung entworfen mit der man ein LCD mit nur 1 Pin ansteuern kann. Ein Tiny2313 empfängt die Daten über nur eine Leitung und steuert das LCD dann ganz normal an. Damit lässt sich also ein LCD-Modul zusammenbauen, das nur 3 Leitungen (Datenleitung + GND + 5V, in obigem Schema J3-1 bis J3-3) benötigt: dreidrahtlcd.png, lcd2313.asm
Das Programm für den ATtiny13A in obigem Schema ist pwmservo2.asm
Packet mit allen erwähnten Programmen: lcd3wire.tar.gz


Lichtstreuung-Messgerät

scatter-atmega32usb-device
Seite an der Uni (englisch): scatter device

Solarzellen, Berechnungen

Programm zum Ertrag einer Solaranlage abzuschätzen: solaranlage.tar.gz

Damit es für jede Position auf der Erde funktioniert müssen jeweils die Geographischen Koordinaten eingegeben werden. Also z.B. für Zürich 47.367 Grad Breite, 8.533 Grad Länge.
Die Lage der Solarzelle (bzw. der Anlage falls alle Panel gleich ausgerichtet sind) muss durch zwei Winkel angegeben werden:
Abweichung von der Ausrichtung gegen Süden in Grad. Positive Werte für westliche, negative Werte für östliche Abweichung.
Winkel der Dachschräge. Also bei flach liegender Zelle 0 Grad, bei senkrechter Lage (z.B. an Hauswand) 90 Grad.
Das Programm berechnet dann wahlweise einen Tagesverlauf, Monatsverlauf oder Jahresverlauf bei Anname von idealem Sonnenschein, und bei Verwendung von einer Wetterstatistik.
(Wetterstatistik bisher nur für Zürich).
Die Wetterstatistik besteht dabei bisher nur aus Anzahl Sonnenstunden pro Tag für jeden Monat.

Das Programm ist noch nicht sehr ausführlich getestet. Bisher nur unter Linux getestet, sollte aber auch auf andern Unix-ähnlichen Systemen wie z.B. MacOSX laufen.
Da es bisher nur Textausgaben macht, sollte auch eine Anpassung unter Windows einfach möglich sein.
Das Programm wird von einem Terminal aufgerufen. Mit den Optionen -? und -h gibt es genauere Angaben zu allen möglichen Optionen.
Stand 27.6.2015

Der folgende Abschnitt (Versuch einer Nachführung) ist ein etwas älteres Projekt.
(Irgendwie fehlt da noch die Beschreibung des Ladereglers, den ich vor etwa 2 Jahren konstruiert habe)

Solarzellen, Laderegler, Nachführung

Solarzelle Die grössere ist eine 10-Watt-Solarzelle. Aus der Fläche und mit einer Solarkonstanten von 1kW/m2 gerechnet hat sie einen Wirkungsgrad von 13%.
Der Aufbau mit der kleinen Zelle ist ein Test um eine Nachführung auszuprobieren.
Solarnachfuehrung1 Solarnachfuehrung2 Solarnachfuehrung3
Erster Test der Nachführ-elektronik und -Mechanik. (ein ATtiny13A und ein Modellbau-Servo für jede Achse.)
Provisorisches Microkontroller-Programm dazu: solarnachfuehrung.tar.gz

Neue Solarzellen-Seite: sonnenenergie/index.html


Hardware-Zufallszahlengenerator

Schaltschema
Ein Rauschgenerator mit einem Microkontroller verbunden liefert Zufallszahlen über die Serielle Schnittstelle.
hardzufall.tar.gz enthält das Programm für den Microkontroller.
rndcheck.tar.gz ist ein Testprogramm, das die Zufallszahlen über die Serielle Schnittstelle einliest.
pwrtmngr.tar.gz ist ein einfacher Passwortmanager, der die Schlüsseldateien aus den Hardware-Zufallszahlen erstellen kann.

Licht-Wecker

Bild_vom_Lichtwecker Bild_von_Hinten
Dieser Wecker weckt am Morgen sozusagen mit einem simulierten Sonnenaufgang. Er beginnt mit schwach rotem LED-Licht, dann wird es heller, es kommt noch langsam grün dazu so dass die Farbe über orange zu gelb wechselt, schliesslich noch eine blaue LED gibt dann langsam weisses Licht.
Schaltung mit einem Atmega32-Microkontroller realisiert: lichtwecker.tar.gz (aktualisiert am 13.4.2010: Bewegliche Feiertage korrigiert)

Neue vereinfachte Version als Reisewecker
statt ein LCD werden zur Zeitanzeige nur 13 LEDs verwendet. Die Anzeige ist damit im BCD-Binärformat (Beispiel im Bild 21:38).
Bild1:SMD-Schaltung Bild2:fertiger_Reise-Lichtwecker
Schaltung mit einem Atmega8A in SMD-Ausführung: simpleleduhr.tar.gz
Das Gehäuse dazu ist mit dem 3D-Drucker ausgedruckt.


AVR-Microkontroller

Meine ersten Programmbeispiele für den Atmega8: atmega8-erstebeispiele.tar.gz

Überarbeitete erste Programmbeispiele für den Atmega8: avr/index.html (this site is in english)

Wichtige Abkürzungen:
IC : Integrated Circuit (Integrierte Schaltung)
DIL : Dual Inline (IC-Gehäuse mit Anschlüssen in 2 Reihen)
SPI : Serielles Programmier-Interface
ISP : In der Schaltung Programmieren
Typische ISP-Stecker haben diese Belegungen: Bild_von_6pol_und_10pol_Varianten

Ein Microcontroller ist ein vollständiger Computer in einem einzigen IC. Hier geht es um die AVR-Serie von Atmel. Eine ausführliche Beschreibung der AVR-Microcontroller ist unter mikrocontroller.net zu finden.

Es gibt unter anderem folgende Typen:
Atmega8 im DIL-28 Gehäuse: Atmega8 eigene Zusammenfassung
Atmega32 im DIL-40 Gehäuse: Atmega32 eigene Zusammenfassung
Atmega328P im DIL-28 Gehäuse (Anschlussbelegung wie Atmega8, Speicher ähnlich wie Atmega32) Atmega328p eigene Zusammenfassung
ATtiny13A im DIL-8 Gehäuse: ATtiny13A eigene Zusammenfassung (kleinster AVR-Kontroller)
ATtiny2313A im DIL-20 Gehäuse: ATtiny2313A eigene Zusammenfassung (ohne AD-Wandler aber kleiner als Atmega8)
Atmeag2560 ist im myAVR-Stamp256: Atmega2560 eigene Zusammenfassung (hat viele Ports und ist nur als SMD erhaeltlich)

Für die Programmierung unter Linux-Ubuntu werden folgende Packete gebraucht:
avr-libc, avrdude, gcc-avr, binutils-avr, avra
Zum Programmieren mit dem Assembler (avra) werden noch Include-Dateien gebraucht. Bei avra-1.3.0 sind schon einige Include-Dateien dabei. Weitere können direkt bei Atmel erhalten werden. (Notfalls das Programm für Windows runterladen und alle *.inc kopieren)

Mit avrdude wird das compilierte Programm auf den Microcontroller übertragen.
Aufruf-Beispiele zum Auslesen des Atmega8 mit dem mySmartUSB:
avrdude -p m8 -c avr910 -P /dev/ttyUSB0 -v
avrdude -p m8 -c avr910 -P /dev/ttyUSB0 -U flash:r:flash.hex:i
avrdude -p m8 -c avr910 -P /dev/ttyUSB0 -U eeprom:r:eeprom.hex:i
Statt flash oder eeprom, geht auch noch lock, hfuse, lfuse und signature.


(da fehlen noch meine älteren Projekte)
(Digitale Sachen wie Funkuhr, Schachuhr, Sternzeituhr, Frequenzzähler wären heute mit den Microkontrollern sehr viel einfacher) Funkuhr mit TTLs aufgebaut

kleine Einführung in Elektronik

Strom, Spannung, Wiederstände

Um Strom durch einen Draht zu schicken braucht man eine Spannung. Je höher die Spannung umso mehr Strom fliesst. Je grösser der Widerstand des Drahtes umso weniger Strom fliesst.
Also gilt: I=U/R (I=Strom in Ampere, U=Spannung in Volt, R=Widerstand in Ohm)
Diese Formel ist besser bekannt in der Form U=R*I und heisst Ohmsches Gesetz.

Der Widerstand des Drahtes ist von der Länge, der Querschnitt-Fläche und dem Material abhängig. In der Elektronik werden oft Widerstände mit bestimmten Werten gebraucht. Für kleine Werte wird ein dünner Draht aufgewickelt (Drahtwiderstand), für grössere Widerstandswerte werden Kohleschicht- oder Metallfilm-Widerstände verwendet.

Wenn ein Strom durch einen Widerstand fliesst wird er warm. Das heisst es wird Energie umgesetzt. Je grösser die Spannung, je grösser der Strom und je länger die Zeit umso mehr Energie.
Also gilt: E=U*I*t (E=Energie)
Leistung ist als Energie pro Zeiteinheit definiert,
also gilt P=E/t und somit: P=U*I

Siehe auch Formelsammlung

(Diese Seite ist noch in Bearbeitung)

Transistoren, Logikschaltungen

Diese Seite ist noch in Bearbeitung

Tips und Tricks


Letzte Änderung: 30.Nov.2023 / Rolf                                                                                 Validator