【项目背景】
在别人的仓库里找到一台带机械爪的车,说明书上说主控可用Arduino IDE编程,技术支持可访问官网,别的就没有了,可官网也访问不了,公司倒闭了?最怕遇到这种情况。那主控用不了,我来改造一下吧。
【项目设计】
使用行空板做为主控,电机驱动使用DF的L289N电机驱动。使用行空板的原因,是因为这套设备有Xbox遥控器,我会使用行空板连接Xbox遥控器。
【硬件连接】
1.Xbox遥控器无线接收器插入行空板USB接口。
2.电机驱动器
因为搬运车有五个电机,两个用于控制车运动,三个用于控制机械爪,水平旋转、上下运动、爪张开与闭合。所以我使用了三个L289N电机驱动,一个驱动控制两个电机。
3.通过扩展板与电机驱动板连接
4.行空板插入扩展板
5.供电
充电宝为行空板供电,7.4V锂电池为电机驱动板供电,驱动板、扩展板、电源三者要共地。
6.整机
【编写程序】
1.使用pygame库,连接Xbox蓝牙手柄。
- import pygame
- import time
- pygame.init()
- pygame.joystick.init()
- # 初始化手柄
- joystick = pygame.joystick.Joystick(0)
- joystick.init()
复制代码
2.使用Pinpong库,初始化行空板引脚
- from pinpong.extension.unihiker import *
- from pinpong.libs.microbit_motor import DFMotor
- from pinpong.board import Board
- from pinpong.board import Pin
- Board().begin()
- p_p8_pwm=Pin(Pin.P8, Pin.PWM)
- p_p9_pwm=Pin(Pin.P9, Pin.PWM)
- p_p5_out=Pin(Pin.P5, Pin.OUT)
- p_p6_out=Pin(Pin.P6, Pin.OUT)
- p_p16_pwm=Pin(Pin.P16, Pin.PWM)
- p_p0_pwm=Pin(Pin.P0, Pin.PWM)
- p_p3_pwm=Pin(Pin.P3, Pin.PWM)
- p_p13_out=Pin(Pin.P13, Pin.OUT)
- p_p15_out=Pin(Pin.P15, Pin.OUT)
- p_p12_out=Pin(Pin.P12, Pin.OUT)
复制代码
3.运动控制函数
-
- def forward(speed):#带速度参数——前进
- p_p8_pwm.write_analog(speed)
- p_p9_pwm.write_analog(speed)
- p_p5_out.write_digital(1)
- p_p6_out.write_digital(1)
- def back(speed):#带速度参数——后退
- p_p8_pwm.write_analog(speed)
- p_p9_pwm.write_analog(speed)
- p_p5_out.write_digital(0)
- p_p6_out.write_digital(0)
-
-
- def left(speed):#带速度参数——向左
- p_p8_pwm.write_analog(speed)
- p_p9_pwm.write_analog(speed)
- p_p5_out.write_digital(0)
- p_p6_out.write_digital(1)
- def right(speed):#带速度参数——向右
- p_p8_pwm.write_analog(speed)
- p_p9_pwm.write_analog(speed)
- p_p5_out.write_digital(1)
- p_p6_out.write_digital(0)
- def stop():#停止
- p_p8_pwm.write_analog(0)#左电机
- p_p9_pwm.write_analog(0)#右电机
- p_p16_pwm.write_analog(0)#水平电机
- p_p0_pwm.write_analog(0)#垂直电机
- p_p3_pwm.write_analog(0)#夹电机
-
- def Lrotate(speed):#带速度参数——水平向左原地旋转
- p_p0_pwm.write_analog(speed)
-
- p_p13_out.write_digital(1)
-
- def Rrotate(speed):#带速度参数——水平向右原地旋转
- p_p0_pwm.write_analog(speed)
-
- p_p13_out.write_digital(0)
- def up(speed):#带速度参数——垂直向上
- p_p16_pwm.write_analog(speed)#左电机
-
- p_p15_out.write_digital(0)
-
- def down(speed):#带速度参数——垂直向下
- p_p16_pwm.write_analog(speed)
-
- p_p15_out.write_digital(1)
- def Open(speed):#带速度参数——夹打开
- p_p3_pwm.write_analog(speed)
- p_p12_out.write_digital(0)
- def Close(speed):#带速度参数——夹关闭
- p_p3_pwm.write_analog(speed)
- p_p12_out.write_digital(1)
复制代码
4.手柄按键事件复制代码
4.完整程序
-
-
- import pygame
- import time
- pygame.init()
- pygame.joystick.init()
- # 初始化手柄
- joystick = pygame.joystick.Joystick(0)
- joystick.init()
-
- from pinpong.extension.unihiker import *
- from pinpong.libs.microbit_motor import DFMotor
- from pinpong.board import Board
- from pinpong.board import Pin
- Board().begin()
- p_p8_pwm=Pin(Pin.P8, Pin.PWM)
- p_p9_pwm=Pin(Pin.P9, Pin.PWM)
- p_p5_out=Pin(Pin.P5, Pin.OUT)
- p_p6_out=Pin(Pin.P6, Pin.OUT)
- p_p16_pwm=Pin(Pin.P16, Pin.PWM)
- p_p0_pwm=Pin(Pin.P0, Pin.PWM)
- p_p3_pwm=Pin(Pin.P3, Pin.PWM)
- p_p13_out=Pin(Pin.P13, Pin.OUT)
- p_p15_out=Pin(Pin.P15, Pin.OUT)
- p_p12_out=Pin(Pin.P12, Pin.OUT)
-
- bs=0
- time1=0
- time2=0
- def forward(speed):#带速度参数——前进
- p_p8_pwm.write_analog(speed)
- p_p9_pwm.write_analog(speed)
- p_p5_out.write_digital(1)
- p_p6_out.write_digital(1)
- def back(speed):#带速度参数——后退
- p_p8_pwm.write_analog(speed)
- p_p9_pwm.write_analog(speed)
- p_p5_out.write_digital(0)
- p_p6_out.write_digital(0)
-
-
- def left(speed):#带速度参数——向左
- p_p8_pwm.write_analog(speed)
- p_p9_pwm.write_analog(speed)
- p_p5_out.write_digital(0)
- p_p6_out.write_digital(1)
- def right(speed):#带速度参数——向右
- p_p8_pwm.write_analog(speed)
- p_p9_pwm.write_analog(speed)
- p_p5_out.write_digital(1)
- p_p6_out.write_digital(0)
- def stop():#停止
- p_p8_pwm.write_analog(0)#左电机
- p_p9_pwm.write_analog(0)#右电机
- p_p16_pwm.write_analog(0)#水平电机
- p_p0_pwm.write_analog(0)#垂直电机
- p_p3_pwm.write_analog(0)#夹电机
-
- def Lrotate(speed):#带速度参数——水平向左原地旋转
- p_p0_pwm.write_analog(speed)
-
- p_p13_out.write_digital(1)
-
- def Rrotate(speed):#带速度参数——水平向右原地旋转
- p_p0_pwm.write_analog(speed)
-
- p_p13_out.write_digital(0)
- def up(speed):#带速度参数——垂直向上
- p_p16_pwm.write_analog(speed)#左电机
-
- p_p15_out.write_digital(0)
-
- def down(speed):#带速度参数——垂直向下
- p_p16_pwm.write_analog(speed)
-
- p_p15_out.write_digital(1)
- def Open(speed):#带速度参数——夹打开
- p_p3_pwm.write_analog(speed)
- p_p12_out.write_digital(0)
- def Close(speed):#带速度参数——夹关闭
- p_p3_pwm.write_analog(speed)
- p_p12_out.write_digital(1)
- while True:
-
- for event in pygame.event.get():
- if event.type == pygame.JOYBUTTONDOWN:
- if event.button==0:#"A"键
- print("“A”键")
-
- elif event.button==1:#"B"键
- print("“B”键")
-
- elif event.button==4:#"Y"键
- print("“Y”键")
-
- elif event.button==3:#"X"键
- print("“X”键")
-
- elif event.button==6:#"RB"键,右肩键:Right Shoulder Button
- print("“RB”键")
-
- elif event.button==7:#"LB"键,左肩键:Left Shoulder Button
- print("“LB”键")
-
- elif event.button==10:#"View"键
- print("“View”键")
-
- elif event.button==11:#"Menu"键
- print("“Menu”键")
-
- elif event.button==15:#“共享”按键
- print("“共享”键")
-
- elif event.button==12:#“xbox”按键
- print("“xbox”键")
- elif event.type == pygame.JOYHATMOTION:#方向键
- if event.hat==0:
- print(str(event.value[0])+":"+str(event.value[1]))
- if event.value[0]==0:
- if event.value[1]==0:#中间位置
- print("“中间位置”方向键")
- stop()
- elif event.value[1]==1:#向上
- print("“向上”方向键")
- forward(800)
- elif event.value[1]==-1:#向下
- print("“向下”方向键")
- back(800)
- elif event.value[0]==-1:#向右
- print("“向右”方向键")
- right(800)
- elif event.value[0]==1:#向左
- print("“向左”方向键")
- left(800)
-
- elif event.type == pygame.JOYAXISMOTION:
- #左摇杆按键
- if event.axis==0:#左右
- if event.value<-0.1:#向左
- left(int(abs(event.value)*1000))
- print("“向左”左摇杆按键")
- elif event.value>0.1:#向右
- right(int(event.value*1000))
- print("“向右”左摇杆按键")
- else:
- stop()
- print("左右stop左摇杆按键")
- elif event.axis==1:#上下
- if event.value<-0.1:#向上
- forward(int(abs(event.value)*1000))
- print("“向上”左摇杆按键")
- elif event.value>0.1:#向下
- back(int(event.value*1000))
- print("“向下”左摇杆按键")
- else:
- stop()
- print("上下stop左摇杆按键")
- #右摇杆按键
- if event.axis==2:#左右
- if event.value<-0.1:#向右
- Rrotate(int(abs(event.value)*1000))
- print("“向右”右摇杆按键")
- elif event.value>0.1:#向左
- Lrotate(int(event.value*1000))
- print("“向左”右摇杆按键")
- else:
- stop()
- print("“停止”右摇杆按键")
- elif event.axis==3:#上下
- if event.value<-0.1:#向上
- up(int(abs(event.value)*1000))
- print("“向上”右摇杆按键")
- elif event.value>0.1:#向下
- down(int(event.value*1000))
- print("“向下”右摇杆按键")
- else:
- stop()
- elif event.axis==5:#左射击键
- if event.value>0:
- print("左射击键")
- print(int(event.value*1000))
- Open(int(event.value*1000))
- else:
- stop()
- elif event.axis==4:#右射击键
- if event.value>0:
- print("右射击键")
- print(int(event.value*1000))
- Close(int(event.value*1000))
- else:
- stop()
-
-
复制代码
【演示视频】
|