Archiv der Kategorie: Elektronikbastler

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

Raspberry als Datenlogger Teil2…Die Sensoren und Python

Loading

DSC_4789
Raspberry PI samt Powerbank im Gehäuse

In Teil1 dieses Projektes haben wir dem Raspberry ein Betriebssystem verpasst und das ein wenig für die Anwendung aufbereitet. Wir wollen ja an den PI mehrere Sensoren anschließen und diese dann zyklisch auslesen und die Daten in einer Datei auf einem USB-Stick speichern. Die Aufzeichnung soll so lange laufen, bis ein Taster gedrückt wird, der den Prozess beendet. Die einzige Anzeige des PI sind zwei Leuchtdioden, die, sowie auch der Taster, an die GPIOs des PI angeschlossen sind. Darum haben wir folgende Punkte bereits erledigt:

  • Die PI Platine gemeinsam mit einer USB Powerbank in ein Gehäuse eingebaut
  • Anschlüsse wie Ethernet, USB, HDMI durch Ausschnitte im Gehäuse nach außen geführt
  • Zwei Leuchtdioden und einen Taster ins Gehäuse eingebaut und auf die GPIOs geschaltet
  • Den I²C Bus des PI auf eine Buchse im Gehäuse geführt
  • Eine MicroSD Karte mit einem Raspi-Wheezy Image bespielt
  • Einen USB-Stick mit FAT32 formatiert
  • Das Betriebssystem soweit konfiguriert, dass das Filesystem für den Stick, alle Module für den I²C, sowie Python geladen werden.
DSC_4790
Raspberry PI im Plastikgehäuse

Der Pi sieht fertig zusammengebaut nun so aus (siehe Bild rechts). Nun können die Sensoren angeschlossen werden. In diesem Fall handelt es sich um Luftfeuchtigkeits-/Temperatursensoren mit der Bezeichnung HYT939 des Herstellers Hygrochip. Hier ein Auszug der technischen Daten aus dem Datenblatt des Herstellers:

Ausführung: Feuchtesensor im TO39 Gehäuse, druckfest, mit Edelstahl-Sinterfilter
Genauigkeit:
Feuchte ±1,8% rF, Temperatur ±0,2 °C
Genauigkeit 0…10% rF (0 … 50°C): ±(0,1% rF + 17% aw)
Messbereich: Feuchte 0 … 100% r.F. (max. dp = +80 °C), Temperatur – 40 … +125 °C
Abmessungen: 5,2 x 9 mm
Anschlüsse: TO 39 Footprint
Auflösung Feuchte: 0,02% rF
Hysterese bei 50% rF: < ±1% rF
Linearitätsfehler: < ±1% rF
Ansprechzeit t63: < 10 sec (Mit Edelstahl-Sinterfilter)
Auflösung Temperatur: 0,015 °C
Digitale Schnittstelle: I2C, Adresse 0x28 oder Alternativadresse
Betriebsspannung: 2,7 … 5,5 V
Stromaufnahme (typ): < 1µA in Bereitschaft < 22µA bei 1Hz Messrate 850 µA maximal

DSC_4792
HYT939 Sensor

Eine kleine Platine dient als „Sensorboard“. Hier besteht die Möglichkeit, vier HYT´s anzustecken. Natürlich müssen auch die Adressen der Sensoren unterschliedlich sein. Der HYT939 ist per default auf hex 0x28 eingestellt. Will man diese Deviceadresse ändern, so muss der der HYT in den Command-Mode versetzt werden, um dann die Konfigurationsdaten empfangen und in sein EEprom schreiben zu können. Dazu muß der Sensor innerhalb der ersten 10ms nach seinem PowerUp in den Command-Mode gebootet werden. Das lässt sich am einfachsten mit einem ArduinoUno bewerkstelligen… Dabei wird der Powerpin des HYT über einen Digital Out Pin des Arduino versorgt. So ist es möglich, das Timing genau einzuhalten und den Command Mode zu erreichen.

Nachdem der Sensor nun an den Raspberry angeschlossen ist, fehlt nur mehr ein Programm, um ihn oder auch mehrere anzusteuern und auszulesen. Hier verwende ich den Python Interpreter. Damit lassen sich auf einfache Weise die Daten auslesen und auch auf Datenträgern speichern. Das „Programm“ besteht aus zwei Teilen:

  • Hauptscript: beinhaltet nur eine Endlosschleife, die die LEDs steuert, den Taster abfragt, die Sensorfunktion aufruft, deren ausgelesene Werte übergibt, aufbereitet und auf den Stick speichert.
  • Funktion Sensor auslesen: addressiert den I²C Bus, liest die Sensordaten aus, rechnet sie in lesbare Werte um und übergibt den Output an die Funktion
# /usr/bin/python
# License: GPL 2.0
# edited by Ingmar B. Aug.2015

import os
from time import *
import time
import threading
import hyt939o 
import RPi.GPIO as GPIO

# Setup LED Ports (pin12 = LED rot, pin18 = LED gruen)
GPIO.setwarnings(False)
GPIO.setmode(GPIO.BOARD)
GPIO.setup(12, GPIO.OUT)
GPIO.setup(18, GPIO.OUT)
GPIO.setup(16, GPIO.IN)

# LED Gruen einschalten sobald das Script gestartet ist
GPIO.output(18, GPIO.HIGH)

#gpsd = None #seting the global variable
address = [0x2a, 0x29] 
#hyt939 = [0, 0]
hum = [0, 0]
temphyt = [0, 0]
loopon = True         #set variable for loop
i=1             #counter for address selection
os.system('clear')     #clear the terminal (optional)
 
while loopon:
        # bei beginn des auslesens aller daten die rote Led einschalten
    GPIO.output(12, GPIO.HIGH)
    if GPIO.input(16)== GPIO.HIGH:
      loopon = False
        os.system('clear')
         
      # Variablen fuer Sensor HYT 939 uebergeben 
    for i in range(2):
                
        hyt939=hyt939o.ReadMeasurement(address[i])            
        time.sleep(0.1)
        hum[i]=hyt939[0]
        temphyt[i]=hyt939[1]
      
                print '--------------------------------------- '
            print 'SENSORS reading Sensor Nr.:' , i
            print
            print 'humidity    hyt939         ' , hum[i]
            print 'temperature hyt939         ' , temphyt[i]
            print '--------------------------------------- '
            print
    print 'data to write:' , str(hum[0]), str(temphyt[0]), str(hum[1]), str(temphyt[1])
    print ("date :" + time.strftime("%x"))         
        print ("time :" + time.strftime("%X"))
    print
    date = time.strftime("%x")
    zeit = time.strftime("%X")
    
      ## write all data to usbstick
      
        fileout = open("/media/usbstick/wetterfrosch.txt", "a")

    time.sleep(0.1)

        fileout.write(date+";"+zeit+";"+str(hum[0])+";"+str(temphyt[0])+";"+str(hum[1])+";"+str(temphyt[1])+"\n") 
    
        time.sleep(0.1)
        fileout.close()
        time.sleep(0.1)

      # nach schreiben bzw auslesen der daten rote LED wieder abschalten
        GPIO.output(12, GPIO.LOW)
        time.sleep(0.8) #set to whatever

GPIO.output(18, GPIO.LOW) # gruene Led ausschalten

print "Ende" 

Das folgende Listing liest den Sensor aus:

# Reading mesaurements from HYT 939 humidity and temperature sensor
# First Version by Caerandir May 2014 modified by i.bihlo 2015

import smbus, time
bus = smbus.SMBus(1)    # Raspberry Rev. 2
address = 0x28          # Fixed default address of HYT 939

# Initialize sensor to acquire measurements
def MeasurementRequest():
        void = bus.write_quick(address)
    time.sleep(0.1)

# Read Humidiy and Temperature to 14 bit accuracy
def ReadMeasurement():
    void= bus.write_quick(address)

    time.sleep(0.1)    
        # Acquire 4 byte from sensor
        #time.sleep(0.1)
    Readout = bus.read_i2c_block_data(address,0,4)

    # Calculiere die relLF in % aus den vier Bytes in "Readout"
    RelHum = Readout[0]<<8 | Readout[1]
    RelHum = RelHum & 0x3FFF
    RelativeHumidity = 100*RelHum/(2**14)

    # Calculiere die Temperatur vom Sensor
    Readout[3] = Readout[3] & 0x3F
    temp = Readout[2]<<6 | Readout[3]
    Temperature = 165.0*temp/(2**14)-40
       
        print "Hrel: ", RelativeHumidity, " %"
        print "T: ", Temperature, " C"

        return RelativeHumidity, Temperature

MeasurementRequest()
time.sleep(0.2)

ReadMeasurement()

 

Eine Versuchsmessung über einen Tag und eine Nacht mit drei Sensoren hat folgendes Ergebnis geliefert. Hier sind die Temperaturwerte der Sensoren dargestellt. (Die Daten vom USB-Stick wurden mit Matlab importiert und daraus ein Plot erstellt.)

temperature_3sensoren

Raspberry als Datenlogger Teil1…Das Betriebssystem einrichten

Loading

Der Raspberry Pi ist ja mittlerweile ein bekannter und beliebter Scheckkartenplatinen-Computer mit dem sich allerlei anstellen lässt. Vom TV-Frontend mit Kodi, über Spielekonsolenemulatoren mit Retropi bis hin zum Bürorechner, ist damit fast alles möglich. In diesem Projekt möchte ich vorstellen, wie mit Hilfe des Raspberry Pi Model2 physikalische Größen wie Temperatur und Luftfeuchtigkeit gemessen und auf einem Speichermedium geloggt werden. Und zwar mit einem Feuchtesensor der Type HYT939 der am I²C Bus angeschlossen wird, genauer gesagt: mehrere I²C Feuchtesensoren am Bus…

DSC_4789Wir beginnen zuallererst mit der Versorgung des Raspberry PI. Im Bild ist ein Pi2 in ein einfaches Kunststoffgehäuse eingebaut und an eine 2Ah USB-Powerbank von RS-Components angeschlossen. Der Ladeanschluss der Powerbank ist vom Gehäuse nach aussen geführt. So kann der Pi wahlweise über die Powerbank (mit einer nicht rechenintensiven Anwendung bis zu 3h) oder über eine externe USB-Versorgung (z.Bsp. einem Handyladeadapter) betrieben werden. Der I²C Bus des PI (Pin 3 SDA und Pin 5 SCL sowie Pin 2,4 +5V und GND an Pin 6,14…) ist auf einen RJ Stecker im Gehäuse ausgeführt. Um später irgendwelche Statusmeldungen ausgeben zu können, sind zwei LEDs an die GPIOs 24 und 18 (an Pin18 und Pin12) angeschlossen. Ein weiterer GPIO wird über einen 22k Pulldown-Widerstand an einen Taster an 5V geschaltet. (GPIO23 an Pin16).

Für die USB Anschlüsse, Ethernet und HDMI wurden im Gehäuse passende Ausschnitte gemacht, an eine USB Schnittstelle ein Keyboard und an den HDMI Port ein Monitor angeschlossen. Die LAN Verbinung mit Internetzugang sollte auch hergestellt sein, um nach der Ersteinrichtung die benötigten Module und Updates laden zu können.

Jetzt fehlt nur noch das Speichermedium mit Betriebssystem. Der PI2 ist mit einem Micro-SD Slot ausgestattet. Ich habe hier eine 4GB Micro SD mit einem raspian-wheezy image bespielt. Um das Imagefile auf einfache Weise auf die SD-Karte zu bekommen, empfiehlt es sich, das Tool win32diskimager zu verwenden. Ist die Speicherkarte dann fertiggestellt, kann man beginnen.

Der Raspberry zeigt nach dem Einschalten kurz seinen Farbverlauf und dann beginnt auch schon der Bootprozess. Ist der dann beendet, so startet das OS am PI erstmal eine Setup-Routine.

Hier sind nun folgende Schritte durchzuführen:

  • im Menu internationalisation options unter I1 die entsprechenden locals einstellen -> DE_UTF_8
  • in advanced options unter A2… einen Hostname vergeben z.Bsp.:“raspisensor“, in A4… SSH enablen, in A7 …I²C enablen und „load per default“ und in A8 … „serial enable“ und „login shell“ aktivieren
  • dann noch expand  filesystem wählen damit der Speicherplatz der gesamten SD-Karte genutzt wird
  • jetzt noch mit finish -> reboot neu starten

Jetzt fährt der PI wieder hoch und bleibt beim Login-Prompt stehen. Mit login: pi und dem passwort: raspberry loggt man sich nun ein. Mit den folgenden Kommandos werden Updates und benötigte Module installiert:

sudo apt-get update
sudo apt-get install python-smbus    
(installiert den system management bus)
sudo modprobe i2c_bcm2708             (kernelmodule für I²C von Hand laden)
sudo modprobe i2c_dev
lsmod                                                         (geladene Module listen)
sudo i2cdetect -y 1                                  (I²C ports scannen)

Es empfiehlt sich, die Kernelmodule per Autostart zu laden. Das geht wie folgt:

sudo nano /etc/modules                        (mit dem Nano-Editor die Datei modules öffnen …)

dann folgende Zeilen hinzufügen:

i2c_bcm2708
i2c_dev

dann mit STRG+X den Editor beenden und bei Speichern JA wählen.
danach mit:

sudo nano /etc/modprobe.d/raspi-blacklist.conf

überprüfen, ob hier bereits ein Eintrag „blacklist i2c-bcm 2708“ existiert.
Falls ja, ist der auszukommentieren oder zu löschen.

jetzt wieder neustarten mit:

sudo shutdown -r now

danach wieder einloggen und mit

lsmod

überprüfen ob die gwünschten Module korrekt geladen sind.

Da wir später die Daten von den Sensoren in eine Datei loggen wollen und diese Datei auf einem USB-Stick gespeichert werden soll, sind folgende Schritte notwendig:

  • einen USB-Sick mit FAT32 Filesystem auf einem Windowsrechner formatieren
  • auf dem PI das Filesystem FAT32 installieren
  • den Stick in den PI stecken und die Mountlist um den Stick erweitern

Zuerst laden und installieren wir das Filesystem:

sudo apt-get -y install ntfs-3g hfsutils hfsprogs exfat-fuse

dann legen wir folgendes Verzeichnis an:

sudo mkdir /media/usbstick (usbstick dient hier als beispielname…)

sudo blkid -o list -w /dev/null

(listet die IDs der Datenträger auf -> unser Stick sollte in der Liste als vfat mit einer ID in dem Format XXXX-XXXX erscheinen)

sudo mount -t vfat -o utf8,uid=pi,gid=pi,noatime /dev/sda /media/usbstick

nun öffnen wir folgende Datei mit dem Editor:

sudo nano -w /etc/fstab

die ID des USB-Sticks von vorher tragen wir nun samt folgender Zeile ein und speichern dann wieder ab:

UUID=XXXX-XXXX /media/usbstick/ vfat utf8,uid=pi,gid=pi,noatime 0

weiter geht’s mit der Einrichtung der GPIOs und den Python libraries:

sudo apt-get install python-dev
sudo apt-get install python-rpi.gpio

Noch ein paar allgemeine Einstellungen:

sudo nano /etc/networks/interfaces  (Wir wollen eine fixe IP Adresse vergeben, um später einfach per SSH auf den PI zugreifen zu können)

folgende Zeile ersetzen:

iface eth0 inet dhcp

durch:

iface eth0 inet static
address xxx.xxx.xxx.xxx
netmask yyy.yyy.yyy.yyy
gateway zzz.zzz.zzz.zzz

und wieder speichern:

Das zu Anfang gestartete Setup Script lässt sich immer über folgenden Befehl aufrufen:

sudo raspi-config

Die Systemzeit des Raspi (für meine Anwendung benötige ich auch einen Zeitstempel) lässt sich mit folgendem Befehl stellen:

sudo date „MMTThhmmJJ“

Das war´s für den Anfang. Im zweiten Teil beschreibe ich dann die Sensorhardware und die Python-Scripts, die die Sensoren dann auslesen…

 

 

 

 

 

 

 

 

MiniSystem für NI-myDaq

Loading

IMAG1034
myDAQ mit miniSystem

Ein neues Stichwort  in den FH Studiengängen Systems Engineering, Wirtschaftsingenieurwesen und Maschinenbau ist „Blended Learning„.  Dabei stellte die Fachhochschule den Studierenden  kompakte, universelle Datenerfassungsgeräte von NI (National Instruments) zur Verfügung, die ihnen die eine praxisorientierte, effektive Lernmethode ermöglicht.  Bei den myDAQ (my DataAQuistion) Geräten handelt es sich um ein Gerät, das, an den USB-Port eines Rechners angeschlossen, eine Vielzahl von Möglichkeiten, Daten aufzunehmen bzw. auszugeben, bereitstellt.

Dies kann auf einfachste Weise mit der graphischen Programmier- und Entwicklungsumgebung LabView von National Instruments realisiert werden, aber auch in anspruchsvolleren Programmiersprachen wie C++, C#, etc. bis hin zu Assembler. Das myDaq-Kästchen stellt beispielsweise acht digitale IOs, zwei analoge Eingänge, zwei analoge Ausgänge, sowie eine symmetrische +/-15V Spannungsversorgung (die zumindest für die Versorgung von OP-Amps ausreicht) und eine +5V Spannungsversorgung zur Verfügung. Als besonderes Feature sind zwei 3,5mm Klinkenbuchsen vorhanden, die als Audio IN, bzw Audio OUT zu den AD- bzw DA- Chips geführt sind und für die Erzeugung und Aufzeichnung von Audiosignalen genutzt werden können. Des Weiteren sind drei Messgerätebuchsen eingebaut, die über einen Isolationsverstärker (max. 60V) das myDAQ auf einfache Weise zu einem Digitalmultimeter machen.

IMAG1032
miniSystem fertig bestückt

Die digitale und analoge IO-Sektion, sowie die Spannungsversorgung wird an das myDAQ über einen 20poligen Steckverbinder angeschlossen. Um den Studierenden nun eine Plattform bieten zu können, wurde ich beauftragt ein einfaches „miniSystem“ zu entwickeln, dass zumindest aus jedem Bereich (Analog und Digital) eine praktische Anwendung bereitstellt. So sollen die Zustände der digitalen Ausgänge in Form von LEDs dargestellt werden, analoge Spannungen von einem einstellbaren Spannungsteiler, bzw. einem Temperatursensor aufgenommen werden. Mit Hilfe des Layout Tools Eagle von CadSoft  habe ich die Schaltung erstellt und ein Layout gefertigt, das einfach an die myDAQ – Box angesteckt werden kann. Der Schaltplan kann hier eingesehen werden und das Boardlayout hier. Die Platine bietet auch die Möglichkeit an alle IOs über einen Pinheader eigene Schaltungen oder Experimente anzuschließen. Um die Analogausgabe darstellen zu können, habe ich ein Drehspulmesswerk gewählt.

Im folgenden Video ist zu sehen, wie das miniSystem nach der Bestückung im Testbetrieb auf Funktion geprüft wird.

 

 

 

Arduino als USB-Joystick

Loading

IMAG1861
Arduino als USB-Joystickinterface

Die große Welt der kleinen Microcontroller und vor allem der sehr günstigen Microcontroller und deren Vielfältigkeit, hat mich beim folgenden ‚Projektchen‘ wieder motiviert sie zu verwenden. Für die eher weniger outdoorlastigen kalten Wintertage habe ich mir ein Projekt vorgenommen, dass das Thema Retrocomputer betrifft. Zum einen habe geplant, die Website um die Rubrik der alten Computer zu erweitern (zumindest sollen die paar wenigen aus meiner Sammlung vorgestellt und in Betrieb genommen werden…) und zum anderen will ich mir eine Arcade-Station bauen, deren Kern das neue RaspBerry2 Modell ist . Auf dem soll die Emulatorplattform Retropie aus dem gleichnamigen Projekt zu Einsatz kommen. Die ersten Versuche mit den Images aus dem Projekt sehen sehr gut aus. Die alten 8-Bit und 16-Bit Computer laufen in der Emulation ausgezeichnet (C64, Atari, Amiga usw…). Was die Anbindung von Eingabegeräten betrifft, kann man natürlich Maus und Keyboard vom PC an den Raspberry anschliessen und alles steuern. Die Jungs aus dem Projekt haben auch selbst einige Boards entwickelt, die die Anbindung von Joysticks und co an des Raspberry ermöglichen. (zB. den GPIO Adapter). Aber da ich ein paar Arduino Unos herumliegen habe, dachte ich mir, warum nicht diese verwenden. Da es beim Arduino möglich ist, den Mega 16U2 zu flashen (der Chip wird als Programmer für den Atmega 328 auf dem Uno – Board verwendet) und aus dem Uno-Board so zum Beispiel ein USB-HID (Human Interface Device) zu machen -sprich Keyboard, Mouse, was auch immer, bot sich der als ideale Plattform an.

Tutorials, den Arduino zu einem HID-Interface zu flashen, gibt es mittlerweile schon sehr viele. Zum Beispiel findet man hier eine schöne Anleitung. Je nach dem welche Arduino-Uno Boardversion man hat, kann man sich den zusätzlichen Widerstand fürs DFU-Flashen sparen. (z.Bsp. bei meinen Boardversionen R3 ist der Widerstand nicht nötig.) Auf den neuen Boards ist auch nicht mehr der Atmega 8U2 verbaut, sondern der 16U2. Man muß einfach im Atmega Flash-Tool „ATMEL-FLIP“ den entsprechenden Chip auswählen. Die entsprechenden Firmwarefiles findet man im Netz…

Arduino-keyboard-0.3.hex
Arduino-mouse-0.1.hex

Ist der Arduino dann geflasht, so wird er beim Anschluss an den PC eben als Keyboard oder Maus erkannt. Jetzt braucht man nur mehr den gewünschten Code in den Atmega328 zu schreiben und die Arduino UNO Eingänge führen z.Bsp. Tastaturbefehle aus. Um die Firmware jetzt nicht jedes Mal zwischen Programmer und USB-HID zu ändern, verwende ich einfach einen zweiten UNO der als Programmer dient und stecke einfach den geflashten Chip immer um (ist viel einfacher beim Testen).

Da das Interface jetzt soweit passt, habe ich mich mit dem HID-Codetable beschäftigt und die entsprechenden Tasten, die die Joystickbewegungen an den PC senden sollen herausgesucht.

Hier der sehr einfache Code der momentan die alten Commodore Joystickbewegungen umsetzt:)

/* HID Joystickinterface für Arduino UNO im HID Modus
 Jun2015 by I.Bihlo
 Die Tasten brauch i  Taste/Hexcode/Dec-Code  
  KEY_LEFT_CTRL    0x01  //01 
  KEY_LEFT_SHIFT    0x02  //02 
  KEY_LEFT_ALT    0x04  //04 
  KEY_LEFT_GUI    0x08  //08 
  KEY_RIGHT_CTRL    0x10  //16 
  KEY_RIGHT_SHIFT 0x20  //32 
  KEY_RIGHT_ALT   0x40  //64 
  KEY_RIGHT_GUI   0x80  //128 

  KEY_RIGHT_ARROW 0x4F  //79 
  KEY_LEFT_ARROW  0x50  //80 
  KEY_DOWN_ARROW  0x51  //81 
  KEY_UP_ARROW    0x52  //82 
  KEY_TAB         0x2B  //43 
  KEY_ENTER       0x28  //40 
  KEY_SPC         0x2C  //44 
 */ 
     uint8_t keyNone[8] = { 0, 0, 0, 0, 0, 0, 0 }; 
     uint8_t keyA[8] = { 0, 0, 4, 0, 0, 0, 0 };  //left 
     uint8_t keyD[8] = { 0, 0, 7, 0, 0, 0, 0 }; //right 
     uint8_t keyW[8] = { 0, 0, 26, 0, 0, 0, 0 }; //up 
     uint8_t keyS[8] = { 0, 0, 22, 0, 0, 0, 0 }; //down 
     uint8_t keySPACE[8] = { 0, 0, 44, 0, 0, 0, 0 }; //space 
      
     uint8_t keyLEFT[8] = { 0, 0, 80, 0, 0, 0, 0 };  //left 
     uint8_t keyRIGHT[8] = { 0, 0, 79, 0, 0, 0, 0 }; //right 
     uint8_t keyUP[8] = { 0, 0, 82, 0, 0, 0, 0 }; //up 
     uint8_t keyDOWN[8] = { 0, 0, 81, 0, 0, 0, 0 }; //down 
     uint8_t keyENTER[8] = { 0, 0, 40, 0, 0, 0, 0 }; //enter 
      
 // DEFINE inputs 
 const int UPA = 12; 
 const int DOWNA = 13; 
 const int LEFTA = 2; 
 const int RIGHTA = 3; 

 const int UPB = 4; 
 const int DOWNB = 5; 
 const int LEFTB = 6; 
 const int RIGHTB = 7; 

 int out=0; //fürs Testen am Serial Monitor im Programmermodus 

 void setup() { 
    
   // Die Pins als Eingang definieren (Intern PullUP setzen - ist bei mir nötig da actice Low geschaltet wird 
   pinMode(UPA, INPUT_PULLUP); pinMode(DOWNA, INPUT_PULLUP); pinMode(LEFTA, INPUT_PULLUP); pinMode(RIGHTA, INPUT_PULLUP);  
   pinMode(A0, INPUT); 
   pinMode(UPB, INPUT_PULLUP); pinMode(DOWNB, INPUT_PULLUP); pinMode(LEFTB, INPUT_PULLUP); pinMode(RIGHTB, INPUT_PULLUP);  
   pinMode(A1, INPUT);    
    
   Serial.begin(9600); 
    
 } 

  void loop() { 
     
    // Joystickbewegungen abfragen und senden 
    // Da das Interface einen Invert-Schmitt Trigger verpasst bekommen hat, werden die Ausgänge auf active LOW abgefragt - wenn nix passiert sind alles Eingänge HIGH 
     
    if (digitalRead(UPA)==LOW) {out=120; Serial.write(keyW, 8);}   
      
    if (digitalRead(DOWNA)==LOW) {out=121; Serial.write(keyS, 8);}   
      
    if (digitalRead(LEFTA)==LOW) {out=122; Serial.write(keyA, 8);}  
      
    if (digitalRead(RIGHTA)==LOW) {out=123; Serial.write(keyD, 8);}  
     
    if (digitalRead(A0)==LOW) {out=124; Serial.write(keySPACE, 8);}  
      
     
    if (digitalRead(UPB)==LOW) {out=130; Serial.write(keyUP, 8);}  
      
    if (digitalRead(DOWNB)==LOW) {out=131; Serial.write(keyDOWN, 8);}  
       
    if (digitalRead(LEFTB)==LOW) {out=132; Serial.write(keyLEFT, 8);}  
       
    if (digitalRead(RIGHTB)==LOW) {out=133; Serial.write(keyRIGHT, 8);}  
       
    if (digitalRead(A1)==LOW) {out=134; Serial.write(keyENTER, 8);}  
      
  delay(20);   
  //Serial.println(out); //des is nur fürs debuggen im serial monitor 
  Serial.write(keyNone, 8); // den Tastendruck beenden 

 delay(20); 
}
IMAG1858
Lochrasterplatine am Arduino

Als nächstes habe ich ein Interfaceboard (eine einfache Lochrasterplatine) mit zwei 9-poligen SUB-D-Buchsen für den Anschluss der Joysticks gebastelt. Da der Arduino genügend Ports besitzt, habe ich auf ein Multiplexen oder Matrixverschalten der insgesamt zehn Steuerleitungen verzichtet und jeden Joystickkontakt direkt auf einen Port gelegt. Das funktioniert schon einmal ganz gut. Aber das Prellen der Federkontakte und Microtaster in den Joysticks muss natürlich softwaremäßig entfernt werden. Um jetzt nicht in jeder Softwareversion einen debounce-code mitzuführen entschloss ich mich das Entprellen in der Hardware zu machen. Einfach ein RC-Glied (10k – 1uF) an einen Schmitt-Trigger und gut ist´s. Also schnell ein Board gelayoutet (das geht schneller als am Lochrasterprint zu löten), geätzt und bestückt… und heraus kam das Board hier:

IMAG1870
Board geätzt und gebohrt
IMAG1871
fertig bestückt am Arduino

Der Funktionstest verlief positiv. Die Bewegungen des Sticks werden sauber umgesetzt. Ein schneller Test mit WinVice ließ sofort das Zockergefühl von vor 30 Jahren aufkommen 😉

Die Binäruhr

Loading

Im Rahmen der beruflichen Tätigkeit ist, als Bausatz für FH-Veranstaltungen und Schnuppertage für Schüler konzipiert, eine Uhr entstanden. Diese Uhr zeigt die Zeit aber nicht in analoger Form, mit Zeigern, auch nicht in digitaler Form, mit Siebensegment- oder LCD-Anzeige an, sondern mit Leuchtdioden im Dualen Zahlensystem.

Man kennt solche Uhren schon in vielfachen Ausführungen (als Binäruhren). Es gibt sie mittlerweile bereits auch als Armbanduhr. Das bedeutet, die Zeit wird nicht als Ziffer, sondern als Leuchtcode einer Reihe von Leuchtdioden angezeigt. Der Leuchtcode wird nach dem dualen (binären) Zahlensystem auf der Basis 2 ermittelt. Dieses Zahlensystem ist der Standard in der Digitaltechnik, da hier mit dem Zustand „0“ und „1“ (AUS und EIN, oder LOW und HIGH, oder Spannung, keine Spannung, oder eben Leuchtdiode LEUCHTET, oder LEUCHTET NICHT) gearbeitet wird. Die Tabelle zeigt die Funktionsweise des binären Zählens. So kann zum Beispiel mit 4 Bit (zB. 4 Leuchtdioden) eine Dezimalzahl von 0 (alle AUS) bis 16 (alle EIN) also 2^4 (2hoch4) dargestellt werden.

Bit3
(2^3)
Bit2
(2^2)
Bit2
(2^1)
Bit0
(1^0)
Dezimal
AUS AUS AUS AUS 0
AUS AUS AUS EIN 1
AUS AUS EIN AUS 2
AUS AUS EIN EIN 3
AUS EIN AUS AUS 4
AUS EIN AUS EIN 5
usw…        
IMAG1730
Die Frontseite der Binäruhr

Eine Uhr mit der Darstellung der Zeitinformation mit Reihen von Leuchtdioden habe ich hier gebastelt. Die LED-Reihen zur Anzeige sollten im Kreis angeordnet werden, um die Uhr im ersten Blick nicht als Binäruhr zu erkennen. Sie sollte aussehen wie eine herkömmliche Uhr, wo anstelle der Zeiger einfach Leuchtdioden im Kreis laufen. Eine tolle Umsetzung der Frontplattenbeschriftung- und grafik hatte hier ein Kollege aus dem Grafikdesign.

Von der elektronischen Seite her, habe ich einen MEGA8 Microcontroller von Atmel eingesetzt, der die insgesamt 18 Leuchtdioden über ein 6×3 Multiplexing angesteuert. Dabei werden 5 Leds für die Anzeige der Stunden, 6 Leds für die Anzeige der Minuten und 6 Leds für die Anzeige der Minuten verwendet. Die verbleibende Led dient zu Anzeige eines „Betriebsmodus“ (Läuft die Uhr oder ist sie im Einstellmodus).

schaltplan
Schaltplan der Uhr

Ein weiterer Ausgang dient zur Ansteuerung eines kleinen Lautsprechers (für. akkustische Ausgaben wie Wecker etc.). Zwei Ports des uC dienen als Eingänge für einen Konfigurationstaster und einen Kontakt für einen Schüttelschalter. Der Schüttelschalter kann dann beispielsweise als Quittierung des Alarms eingesetzt werden.

Die Stromversorgung kommt praktischerweise von einer USB-Quelle, die mittlerweile jeder irgendwo zur Verfügung haben sollte.

IMAG1734
Fertig zusammengebaute Binäruhr

Das Layout und der Aufbau der Schaltung wurde im Design ausschließlich mit bedrahteten Bauteilen erstellt, um einen einfachen und unkomplizierten Zusammenbau zu realisieren. Die Software selbst wurde mit AVR Studio und dem WINAVR Compiler erstellt. Der Uhrentakt wird durch Teilen der internen Oszillatorfrequenz (gesetzt auf 1MHz) des Microcontroller erreicht. Das ist zwar nicht die genaueste Variante, funktioniert aber auch und spart einen weiteren Taktgenerator. Die Platine selbst wird nach dem fertigen Bestücken in einen gebogenen Kunststoffwinkel gesteckt, der mit dem cool designten Weckerlogo auf der Frontseite beklebt ist. Das Einstellen der Uhr- und Weckzeit kann einfach durch einen auf der Rückseite der Platine angebrachten Taster realisiert werden…

IMAG1727
Uhrenplatine bestückt

 

 

 

 

 

Die Fertigungsdaten kann man hier herunterladen. Darin befinden sich die Gerberdaten und das hex-file zum Flashen des ATmega8.

Neues aus dem Labor

Loading

IMAG1500
Microchip unter Mikroskop ca. 1x1mm mit Anschlussleitungen

Eigentlich gehört es nicht in einen Retroblog. Es hat nämlich nichts mit „Retro“ zu tun. Es ist brandaktuell. Und worum es geht, ist den nächsten paar Zeilen zu entnehmen.

„ES“ ist ein Einblick in das SI-Labor (SI=Systems Integration) und was wir hier so machen.

 

IMAG1425
Bondgerät mit 17um Draht

Im Rahmen eines aktuellen Projektes des Interact Josef Ressel Centers (siehe Projektwebsite) wurden in unseren Labors Platinen zur Messung und Spezifikation von Microchips entworfen. Ebenso werden die vom Team der Interact-Gruppe, unter Leitung von Hrn. Dr. Sturm hergestellten Microchips mit einem sogenannten Wedge- bzw- Ballbondgerät mit Golddrähten zur Leiterplatte verbunden. Die Drähte haben dabei einen Durchmesser von 17um (=0,017mm) bzw. 25um(=0,025mm).

IMAG1523
Needleprober mit zwei Prüfspitzen

Nachdem die alle benötigten Kontakte des Chips mit der Platine verbunden sind, können erste Messungen durchgeführt werden. Um möglichst genaue Messwerte vom Chip zu erhalten, werden ganz kritische Signale mit kalibrierten Prüfspitzen direkt vom Chip abgenommen bzw. eingespeist. Würden die Messsignale über die Leitungen der Printplatte geführt, so können verschiedene elektrische und physikalische Effekte (parasitics) die Messwerte erheblich verfälschen. Das Messen direkt am Chip passiert natürlich unter dem Mikroskop mit einem sog. Needleprober. Da hier alles manuell von Hand eingestellt wird, ist höchste Präzision und Konzentration angesagt. Eine kleine Unachtsamkeit oder Vibration kann die mehrere tausend Euro teuren Prüfspitzen sofort zerstören.

IMAG1526
Prüfspitzen auf Chip aufgesetzt. Oben sieht man die Bonddrähte

Nachdem nun die Messungen am Chip direkt durchgeführt worden sind, kann die Printplatte selbst gemessen werden. Ihre Charakteristik wird dann in die gesamte Messung einbezogen (deembedding).

Die Printplatte selbst ist aus sehr dünnem und ziemlich flexiblem Material. Das ist aber für weitere Messungen nicht von Vorteil. Da hier oft viele Kabel und Leitungen angeschlossen werden, würde sich die Platine von Messung zu Messung anders biegen. Das wiederum beeinflusst auch schon wieder die Ergebnisse. Also haben wir mit dem Gedanken gespielt, für die Platine einen Rahmen, oder ein Gehäuse zu fräsen. Da dieses mechanisch auch wieder sehr filigran und umständlich herzustellen ist, hat unser 3D-Printer Spezialist Herr DI Mario Wehr (Website) die Produktion mit eben einem 3D-ABS-Drucker angeboten.

Die Ergebnisse können sich sehen lassen. Um dem Gehäuse eine RF-Schirmung zu verpassen, wird es mit einem leitfähigen Lack überzogen…

IMAG1640
1.Versuch – Prüfung der Maßhaltigkeit
IMAG1643
2. Versuch mit Platine (noch ein paar Änderungen nötig)
IMAG1646
3. Versuch (Die Boards sind verbunden)

Terrariumcontroller

Loading

DSCN8112Als sich von Seiten der Freundin vor einigen Jahren die Frage nach einem Haustier stellte, begann das Grübeln, welches Tier es denn sein sollte. Da wir beide berufstätig sind, kommen Tiere wie Hund, Katze, etc. nicht in Frage. Es bleiben nur Tiere, die in Aquarien oder Terrarien leben, übrig. Da zu diesem Zeitpunkt ein Bekannter gerade ein Reptiliengeschäft führte, statteten wir ihm einen Besuch ab und gingen schlussendlich mit einer Königspython nach Hause. So beschäftigten wir uns nun intensiv mit der artgerechten Haltung des Reptils und bauten ein Terrarium. Die Heizung sollte eine Wärmelampe mit breitem Spektrum übernehmen. Als zusätzliche Lichtquelle sollte noch eine Ledleiste dienen.

Nun ging es an die Steuerung bzw. Regelung des Terrariumklimas. Die bis dahin eher provisorische Steuerung bestand lediglich aus einer mechanischen Zeitschaltuhr und einem einfachen Dimmer, der die Leistung der Wärmelampe festlegte. Um das zu verbessern, entschloss ich mich, eine kleine Steuerung zu bauen, die alle diese Aufgaben übernimmt. Sie sollte folgende Eigenschaften haben:

  • Messen der Temperatur im Terrarium
  • Messen der Luftfeuchtigkeit im Terrarium
  • Regeln der Temperatur auf einen Sollwert (Dies soll durch die Leistungregelung der Wärmelampe mittels Phasenanschnitt geschehen)
  • Die Lichtsteuerung nach programmierbaren Schaltzeiten übernehmen
  • Alle Informationen in einem Display anzeigen
image
Skizze des Blockschaltbildes

Daraus enstand schnell ein Blockschaltbild das einen Überblick über die zu entwerfende Hardware gab:

Nun begann der Entwurf eines Schaltplanes. Als zentrale Einheit sollte ein Microcontroller der Firma Microchip dienen. Genauer gesagt verwendete ich einen PIC16F877 in DIL Bauweise für die Hauptaufgaben und etwas umständlich einen weiteren Microcontroller (16H628) als Zeitgeber für die Uhr. Hier wäre es sicher sinnvoller gewesen, eine RTC zu verwenden, jedoch hatte ich die uC´s da. 🙂

Über einen PWM-Ausgang des PIC wird ein Phasenanschnittdimmer gesteuert, der mittels Optodiac den Leistungstriac steuert. Der Spannungsnulldurchgang der Netzspannung, also die Synchronisierung für den Triac, wird von der Sekundärseite des Netztransformators entnommen und mit einer OPAmp Verstärkungs- und Komparatorschaltung in die Ansteuerung eingebunden.

Zwei direkt schaltbare Relais sollen weitere Verbraucher, wie Ledleiste oder Ultraschallvernebler ansteuern. Über  Reedkontakte an den Glasschiebetüren des Terrartiums sollen geöffnete Türen gemeldet werden. Die Zeit bis zur Auslösung eines akustischen Alarmes soll einstellbar sein.

Als Istwertgeber wird ein Feuchtesensor und ein Temperatursensor in das Terrarium verlegt und an entsprechende Analogeingänge des µC geschaltet. Ein LC-Display soll den Status der Anlage anzeigen und in entsprechenden Menues Einstellungen über Tasten ermöglichen.

schematic_rev1
Schaltplan des Controllers
terraboard_rev1
Layout des Controllers

 

 

DSCN8114
fertig bestückte Platine
DSCN8109
Board im Gehäuse eingebaut
DSCN8111
Gehäusedeckel mit Display und Tasten
DSCN8113
Sensorboard

 

Radio im Retrolook – Das Finale

Loading

IMAG1299
Das Holzgehäuse ist lackiert

Nachdem jetzt die Frontplatte gefräst ist, kann sie gereinigt und die Gravuren mit schwarzem Lack versehen werden. Nach dem Antrocknen des Lacks in den Vertiefungen der Gravur, wird die überstehende Farbe mit Lösungsmittel entfernt. Nun konnte die gesamte Platte mit Klarlack lackiert werden.

Während die Lackierung der Frontplatte trocknet, ist wieder das Holzgehäuse an der Reihe. Die Montagelöcher für die Platinen, Lautsprecher usw. wurden gebohrt und anschliessend das Holz mit einer etwas dunkleren Holzbeize eingelassen. Nach dem Trocknen derselben bekommt auch das Holzgehäuse einen Klarlacküberzug.

Im nächsten Schritt werden die Bedienelemente (Schalter und Drehimpulsgeber), sowie das LC-Display an der Frontplatte angebracht. Die ausgefrästen Stege für die Lautsprecherverkleidung werden mit schwarzem Stoff hinterlegt. (Für den Stoff musste ein T-Shirt herhalten).

IMAG1307
Bedienelemente an der Frontplatte

 

Die Lackierung des Gehäuses trocknete cirka einen Tag. Nun kann mit dem Montieren der Lautsprecher und der Platine begonnen werden.

IMAG1301
Einbau der Lautsprecher

 

Die Platine wird mit Abstandhaltern am Gehäuseboden verschraubt.

IMAG1302
Montage der Platine

 

Jetzt fehlt noch eine geeignete Stromversorgung. Hierzu wurde ein kleines Netzteil gebaut, das lediglich aus einem Eisenkerntransformator mit anschließender Gleichrichtung, Glättung und Spannungsstabilisierung mit einem LM7809, also 9V DC, besteht. Dafür wurde eine kleine Platine gefertigt (ca. 5x8cm) und ebenfalls in das Gehäuse mit Abstandhaltern eingebaut.

IMAG1328
Netzteil 240V AC auf 9V DC bei max. 350mA

 

Nachdem nun alles zusammengebaut ist, werden die Verstärkersymetrien und Pegel nochmals mit Signalgenerator und Oszilloskop eingestellt und optimiert.

IMAG1332
Einstellarbeiten

 

Der fertige Radioempfänger sieht nun von der Frontseite so aus…

IMAG1308
Radio von vorne

 

und die Geräterückseite ist im nächsten Bild dargestellt:

IMAG1333
Rückseite

In dem kurzen Video ist das Radio im Betrieb zu sehen:

Umgeben von Radioaktivität ?

Loading

Nach dem Eigenbau des Geiger-Müller-Zählers und den damit verbundenen Versuchen, ist mir aufgefallen, dass sich doch das eine oder andere radioaktive Element in unserer Umgebung befindet.

Mit dem SOEKS 01M Geigerzähler, einem industriell gefertigten Gerät, habe ich nun wieder Gegenstände in der Umgebung „gescannt“.

IMAG1289
SOEKS 01M

Wieder musste ich feststellen, dass einige der alten Uhren meiner Sammlung, mit radiumbemalten Ziffernblättern ausgestattet sind. Der SOEKS zeigt hier eine Strahlenbelastung von ca. 1,11 microSievert pro Stunde. Die Umgebungsbelastung wird mit ca. 0,14 uSv/h angezeigt.IMAG1290

Doch in der Küche meiner Mutter fand ich eine schöne, bunte alte Vase, bei der knapp 10uSv/h angezeigt wurden. (Das Ding steht jetzt in der hintersten Kellerecke).

Dabei dürfte es sich um Uranfarbe handeln. (Orange/Rote Bemalung im Video unten zu sehen)

 

Radio im Retrolook – Update: Das Gehäuse

Loading

IMG-20150130-WA0000-2Es ist soweit! Das erste Bild des absolut echten Holzgehäuses für die Radioelektronik ist da. Ein wunderschön gefertigtes, aus geleimten Elementen aufgebautes Gehäuse. Dieses Werk stammt aus Gebhard’s  Händen, einem Meistertischler aus dem Oberkärntner Raum 😉

IMAG1272
Gehäuse mit Bohrungen für die Lautsprecher

Jetzt kann das Nostalgie-Radioprojekt wieder einen Riesenschritt nach vorne machen.

frontpanel
Das wird die Aluminiumfrontplatte

Das Gehäuse steht bei uns auf dem Tisch. Zuerst wurden die Löcher für die Lautsprecher gebohrt. Später sollen diese von einer gefrästen Aluminiumblende abgedeckt sein. Also ist der nächste Schritt das Konstruieren der Fräsdaten für die Frontblende. Hier wird wiederum mit dem Layouttool „Eagle“ gearbeitet. Die Daten können einfach als „.dxf“ Datei exportiert  und in die Fräsbohrplottersoftware importiert werden.

 

UPDATE:
Kaum einige Minuten Zeit, machte ich mich auf zum Fräsbohrplotter, importierte die Produktionsdaten, spannte den „Zweischneiderfräser“ ein, natürlich auch den Aluminiumrohling und schon ging’s los.

Die Drehzahl für den 1mm Fräser habe ich mit 60000 U/min gewählt und die Vorschubgeschwindigkeit auf 1,5mm/s in beiden Achsen eingestellt. Gekühlt und geschmiert wurde übrigens mit Spiritus.

Ein nicht zu vernachlässigender Arbeitsaufwand ist übrigens die Reinigung der Anlage nach der erledigten Arbeit… 🙂IMAG1281