立即注册

扫一扫,访问微社区

micropython-microbit 中文社区

查看: 55|回复: 0

麦昆的python电机驱动

[复制链接]
  • TA的每日心情
    开心
    2019-5-12 11:06
  • 签到天数: 8 天

    [LV.3]偶尔看看II

    发表于 2019-5-20 13:41:56 | 显示全部楼层 |阅读模式

    马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

    您需要 登录 才可以下载或查看,没有帐号?立即注册

    x
    麦昆上有两个减速电机,用来驱动小车的轮子,可以正反转和调速。电机是通过一个I2C转PWM芯片后,在由75V18驱动的。因为DF没有提供相关的资料,不知道是什么芯片。不过也没有关系,通过makecode程序,我们可以很快的就知道使用方法。


    可以找到这样一个函数:

    1.     //% weight=90
    2.     //% blockId=motor_MotorRun block="Motor|%index|dir|%Dir|speed|%speed"
    3.     //% speed.min=0 speed.max=255
    4.     //% index.fieldEditor="gridpicker" index.fieldOptions.columns=2
    5.     //% direction.fieldEditor="gridpicker" direction.fieldOptions.columns=2
    6.     export function MotorRun(index: aMotors, direction:Dir, speed: number): void {
    7.         let buf = pins.createBuffer(3);
    8.         if (index==0){
    9.             buf[0]=0x00;
    10.         }
    11.         if (index==1){
    12.             buf[0]=0x02;
    13.         }
    14.         buf[1]=direction;
    15.         buf[2]=speed;
    16.         pins.i2cWriteBuffer(0x10, buf);
    17.     }
    复制代码


    这就是电机的驱动函数,从这里可以看出,I2C芯片的地址是0x10,发送的命令是3个字节:第一个字节代表了通道,0代表电机1,2代表电机2;第二个字节是方向,应该就是正反转了;第三个字节是速度,也就是PWM的占空比,范围是0-255。

    知道了驱动方法,我们就可以编写python驱动函数:

    1. from microbit import *

    2. def moto1(speed=200):
    3.         buf = bytearray(3)
    4.         buf[0] = 0
    5.         buf[1] = [1, 0][speed>0]
    6.         buf[2] = abs(speed)%256
    7.         if buf[2]>0:buf[2]=max(buf[2], 20)
    8.         i2c.write(16, buf)

    9. def moto2(speed=200):
    10.         buf = bytearray(3)
    11.         buf[0] = 2
    12.         buf[1] = [1, 0][speed>0]
    13.         buf[2] = abs(speed)%256
    14.         if buf[2]>0:buf[2]=max(buf[2], 20)
    15.         i2c.write(16, buf)
    复制代码


    moto1函数中,只使用了一个参数speed,范围是-255到+255,正负号代表了正反转。0代表电机停止,不等于0代表电机转动。因为实测速度参数小于20时,电机可能无法启动,因此设置了最小速度为参数20。

    也可以将两个电机的驱动合在一个函数中
    1. m = bytearray(3)
    2. def Moto(self, M1=0, M2=0):
    3.                 m[0] = 0
    4.                 m[1] = [1, 0][M1>0]
    5.                 m[2] = [max(abs(M1), 20), 0][M1==0]
    6.                 i2c.write(16, m)
    7.                 m[0] = 2
    8.                 m[1] = [1, 0][M2>0]
    9.                 m[2] = [max(abs(M2), 20), 0][M2==0]
    10.                 i2c.write(16, m)
    复制代码












    手机扫码浏览
    回复

    使用道具 举报

    游客
    回复
    您需要登录后才可以回帖 登录 | 立即注册

    Archiver|手机版|小黑屋|micropython-microbit 中文社区 ( 鄂ICP备17012469号 )

    GMT+8, 2019-6-20 13:41 , Processed in 0.117687 second(s), 20 queries .

    Powered by Discuz! X3.4

    © 2001-2013 Comsenz Inc.

    快速回复 返回顶部 返回列表