Robofun 機器人論壇
標題:
實驗機器人.「小強一號」製作過程(1)
[打印本頁]
作者:
wehrhryh
時間:
2008-5-8 15:34
標題:
實驗機器人.「小強一號」製作過程(1)
實驗機器人「小強一號」製作過程(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 編輯
]
作者:
wehrhryh
時間:
2008-5-8 15:37
標題:
實驗機器人「小強一號」製作過程(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]-->
單片機和主要部件的驗證基本就完成了,下一步要開始程序設計了。
作者:
yyy
時間:
2008-5-8 17:09
對岸的大大您好喔
,好棒的作品喔,
對嗎!像這樣多多交流交流,共創機器人之光,真是愛死您了
。真棒的作品,期待更精彩的開發喔。
歡迎光臨 Robofun 機器人論壇 (https://robofun.net/forum/)
Powered by Discuz! X3.2