精华内容
下载资源
问答
  • 通过树莓派控制舵机旋转固定角度
    千次阅读
    2020-03-05 17:11:26

    最近项目遇到一个小需求:通过转动旋钮对设备进行调焦。傻瓜式操作,只需要一个电机带动旋钮就好了。重点倒是如何识别图像是否达到自己想要的清晰度。不多说,上代码。
    整体说明一下:通过相机采集图像,键盘按‘q’,采集一张图像,然后通过SMD2去分析得到图像的清晰度,再根据清晰度去对应调整舵机旋转的角度。这边只是测试舵机控制。

    import atexit
    import RPi.GPIO as GPIO                 # 引入GPIO模块
    import time
    import cv2 as cv
    import numpy as np
    import math
    
    atexit.register(GPIO.cleanup)
    #图像采集
    def grap_photo():
        cap = cv.VideoCapture(0)
        while True:
            ret,frame = cap.read()
            if ret:
                cv.imshow('test',frame)
                if cv.waitKey(1) & 0xFF == ord('q'):
                    # ~ file_name = "xieyang.jpeg"
                    # ~ cv2.imwrite(file_name, frame)
                    img=cv.cvtColor(frame,cv.COLOR_BGR2GRAY)
                    return img
                    # ~ break
            else:
                break
        cap.release()
        cv.destroyAllWindows()
    #清晰度分析    
    def SMD2(img):
        '''
        :param img:narray 二维灰度图像
        :return: float 图像约清晰越大
        '''
        img = cv.cvtColor(img,cv.COLOR_BGR2GRAY)
        img = cv.resize(img,(480,640))
        shape = np.shape(img)
        out = 0
        for x in range(0, shape[0]-1):
            for y in range(0, shape[1]-1):
                out+=math.fabs(int(img[x,y])-int(img[x+1,y]))*math.fabs(int(img[x,y]-int(img[x,y+1])))
        return out
    def NEW_SMD2_(img):
        '''
        :param img:narray 二维灰度图像
        :return: float 图像约清晰越大
        '''
        img = cv.cvtColor(img,cv.COLOR_BGR2GRAY)
        img = cv.resize(img,(480,640)) #原来图片的数据类型:uint8
        img = np.float32(img) #转换后:float32
        timeA = time.time()
        h, w = img.shape
        Sharpness = np.sum(np.abs(img[:h-1, :w-1] - img[1:, :w-1]) * np.abs(img[:h-1, :w-1] - img[:h-1, 1:]))
        # print('new: {:.4f}'.format(time.time()-timeA))
        return Sharpness
    #该方法(NEW_SMD2_)采用矩阵运算,处理速度比SMD2要快许多。值得注意的是:需要对img的数据类型转换,
    #原图数据类型是uint8,计算方差时数据较大,会导致数组越界,最后得到的数值和SMD2不一样。所以需要转换
    #可控制300度旋转的舵机
    def Control_300(angle=None):
        try:
            while True:
                # ~ # 等待输入一个0到300的角度
                # ~ direction = angle
                direction = float(input("请输入移动角度: "))
                if direction < 0 or direction > 300:
                    print("请输入正确的角度")
                    continue
    
                duty = (1/30) * direction + 2.5   # 将角度转换为占空比
                pwm.ChangeDutyCycle(duty)         # 改变PWM占空比
                time.sleep(0.02)
        finally:
            pwm.stop()                      # 停止PWM
            GPIO.cleanup()                  # 清理释放GPIO资源,将GPIO复位
    
    
    #可控制360度旋转舵机
    def Control_360(angle=None):
        try:
            while True:
                # ~ # 等待输入一个0到300的角度
                # ~ direction = angle
                direction = float(input("请输入移动角度: "))
                if direction < 0 or direction > 360:
                    print("请输入正确的角度")
                    continue
    
                duty = (1/36) * direction + 2.5   # 将角度转换为占空比
                pwm.ChangeDutyCycle(duty)         # 改变PWM占空比
                time.sleep(0.02)
        finally:
            pwm.stop()                      # 停止PWM
            GPIO.cleanup()                  # 清理释放GPIO资源,将GPIO复位
    
    
    #不可控360度旋转    
    def UnControl_360(angle=None):
        try:
            # 等待输入一个0到300的角度
            direction = angle
            # ~ direction = float(input("请输入移动角度: "))
            if direction < 0 or direction > 360:
                print("请输入正确的角度")
            duty = (1/30) * direction + 2.5   # 将角度转换为占空比
            pwm.ChangeDutyCycle(duty)         # 改变PWM占空比
            time.sleep(0.02)
     
        finally:
            pwm.stop()                      # 停止PWM
            GPIO.cleanup()                  # 清理释放GPIO资源,将GPIO复位 
    if __name__ == '__main__':
        ServoPin = 21
        PWMFreq = 50                      # PWM信号频率
    
        GPIO.setmode(GPIO.BCM)              # 使用BCM编号方式
        GPIO.setup(ServoPin, GPIO.OUT)      # 将GPIO19设置为输出模式
        pwm = GPIO.PWM(ServoPin, PWMFreq)   # 创建PWM对象,并设置频率为50
        pwm.start(0)                        # 启动PWM,并设置初始占空比0
        # ~ UnControl_360()
        Control_360()
        # ~ img = grap_photo()
        # ~ data = SMD2(img)
        # ~ print(data)
        # ~ if data>10000:
            # ~ Control_300(200)
        # ~ else:
            # ~ Control_300(10)
    
    更多相关内容
  • 树莓派控制舵机

    千次阅读 2021-11-06 10:58:41
    9 G 180°微型舵机树莓派4. 5 V 电源。(可选) 二、PWM如何工作 树莓派不能直接输出模拟电信号,但我们可以使用PWM(脉宽调制)方法来模拟这一点。我们制作一个固定频率的数字信号,在那里我们将改变脉冲宽度,...

    一、所需材料
    9 G 180°微型舵机。
    树莓派4.
    5 V 电源。(可选)
    二、PWM如何工作
    树莓派不能直接输出模拟电信号,但我们可以使用PWM(脉宽调制)方法来模拟这一点。我们制作一个固定频率的数字信号,在那里我们将改变脉冲宽度,将“转换”改为“平均”输出电压的电平,我们可以使用这个“平均”电压水平来控制LED亮度。
    频率本身不是重点,而是“占空比”,即脉冲“高”的时间除以波周期之间的关系。例如,假设我们在树莓派的 GPIO上产生一个50Hz的脉冲频率。周期(p)将是频率的倒数或20ms(1 / f)。如果我们的LED达到“半”亮度,我们的占空比必须为50%,这意味着“脉冲”将是10ms的“高”。而在这里,我们将用“占空比”来定义舵机的位置。

    p = GPIO.PWM(pin,50) # 在pin脚上产生频率为50HZ的PWM信号。

    p.start(0) # 在引脚上设置一个初始PWM信号。

    p.ChangeDutyCycle(3) # 通过输入不同的“占空比值”来观察舵机的位置变化,这里的“占空比”是3%。

    三、接线
    一般舵机有三根控制线,分别为黄、红、灰(黑),这三根线分别接树莓派GPIO数据输出引脚、5V电源正极、GND。
    对于舵机的供电,可以选择树莓派的5V输出,但为了树莓派的安全起见,建议用外部5V电源。充电宝就可以。

    四、舵机校准

    1. 舵机参数

    首先,你要清楚你的舵机参数。我使用的舵机基本参数如下:

     理论上,1ms对应舵机0°,1.5ms对应舵机90°,2ms对应舵机180°。
    在利用Python编写舵机位置时,利用的是上述位置所对应的的“占空比”。

     舵机校正
    在树莓派中运行以下代码:
    #!/usr/bin/env python3
    import RPi.GPIO as GPIO
    import time
    GPIO.setmode(GPIO.BOARD) # GPIO引脚编号的两种方式之一,另一种是BCM。所用编号方式不同,pin也不同。
    GPIO.setwarnings(False) # 禁用警告。
    GPIO.setup(pin,GPIO.OUT) # pin为你所接的数据输出GPIO引脚。
    p = GPIO.PWM(pin,50) # 在pin脚上产生频率为50HZ的PWM信号。
    p.start(0) # 在引脚上设置一个初始PWM信号。
    p.ChangeDutyCycle(3) # 通过输入不同的“占空比值”来观察舵机的位置变化,这里的“占空比”是3%。
    time.sleep(1)
    p.stop() # 停止PWM。
    GPIO.cleanup() # 清理GPIO。


    最终得到的角度和“占空比”的关系为:

     进而,我们可以通过一组简单的二元一次方程,得到占空比和角度的关系表达式:
    DutyCycle = angle/18 + 2

    五、舵机控制代码
    #!/usr/bin/env python3 
    import RPi.GPIO as GPIO
    import time
    def setServoAngle(angle):
       GPIO.setmode(GPIO.BOARD)
       GPIO.setwarnings(False)
       GPIO.setup(32, GPIO.OUT)
       tilt = GPIO.PWM(32, 50)
       tilt.start(0)
       DutyCycle = angle/18 + 2
       tilt.ChangeDutyCycle(DutyCycle)
       time.sleep(1)
       tilt.stop()
    c = input("If you want to continue, type 'c' please. Type 'e' to end.")
    while c == 'c':
       angle = input('Please type an angle:')  # input输入的是字符串,需要用int()函数转化成数字。
       angle = int(angle)
       setServoAngle(angle)
       c = input("'c' or 'e'?") 
    GPIO.cleanup()

     

    展开全文
  • 树莓派控制SG90舵机

    2019-04-25 20:05:09
    树莓派控制SG90舵机
  • 系统运行时报的错误原因 faceReco.py:32: RuntimeWarning: This channel is already in use, continuing anyway. Use GPIO.setwarnings(False) to disable warnings. GPIO.setup(25, GPIO.OUT) faceReco.py:42: ...
  • 树莓派控制舵机资料

    2021-02-05 18:16:11
    舵机介绍:http://www.51hei.com/mcu/2672.html树莓派PWM函数介绍:http://shumeipai.nxez.com/2014/11/13/rpi-gpio-module-pwm-basic-function.html舵机角度和占空比对应的关系动画。对应关系如下,范围为-90°到+...

    舵机介绍:http://www.51hei.com/mcu/2672.html

    树莓派PWM函数介绍:http://shumeipai.nxez.com/2014/11/13/rpi-gpio-module-pwm-basic-function.html

    舵机角度和占空比对应的关系动画。

    4231f6be8772b305ee1811791c0f51be.gif

    对应关系如下,范围为-90°到+90°。为了方便计算,可以将其映射到0-180°

    角度

    20ms内脉冲宽度

    占空比

    映射后角度

    -90°

    0.5ms

    2.5%

    -45°

    1ms

    5.0%

    45°

    1.5ms

    7.5%

    90°

    45°

    2ms

    10.0%

    135°

    90°

    2.5ms

    12.5%

    180°

    GPIO库中p.ChangeDutyCycle()需要控制PWM的参数需要的是占空比(确切的说,占空比*100),而我们要调节的是角度,估映射后角度和占空比的对应函数关系为:f = 1/18*角度 + 2.5

    根据给出的对应关系,猜测是线性关系。

    2.5 = 0*x + b

    12.5 = 180*x + b

    解二元一次方程 (小学数学 :)) x = 1/18 b=2.5

    代码如下

    def changeDgree(degree):

    """舵机转到给定到角度"""

    duty_cycle = float(degree)/18 + 2.5

    p.ChangeDutyCycle(duty_cycle)

    定要等待,留下足量时间供电,以转到特定角度,即让设置生效

    time.sleep(0.5)

    展开全文
  • 树莓派控制串口舵机,很不错的代码,很详细,一看就学得会
  • 使用树莓派控制舵机MG90D

    千次阅读 2019-09-18 20:07:58
    舵机是一种位置(角度)伺服的驱动器,适用于那些需要角度不断变化并可以保持的控制系统。目前,在高档遥控玩具,如飞机、潜艇模型,遥控机器人中已经得到了普遍应用。我们这里使用的淘宝上常见的MG90舵机。如下图,...

    舵机介绍

    舵机是一种位置(角度)伺服的驱动器,适用于那些需要角度不断变化并可以保持的控制系统。目前,在高档遥控玩具,如飞机、潜艇模型,遥控机器人中已经得到了普遍应用。我们这里使用的淘宝上常见的MG90舵机。如下图,需要注意,不同的型号,其转向的角度,力距不一样,可以根据自己的需求进行选用。

    工作原理

    舵机的控制信号由接收机的通道进入信号调制芯片,获得直流偏置电压。它内部有一个基准电路,产生周期为20ms,宽度为1.5ms的基准信号,将获得的直流偏置电压与电位器的电压比较,获得电压差输出。最后,电压差的正负输出到电机驱动芯片决定电机的正反转。当电机转速一定时,通过级联减速齿轮带动电位器旋转,使得电压差为0,电机停止转动。 
      舵机的控制一般需要一个20ms左右的时基脉冲,该脉冲的高电平部分一般为0.5ms-2.5ms范围内的角度控制脉冲部分,总间隔为2ms。以180度角度伺服为例,那么对应的控制关系是这样的: 

    脉宽、占空比和舵机转角之间的关系表格:

    脉冲/ms占空比角度
    0.52.5%0
    1.05%45
    1.57.5%90
    2.010%135
    2.512.5%180

    数据推算

    在上表的基础上,我们需要计算一些关键参数。 
    根据上表,如果我们要使舵机转到指定的角度θ(0≤θ≤180)θ(0≤θ≤180) ,则需要输入的脉冲占空比为: 
    D=2.5+(θ×(12.5−2.5))/180=2.5+(θ×10)/180
    舵机转动需要一定时间,给它发指令应避免引起冲突。舵机的转速大概为0.2秒每60度,即0.003s/° 。而舵机的精度为180°/1024≈0.18°,对应的脉冲占空比精度为(12.5−2.5)/1024≈0.01 ,因此,在步进转动内(即每次转0.18°,后面直接取0.2°),给舵机发的指令间隔时间不应该低于0.2×0.003=0.0006s ,舍入一下即0.001s。而如果我们是任意指定转角,那么两次指令的间隔时间则应该长于180×0.260=0.4s,这是从0度转到180度的时间。   

    舵机接线

    将舵机棕色线接到GND,红色线接到+5V引脚,橙色线接到GPIO.12(BCM18)引脚。

    程序编写

    Rotation.py

    import RPi.GPIO as GPIO
    import time
    
    # 这个类表示单个的SG90模块
    class Rotation:
        frequency=50 #脉冲频率(Hz)
        delta_theta=0.2 #步进转动间隔(度)
        min_delay=0.0006 #转动delta_theta的理论耗时(s)
        max_delay=0.4 #从0转到180的耗时(s)
    
        def __init__(self,channel,min_theta,max_theta,init_theta=0):
            '''
            构造函数:
                channel: 舵机信号线所连接的树莓派引脚编号(BCM编码)
                min_theta: 舵机转动的最小角度
                max_theta: 舵机转动的最大角度
                init_theta: 舵机的初始角度
            '''
            self.channel=channel 
            if(min_theta<0 or min_theta>180):
                self.min_theta=0
            else:
                self.min_theta=min_theta
    
            if(max_theta<0 or max_theta>180):
                self.max_theta=180
            else:
                self.max_theta=max_theta
                
            if(init_theta<min_theta or init_theta>max_theta):
                self.init_theta=(self.min_theta+self.max_theta)/2
            else:
                self.init_theta=init_theta #初始角度
                        
            #计算最小角度、最大角度的占空比
            self.min_dutycycle=2.5+self.min_theta*10/180
            self.max_dutycycle=2.5+self.max_theta*10/180
    
    
        def setup(self):
            '''
            初始化
            '''
            GPIO.setmode(GPIO.BCM)
            GPIO.setwarnings(False)
            GPIO.setup(self.channel,GPIO.OUT)
            self.pwm=GPIO.PWM(self.channel,Rotation.frequency) #PWM
            self.dutycycle=2.5+self.init_theta*10/180 #脉冲占空比的初始值
            self.pwm.start(self.dutycycle) #让舵机转到初始位置
            time.sleep(Rotation.max_delay)
    
        def positiveRotation(self):
            '''
            正相步进转动,每次调用只转动delta_theta度
            '''
            self.dutycycle=self.dutycycle+Rotation.delta_theta*10/180
            if self.dutycycle>self.max_dutycycle:
                self.dutycycle=self.max_dutycycle
            self.pwm.ChangeDutyCycle(self.dutycycle)
            time.sleep(Rotation.min_delay)
    
        def reverseRotation(self):
            '''
            反相转动,每次调用只转动delta_theta度
            '''
            self.dutycycle=self.dutycycle-Rotation.delta_theta*10/180
            if self.dutycycle<self.min_dutycycle:
                self.dutycycle=self.min_dutycycle
            self.pwm.ChangeDutyCycle(self.dutycycle)
            time.sleep(Rotation.min_delay)
    
        def specifyRotation(self,theta): 
            '''
            转动到指定的角度
            '''
            if(theta<0 or theta>180):
                return
            self.dutycycle=2.5+theta*10/180
            self.pwm.ChangeDutyCycle(self.dutycycle)
            time.sleep(Rotation.max_delay)
    
        def cleanup(self):
            self.pwm.stop()
            time.sleep(Rotation.min_delay)
            GPIO.cleanup()
    

    ServoCtrl.py

    import time
    
    rot = Rotation(18, 0, 180)
    
    rot.setup()
    time.sleep(2)
    
    for i in range(0,900):
        rot.positiveRotation()
        
    for i in range(0,900):
        rot.reverseRotation()
        
    rot.cleanup()
    

    转载于:https://my.oschina.net/hechunc/blog/3020284

    展开全文
  • 舵机介绍:http://www.51hei.com/mcu/2672.html树莓派PWM函数介绍:http://shumeipai.nxez.com/2014/11/13/rpi-gpio-module-pwm-basic-function.html舵机角度和占空比对应的关系动画。对应关系如下,范围为-90°到+...
  • 舵机控制一般需要一个20ms的时基脉冲,该脉冲的高电平部分一般为0.5ms~2.5ms范围内的角度控制脉冲部分。以180度角度舵机为例,那么对应的控制关系是这样的:0.5ms--------------0度;1.0ms------------45度;1.5ms...
  • SG90舵机硬件接口:SG90 一共三根线,红线接5v电源,棕线GND,黄线为数据控制线,接到GPIO上舵机参数:SG90 脉冲周期为20ms,脉宽0.5ms-2.5ms对应的角度-90到+90,对应的占空比为2.5%-12。python脚本import RPi.GPIO ...
  • 序言 舵机控制需要打开I2C端口 如何打开I2C端口呢? 打开端口 sudo raspi-config 选择Interfacing Options 选择i2c 选择enable 完成 最后记得重启树莓派 sudo reboot
  • int(46)) GPIO.cleanup() print("成功") if __name__ == '__main__': motion() 我用这个代码setServoAngle(servo, int(-30))这条指令舵机转不到 ,我逐个排查从-28开始舵机就不转动了再往下减也是 本来之前-28都还...
  • 树莓派舵机

    千次阅读 多人点赞 2019-08-05 16:52:25
    伺服电机也叫舵机,英文servo,是由直流电机、减速齿轮组、电位器和控制电路组成,并封装在一个便于安装的外壳里的伺服单位,能够根据输入信号比较准确的转动到给定的角度,典型的伺服电机及其组成如下图所示。...
  • 舵机的大小和产生的力量各不相同,小型舵机很便宜,关于树莓派控制舵机的文章已经有很多了。诸如:树莓派PWM控制舵机的两种方式、树莓派3 B+Servoblaster 舵机控制等等。今天我们在研究一下树莓派使用GpioZero来控制...
  • 机器狗搭建记录2-树莓派连接舵机

    千次阅读 2020-09-13 21:58:44
    3.PCA9685舵机控制器 x1 4.PDI-HV5523MG舵机 x1 1.更新系统软件 sudo apt update -y sudo apt dist-upgrade -y sudo apt autoremove -y 这里最好接入有线,直接插上网线的接口就可以直接连上了。无线贼慢,慢到怀疑...
  • 树莓派基于qt5+wiringpi控制舵机
  • 运行前 请将脉冲输入所连接的树莓派GPIO引脚号 填写入下面的gpio_pin中 您可以直接运行此文件来测试他是否正常工作,你的舵机应该会开始运动 在其他py文件中 使用 import sg90_drive 来使用他 使用函数 sg90_drive....
  • 树莓派控制舵机云台SG90

    千次阅读 2020-02-26 09:37:05
    参考博客: ...https://blog.csdn.net/wangzhenyang2/article/details/80426361树莓派笔记13:舵机云台(一) https://blog.csdn.net/oalevel/article/details/79211215树莓派GPIO针脚在的BCM与BOARD模式 ...
  • 伺服电机主要适用于那些需要角度不断变化并可以保持的控制系统,...使用树莓派控制伺服电机的实践。本章我们将继续使用第5章搭建的多功能实验平台。此外,还需要一个伺服电机( ~ )和一个1kΩ的电阻。知识储备方面,...
  • 树莓派GPIO引脚输出PWM import RPi.GPIO as GPIO import time Pwm=GPIO.PWM(pin,frequence) #创建PWM实例 Pwm.start(dc) #启动PWM dc值 占空比(0.0<dc<100.0) Pwm.ChangeFrequency(freq) #改变...控制舵机
  • 树莓派 --- 控制舵机

    2021-12-04 20:07:45
    功能测试 需求:输入一个度数,舵机转轴上的塑料指针就转到对应的位置 示意图 servoControl.py import RPi.GPIO as GPIO from time import sleep servo_pin = 17 # 舵机信号线接树莓派GPIO17 GPIO.setmode(GPIO.BCM)...
  • 树莓派舵机云台操纵
  • 树莓派控制舵机云台

    千次阅读 2020-01-03 21:50:09
    文章目录学习记录 学习记录 手上有一套电赛时候买的舵机云台。扭矩15KG。型号为LD-1501MG。
  • 树莓派门锁,可以用树莓派来控制舵机并识别人脸,进行开门

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 880
精华内容 352
关键字:

树莓派控制舵机