为mblock开发L293D电机驱动板

最近在整理小学信息技术教材的套件,其中有一课用到了电机,于是采用了电机驱动板,但是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模式下的扩展开发则更为复杂,因为涉及到固件的通讯协议.
继续完善.

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容