Beiträge von hamyam

    //EDIT: btw ... eine Matrix bedeutet, dass eine "Zeile" und eine "Spalte" an jeweils einem I/O hängen.Die kannst Du nur erweitern, indem Du "Zeilen" und/oder "Spalten" mit jeweils dem zugehörigen I/O hinzufügst. Da kannst Du so ohne Weiteres nichts mehr "optimieren" ... ;)

    cu,

    Man könnte höchstens, um GPIOs zu sparen, einen Multiplexar davor hängen. Ob dieser alle Kanäle schnell genug abfragt ist dann die andere Frage und müsste getestet werden.

    Ja ganz genau.
    Bei richtiger Konfiguration kannst du dann sogar sowohl mit dem WLAN des Routers als auch mit dem RPi WLAN ins Internet.
    Das setzt aber voraus, dass Sie sich im DHCP Bereich nicht in die Füße kommen und das forwarding passt. Ist aber kein Problem wenn man sich ein klein wenig damit beschäftigt. Wenn du nach "RPi 3 Access Point" "Pi 3 hostapd" suchst, findest du viele Tutorials.
    Der RPi ist dann aus beiden Netzwerken erreichbar.

    Guten Morgen und willkommen.

    Das sehe ich ein wenig anders. Es kommt allerdings ganz auf die Netzwerktopologie an. Deinen Speedport wirst du allerdings immernoch für den Internetzugang benötigen. Wenn du nun den RPi per LAN an den Router hängst und über das im Pi3 integrierte WLAN Modul ein Netzwerk (inklusive DHCP) hostest, kann er die Downloadaufgaben übernehmen. Deine Endgeräte (PS o.ä.) greifen dann auf das WLAN des RPi zu. Wie stabil und leistungsfähig das WLAN von RasPi im Vergleich zum Speedport ist kann ich aber nicht beurteilen.
    Schau dir doch mal hier: https://www.elektronik-kompendium.de/sites/raspberry-pi/2002171.htm
    Vielleicht kommt diese Variante ja für dich in Frage.

    Gruß, HamYam

    Hallo Zusammen,

    Geht mal wieder um mein LED beerpong Projekt.
    Da ich die WebApp auf der die Statistiken gehostet und Spiele gestartet gerne möglichst einfach verfügbar machen möchte, hostet der RPi seinen eigenen AP.
    Das klappt soweit recht gut.
    Für den AP verwende ich hostapd und fürs DNS verwende ich dnsmasq

    Ich möchte nun einen QR Code erstellen mithilfe dessen sich potentielle Spieler und Interessenten mit dem WLAN ssid 'beerpong' wpa-2: 'beerpong' verbinden können und anschließend automatisch der browser zu 192.168.0.1 navigiert.

    Qr Code für WLAN ist kein Problem. Zweiter Code für die weiterleitung auch nicht. Ich möchte aber gerne beides in einem bzw. Den zweiten Schritt automatisch nach dem anmelden im WLAN ausführen.

    Vielleicht geht das ja über die konfig vom AP? Hat da jemand Erfahrung?

    Gruß HamYam


    Gesendet von meinem SM-G920F mit Tapatalk


    ... Zum Beispiel fehlt uns die Info für was deine Arduino's zuständig sind, mit welchen Befehlen die gefüttert werden oder was die genau steuern... Wir sehen also nur den halben Kuchen.

    Hi Zusammen,

    um diese Frage möglichst kurz zu vervollständigen:
    Angeschlossen sind 2 Arduino Nanos, je einer pro Seite. Dieser übernimmt die Bechererkennung per Infrarotdioden und steuert LEDs anhand der gewonnenen Infos. Der RPi sended regelmäßig eine Abfrage des Spielstandes an den Nano. Dieser Antwortet mit der Anzahl an Bechern. Siehe Foto mit detailierteren Infos.

    Spoiler anzeigen


    Zu sehen sind insgesamt 10 "Ringe" bestehend aus je 6 WS2812b LEDs. Mittig sitzt ein IR Sensor.
    Der Arduino liest über einen Multiplexar jeden der 10 Sensoren aus und schreibt den boolschen Wert in einen Array (Becher / kein Becher).
    Die LED Ringe werden dann entsprechend des korrespondierenden Wertes im Array geschaltet.
    eine weitere Funktion zählt die Anzahl der Becher und schreibt diese in eine Variable.
    Diese Variable wird dann vom RPi abgefragt (Kommando an Arduino: '?' Antwort vom Arduino: '5;')
    Da ich mich für die Kommandos an den Nano auf ein Zeichen begrenzt habe, brauche ich hier kein Endzeichen. Die Becherzahl kann aber auch zweistellig sein ('10). Aus diesem Grund habe ich das Endzeichen ';' eingebaut.

    Außerdem ist noch ein Teensy 3.2 angeschlossen. Dieser übernimmt die Steuerung der Matrix. Er bekommt verschiedene Kommandos (Punktestand setzen, Spielernamen setzen, Moduswechsel) und steuert die LED Matrix in der Mitte. Auch hier wieder mehr Infos und Foto im spoiler.

    Spoiler anzeigen


    Für die Darstellung des Spiels (Animatioen, Punktestand) habe ich mehrere Stufen in meinen Sketch eingebaut:
    1) Idle: Hier wird eine schöne Regenbogenanimation angezeigt. Läuft wenn grade kein Spiel am Laufen ist und so lange die Initalisierung noch läuft.
    2) startup: Lauftext der die Namen der Spieler / Teams anzeigt. Endet automatisch nach zwei Durchläufen bzw. 30 Sekunden
    3) game: zeigt den aktuellen Punktestand (wie im Foto)
    4) pause: es gibt Situationen in denen man eine Spielpause einlegen möchte. (Becher neu anordnen)
    5) Spiel beendet: Eine Animation die Abläuft wenn das Spiel beendet wurde. Geht nach 1 Min. automatisch in Modus 1) über

    Die Kommunikation zw. RPi und Teensy ist recht basic.
    RPi schickt dem Teensy in der Intialisierungsphase die Spielernamen ($Spieler1%Spieler2; ) dabei sind '$' und '%' die Kenner um die beiden von einander zu unterscheiden und das ';' das Kommandoendzeichen.
    Während des Spiels teilt der RPi dem Teensy mit '#4:10;' den Spielstand mit. Hier wieder das '#' als Anfangszeichen, der ':' als Trennzeichen und ';' als Abschluss.
    Weitherhin gibts mehrere Kommandos um die Modi zu wechseln 'terminate;' 'endgame;' 'idle;' 'startgame;' sind ein paar davon.
    Zurückgeben muss der Teensy an sich keine Infos an den RPi da er im Prinzip nur der Displaytreiber für das Spiel ist.

    Ich hoffe, ihr seht jetzt mehr vom Kuchen :)

    Grüße,

    HamYam

    Hi noisefloor,

    nein ich will gar keine Echtzeitdaten haben. Das Teil ist im wesentlichen ein "Partyspiel". Ich habe ja nicht umsonst ~350 LEDs verlötet um den Punktestand anzeigen zu lassen ;)
    Der Verlauf wird vom Spieleskript geloggt und später auf der GUI dargestellt. Also nur die Historie, keine Echtzeit.

    Wenn ich das jetzt richtig verstehe, habe ich das bottle-Skript und das Spieleskript dauerhaft laufen. Das Spieleskript ist dabei im Leerlauf, solange es keine Kommando von Bottle bekommt. Richtig?

    Hi noiseflor!

    Erstmal danke für die Antwort.


    Außerdem brauchst du um "live" Daten in der HTML-basierten GUI zu bekommen, definitiv JavaScript oder Websockets. Letzteres ist hier IMHO vorteilhaft, weil die HTML-GUI auf eine Event (wie z.B. einen Treffer) direkt reagieren kann.


    Nein, ich will gar keine live-Daten haben. Also sind die Websockets wohl nicht nötig.


    Auf dem Raspi brauchst du nach wie vor zwei Skripte: einen, dass den Server-Teil stellt und einen, der die Daten von den Arduinos empfängt. Die Skripte müssten miteinander kommunizieren, z.B. über eine Queue oder einen Socket.


    Das heißt also, ich habe ein Skript für die Webanwendung mit bottle und ein zweites, ähnlich zu dem bestehenden, das das Spiel hostet. Ich versuche dann mal, mich in die Thematik Queue / Socket einzulesen. Hast du da einen guten Einstiegspunkt für mich?


    Ansonsten sehe ich ehrlich gesagt dein konkretes Problem noch nicht... Wenn du eine PHP-Version hast, hast den den HTML-Teil doch fertig? Dann musst du "nur" auf der Serverseite den GET/POST Request von Routen entgegen nehmen lassen, die dann die entsprechenden Funktionen in Python ausführen...


    Ja ok, das habe ich (glaube ich) verstanden.

    Jetzt verstehe ich dann aber doch nicht mehr, wieso ich lieber bottle nehmen sollte als apache2 & php? Ich muss ja mit bottle trotzdem noch sicherstellen, dass nur eine Instanz des Spiels läuft, da trotzdem zwei unabhängige Skripte benötigt werden. Richtig?

    Gruß HamYam

    Hallo Zusammen,

    ich melde mich mal wieder mit meinem LED Beerpong Tisch Projekt. Nachdem mein altes Konzept der WebApp in diesem Thread zerstückelt wurde, habe ich mich entschlossen, eurem Rat zu folgen und ein permant laufendes Script für das Spiel zu entwerfen.

    Damit ich nicht nochmal so auf die Nase falle, hoffe ich auf Tips von etwas erfahreneren Projektern.

    Meine Vorstellungen bis jetzt:

    Beim startup wird das Hauptscript automatisch gestartet. Diese hat zwei Aufgaben:
    1.) die GUI hosten. In dieser sollen Spiele gestartet und beendet werden können, einige SQLite Operationen ausgeführt werden (Statistiken schreiben uns lesen) und es soll einen Fileuplod geben um die besten Schnappschüsse von der vergangengen Party zu sammeln.

    2.) Das Spiel an sich soll hier laufen. Dies beinhaltet serielle Kommikation mit zwei Arduino nanos und einem Teensy 3.2 über USB. Das alte Script hierfür habe ich aus dem anderen Beitrag mal noch in den spoiler kopiert. Die angesprochenen Verbesserungen wurden dabei noch nicht implemetiert! Mir ist klar, dass das so nicht eingebaut werden kann. Damit will ich zeigen, was alles implementiert und umgeschrieben werden muss.

    Spoiler anzeigen


    Meine erste Frage ist jetzt, wie baue ich das gesamte Script am besten auf?
    Da ich noch nie eine Seite mit bottle erstellt habe (bis auf verschiedene Tutorials natürlich) weiß ich nicht, wie ich das angehen muss.
    Die Tutorials sind immer sehr _statisch_ bzw. die Seiten sehr einfach gehalten. Auf meiner 'home' Seite sollen so bspw. sowohl Auswertung der letzten Spiele auftauchen, als auch das Starten von neuen Spielen (get/post) möglich sein. Das eine ODER das andere bekomme ich hin, beides aber nicht, da ich immer nur eine Methode an einen route binden kann. Im spoiler finded Ihr zwei Screenshot der aktuellen php Version. Nach dem Druck auf "start new game!" öffnet sich das modal in dem man die beiden Parteien auswählen kann und das Spiel starten. Unter dem Button ist die Übersicht der letzten Spiele. Diese werden aus der Datenbank geladen. Das möchste ich gerne auch wieder so umsetzten. Falls das überhaupt möglich ist...

    Spoiler anzeigen



    Wie ist das mit der Schleife für das Spiel an sich. Sobald das gestartet wird, hängt es ja quasi in der spielinternen Schleife fest. Ich befürchte, dass das negative Auswirkungen auf die GUI haben wird (keine Reaktion da Script blockiert). Liege ich da richtig oder ist das unbedenklich? Wie verhalten sich die routes von bottle bei umfangreichen Methoden?


    Ich hoffe, Ihr könnt mir da ein paar Tips und Hilfestellungen geben!
    Vielen Dank schonmal!
    Cheers,

    HamYam

    Sag mal ds, wenn man jetzt (noch) wenig Ahnung hat und sich in das Thema einlesen möchte, könntest du da Literatur empfehlen?

    Eventuell könnte man ja mit einer Kombination aus der genannten Lib und dem AN 3894 die Register des MPR121 manipulieren. Aber was, wenn man keine Ahnung von I2C Kommunikation und Registern hat?

    Könnte es vielleicht sogar eine Tabelle geben, in der steht, wie man die verschiedenen Register setzen muss um einen GPIO des MPR121 bspw. als Output zu verwenden (EN 1; DIR 1; CTL[0:1] 01)?

    Aber ich hab leider keine Ahnung, wo man sich in eine solchte Thematik gut einlesen könnte :)

    Es gibt mehrer Möglichkeiten so einen Motor zu betreiben.

    Die populärsten Wege sind wohl zum einen der von dir beschriebene mit " Widerstand, nen Transistor und was weis ich alles" und zum anderen mit einem Motortreiber.

    Beide Wege haben Ihre Vor- und Nachteile.
    Wenn du die Widerstand,-Transistor-und-son-Kram-Methode wählst, solltest du dich schon ein wenig mit Elektronik auskennen bzw. den Unterschied der einzelnen Bauteile kennen und im besten Fall verstehen. Die Teile sind meist sehr günstig.
    Der Motortreiber Weg ist recht Fool-Proof aber die Boards sind oft recht teuer und/oder werden für den RPi verkauft, obwohl sie mit 5V anstelle 3,3V arbeiten (Stichwort RPi Relais...) das wäre so ein Motortreiber Board
    Automatisch zusammengefügt:
    Nachtrag:

    schau mal in diesen Thread: Motor mit Transistor steuern

    Ja, dringend!

    der Pi macht 3,3V bei max ~2-3 mA

    P.s.: leider fängt mein Spamfilter auf der Arbeit das Bild ab. Kannst du es forenintern hochladen?

    Wie schauts mit der generellen Verkabelung aus? Hast du den im Datenblatt genannten 50Ohm Widerstand eingebaut. Ich hatte bei meinem WS2812B Stripe ein ähnliches Verhalten. Das wurde durch den Widerstand behoben.

    Spoiler anzeigen

    The Connection and Driving of Cascading Operation

    The transmit the data over long distance by cascading, the WS2801 integrates push-pull output stage with strong driving capability which enables the data and clock can be transmitted up to 6 meters at 2MHz clock frequency.
    To prevent the reflection, it is necessary to connect a 50Ω resistor at the data input or output port for impedance match

    Hallo Meigrafd,

    danke für deine ausführliche Antwort!

    Ja tatsächlich, dass Skript blockiert den Browser bis es zuende ist. Das habe ich bis jetzt nicht als störend empfunden. Ich denke aber, dass ich auf lange Sicht meine WebApp über bottle umsetzen werde. Damit habe ich aber noch nie gearbeitet und dementsprechend erstmal den Weg gewählt, der (meiner Ansicht nach) einfacher zu lernen war. Darauf kann ich jetzt gut aufbauen :)

    Keine Ahnung wieso ich shell_exec() benutzt habe... Habe ich mir eigentlich abgewöhnt. Naja, wird geändert.
    Gleiches gilt fürs sudo. Das ist noch das Relikt vom debuggen. Meine Rechtevergabe war nicht ordentlich eingestellt also habe ich rumprobiert :D
    Keine sorge, der Raspi hängt nicht am Internet.

    zu den anderen zwei Punkten:
    1) global: Ich wollte auf die Variable "game_id" auch außerhalb der Methode zugreifen können. Dies ist mir ohne global nicht gelungen. Da die Methode in eine lange Schleife übergeht, habe ich auch Rückgabeparameter ausgeschlossen und global erschien mir als einfachen Weg. Wie ginge es denn besser?

    2) Ich bin froh, dass die Datanbank querys überhaupt funktioniert haben. Deine Anregungen werde ich mir für die Optimierung zu Herzen nehmen, danke :)

    3) schon beantwortet :)


    Ich denke ich werde jetzt folgenden Weg nehmen:

    Spiel und WebApp als kontinuierlich laufendes Python Skript entwerfen mit Bottle o.ä. . Das Skript nur einmal ausführbar machen und einen daemon laufen lassen, der es neustartet im Crashfall.

    Vielen Dank für eure Hilfe! Bis zum nächsten Mal beim debuggen meines Skripts :)