PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Automatisiertes Kinderspiel "Spritzenhaus"



AlKI
26.03.2008, 17:38
Vor ein paar Monaten wurde ich mal angesprochen, ob ich ein Kinderspiel des CVJM automatisieren könnte. Das Spiel wird "Spritzenhaus" genannt.
Es besteht aus einer Miniaturhausfassade aus ner lackierten Holzplatte (ca. 1,20 x 1,40 wenn ich mich recht erinner) mit ein paar Löchern drin. Die Kids versuchen dann mit nem Wasserschlauch in die Löcher zu spritzen. das Wasser wird von Rohren hinter der Platte in nen Messbecher geleitet.
Das ganze natürlich gegen die Zeit. Danach wird abgemessen, wieviel Wasser im Messbecher ist. das gibt dann Punkte.

was macht man nur, wenn man keinen Wasseranschluss hat?
Darum die Automation mit ner Pumpe, dann kann man die Hausfassade in ein aufblasbares Plantschbecken oder ähnliches stellen und das Wasser daraus durch den Schlauch pumpen. (Wasserreserven sind wegen schusseligkeit natürlich eingeplant)


Zu den Eigenschaften der Schaltung (endlich...):

- Punktestand und Spielerzahl wird am LCD ausgegeben (manchmal spielen auch Gruppen mit jeh 4 bis 7 Teilnehmern gegeneinander)
- über Poti einstellbare Rundenzeit (bis ca 2min 30sec)
- Startsignal über Lautsprecher
- automatisches Schalten der Pumpe (auch Magnetventil möglich)
- nach jedem Teilnemer Pumpenstopp
- manuelles Zurücksetzen des Punktestandes und der Teilnehmerzahl nach jedem Teilnehmer möglich => egal wieviele Teilnehmer pro Gruppe (einzeln bis 255 pro Gruppe möglich :o)


Die Komponenten:

- Atmega8
- 2X20 LCD mit 5,7V Hintergrundbeleuchtung (DV-20208)
- Stromversorgung: Netzteil 15V 1,2A
- 5V-Regler "7805" mit Kühlkörper
- MC-Grundbeschaltung und Spannungsstabilisation: 3x 100nf, 2 größere Elkos (paarhundert uf)
- 3 Potis für Displaykontrast, Zeiteinstellung und Lautstärkeregelung
- NPN-Transistor D1474 (6A, genug V) zur Lautsprecheransteuerung
- 2 LEDs (Spannungsanzeige und Pumpen-/Ventilsteuerausgang)
- div. Vorwiderstände
- Lautsprecher (8Ohm)
- Optokoppler und 6V-relais um die Pumpe/ das Magnetventil zu steuern (Strom durch die Relaisspule: < 60mA; Schaltbar: 230V bis 12A)
- 2 Freilaufdioden (für Relaisspule und Lautsprecherspule)
- n Paar einlötbare Klemmen und Lüsterklemmen
- 2 Streifenrasterplatinen
- Lichtschranke als Signalgeber
- 2 Taster mit 100nf-Kondensatoren entprellt (Start und Reset)


Beim anlegen von Spannung kommt zuerst " Bereit..." auf dem Display.
Wird der Starttaster betätigt, wird


0 Punkte 3
Spieler 1
angezeigt und von 3 mit Trötern runtergezählt.
Dann wird


0 Punkte ^ GO!
Spieler 1 - _

angezeigt und der Ausgang für die pumpe geschalten. Die Striche und das "^" sind eine kleine Animation, damit man sieht, ob sich was am Eingang tut. Sie fallen quasi von Oben runter und fliesen dann zur Seite weg.
Dann wird der Spannungswert am Poti zum einstellen der Zeit durch den ADC ausgelesen und dementsprechend die Zeit gesetzt. Ab da werden dann Punkte gezählt.

Die Zeit der Runde zähle ich übrigens nicht mit nem IRQ, sondern einfach in der Arbeitsschleife mit. Das mag etwas ungenau sein (jeh nachdem, ob viele oder wenige Eingangssignale und dadurch Rechenoperationen) aber das macht nix.

Nach jeder Runde wird das Relais ausgeschaltet, ein Tröten und ein "Stopp" in der unteren Zeile (statt der Animation) zeigen es auch an. Spielerzahl und Punktestand wird weiterhin angezeigt.
Dann kann man entweder mit dem Starttaster den nächsten Spieler spielen lassen (dessen Punkte werden zum bisherigen Punktestand dann dazuaddiert) oder mit dem Resettaster Spielerzahl und Punktestand zurück auf "0" setzen.

Ausschalten ist nur durch Ziehen des Steckernetzteils möglich (was später aber eh zusammen mit der Stromzufuhr für die Pumpe geschaltet werden soll.


Die Ganze Elektronik, inklusive Pumpe kommt noch in ne wasserdichte Kiste mit seeeehr langer Zuleitung (230V + Wasser = Schei*gefährlich, ich weis, eben darum)

AlKI
26.03.2008, 17:40
Hier noch der (Bascom-)Quellcode:


' Zeitschalter und Punktezähler für Spritzenhaus
' (c) AlKi
'
' ATMega8 + LCD + Lichtschranke + 2 Taster + Poti + Lautsprecher + Relais für Wasserpumpe
'
' Und NOT-AUS-Schalter in VCC!!! ( wenn Stromversorgung durch Trafo: Beide Adern durch NOT-AUS trennbar!!!)
'
'
' Anschlussbelegung:
'
'
' LCD: RS = PC1 ; Ex = PB1 ; DB4 = PC2 ; DB5 = PC3 ; DB6 = PC4 ; DB7 = PC5
'
' Signaleingang: PB6 ( gegen GND da interner Pullup )
'
' Taster:
' Start/Weiter: PD7 ( beide gegen GND da interne Pullups und mit Kondensatoren entprellt )
' Rücksetzen: PD6
'
' Poti: PC0/ADC0 ( als Spannungsteiler zwischen VCC und GND, mindestens 5kOhm )
'
' Lautsprecher(-ansteuerung): PB0 ( über Transistor mit Basis-Vorwiderstand und Freilaufdiode )
'
' Relais(-ansteuerung): PB7 ( über Transistor mit Basis-Vorwiderstand und Freilaufdiode )
'
'
'
' Features:
'
' - Punktestand und Spielerzahl wird am LCD ausgegeben
' - über Poti einstellbare Rundenzeit (bis 2min 30sec)
' - Startsignal über Lautsprecher
' - automatisches Schalten der Pumpe ( bis 230V max 12A, auch Magnetventil möglich)
' - nach jedem Teilnemer Pumpenstopp
' - manuelles Zurücksetzen des Punktestandes und der Teilnehmerzahl
' nach jedem Teilnehmer möglich => egal wieviele Teilnehmer pro Gruppe (einzeln bis 255 pro Gruppe)
'



$regfile = "m8def.dat"
$crystal = 8000000




' Ausgänge einstellen
Config Portb.0 = Output
Beeper Alias Portb.0

Config Portb.7 = Output
Pumpe Alias Portb.7



' Eingänge einstellen
Config Pind.7 = Input ' Start-/Weiter- Taster
Portd.7 = 1 ' Pullup an
Xstart Alias Pind.7

Config Pind.6 = Input ' Resettaster
Xrueck Alias Pind.6
Portd.6 = 1 ' Pullup an

Config Pinb.6 = Input ' Signaleingang von Lichtschranke
Xsig Alias Pinb.6
Portb.6 = 1 ' Pullup an





' LCD einstellen
Config Lcd = 20 * 2 '
Config Lcdbus = 4 '
Config Lcdpin = Pin , Db4 = Portc.2 , Db5 = Portc.3 , Db6 = Portc.4 , Db7 = Portc.5 , E = Portb.1 , Rs = Portc.1 '


' ADC einstellen
Config Adc = Single , Prescaler = 64 , Reference = Avcc

Start Adc 'und gleich aktivieren



Dim Zaehler As Long ' Variablen
Dim Zeit As Long

Dim Punkte As Long ' wird später nach x Vorpunkten um 1 erhöht
Dim Vorpunkte As Byte ' Vorpunkte, damit nicht jedes Signal einen Punkt ergibt
Dim Spieler As Byte ' Die Variable für Spieler

Dim X As Long

Dim Xsignalalt As Bit ' der letzte Zustand des Eingangs wird hier drauf abgespeichert (zum Vergleichen mit aktuellem)

Dim Dreh As Byte ' Die Variable für die Animation



' ----------------- Programmstart -------------------------------------------------------------


Wait 1 ' damit das LCD genug Zeit zum "Hochfahren" hat

Initlcd


Cursor Off

Xsignalalt = 0
Vorpunkte = 0
Spieler = 0
Punkte = 0
Dreh = 0

Cls ' erstmal alles =0 und leeren

While Xstart = 1
Locate 1 , 1
Lcd " Bereit..."
Wend
' weiter erst, wenn "Start" (Starttaster gedrückt)


Do ' eigentliche Hauptschleife

Zaehler = 0
Zeit = 0
X = 0
Vorpunkte = 0
Dreh = 4 ' =4, da es gleich anderweitig genutzt wird (zum Tröter zählen)

Incr Spieler ' nächster Spieler ist dran


Cls
Locate 1 , 1
Lcd Punkte ; " Punkte"
Locate 2 , 1
Lcd "Spieler " ; Spieler


Zaehler = Getadc(0) ' Wert des Potis als Zeit geladen



While Dreh > 1 ' 4 mal Piepsen, "Dreh" wird hier "missbraucht"

Decr Dreh

Locate 1 , 17

Lcd Dreh


Beeper = 0
While X < 100000 ' vor/zwischen Piepsern warten
Incr X
Wend

X = 0
While X < 150 ' Tröt-Schleife
Toggle Beeper
While Zeit < 100
Incr Zeit
Wend
Zeit = 0
While Zeit < 500
Incr Zeit
Wend
Zeit = 0
Incr X
Wend
X = 0

Wend


Locate 1 , 17
Lcd "GO!"


Zeit = 0
X = 0
Dreh = 0 ' Variablen wieder = 0

Beeper = 0 ' Lautsprecher garantiert aus


Pumpe = 1 'Pumpe an



While Zeit < Zaehler ' Anfang Zählschleife

X = 0
Incr Zeit

While X < 5

If Xsig = Xsignalalt Then ' hat sich der Eingang geändert?
' wenn nicht, dann mach nix
Else ' ansonsten

Xsignalalt = Xsig ' Zustand speichern
Incr Vorpunkte ' und Flanke zählen

Select Case Vorpunkte

Case 4 : Incr Dreh ' Variable für die Animation verändern
Case 8 : Incr Dreh
Case 12 : Incr Dreh
Case 16 : Incr Dreh

End Select

If Dreh = 4 Then ' und wenn sie zu hoch ist => =0
Dreh = 0
End If

If Vorpunkte = 16 Then ' Endgültiges Punktezählen

Incr Punkte
Vorpunkte = 0
End If

End If


Locate 1 , 1
Lcd Punkte ; " Punkte" ' Ausgabe des Punktestands

Locate 1 , 14

Select Case Dreh ' Ausgabe der Animation in der oberen Zeile
Case 0 : Lcd "^"
Case 1 : Lcd "-"
Case 2 : Lcd "_"
Case 3 : Lcd " "
End Select

Locate 2 , 14

Select Case Dreh ' Ausgabe der Animation in der unteren Zeile
Case 0 : Lcd "- _ "
Case 1 : Lcd "_ _ "
Case 2 : Lcd " _ _ "
Case 3 : Lcd "^ _ _"
End Select

Locate 2 , 1
Lcd "Spieler " ; Spieler ' Ausgabe der Spielerzahl

Incr X

Wend

Wend


' *#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*# *#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#

' Ende der Runde

' *#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*# *#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#


Pumpe = 0 ' Pumpe aus

Zeit = 0
X = 0

Locate 2 , 14
Lcd "Stopp" 'Ausgabe "Stopp"

While X < 150 ' Endpiepser
Toggle Beeper
While Zeit < 100
Incr Zeit
Wend
Zeit = 0
While Zeit < 500
Incr Zeit
Wend
Zeit = 0
Incr X
Wend
X = 0


Zeit = 0
X = 0
Vorpunkte = 0 ' Variablen wieder = 0

Beeper = 0

Cls

While Xstart = 1 ' Solange Starttaster inaktiv (Warteschleife mit Ausgabe)

If Xrueck = 0 Then ' falls Resettaster aktiv
Spieler = 0 ' Spielernummer und
Punkte = 0 ' Punktestand auf 0 setzen
Cls ' und das Display leeren (zur Siherheit)
End If

Locate 1 , 1
Lcd Punkte ; " Punkte" ' Punkte, Spielernummer, Punktestand und "Stopp" ausgeben
Locate 2 , 1
Lcd "Spieler " ; Spieler
Locate 2 , 12
Lcd "Stopp"
' sonst nix tun
Wend

Zeit = 0
X = 0

Loop

'---------------------------- Ende ------------------------------------------------

Murdoc_mm
26.03.2008, 18:28
Hi,

du hast nicht zufällig Bilder und/oder Videos?

Gruß

AlKI
26.03.2008, 19:51
Doch, Bilder hab ich, waren nur noch nicht hochgeladen. vlt mach ich auch noch n Video mit meiner Digicam.

Den Schaltplan zeichne ich gerade.

Wollte nochmal neue Bilder machen, und stelle fest, dass sich das Netzgerät verabschiedet hat.
Werde jetzt halt n 30V-Netzteil nehmen und den Vorwiderstand von der LCD-Hintergrundbeleuchtung ändern.

vlt werd ich noch das "GO!" in "LOS!" ändern und einen anderen Lautsprecher anschließen, einen mit Ösen zur besseren Befestigung


EDIT: hab ein etwas besseres Bild hochgeladen
https://www.roboternetz.de/phpBB2/album_pic.php?pic_id=2069
Die Taster sind noch Provisorisch angeschlossen, die Lichtschranke liegt noch im Keller (mit dem komischen Taster an den gelben Kabeln kann man deutlich besser experimentieren) die Relaisplatine wird gerade angesteuert, was man an der roten LED auf der Hauptplatine sieht.
Das große Metallpoti ist zum einstellen der Zeit, das kleine schwarze daneben für die Lautstärke.
Der Optokoppler ist übrigens nicht zur zweifachen Trennung von der Schaltspannung, ich hatte ihn nur gerade da, und mit den 100mA die er aushält, kann das Relais (der orangene Block) sehr gut angesteuert werden (zieht eh nur ~55mA). auch passt es sehr gut, da ich dann keine weiteren Widerstände wegen der LED brauche (2 LEDs in Reihe bei 5V => 2,5V für jede => passt )

the_Ghost666
27.03.2008, 19:53
Mh, sagmal, möchtest du das Display nur als kleine Anzeige für den Moderator nehmen, der dann die Punktzahlen vorliest? Sonst könntest du vielleicht eine größere Anzeige an der Fassade fest machen. Z.B. große 7Segment-Anzeigen. 2 Stellen für jedes Team. Das lässt sich einfach per I2C modul oder sogar noch dem Hauptcontroller ansteuern. Es gibt die Anzeigen auch in 7cm Zeichenhöhe, und in Rot kann man das auch gut am Tag ablesen.
Natürlich ist die Frage, ob das finanziell passt.
Es geht auch billiger mit mehr Aufwand, bei uns an der FH hat mal einer eine 3 stellige Anzeige mit 25cm Höhe aus ner Doppelreihe roter superheller LEDs gebaut. Jeweils in Reihe und Parallel bis das Segment fertig war und dann über Treibertransistoren angesteuert. Vorher ein Stück Blech passend bearbeitet (Fertigungslaser, geht aber auch mit mehr Mühe mit ner Bohrmaschine ;) ) und die LEDs darin verklebt

AlKI
28.03.2008, 10:58
Das hatte ich mir auch schon mal überlegt, aber ich will die Elektronik separat haben.

Da die Kiste mit der Elektronik möglichst weit von dem Haus weg sein sollte (damit sie nicht in der Schusszone ist und man sie auch einfach "abstöpseln" und so wie bisher spielen kann) und ich eh mal was mit nem LCD machen wollte, hab ich mir überlegt die Kiste mit Elektronik und Pumpe einfach direkt zu den Spielern zu stellen.
Dann ist die Anzeige auch groß genug.

Die Elektronik kann man (ohne die Pumpe zu schalten) dann auch für andere Spiele nutzen. Es ist ja egal, durch was die Zählimpulse ausgelöst werden (ob Taster, Lichtschranke oder sonstwas)
Oder statt der Pumpe ne Lampe, ein Gebläse oder sonstwas schalten. (Styroporkugeln durch den Luftstrom von einem Ventilator in eine Sammelvorrichtung mit Lichtschranke/Taster werfen, etc.)

Salvador
28.03.2008, 11:46
Toll dass du sowas durchziehst! =D> Ich brauch unbedingt mehr Zeit, dann kann ich mich auch wieder den Microcontrollern zuwenden

AlKI
28.03.2008, 17:40
noch hab ich ja auch Zeit...

und es ist ja auch nicht so arg kompliziert (Programmiert an nem Nachmittag, nach und nach zusammengebaut, insgesamt vlt nochmal 2 nachmittage), ich mag es auch mal schnell Erfolg zu sehen.

Hier noch der Schaltplan:
https://www.roboternetz.de/phpBB2/album_pic.php?pic_id=2076
Die abgetrennte Schaltung unten ist die externe Lichtschranke. die 5polige Klemme links ist für die 2Taster und die Lichtschranke. Die GND-Anschlüsse der Taster und der Lichtschranke liegen alle auf dem untersten der 5 Klemmpolen. der oberste Klemmpol sind die 5V für die Lichtschranke.

die LCD-Hintergrundbeleuchtung und die Lautsprecheransteuerung hab ich hier mit der Versorgungsspannung des Spannungsreglers 7805 mitversorgt. Die Wiederstände R4 und R8 müssen dementsprechend angepasst werden. R4 kann man auch rauslassen, wenn die Stromversorgung und der Transistor genug aushalten. man kann sie natürlich auch an die 5V Hängen, was aber eine Zusatzbelastung für den 7805 bedeutet. Die Relaisschaltung kann man natürlich auch mit der Grundversorgungsspannung betreiben, wie es eben passt.

EDIT: Schaltplan verbessert
EDIT 1.4.2008: Schatplan nochmals verbessert, hatte beim LCD VSS und VDD verwechselt