美文网首页创客见闻录我爱编程
为mblock开发L293D电机驱动板

为mblock开发L293D电机驱动板

作者: 少儿创客 | 来源:发表于2017-03-01 14:41 被阅读86次

    最近在整理小学信息技术教材的套件,其中有一课用到了电机,于是采用了电机驱动板,但是L293D驱动板用起来比较复杂,mblock又没有相应的 扩展,只好自己动手丰衣足食.
    虽然官方扩展开发指导说扩展的开发没有想象中的难,但是想说爱真的不容易,简单的功能很容易实现但是复杂的功能需要经过反复调试.

    Arduino下面的电机速度设定

    用上述办法控制任意一个电机转动是没有问题的,另外我注意到L293D的1,3号电机可以正转反转,而2,4号电机只能正转,不知道是我程序的问题,还是接线的问题,还是其他原因.

    深入认识mblock

    Scratch模式

    最开始的时候,mblock往往单纯被当做是Scratch软件的替代品,此为第一境界;或者单纯作为Arduino IDE的图形化编程替代品,后来才知道Arduino功能很强大,我去年10月份一直想找一款类似于Scratch 1.4下S4A的软件,一直没有找到,后来接触到了ScratchPi(树上科技),以及诺丁科技都在开发类似的产品,直到前阵子我才意识到,原来mblock支持刷入固件实时交互,***舞台上的角色可以实时说出传感器的读数.

    Scratch模式 Scratch模式和Arduino模式

    Arduino模式

    Arduino模式

    这种模式跟传统的Arduino IDE的使用方法类似,不过使用Scratch图形化编程方式编程.

    L293D电机驱动板

    介绍

    扩展开发

    通过阅读扩展开发指导,我照葫芦画瓢做出了L293D驱动扩展模块.并且为了跟mBot的电机类似,我在c代码里面做了一定出力,根据用户设定的速度正负,自动正转或者反转.

    ["w", 
            "设置电机 %d.motors 速度为 %d.motorspeed",
            "runMotor", 
            "1", 
            "255",
            {"encode":"{d0}{d1}",
            "setup":" int motorspeed = {1} ;\n  if( motorspeed >= 0){\n    motor.setSpeed(motorspeed);\n
     
      motor.run(FORWARD);\n    }\n   if (motorspeed <0 ){\n  motor.setSpeed(motorspeed);\n  motor.run(BACKWARD);\n
        }\n   ",
            "inc":"#include  <AFMotor.h>\n",
            "def":"AF_DCMotor motor({0});\n",
            "work":"",
            "loop":""}],
    

    说明

    encode,代表是参数,与你在代码块外观设定的要一致.
    setup对应了Arduino c代码中的setup中的内容,inc代表了要引入的库
    def是在setup之前定义的代码
    work是不断执行的代码
    我觉得Arduino离线模式的代码扩展比较容易,就是通过这个json串来定义生成的c代码的对应关系,或者定义生成c代码的规则,比较容易;但是同时如果你规则定义的不够合理,那么你的程序也就存在很大的问题

    存在问题

    虽然这个扩展能够驱动电机,但是当我需要同时让多个电机转动的时候就无能为力了.

    控制1个电机

    然而我需要控制两个电机的时候就存在问题:

    控制多个电机存在问题

    可以看到当我们拖入两个控制电机的代码块的时候,

    #include <Arduino.h>
    #include <Wire.h>
    #include <SoftwareSerial.h>
    
    #include  <AFMotor.h>
    
    double angle_rad = PI/180.0;
    double angle_deg = 180.0/PI;
    AF_DCMotor motor(1);
    AF_DCMotor motor(2);
    # 这里声明了两个电机
    
    void setup(){
    # 但是setup函数中只控制了一个
         int motorspeed = 255 ;
          if( motorspeed >= 0){
                motor.setSpeed(motorspeed);
              motor.run(FORWARD);
            }
           if (motorspeed <0 ){
              motor.setSpeed(motorspeed);
              motor.run(BACKWARD);
            }
    }
    
    void loop(){
        _loop();
    }
    
    void _delay(float seconds){
        long endTime = millis() + seconds * 1000;
        while(millis() < endTime)_loop();
    }
    
    void _loop(){
    }
    

    依次执行代码

    如何依次让电机转动,写驱动看似容易,但是实际上很容易犯错误.

    改进

    理论上,c能够控制的,通过扩展的方式mblock也可以,但是要注意扩展的书写方式,不然人容易出错.

    而且Scratch模式下的扩展开发则更为复杂,因为涉及到固件的通讯协议.
    继续完善.

    相关文章

      网友评论

        本文标题:为mblock开发L293D电机驱动板

        本文链接:https://www.haomeiwen.com/subject/ingqgttx.html