最近在整理小學信息技術教材的套件,其中有一課用到了電機,于是采用了電機驅動板,但是L293D驅動板用起來比較復雜,mblock又沒有相應的 擴展,只好自己動手豐衣足食.
雖然官方擴展開發(fā)指導說擴展的開發(fā)沒有想象中的難,但是想說愛真的不容易,簡單的功能很容易實現但是復雜的功能需要經過反復調試.
用上述辦法控制任意一個電機轉動是沒有問題的,另外我注意到L293D的1,3號電機可以正轉反轉,而2,4號電機只能正轉,不知道是我程序的問題,還是接線的問題,還是其他原因.
深入認識mblock
Scratch模式
最開始的時候,mblock往往單純被當做是Scratch軟件的替代品,此為第一境界;或者單純作為Arduino IDE的圖形化編程替代品,后來才知道Arduino功能很強大,我去年10月份一直想找一款類似于Scratch 1.4下S4A的軟件,一直沒有找到,后來接觸到了ScratchPi(樹上科技),以及諾丁科技都在開發(fā)類似的產品,直到前陣子我才意識到,原來mblock支持刷入固件實時交互,***舞臺上的角色可以實時說出傳感器的讀數.
Arduino模式
這種模式跟傳統(tǒng)的Arduino IDE的使用方法類似,不過使用Scratch圖形化編程方式編程.
L293D電機驅動板
介紹
擴展開發(fā)
通過閱讀擴展開發(fā)指導,我照葫蘆畫瓢做出了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是不斷執(zhí)行的代碼
我覺得Arduino離線模式的代碼擴展比較容易,就是通過這個json串來定義生成的c代碼的對應關系,或者定義生成c代碼的規(guī)則,比較容易;但是同時如果你規(guī)則定義的不夠合理,那么你的程序也就存在很大的問題
存在問題
雖然這個擴展能夠驅動電機,但是當我需要同時讓多個電機轉動的時候就無能為力了.
然而我需要控制兩個電機的時候就存在問題:
可以看到當我們拖入兩個控制電機的代碼塊的時候,
#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(){
}
依次執(zhí)行代碼
如何依次讓電機轉動,寫驅動看似容易,但是實際上很容易犯錯誤.
改進
理論上,c能夠控制的,通過擴展的方式mblock也可以,但是要注意擴展的書寫方式,不然人容易出錯.
而且Scratch模式下的擴展開發(fā)則更為復雜,因為涉及到固件的通訊協(xié)議.
繼續(xù)完善.