双摇杆模块¶
我们可以分两部分控制 PiArm,手臂和臂端工具。在第一个项目中,您已经学习了如何组装和测试PiArm的3个臂端工具。在这个项目中,我们将使用套件附带的双摇杆模块来控制 PiArm 的手臂。
铲斗 - 摇杆控制¶
cd /home/pi/piarm/examples
sudo python3 joystick_module1.py
代码运行后,你就能用拨动左右摇杆来控制PiArm的手臂的转动,分别按下左右摇杆来控制铲斗的开/合。
但你需要先将 铲斗 安装到PiArm上。
代码
from robot_hat import Servo,PWM,Joystick,ADC,Pin
from robot_hat.utils import reset_mcu
from time import sleep
from piarm import PiArm
reset_mcu()
sleep(0.01)
leftJoystick = Joystick(ADC('A0'),ADC('A1'),Pin('D0'))
rightJoystick = Joystick(ADC('A2'),ADC('A3'),Pin('D1'))
arm = PiArm([1,2,3])
arm.bucket_init(PWM('P3'))
arm.set_offset([0,0,0])
def _angles_control():
arm.speed = 100
flag = False
alpha,beta,gamma = arm.servo_positions
bucket = arm.component_staus
if leftJoystick.read_status() == "up":
alpha += 1
flag = True
elif leftJoystick.read_status() == "down":
alpha -= 1
flag = True
if leftJoystick.read_status() == "left":
gamma += 1
flag = True
elif leftJoystick.read_status() == "right":
gamma -= 1
flag = True
if rightJoystick.read_status() == "up":
beta += 1
flag = True
elif rightJoystick.read_status() == "down":
beta -= 1
flag = True
if leftJoystick.read_status() == "pressed":
bucket += 2
flag = True
elif rightJoystick.read_status() == "pressed":
bucket -= 2
flag = True
if flag == True:
arm.set_angle([alpha,beta,gamma])
arm.set_bucket(bucket)
print('servo angles: %s , bucket angle: %s '%(arm.servo_positions,arm.component_staus))
if __name__ == "__main__":
while True:
_angles_control()
sleep(0.01)
它是如何工作的?
leftJoystick = Joystick(ADC('A0'),ADC('A1'),Pin('D0'))
rightJoystick = Joystick(ADC('A2'),ADC('A3'),Pin('D1'))
定义左右摇杆的X,Y和Z的引脚连接。
def _angles_control():
arm.speed = 100
flag = False
alpha,beta,gamma = arm.servo_positions
bucket = arm.component_staus
if leftJoystick.read_status() == "up":
alpha += 1
flag = True
elif leftJoystick.read_status() == "down":
alpha -= 1
flag = True
if leftJoystick.read_status() == "left":
gamma += 1
flag = True
elif leftJoystick.read_status() == "right":
gamma -= 1
flag = True
if rightJoystick.read_status() == "up":
beta += 1
flag = True
elif rightJoystick.read_status() == "down":
beta -= 1
flag = True
if leftJoystick.read_status() == "pressed":
bucket += 2
flag = True
elif rightJoystick.read_status() == "pressed":
bucket -= 2
flag = True
if flag == True:
arm.set_angle([alpha,beta,gamma])
arm.set_bucket(bucket)
print('servo angles: %s , bucket angle: %s '%(arm.servo_positions,arm.component_staus))
在这个代码中,创建了 _angles_control()
函数用来控制PiArm。
alpha
,beta
和gamma
分别指的是手臂上的3个舵机的角度,参考: 角度模式。左摇杆向上拨动,
alpha
增加,让手臂向前伸。左摇杆向下拨动,
alpha
减小,让手臂向里缩。左摇杆向左拨动,
gamma
增加,让手臂向左转动。左摇杆向右拨动,
gamma
减小,让手臂向右转动。右摇杆向上拨动,
beta
增加,让手臂向上。右摇杆向下拨动,
beta
减小,让手臂向下。最后,分别用左右摇杆的按键来控制铲斗的角度。
竖直夹 - 摇杆控制¶
运行代码
cd /home/pi/piarm/examples
sudo python3 joystick_module2.py
代码运行后,你就能用拨动左右摇杆来控制PiArm的手臂的转动,分别按下左右摇杆来控制竖直夹的开/合。
但你需要先将 竖直夹 安装到PiArm上。
代码
from robot_hat import Servo,PWM,Joystick,ADC,Pin
from robot_hat.utils import reset_mcu
from time import sleep
from piarm import PiArm
reset_mcu()
sleep(0.01)
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])
def _angles_control():
arm.speed = 100
flag = False
alpha,beta,gamma = arm.servo_positions
clip = arm.component_staus
if leftJoystick.read_status() == "up":
alpha += 1
flag = True
elif leftJoystick.read_status() == "down":
alpha -= 1
flag = True
if leftJoystick.read_status() == "left":
gamma += 1
flag = True
elif leftJoystick.read_status() == "right":
gamma -= 1
flag = True
if rightJoystick.read_status() == "up":
beta += 1
flag = True
elif rightJoystick.read_status() == "down":
beta -= 1
flag = True
if leftJoystick.read_status() == "pressed":
clip += 2
flag = True
elif rightJoystick.read_status() == "pressed":
clip -= 2
flag = True
if flag == True:
arm.set_angle([alpha,beta,gamma])
arm.set_hanging_clip(clip)
print('servo angles: %s , clip angle: %s '%(arm.servo_positions,arm.component_staus))
if __name__ == "__main__":
while True:
_angles_control()
sleep(0.01)
在这个代码中,创建了 _angles_control()
函数用来控制PiArm。
alpha
,beta
和gamma
分别指的是手臂上的3个舵机的角度,参考: 角度模式。左摇杆向上拨动,
alpha
增加,让手臂向前伸。左摇杆向下拨动,
alpha
减小,让手臂向里缩。左摇杆向左拨动,
gamma
增加,让手臂向左转动。左摇杆向右拨动,
gamma
减小,让手臂向右转动。右摇杆向上拨动,
beta
增加,让手臂向上。右摇杆向下拨动,
beta
减小,让手臂向下。最后,分别用左右摇杆的按键来控制竖直夹的角度。
电磁铁 - 摇杆控制¶
运行代码
cd /home/pi/piarm/examples
sudo python3 joystick_module3.py
代码运行后,你就能用拨动左右摇杆来控制PiArm的手臂的转动,分别按下左右摇杆来控制电磁铁的开/关。
但你需要先将 电磁铁 安装到PiArm上。
代码
from robot_hat import Servo,PWM,Joystick,ADC,Pin
from robot_hat.utils import reset_mcu
from time import sleep
from piarm import PiArm
reset_mcu()
sleep(0.01)
leftJoystick = Joystick(ADC('A0'),ADC('A1'),Pin('D0'))
rightJoystick = Joystick(ADC('A2'),ADC('A3'),Pin('D1'))
arm = PiArm([1,2,3])
arm.electromagnet_init(PWM('P3'))
arm.set_offset([0,0,0])
def _angles_control():
arm.speed = 100
flag = False
alpha,beta,gamma = arm.servo_positions
status = ""
if leftJoystick.read_status() == "up":
alpha += 1
flag = True
elif leftJoystick.read_status() == "down":
alpha -= 1
flag = True
if leftJoystick.read_status() == "left":
gamma += 1
flag = True
elif leftJoystick.read_status() == "right":
gamma -= 1
flag = True
if rightJoystick.read_status() == "up":
beta += 1
flag = True
elif rightJoystick.read_status() == "down":
beta -= 1
flag = True
if leftJoystick.read_status() == "pressed":
arm.set_electromagnet('on')
status = "electromagnet is on"
elif rightJoystick.read_status() == "pressed":
arm.set_electromagnet('off')
status = "electromagnet is off"
if flag == True:
arm.set_angle([alpha,beta,gamma])
print('servo angles: %s , electromagnet status: %s '%(arm.servo_positions,status))
if __name__ == "__main__":
while True:
_angles_control()
sleep(0.01)
在这个代码中,创建了 _angles_control()
函数用来控制PiArm。
alpha
,beta
和gamma
分别指的是手臂上的3个舵机的角度,参考: 角度模式。左摇杆向上拨动,
alpha
增加,让手臂向前伸。左摇杆向下拨动,
alpha
减小,让手臂向里缩。左摇杆向左拨动,
gamma
增加,让手臂向左转动。左摇杆向右拨动,
gamma
减小,让手臂向右转动。右摇杆向上拨动,
beta
增加,让手臂向上。右摇杆向下拨动,
beta
减小,让手臂向下。最后,分别用左右摇杆的按键来控制电磁铁的开/关。