最近在整理小学信息技术教材的套件,其中有一课用到了电机,于是采用了电机驱动板,但是L293D驱动板用起来比较复杂,mblock又没有相应的 扩展,只好自己动手丰衣足食.
虽然官方扩展开发指导说扩展的开发没有想象中的难,但是想说爱真的不容易,简单的功能很容易实现但是复杂的功能需要经过反复调试.
用上述办法控制任意一个电机转动是没有问题的,另外我注意到L293D的1,3号电机可以正转反转,而2,4号电机只能正转,不知道是我程序的问题,还是接线的问题,还是其他原因.
深入认识mblock
Scratch模式
最开始的时候,mblock往往单纯被当做是Scratch软件的替代品,此为第一境界;或者单纯作为Arduino IDE的图形化编程替代品,后来才知道Arduino功能很强大,我去年10月份一直想找一款类似于Scratch 1.4下S4A的软件,一直没有找到,后来接触到了ScratchPi(树上科技),以及诺丁科技都在开发类似的产品,直到前阵子我才意识到,原来mblock支持刷入固件实时交互,***舞台上的角色可以实时说出传感器的读数.
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代码的规则,比较容易;但是同时如果你规则定义的不够合理,那么你的程序也就存在很大的问题
存在问题
虽然这个扩展能够驱动电机,但是当我需要同时让多个电机转动的时候就无能为力了.
然而我需要控制两个电机的时候就存在问题:
可以看到当我们拖入两个控制电机的代码块的时候,
#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模式下的扩展开发则更为复杂,因为涉及到固件的通讯协议.
继续完善.