20135223/20135234/20135229小組——亞博 Arduino智能小車實踐報告


 

實驗名稱:Arduino智能小車組裝和綜合測試

實驗小組成員:20135223何偉欽 20135234馬啟揚 20135229呂松鴻

實驗日期:2015.10.27—2015.11.3

實驗時長:24h-48h

 

一.實驗前的學習准備

第一步:將光盤資料全部復制到您的電腦保存好(此步驟有利於各類驅動文件的安裝和軟件的運行)。

第二步:新手操作學習板之前一定要先認真看光盤的《2、開發環境》,其中包括驅動和開發軟件的安裝。

第三步:認真按照視頻教程連接小車底板和接線,裝好驅動程序和各類隨機必備的軟件。

第四步:正式進入學習狀態(按照視頻教程一步步深入實驗操作和自行開發工程,最重要的還是看《4、視頻教程》里的視頻教程,包含Arduino套件視頻和Arduino小車視頻兩個部分。

二 .程序安裝准備

(1)安裝了Arduino板載USB轉

(2)在電腦中找到相應的端口

    注:本機端口號為COM3

(3)安裝Arduino開發軟件arduino-1.0.5-windows

(4)打開后顯示界面,熟悉Arduino開發軟件的基本使用

Arduino開發軟件一些重要的快捷鍵:

Ctrl+N  新建

Ctrl+S  存儲

Ctrl+C  剪切

Ctrl+O  打開

 (5)清查元件清單

(六)了解重要的元件內部示意圖和原理(詳細看光碟指導材料)

 

三、小車硬件安裝

 1、智能小車底盤安裝之電機固定

注意:電機在安裝時注意兩個螺絲先不能擰的太緊,以免第二顆放不進去,等螺絲螺母都放好后擰緊,

以免小車在行走時晃動,電機電源根據卡扣方向插緊即可

 2、智能小車底盤安裝之電池盒固定

注意:電池盒在固定時,一定要使用平口螺絲,防止電池放不進去,插頭根據卡扣方向插緊即可

3.上電測試和電池使用說明

注意:電池在使用時防止過度放電,一定要在過度放電前給電池充電。注意保護電池,根據說明使用,

        在沒有給小車安裝開關以前,燒錄程序時應斷開vcc接口,防止小車亂跑損壞小車。

4、智能小車底盤安裝之萬向輪與拓展面包板固定

注意:先安裝面包版底座選擇最短的銅柱,兩塊面包版的凸起都朝向外側,凹側對着凸起的螺絲,

         看准之后貼下,只有一次機會,所以得相當小心,安萬向輪時注意線路,將線路走好,

       不能影響萬向輪的正常轉動。擰螺絲時注意另一側芯片。

5.開發板與小車底板的固定

注意:開發板的固定選擇中號銅柱,按地板的提示方向安裝,注意正反面,在開發板面上上螺絲時只需安裝三枚,

        以為其中一枚的位置很特殊安裝不當,很容易損壞開發板,最后將剩下三枚螺絲擰緊。

6.舵機雲台的安裝

注意:舵機在安裝時小螺絲一定要擰到底部,調節位置,因為舵機是180度旋轉,最好能將左右兩邊分配90度,

以便后續實驗操作,前面的插口安裝超聲波探測,后面的四個后依次安裝到vcc gnd p2.7 以及開發板,

舵機的電源線十分長要在銅柱上旋轉之后安裝,以免影響轉動和美觀,但也不可在銅柱上旋轉過多。

7.液晶屏的安裝和紅外探頭的安裝

注意:液晶屏分為八線安裝與四線安裝,本次實驗我們選擇四線安裝,分別用到3.4.5.6.7.12.13這七個接口,

在安裝紅外線時要講紅外線程序包放入開發軟件中,將紅外接收口放到面包版上,一端接a4,另外兩端接vcc gnd ,

特別注意要將接收口放到顯眼的位置,方便接收信號。

8、最終形成的小車模型(以智能小車前進實驗組為例)

注意:導線連接一定要細心細致,每一個測試實驗所連接的導線位置都不一樣

四、 軟件編程與小車調試

(一)BST-V51智能小車調試

 1、黑白線識別模塊調試

 

(1)由W3(W4)電位器,L2(L3)信號指示燈左光電傳感器組成。

 

L2(L3)信號燈沒有接接收到紅外信號時會不亮(輸出高電平1),

 

當接到到紅外反饋信號后,指示燈亮起(輸出低電平0)。

 

(2)紅外光線有一個反射特性。但對於不同的物體反射特性是不一樣的,

 

特別是對白色反光的物體,紅外光線的反射量將會多一點。而對黑色

 

不反光的物體,紅外反射量將會大量的減少。那么我們就可利用這個

 

特性來完成黑與白的判斷。

 

(3)W3左光電信號強度調節----順時針調節電位器是增加檢測距離,反時

 

針調節電位器時減少檢測距離。

 

(4)W4右光電信號強度調節----順時針調節電位器是增加檢測距離,反時

 

針調節電位器時減少檢測距離(同W3 一樣)。

 

注意事項

①調試時不要對着強光,建議在室內調試,環境光線對檢

 

測距離有比較大的影響,這是紅外線本身原因,同板子功能無關)。

 

②黑白線合理參數調試---調節電位器W3,在反饋距離與小車車輪底部

 

一個平面上,操作員注意要認真,細致調動W3電位器,切忌着急。

③注意可調電阻調試不能用力過度,否則損壞W3\W4可調電阻

 

提示說明:

①有可能會出現黑線傳感器感應不到黑線的情況,是因為黑線傳感器的靈敏度

 

調得太高了,應該調低,靈敏度這樣才能檢測到黑線。因為靈敏度太高黑色反射的紅外光都

 

能被傳感器識別,導致檢測失敗應該把黑線傳感器上的可調電阻參考上面調節說明調試

2、避障模塊調試

(1)由W1(W2)電位器,L4(L5)信號指示燈左(右)光電傳感器組成。

(2)當L4信號燈沒有接收到紅外信號時不亮(輸出高電平1),當接到紅

外反饋信號后,指示燈亮起(輸出低電平0)。

(3)W1左光電信號強度調節----順時針調節電位器是增加檢測距離,

針調節電位器時減少檢測距離。

(4)W2右光電信號強度調節----順時針調節電位器是增加檢測距離,反時

針調節電位器時減少檢測距離(同W1一樣)。

注意事項:調試時不要對着強光,建議在室內調試,環境光線對檢

測距離有比較大的影響,這是紅外線本身原因,同板子功能無關)。

3、電機模塊調試

測試條件,把EN1/EN2接到5V 正電源上。

IN1接到VCC(正5V 電源)(右電機反轉信號線,高電平有效)

IN2接到VCC(正5V 電源)(右電機正轉信號線,高電平有效)

EN1接到VCC(正5V 電源)(電機使能信號,高電平有效)

EN2接到VCC(正5V 電源)(電機使能信號,高電平有效)

IN3接到VCC(正5V 電源)(左電機正轉信號線,高電平有效)

IN4接到VCC(正5V 電源)(左電機反轉信號線,高電平有效)

說明電機正反轉時只能接一個信號,比始IN1 IN2 只能接一個,

不能同時接兩個。電機轉動時要先接入EN1/EN2 使能信號。

(二)小車測試要領:

【1】先把14500鋰電池放到充電器上充電,此時充電器的指示燈為紅燈,一直充到指示燈

為黃燈(綠燈)表示充滿電了。充電時必須有人值守,避免發生意外。電池出廠時是充好的,

裝入充電器可能是黃色的,正常的。

【2】裝上電池,將低盤供電開關“按下”,此時為電池供電。

(注意:此時小車一般情況下不會按直線走,我們出貨時設置左右電機的PWM參數是一致的,

但是不會直線行駛,為什么呢?電機制造上有阻尼誤差,導致轉速不一致,我們在課程中會叫

大家通過調節PWM占空比來調節兩個電機的速度,使得電機盡可能轉速一致。)

(可能會遇到的問題:建議看我們的智能小車視頻教程后再測試智能小車)

【3】測試完畢。 

注意:當小車沒用的時候要把開關關掉,這樣電池不會在放電。

最好的習慣:小車沒用的時候把電池取下來,電池要長期閑置的時候要充滿電。

小車累計走了10-20分鍾就要充電了。裝上電池盒會比較緊,需要充電時,請配合一字螺絲刀輕輕撬出電池。

(三)智能小車各個實驗測試

1.智能小車前進實驗(說明:因為沒有黑線,所以智能小車黑線循跡那兩個實驗沒有做)

(1).智能小車前進實驗代碼及其解釋

int Left_motor_back=8;     //左電機后退(IN1)

int Left_motor_go=9;     //左電機前進(IN2)

int Right_motor_go=10;    // 右電機前進(IN3)

int Right_motor_back=11;    // 右電機后退(IN4)

void setup()

{

  //初始化電機驅動IO為輸出方式

  pinMode(Left_motor_go,OUTPUT); // PIN 8 (PWM)

  pinMode(Left_motor_back,OUTPUT); // PIN 9 (PWM)

  pinMode(Right_motor_go,OUTPUT);// PIN 10 (PWM)

  pinMode(Right_motor_back,OUTPUT);// PIN 11 (PWM)

}

void run(int time)     // 前進

{

  digitalWrite(Right_motor_go,HIGH);  // 右電機前進

  digitalWrite(Right_motor_back,LOW);    

  analogWrite(Right_motor_go,200);//PWM比例0~255調速,左右輪差異略增減

  analogWrite(Right_motor_back,0);

  digitalWrite(Left_motor_go,HIGH);  // 左電機前進

  digitalWrite(Left_motor_back,LOW);

  analogWrite(Left_motor_go,200);//PWM比例0~255調速,左右輪差異略增減

  analogWrite(Left_motor_back,0);

  delay(time * 100);   //執行時間,可以調整 

}

void loop()

{

  delay(500);

  run(10);    //前進

}

(2)組裝說明

給小車電機的接口分別接在8.9.10.11

(3)測試使用說明:

這里的時間指的是毫秒,所以要乘100   delay(time * 100);  

 高電平給電機通電前進,而且這里可以選擇轉速,調節速度,這里

 如果小車不能走直線可以將左輪或右輪的速度進行相應的調整。

(4)效果說明:

完成小車可以直線行走

2.智能小車前后左右綜合實驗

(1)實驗代碼及其解釋

void left(int time)         //左轉(左輪不動,右輪前進)

{

  digitalWrite(Right_motor_go,HIGH);   // 右電機前進

  digitalWrite(Right_motor_back,LOW);

  analogWrite(Right_motor_go,200);

  analogWrite(Right_motor_back,0);//PWM比例0~255調速

  digitalWrite(Left_motor_go,LOW);   //左輪不動

  digitalWrite(Left_motor_back,LOW);

  analogWrite(Left_motor_go,0);

  analogWrite(Left_motor_back,0);//PWM比例0~255調速

  delay(time * 100);  //執行時間,可以調整 

}

 

void spin_left(int time)         //左轉(左輪后退,右輪前進)

{

  digitalWrite(Right_motor_go,HIGH);   // 右電機前進

  digitalWrite(Right_motor_back,LOW);

  analogWrite(Right_motor_go,200);

  analogWrite(Right_motor_back,0);//PWM比例0~255調速

  digitalWrite(Left_motor_go,LOW);   //左輪后退

  digitalWrite(Left_motor_back,HIGH);

  analogWrite(Left_motor_go,0);

  analogWrite(Left_motor_back,200);//PWM比例0~255調速

  delay(time * 100);  //執行時間,可以調整 

}

 

void right(int time)        //右轉(右輪不動,左輪前進)

{

  digitalWrite(Right_motor_go,LOW);   //右電機不動

  digitalWrite(Right_motor_back,LOW);

  analogWrite(Right_motor_go,0);

  analogWrite(Right_motor_back,0);//PWM比例0~255調速

  digitalWrite(Left_motor_go,HIGH);//左電機前進

  digitalWrite(Left_motor_back,LOW);

  analogWrite(Left_motor_go,200);

  analogWrite(Left_motor_back,0);//PWM比例0~255調速

  delay(time * 100);  //執行時間,可以調整 

}

void spin_right(int time)        //右轉(右輪后退,左輪前進)

{

  digitalWrite(Right_motor_go,LOW);   //右電機后退

  digitalWrite(Right_motor_back,HIGH);

  analogWrite(Right_motor_go,0);

  analogWrite(Right_motor_back,200);//PWM比例0~255調速

  digitalWrite(Left_motor_go,HIGH);//左電機前進

  digitalWrite(Left_motor_back,LOW);

  analogWrite(Left_motor_go,200);

  analogWrite(Left_motor_back,0);//PWM比例0~255調速

  delay(time * 100);  //執行時間,可以調整 

}

void back(int time)          //后退

{

  digitalWrite(Right_motor_go,LOW);  //右輪后退

  digitalWrite(Right_motor_back,HIGH);

  analogWrite(Right_motor_go,0);

  analogWrite(Right_motor_back,150);//PWM比例0~255調速

  digitalWrite(Left_motor_go,LOW);  //左輪后退

  digitalWrite(Left_motor_back,HIGH);

  analogWrite(Left_motor_go,0);

  analogWrite(Left_motor_back,150);//PWM比例0~255調速

  delay(time * 100);     //執行時間,可以調整 

}

 (2)安裝測試使用說明及注意事項:

增加了向左轉和向右轉,向左轉主要是控制左輪不動,郵輪前進,而向右轉則是右輪不動左輪前進,

后退則是給兩個輪子后退高電平,注意不能同時給前進和后退高電平,這樣會燒壞電機,

同樣燒錄例程時要斷開vcc,以免小車亂跑影響實驗。

3.智能小車指定花式動作

(1)代碼及其解釋:

void spin_left(int time)         //左轉(左輪后退,右輪前進)

{

  digitalWrite(Right_motor_go,HIGH);   // 右電機前進

  digitalWrite(Right_motor_back,LOW);

  analogWrite(Right_motor_go,200);

  analogWrite(Right_motor_back,0);//PWM比例0~255調速

  digitalWrite(Left_motor_go,LOW);   //左輪后退

  digitalWrite(Left_motor_back,HIGH);

  analogWrite(Left_motor_go,0);

  analogWrite(Left_motor_back,200);//PWM比例0~255調速

  delay(time * 100);  //執行時間,可以調整 

}

void spin_right(int time)        //右轉(右輪后退,左輪前進)

{

  digitalWrite(Right_motor_go,LOW);   //右電機后退

  digitalWrite(Right_motor_back,HIGH);

  analogWrite(Right_motor_go,0);

  analogWrite(Right_motor_back,200);//PWM比例0~255調速

  digitalWrite(Left_motor_go,HIGH);//左電機前進

  digitalWrite(Left_motor_back,LOW);

  analogWrite(Left_motor_go,200);

  analogWrite(Left_motor_back,0);//PWM比例0~255調速

  delay(time * 100);  //執行時間,可以調整   

}

(2)基本說明

主要是加了一些花式玩法,比如原地左轉或原地右轉,再加上左轉右轉的一些組合,

完成了一套花式動作。切記燒錄例程時應斷開vcc。

4.智能小車按鍵啟動和蜂鳴器報警

主要是對小車進行蜂鳴器和啟動鍵的安裝

安裝開關是為了在燒錄過程中及時不斷開vcc,小車也不會亂跑,以后每次燒錄都不必斷開vcc。

int key=7;//定義按鍵 數字12 接口

int beep=12;//定義蜂鳴器 數字7 接口

void keysacn()

{

  int val;

  val=digitalRead(key);//讀取數字7 口電平值賦給val

  while(!digitalRead(key))//當按鍵沒被按下時,一直循環

  {

    val=digitalRead(key);//此句可省略,可讓循環跑空

  }

  while(digitalRead(key))//當按鍵被按下時

  {

    delay(10);   //延時10ms

    val=digitalRead(key);//讀取數字7 口電平值賦給val

    if(val==HIGH)  //第二次判斷按鍵是否被按下

    {

      digitalWrite(beep,HIGH);    //蜂鳴器響

      while(!digitalRead(key)) //判斷按鍵是否被松開

        digitalWrite(beep,LOW);      //蜂鳴器停止

    }

    else

      digitalWrite(beep,LOW);//蜂鳴器停止

  }

}

I/O 口的意思即為INPUT
接口和OUTPUT 接口,到目前為止我們設計的小燈實驗都還只是應用到Arduino
的I/O 口的輸出功能,這個實驗我們來嘗試一下使用Arduino的I/O 口的輸入功能即為讀取外接設備的輸出值,

我們用一個按鍵和一個LED 小燈完成一個輸入輸出結合使用的實驗,讓大家能簡單了解I/O 的作用。

按鍵開關大家都應該比較了解,屬於開關量(數字量)元件,按下時為閉合(導通)狀態。

我們分析電路可知當按鍵按下時,數字7 接口可讀出為高電平。這時我們使數字11 口輸出高電平可使小燈亮起,

程序中我們判斷數字7 口是否為低電平,要為低電平使數字11 口輸出也為低電平小燈不亮,原理同上。

要注意一點就是蜂鳴器有正負極之分,下面實物圖可看到蜂鳴器有正負標記。

5、智能小車黑線循跡實驗

利用小車下端兩個探頭對光的不同反應來確定小車行駛路線,主要是當探測到白時小車行駛電機轉動,

當左側壓到黑線及探測到黑時小車向左行駛,當右側探頭探測到黑時則向行駛,

只需在之前的程序上加一個判定的過程,十分簡單

const int SensorRight = 3;   //右循跡紅外傳感器(P3.2 OUT1)

const int SensorLeft = 4;       //左循跡紅外傳感器(P3.3 OUT2)

SR = digitalRead(SensorRight);//有信號表明在白色區域,車子底板上L3亮;沒信號表明壓在黑線上,車子底板上L3滅

  SL = digitalRead(SensorLeft);//有信號表明在白色區域,車子底板上L2亮;沒信號表明壓在黑線上,車子底板上L2滅

  if (SL == LOW&&SR==LOW)

    run();   //調用前進函數

  else if (SL == HIGH & SR == LOW)// 左循跡紅外傳感器,檢測到信號,車子向右偏離軌道,向左轉

    left();

  else if (SR == HIGH & SL == LOW) // 右循跡紅外傳感器,檢測到信號,車子向左偏離軌道,向右轉 

    right();

  else // 都是白色, 停止

  brake();

這里使用了與的語句,當左邊高電平右邊低電頻時想左,當左邊低電平右邊高電平時向右,若都是高電平則停車

這里的if else語句也滿足了小車在行駛時的各種情況

(6)智能小車紅外避障實驗(基礎避障)

與黑線實驗類似,只是將判定寫到了紅外探頭中,當紅外探頭探測到障礙時小車停止或者轉向或者跟隨障礙物行駛指向哪里走到哪里。

遇到障礙物后退

else // 都是有障礙物, 后退

      back(3);這里是與其他兩個程序不同的一點,遇到了障礙則后退

 

SR_2 = digitalRead(SensorRight_2);

    SL_2 = digitalRead(SensorLeft_2);

    if (SL_2 == HIGH&&SR_2==HIGH)

      run();   //調用前進函數

    else if (SL_2 == HIGH & SR_2 == LOW)// 右邊探測到有障礙物,有信號返回,向左轉

        left();

    else if (SR_2 == HIGH & SL_2 == LOW) //左邊探測到有障礙物,有信號返回,向右轉 

      right();

    else // 都是有障礙物, 后退

      back(3);

遇到障礙物跟隨

 

else if (SL_2 == HIGH & SR_2 == LOW)

 left();

這里與上一個程序不同,是跟隨障礙物

哪里有障礙物就向哪里走,這是與上一個程序不同的地方,

若前方沒有障礙物則停車

可以在這句話中體現

else // 沒有障礙物,停

brake();

 

SR_2 = digitalRead(SensorRight_2);

 

    SL_2 = digitalRead(SensorLeft_2);

    if (SL_2 == LOW&&SR_2==LOW)

      run();   //調用前進函數

   

 

    else if (SR_2 == HIGH & SL_2 == LOW) //左邊探測到有障礙物,有信號返回,向左轉 

      left();

    else // 沒有障礙物,停

brake();

遇到障礙物轉向

這里遇上兩個程序不同的是增加了一個自動尋路功能,遇到障礙物后可以自己調節方向

可以在下面這句話中體現else // 都是有障礙物, 后退

    {

      back(4.5);//后退

      spin_right(4.5);//有旋轉,調整方向

先停車,停車之后轉向,使得小車十分靈活,規避障礙物

 

SR_2 = digitalRead(SensorRight_2);

    SL_2 = digitalRead(SensorLeft_2);

    if (SL_2 == HIGH&&SR_2==HIGH)

      run();   //調用前進函數

    else if (SL_2 == HIGH & SR_2 == LOW)// 右邊探測到有障礙物,有信號返回,向左轉

        left();

    else if (SR_2 == HIGH & SL_2 == LOW) //左邊探測到有障礙物,有信號返回,向右轉 

      right();

    else // 都是有障礙物, 后退

    {

      back(4.5);//后退

      spin_right(4.5);//有旋轉,調整方向

7.智能小車超聲波測距實驗

給小車安裝液晶板與聲波探頭,對距離進行測量

這里程序中大家可以看到Fdistance= Fdistance/58;

這里選擇除以58后再輸出是因為為什么除以58等於厘米,  Y米=(X秒*344)/2,

X秒=( 2*Y米)/344 ==》X秒=0.0058*Y米 ==》厘米=微秒/58

 

void Distance_test()   // 量出前方距離

{

  digitalWrite(Trig, LOW);   // 給觸發腳低電平2μs

  delayMicroseconds(2);

  digitalWrite(Trig, HIGH);  // 給觸發腳高電平10μs,這里至少是10μs

  delayMicroseconds(10);

  digitalWrite(Trig, LOW);    // 持續給觸發腳低電

  float Fdistance = pulseIn(Echo, HIGH);  // 讀取高電平時間(單位:微秒)

  Fdistance= Fdistance/58;       //為什么除以58等於厘米,  Y米=(X秒*344)/2

  // X秒=( 2*Y米)/344 ==》X秒=0.0058*Y米 ==》厘米=微秒/58

  Serial.print("Distance:");      //輸出距離(單位:厘米)

  Serial.println(Fdistance);         //顯示距離

  Distance = Fdistance;

 9.智能小車超聲波避障實驗(無舵機)

這里只是比之前多了一個轉向遇到障礙物可以轉向躲避,並測出距離

這時的小車已經十分的靈活,可以根據距離選擇行駛的模式

可以在下面這句話體現

 while(Distance < 60)//再次判斷是否有障礙物,若有則轉動方向后,繼續判斷

      {

        right(1);//右轉

        brake(1);//停車

        Distance_test();//測量前方距離

        Distance_display();//液晶屏顯示距離

      }

遇到障礙物先停車后向右轉

Distance_test();//測量前方距離

    Distance_display();//液晶屏顯示距離

    if(Distance < 60)//數值為碰到障礙物的距離,可以按實際情況設置

      while(Distance < 60)//再次判斷是否有障礙物,若有則轉動方向后,繼續判斷

      {

        right(1);//右轉

        brake(1);//停車

        Distance_test();//測量前方距離

        Distance_display();//液晶屏顯示距離

      }

    else

      run();//無障礙物,直行

10.智能小車超聲波避障實驗(有舵機)

舵機是一種位置伺服的驅動器,主要是由外殼、電路板、無核心馬達、齒輪與位置檢測器所構成。

其工作原理是由接收機或者單片機發出信號給舵機,其內部有一個基准電路,產生周期為20ms,

寬度為1.5ms 的基准信號,將獲得的直流偏置電壓與電位器的電壓比較,獲得電壓差輸出。

經由電路板上的IC 判斷轉動方向,再驅動無核心馬達開始轉動,透過減速齒輪將動力傳至擺臂,

同時由位置檢測器送回信號,判斷是否已經到達定位。適用於那些需要角度不斷變化並可以保持的控制系統。

當電機轉速一定時,通過級聯減速齒輪帶動電位器旋轉,使得電壓差為0,電機停止轉動。

一般舵機旋轉的角度范圍是0 度到180 度。

舵機有很多規格,但所有的舵機都有外接三根線,分別用棕、紅、橙三種顏色進行區分,

由於舵機品牌不同,顏色也會有所差異,棕色為接地線,紅色為電源正極線,橙色為信號線。

舵機的轉動的角度是通過調節PWM(脈沖寬度調制)信號的占空比來實現的,標准PWM(脈沖寬度調制)

信號的周期固定為20ms(50Hz),理論上脈寬分布應在1ms到2ms 之間,但是,事實上脈寬可由0.5ms 到2.5ms 之間,

脈寬和舵機的轉角0°~180°相對應。有一點值得注意的地方,由於舵機牌子不同,對於同一信號,不同牌子的舵機旋轉的角度也會有所不同。

用Arduino 控制舵機的方法有兩種,一種是通過Arduino 的普通數字傳感器接口產生占空比不同的方波,

模擬產生PWM 信號進行舵機定位,第二種是直接利用Arduino 自帶的Servo 函數進行舵機的控制,這種控制方法的優點在於程序編寫,

缺點是只能控制2 路舵機,因為Arduino 自帶函數只能利用數字9、10 接口。Arduino 的驅動能力有限,所以當需要控制1 個以上的舵機時需要外接電源。 

在無舵機的試驗中往往遇到小車被卡住,那是因為聲波探頭探測范圍小而小車體積很大,

所以探測有盲區,加上一個舵機之后,小車行駛前會轉動舵機對左右兩邊的距離進行測量,

若左右兩邊都為安全距離,則小車直行,若左邊探測非安全距離而右側在安全距離,比對后轉向右側,

反之同理。這里還對舵機的轉速進行了定義,並且注意小車速度,防止損壞舵機,超聲波探頭以及液晶顯示屏。

while(1)

  {

    front_detection();//測量前方距離

    if(Front_Distance < 32)//當遇到障礙物時

    {

      back(2);//后退減速

      brake(2);//停下來做測距

      left_detection();//測量左邊距障礙物距離

      Distance_display(Left_Distance);//液晶屏顯示距離

      right_detection();//測量右邊距障礙物距離

      Distance_display(Right_Distance);//液晶屏顯示距離

      if((Left_Distance < 35 ) &&( Right_Distance < 35 ))//當左右兩側均有障礙物靠得比較近

        spin_left(0.7);//旋轉掉頭

      else if(Left_Distance > Right_Distance)//左邊比右邊空曠

      {     

        left(3);//左轉

        brake(1);//剎車,穩定方向

      }

      else//右邊比左邊空曠

      {

        right(3);//右轉

        brake(1);//剎車,穩定方向

      }

    }

    else

    {

      run(); //無障礙物,直行

11.智能小車紅外遙控實驗

紅外遙控器發出的信號是一連串的二進制脈沖碼。為了使其在無線傳輸過程中免受其他紅外信號的干擾,

通常都是先將其調制在特定的載波頻率上,然后再經紅外發射二極管發射出去,而紅外線接收裝置則要濾除其他雜波,

叧接收該特定頻率的信號並將其還原成二進制脈沖碼,也就是解調。

  內置接收管將紅外發射管發射出來的光信號轉換為微弱的電信號,

此信號經由IC內部放大器進行放大,然后通過自動增益控制、帶通濾波、解調變、

波形整形后還原為遙控器發射出的原始編碼,經由接收頭的信號輸出腳輸入到電器上的編碼識別電路。

要想對某一遙控器進行解碼必須要了解該遙控器的編碼方式。本產品使用的遙控器的碼方式為:NEC協議。下面就介紹一下NEC協議的特點:

(1)8位地址位,8位命令位

(2)為了可靠性地址位和命令位被傳輸兩次

(3)脈沖位置調制

(4)載波頻率38khz

(5)每一位的時間為1.125ms或2.25ms

VOUT接到模擬口,GND接到實驗板上的GND,VCC接到實驗板上的+5v。

將紅外接收頭按照上述方法接好,將VOUT接到數字11口引腳,將LED燈通過電阻接到數字引腳2,3,4,5,6,7。

unsigned long last = millis();/*應用millis函數可獲取機器運行的時間長度,單位ms。

系統最長的記錄時間為9小時22分,如果超出時間將從0開始。函數返回值為unsigned long型,無參數。

注意:

復制\2.例程代碼\例程19-紅外遙控里的庫文件夾IRremote到Arduino的安裝目錄

:Arduino\libraries目錄下,缺失庫文件可能編譯出錯。

給小車安裝紅外探頭,並給遙控器定義,即可完成控制過程

long run_car = 0x00FF18E7;//按鍵2

long back_car = 0x00FF4AB5;//按鍵8

long left_car = 0x00FF10EF;//按鍵4

long right_car = 0x00FF5AA5;//按鍵6

long stop_car = 0x00FF38C7;//按鍵5

long left_turn = 0x00ff30CF;//按鍵1

long right_turn = 0x00FF7A85;//按鍵3

if (millis() - last > 250) //確定接收到信號

    {

      on = !on;//標志位置反

      digitalWrite(13, on ? HIGH : LOW);//板子上接收到信號閃爍一下led

      dump(&results);//解碼紅外信號

    }

    if (results.value == run_car )//按鍵2

      run();//前進

    if (results.value == back_car )//按鍵8

      back();//后退

    if (results.value == left_car )//按鍵4

      left();//左轉

    if (results.value == right_car )//按鍵6

      right();//右轉

    if (results.value == stop_car )//按鍵5

      brake();//停車

    if (results.value == left_turn )//按鍵1

      spin_left();//左旋轉

    if (results.value == right_turn )//按鍵3

      spin_right();//右旋轉

    last = millis();     

    irrecv.resume(); // Receive the next value

五.實驗的過程說明和最終成果

(1)基本完成了小車測試的13個實驗,其中兩個黑線循導實驗因為缺乏實驗條件沒有完成;

(2)實驗組裝比較簡單,花費幾個小時時間觀看視頻,再花幾個小時時間進行組裝;

(3)導線的連接比較繁瑣,需要很細心,根據所給出的的代碼和指導視頻進行連接和小車測試;

(4)代碼花了很長時間去理解,並進行了小范圍的修改,再進行測試;

六、實現遇到的問題和不足

(1)雖然在代碼上花費了不少時間,但是還是很多地方不是很明白,只是大概理解,在細節上很多還是掌握的不太好。

(2)所做出來的小車成品雖然測試正常,但是效果和視頻中的小車成品還是有一定的差距。

(3)對於小車測試的原理也只是 一知半解,雖然光碟中的資料有一定的說明,也查了一下 網上的資料,但還是跟着視頻指導做,沒有深入弄透其具體原理。

七、實驗體會

         剛開始從老師那里接到這個項目時,第一感覺就是我們小組很難完成,也不知道從何下手。於是,為了更早地完成任務,我們小組決定盡早開始進行實驗,剛開始看學習視頻時,發現組裝那部分內容還是非常簡單的。然而,到了連接線路和代碼測試時卻遇到很多困難,但是經過我們小組成員的不懈努力和持之以恆的精神,最終我們所遇到的困難終於迎刃而解。對於這個小車測試,我們小組成員的興趣和熱情很高。在這個實驗中我們也意識到團隊合作的重要性,畢竟一個人的力量是有限的,遇到困難時大家可以討論和商量,這樣很多困難就很容易解決了。很多事情只要大家想去做 ,肯去做,花心思去做,事情並不是我們想象中的那么困難,只要我們敢於嘗試,敢於挑戰。

 

參考資料:配套兩張光碟中的教學視頻和文件指導

             

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM