Dieses Blog durchsuchen

Geigerzähler - die Software

Wie vor längerer Zeit im Blog angekündigt, soll der Geigerzähler nun eine Software bekommen, die nicht nur die Pulse des Zählrohres zählt, sondern sie auch auf eine Einheit bezieht. Hierzu waren aber noch kleine Änderungen an der Hardware notwendig. (genauergesagt habe ich andere Pins des Arduino verwendet - was bedeutet: Leiterbahnen durchtrennen und mit Schaltlitzen neu verlegen). Hier eine Liste der Änderungen:





  • die Leitung von Pin4 Arduino zu Pin D7 vom LCD unterbrechen
  • die Leitung von Pin5 Arduino zu Pin D6 vom LCD unterbrechen
  • D7 vom LCD an Pin12 vom Arduino verbinden
  • D6 vom LCD an Pin13 vom Arduino verbinden
  • der Zählimpuls wird von TP3 auf Arduino Pin4 geschaltet
  • die Verbindung TP3 zu Arduino Pin23 wird getrennt

Daraus ergibt sich folgende I/O Port/Pin Belegung:
LCD Display:
RS - Ardunio PIN18 - Arduino  I12
EN - Arduino PIN17 - Arduino  I11
D4 - Arduino PIN11 - Arduino  I5
D5 - Arduino PIN6  - Arduino  I4
D6 - Arduino PIN13 - Arduino I7
D7 - Arduino PIN12 - Arduino  I6
Weitere Pins:
COUNT - Arduino PIN4 - Arduino I2
BUZZ - Arduino PIN14 - Arduino I9
STATUS - Arduino PIN3 - Arduino I1
SET - Arduino PIN2 - Arduino I1

Hier der Arduino Code:
 /* Geiger Vx.1 geändertes pinning  
 * Pinzuordnungen allgemein für LCD  
 * RS to IO12 (pin18)  
 * EN to IO11 (pin17)  
 * D4 to IO5 (pin11)  
 * D5 to IO4 (pin6)  
 * D6 to IO7 (pin13)  
 * D7 to IO6 (pin12)  
 * R/W to ground  
 * VSS to ground  
 * Pinzuordnungen für Counter  
 * count to IO2 (ic pin4) = INT0  
 * buzzer to IO9 (ic pin15)  
 */  
 // include libraries  
 #include <LiquidCrystal.h>  
 // interfacepins initialisieren  
 LiquidCrystal lcd(12,11,5,4,7,6);  
 // Dosiskobersionsfaktor - CPM to uSV/h  
 #define dconv 0.007 //(ca Umrechnung aus Diagramm Datenblatt des ZP1400 Zählrohrs)  
 // Konstanten Hardware I/Os  
 const int buzzerpin = 9;  
 const int geiger_input = 2;  
 const int keystat = 0;  
 const int keyset = 1;  
 // Variablen  
 long count = 0;  
 long countPerMinute = 0;  
 long timePrevious = 0;  
 long timePreviousMeassure = 0;  
 long time = 0;  
 long countPrevious = 0;  
 float radiationValue = 0.0;  
 void setup(){  
 pinMode(geiger_input, INPUT);  
 Serial.begin(19200);  
 //setup LCD und Begruessungsanzeige  
 lcd.begin(8, 2);  
 lcd.clear();  
 lcd.setCursor(0, 0);  
 lcd.print(" Geiger ");  
 lcd.setCursor(0,1);  
 lcd.print("Counter ");  
 delay(1000);  
 lcd.clear();  
 lcd.setCursor(0, 0);  
 lcd.print("V0.0 beta");  
 delay(1000);  
 lcd.clear();  
 lcd.setCursor(0,1);  
 lcd.print("ibiretro");  
 delay(500);  
 for (int i=0;i<8;i++){  
 delay(200);  
 tone(buzzerpin,i*100,100);  
 lcd.scrollDisplayLeft();  
 }  
 delay(500);  
 lcd.clear();  
 lcd.setCursor(0, 0);  
 lcd.print("CPM=");  
 lcd.setCursor(4,0);  
 lcd.print(6*count);  
 lcd.setCursor(0,1);  
 lcd.print(radiationValue);  
 attachInterrupt(0,countPulse,RISING);  
 }  
 void loop(){  
 if (millis()-timePreviousMeassure > 10000){  
 countPerMinute = 6*count;  
 radiationValue = countPerMinute*dkonv;  
 timePreviousMeassure = millis();  
 lcd.clear();  
 lcd.setCursor(0, 0);  
 lcd.print("CPM=");  
 lcd.setCursor(4,0);  
 lcd.print(countPerMinute);  
 lcd.setCursor(0,1);  
 lcd.print(radiationValue,4);  
 lcd.setCursor(6,1);  
 lcd.print(" uSv/h");  
 /* zum debuggen   
 Serial.print("cpm=");Serial.print(countPerMinute,DEC);  
 Serial.print("uSph=");Serial.println(radiationValue,4);  
 */  
 count = 0;  
 }  
 }  
 void countPulse(){  
 detachInterrupt(0);  
 count++;  
 tone(buzzerpin,1000,10);  
 while(digitalRead(2)==1){  
 }  
 attachInterrupt(0,countPulse,RISING);  
 }  

Retro Controller ganz neu


NES - Nintendo Entertainment System ist sicher auch noch vielen ein Begriff. Es war die 8-Bit Spielekonsole der Firma Nintendo, die Mitte der 80iger Jahre auch in Europa verkauft wurde und die Jugend der Zeit geprägt hatte. Mittlerweile ist sie doch ein Museumsstück, das bereits den Titel "Retro" verdient. Vielleicht auch aus diesem Grund, beginnt sie in der Retrogamergemeinde wieder aufzuleben. So soll beispielsweise noch dieses Jahr ein Remake der NES in miniaturisierter Form mit moderner Technik und vorinstallierten Spielen auf den Markt kommen.

Auch über Emulatoren für alle möglichen Plattformen kann man die alten NES Spieletitel wieder zum Leben erwecken. Um diese Spiele auch "artgerecht" bedienen zu können, (natürlich geht es auch mit der PC Tastatur oder über den Touch-Screen am Handy) hat das Unternehmen 8Bitdo Tech den NES30 GamePad Controller auf den Markt gebracht. Es handelt sich dabei um einen Wireless Bluetooth Controller der exakt dem originalen NES Controller nachempfunden wurde. Er ist mit einem Integrierten Akku ausgestattet, der über eine MicroUSB Kabelverbindung geladen werden kann. Der Controller ist so konstruiert, dass er sowohl als PC-Gamecontroller, als Joystick, als Bluetooth-Keyboard und als USB Joystick konfiguriert werden kann. Das lässt sich über fünf unterschiedliche Modes realisieren. Diese Modes können durch Tastenkombinationen während des Einschalten ausgewählt werden. Die Tabelle unten zeigt die unterschiedlichen Modi:

Mode1Mode2Mode3Mode4Mode5
JoystickBT-KeyboardiCadeEmu-TouchUSB-Joystick
Power ONSTARTSTART+BSTART+ASTART+XKabelverbindung
Blaue LED blinken1x2x3x4x-
OSWIN AndroidWIN/Apple AndroidAndroid AppleAndroid AppleWIN



Im Bild ist die USB-Ladebuchse zu sehen, rechts davon sind zwei Status-LEDs 

auf der Rückseite der Platine ist der Akku untergebracht


die Platine des Controllers; der die Firmware des Mikrocontrollers kann aktualisiert werden

Kontaktmatten stellen die Tasten dar. Unter den beiden Schultertasten liegen echte Mikrotaster ...

Hier wird der Emulator "NES Emu" auf einem Android-Handy mit dem NES30 bedient ;)



VFD - Uhrenbausatz

Uhren und Zeitmessgeräte, auch die nicht-mechanischen, gehören zu meinen Interessengebieten. Vor allem, wenn die Uhrzeit  mit optisch schönen Anzeigen dargestellt wird, bin ich Feuer und Flamme. Dazu zählen Nixie-Anzeigeröhren und auch die VFD-Röhren. Über letztere handelt dieser Blogeintrag. Hier hat Herr Günter Rother (www.grother.de) einen sehr schönen Bausatz zusammengestellt, der schnell und einfach zusammen zu setzen ist. Es sind alle zum Aufbau benötigten Teile enthalten und man kann gleich loslegen.



Auf einer zweiseitigen, gelayouteten und mit Lötstoplack versehenen Platine mit den Abmessungen 100x50 mm findet die Uhrenschaltung Platz, bei der als Anzeige für jede Ziffer je eine 7-Segment VFD-Röhre verwendet wird. VFD bedeutet hier Vakuum-Fluoreszenz-Display. Die Funktionsweise ist hier nicht wie bei Nixieröhren eine Glimmentladung, sondern wie bei Elektronenröhren, eine, von einer direkt beheizten Kathode emittierte Elektronenwolke, die auf einer Leuchtschicht - Anode (Phosphor) auftrifft. Die Spannung zwischen Kathode und Anode liegt hier üblicherweise zwischen 20V und 50V. Mit einem Steuergitter vor den Segmenten können die Elektronen gezielt gebremst werden. Somit ist eine Ansteuerung einzelner Segmente möglich.


Treiberbaustein für die IV-3 VFD-Röhre ist ein LB1240 Display Tube Driver IC, der acht voneinander unabhängige Darlingtonstufen beinhaltet. Jeder Ausgang ist in der Lage 30mA bei maximal 55V zu treiben. Die Eingänge des LB1240 werden über einen Atmel AT89C2051-12PU angesteuert und mittels vier Transistoren wird jede Röhre per Multiplexing geschaltet. Getaktet wird der Atmel mit 11.0592Mhz. Ein DS18B20 Temperatursensor ist ebenfalls in den Bausatz integriert, um auch die Temperatur anzeigen zu können. Der DS18B20 ist ein 1-Draht Digital-Temperatursensor, einstellbar  in 9 bis 12 Bit-Auflösung   an 5V Spannungsversorgung und mit einer Ansprechzeit von 94ms bis 750ms, je nach Auflösung. Der Mikrocontroller ist bereits mit der Firmware für die Uhr geflashed und direkt einsatzbereit. Die IC´s sind gesockelt, 1/25W Kohleschichtwiderstände auf Band und sogar alle Schrauben, Abstandhalter und vorgefertigte Acrylglasplatten für ein finales Gehäuse sind vorhanden.


Die gesamte Schaltung wird mit einem 50Hz Steckernetzteil mit konventionellem Eisenkerntransformator versorgt. Die Spannungen an Board werden mit einem 7905 Linearregler für die 5V und einem fertigen DC/DC Convertermodul (Step-UP-Wandler) für die ca.30V Anodenspannung erzeugt. Bedient wird die Uhr über zwei Mikrotaster, mit denen Stunden und Minuten eingestellt werden können.
Ein kurzes Video über den Zusammenbau und die fertige Uhr kann hier angesehen werden:




Guter Ton mit Raspberry PI



Nach schon einigen Projekten und Versuchen mit dem Raspberry PI, bin ich immer wieder einmal auf die Problematik mit der schlechten, verrauschten Tonqualität des Raspi-Audioausgangs gestoßen. Der analoge Ton besteht ja nur aus einem einfachen PWM (PulseWidthModulation) Signal, das über ein paar Filtercaps direkt an die Klinkenbuchse des Raspberry geschaltet ist. Für viele Anwendungen reicht das sicherlich, wenn man nur eben einmal ein paar Töne ausgeben will. Soll´s aber Musik sein, oder wie in meinem Fall ein vernünftiger Ton bei der Retro-Gamestation, die mit "retropie und der EmulationStation" läuft, so reicht die Qualität einfach nicht aus.
Hier sollte man dem Raspberry PI einen richtigen Soundchip, also Soundkarte verpassen. Im Internet wird man schnell fündig und so habe ich mir bei einem Onlineshop  um gerade einmal 2,90 Euro eine USB - Soundkarte bestellt. Die Karte, oder besser, der USB Dongle besitzt zwei 3,5mm Klinkenbuchsen. (einen Audio-Ausgang und einen Mikrofon-Eingang).



Die Installation ist schnell durchgeführt. Will man ein bestehendes System umrüsten, so ist einfach der Klinkenstecker der Lautsprecherzuleitung vom Raspberry abzuziehen und in den Audioausgang des Raspberry einzustöpseln. Der USB Stecker kommt in einen freien Port des Raspberry.

Der Hardwareteil ist somit erledigt und es kann mit dem Anpassen der Software begonnen werden. Nach dem Booten der Retropi-Maschine und dem Einloggen in die Konsole kann man überprüfen, welche Geräte am USB-Bus erkannt wurden. Nach der Eingabe von:

pi@retropie:~ $ lsusb

werden alle am USB-Bus angeschlossenen Geräte gelistet:

Bus 001 Device 007: ID 1516:1603 CompUSA Flash Drive
Bus 001 Device 006: ID 03f0:034a Hewlett-Packard
Bus 001 Device 005: ID 16c0:05e1 Van Ooijen Technische Informatica Free shared USB VID/PID pair for CDC devices
Bus 001 Device 004: ID 0d8c:013c C-Media Electronics, Inc. CM108 Audio Controller
Bus 001 Device 003: ID 0424:ec00 Standard Microsystems Corp. SMSC9512/9514 Fast Ethernet Adapter
Bus 001 Device 002: ID 0424:9514 Standard Microsystems Corp.
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

In diesem Fall ist der C-Media Electronics, Inc. CM108 Audio Controller unsere USB - Soundkarte. Als nächsten Schritt überprüft man die Reihenfolge (Priorität) der geladenen Soundmodule.

pi@retropie:~ $ cat /proc/asound/modules

Als Ergebnis kommt:
0 snd_bcm2835
1 snd_usb_audio

Das bedeutet die Soundausgabe des BCM2835 ist als erstes gelistet. Wir wollen jedoch alle Tonausgaben über den USB-Ausgang hören. Dazu muß die Datei "alsa-base.conf" wie folgt angelegt werden. (auf einigen Systemen ist sie bereits vorhanden - hier sind dann nur die Prioritäten anzupassen)

pi@retropie:~ $ sudo nano /etc/modprobe.d/alsa-base.conf

Falls jetzt ein leeres Script öffnet, hat die .conf-Datei noch nicht existiert und man muß die folgenden Zeilen eingeben:

options snd_usb_audio index=0
options snd_bcm2835 index=1
options snd slots=snd-usb-audio,snd-bcm2835

Mit "control+O" wird gespeichert und mit "control+X" kann der Editor beendet werden. Jetzt ist das System zu rebooten. Nach dem Neustart kann in der Konsole nochmals mit:

pi@retropie:~ $ cat /proc/asound/modules

die Reihenfolge der Module überprüft werden. Die sollte jetzt so aussehen:
0 snd_usb_audio
1 snd_bcm2835

Jetzt sollten in der Emulationstation wieder Töne zu hören sein. Diesmal aber ohne Rauschen und kristallklar :D