- LiFePO4 Speicher Test         
Ergebnis 1 bis 8 von 8

Thema: Automatisiertes Kinderspiel "Spritzenhaus"

  1. #1
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    01.03.2007
    Ort
    Kornwestheim (kWh)
    Beiträge
    1.118

    Automatisiertes Kinderspiel "Spritzenhaus"

    Anzeige

    Praxistest und DIY Projekte
    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
    Code:
    0 Punkte        3
    Spieler 1
    angezeigt und von 3 mit Trötern runtergezählt.
    Dann wird
    Code:
    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)
    Gruß, AlKi

    Jeder Mensch lebt wie ein Uhrwerk, wie ein Computer programmiert...
    ==> UMPROGRAMMIEREN!

    Kubuntu

  2. #2
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    01.03.2007
    Ort
    Kornwestheim (kWh)
    Beiträge
    1.118
    Hier noch der (Bascom-)Quellcode:
    Code:
     ' 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 ------------------------------------------------
    Gruß, AlKi

    Jeder Mensch lebt wie ein Uhrwerk, wie ein Computer programmiert...
    ==> UMPROGRAMMIEREN!

    Kubuntu

  3. #3
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    21.07.2007
    Ort
    Greudnitz
    Alter
    36
    Beiträge
    344
    Hi,

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

    Gruß
    Kollaps einer Windturbine
    (oder: Bremsen ist für Anfänger )

  4. #4
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    01.03.2007
    Ort
    Kornwestheim (kWh)
    Beiträge
    1.118
    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
    Bild hier  
    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 )
    Gruß, AlKi

    Jeder Mensch lebt wie ein Uhrwerk, wie ein Computer programmiert...
    ==> UMPROGRAMMIEREN!

    Kubuntu

  5. #5
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    17.08.2004
    Beiträge
    1.065
    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
    ...

  6. #6
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    01.03.2007
    Ort
    Kornwestheim (kWh)
    Beiträge
    1.118
    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.)
    Gruß, AlKi

    Jeder Mensch lebt wie ein Uhrwerk, wie ein Computer programmiert...
    ==> UMPROGRAMMIEREN!

    Kubuntu

  7. #7
    Benutzer Stammmitglied
    Registriert seit
    29.11.2007
    Alter
    35
    Beiträge
    66
    Toll dass du sowas durchziehst! =D> Ich brauch unbedingt mehr Zeit, dann kann ich mich auch wieder den Microcontrollern zuwenden

  8. #8
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    01.03.2007
    Ort
    Kornwestheim (kWh)
    Beiträge
    1.118
    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:
    Bild hier  
    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
    Gruß, AlKi

    Jeder Mensch lebt wie ein Uhrwerk, wie ein Computer programmiert...
    ==> UMPROGRAMMIEREN!

    Kubuntu

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

Solar Speicher und Akkus Tests