Robofun 機器人論壇

 找回密碼
 申請會員
搜索
熱搜: 活動 交友 discuz
查看: 5782|回復: 2
打印 上一主題 下一主題

實驗機器人.「小強一號」製作過程(1)

[複製鏈接]
跳轉到指定樓層
1#
發表於 2008-5-8 15:34:22 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
實驗機器人「小強一號」製作過程(1)http://www.mindroid.com/develop/2008-05-07/25.html
作者:Mindroid 發佈時間:2008-05-07 21:48:45 來源:Mindroid

小強一號製作過程



從對機器人感興趣開始,買了一堆書,也看了很多資料,決定先從最簡單的車輪機器人開始做。普通電腦雖然強大,但是不能直接採集外

界環境的物理數據,也不能直接控制電機。查找了下,雖然可以直接在電腦上接USB接口的數據採集器用於採集傳感器的數據,也可以使

用PCI的電機控制卡來驅動各種電機,不過成本有些高,暫時不考慮了。找了一圈,發現還是單片機方案廉價,順便可以學習下單片機控

制和作一些電路實驗。於是最終決定實驗方案採用單片機來做了。


零件

下面是採購的零件:


8位單片機Atmega168開發板。



電路麵包板和連線



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



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



舵機,用來控制機器人「眼睛」的方向。




一堆零件:



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

[ 本帖最後由 uucww 於 2008-5-8 15:39 編輯 ]
2#
 樓主| 發表於 2008-5-8 15:37:30 | 只看該作者

實驗機器人「小強一號」製作過程(2

實驗機器人「小強一號」製作過程(2)http://www.mindroid.com/develop/2008-05-08/26.html
作者:Mindroid 發佈時間:2008-05-08 00:54:11 來源:Mindroid

實驗

接下來先搞清楚怎麼用單片機。
Hello world
先讓單片機跑起來再說。習慣了操作系統下編程,第一次用單片機還真有些不習慣,擔心遇到問題,不過比較順利。這個程序用來點亮

單片機上的一個LED。



代碼:

int ledPin = 13; // LED connected to digital pin 13

<!--[if !supportEmptyParas]--> <!--[endif]-->

void setup()

{

pinMode(ledPin, OUTPUT); // sets the digital pin as output

}

<!--[if !supportEmptyParas]--> <!--[endif]-->

void loop()

{

digitalWrite(ledPin, HIGH); // sets the LED on

delay(1000); // waits for a second

digitalWrite(ledPin, LOW); // sets the LED off

delay(1000); // waits for a second

}

<!--[if !supportEmptyParas]--> <!--[endif]-->

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



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



工作原理是:控制信號由接收機的通道進入信號調製芯片,獲得直流偏置電壓。它內部有一個基準電路,產生週期為20ms,寬度為1.5ms

的基準信號,將獲 得的直流偏置電壓與電位器的電壓比較,獲得電壓差輸出。



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

電機停止轉動。
   

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




上面的代碼簡單的生成一個PWM 驅動舵機旋轉,比較簡單。 代碼中用delay來實現延時,如果是同時控制多個舵機,用這樣的代碼是不行

的,需要自己計算時間。因為用delay整個單片機都「休息」了,無法執行任何代碼。在實際實現中,還需要不斷的讀取傳感器輸入和進

行其他處理。

紅外距離傳感器

傳感器介紹:

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

<!--[if !supportEmptyParas]--> <!--[endif]-->

技術規格:

<!--[if !supportEmptyParas]--> <!--[endif]-->

探測距離:10-80cm

工作電壓:4-5.5V

標準電流消耗:33-50 mA

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



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

測試代碼:

int potPin = 2;

int ledPin = 13;

int val = 0;

<!--[if !supportEmptyParas]--> <!--[endif]-->

void setup() {

pinMode(ledPin, OUTPUT);

}

<!--[if !supportEmptyParas]--> <!--[endif]-->

void loop() {

val = analogRead(potPin);

digitalWrite(ledPin, HIGH);

delay(val);

digitalWrite(ledPin, LOW);

delay(val);

}

<!--[if !supportEmptyParas]--> <!--[endif]-->

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

控制電機

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



不過在驗證是發現,對於小電機,直接用單片機的PWM端子來輸出不同電壓的來控制速度也是可行的,雖然不太精確,但是對於實現運動

特徵是足夠了。單片機無法輸出真正的線性模擬電壓,PWM是通過調整空占比間隔來模擬不同電壓值的。



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



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

int value = 0;  

int ledpin = 9;

<!--[if !supportEmptyParas]--> <!--[endif]-->

void setup()

{

// nothing for setup

}

<!--[if !supportEmptyParas]--> <!--[endif]-->

void loop()

{

for(value = 0 ; value <= 255; value+=5)

{

analogWrite(ledpin, value);

delay(30);

}

for(value = 255; value >=0; value-=5)

{

analogWrite(ledpin, value);

delay(30);

}

}

<!--[if !supportEmptyParas]--> <!--[endif]-->

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

<!--[if !supportEmptyParas]--> <!--[endif]-->

單片機和主要部件的驗證基本就完成了,下一步要開始程序設計了。
3#
發表於 2008-5-8 17:09:27 | 只看該作者
對岸的大大您好喔 ,好棒的作品喔,

       對嗎!像這樣多多交流交流,共創機器人之光,真是愛死您了 。真棒的作品,期待更精彩的開發喔。
您需要登錄後才可以回帖 登錄 | 申請會員

本版積分規則

小黑屋|手機版|Archiver|機器人論壇 from 2005.07

GMT+8, 2024-11-24 02:14 , Processed in 0.195662 second(s), 7 queries , Apc On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回復 返回頂部 返回列表