I had gotten the Rapberry pi pico a few weeks ago and I was experimenting with it. On one fine day I was learning how to use Mpu6050 with Pico and circuit python and control my mouse with it. Then while just messing around, I thought why not try to control a game? I thought asphalt 8 would be ideal as it only needs five controls ( front, back, left, right and nitro). I did all the connections and now the cable connecting pico and mpu6050 was too short. So I made the wire longer and I had an old Mi Band lying around which was not working. So I placed the mpu6050 inside the band and used it as a wearable. Here is a video of it working:you can till your hand left and right to steer the car. Tilt it Forward and Backward to control the direction of the car (front and back) and flick your hand towards the top for Nitro.the video is also posted on reddit by the username : u/hriday746 : which is methe video is also on a blog : hridaybarot.home.blog : which is also methe video is also on instagram by the name: friday746 : which is meand also on youtube.for a more detailed guide with the code, visit: https://hridaybarot.home.blog/2021/03/23/controlling-asphalt-8-with-hand-gestures-using-mpu6050-and-raspberry-pi-pico/import time
from math import atan2, degrees
import board
import busio
import adafruit_mpu6050
from adafruit_hid.keyboard import Keyboard as kbd
from adafruit_hid.keycode import Keycode
i2c = busio.I2C(board.GP15, board.GP14)
sensor = adafruit_mpu6050.MPU6050(i2c)
import usb_hid
Keyboard=kbd(usb_hid.devices)
kw=Keycode.W
ka=Keycode.A
ks=Keycode.S
kd=Keycode.D
k_nitro=Keycode.SPACE
# Given a point (x, y) return the angle of that point relative to x axis.
# Returns: angle in degrees
def vector_2_degrees(x, y,l=False):
if l:
angle = degrees(atan2(y, x))
else:
angle = degrees(atan2(y, x))
if angle < 0:
angle += 360
return angle
# Given an accelerometer sensor object return the inclination angles of X/Z and Y/Z
# Returns: tuple containing the two angles in degrees
t=""
f=""
def get_inclination(_sensor):
x, y, z = _sensor.acceleration
return vector_2_degrees(x, z,True), vector_2_degrees(y, z), int(x),int(y),int(z)
x,y,z=0,0,0
def press(key):
Keyboard.press(key)
def release(key):
Keyboard.release(key)
turn=None
ac=None
toA=None
#l=[None,None]
while True:
try:
turn, ac,x,y,z = get_inclination(sensor)
turn=int(turn)
ac=int(ac)
except:
pass
#print(turn,ac,x,y,z,sep=" : ")
if turn<50:
if t=="r":
Keyboard.release(kd) #leave r
print("left")
Keyboard.press(ka)
#l[0]=ka
t="l"
elif turn>130:
if t=="l":
Keyboard.release(ka) #leave l
print("right")
Keyboard.press(kd)
#l[0]=kd
t="r"
else:
if t=="l":
Keyboard.release(ka) #leave l
elif t=="r":
Keyboard.release(kd) #leave r
l[0]=None
if ac<50:
if f=="f":
Keyboard.release(kw) # leave f
print("brake")
Keyboard.press(ks)
#toA=ks
f="b"
elif ac>120:
if f=="b":
Keyboard.release(ks) #leave b
print("accel")
Keyboard.press(kw)
#toA=kw
f="f"
else:
if f=="f":
Keyboard.release(kw) # leave f
elif f=="b":
Keyboard.release(ks) #leave b
if z >=11:
print("nitro")
Keyboard.send(k_nitro)
time.sleep(0.000001)