为mblock开发L293D电机驱动板

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

为mblock开发L293D电机驱动板_第1张图片
Arduino下面的电机速度设定

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

深入认识mblock

Scratch模式

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

为mblock开发L293D电机驱动板_第2张图片
Scratch模式
为mblock开发L293D电机驱动板_第3张图片
Scratch模式和Arduino模式

Arduino模式

为mblock开发L293D电机驱动板_第4张图片
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  \n",
        "def":"AF_DCMotor motor({0});\n",
        "work":"",
        "loop":""}],

说明

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

存在问题

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

为mblock开发L293D电机驱动板_第5张图片
控制1个电机

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

为mblock开发L293D电机驱动板_第6张图片
控制多个电机存在问题

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

#include 
#include 
#include 

#include  

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电机驱动板)