树莓派4B-Python-控制舵机

系列文章

  1. 树莓派4B-Python-控制舵机(本文章)
  2. 树莓派-Pico控制舵机
  3. 树莓派4B-Python-使用PCA9685控制舵机云台+跟随人脸转动


本文采用的是SG90型号、转动角度为90°/180°的舵机和树莓派4B4G版,主要是实现对舵机的控制、问题的解决。

SG90舵机

SG90舵机,常用在小型机器人、智能小车、机械臂、固定翼等小型模型上,因为内部的齿轮多数为塑料的,承受不了太大的扭力。
SG90舵机

舵机类型又分为两种,一种是模拟舵机,另一种是数字舵机,像SG90就是模拟舵机。
模拟舵机和数字舵机的区别

转动角度为360°的舵机与转动角度为90°/180°的舵机工作的方式又是不一样的,360°的舵机相当于是无极变速的减速电机,只能控制转动的速度和转动的方向,不能控制转动到想要的角度,但控制的方式和一般舵机的控制信号相同。

参数介绍

型号SG90
重量9g
工作扭矩1.6kg/cm
反应速度0.12-0.13s/60°
建议使用温度-30° ~ +60°
死区设定5us
转动角度90°/180°(与程序的写法有关)
舵机类型模拟舵机
使用电压3 ~ 7.2V(推荐用5V)
结构材质塑料齿

工作原理

舵机的工作原理

控制电路板接受来自信号线的控制信号,控制电机转动,电机带动一系列齿轮组,减速后传动至输出舵盘。舵机的输出轴和位置反馈电位计是相连的,舵盘转动的同时,带动位置反馈电位计,电位计将输出一个电压信号到控制电路板,进行反馈,然后控制电路板根据所在位置决定电机的转动方向和速度,从而达到目标停止。

舵机的控制信号

舵机的控制信号为周期是20ms的脉宽调制(PWM)信号,其中脉冲宽度从0.5ms-2.5ms,相对应舵盘的位置为0-180度,呈线性变化。也就是说,给它提供一定的脉宽,它的输出轴就会保持在一个相对应的角度上,无论外界转矩怎样改变,直到给它提供一个另外宽度的脉冲信号,它才会改变输出角度到新的对应的位置上。舵机内部有一个基准电路,产生周期20ms,宽度1.5ms的基准信号,有一个比较器,将外加信号与基准信号相比较,判断出方向和大小,从而产生电机的转动信号。

与树莓派4B连接

舵机连接树莓派
红色:5V---- +
黑色:GND---- -
黄色:GPIO14----信号端

另外说明一下:如果舵机不是由树莓派供电的话,需要将该电源与树莓派共地,也就是说电源的负极必须与树莓派任意一个GND连接,否则会出现舵机控制失常等现象。

使用gpiozero库的代码

以下为使用gpiozero库写的,转动的范围为90°

from gpiozero import Servo
from time import sleep
 
myGPIO = 14
myCorrection = 0
maxPW = (2.0 + myCorrection) / 1000
minPW = (1.0 - myCorrection) / 1000
 
servo = Servo(myGPIO, min_pulse_width=minPW, max_pulse_width=maxPW)
 
while True:
    print("Set value range -1.0 to +0.0")
    for value in range(0,11,1):
        value2 = (float(value) - 10) / 10
        servo.value = value2
        print(value2)
        sleep(0.1)
 
    print("Set value range +0.0 to -0.9")
    for value in range(11,20,1):
        value2 = (float(value) - 10) / 10
        servo.value = value2
        print(value2)
        sleep(0.1)

使用RPI.GPIO库的代码

以下用RPI.GPIO库写的四自由度云台控制(两个舵机),转动的范围可为180°。

该程序全为本人参考其他程序后转变而来的,自身技术还些欠缺,所以此程序多多少少会出现一些BUG,还请各位大佬见谅,例如:
1.不能太频繁的发送信号给舵机,因为舵机内部转动和调整都是需要时间的;
2.有时候会像接收不到控制信号似的,发送了两三次信号才转动(有点像信号不好那样),但转动的角度应该是正确;
3.有时候可能存在一下子的抖动

所以呢,以下代码可以作为参考

import RPi.GPIO as GPIO
from time import sleep

def tonum(num):  # 用于处理角度转换的函数
    fm = 10.0 / 180.0
    num = num * fm + 2.5
    num = int(num * 10) / 10.0
    return num

servopin1 = 15   #舵机1,方向为左右转
servopin2 = 18   #舵机2,方向为上下转

GPIO.setmode(GPIO.BCM)
GPIO.setup(servopin1, GPIO.OUT, initial=False)
GPIO.setup(servopin2, GPIO.OUT, initial=False)
p1 = GPIO.PWM(servopin1,50) #50HZ
p2 = GPIO.PWM(servopin2,50) #50HZ

p1.start(tonum(85)) #初始化角度
p2.start(tonum(40)) #初始化角度
sleep(0.5)
p1.ChangeDutyCycle(0) #清除当前占空比,使舵机停止抖动
p2.ChangeDutyCycle(0) #清除当前占空比,使舵机停止抖动
sleep(0.1)

a = 0  #云台舵机1的执行次数
c = 9  #云台舵机1初始化角度:90度
b = 0  #云台舵机2的执行次数
d = 4  #云台舵机2初始化角度:40度

q = [0, 10, 20, 30, 40, 50, 60, 70, 80, 90,
 100, 110, 120, 130, 140, 150, 160, 170, 180]  #旋转角度列表

def left():
    global a, c   #引入全局变量
    a += 1
    if c > 2:  #判断角度是否大于20度
        c = c-1
        g = q[c]  #调用q列表中的第c位元素
        print('当前角度为',g)
        p1.ChangeDutyCycle(tonum(g))  #执行角度变化,跳转到q列表中对应第c位元素的角度
        sleep(0.1)
        p1.ChangeDutyCycle(0)  #清除当前占空比,使舵机停止抖动
        sleep(0.01)
    else:
        print('\n**超出范围**\n')
        c = 9
        g = 85  #调用q列表中的第c位元素
        p1.ChangeDutyCycle(tonum(g)) #执行角度变化,跳转到q列表中对应第c位元素的角度
        sleep(0.1)
        p1.ChangeDutyCycle(0)  #清除当前占空比,使舵机停止抖动
        sleep(0.01)
       
def right():
    global a, c    #引入全局变量
    if c < 16:
        c = c+1
        g = q[c]  #调用q列表中的第c位元素
        print('当前角度为',g)
        p1.ChangeDutyCycle(tonum(g)) #执行角度变化,跳转到q列表中对应第c位元素的角度
        sleep(0.1)
        p1.ChangeDutyCycle(0) #清除当前占空比,使舵机停止抖动
        sleep(0.01)
    else:
        print('\n****超出范围****\n')
        c = 9
        g = 85  #调用q列表中的第c位元素
        p1.ChangeDutyCycle(tonum(g)) #执行角度变化,跳转到q列表中对应第c位元素的角度
        sleep(0.1)
        p1.ChangeDutyCycle(0) #清除当前占空比,使舵机停止抖动
        sleep(0.01)

def up():
    global b, d    #引入全局变量
    b += 1
    if d > 2:
        d = d-1
        g = q[d]  #调用q列表中的第d位元素
        print('当前角度为',g)
        p2.ChangeDutyCycle(tonum(g)) #执行角度变化,跳转到q列表中对应第d位元素的角度
        sleep(0.1)
        p2.ChangeDutyCycle(0) #清除当前占空比,使舵机停止抖动
        sleep(0.01)
    else:
        print('\n**超出范围**\n')
        d = 4
        g = q[d]  #调用q列表中的第d位元素
        p2.ChangeDutyCycle(tonum(g)) #执行角度变化,跳转到q列表中对应第d位元素的角度
        sleep(0.1)
        p2.ChangeDutyCycle(0) #清除当前占空比,使舵机停止抖动
        sleep(0.01)

def down():
    global b, d    #引入全局变量
    if d < 11:
        d = d+1
        g = q[d]  #调用q列表中的第d位元素
        print('当前角度为',g)
        p2.ChangeDutyCycle(tonum(g)) #执行角度变化,跳转到q列表中对应第d位元素的角度
        sleep(0.1)
        p2.ChangeDutyCycle(0) #清除当前占空比,使舵机停止抖动
        sleep(0.01)
    else:
        print('\n****超出范围****\n')
        d = 4
        g = q[d]  #调用q列表中的第d位元素
        p2.ChangeDutyCycle(tonum(g)) #执行角度变化,跳转到q列表中对应第d位元素的角度
        sleep(0.1)
        p2.ChangeDutyCycle(0) #清除当前占空比,使舵机停止抖动
        sleep(0.01)

if __name__ == '__main__':
	while True:
		a = input('输入:')
	    if a == 'a':
	        left()
	    elif a == 'd':
	        right()
	    elif a == 'w':
	        up()
	    elif a == 's':
	        down()

再补充一下

补充一下关于舵机抖动和消抖的方法(仅是个人观点哈):
舵机会发生抖动是因为它自身认为自己还没有真正转到要求的角度,所以会不断的左右纠正,最终产生抖动。一般抖动是因为占空比没有清零,所以当舵机转到指定的角度后,稍微给一端很短的时间停留后,就将当前的占空比清零,如:

p2.ChangeDutyCycle(0)
sleep(0.01)

##2020.8.22
有写得不好、写得不对的地方还请各位指出,谢谢!


##2024.01.15
添加系列内容链接

  • 78
    点赞
  • 475
    收藏
    觉得还不错? 一键收藏
  • 14
    评论
### 回答1: 树莓派Pico是树莓派推出的一款微型电脑,Pico中文版是针对中国市场推出的版本。Pico-Python-SDK是树莓派官方提供的软件开发工具包,用于编写和运行Python程序。Pico-Python-SDK中文版是根据中国用户的需求进行本土化开发的版本。 树莓派Pico是一款体积小巧但功能强大的微型电脑,搭载了ARM Cortex-M0+处理器和26个GPIO口,可用于连接各种传感器、执行各种控制任务。同时,Pico支持MicroPython和C/C++两种编程语言,非常适合初学者和嵌入式系统开发人员。 Pico-Python-SDK中文版是官方提供的软件开发工具包,它提供了一系列的API和库函数,可以帮助开发者更方便地编写和调试Python程序。无论是控制外部硬件设备还是实现各种功能,Pico-Python-SDK都提供了丰富的功能和示例代码,使开发工作更加便捷。 Pico-Python-SDK中文版还提供了中文文档和教程,有助于开发者更快速地上手。通过学习这些文档和教程,开发者可以了解Pico的基本原理、功能特性以及编程方法,从而高效地开发出各种应用。 总的来说,树莓派Pico-Python-SDK中文版为中国用户提供了一个方便、易用的软件开发平台,帮助开发者快速上手并实现各种创意和项目。无论是学习编程还是进行嵌入式系统开发,Pico-Python-SDK中文版都是一个不错的选择。 ### 回答2: 树莓派pico-python-sdk-中文版是为了方便中国开发者使用而推出的一款软件开发工具包。它是基于树莓派pico微控制器设计的,通过使用Python语言进行开发。该SDK提供了丰富的功能和接口,使得使用者能够轻松地进行树莓派pico的开发工作。 树莓派pico-python-sdk-中文版包含了各种模块和库,如GPIO库、PWM库、I2C库、SPI库等,这些库可以帮助开发者通过编写Python代码来操控各种外设和传感器。例如,使用GPIO库可以控制LED灯的开关,使用PWM库可以控制舵机的转动,使用I2C库可以与其他设备进行通信,使用SPI库可以实现高速数据传输等等。 此外,树莓派pico-python-sdk-中文版还提供了丰富的示例代码和文档,帮助开发者快速上手。开发者可以参考这些示例代码和文档,了解如何使用SDK中的功能和接口,从而加速自己的开发进程。 总之,树莓派pico-python-sdk-中文版是一款功能强大、易于学习和使用的软件开发工具包。它不仅方便中国开发者使用树莓派pico进行开发工作,还提供了丰富的功能和接口,使得开发者能够更加便捷地实现各种应用和项目。无论是初学者还是有经验的开发者,都可以通过使用这个SDK来实现自己的创意和想法。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值