查看: 1757|回复: 0

MicroPython实战之TurnipBit开发板旋转按钮控制脱机摆动

[复制链接]
  • TA的每日心情
    慵懒
    2018-1-6 09:01
  • 签到天数: 7 天

    连续签到: 1 天

    [LV.3]偶尔看看II

    发表于 2018-6-29 15:25:11 | 显示全部楼层 |阅读模式
    分享到:
        一、实验目的:

        ?学习在PC机系统中扩展简单I/O 接口的方法
        ?学习TurnipBit拼插编程
        ?了解舵机工作原理
        ?学习TurnipBit扩展板舵机和旋转按钮接线方式

        二、所需原器件:

        ?TurnipBit一块
        ?TurnioBit扩展板一块
        ?杜邦线若干
        ?usb数据线一条
        ?舵机一个
        ?旋转按钮一个

        三、实验原理:

        1. 舵机的组成与参数
        舵机,又称伺服马达,是一种具有闭环控制系统的机电结构。舵机主要是由外壳、电路板、无核心马达、齿轮与位置检测器所构成。 其工作原理是由控制器发出PWM(脉冲宽度调制)信号给舵机,经电路板上的IC处理后计算出转动方向,再驱动无核心马达转动, 透过减速齿轮将动力传至摆臂,同时由位置检测器(电位器)返回位置信号,判断是否已经到达设定位置,一般舵机只能旋转180度。
    1.png

        舵机的接线
        舵机有3根线,棕色为地,红色为电源正,橙色为信号线,但不同牌子的舵机,线的颜色可能不同。

        舵机的控制原理
        舵机的转动的角度是通过调节PWM(脉冲宽度调制)信号的占空比来实现的。

        占空比:
        1.指高电平在一个周期之内所占的时间比率。
        2.正脉冲的持续时间与脉冲总周期的比值。例如:正脉冲宽度1μs,信号周期10μs的脉冲序列占空比为0.1。即:脉冲的宽度除以脉冲的周期称为占空比。标准PWM(脉冲宽度调制)信号的周期固定为20ms(50Hz),理论上脉宽分布应在1ms到2ms之间,但是,事实上脉宽可由0.5ms到2.5ms之间,脉宽和舵机的转角0°~180°相对应。

        四、接线方法:

        TurnipBit扩展板与发光二极管接口对应如下表:
    2.png

        五、源代码:
    1. from microbit import *

    2. #-----------
    3. #github:https://github.com/microbit-playground/microbit-servo-class
    4. #------------
    5. class Servo:
    6.     def __init__(self, pin, freq=50, min_us=600, max_us=2400, angle=180):
    7.         self.min_us = min_us
    8.         self.max_us = max_us
    9.         self.us = 0
    10.         self.freq = freq
    11.         self.angle = angle
    12.         self.analog_period = 0
    13.         self.pin = pin
    14.         analog_period = round((1/self.freq) * 1000)  # hertz to miliseconds
    15.         self.pin.set_analog_period(analog_period)

    16.     def write_us(self, us):
    17.         us = min(self.max_us, max(self.min_us, us))
    18.         duty = round(us * 1024 * self.freq // 1000000)
    19.         self.pin.write_analog(duty)
    20.         self.pin.write_digital(0)  # turn the pin off

    21.     def write_angle(self, degrees=None):
    22.         degrees = degrees % 360
    23.         total_range = self.max_us - self.min_us
    24.         us = self.min_us + total_range * degrees // self.angle
    25.         self.write_us(us)
    26.         
    27. sv1 = Servo(pin1)
    28. temp=0
    29. while True:
    30.     #读取旋转按钮传入的值,范围2~1023
    31.     read_val=pin0.read_analog()
    32.     #舵机旋转180度,将1023分割成180份,约等于5.67
    33.     angle=round(read_val/5.67)
    34.     if (temp!=angle):
    35.         temp=angle
    36.         sv1.write_angle(angle)
    37.         sleep(60)
    复制代码


    回复

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /4 下一条



    手机版|小黑屋|与非网

    GMT+8, 2024-11-25 00:06 , Processed in 0.112839 second(s), 16 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.