免费色播,亚洲国产欧美国产第一区二区三区,毛片看,日本精品在线观看视频,国产成人精品一区二区免费视频,日本黄色免费网站,一级毛片免费

創(chuàng)意DIY:“小強一號”機器人的制作過程(附程序)

來源:網(wǎng)絡

點擊:1510

A+ A-

所屬頻道:新聞中心

關鍵詞: 機器人,智能化

      從對機器人感興趣開始,買了一堆書,也看了很多資料,決定先從最簡單的車輪機器人開始做。普通電腦雖然強大,但是不能直接采集外界環(huán)境的物理數(shù)據(jù),也不能直接控制電機。查找了下,雖然可以直接在電腦上接USB接口的數(shù)據(jù)采集器用于采集傳感器的數(shù)據(jù),也可以使用PCI的電機控制卡來驅動各種電機,不過成本有些高,暫時不考慮了。找了一圈,發(fā)現(xiàn)還是單片機方案廉價,順便可以學習下單片機控制和作一些電路實驗。于是最終決定實驗方案采用單片機來做了。

      零件

      下面是采購的零件:

      8位單片機Atmega168開發(fā)板。

      電路面包板和連線

      用于驅動車輪的兩個減速電機。沒有找到合適的齒輪,自己也沒有加工設備,圖簡單,所以直接用集成減速齒輪的電機代替了。

      距離傳感器,作為機器人的主要傳感器,用來探測障礙物的距離。使用的是常用的紅外距離傳感器作為機器人的眼睛。

      舵機,用來控制機器人“眼睛”的方向。

      一堆零件:

      下一步就可以驗證簡單的功能了

      實驗

      接下來先搞清楚怎么用單片機。

      Hello world

      先讓單片機跑起來再說。習慣了操作系統(tǒng)下編程,第一次用單片機還真有些不習慣,擔心遇到問題,不過比較順利。這個程序用來點亮單片機上的一個LED。

      代碼:

      intledPin=13;//LEDconnectedtodigitalpin13voidsetup(){pinMode(ledPin,OUTPUT);//setsthedigitalpinasoutput}

      voidloop()

      {digitalWrite(ledPin,HIGH);//setstheLEDondelay(1000);//waitsforaseconddigitalWrite(ledPin,LOW);//setstheLEDoffdelay(1000);//waitsforasecond}

      以間隔1000ms的時間把單片機的第13個Pin腳循環(huán)輸出高低電平,從而達到點亮和熄滅LED功能。很簡單,就是驗證下單片機是否可用。

      控制舵機

      舵機就是遙控模型上用來控制的,其實就是一個帶閉環(huán)控制的電機,能轉動到指定的角度。

      工作原理是:控制信號由接收機的通道進入信號調制芯片,獲得直流偏置電壓。它內(nèi)部有一個基準電路,產(chǎn)生周期為20ms,寬度為1.5ms的基準信號,將獲得的直流偏置電壓與電位器的電壓比較,獲得電壓差輸出。

      最后,電壓差的正負輸出到電機驅動芯片決定電機的正反轉。當電機轉速一定時,通過級聯(lián)減速齒輪帶動電位器旋轉,使得電壓差為0,電機停止轉動。

      在程序中控制舵機的轉動角度,就是生成不同脈寬的PWM就行了。

      上面的代碼簡單的生成一個PWM驅動舵機旋轉,比較簡單。代碼中用delay來實現(xiàn)延時,如果是同時控制多個舵機,用這樣的代碼是不行的,需要自己計算時間。因為用delay整個單片機都“休息”了,無法執(zhí)行任何代碼。在實際實現(xiàn)中,還需要不斷的讀取傳感器輸入和進行其他處理。

      紅外距離傳感器

      傳感器介紹:

      SHARP紅外距離傳感器,用于模型或機器人制作,可以用來測量距離。每個模塊贈送一根15cm長PH2.0的單頭排線.

      技術規(guī)格:

      探測距離:10-80cm

      工作電壓:4-5.5V

      標準電流消耗:33-50mA

      輸出量:模擬量輸出,輸出電壓和探測距離成比例

      接好電源,把模擬信號輸出端接在單片機的模擬輸入Pin就行了。

      測試代碼:

      intpotPin=2;

      intledPin=13;

      intval=0;

      voidsetup(){

      pinMode(ledPin,OUTPUT);

      }

      voidloop(){

      val=analogRead(potPin);

      digitalWrite(ledPin,HIGH);

      delay(val);

      digitalWrite(ledPin,LOW);

      delay(val);

      }

      運行結果,led隨著傳感器距離的變化閃爍間隔也隨著變化。

      控制電機

      常用的直流電機使用L293D來控制,使用H293的電路如下:

      不過在驗證是發(fā)現(xiàn),對于小電機,直接用單片機的PWM端子來輸出不同電壓的來控制速度也是可行的,雖然不太精確,但是對于實現(xiàn)運動特征是足夠了。單片機無法輸出真正的線性模擬電壓,PWM是通過調整空占比間隔來模擬不同電壓值的。

     

      測量了電機在空載和負載情況下電流都只有幾十毫安,所以先采取這種簡單的辦法驗證。

      直接把電機接到單片機的Gnd和PWMPin9接口,然后在程序中直接向Pin9輸出就可以讓電機運轉了。

      intvalue=0;intledpin=9;voidsetup(){//nothingforsetup}voidloop(){for(value=0;value<=255;value+=5){analogWrite(ledpin,value);delay(30);}for(value=255;value>=0;value-=5){analogWrite(ledpin,value);delay(30);}}

      上面的程序用不同的輸出值驅動電機,可以看到電機的旋轉效果。

      單片機和主要部件的驗證基本就完成了,下一步要開始程序設計了。

      軟件設計思路在進行代碼編寫之前,想找到一種簡介的實現(xiàn)低級智能機器人的方式。目前的工業(yè)機器人采用的是精確控制的方法,在程序中固化每種處理邏輯。用程序員的思維來完成對機器人的操作。

      對于程序員來說,機器人無非就是外接了物理傳感輸入和運動控制輸出的一臺電腦,不管是64位多核CPU或者8位單片機,只是性能的不同而已。理論上,都能通過程序設計來達到預定的目標。如果按照計算機上的普通程序來設計,那么大量的功能代碼會相互耦合,每次為了增加一個新的運動功能或者任務,都需要編制新的代碼,而新的代碼給原來的環(huán)路反饋系統(tǒng)帶來新的邏輯分支,所有的步驟都得經(jīng)過程序員的驗證和設計。這樣的設計對于精確計算的PC程序或者擅長固定場景精確動作的工業(yè)機器人來說,都沒有問題。但是對于這里要實現(xiàn)的&ldquo;小強一號&rdquo;機器人,是處在一個動態(tài)的變化環(huán)境當中,如果按照傳統(tǒng)的軟件設計邏輯,會存在大量耦合的邏輯分支,導致程序擴展性很差。舉例來說,為了完成一個沿墻壁行走的功能,必須對各種傳感器輸入情況進行判斷,然后做出預置的動作序列。

      如果要執(zhí)行的動作和需要判斷的情況很多,那么程序邏輯分支就比較復雜,擴展性也比較差,有沒有更好的適合機器人軟件設計的方法呢?

      換一種思維來思考的話,我們要做的不是電腦程序,只是一個實驗機器人。這個實驗機器人能做到自然界昆蟲級的&ldquo;智能&rdquo;就很不錯了。試想,一只螞蟻,一只蟑螂會去思考這么復雜的邏輯分支嗎?去考慮各種情況下應該采取的動作?不太可能。我們用了復雜的想法去解決簡單的事情。

      機器人和計算機的主要區(qū)別在于,計算機是按照預先規(guī)劃的指令運行,而機器人需要根據(jù)變化的環(huán)境選擇合適動作。我們首先可以簡化動作模型,我把機器人的執(zhí)行任務分成3個層次:任務-》行為-》動作

      任務&mdash;&mdash;機器人完成的一個期望目標,比如&ldquo;在一個范圍內(nèi)收集地面上的垃圾&rdquo;可以界定為一個機器人的任務。

      行為&mdash;&mdash;行為是對任務的分解,行為是機器人根據(jù)環(huán)境變化選擇要做什么。比如碰到墻壁需要進行躲避。電源不足需要充電,就可以劃分為一個行為。

      動作&mdash;&mdash;機器人最終控制電機等輸出設備做出的動作,比如前進,后退,轉彎。轉動攝像頭都可以劃分成一個動作單元。

      說明:任務由一系列的行為構成;行為有一個或者多個動作組成,動作是立即執(zhí)行的最小單元。在任意一個時刻,只有一個動作可以得到執(zhí)行。

      軟件實現(xiàn)的對象就是分解出簡單的行為,針對每個行為單獨實現(xiàn),互相之間無干涉、無耦合。當多個行為要輸出互相矛盾的動作時,通過一個行為優(yōu)先級表來決定優(yōu)先級高的行為來做出動作。在這個思路中,參考了基于行為編程的理論,關于詳細的基于行為編程的描述,可以在網(wǎng)上搜索&ldquo;Behavior-basedrobotics&rdquo;。

      通過這種設計思路,可以實現(xiàn)對動物反射特性的模擬,不需要把精力放在復雜的邏輯處理上,只需要根據(jù)分解出的基本行為實現(xiàn)一個一個小的行為單元。每個行為單元只關心自己的傳感輸入和需要輸出的控制動作就行了。確定了設計思路,下一部分開始針對小強一號來設計軟件了。

      參考資料,有興趣的可以閱讀:

      如果需要增加其他更加復雜的智能,那么只需要增加對應的行為單元就行了,不用修改已有的邏輯結構。每個行為單元只需要處理自己關心的傳感器和需要控制的動作執(zhí)行部分。這種方式的好處就是程序邏輯變得非常簡單,功能單元之間不會存在互相影響的弊端。

      下面的代碼是&ldquo;巡航&rdquo;行為:

      classBhCruis:publicBehavior

      {

      public:

      public:

      BhCruis(constchar*name):Behavior(name){

      };

      BhCruis();

      voidRun();

      voidSetup();

      };

      voidBhCruis::Setup(){

      }

      voidBhCruis::Run(){

      intbid=GetId();

      GO_speed_left[bid]=255;

      GO_speed_right[bid]=255;

      GT_beh_action[ACTION_TYPE_MOTOR][bid]=true;

      }

      上面的代碼很簡單,就是讓兩個電機以同樣的速度暈裝,其他都不用考慮。對于某些行為,需要引入稍微復雜一些的處理,比如發(fā)現(xiàn)障礙物,首先要停下來,然后判斷是應該往左還是往右,做出決定之后,再進行具體的動作。針對這種不能在一個時刻完成,要經(jīng)過幾個不同的狀態(tài)才能處理完成的行為,可以用狀態(tài)機來解決。下圖是&ldquo;逃離&rdquo;行為的狀態(tài)機:

      對于行為實現(xiàn)自己的狀態(tài)機,在行為實現(xiàn)的代碼內(nèi)部實現(xiàn),而不影響其他行為。這種結構可以讓每個行為子關心自己的實現(xiàn)方式,從而最大的降低軟件復雜度,方便功能添加和修改。逃離行為狀態(tài)機實現(xiàn)原型代碼:

      voidBhEscape::Run(){

      intbid=GetId();

      //狀態(tài)機實現(xiàn)

      switch(state){

      case0://前方距離過小

      if(GI_distance[DISTANCE_FORWORD]<30){

      GO_speed_left[bid]=0;

      GO_speed_right[bid]=0;

      GT_beh_action[ACTION_TYPE_MOTOR][bid]=true;

      timestart=millis();

      state++;//狀態(tài)變化

      }else{

      GT_beh_action[ACTION_TYPE_MOTOR][bid]=false;

      }

      break;

      case1://觀察左右距離

      if(millis()-timestart>1000){

      GO_eyeAngle[bid]=0;

      GT_beh_action[ACTION_TYPE_HEAD][bid]=true;

      timestart=millis();

      state++;

      }

      case2://觀察左右距離

      if(millis()-timestart>1000){

      GO_eyeAngle[bid]=180;

      GT_beh_action[ACTION_TYPE_HEAD][bid]=true;

      timestart=millis();

      state++;

      }

      case3://決定往哪邊轉彎

      if(millis()-timestart>1000){

      GO_eyeAngle[bid]=Angle_Center_90;

      GT_beh_action[ACTION_TYPE_HEAD][bid]=true;

      if(GI_distance[DISTANCE_LEFT_1]>GI_distance[DISTANCE_RIGHT_1]){

      //左轉

      GO_speed_left[bid]=0;

      GO_speed_right[bid]=255;

      }else{

      //右轉

      GO_speed_left[bid]=255;

      GO_speed_right[bid]=0;

      }

      GT_beh_action[ACTION_TYPE_MOTOR][bid]=true;

      state=0;

      Delay(2000);

      }

      default:

      break;

      }

      }

      這種基于行為單元的實現(xiàn)方法比較類似生物的反射行為,完整的代碼在下載專區(qū)進行下載。完成了基本的代碼,下一部分需要構建機器人的機構和測試了。

      結構和測試實驗機器人的結構就地取材,用了一個拼裝玩具小車的零件,如下圖:

      為了安裝電機和傳感器,重新拼裝了下,變成這個樣子:

      有了基本的結構,可以測試功能了,驗證功能是否正常。

      功能測試完成,放到地上實際跑一下:

      有點好玩,基本達到可以巡航和壁障的功能,不過功能太過于簡單,只能相當于一個玩具。

    (審核編輯: 小王子)

    聲明:除特別說明之外,新聞內(nèi)容及圖片均來自網(wǎng)絡及各大主流媒體。版權歸原作者所有。如認為內(nèi)容侵權,請聯(lián)系我們刪除。