• Willkommen im Geoclub - dem größten deutschsprachigen Geocaching-Forum. Registriere dich kostenlos, um alle Inhalte zu sehen und neue Beiträge zu erstellen.

Farb-Memory Spiel mit AVR, LCD-Display und Ton-Ausgabe

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 ;)

Farbmemory_0.1.jpg

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
 

thomas_st

Geowizard
qByter schrieb:
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).
Schöne Idee. Kleine Ergänzung (ohne das Programm durchgesehen zu haben): je nachdem wie weit der Spieler *ähm* Cacher kommt, könntest Du unterschiedliche KOs raus rücken: wenn er in Level 1 schon aussteigt, liegen die KOs der nächsten Stage in einem Baum in 10km Entfernung ... wenn er es bis Level 5 schafft, darf er in 100m Entfernung den 1 / 1 Mikro mit dem großen "Hier bin ich" Pfeil suchen.

qByter schrieb:
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.
Das wäre jetzt meine Frage gewesen - die fehlenden zwei Leitungen hätte man nämlich sicherlich noch irgendwie raus kitzeln können. Übrigens muss man oft die R/W-Leitung des LCDs nicht beschalten (ok, ich weiß nicht wie die LCD-Lib von Bascom agiert, aber das lesen vom LCD ist eigentlich nur nötig um das Busy-Bit auszulesen. Hier könnte man einfach mit entsprechend langen Wartezeiten agieren)

qByter schrieb:
die Lautstärke kann durch variieren von C1 und R3 angepasst werden.
Aber auch der Frequenzgang.

qByter schrieb:
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.
Es gäbe den Tiny 44 oder 84 : bei ansonsten identischem Aufbau haben die 4k bzw. 8k Speicher.

qByter schrieb:
Vor allem die Sound- und LCD-Befehle schlucken leider recht viel Speicher.
Die werden auch bei C einiges schlucken. Auch die Ansteuerung von I²C / TWI ist leider nicht "kostenlos" wie ich schon häufig leidlich feststellen musste. :/

Viele Grüße und schönes Projekt,
Thomas(_st)
 
OP
qByter

qByter

Geocacher
Hi,

Kleine Ergänzung (ohne das Programm durchgesehen zu haben): je nachdem wie weit der Spieler *ähm* Cacher kommt, könntest Du unterschiedliche KOs raus rücken: wenn er in Level 1 schon aussteigt, liegen die KOs der nächsten Stage in einem Baum in 10km Entfernung ... wenn er es bis Level 5 schafft, darf er in 100m Entfernung den 1 / 1 Mikro mit dem großen "Hier bin ich" Pfeil suchen.
Nette Idee - da könnte man den Schwierigkeitsgrad deutlich anheben und wer´s nicht bis Ende schafft muss eben laufen :D Aber das wird wohl in die 2k nicht mehr rein passen befürchte ich...

Es gäbe den Tiny 44 oder 84 : bei ansonsten identischem Aufbau haben die 4k bzw. 8k Speicher.
Dafür reicht dann leider die Demo-Version von Bascom nicht mehr (ist begrenzt auf 2k)...
Ich merk schon, ich muss auf C umsteigen... :roll:

cu,
qByter
 

thomas_st

Geowizard
qByter schrieb:
Es gäbe den Tiny 44 oder 84 : bei ansonsten identischem Aufbau haben die 4k bzw. 8k Speicher.
Dafür reicht dann leider die Demo-Version von Bascom nicht mehr (ist begrenzt auf 2k)...
Ich merk schon, ich muss auf C umsteigen... :roll:
Ähm, ja da war ja noch was - da bleibt wohl nur der Weg zur Bacom-Vollversion oder zu WinAVR :p

BTW: Ist die Grenze eigentlich fest, oder abhängig von AVR? Wenn fest, kann man ja mit den ATMega kaum arbeiten - die werden dann ja nur zu einem kleinen Teil gefüllt (wenn ich mal so an ATMega8, 88 168 oder 328 denke).

Viele Grüße,
Thomas(_st)
 

feinsinnige

Geomaster
qByter schrieb:
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.

Interessantes Projekt. Erinnert mich an de Kindheit: Senso.

f
 

Bussard

Geocacher
Hallo in die Runde,
als gelegentlicher Mitleser seit reichlich einem Jahr möchte ich mich nun doch einmal kurz zu Wort melden.
Die BASCOM-Demo-Codelänge ist seit geraumer Zeit auf 4 kB heraufgesetzt worden, das Projekt kann also problemlos erweitert werden (mit den geeigneten Tiny's).
Gruß Volker
 

Anhänge

  • Bascom_4k.jpg
    Bascom_4k.jpg
    5,1 KB · Aufrufe: 4.490
OP
qByter

qByter

Geocacher
@df1sam: Gibt wohl wirklich nix, was nicht schon mal irgendwo verbaut wurde ;)

@Bussard: Danke für den Hinweis, da werd ich doch glatt mal einen 44er bestellen...
 

Hucky3000

Geocacher
COOOOL !!!

Hatte dieser Tage die Idee für eine Station für einen neunen Nachtcache.
Ok, ohne Buzzer - aber ist ja egal ;) Ausserdem dachte ich für die Codeausgabe an 7- Segment. Mit LCD wollte ich aber immer schonmal was machen.

Frage: Ist die Schaltung und das Programm soweit ok, dass ich es übernehmen kann (darf) ?
Ich habe ein "Programmierkabel" aus dem Kochbuch für AtTiny13.
Geht das ohne weiteres für den 24er ?
Was für ein LCD-Modul muss ich mir besorgen ?

Unser erster Nachtcache ist zwar gerade fertig, aber ich habe schon wieder Entzug :???:

bei der Gelegenheit: Hat hier schon einmal wer was mit ner Lasersteuerung gebastelt ?
Wäre doch cool ne Koos-Ausgabe irgendwohin auftauchen zu lassen !
ich glaube ich komme so langsam ins Endstadium :schockiert:

Hucky
 

thomas_st

Geowizard
Hucky3000 schrieb:
Was für ein LCD-Modul muss ich mir besorgen ?
Eins mit einem HD44780 als Controller. Das ist so was wie der Standard der LCD-Controller; allerdings bekommt man oft nur ein "HD44780 kompatibles" Display - das wird vermutlich auch funktionieren, muss aber nicht!

Hucky3000 schrieb:
bei der Gelegenheit: Hat hier schon einmal wer was mit ner Lasersteuerung gebastelt ?
Es gab doch mal den Versuch eins RL mit Laser-Auslösung. Was ist da eigentlich daraus geworden?

Hucky3000 schrieb:
Wäre doch cool ne Koos-Ausgabe irgendwohin auftauchen zu lassen !
Achso, der Laser soll die KOs schreiben. Hier sehe ich die Herausforderung das Ganze mechanisch so zu fertigen, das es auch im Wald bei -10°C funktioniert; der nächste Gewitterschauer ihm nichts anhaben kann und auch der Herbststurm es kalt lässt.

Viele Grüße,
Thomas(_st)
 
OP
qByter

qByter

Geocacher
Hi,

das meiste hat Thomas ja schon beantwortet...
Als LCD hab ich das TC1602E-01 von Pollin verbaut. Die meisten HD44780(-kompatiblen) sollten wohl funktionieren, allerdings hatte ich auch schon zwei, die hinsichtlich der Kontrastspannung etwas anspruchsvoller waren und sich nicht ganz so einfach ansprechen lassen bzw. zusätzlichen Aufwand brauchen, um die nötige Kontrastspannung zu erzeugen...

Frage: Ist die Schaltung und das Programm soweit ok, dass ich es übernehmen kann (darf) ?
Klar, dafür steht´s ja hier ;)

Ich habe ein "Programmierkabel" aus dem Kochbuch für AtTiny13.
Geht das ohne weiteres für den 24er ?
Jein, hat eine etwas andere Belegung. Schau mal hier...

cu,
qByter
 

Hucky3000

Geocacher
Danke :)

Dann werde ich die Tage mal etwas einkaufen gehen.... ;)

Als Demo-Version von BASECOM habe ich 1.11.9.1
Kann das 4K ?

Hucky
 
OP
qByter

qByter

Geocacher
Ja, aber 4k brauchst Du nicht... Der Code hier kommt mit 2k aus (würde sonst auch nicht in den Tiny24 passen ;) )
 

Hucky3000

Geocacher
Ähhh.... ja.

Ich habe endlich mal Zeit gefunden das ganze etwas genauer zu betrachten.
Was ich für Widerstände vor den LEDs nehmen muss bekomme ich wohl noch hin.
Wie sieht es mit den anderen aus ? Und welcher Wert hat der Kondensator vorm Lautsprecher ?
Ist der keramisch ? Wie hochohmig muss der Lautsprecher in etwas ein ?
Wen nich schon einmal am Fragen bin, mag der Tiny auch 5V ?
Fragen über Fragen.....

Hucky
 
OP
qByter

qByter

Geocacher
Hi,

der Tiny kommt auch mit 5V klar, bis max. 5.5V glaube ich (am besten noch mal ins Datenblatt schauen ;) )
Die Widerstände vor dem PCT8574 sind ganz normale Pullups, ich glaube da hab ich 4,7k genommen...

Beim Lautsprecher musst Du einfach etwas probieren, bis die Lautstärke passt. Was ich da genommen habe kann ich gar nicht mehr genau sagen, ich glaube der LS hatte so um die 24Ohm, als Kondensator ein ganz normaler Elko mit irgendwas zwischen 4,7-47µf und ein niederohmiger Widerstand davor. Je nach LS war das Ergebnis recht unterschiedlich, ich bin da nach Abmessung gegangen, was noch ins Gehäuse passte, und hab dann mit den Werten rumprobiert, bis die Lautstärke akzeptabel war...

cu,
qByter
 

stonewood

Geowizard
thomas_st schrieb:
Hucky3000 schrieb:
bei der Gelegenheit: Hat hier schon einmal wer was mit ner Lasersteuerung gebastelt ?
Es gab doch mal den Versuch eins RL mit Laser-Auslösung. Was ist da eigentlich daraus geworden?
starglider hatte beim Artefakt 3 ein Reaktivlicht das auf Laserpointer reagiert. War auf 70m montiert. Sollte also auch mit normalem RL funktionieren.
 

Starglider

Geoguru
stonewood schrieb:
thomas_st schrieb:
Hucky3000 schrieb:
bei der Gelegenheit: Hat hier schon einmal wer was mit ner Lasersteuerung gebastelt ?
Es gab doch mal den Versuch eins RL mit Laser-Auslösung. Was ist da eigentlich daraus geworden?
starglider hatte beim Artefakt 3 ein Reaktivlicht das auf Laserpointer reagiert. War auf 70m montiert. Sollte also auch mit normalem RL funktionieren.
Das war eine Reaktivlicht mit LDR.

Es hätte von der Technik her auch auf viel größere Distanzen funktioniert, aber bereits bei 70 m war eine ruhige Hand nötig um den LDR mit 5 mm Durchmesser zu treffen. Bei einer größeren Distanz hätte man mit einer Kombination aus Zielfernrohr oder Fernglas und Laserpointer arbeiten müssen.
Und ob das so eine gute Idee ist...
 

thomas_st

Geowizard
Starglider schrieb:
stonewood schrieb:
starglider hatte beim Artefakt 3 ein Reaktivlicht das auf Laserpointer reagiert. War auf 70m montiert. Sollte also auch mit normalem RL funktionieren.
Das war eine Reaktivlicht mit LDR.
War das eine Modifikation? Ich bin mir nämlich sicher, das wir dieses RL gut mit einer Lampe auslösen konnte und nicht zwingend mit einem Laserpointer.

Viele Grüße,
Thomas(_st) - man muss nur das RL finden und nicht einen Reflektor mit diesem verwechseln ;)
 
Oben