創客對於成年人來說,多半是科技娛樂,或者是一種是一種向往科技的人生態度,總是希望自己不僅可以看到或者聽到科技的資訊,還希望能夠親身制作科技玩意,從而更好地體驗科技。

    說到科技娛樂,也就是做東西,不需要什么指標,高興即可,所以做些容易的,也是OK的。這次帶來的作品又是Arduino與樂高結合的小車,小車具有簡單的避障和尋線功能。

    避障傳感器是夏普GP2Y0A21紅外測距傳感器,它是模擬量傳感器,該傳感器測距范圍為10cm~80cm。Arduino模擬量信號的數據范圍是0~1023,要對這個數據做一個距離值轉換算法,才能得到小車與前方障礙物有多少cm。這個算法是“2547.8/((float)val*4*0.49-10.41)-0.42”,注意當障礙物在較遠處,得到的距離值會是“負值”,所以要在程序中,要把這些的負值讓它無效。

    尋線傳感器是DFRobot公司的飛思卡爾Mini光電傳感器,它可以幫助進行白線或者黑線的跟蹤,可以檢測白底中的黑線,也可以檢測黑底中的白線。Mini尋線傳感器紅外探頭輸出經過門電路整形,以保證提供穩定的TTL輸出信號,使尋線更准確更穩定。它的體積很小,可根據實際情況選擇數量使用,並可靈活布局在智能車底面的任意位置。這個作品,我用了兩個尋線傳感器,由於數量不夠,所以只能做簡單的尋線工作。

     小車由兩個型號為DF15SR的360度舵機驅動,舵機驅動的好處是它不需要專門的驅動板,直接連到DFrobot公司XBee傳感器擴展板的數字端口即可,方便省心。

    這個作品的電源有兩套,一套是5節充電電池組成,裝在樂高Technic套件的電池盒中,給舵機供電,另一套是7.4V 900mAH的鋰聚合物電池專門給Arduino邏輯部分供電,兩套電源可以保證Arduino程序不受舵機電流的影響。

     看一下小車的底面圖和細節圖。

 

    Arduino電控與LEGO積木的結合,關鍵是如何把Arduino可控電機安裝到樂高積木上?電機與樂高積木的配合有兩個方面的安裝工作,第一是電機輸出軸與樂高積木的結合,第二是電機機身與樂高積木的結合,而且把兩者上的樂高積木安裝好后,積木之間的孔距最好是在X和Y軸兩個方向上,都為樂高孔距的整數倍(樂高標准孔距為8mm),這樣才能順當地帶動樂高齒輪傳動鏈的運行。

    這個作品用的標准尺寸360度舵機是一種Arduino可控電機。舵機輸出軸與樂高積木的結合,我是用舵機自帶的圓盤連接器零件與樂高皮帶輪零件用自攻螺釘固定在一起,對於舵機機身與樂高積木的結合就要專門根據舵機機身尺寸和安裝孔位定制一個適配樂高積木的安裝板。

    我的這個小車模型中使用的連接板是從美國貨mindsensors公司網站通過Paypal支付,海淘回來的,這個標准舵機安裝板名為:Hitec Standard Servo Mounting kit for NXT ,網址:http://www.mindsensors.com/index.php?module=pagemaster&PAGE_user_op=view_page&PAGE_id=117&MMN_position=41:41。   

 

   現在淘寶上已經有這樣類似的安裝板,可以買到,大家不妨看看,

     http://item.taobao.com/item.htm?spm=a1z10.3.w17-588610910.11.1KxUMe&id=16193890181&

   對於Arduino可控的直流電機和步進電機有沒有辦法,不需自己加工,就可以通過雲工廠購買的現成零件實現Arduino與LEGO的結合,答案是有的。可以購買MakeBlock的金屬積木,因為MakeBlock套件里有常用規格的直流電機和步進電機,自然有安裝這些電機的連接板,而MakeBlock金屬積木又與樂高塑料積木是兼容,所以得到了MakeBlock的電機連接板就可以實現直流電機和步進電機與樂高積木的結合。只有解決了Arduino可控電機與樂高機械積木的結合,我們才能充分把樂高豐富的硬件資源和網絡資訊為Arduino所用。

 

    下面的內容談談Arduino小車的避障和尋線程序設計。

    Arduino避障程序任務:接受GP2Y0A21紅外測距傳感器的采集數據,並把此數據轉換為距離值。如果小車距離前方障礙物小於20cm,則機器人停止、后退、轉彎,再前進,直到它又遇到障礙物,再重復執行避障動作。 

#include <Servo.h> //申明舵機庫文件
float distance_float;//存儲由傳感器讀取值,通過算式處理后的浮點型距離值
int GP2D12 = 0;//把夏普GP2D12紅外測距傳感器連接在模擬量端口0
int val;   //存儲從GP2D12紅外測距傳感器讀到的采樣值
Servo myservo1; //定義左舵機對象
Servo myservo2; //定義右舵機對象 
int power1 =93;   //定義變量,用於存儲360度舵機功率值
int power2 =93; //360度舵機功率值范圍為0~180,零速功率值為93
int randNumber;  //定義隨機數變量
void setup() 
{ 
  myservo1.attach(7);  // 連接左舵機到Arduino數字端口7
  myservo2.attach(9); //連接右舵機到Arduino數字端口9
} 
void advance()//小車前進
{
    power1=180; 
    power2=0;
    myservo1.write(power1);             
    myservo2.write(power2);
}
void back()//小車后退
{
    power1=0;  
    power2=180;     
    myservo1.write(power1);            
    myservo2.write(power2); 
}
void left()//小車左轉
{
    power1=93;  
    power2=0;     
    myservo1.write(power1);            
    myservo2.write(power2); 
}
void right()//小車右轉
{
    power1=180;  
    power2=93;     
    myservo1.write(power1);            
    myservo2.write(power2); 
}
void Stop()//小車停止
{
    power1=93;  
    power2=93;     
    myservo1.write(power1);            
    myservo2.write(power2); 
}
void loop() {
  //GP2Y0A21紅外測距傳感器測距范圍為10cm~80cm
  //讀取GP2D12紅外測距傳感器模擬量數據
  val = analogRead(GP2D12); 
  //通過以下算式,把傳感器讀取值處理成浮點型距離值
   distance_float=2547.8/((float)val*0.49-10.41)-0.42;   
   //如果小車距離障礙物大於20cm,則小車前進,直到小於20cm
   //如果小車距離障礙物小於20cm,則小車后退,然后右轉或者左轉。
   //當小車距離障礙物大於80cm,或者更遠處,紅外傳感器會計算得到“負”值。
   if (distance_float<=20 && distance_float>0)
     {
       Stop();  //小車停止0.2s
       delay(200);
       back();  //小車后退0.8s
       delay(800);
       randNumber = random(10);
       //小車隨機向左或者向右轉動,2s
       if(randNumber<5)
       {
         right(); //向右轉動,2s
         delay(2000);
       }
       else
       {
         left(); //向左轉動,2s
         delay(2000);
       }       
     } 
    else //否則
       advance();//小車前進
 }

    Arduino尋線程序任務:小車的兩個驅動輪朝前,牛角萬向輪在后,兩個尋線傳感器位於驅動輪之前,它們用來判斷小車是否沿着黑線前行。尋線傳感器檢測到黑色輸出低電平,檢測到白色輸出高電平。左右尋線傳感器安裝間距小於黑線的寬度。如果右尋線傳感器脫離黑線,則小車左偏,以使右傳感器回歸黑線之間。如果左尋線傳感器脫離黑線,則小車右偏,以使左傳感器回歸黑線之間。 

#include <Servo.h> //申明舵機庫文件
int IR_left=2;//定義左側尋線傳感器,連接它到Arduino數字端口2
int IR_right=4;//定義右側尋線傳感器,連接它到Arduino數字端口4
int Left,Right;
Servo myservo1; //定義左舵機對象
Servo myservo2; //定義右舵機對象 
int power1 =93;   //定義變量,用於存儲360度舵機功率值
int power2 =93;  //360度舵機功率值范圍為0~180,零速功率值為93
//初始化
void setup() 
{ 
  myservo1.attach(7);  // 連接左舵機到Arduino數字端口7
  myservo2.attach(9); //連接右舵機到Arduino數字端口9
  pinMode(IR_right,INPUT);
  pinMode(IR_left, INPUT);   
} 
void advance()//小車前進
{
    power1=180;  
    power2=0;     
    myservo1.write(power1);            
    myservo2.write(power2); 
}

void left()//小車左偏
{
    power1=93;  
    power2=0;     
    myservo1.write(power1);            
    myservo2.write(power2); 
}
void right()//小車右偏
{
    power1=180;  
    power2=93;     
    myservo1.write(power1);            
    myservo2.write(power2); 
}
void Stop()//小車停止
{
    power1=93;  
    power2=93;     
    myservo1.write(power1);            
    myservo2.write(power2); 
}
void loop() {  
   //讀尋線傳感器的信號
    Right=digitalRead(IR_right);
    Left=digitalRead(IR_left);    
    //如果右、左兩個紅外為低電平
    //說明小車沒有偏離黑色跑道
    if(Right==LOW &&  Left==LOW)
    advance();//小車前進
    //如果右尋線為高電平,說明小車向右偏離跑道
    else if(Right==HIGH && Left==LOW )
    left();//小車左轉
    //如果左尋線為高電平,說明小車向左偏離跑道
    else if(Right==LOW && Left==HIGH)
    right();//小車右轉       
    else //如果左右尋線都偏離跑道,
    Stop();//小車停止
 }

      創客們在體驗科技,做一些智能車模型,但真正的科技一定是跑在最前面。現實的電動車將來一定大行其道,就像正在崛起的Tesla(特斯拉)電動車。

      特斯拉電動汽車受到了眾多明星大腕和投資者的追捧,而其生產商、被媒體稱做汽車業“蘋果”的特斯拉公司,帶着硅谷的基因,以入侵者的姿態顛覆了傳統汽車制造業,帶給人們全新的駕駛理念。大家看看視頻,了解正在發生的事,了解電動車,現代工廠以及工業機器人。

 

 視頻網址:http://v.youku.com/v_show/id_XNjUzNTEwMTIw.html