游戏 - 抓娃娃

现在我们来玩一个抓娃娃的游戏,看看谁能在规定的时间内用PiArm抓到更多的娃娃。 为了玩这个游戏,我们需要实现两个功能,第一个功能是用双摇杆模块控制PiArm,第二个功能是计时,当倒计时结束后,我们就不能再控制PiArm。这两部分必须同时执行。

../_images/clip_usage2.jpg

运行代码

cd /home/pi/piarm/examples
sudo python3 game_catching_dolls.py

代码运行后,同时按下左右摇杆来开始游戏,此时你就可以用双摇杆模块来控制PiArm来抓取娃娃,请注意时间,60秒之后,PiArm将提示游戏结束,你将无法再继续操作PiArm。

代码

from robot_hat import Servo,PWM,Joystick,ADC,Pin
from robot_hat.utils import reset_mcu
from time import sleep
from robot_hat import TTS
import threading

from piarm import PiArm

reset_mcu()
sleep(0.01)
t = TTS()

leftJoystick = Joystick(ADC('A0'),ADC('A1'),Pin('D0'))
rightJoystick = Joystick(ADC('A2'),ADC('A3'),Pin('D1'))

arm = PiArm([1,2,3])
arm.hanging_clip_init(PWM('P3'))
arm.set_offset([0,0,0])
arm.speed = 100
game_flag = 0

def control():

    alpha,beta,gamma = arm.servo_positions
    clip = arm.component_staus

    if leftJoystick.read_status() == "up":
        alpha += 1
    elif leftJoystick.read_status() == "down":
        alpha -= 1
    if leftJoystick.read_status() == "left":
        gamma += 1
    elif leftJoystick.read_status() == "right":
        gamma -= 1
    if rightJoystick.read_status() == "up":
        beta += 1
    elif rightJoystick.read_status() == "down":
        beta -= 1
    if leftJoystick.read_status() == "pressed":
        clip += 1
    elif rightJoystick.read_status() == "pressed":
        clip -= 1


    # if key_flag == True:
    arm.set_angle([alpha,beta,gamma])
    arm.set_hanging_clip(clip)
        # print('coord: %s , servo angles: %s , clip angle: %s '%(arm.current_coord,arm.servo_positions,arm.component_staus))

def timing():
    sleep(60)
    t.say("three")
    sleep(1)
    t.say("two")
    sleep(1)
    t.say("one")
    sleep(1)
    t.say("game over")
    global game_flag
    game_flag = 0

if __name__ == "__main__":

    thread1 = threading.Thread(target = timing)
    thread1.start()
    print("Press two joysticks at the same time to start the game")

    while True:
        if  leftJoystick.read_status() == "pressed" and rightJoystick.read_status() == "pressed":
            t.say("timing begins")
            game_flag = 1
        if game_flag == 1:
            control()

它是如何工作的?

这个代码是在 竖直夹 - 摇杆控制 项目的基础上加上了计时。

def timing():
    sleep(60)
    t.say("three")
    sleep(1)
    t.say("two")
    sleep(1)
    t.say("one")
    sleep(1)
    t.say("game over")
    global game_flag
    game_flag = 0

使用 sleep() 函数进行60秒的计时,随后就让PiArm进行3,2,1倒计时报数,时间到了之后,让 game_flag 为0,此时将无法再控制PiArm。

if __name__ == "__main__":

    thread1 = threading.Thread(target = timing)
    thread1.start()
    print("Press two joysticks at the same time to start the game")

timing() 函数以另外一个线程运行,这样就可以在控制PiArm的同时,进行计时。

while True:
    if  leftJoystick.read_status() == "pressed" and rightJoystick.read_status() == "pressed":
        t.say("timing begins")
        game_flag = 1
    if game_flag == 1:
        control()

这是代码的主要流程,当左右摇杆同时按下时,PiArm说计时开始,让 game_flag 为1,此时就可以调用 control() 函数来控制PiArm。