PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Spiel-Board



BlueNature
06.02.2007, 17:58
Servus,

ich habe am Sonntag einmal für meinen Neffen ein Spielboard auf die Schnelle gebastelt. Ist eigentlich ganz nett und denke auch eine gute Anregung für eigene Ideen.
Dazu habe ich aus dem Keller eine alte Bremsleuchte genholt und diese eben als LED-Zeile auf das Brett montiert. Die vier Segmente haben je einen Transistor und sind somit direkt nach geringer Modifikation am AVR betriebsfähig. Weiterhin habe ich vorne vier Digi-Taster angebracht welche die Eingabe darstellen. Diese sind durch 1N4148 gegen Fremdspannung geschützt und eben intern gepullupt (siehe Software). Einen Festplattenmotor habe ich aus Jux eben auch noch aufgeschraubt. Dieser läßt sich in Drehzahl und Richtung schalten. Ein altes VU-Meter aus einer Technics-Anlage habe ich auch aufgesetzt. diese ist einfach mit 10k Vorwiderstand am AVR-Oit angeschlossen und wird PWM-Generiert gepulst zum entsprechenden Ausschlag. Als µC habe ich einen DIL20-µC verwendet, einen Tiny2313 und als IDE BASCOM.
Das Programm beginnt zu Anfang mit einer auf/abblendenden LED-Zeile welches die Ausganssituation anzeigt. Wird Programm 1 angewählt, wird die Sequenz gespeichert und immer wiederholt wiedergegeben. Drückt man weitere Tasten werden diese getoggelt in das laufende Pattern implementiert und ebenfalls wiedergegeben. Bei drücken vom Taste 2 wird eben das selbe gemacht, nur eben die gedrückte Tastensequenz wie ein Pappagei verzögert ausgegeben. Programm 3 hat sechs verschiedene Programme die eben fest programmiert sind die in Geschwindigkeit direkt verändert werden können (wie ein Lichtcomputer eben). Programm 4 ist die Ansteuerung des Festplattenmotors. Weil keine Kontrolle der Phasen erfolgt ist das ein kniffliges Spiel mit dem Speed den Motor auf Drehzahl zu bekommen ohne das er die Synchronisation verliert.
Ein kleines Video im AVI-Format mit der DigiCam habe ich einmal aufgezeichnet unter www.mds-5.de/temp/RMOV0862.AVI weiterhin ist das Programm hierzu das folgende:



$Regfile = "2313def.dat"
$Crystal = 8000000

VuMeter Alias PortD.5
Ph1 Alias PortD.0
Ph2 Alias PortD.1
Ph3 Alias PortD.2
Led4 Alias PortB.0
Led2 Alias PortB.1
Led3 Alias PortB.2
Led1 Alias PortB.3
Taster1 Alias PinD.3
Taster2 Alias PinB.4
Taster3 Alias PinD.6
Taster4 Alias PinD.4

Dim i As Byte
Dim Speed As Byte
Dim Prog As Byte
Dim TmpByte As Byte
Dim TmpWord As Word
Dim Taste As Byte
Dim Led As Byte
Dim Pat(96) As Byte
Dim PatPntr As Byte

WaitMs 200

'DDRD = 00100111
'DDRB = 00001111
'PortD = 01011000
PortB.4 = 1
DDRD.5 = 1
DDRD.0 = 1
DDRD.1 = 1
DDRD.2 = 1
DDRB.0 = 1
DDRB.1 = 1
DDRB.2 = 1
DDRB.3 = 1
PortD.6 = 1
PortD.4 = 1
PortD.3 = 1

Main:
Ph1 = 0
Ph2 = 0
Ph3 = 0
VuMeter = 0
GoSub ReadTasten
If Taste > 0 Then GoTo Main

MainLoop:
Incr TmpByte
If TmpByte.7 = 0 Then
' Aufblenden
For i = 0 To 127
If i < TmpByte Then
Led = 15
VuMeter = 1
Else
Led = 0
VuMeter = 0
End If
GoSub ProgWeiche
WaitUs 100
Next i
Else
' Abblenden
For i = 255 To 128 Step -1
If i > TmpByte Then
Led = 15
VuMeter = 1
Else
Led = 0
VuMeter = 0
End If
GoSub ProgWeiche
WaitUs 100
Next i
End If
Goto MainLoop

ProgWeiche:
GoSub SetLeds
GoSub ReadTasten
If Taste.0 = 1 Then GoTo Programm1
If Taste.1 = 1 Then GoTo Programm2
If Taste.2 = 1 Then GoTo Programm3
If Taste.3 = 1 Then GoTo Programm4
Return

Programm1:
' Programm löschen
For PatPntr = 1 To 96
Pat(PatPntr) = 0
Next PatNr
PatPntr = 1
Do
' LED's anzeigen
Led = Pat(PatPntr)
GoSub SetLeds
' Taster einlernen
GoSub ReadTasten
If Taste.0 = 1 Then
If Pat(PatPntr).0 = 0 Then
Pat(PatPntr).0 = 1
Else
Pat(PatPntr).0 = 0
End If
End If
If Taste.1 = 1 Then
If Pat(PatPntr).1 = 0 Then
Pat(PatPntr).1 = 1
Else
Pat(PatPntr).1 = 0
End If
End If
If Taste.2 = 1 Then
If Pat(PatPntr).2 = 0 Then
Pat(PatPntr).2 = 1
Else
Pat(PatPntr).2 = 0
End If
End If
If Taste.3 = 1 Then
If Pat(PatPntr).3 = 0 Then
Pat(PatPntr).3 = 1
Else
Pat(PatPntr).3 = 0
End If
End If
' Bei Drücken aller Tasten beenden
If Taste = 15 Then Exit Do
' Weiterschalten im Speicher
Incr PatPntr
If PatPntr > 96 Then PatPntr = 1
' VU-Anzeige
GoSub VuMeterTakt
' Wartezeit
WaitMs 50
Loop
GoTo Main

Programm2:
' Programm löschen
For PatPntr = 1 To 96
Pat(PatPntr) = 0
Next PatNr
PatPntr = 1
Do
' LED's anzeigen
Led = Pat(PatPntr)
GoSub SetLeds
' Taster einlernen
GoSub ReadTasten
Pat(PatPntr) = Taste
' Bei Drücken aller Tasten beenden
If Taste = 15 Then Exit Do
' Weiterschalten im Speicher
Incr PatPntr
If PatPntr > 96 Then PatPntr = 1
' VU-Anzeige
GoSub VuMeterTakt
' Wartezeit
WaitMs 50
Loop
GoTo Main

VuMeterTakt:
' VU-Anzeige
TmpByte = PatPntr Mod 8
If TmpByte < 2 Then
VuMeter = 1
Else
VuMeter = 0
End If
Return

Programm3:
PatPntr = 0
Speed = 10
Prog = 0
Do
' Programm ausgeben
TmpByte = Prog * 16
TmpByte = TmpByte + PatPntr
TmpByte = Lookup(TmpByte, Patterns)
Led = TmpByte
GoSub SetLeds
' Weiterschalten
Incr PatPntr
PatPntr = PatPntr And &h0F
' Taster einlesen und auswerten
Taste = Taste * 16
GoSub ReadTasten
' Bei Drücken aller Tasten beenden
If Taste = 15 Then Exit Do
TmpByte = Taste And &h0F
If TmpByte = 0 Then
If Taste.4 = 1 Then Incr Speed
If Taste.5 = 1 Then Decr Speed
If Prog > 0 Then
If Taste.6 = 1 Then Decr Prog
End If
If Prog < 5 Then
If Taste.7 = 1 Then Incr Prog
End If
End If
TmpByte = Speed * 10
WaitMs TmpByte
Loop
GoTo Main

Programm4:
' Taster 1: Speed -
' Taster 2: Speed +
' Taster 3: Links
' Taster 4: Rechts
Speed = 20
TmpByte = 0
Do
If i = 0 Then
If TmpByte = 2 Then TmpByte = 0 Else Incr TmpByte
Else
If TmpByte = 0 Then TmpByte = 2 Else Decr TmpByte
End If
' Motor ansteuern
Ph1 = 0
Ph2 = 0
Ph3 = 0
If TmpByte = 0 Then Ph1 = 1
If TmpByte = 1 Then Ph2 = 1
If TmpByte = 2 Then Ph3 = 1
' Taster einlesen und auswerten
GoSub ReadTasten
If Speed < 255 Then
If Taste.0 = 1 Then Speed = Speed + 1
End If
If Speed > 2 Then
If Taste.1 = 1 Then Speed = Speed - 1
End If
If Taste.2 = 1 Then i = 0
If Taste.3 = 1 Then i = 1
' Bei Drücken aller Tasten beenden
If Taste = 15 Then Exit Do
WaitMs Speed
Loop
GoTo Main

ReadTasten:
Taste.0 = Not Taster1
Taste.1 = Not Taster2
Taste.2 = Not Taster3
Taste.3 = Not Taster4
Return

SetLeds:
Led1 = Led.0
Led2 = Led.1
Led3 = Led.2
Led4 = Led.3
Return

Patterns:
Data &b10001001 ' 1
Data &b10001001
Data &b01000110
Data &b01000110
Data &b00100110
Data &b00100110
Data &b00011001
Data &b00011001
Data &b00011001
Data &b00011001
Data &b00100110
Data &b00100110
Data &b01000110
Data &b01000110
Data &b10001001
Data &b10001001

Data &b00000001 ' 2
Data &b00000001
Data &b00000010
Data &b00000010
Data &b00000100
Data &b00000100
Data &b00001000
Data &b00001000
Data &b00000001
Data &b00000001
Data &b00000010
Data &b00000010
Data &b00000100
Data &b00000100
Data &b00001000
Data &b00001000

Data &b00001111 '3
Data &b00000111
Data &b00000011
Data &b00000001
Data &b00000000
Data &b00000000
Data &b00000000
Data &b00000000
Data &b00001111
Data &b00000111
Data &b00000011
Data &b00000001
Data &b00001000
Data &b00000100
Data &b00000010
Data &b00000001

Data &b00001000 '4
Data &b00000001
Data &b00000100
Data &b00000010
Data &b00000100
Data &b00000010
Data &b00000100
Data &b00000010
Data &b00000100
Data &b00000010
Data &b00000100
Data &b00000010
Data &b00001000
Data &b00000001
Data &b00000010
Data &b00000100

Data &b00001000 '5
Data &b00000000
Data &b00000100
Data &b00000000
Data &b00000010
Data &b00000000
Data &b00000001
Data &b00000000
Data &b00000001
Data &b00000000
Data &b00000010
Data &b00000000
Data &b00000100
Data &b00000000
Data &b00001000
Data &b00000000

Data &b00001111 '6
Data &b00000000
Data &b00000110
Data &b00000000
Data &b00001111
Data &b00000000
Data &b00000110
Data &b00000000
Data &b00000110
Data &b00000000
Data &b00001001
Data &b00000000
Data &b00000110
Data &b00000000
Data &b00001000
Data &b00000000


Grüße Wolfgang

Jon
06.02.2007, 18:25
Schönes Projekt!
Wie lange hast du dafür gebrauchst (Std.)?
Dass man so etwas auf die schnelle basteln kann... Hätte ich nie gedacht.

jon

BlueNature
06.02.2007, 18:28
Hi Jon,

hab das am Sonntag gebaut. Dachte ien kleiner 2313 ist da ganz nett und ausreichend für den Job. Glaub von Mittag bis Nachts ca. 22:00 hab ich gebastelt, dann wars soweit fertig. AVR auf Streifenraster und auch alles andere. Ätzen war mir dafür zu langwierig und nicht nötig. Die Platine misst nun ca. 30x40mm und passt in ein kleines Platikgehäuse das ich auch auf das Brett geschraubt habe.


Grüße Wolfgang

raoul4
06.02.2007, 19:27
das hast du aber schön zusammengewieselt

lpw
06.02.2007, 21:04
Wie viele Kontakte hatte den der Festplattenmotor und wie hast die ihn angesteuert?

BlueNature
06.02.2007, 21:52
Den Motor steure ich mit den drei Phasen mit eionem gedoppelten Ausgang eines ULN2003 an mit gemeinsamem Widerstand (22 Ohm) gegen Plus.

So siehts aus: http://www.mds-5.de/temp/RMOV0859.AVI

Es gab allerdings zwischenzeitlich in den Tests auch einen "toten" ULN2003, der ist komplett abgebrannt (Strangwiderstand bei ca. 0,8Ohm). :-b

http://www.mds-5.de/temp/RIMG0860b.jpg
http://www.mds-5.de/temp/RIMG0861b.jpg

hier noch vom ersten Aufbau ein Foto mit dem Motor ohne Mini-CD aufmontiert:

http://www.mds-5.de/temp/RIMG0858b.jpg

Grüße Wolfgang