{"id":25436644,"url":"https://github.com/esadsahinbbs/project-greenpi","last_synced_at":"2026-04-12T23:49:03.231Z","repository":{"id":277165383,"uuid":"922675419","full_name":"EsadSahinBBS/Project-GreenPi","owner":"EsadSahinBBS","description":"Greenfoot games powered by Raspberry pi. ","archived":false,"fork":false,"pushed_at":"2025-02-14T17:43:49.000Z","size":105,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-05-15T03:11:23.448Z","etag":null,"topics":["raspberry-pi"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/EsadSahinBBS.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-01-26T20:18:00.000Z","updated_at":"2025-02-14T17:43:52.000Z","dependencies_parsed_at":null,"dependency_job_id":"84433b41-cb77-426f-9d3f-db5dac9f28ef","html_url":"https://github.com/EsadSahinBBS/Project-GreenPi","commit_stats":null,"previous_names":["esadsahinbbs/project-greenpi"],"tags_count":2,"template":false,"template_full_name":null,"purl":"pkg:github/EsadSahinBBS/Project-GreenPi","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/EsadSahinBBS%2FProject-GreenPi","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/EsadSahinBBS%2FProject-GreenPi/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/EsadSahinBBS%2FProject-GreenPi/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/EsadSahinBBS%2FProject-GreenPi/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/EsadSahinBBS","download_url":"https://codeload.github.com/EsadSahinBBS/Project-GreenPi/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/EsadSahinBBS%2FProject-GreenPi/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":278399611,"owners_count":25980331,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-10-04T02:00:05.491Z","response_time":63,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["raspberry-pi"],"created_at":"2025-02-17T08:21:17.526Z","updated_at":"2025-10-05T01:52:42.321Z","avatar_url":"https://github.com/EsadSahinBBS.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Project-GreenPi\nGreenfoot games powered by Raspberry Pi. \n\nMein persönliches Profil:\nhttps://github.com/PowerCmptr\n\n![image](https://github.com/user-attachments/assets/6551ec35-12ae-4d5c-941d-f07bd8f63e1a)\n\n\n\nProjekt für Infotag 2025 der Bertha-Benz TG/IT.\n\n![Screenshot 2025-02-12 135205](https://github.com/user-attachments/assets/e1414e98-dd2f-449c-bb49-c36c5609ce9f)\n\nEin retro style Arcade Automat wird mithilfe von einem Raspberry Pi 4 aufgebaut und optimiert um selbst gemachte Java-Spiele der Klasse zu spielen. \nNatürlich ist das ganze nicht nur darauf beschränkt und könnte mit RetroPie combiniert werden also ist jeder Willkommen sich auf ein Peojekt zu wagen. \n\nFür unsere Version haben wir folgende Bauteile verwendet (was zumindest die Technick angeht):\n- Raspberry Pi 4 B+ (2GB Modell)\n- Raspberry Pi Kühlgehäuse (Optional aber empfohlen)\n- Arduino UNO R3 (Jeder UNO mit I2C sollte passen)\n- 2x 5V Analog Joystick-Module\n- 8x 2 Pin Arcade-Tasten\n- einen alten 17 Zoll 4:3 Monitor \n- Holzgehäuse\n\nEine technische Zeichnung für das Gehäuse ist hier abgebildet (ohne Tasteneinbohrungen):\n![image](https://github.com/user-attachments/assets/b028434d-3576-4bc9-a407-0e60ae619a37)\n\n\n\nWir begannen indem wir das Panel des Monitors aus dem ursprünglichen Gehäuse mamen und in unser Holzgehäuse für den Bau einsetzten.\nDie Technick kam erst dannach. Für die Installation habe ich mich für den Raspberry Pi OS entschieden (Recalbox, Lakka oder RetroPie möglich). \nFür die Folgende Betriebssysteminstallation kann man das Gewünschte Betriebssystem auf einer SD Karte für den Zugehörigen Pi installieren. \nHier geht es zum Download:\n\nhttps://www.raspberrypi.com/software/\n\nIm Betriebssystem angekommen muss gegebenfalls Python und die benötigte Bibliothek installiert werden. Dazu öffnet ihr zunächst das Terminal. (Bei RetroPie F4 beim Setup verwenden)\n\n```\nsudo apt update\nsudo apt install python3\nsudo apt install python3-evdev\nsudo apt install python3-smbus\n```\n\nAnschließend muss das I2C-Protokoll der GPIO Pins aktiviert werden. Dazu verwendet ihr:\n```\nsudo raspi-config\n```\n\nUnd geht über \"Interface Options\" auf die I2C Option.\n\n\nDas war's vorerst mit dem Pi. \n\nArduino UNO\n\nArduino UNO ist ein passender Mikrocontroller aufgrund der I2C compatibilität, welche direkte Kommunikation mit dem Pi ermöglicht, aber auch des simplicismus der Analog-Eingänge, als auch 5V und 3.3V unterstützung. In unserem Fall verwenden wir einen Arduino UNO R3. (jeder Arduino mit I2C und 4 Analog-Eingängen ist verwendbar mit ein paar Einstellungen in der Software). Um diesen zu Programmieren verwenden wir hierbei die Arduino IDE. Zum Download geht es hier:\n\nhttps://www.arduino.cc/en/software\n\nAngekommen in der Software verbindet ihr euren Arduino mit einem USB Kabel mit dem Computer und wählt diesen aus. \n![image](https://github.com/user-attachments/assets/58427fc6-75cd-478a-a5f3-e38e5c4c4339)\n\nWir programmieren den Arduino die Werte der Analog-Eingänge A0-A3 über I2C weiterzuhgeben:\n\n```\n#include \u003cWire.h\u003e\n\n/*\n* Code für den Arduino des Project GreenPi für den Infotag der Bertha-Benz-Schule Sigmaringen\n* geschrieben von Esad Sahin der Klasse EKIT 2025\n*/\n\nvoid setup() {\n  Wire.begin(0x08); // Arduino als I2C-Slave mit der Adresse 0x08 setzen\n  Wire.onRequest(requestEvent); // Definiert was auf Datenanfrage passiert\n}\n\nvoid loop() {\n  // Nichts hier. Daten werden nur auf Anfrage des Pis gesendet\n}\n\nvoid requestEvent() {\n  int val1 = analogRead(A0) / 4; // X-Achse des ersten Joysticks\n  int val2 = analogRead(A1) / 4; // Y-Achse des ersten Joysticks\n\n  int val3 = analogRead(A2) / 4; // X-Achse des zweiten Joysticks\n  int val4 = analogRead(A3) / 4; // Y-Achse des zweiten Joysticks\n\n  // Die Werte weitergeben\n  Wire.write(val1); \n  Wire.write(val2); \n  Wire.write(val3); \n  Wire.write(val4);  \n}\n\n```\n\nDa wir den code haben können wir uns die Verbindungen der Geräte anschauen:\n```\nArduino UNO | Raspberry Pi\n3.3v |  3.3v\nVin  |  5v\nGND  |  GND\nSDA  |  SDA (GPIO 2)\nSDC  |  SDC (GPIO 3)\n```\nDie Analog-Sticks werden so Verbunden:\n\nStick 1 (an Arduino):\n5v  |  5v\nGND |  GND\nVRX |  A0\nVRY |  A1\n\nStick 2 (an Arduino):\n5v  |  5v\nGND |  GND\nVRX |  A2\nVRY |  A3\n\nDas finale Produkt sollte in etwa so aussehen:\n\n![image](https://github.com/user-attachments/assets/ee029c1c-9a85-4759-b842-12aa72158c4f)\n\nZurück am Pi angekommen, erstellen wir jetzt den eigentlichen Code, welcher Tastatureingabe simuliert:\n\n```\ncd ~\nmkdir controls\ncd controls\nsudo nano maini2c.py\n```\n\nIm folgendem Fenster fügt ihr nun den Python-Code für den Raspberry Pi ein:\n\n```\nimport smbus\nimport time\nfrom evdev import UInput, ecodes as e\n\n# Code für den Raspberry Pi zum erhalten der I2C Werte des Arduinos für das GreenPi-Projekts für den Infotag der Bertha-Benz-Schule Sigmaringen\n# Code von Esad Sahin der Klasse EKIT 2025\n\n\n# I2C Protokoll initialisieren\nbus = smbus.SMBus(1)  \narduino_addr = 0x08  \n\n# Tastaturausgabe initialisieren\nui = UInput()\n\n# Tastenbelegung definieren\nKEYS = {\n    \"W\": e.KEY_W,\n    \"A\": e.KEY_A,\n    \"S\": e.KEY_S,\n    \"D\": e.KEY_D,\n    \"UP\": e.KEY_UP,\n    \"DOWN\": e.KEY_DOWN,\n    \"LEFT\": e.KEY_LEFT,\n    \"RIGHT\": e.KEY_RIGHT\n}\n\n# Threshold für Joystickbewegung\nDEADZONE = 20  # Anpassen falls nötig\nCENTER = 127   # Da A1, A2, A3, und A4 Werte von 0 bis 255 wiedergeben\n\n# Track pressed keys\npressed_keys = set()\n\n# Debug-Ausgabendrosselung\nlast_debug_time = 0\nDEBUG_INTERVAL = 0.1  # 100ms\n\ndef press_key(key):\n    if key not in pressed_keys:\n        ui.write(e.EV_KEY, KEYS[key], 1)  # Press key\n        ui.syn()\n        pressed_keys.add(key)\n        print(f\"[KEY PRESS] {key}\")  # Debug\n\ndef release_key(key):\n    if key in pressed_keys:\n        ui.write(e.EV_KEY, KEYS[key], 0)  # Release key\n        ui.syn()\n        pressed_keys.remove(key)\n        print(f\"[KEY RELEASE] {key}\")  # Debug\n\ntry:\n    while True:\n        try:\n            data = bus.read_i2c_block_data(arduino_addr, 0, 4)  # Read 4 bytes (2 for each joystick)\n            x1, y1, x2, y2 = data[0], data[1], data[2], data[3]\n\n            # Debug print rate limit\n            current_time = time.time()\n            if current_time - last_debug_time \u003e DEBUG_INTERVAL:\n                print(f\"[DEBUG] Joystick 1 X: {x1}, Y: {y1} | Joystick 2 X: {x2}, Y: {y2}\")\n                last_debug_time = current_time\n\n            # Joystick 1 (WASD)\n            if x1 \u003c CENTER - DEADZONE:\n                press_key(\"A\")\n                release_key(\"D\")\n            elif x1 \u003e CENTER + DEADZONE:\n                press_key(\"D\")\n                release_key(\"A\")\n            else:\n                release_key(\"A\")\n                release_key(\"D\")\n\n            if y1 \u003c CENTER - DEADZONE:\n                press_key(\"W\")\n                release_key(\"S\")\n            elif y1 \u003e CENTER + DEADZONE:\n                press_key(\"S\")\n                release_key(\"W\")\n            else:\n                release_key(\"W\")\n                release_key(\"S\")\n\n            # Joystick 2 (Pfeiltasten)\n            if x2 \u003c CENTER - DEADZONE:\n                press_key(\"LEFT\")\n                release_key(\"RIGHT\")\n            elif x2 \u003e CENTER + DEADZONE:\n                press_key(\"RIGHT\")\n                release_key(\"LEFT\")\n            else:\n                release_key(\"LEFT\")\n                release_key(\"RIGHT\")\n\n            if y2 \u003c CENTER - DEADZONE:\n                press_key(\"UP\")\n                release_key(\"DOWN\")\n            elif y2 \u003e CENTER + DEADZONE:\n                press_key(\"DOWN\")\n                release_key(\"UP\")\n            else:\n                release_key(\"UP\")\n                release_key(\"DOWN\")\n\n        except Exception as e:\n            print(\"[ERROR] I2C Read Failed:\", e)\n\n        time.sleep(0.05)  # Verzögerung um pam zu vermeiden \n\nexcept KeyboardInterrupt:\n    print(\"[EXIT] Programm wird gestoppt...\")\n    ui.close()\n\n```\n\nNach dem Einfgen des codes, seichern mit Strg + X und anschließend die Anfrage auf Speichern mit Y (yes) und Enter beantworten. \nBeim Ausführen des codes mit \n```\nsudo python3 maini2c.py\n```\nsollten die einzelnen Analog-Sticks WASD und Pfeiltasten simulieren und den Zustand im Terminal anzeigen. \n\nDa jetzt die Analog-Sticks convertiert werden, können wir uns auf die einzelnen Tasten fokussieren. Da die Tasten keinen Analog-Output wiedereben können wir diese direkt mit dem Raspberry Pi GPIO verbinden. Eine mögliche Überlegung wöre auch das I2C des Arduinos weiterhin zu verwenden, damit aber keine Signale durch Überlastung des I2C verloren gehen habe ich beschlossen den Arduino nicht zu verwenden.\nHierfür erstellen wir im selben Ordner im Pi eine neue Python datei mit:\n```\nsudo nano mainbuttons.py\n```\nHier fügen wir diesen Code ein:\n```\nimport evdev\nimport RPi.GPIO as GPIO\nimport time\n\n# Code für den Raspberry Pi des GreenPi Projekts für die Tastensteuerung des Projekt GreenPi für den Infotag der Bertha-Benz-Schule-Sigmaringen\n# Geschrieben von Esad Sahin der Klasse EKIT 2025\n\n# Tastenbelegung: GPIO-Pin -\u003e Zeichen\nKEY_MAPPING = {\n    17: evdev.ecodes.KEY_1,\n    18: evdev.ecodes.KEY_2,\n    27: evdev.ecodes.KEY_3,\n    22: evdev.ecodes.KEY_4,\n    23: evdev.ecodes.KEY_5,\n    24: evdev.ecodes.KEY_6,\n    25: evdev.ecodes.KEY_7,\n    5: evdev.ecodes.KEY_8,\n    6: evdev.ecodes.KEY_9,\n    12: evdev.ecodes.KEY_0,\n}\n\n# GPIO Setup\nGPIO.setmode(GPIO.BCM)\nfor pin in KEY_MAPPING.keys():\n    GPIO.setup(pin, GPIO.IN, pull_up_down=GPIO.PUD_UP)\n\n# Virtuelles Eingabegerät erstellen\ndevice = evdev.UInput()\n\ndef send_key(key_code):\n    device.write(evdev.ecodes.EV_KEY, key_code, 1)  # Taste gedrückt\n    device.write(evdev.ecodes.EV_KEY, key_code, 0)  # Taste losgelassen\n    device.syn()\n\ndef main():\n    try:\n        while True:\n            for pin, key_code in KEY_MAPPING.items():\n                if GPIO.input(pin) == GPIO.LOW:\n                    send_key(key_code)\n                    time.sleep(0.2)  # Entprellung\n    except KeyboardInterrupt:\n        print(\"Beende Skript...\")\n        GPIO.cleanup()\n        device.close()\n\nif __name__ == \"__main__\":\n    main()\n\n```\n\nNach dem Speichern (Strg + X, Y, Enter) können wir die Tasten verbinden und Testen. Dafür verbinden wir einen Pin an eines der Angegebenen GPIO Pins und den anderen an einen GND (Man kann mehrere Pins and einen GND Input anstecken). Der Code ist in der Form begrenzt auf maximal 10 Tasten, welche die Zahlenreihe einer Tastatur emulieren (0-9). Hier ein Überblick an verwendbaren GPIO Pins:\n\n17, 18, 27, 22, 23, 24, 25, 5, 6, 12\n\nEinen Überblick zu den GPIO Pins habt ihr hier:\n![image](https://github.com/user-attachments/assets/d6b80798-7637-4e9d-8ea2-d6fa1a654c6a)\n\nSo könnt ihr den Code testen:\n```\nsudo python3 mainbuttons.py\n```\n\nWenn dies klappt seit ihr praktisch fertig.\nNun könnt ihr einige Spiele eurer Wahl auf dem Raspberry Pi spielen und vielleicht euch auch selber an die Programmierung eines eigenen Spiels wagen?\nFalls etwas nicht geklappt haben sollte findet ihr zur hilfe hier ein vollständiges Verkabelungsschema zur Überprüfung der Verkabelung:\n![Verkabelungsschema](https://github.com/user-attachments/assets/d97e9c0a-3f7b-4087-890d-60419004377a)\n\n\n![IMG_2521](https://github.com/user-attachments/assets/45cc826b-7146-423b-a45a-99d7b8684b65)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fesadsahinbbs%2Fproject-greenpi","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fesadsahinbbs%2Fproject-greenpi","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fesadsahinbbs%2Fproject-greenpi/lists"}