首页 > 其他分享 >树莓派4B-GPIO控制舵机转动

树莓派4B-GPIO控制舵机转动

时间:2023-06-30 11:44:24浏览次数:34  
标签:树莓 servo 舵机 min width range GPIO 4B

树莓派4B-GPIO控制舵机转动

硬件需求:

  1. 树莓派
  2. 舵机
  3. 杜邦线

舵机

什么是舵机?

舵机(servomotor)是一种简化版本的伺服电机,是位置伺服的驱动器,能够通过输入PWM信号控制旋转角度,具备轻量、小型、简化和性价比高的特点。
舵机适用于那些需要角度不断变化并可以保持的简单控制系统,它能实现较为精确的电机控制,在航模、遥控玩具、机器狗等品类上运用良好。

舵机的运动方式

舵机的运动方式是绕轴摆动,“舵机”一词也和它的运动方式有关,舵机常用来摆动调整方向,就像海洋上的水手的舵一样,航模和船模常常用舵机的摆动来调整一些零部件的角度。

舵机的部分参数表

GPIO接线方式

pwm - pin32 (PWM Signal)

Vcc - pin2 (4.8v ~6v)

ground - pin14 (0v)

"""
使用该代码可以查询树莓派的GPIO参数
如果出现报错需要先安装wiringpi
"""
pi@raspberrypi:~ $ gpio readall

代码

舵机自己正反转180度:

#!/usr/bin/python
# coding:utf-8
# servo_PWM_GPIO.py
# 树莓派GPIO控制外部舵机来回摆动,角度范围为0~180°,周期为4秒。
try:
    import RPi.GPIO as GPIO
except RuntimeError:
    print("Error importing RPi.GPIO!  This is probably because you need superuser privileges. "
          " You can achieve this by using 'sudo' to run your script")
import time


def servo_map(before_value, before_range_min, before_range_max, after_range_min, after_range_max):
    """
    功能:将某个范围的值映射为另一个范围的值
    参数:原范围某值,原范围最小值,原范围最大值,变换后范围最小值,变换后范围最大值
    返回:变换后范围对应某值
    """
    percent = (before_value - before_range_min) / (before_range_max - before_range_min)
    after_value = after_range_min + percent * (after_range_max - after_range_min)
    return after_value


GPIO.setmode(GPIO.BOARD)  # 初始化GPIO引脚编码方式
servo_SIG = 32
servo_VCC = 4
servo_GND = 6
servo_freq = 50
servo_time = 0.01
servo_width_min = 2.5
servo_width_max = 12.5
# servo_degree_div =servo_width_max - servo_width_min)/180
GPIO.setup(servo_SIG, GPIO.OUT)
# 如果你需要忽视引脚复用警告,请调用GPIO.setwarnings(False)
# GPIO.setwarnings(False)
servo = GPIO.PWM(servo_SIG, servo_freq)  # 信号引脚=servo_SIG 频率=servo_freq in HZ
servo.start(0)
servo.ChangeDutyCycle((servo_width_min+servo_width_max)/2)  # 回归舵机中位
print('预设置完成,两秒后开始摆动')
time.sleep(2)
try:  # try和except为固定搭配,用于捕捉执行过程中,用户是否按下ctrl+C终止程序
    while 1:
        for dc in range(1, 181, 1):
            dc_trans = servo_map(dc, 0, 180, servo_width_min, servo_width_max)
            servo.ChangeDutyCycle(dc_trans)
            # print(dc_trans)
            time.sleep(servo_time)
        time.sleep(0.2)
        for dc in range(180, -1, -1):
            dc_trans = servo_map(dc, 0, 180, servo_width_min, servo_width_max)
            servo.ChangeDutyCycle(dc_trans)
            # print(dc_trans)
            time.sleep(servo_time)
        time.sleep(0.2)
except KeyboardInterrupt:
    pass
servo.stop()  # 停止pwm
GPIO.cleanup()  # 清理GPIO引脚

可以控制舵机角度:

#!/usr/bin/python
# coding:utf-8
# servo_PWM_GPIO_2.py
# 输入一个角度值,舵机将转动到对应的角度
try:
    import RPi.GPIO as GPIO
except RuntimeError:
    print("Error importing RPi.GPIO!  This is probably because you need superuser privileges. "
          " You can achieve this by using 'sudo' to run your script")
import time


def servo_map(before_value, before_range_min, before_range_max, after_range_min, after_range_max):
    """
    功能:将某个范围的值映射为另一个范围的值
    参数:原范围某值,原范围最小值,原范围最大值,变换后范围最小值,变换后范围最大值
    返回:变换后范围对应某值
    """
    percent = (before_value - before_range_min) / (before_range_max - before_range_min)
    after_value = after_range_min + percent * (after_range_max - after_range_min)
    return after_value


GPIO.setmode(GPIO.BOARD)  # 初始化GPIO引脚编码方式
servo_SIG = 32
servo_VCC = 4
servo_GND = 6
servo_freq = 50
servo_time = 0.01
servo_width_min = 2.5
servo_width_max = 12.5
# servo_degree_div =servo_width_max - servo_width_min)/180
GPIO.setup(servo_SIG, GPIO.OUT)
# 如果你需要忽视引脚复用警告,请调用GPIO.setwarnings(False)
# GPIO.setwarnings(False)
servo = GPIO.PWM(servo_SIG, servo_freq)  # 信号引脚=servo_SIG 频率=servo_freq in HZ
servo.start(0)
servo.ChangeDutyCycle((servo_width_min+servo_width_max)/2)  # 回归舵机中位
print('预设置完成,两秒后开始等待输入')
time.sleep(2)
# 为舵机指定位置
try:    # try和except为固定搭配,用于捕捉执行过程中,用户是否按下ctrl+C终止程序
    while 1:
        position = input("请输入0°-180°的角度值:\n")
        if position.isdigit()==1:
            dc = int(position)
            if (dc>=0) and (dc<=180):
                dc_trans=servo_map(dc, 0, 180,servo_width_min,servo_width_max)
                servo.ChangeDutyCycle(dc_trans)
                print("已转动到%d°处"%dc)
            else:
                print("Error Input:Exceed Range")
        else:
            print("Error Input:Not Int Input")
except KeyboardInterrupt:
    pass

servo.stop()  # 停止pwm
GPIO.cleanup()  # 清理GPIO引脚

结果展示

最后,祝各位学业有成,生活顺心!

标签:树莓,servo,舵机,min,width,range,GPIO,4B
From: https://www.cnblogs.com/itduan/p/17516223.html

相关文章

  • 树莓派集群真的可以顶上一台高性能计算机吗?(扩展篇)
    之前写过文章:树莓派集群真的可以顶上一台高性能计算机吗讨论过树莓派集群是否可以比得上一台高性能计算机的问题,本篇这里是对前文的扩展。   ========================================================  之所以写了本篇扩展是因为无意中在网上发现了下文:https://a......
  • LCD多键触摸驱动IC芯片VK36N3B/4B/5B/6B/7B/8B技术资料
    型号汇总:VK36N3B-8B按键数不同,分别对应3-8个触摸按键VK36N3B封装为sop8,VK36N4-8B为sop16,VK36N3B/4B为2位BCD码输出,VK36N5B-8B为3位BCD码输出。概述:VK36N3B具有3个触摸按键,可用来检测外部触摸按键上人手的触摸动作。该芯片具有较高的集成度,仅需极少的外部组件便可实现触摸按键......
  • 闲来无事-树莓派控制风扇启停
    扯淡时间端午放假,本想注册个美团众包骑自行车送外卖体验一下生活,奈何这几天北京热的要死,只能作罢,还是苟在屋里空调续命吧。无事干的时候,想着给我花盆监控升个级,换个电容的土壤检测(之前的腐蚀了gg了)但是电容的是3v的,esp8266只能检测1v的,所以买了一个新的esp32-cam,正好带个摄像......
  • TVS二极管DW05-4R3P-S 保护GPIO端口免受ESD静电威胁
    General-purposeInputOutput,中文:通用输入/输出端口,简称GPIO或总线扩展器。GPIO端口能够提供额外的控制和监视功能,每个GPIO端口可通过软件分别配置成输入或输出,由于其可能需要引线至外部传输数据,极其容易受到ESD静电放电及其他电磁脉冲浪涌的影响,为产品的稳定性和可靠性带来挑战......
  • 0.GPIO
    1、LSI RC,低速内部时钟(RC振荡器),是看门狗(WatchdogLS)的唯一时钟来源,可以作为实时时钟RTC和主时钟输出(MCO)的时钟源。2、LSE OSC,外部低速时钟(晶振),输入输出引脚接OSC32_IN、OCS32_OUT可以作为实时时钟RTC和主时钟输出(MCO)的时钟源。精度高于内部低速时钟。3、MSI RC,全称为Multispeedi......
  • 闲来无事-控制树莓派风扇启停
    扯淡时间端午放假,本想注册个美团众包骑自行车送外卖体验一下生活,奈何这几天北京热的要死,只能作罢,还是苟在屋里空调续命吧。无事干的时候,想着给我花盆监控升个级,换个电容的土壤检测(之前的腐蚀了gg了)但是电容的是3v的,esp8266只能检测1v的,所以买了一个新的esp32-cam,正好带个摄像......
  • 树莓派4B改造成云桌面客户端,连接DoraCloud免费版
     RaspberryPi(树莓派)是为学习计算机编程教育而设计的只有信用卡大小的微型电脑,自问世以来受众多计算机发烧友和创客的追捧,曾经一“派”难求。DoraCloud是一款多平台的桌面虚拟化管理软件,支持Hyper-V、VMware、Proxmox、XenServer等多种虚拟化平台。DoraCloud提供免费版,可以支......
  • linux gpio dev,linux gpio子系统 devicetree中GPIO_ACTIVE_LOW
    一直没怎么理解GPIO_ACTIVE_LOW的作用对于以上的dts你应该再熟悉不过,当然这里不是教你如何使用dts,而是关注gpio和irq最后一个数字可以如何利用。例如rst-gpio的OF_GPIO_ACTIVE_LOW代表什么意思呢?可以理解为低有效。什么意思呢?举个例子,正常情况下,我们需要一个gpio口控制灯,我们认......
  • 树莓派、PS4、Switch、STM32、安卓、iOS
    系统架构树莓派:基于ARMCortex-A系列处理器(如Cortex-A53)的Linux操作系统。PS4:基于x86-64架构的FreeBSD操作系统。Switch:基于ARMv8-A架构的NvidiaCustom操作系统,也被称为“HorizonOS”。STM32:无操作系统或基于实时操作系统(RTOS)的固件(裸机)编程。安卓:基于Linux内核的软件堆栈......
  • 树莓派4B装Windows 11
    树莓派4B装Windows11下载系统与相关安装软件windowsforraspberryhttps://worproject.ml/https://pan.baidu.com/s/1ZrVS69Q4b8phlbAiiU6igw?pwd=eyhn下载windows映像http://uupdump.net/注意Windows1122H2及以上版本需要Windows102004及以上系统才能正常生成映像,否......