Av karl.svartholm@gmail.com / 0703-886860 (control.thatvoid.com).
Kontakta mig om du behöver delarna (200 kr), eller köp sjÀlv: Appendix B: Komponenter (blir lite dyrare).
Kontrollen fungerar som ett tangentbord och kan kopplas till dator eller Android-telefon / -tablet, kan fungera pÄ iOS & andra enheter - berÀtta om det funkar!
...se att minidatorn fÄr ström & startar.
đ§© Delar:
Koppla in USB-kabeln till datorn & ESP32:n.
...LED-lampan pÄ minidatorn ska blinka till.
...för att se att vi kan köra kod.
đ§© Delar: Thonny (program / kod-editor), 1 rad kod.
c och tryck â¶ïž Run current script (F5)....för att se att & hur saker funkar.
đ§© Delar: 4 rader kod.
import board, neopixel
led = neopixel.NeoPixel(board.IO21, 1, brightness=0.1)
while True: # Programloop
led.fill((0, 255, 255)) # fyll i en fÀrg
Eller öppna filen 2a-led-minimal.py (som igger pÄ ESP:n), nÀr frÄgad om varifrÄn vÀlj "CircuitPython device":
Tryck â¶ïž Run current script (F5).
𧩠Delar: knapp, 2 sladdar (en jord / nolla & en för signal).
âčïž Svarta sladdar anvĂ€nds normalt för jord / 0 volt / -
Röda sladdar anvÀnds normalt för ström, 3,3 volt för denna ESP32.
âčïž Breadborden (den vita grejen med hĂ„l i) ansluter pinnarna frĂ„n ESP:n sĂ„ som pilarna visar (att sĂ€tta i en stadd i ett av hĂ„len lĂ€ngs pilarna Ă€r alltsĂ„ samma sak som att sĂ€tta en sladd direkt pĂ„ pinnen).
...för att se att knappen fungerar.
Delar đ§©
import board, neopixel, digitalio
# StÀll in knappen
knapp = digitalio.DigitalInOut(board.IO1) # IO1 = pinnen knappen sitter pÄ
knapp.direction = digitalio.Direction.INPUT # vi ska lÀsa vÀrdet frÄn knappen (INPUT)
knapp.pull = digitalio.Pull.UP # inbyggt motstÄnd, normalt "pÄ"
led = neopixel.NeoPixel(board.IO21, 1, brightness=0.1) # LED pÄ pinne IO21
while True: # Programloop
if not knapp.value: # om knappen Àr nedtryckt
led.fill((0, 0, 255)) # fyll i en fÀrg
else:
led.fill((0, 0, 0)) # slÀck
Eller öppna & kör filen 4-knapp-tÀnder-led.py som ligger pÄ ESP:n.
Delar đ§©
import board, neopixel, digitalio, time, usb_hid
from adafruit_hid.keyboard import Keyboard
from adafruit_hid.keycode import Keycode
led = neopixel.NeoPixel(board.IO21, 1, brightness=0.1) # LED pÄ pinne IO21
# StÀll in knappen
knapp = digitalio.DigitalInOut(board.IO1) # IO1 = pinnen knappen sitter pÄ
knapp.direction = digitalio.Direction.INPUT # vi ska lÀsa vÀrdet frÄn knappen (INPUT)
knapp.pull = digitalio.Pull.UP # inbyggt motstÄnd, normalt "pÄ"
kbd = Keyboard(usb_hid.devices) # initiera USB-tangentbord
while True:
if not knapp.value: # om knappen Àr nedtryckt
led.fill((0, 0, 255)) # fyll i en fÀrg
kbd.send(Keycode.SPACE) # skicka space (tryck + slÀpp)
else:
led.fill((0, 0, 0)) # slÀck
time.sleep(0.1) # liten paus: skicka space max 10 gÄnger / sekund
# Nu kan du t ex spela chrome://dino eller flappybirds
Eller öppna & kör filen 5-knapp-skickar-space.py som ligger pÄ ESP:n.
Delar đ§©: 1 Joystick, 3 sladdar: svart, röd & fĂ€rgglad
Delar đ§©: ~7 rader kod
# JĂ€mte den andra knapp koden:
joy_knapp = digitalio.DigitalInOut(board.IO2) # joystick-knapp
joy_knapp.direction = digitalio.Direction.INPUT
joy_knapp.pull = digitalio.Pull.UP # hÄll "pÄ" nÀr knappen inte trycks
# Och i programmloopen:
if not joy_knapp.value:
kbd.send(Keycode.SPACE)
Eller öppna filen 7-joystick-knapp-skickar-space.py.
...sÄ att vi förstÄr vad för data / information som kommer frÄn joysticken.
Delar đ§©:
import board, neopixel, digitalio, time, usb_hid, analogio
x = analogio.AnalogIn(board.IO3) # joystick X-axel
# och i Programmloopen:
print(x.value)
Eller öppna och kör filen 8-joystick-skriv-ut-x.py.
Delar đ§©: 4 rader kod
if NĂ
GOT NOGOT
# Skicka en knapptryckning
elif NĂ
GOT NĂ
GOT
# Skicka en annan knapptryckning
if x.value < 25000:
kbd.send(Keycode.LEFT_ARROW)
elif x.value > 40000:
kbd.send(Keycode.RIGHT_ARROW)
...kan du klura ut detta?
...detta Àr för att knappar normalt sÀger till bÄde nÀr de trycks ner och slÀpps upp, just nu skickar vi bara en "knapptrycking" istÀllet (max 10 gÄnger per sekund). Testa den hÀr koden om du vill:
import time, board, digitalio, neopixel, usb_hid, analogio
from adafruit_hid.keyboard import Keyboard
from adafruit_hid.keycode import Keycode
led = neopixel.NeoPixel(board.IO21, 1, brightness=0.1) # LED pÄ pinne IO21
# --- knapp för SPACE ---
knapp = digitalio.DigitalInOut(board.IO1) # IO1 = pinnen knappen sitter pÄ
knapp.direction = digitalio.Direction.INPUT
knapp.pull = digitalio.Pull.UP # hÄll pinnen "pÄ" nÀr knappen inte trycks
kbd = Keyboard(usb_hid.devices) # initiera USB-tangentbord
# --- joystick-instÀllningar ---
joy_x = analogio.AnalogIn(board.IO3) # joystick X-axel
joy_y = analogio.AnalogIn(board.IO4) # joystick Y-axel
joy_knapp = digitalio.DigitalInOut(board.IO2) # joystick-knapp
joy_knapp.direction = digitalio.Direction.INPUT
joy_knapp.pull = digitalio.Pull.UP # hÄll "pÄ" nÀr knappen inte trycks
CENTER = 32768 # mittvÀrde för analog lÀsning (0..65535)
DĂDZON = 6000 # omrĂ„de runt mitten dĂ€r inget hĂ€nder
# Upprepningshastighet för SPACE nÀr knappen hÄlls nere
SPACE_REPEAT = 0.08 # sekunder mellan varje SPACE (0.08 â 12.5 st / sekund)
senaste_space = 0.0
while True:
nu = time.monotonic()
# --- LĂS KNAPPAR ---
knapp_tryckt = not knapp.value # True = tryckt (pga pull-up)
joy_tryckt = not joy_knapp.value # True = tryckt
# TÀnd LED om huvudknappen hÄlls nere
led.fill((0, 0, 255) if knapp_tryckt else (0, 0, 0))
# --- SPACE: HĂ
LLA NED = SPAMMA SPACE ---
space_aktiv = knapp_tryckt or joy_tryckt
if space_aktiv and (nu - senaste_space) >= SPACE_REPEAT:
kbd.send(Keycode.SPACE)
senaste_space = nu
# --- JOYSTICK-RIKTNING ---
# LÀs joystickens position (byt plats pÄ x/y om det kÀnns "fel")
y = joy_x.value - CENTER
x = joy_y.value - CENTER
# VÀnster / Höger
if x > DĂDZON:
# höger
kbd.press(Keycode.LEFT_ARROW)
kbd.release(Keycode.RIGHT_ARROW)
elif x < -DĂDZON:
# vÀnster
kbd.press(Keycode.RIGHT_ARROW)
kbd.release(Keycode.LEFT_ARROW)
else:
# ingen riktning
kbd.release(Keycode.LEFT_ARROW)
kbd.release(Keycode.RIGHT_ARROW)
# Upp / Ner
if y > DĂDZON:
# ner
kbd.press(Keycode.DOWN_ARROW)
kbd.release(Keycode.UP_ARROW)
elif y < -DĂDZON:
# upp
kbd.press(Keycode.UP_ARROW)
kbd.release(Keycode.DOWN_ARROW)
else:
# ingen riktning
kbd.release(Keycode.UP_ARROW)
kbd.release(Keycode.DOWN_ARROW)
# Liten paus för att inte överbelasta allt
time.sleep(0.003)
...sÄ att det körs varje gÄng kontrollern fÄr ström, oavsett var den ansluts.
Spara din fil som code.py (pÄ CIRCUITPY devicen), skriv över den gamla.
Den andra kan till exempel skicka W, A, S, D (istÀllet för piltangenter).
(Eventuellt kan vi senare göra en version dÀr ena joysticken funderar som en mus).
Delar đ§©:
import time, board, digitalio, neopixel, usb_hid, analogio
from adafruit_hid.keyboard import Keyboard
from adafruit_hid.keycode import Keycode
led = neopixel.NeoPixel(board.IO21, 1, brightness=0.1) # LED pÄ pinne IO21
# --- knapp för SPACE ---
knapp = digitalio.DigitalInOut(board.IO1) # IO1 = pinnen knappen sitter pÄ
knapp.direction = digitalio.Direction.INPUT
knapp.pull = digitalio.Pull.UP # hÄll pinnen "pÄ" nÀr knappen inte trycks
kbd = Keyboard(usb_hid.devices) # initiera USB-tangentbord
# --- joystick-instÀllningar ---
joy_x = analogio.AnalogIn(board.IO3) # joystick X-axel
joy_y = analogio.AnalogIn(board.IO4) # joystick Y-axel
joy_knapp = digitalio.DigitalInOut(board.IO2) # joystick-knapp
joy_knapp.direction = digitalio.Direction.INPUT
joy_knapp.pull = digitalio.Pull.UP # hÄll "pÄ" nÀr knappen inte trycks
joy2_x = analogio.AnalogIn(board.IO6) # joystick X-axel
joy2_y = analogio.AnalogIn(board.IO7) # joystick Y-axel
joy2_knapp = digitalio.DigitalInOut(board.IO5) # joystick-knapp
joy2_knapp.direction = digitalio.Direction.INPUT
joy2_knapp.pull = digitalio.Pull.UP # hÄll "pÄ" nÀr knappen inte trycks
CENTER = 32768 # mittvÀrde för analog lÀsning (0..65535)
DĂDZON = 6000 # omrĂ„de runt mitten dĂ€r inget hĂ€nder
# Upprepningshastighet för SPACE nÀr knappen hÄlls nere
SPACE_REPEAT = 0.08 # sekunder mellan varje SPACE (0.08 â 12.5 st / sekund)
senaste_space = 0.0
while True:
nu = time.monotonic()
# --- LĂS KNAPPAR ---
knapp_tryckt = not knapp.value # True = tryckt (pga pull-up)
joy_tryckt = not joy_knapp.value # True = tryckt
joy2_tryckt = not joy2_knapp.value # True = tryckt
# TÀnd LED om huvudknappen hÄlls nere
led.fill((0, 0, 255) if knapp_tryckt else (0, 0, 0))
# --- SPACE: HĂ
LLA NED = SPAMMA SPACE ---
space_aktiv = knapp_tryckt or joy_tryckt or joy2_tryckt
if space_aktiv and (nu - senaste_space) >= SPACE_REPEAT:
kbd.send(Keycode.SPACE)
senaste_space = nu
# --- JOYSTICK-RIKTNING ---
# LÀs joystickens position (byt plats pÄ x/y om det kÀnns "fel")
y = joy_x.value - CENTER
x = joy_y.value - CENTER
# VÀnster / Höger
if x > DĂDZON:
# höger
kbd.press(Keycode.LEFT_ARROW)
kbd.release(Keycode.RIGHT_ARROW)
elif x < -DĂDZON:
# vÀnster
kbd.press(Keycode.RIGHT_ARROW)
kbd.release(Keycode.LEFT_ARROW)
else:
# ingen riktning
kbd.release(Keycode.LEFT_ARROW)
kbd.release(Keycode.RIGHT_ARROW)
# Upp / Ner
if y > DĂDZON:
# ner
kbd.press(Keycode.DOWN_ARROW)
kbd.release(Keycode.UP_ARROW)
elif y < -DĂDZON:
# upp
kbd.press(Keycode.UP_ARROW)
kbd.release(Keycode.DOWN_ARROW)
else:
# ingen riktning
kbd.release(Keycode.UP_ARROW)
kbd.release(Keycode.DOWN_ARROW)
# --- JOYSTICK2-RIKTNING ---
# LÀs joystickens position (byt plats pÄ x/y om det kÀnns "fel")
y2 = joy2_x.value - CENTER
x2 = joy2_y.value - CENTER
# VÀnster / Höger
if x2 > DĂDZON:
# höger
kbd.press(Keycode.A)
kbd.release(Keycode.D)
elif x2 < -DĂDZON:
# vÀnster
kbd.press(Keycode.D)
kbd.release(Keycode.A)
else:
# ingen riktning
kbd.release(Keycode.A)
kbd.release(Keycode.D)
# Upp / Ner
if y2 > DĂDZON:
# ner
kbd.press(Keycode.S)
kbd.release(Keycode.W)
elif y2 < -DĂDZON:
# upp
kbd.press(Keycode.W)
kbd.release(Keycode.S)
else:
# ingen riktning
kbd.release(Keycode.W)
kbd.release(Keycode.S)
# Liten paus för att inte överbelasta allt
time.sleep(0.003)
adafruit_hid under katalogen lib pÄ esp32s usb device (ex D:\lib).code till usn:n (ex D:).Montering
PS. Stiften har lötts pÄ ESP32n, det bör gÄ att hitta moduler som redan har stift.
https://gadiim.github.io/Space_Blast/
https://chromedino.com/
Space Waves đčïž Play on CrazyGameshttps://www.crazygames.com/game/space-waves (eventuellt)
Spel som kostar:
https://store.steampowered.com/app/1794680/Vampire_Survivors/
Megabonk (2 thumbsticks)
Kontakta mig pÄ karl.svartholm@gmail.com eller 0703-886860 sÄ sÀtter jag ihop det för inköpspris.
Kontakta mig pÄ karl.svartholm@gmail.com eller 0703-886860.