小c来做客, 打算用树莓派做打地鼠游戏陪她玩。
和小M一起用8组LED和按钮在一块50x30cm的厚纸板上做了2x4的方阵,LED输出和按钮输入分时复用, 对孩子有点复杂,所以她画图我焊接。刚开始担心PI的驱动能力不够, 试了下亮度足够,而且因为没有散射膜,LED正前的亮度对孩子太刺眼, 需要做PWM。
先用scratch实现, 发现scratch GPIO链接硬件特别慢(在0.1s),改成最低延时也无法实现扫描。
改用python,很快写好,用查询方式, 软件PWM控制LED亮度。
底层代码比较难理解,我直接写好, 打算让小M改上层表现。
贴下code:
import RPi.GPIO as GPIO
import time,random
def rat_in(pp,tt=1.0):
"""Para:pp: 点亮的地鼠, tt:时间
return:1 suc, 0:miss, -1:wait
GPIO7 is common cathode.gmap is 8 anodes.
"""
GPIO.setup(7,GPIO.OUT,initial=GPIO.LOW)
gmap =[20,21,16,12,26,19,13,6]
pp = gmap[pp]
for k in gmap:
GPIO.setup(k,GPIO.IN,pull_up_down=GPIO.PUD_DOWN)
GPIO.output(7,GPIO.HIGH)
time.sleep(0.001)
if GPIO.input(pp) == GPIO.HIGH:
return -1
st = time.time()
while(time.time()-st<tt):
GPIO.output(7,GPIO.LOW)
GPIO.setup(pp,GPIO.OUT,initial=GPIO.HIGH)
time.sleep(0.0001)
GPIO.setup(pp,GPIO.IN,pull_up_down=GPIO.PUD_DOWN)
GPIO.output(7,GPIO.HIGH)
time.sleep(0.005)
if GPIO.input(pp) == GPIO.HIGH:
return 1
return 0
if __name__ == "__main__":
rank,total = 0,0
GPIO.setwarnings(False)
GPIO.setmode(GPIO.BCM)
while 1:
pp = random.randint(0,7)
tt = random.random()+3
delay = random.random()
dd = rat_in(pp,tt)
if dd<0:
continue
if dd:
rank +=1
total += 1
print(total,rank)
time.sleep(delay)
地鼠功能ok,用报纸做了个锤子,小C和小M试玩下, 没有屏幕,没有声音, 两人都不喜欢玩。
用pyaudio加音乐,用天猫精灵做蓝牙音箱, 第一次播放有声音,各种warning,安装pulseaudio,系统就没音了,在网上找各种解决方案,raspyberry对蓝牙音箱支持不是很稳定,花了几个晚上也没搞通,比当年win32上装声卡还折腾。
下一步要重装系统了。