《从零开始配置树莓派控制机械臂》专栏传送门

【分享】从零开始在树莓派4B上搭建环境,使用ros控制dofbot机械臂(一)

【分享】从零开始在树莓派4B上搭建环境,使用ros控制dofbot机械臂(二)

【分享】从零开始在树莓派4B上搭建环境,使用ros控制dofbot机械臂(三)

【分享】从零开始在树莓派4B上搭建环境,使用ros控制dofbot机械臂(四)

【分享】从零开始在树莓派4B上搭建环境,使用ros控制dofbot机械臂(五)

【分享】从零开始在树莓派4B上搭建环境,使用ros控制dofbot机械臂(六)

1. 控制RGB灯

为了方便控制,机械臂扩展板的底层软件是单独开发的,并且提供接口调用,控制包括总线舵机、PWM舵机、RGB灯。相关的底层驱动源码已经封装成python库

API简介

RGB灯对应的API为:

Arm_RGB_set(R, G, B)
参数解释:
R:控制RGB灯亮红色的亮度,范围为0-255,数值越大,亮度越亮。
G:控制RGB灯亮绿色的亮度,范围为0-255,数值越大,亮度越亮。
B:控制RGB灯亮蓝色的亮度,范围为0-255,数值越大,亮度越亮。
返回值:无。

输入命令安装Arm_Lib库

pip install Arm_Lib

#循环让机械臂扩展板上的RGB灯亮红色、绿色、蓝色。

#!/usr/bin/env   python3
#coding=utf-8
import   time
from   Arm_Lib import Arm_Device

#   获取机械臂的对象
Arm   = Arm_Device()
time.sleep(.1)

def   main():
    while True:
        Arm.Arm_RGB_set(1, 0, 0) #RGB亮红灯
        time.sleep(.5)
        Arm.Arm_RGB_set(0, 1, 0) #RGB亮绿灯
        time.sleep(.5)
        Arm.Arm_RGB_set(0, 0, 1) #RGB亮蓝灯
        time.sleep(.5)

        print(" END OF LINE! ")

try   :
    main()
except   KeyboardInterrupt:
    # 释放Arm对象
    del Arm
    print(" Program closed! ")
    pass

2. 控制蜂鸣器

为了方便控制,机械臂扩展板的底层软件是单独开发的,并且提供接口调用,控制包括总线舵机、PWM舵机、RGB灯。相关的底层驱动源码已经封装成python库

API简介

RGB灯对应的API为:

Arm_Buzzer_On(delay=255)
函数功能:打开蜂鸣器。
参数解释:
delay:delay的输入范围为1~50,数值越大,蜂鸣器响的时间越长,超时后自动关闭,delay时间规定:1=100毫秒,2=200毫秒,以此类推,最长延迟时间为50=5秒。如果delay不传入数值,或者delay=255,则表示蜂鸣器长鸣,需要手动关闭它。
返回值:无。

Arm_Buzzer_Off()
功能解释:关闭蜂鸣器。
参数解释:
无传入参数。
返回值:无

#!/usr/bin/env   python3
#coding=utf-8
import   time
from   Arm_Lib import Arm_Device

#   获取机械臂的对象
Arm   = Arm_Device()
time.sleep(.1)

#   蜂鸣器自动响100毫秒后关闭
b_time   = 1
Arm.Arm_Buzzer_On(b_time)
time.sleep(1)

#   蜂鸣器自动响300毫秒后关闭
b_time   = 3
Arm.Arm_Buzzer_On(b_time)
time.sleep(1)

#   蜂鸣器一直响
Arm.Arm_Buzzer_On()
time.sleep(1) 

#   关闭蜂鸣器
Arm.Arm_Buzzer_Off()
time.sleep(1)

3. 控制单个舵机

API简介

控制单个总线舵机对应的API为:
Arm_serial_servo_write(id, angle, time)
函数功能:控制总线舵机要运行到的角度。
参数解释:
id:要控制的舵机的ID号,范围是1~6,每个ID号表示一个舵机,从最底端的舵机的ID为1,往上依次增加,最上面的舵机ID为6。
angle:控制舵机要运行到的角度,除了5号舵机(ID=5),其他舵机的控制范围都是0180,5号舵机的控制范围是0270。
time:控制舵机运行的时间,在有效范围内,舵机转动相同的角度,输入运行的时间越小,舵机运动越快。输入0则舵机以最快速度运行。
返回值:无。

#!/usr/bin/env   python3
#coding=utf-8
import   time
from   Arm_Lib import Arm_Device

#   创建机械臂对象
Arm   = Arm_Device()
time.sleep(.1)

#   单独控制一个舵机运动到某个角度
id   = 6 

Arm.Arm_serial_servo_write(id,   90, 500)
time.sleep(1)  

#   控制一个舵机循环切换角度
id   = 6

def   main():
    while True:
        Arm.Arm_serial_servo_write(id, 120,   500)
        time.sleep(1)
        Arm.Arm_serial_servo_write(id, 50,   500)
        time.sleep(1)
        Arm.Arm_serial_servo_write(id, 120,   500)
        time.sleep(1)
        Arm.Arm_serial_servo_write(id, 180,   500)
        time.sleep(1) 

try   :
    main()
except   KeyboardInterrupt:
    print(" Program closed! ")
    pass

del   Arm  # 释放掉Arm对象

4. 读取舵机当前的位置

API简介

读取单个总线舵机的角度对应的API为:
Arm_serial_servo_read(id)
函数功能:读取总线舵机当前的角度值。
参数解释:
id:要读取的舵机的ID号,范围是1~6,每个ID号表示一个舵机,从最底端的舵机的ID为1,往上依次增加,最上面的舵机ID为6。
返回值:对应ID舵机当前的角度,ID=5时,角度范围为0270,其他都为0180。

#!/usr/bin/env   python3
#coding=utf-8
import   time
from   Arm_Lib import Arm_Device

#   创建机械臂对象
Arm   = Arm_Device()
time.sleep(.1)

#   读取所有舵机的角度,并循环打印出来
def   main():
    
    while True:
        for i in range(6):
            aa =   Arm.Arm_serial_servo_read(i+1)
            print(aa)
            time.sleep(.01)
        time.sleep(.5)
        print(" END OF LINE! ")

try   :
    main()
except   KeyboardInterrupt:
    print(" Program closed! ")
    pass

#   单独控制一个舵机运动后,再读取它的角度
id   = 6
angle   = 150

Arm.Arm_serial_servo_write(id,   angle, 500)
time.sleep(1)

aa   = Arm.Arm_serial_servo_read(id)
print(aa)

time.sleep(.5) 

del   Arm  # 释放掉Arm对象

5. 一次控制6个舵机

API简介

一次控制6个总线舵机对应的API为:
Arm_serial_servo_write6(S1, S2, S3, S4, S5, S6, time)
函数功能:同时控制机械臂的六个舵机要运动到的角度。
参数解释:
S1:1号舵机的角度值0~180。
S2:2号舵机的角度值0~180。
S3:3号舵机的角度值0~180。
S4:4号舵机的角度值0~180。
S5:5号舵机的角度值0~270。
S6:6号舵机的角度值0~180。
time:控制舵机运行的时间,在有效范围内,舵机转动相同的角度,输入运行的时间越小,舵机运动越快。输入0则舵机以最快速度运行。
返回值:无。

#!/usr/bin/env   python3
#coding=utf-8
import   time
from   Arm_Lib import Arm_Device

#   创建机械臂对象
Arm   = Arm_Device()
time.sleep(.1)

#   同时控制六个舵机运动,逐渐变换角度。
def   ctrl_all_servo(angle, s_time = 500):
    Arm.Arm_serial_servo_write6(angle,   180-angle, angle, angle, angle, angle, s_time)
    time.sleep(s_time/1000)

def   main():
    dir_state = 1
    angle = 90   

    # 让舵机复位归中
    Arm.Arm_serial_servo_write6(90, 90, 90,   90, 90, 90, 500)
    time.sleep(1)

    while True:
        if dir_state == 1:
            angle += 0.5
            if angle >= 180:
                dir_state = 0
        else:
            angle -= 1
            if angle <= 0:
                dir_state = 1

        ctrl_all_servo(angle, 10)
        time.sleep(10/1000)
#         print(angle) 

try   :
    main()
except   KeyboardInterrupt:
    print(" Program closed! ")
    pass

del   Arm  # 释放掉Arm对象

6. 机械臂上下左右摆动

实验思路

本次实验是控制机械臂上下左右摆动,然后恢复到直立状态,通过同时控制3号和4号舵机的不同角度,来达到控制舵机上下摆动的功能,然后控制1号舵机左右摆动,最后再回归直立状态。

#!/usr/bin/env   python3
#coding=utf-8
import   time
from   Arm_Lib import Arm_Device

#   创建机械臂对象
Arm   = Arm_Device()
time.sleep(.1)

#   循环控制机械臂上下左右摆动
def   main():
    # 让舵机复位归中
    Arm.Arm_serial_servo_write6(90, 90, 90,   90, 90, 90, 500)
    time.sleep(1)

    while True:
        # 控制3号和4号舵机上下运行
        Arm.Arm_serial_servo_write(3, 0,   1000)
        time.sleep(.001)
        Arm.Arm_serial_servo_write(4, 180,   1000)
        time.sleep(1)

        # 控制1号舵机左右运动
        Arm.Arm_serial_servo_write(1, 180,   500)
        time.sleep(.5)
        Arm.Arm_serial_servo_write(1, 0,   1000)
        time.sleep(1)

        # 控制舵机恢复初始位置
        Arm.Arm_serial_servo_write6(90, 90,   90, 90, 90, 90, 1000)
        time.sleep(1.5)

try   :
    main()
except   KeyboardInterrupt:
    print(" Program closed! ")
    pass

del   Arm  # 释放掉Arm对象

7. 机械臂跳舞

实验思路

本次实验是控制机械臂跳舞,通过修改机械臂不同舵机的角度,并且增加延迟时间,从而做到类似机械臂跳舞的效果。

#!/usr/bin/env   python3
#coding=utf-8
import   time
from   Arm_Lib import Arm_Device

#   创建机械臂对象
Arm   = Arm_Device()
time.sleep(.1)

time_1   = 500
time_2   = 1000
time_sleep   = 0.5# 机械臂循环跳舞
def   main():
    # 让舵机复位归中
    Arm.Arm_serial_servo_write6(90, 90, 90,   90, 90, 90, 500)
    time.sleep(1)

    while True:
        Arm.Arm_serial_servo_write(2,   180-120, time_1)
        time.sleep(.001)
        Arm.Arm_serial_servo_write(3, 120,   time_1)
        time.sleep(.001)
        Arm.Arm_serial_servo_write(4, 60,   time_1)
        time.sleep(time_sleep)

        Arm.Arm_serial_servo_write(2,   180-135, time_1)
        time.sleep(.001)
        Arm.Arm_serial_servo_write(3, 135,   time_1)
        time.sleep(.001)
        Arm.Arm_serial_servo_write(4, 45,   time_1)
        time.sleep(time_sleep)

        Arm.Arm_serial_servo_write(2,   180-120, time_1)
        time.sleep(.001)
        Arm.Arm_serial_servo_write(3, 120,   time_1)
        time.sleep(.001)
        Arm.Arm_serial_servo_write(4, 60,   time_1)
        time.sleep(time_sleep)

        Arm.Arm_serial_servo_write(2, 90,   time_1)
        time.sleep(.001)
        Arm.Arm_serial_servo_write(3, 90,   time_1)
        time.sleep(.001)
        Arm.Arm_serial_servo_write(4, 90,   time_1)
        time.sleep(time_sleep)

        Arm.Arm_serial_servo_write(2, 180-80,   time_1)
        time.sleep(.001)
        Arm.Arm_serial_servo_write(3, 80,   time_1)
        time.sleep(.001)
        Arm.Arm_serial_servo_write(4, 80,   time_1)
        time.sleep(time_sleep)

        Arm.Arm_serial_servo_write(2, 180-60,   time_1)
        time.sleep(.001)
        Arm.Arm_serial_servo_write(3, 60,   time_1)
        time.sleep(.001)
        Arm.Arm_serial_servo_write(4, 60,   time_1)
        time.sleep(time_sleep)

        Arm.Arm_serial_servo_write(2, 180-45,   time_1)
        time.sleep(.001)
        Arm.Arm_serial_servo_write(3, 45,   time_1)
        time.sleep(.001)
        Arm.Arm_serial_servo_write(4, 45,   time_1)
        time.sleep(time_sleep)

        Arm.Arm_serial_servo_write(2, 90,   time_1)
        time.sleep(.001)
        Arm.Arm_serial_servo_write(3, 90, time_1)
        time.sleep(.001)
        Arm.Arm_serial_servo_write(4, 90,   time_1)
        time.sleep(.001)
        time.sleep(time_sleep) 

        Arm.Arm_serial_servo_write(4, 20,   time_1)
        time.sleep(.001)
        Arm.Arm_serial_servo_write(6, 150,   time_1)
        time.sleep(.001)
        time.sleep(time_sleep) 

        Arm.Arm_serial_servo_write(4, 90,   time_1)
        time.sleep(.001)
        Arm.Arm_serial_servo_write(6, 90,   time_1)
        time.sleep(time_sleep)

        Arm.Arm_serial_servo_write(4, 20,   time_1)
        time.sleep(.001)
        Arm.Arm_serial_servo_write(6, 150,   time_1)
        time.sleep(time_sleep)

        Arm.Arm_serial_servo_write(4, 90,   time_1)
        time.sleep(.001)
        Arm.Arm_serial_servo_write(6, 90,   time_1)
        time.sleep(.001)
        Arm.Arm_serial_servo_write(1, 0,   time_1)
        time.sleep(.001)
        Arm.Arm_serial_servo_write(5, 0,   time_1)
        time.sleep(time_sleep)

        Arm.Arm_serial_servo_write(3, 180,   time_1)
        time.sleep(.001)
        Arm.Arm_serial_servo_write(4, 0,   time_1)
        time.sleep(time_sleep)

        Arm.Arm_serial_servo_write(6, 180,   time_1)
        time.sleep(time_sleep)

        Arm.Arm_serial_servo_write(6, 0,   time_2)
        time.sleep(time_sleep)

        Arm.Arm_serial_servo_write(6, 90,   time_2)
        time.sleep(.001)
        Arm.Arm_serial_servo_write(1, 90,   time_1)
        time.sleep(.001)
        Arm.Arm_serial_servo_write(5, 90,   time_1)
        time.sleep(time_sleep)
        
        Arm.Arm_serial_servo_write(3, 90,   time_1)
        time.sleep(.001)
        Arm.Arm_serial_servo_write(4, 90,   time_1)
        time.sleep(time_sleep)

        print(" END OF LINE! ")

try   :
      main()
except   KeyboardInterrupt:
    print(" Program closed! ")
    pass

del   Arm  # 释放掉Arm对象