qByter
Geocacher
Hallo,
zunächst mal möchte ich ein großes Danke an alle Aktiven hier im Elektronik-Forum loswerden - ohne die vielen wirklich tollen Threads hier wäre ich wohl nie auf die Idee gekommen, mich mit dem Thema uCs zu beschäftigen
Seit einiger Zeit lese ich schon still mit, vor ein paar Tagen hab ich dann endlich mal die seit 15 Jahren vor sich hinstaubenden Sortimentskästen aus dem Keller geholt, den Lötkolben geputzt und ein wenig bei Reichelt eingekauft...
Nach den ersten Nachbauten von Reaktivlichtern kam schnell die Lust auf "mehr", und so kam mit beim Rumprobieren die Idee für eine interaktive Station, die ich einfach mal vorstellen will:
Ein Farb-Memory Spiel mit LCD-Display und Ton-Ausgabe.
Aufgabe ist es, per Tastendruck (je ein Taster für rot, grün und gelb) eine zufällig erzeugte Blinkfolge von LEDs innerhalb einer vorgegebenen Zeit nachzuspielen.
Es werden insgesamt 5 "Level" durchlaufen, mit stetig steigendem Schwierigkeitsgrad (Anzahl der "Blinks" steigt pro Level und der Blinkimpuls der LEDs wird kürzer und schneller).
Parallel erfolgt eine Anzeige auf einem LCD-Display, Ausgabe der Koordinaten bei Erfolg und untermalt wird das ganze von ein paar Piep- und Buzzer-Tönen.
Die Schaltung:
Ist mein erster Versuch mit Eagle, daher bitte Nachsicht, wenn´s etwas chaotisch aussieht

Als uC kommt ein Tiny24 zum Einsatz, das LCD-Display wird über den i2C-Bus und den i2C-Port-Expander PCF8574AP angesprochen.
Entstanden ist diese Kombination schlicht aus Experimentierfreude und weil ich für eventuell mal größere Projekte mit möglichst wenig Ports für die LCD-Ansteuerung auskommen wollte.
Günstiger und wahrscheinlich sinnvoller könnte man auch gleich einen Attiny26 o.ä. nehmen, der genug Ports zur Verfügung hat und so das LCD direkt ansteuern kann.
Als Lautsprecher kommt ein ausgemusterter kleiner (hochohmiger) PC-Speaker zum Einsatz - die Lautstärke kann durch variieren von C1 und R3 angepasst werden.
Da die Lautstärke für den Einsatz völlig ausreicht, hab ich hier diese Minimallösung gewählt und auf Transistoren verzichtet.
Der Rest dürfte eigentlich selbsterklärend sein...
Das Programm (Bascom):
Die Anzahl der Blinkimpulse pro Level kann durch anpassen von "A" in den Zeilen 80-100 verändert werden, die Impulsdauer in Zeilen 147-149 und der Timeout für die Eingabe in den Zeilen 181/183.
Der Speicher vom Attiny ist damit zu 95% voll. Ich hätte gerne noch ein paar Spielereien eingebaut, aber hier muss man sich wohl dem Basic-Compiler und den 2k geschlagen geben.
Vor allem die Sound- und LCD-Befehle schlucken leider recht viel Speicher.
That´s it.
Immer her mit Anmerkungen und Verbesserungsvorschlägen.
Macht wirklich Spaß, mit den AVRs zumzubasteln, auch wenn Bascom einen schon mal in die Verzweiflung treibt (wird Zeit für C...)
cu,
qByter
zunächst mal möchte ich ein großes Danke an alle Aktiven hier im Elektronik-Forum loswerden - ohne die vielen wirklich tollen Threads hier wäre ich wohl nie auf die Idee gekommen, mich mit dem Thema uCs zu beschäftigen
Seit einiger Zeit lese ich schon still mit, vor ein paar Tagen hab ich dann endlich mal die seit 15 Jahren vor sich hinstaubenden Sortimentskästen aus dem Keller geholt, den Lötkolben geputzt und ein wenig bei Reichelt eingekauft...
Nach den ersten Nachbauten von Reaktivlichtern kam schnell die Lust auf "mehr", und so kam mit beim Rumprobieren die Idee für eine interaktive Station, die ich einfach mal vorstellen will:
Ein Farb-Memory Spiel mit LCD-Display und Ton-Ausgabe.
Aufgabe ist es, per Tastendruck (je ein Taster für rot, grün und gelb) eine zufällig erzeugte Blinkfolge von LEDs innerhalb einer vorgegebenen Zeit nachzuspielen.
Es werden insgesamt 5 "Level" durchlaufen, mit stetig steigendem Schwierigkeitsgrad (Anzahl der "Blinks" steigt pro Level und der Blinkimpuls der LEDs wird kürzer und schneller).
Parallel erfolgt eine Anzeige auf einem LCD-Display, Ausgabe der Koordinaten bei Erfolg und untermalt wird das ganze von ein paar Piep- und Buzzer-Tönen.
Die Schaltung:
Ist mein erster Versuch mit Eagle, daher bitte Nachsicht, wenn´s etwas chaotisch aussieht

Als uC kommt ein Tiny24 zum Einsatz, das LCD-Display wird über den i2C-Bus und den i2C-Port-Expander PCF8574AP angesprochen.
Entstanden ist diese Kombination schlicht aus Experimentierfreude und weil ich für eventuell mal größere Projekte mit möglichst wenig Ports für die LCD-Ansteuerung auskommen wollte.
Günstiger und wahrscheinlich sinnvoller könnte man auch gleich einen Attiny26 o.ä. nehmen, der genug Ports zur Verfügung hat und so das LCD direkt ansteuern kann.
Als Lautsprecher kommt ein ausgemusterter kleiner (hochohmiger) PC-Speaker zum Einsatz - die Lautstärke kann durch variieren von C1 und R3 angepasst werden.
Da die Lautstärke für den Einsatz völlig ausreicht, hab ich hier diese Minimallösung gewählt und auf Transistoren verzichtet.
Der Rest dürfte eigentlich selbsterklärend sein...
Das Programm (Bascom):
Code:
' ==========================================
' === Farb-Memory v0.1 / qByter 29.09.09 ===
' ==========================================
$lib "Lcd_i2c.lib" 'I2C-LCD-Library laden (siehe Bascom AN #118)
$hwstack = 20 'Hardwarestack herabsetzen
$regfile = "ATtiny24.DAT"
$crystal = 1000000 'Frequenz des internen Oszillators
Declare Sub Show_level
Declare Sub Show_location
Declare Sub Beep_error
Declare Sub Beep_ok
Declare Sub Get_level_input
Declare Sub Verify_single_input
Config Portb = &B11111100 'Ports B0 und B1 auf Eingang
Config Porta = &B11110111 'Port A3 auf Eingang
Portb.0 = 1 'PullUp für Taster "gelb" ein
Portb.1 = 1 'PullUp für Taster "grün" ein
Porta.3 = 1 'PullUp für Taster "rot" ein
Config Debounce = 25 'Schwelle für Entprellen der Taster, ggf. erhöhen
Const Pcf8574_lcd = 112 'I2C Adresse vom PCF8574AP
Config Scl = Porta.1 'I2C SCL Pin
Config Sda = Porta.0 'I2C SDA Pin
Config I2cdelay = 1 'I2C Delay
Dim _lcd_e As Byte
_lcd_e = 128 'LCD im 4-Bit Mode betreiben
Config Lcd = 16 * 2 '16x2 Dotmatrix LCD
Dim A As Byte
Dim B As Byte
Dim Level As Byte
Dim Farbfolge(8) As Byte
Dim Aktzeichen As Byte
Dim Farbe_zu_pruefen As Byte
Dim Farbe_korrekt As Byte
Dim Zaehler As Integer
Config Timer1 = Timer , Prescale = 1 'Timer für Zufallszahlen
Dim ___rseed As Word
Enable Timer1
Start Timer1
Initlcd 'LCD initialisieren
Start: 'Hauptschleife - Anfang der Eingabe / Begin des Spiels
Cls 'LCD Display loeschen
Locate 1 , 1 'Cursor auf 1 Zeile, 1 Spalte
Lcd "*FARBEN-MEMORY*" 'String auf Display anzeigen
Locate 2 , 1
Lcd " Taste = START"
Do 'Auf Tastendruck warten
Debounce Pina.3 , 0 , Start_game 'Taste "rot" gedrückt
Debounce Pinb.1 , 0 , Start_game 'Taste "grün" gedrückt
Debounce Pinb.0 , 0 , Start_game 'Taste "gelb" gedrückt
Loop
Start_game:
___rseed = Timer1 ' Rseed setzen, damit Zufallszahlen abhängig vom Tastendruck sind
Wait 1 'Kleine Pause
A = 1
Level = 1 'Level auf 1 zurücksetzen
Cls
Do 'Level-Schleife
Locate 1 , 1
Lcd "Level "
Locate 1 , 7
Select Case Level 'Je nach Level die Blinkanzahl setzen
'Select statt FOR-Schleife, um besser testen/eingreifen zu können
Case 1:
Lcd "1"
A = 3 'Level1: 3 Blinkzeichen
Case 2:
Lcd "2"
A = 4 'Level2: 4 Blinkzeichen
Case 3:
Lcd "3"
A = 5 'Level3: 5 Blinkzeichen
Case 4:
Lcd "4"
A = 6 'Level4: 6 Blinkzeichen
Case 5:
Lcd "5"
A = 7 'Level5: 7 Blinkzeichen
Case 6:
Show_location 'Alle Level durchlaufen, Zeige Location
Exit Do 'Zum Programm-Ende
End Select
For B = 1 To A 'Array mit Zufallszahlen füllen
Farbfolge(b) = Rnd(30) + 10 'Zufallszahl von 1-3 generieren
Farbfolge(b) = Farbfolge(b) / 10
Next B
Wait 2 'Pause bis zum Start der LEDs
Show_level 'LEDs blinken lassen, je nach Level
Beep_ok 'Signalton signalisiert Eingabebeginn
Get_level_input 'Benutzereingaben abfragen und prüfen
Locate 2 , 1
Lcd " "
Level = Level + 1 'Dieses Level war erfolgreich, Level erhöhen
A = 1
Loop
End 'Programm Ende!
' ---------------------- SUB-Routines ----------------------- '
Sub Show_level 'LEDs je nach Level blinken lassen
Locate 2 , 1
For B = 1 To A 'A = Anzahl Blinker, pro Level unterschiedlich
Select Case Farbfolge(b)
Case 1:
Porta.7 = 1 'rote LED
Case 2:
Portb.2 = 1 'grüne LED
Case 3:
Porta.6 = 1 'gelbe LED
End Select
Lcd "-" 'Pro Blink ein Zeichen aufs LCD schreiben
Zaehler = Level * 50 'Mit zunehmendem Level die Blinkdauer verringern
Zaehler = 450 - Zaehler '450ms Basis, pro Level 50ms abziehen
Waitms Zaehler
Portb.2 = 0 'LEDs wieder ausschalten
Porta.7 = 0
Porta.6 = 0
Waitms Zaehler 'Pause bei "LEDs aus"
Next B
End Sub
Sub Get_level_input 'Benutzereingaben annehmen und prüfen
Zaehler = 1 'Zähler für Countdown, Eingabe zeitlich begrenzen
Aktzeichen = 1 'Aktuelle "Blink" aus dem Array
Farbe_korrekt = 2
A = A + 1
Locate 2 , 1
Do 'Tasten nacheinander abfragen und auf korrekte Eingabe prüfen
Farbe_zu_pruefen = 1
Debounce Pina.3 , 0 , Verify_single_input , Sub 'Taste "rot" gedrückt
Farbe_zu_pruefen = 2
Debounce Pinb.1 , 0 , Verify_single_input , Sub 'Taste "grün" gedrückt
Farbe_zu_pruefen = 3
Debounce Pinb.0 , 0 , Verify_single_input , Sub 'Taste "gelb" gedrückt
Zaehler = Zaehler + 1 'Zaehler für Timeout erhöhen
Waitms 10 'und 10ms warten
Loop Until Zaehler = 700 Or Aktzeichen = A 'bis Timeout erreicht oder Alle Eingaben abgefragt
If Zaehler = 700 Then 'Timeout 7 Sekunden erreicht?
Cls
Lcd "Zeit abgelaufen!" 'dann Fehler ausgeben und zum Anfang zurück
Beep_error
Wait 3
Goto Start
End If
End Sub
Sub Verify_single_input 'Eingabe eines Tasters auf korrekte Farbe prüfen
If Farbfolge(aktzeichen) = Farbe_zu_pruefen Then 'Aktueller Tastendruck entspricht der richtigen Farbe
Lcd "*"
Farbe_korrekt = 1 'Eingabe auf LCD bestätigen
Else 'Falsche Taste! :)
Cls
Lcd "!! FALSCH !!" 'Fehler ausgeben und zurück zum Anfang
Beep_error
Wait 3
Goto Start
End If
Aktzeichen = Aktzeichen + 1 'Aktuell zu prüfenden "Blink" erhöhen
End Sub
Sub Show_location 'Anzeige der Koordinaten
Cls
Lcd "YES - Geschafft!"
Locate 2 , 1
Lcd "N23.222 E08.567"
Sound , Porta.2 , 100 , 90 'Bisserl piepsen
Waitms 300
Sound , Porta.2 , 100 , 90
Waitms 300
Sound , Porta.2 , 850 , 60
End Sub
Sub Beep_error 'Buzzer-Ton ausgeben
Sound , Porta.2 , 70 , 1200
End Sub
Sub Beep_ok 'OK-Ton ausgeben
Sound , Porta.2 , 150 , 50
End Sub
Die Anzahl der Blinkimpulse pro Level kann durch anpassen von "A" in den Zeilen 80-100 verändert werden, die Impulsdauer in Zeilen 147-149 und der Timeout für die Eingabe in den Zeilen 181/183.
Der Speicher vom Attiny ist damit zu 95% voll. Ich hätte gerne noch ein paar Spielereien eingebaut, aber hier muss man sich wohl dem Basic-Compiler und den 2k geschlagen geben.
Vor allem die Sound- und LCD-Befehle schlucken leider recht viel Speicher.
That´s it.
Immer her mit Anmerkungen und Verbesserungsvorschlägen.
Macht wirklich Spaß, mit den AVRs zumzubasteln, auch wenn Bascom einen schon mal in die Verzweiflung treibt (wird Zeit für C...)
cu,
qByter