Nixie-Projekt


von Altinger und Kutschat

Projekt Sommersemester 2011: Gasgefüllte Kaltkathoden-Anzeigeröhren

Nixie-Reaktionstester

Florian Altinger und Lars Kutschat



Beschreibung

Dieses Projekt ist im Rahmen des Projektpraktikums des Studiengangs Elektro- und Informationstechnik im 6. Semester entstanden. Ziel des Reaktionstestes ist es, möglichst schnell nach einem Signal auf die Pilztaster zu drücken. Dabei wird die Reaktionszeit in Millisekunden gemessen und angezeigt.
Die maximale Spielerzahl beträgt vier Spieler.

Spielanleitung

Nach dem Bestromung der Platine wird mit der Start-Taste ein Spiel gestartet. Sobald die roten Glimmlampen (nach einer zufällig gewählten Zeit) erlöschen müssen alle Mitspieleer versuchen, möglichst schnell auf die Pilz-Taster des Spielbrettes zu drücken. Die Reaktionszeit (in Millisekunden) des reaktionsschnellsten Spielers wird durch die vier Nixieröhren in Millisekunden angezeigt. Wurden alle vier Taster betätigt, so leuchtet das Glimmlämpchen des langsamsten Spielers auf. Er ist somit der Verlierer dieser Spielrunde. (Die nun vom Verlierer zu tätigende Aufgabe, ist vor Beginn der ersten Spielrunde unter den Mitspielern zu vereinbaren ;-) !)
Zum starten einer neuen Spielrunde muss die Start-Taste erneut betätigt werden.

Aufbau

Der Reaktionstest besteht aus drei verschiedenen Modulen. Im Hauptmodul befindet sich das Arduino-Uno Board mit einem aufgestecktem Shield, auf dem sich zusätzliche von uns benötigte Elektronik befindet. Außerdem ist ein Anzeigemodul sowie ein Trafomodul vorhanden.

1. Das Arduino Board
Um die für das Projekt benötigte Einarbeitungszeit möglichst gering zu halten wurde das Arduino Entwicklungsboard gewählt. Arduino ist eine weit verbreitete Open-Source Plattform, mit dem Ziel, den Einstieg in die Mikrocontroller-Welt möglichst einfach und schnell zu meistern. Dazu gibt es das Entwicklungsboard (basierend auf einem Atmel AVR ATmega8/168) und eine Open-Source Entwicklungsumgebung mit einer API für den Mikrocontroller.
Durch das aufstecken eines sog. Shields ist es problemlos möglich, eigene Hardware direkt über dem Board zu verbauen. Auf unserem Shield befindet sich diverse Hardware um die Pilztaster und die Glimmlampen sowie die anderen Module anzusteuern. Unter Anderem sind hier zwei TTL7400 Bausteine (für 4 RS-Flipflops) um die Pilztaster zu entprellen verbaut. Außerdem befinden sich auf dem Shield die als Schalter eingesetzten Transistoren um die Glimmlamen zu steuern.
Somit laufen alle Kabel der Lampen und Taster auf dem Arduino Board zusammen.



2. Die Anzeige Platine
Auf einer Anzeigeplatine ist es möglich, mittels Schieberegister zwei Nixies anzusteuern. Diese Platinen sind so konstruiert, dass sie sich mit weiteren Anzeigeplatinen aneinander stecken lassen und sich somit die Anzahl der zu verfügung stehenden Anzeigestellen aussuchen kann. Für das Projekt Reaktionstest wurden 4 Nixies gewählt, deshalb sind 2 Anzeigeplatinen verbaut.
Weitere Infos können hier (LINK EINFUEGEN) gefunden werden.
Damit die Nixies funktionieren werden 170V benötigt, welche im dritten Modul erzeugt werden.



3. Die Hochspannungsplatine
Die zur Anzeige verwendeten Nixies sowie die Glimmlampen benötigen eine Spannung von ca. 170V. Diese Platine nutzt den bekannten Timerbaustein NE555 und wird mit einer Eingangsspannung von 9V betrieben. Die Ausgangsspannung kann per Poti eingestellt werden - in unserem Fall 170V.




Schaltplan des Aufsteckshields



Source Code


#include "TimerOne.h"
#include  //fuer die Nixies

#define dataPin 2  // SER - Pinnummer
#define clockPin 3 // SCK - Pinnummer
#define latchPin 4 // RCK - Pinnummer
#define numDigits 4 // Anzahl der Ziffern

// Es wird ein Objekt der Klasse Nixie erzeugt werden, welches
// weiter verwendet wird
Nixie nixie(dataPin, clockPin, latchPin);
int arrayNums[numDigits];   //Array mit den Zahlen für die Nixies


// Reset der Flipflops
const int t_mode  = 6;  

// Pinnummern der Glimmlampen:
const int led_b1 =  13;      // the number of the LED pin
const int led_b2 =  12; 
const int led_b3 =  11; 
const int led_b4 =  10; 


int buzzer1found = 0;
int buzzer2found = 0;
int buzzer3found = 0;
int buzzer4found = 0;


int counter = 0;
int push_count = 0;
int millisec = 0;
int millisec_capture = 0;

void setup() {

  Serial.begin(9600);


  // initialize the LED pin as an output:
  pinMode(led_b1, OUTPUT);   
  pinMode(led_b2, OUTPUT);    
  pinMode(led_b3, OUTPUT);    
  pinMode(led_b4, OUTPUT);

  digitalWrite(led_b1, HIGH);   
  digitalWrite(led_b2, HIGH);    
  digitalWrite(led_b3, HIGH);    
  digitalWrite(led_b4, HIGH);

  // initialize the pushbutton pin as an input:
  pinMode(A0, INPUT);
  pinMode(A1, INPUT);   
  pinMode(A2, INPUT);    
  pinMode(A3, INPUT);    
  pinMode(t_mode, OUTPUT); 
  digitalWrite(t_mode, HIGH);

  //counter als Zufallszahl zwischen 0 und 5
  counter = random(5);
  Serial.print("counter:");
  Serial.print(counter);
  Serial.print("\n");
  //reset der flipflops
  delay(200);
  digitalWrite(t_mode, LOW);
  delay(500);
  digitalWrite(t_mode, HIGH);
  delay(200);

  Timer1.initialize(1000);  //jede Millisekunde
  Timer1.attachInterrupt(ms_interrupt);

  //Nixies:
  nixie.clear(numDigits);



}

void ms_interrupt() {
  if(++millisec>9999)
    millisec = 0;


  if(counter > 0)
  {
    if(millisec > 1000)
    {
      millisec = 0;
      counter--;
      if(counter == 0)
      {
        Serial.print("lichter aus\n");
        digitalWrite(led_b1, LOW);   
        digitalWrite(led_b2, LOW);    
        digitalWrite(led_b3, LOW);    
        digitalWrite(led_b4, LOW);
        millisec = 0;
      }
    } 
  }
}

void loop(){



  if(digitalRead(A0) && buzzer1found == 0 ){
    buzzer1found = 1;
    Serial.print("buzzer1found\n");
    if(++push_count == 4 || counter)
    {
      digitalWrite(led_b1, HIGH);  
      Serial.print("buzzer1 looser\n");

    }
    else if (push_count == 1)
    {
      millisec_capture = millisec;
      //int to array
      for (int i = 0; i <= 3; i) {
        arrayNums[i] = millisec_capture % 10;
        millisec_capture /= 10;
        i++;
      }

      // Write out the array
      nixie.writeArray( arrayNums, numDigits);

    }

  }

  if(digitalRead(A1) && buzzer2found == 0){
    buzzer2found = 1;
    Serial.print("buzzer2found\n");
    if(++push_count == 4 || counter)
    {
      digitalWrite(led_b2, HIGH);
      Serial.print("buzzer2 looser\n");
    }
    else if (push_count == 1)
    {
      //int to array
      millisec_capture = millisec;
      //int to array
      for (int i = 0; i <= 3; i) {
        arrayNums[i] = millisec_capture % 10;
        millisec_capture /= 10;
        i++;
      }
      // Write out the array
      nixie.writeArray( arrayNums, numDigits);

    }

  }

  if(digitalRead(A2) && buzzer3found == 0 ){
    buzzer3found = 1;
    Serial.print("buzzer3found\n");
    if(++push_count == 4 || counter)
    {
      digitalWrite(led_b3, HIGH);
      Serial.print("buzzer3 looser\n");

    }
    else if (push_count == 1)
    {
      millisec_capture = millisec;
      //int to array
      for (int i = 0; i <= 3; i) {
        arrayNums[i] = millisec_capture % 10;
        millisec_capture /= 10;
        i++;
      }

      // Write out the array
      nixie.writeArray( arrayNums, numDigits);

    } 
  }

  if(digitalRead(A3) && buzzer4found == 0 ){
    buzzer4found = 1;
    Serial.print("buzzer4found\n");
    if(++push_count == 4 || counter)
    {
      digitalWrite(led_b4, HIGH);  
      Serial.print("buzzer4 looser\n");
    }
    else if (push_count == 1)
    {
      millisec_capture = millisec;
      //int to array
      for (int i = 0; i <= 3; i) {
        arrayNums[i] = millisec_capture % 10;
        millisec_capture /= 10;
        i++;
      }
      // Write out the array
      nixie.writeArray( arrayNums, numDigits);

    }
  }
  delay(1);

}






Letzte Aktualisierung: 23. Jun 2011