2010年6月14日 星期一

arduino

原著:http://bbs.cepark.com/viewthread.php?tid=5103&extra=&highlight=arduino%2B&page=2

    arduino是幾年前義大利搞起的一個開源avr系統,使用mega8或mega168等,做成系統板和擴展版,mpu先要注入啟動程式,以後就靠串口和pc通信載入和修改應用程式,使用它自己的一套類似c的語言可以自由下載,傳播,編程容易,對於搞硬體不熟練的人也能開發自己的程式。國外有很多愛好者討論這個東西。國內比較少人。見www.arduino.cc
好的,這個東西外面很紅,國內不熱,中文資料也少有個網站大家可以參考http://blog.arduino.cn

它現在有多個版本,現上一個使用232晶片的電路圖,其他東西陸續上。達到大家共用。



它使用232和pc通信,自己製作還可以簡化:沒有3.3V器件,上面那個穩壓器可以不要,其他要點:AVR要使用頻率高的例如MEGA8-20PU,用外部晶振16M.再就是具體佈置圖主要注意引出插針或插座排的距離(以便和擴展模組匹配)回頭會交待



可見和前面的基本相同。

對應的元件佈置為:

注意了,無論哪個版本元件佈置上特別注意mega8上方的排針或排座,左面是PORT B,右面PORT D,mega8下方的左邊:電源/接地引出,右邊PORT C,上方用於數位輸出輸入以及PWM等,下面用於AD變換,擴展版是疊加在系統板上最終構成積木式的應用系統。因此就比較機動靈活了。這也就是ARDUINO的一個特點吧。

現在由於很多新電腦取消了串口,有的只是usb,針對這種情況,比較新的系統板也使用了usb(實際是usb轉串口)作為和上位機的通信。下面就是電路:

除了增加usb介面晶片FT232RL和USB插座,取消了串口插座和232電路以外其他還是和原來一樣。這個型號他叫Diecimila,不知道什麼意思。

如果已經有了串口的系統板,是否扔掉換這種呢?我看不必,因為現在usb的發展已經促使人們開發出了各種轉換器,其中就有usb轉9針232串口的轉接線,市面上20多元就可以買到(上面的FT232RL晶片也要20多元),買回後電腦安裝隨帶的光碟驅動,就可以用了。這時電腦把它作為COM4,我經過實際試驗,證明完全可用。

上面列出的這些電路,如果自己製作,有條件當然做電路板,不過只有三極管232的是單面板,其他都是雙面板,自己做起來困難。好在這個東西看來比較自由,我就是用的萬用洞洞板做的,實際使用效果不錯。不過最好能買到預留232插座、電源插座的板子,免除了自己打孔的麻煩。電源方面板子上都安裝7805,那外面就配一個9V插頭電源即可,不建議從USB取電,因為自己製作的東西萬一疏忽燒掉電腦的USB口就慘了。

如果要製作上面這個DIECIMILA電路有一點要嚴重注意!就是圖中的R2可以不要,明明畫的電阻R3實際上應該用0.1的電容,否則不行!注意注意。另外FT232RL是貼片元件,直接在萬用板上裝有困難,最好通過轉接電路板安裝。

另外,所有電路都具有6線SPI下載介面,這個東西僅僅用來給空白mega8/168裝載啟動程式,以後除非啟動區破壞了要重裝,否則再也用不到,如果你有其他的avr mega8板可以下載程式,也就不一定要這個6線下載口了。

下面就是我自己做的一塊試驗板,這裏既用了232電平轉換晶片MAX232,又用了USB轉232晶片FT232RL,反正是試驗嗎,大不了不成功。實驗證明都可以用,當然,從MEGA8串入和串出,用跳線帽選擇,一次只能用1種。圖中注明了上排插座條和下排插座條之間的距離,經過反復分析原版圖片得知,是19倍萬能板孔距。因為這孔距為0.1英寸也就是100mil(1英寸等於1000密爾),以便和擴展板的插針排距離相容。否則就要另外引線了。
除了上述電路外,2009年的新電路又有些改進,主要是使用了低壓差穩壓電路代替能耗大的7805,同時也可以從usb取電,還有自動切換電路,只有在外部電源太低時才從usb取電,晶片上,可以用atmega328,進一步擴大了存儲容量,其他性能也和老的相容:14個IO,另外6個AD。電路如下:

其實大家製作時不用這麼複雜,用市場容易買到的低壓差穩壓電路1117-5即可,外部電源有7.5V足夠,發熱很低,不過是貼片元件。我就用的這個)

這個電路的古怪名字是Duemilanove,都不知道該怎麼讀。

另外還有小型化的,等等就不一一列舉了,在arduino的官方網站上都有。

現在,我們對這個ARDUINO的硬體已經有所瞭解,實際上它的官方,把這個系統板叫做I/O板,那麼以後大家還是叫他官名好了。說白了硬體上,這個ARDUINO的I/O板就是一塊具有RS232串口通信功能的AVR最小系統而已。其他特點:
1,所用的ATMEGA8,168,328,1008等MCU要使用16MHz晶體,
2,為了通過串口下載程式,MCU事先必須裝載啟動載入程式Bootloader。

那麼我們使用這個東西究竟有何助益?直接用AVR STUDIO編程不就得了?實際上這個東西最大的特點也就是在他的軟體方面。就我的粗淺理解,這是個面向物件的系統,他的物件不是MCU而是整個I/O板,於是在編程中我們不需要再考慮如何去設置I/O口,如何去給那一大堆特殊功能寄存器賦值,所有這些都被仔細地封裝了起來,因此編程的重點就是怎樣使用函數來達到I/O板的正確動作。但是,他使用的ARDUINO語言很像C,但又不是C,他的程式不叫Programm,而叫Sketch,查字典他就是草圖,草案,速寫。。。當年魯迅告訴文學青年,寧可將小說壓成sketch,也不要把sketch拉成小說,,,總之它是另搞一套。我們下次再說。

因此在編程(編sketch?)中,不再指定PORTD,PB3,PINC之類,而使用I/O般的引腳編號代之,他和MCU對應腳的關係再畫一遍如下圖:

arduino的硬體就簡介這麼多,下面接著說說怎樣使用這個硬體:

1,到arduino官方網站下載arduino套裝軟體,它包括了編程平臺,例子,bootloader。等等下載頁面:http://arduino.cc/en/Main/Software

最新版是最近推出的16版,也可以下栽較老的版本(Previous IDE Versions)當然選用windows的。這是綠色軟體,下栽後僅僅解壓即可。

2,把下栽的套裝軟體解壓到自己設定的檔夾。

3,以15版為例,此檔夾包括arduino-0015-windows\arduino-0015\等等如下圖:



其中,arduino.exe就是編程平臺執行檔,先記住,接著打開hardware\bootloaders\,下面有atmega和atmega8夾子,如果你使用的是mega8就打開aymega8,如果你地用的mega168等,就打開atmega,從裏面找到所需的bootloader文件:ATmegaBOOT.hex

4,把mcu例如Mega8插入I/O板。確認它是高頻型號的20PU,以及具有外部晶振16M。下面一項重要工作就是給mega8裝入bootloader。

這裏我要多囉嗦幾句:這個bootloader啟動加栽程式位於mega8的程式flash區的後部,不能和通常的程式那樣直接下栽到mega8中。必須要對熔絲先行設置。

5,設置mega8的熔絲:使用ponyprog2000這個少不得的工具,插好下載線,通電,運行ponyprog2000。讀出默認熔絲設置如圖:

現在需要修改:把CKOPT,BOOTSZ1,BOOTRST,SUT1各項打勾如下圖:



現在需要修改:把CKOPT,BOOTSZ1,BOOTRST,SUT1各項打勾如下圖:



點Write把攝製的熔絲寫入,就行了,

6,寫入bootloader:雖然arduino平臺也提供了下栽bootloader的功能,但是或許要用到昂貴的下載器MKII或許要重做並口下載線(和我們常用的帶244的下載線並口定義不同),因此我們還是用ponyprog2000進行bootloader的下載。這時因為事先已經改好了熔絲,所以他就會裝入flash的後部。下載方法,大家都知道,就不多說了,至此你的系統就準備開工啦!當然還得拔掉下載線,而且只要bootloader不損壞,就再也不用它了。

前面介紹了一大堆,那麼下面我們看看這個arduino是怎樣運行的,當然,現在已經有了I/O板,上面的MEGA8已經裝入了BOOTLOADER,把I/O般和電腦用串口電纜連起來(或者採用USB轉串口線也行,我現在就是這種狀態)插上I/O般的直流電源。

然後到安裝文件夾找到ARDUINO.EXE,運行它,編程平臺IDE就出來了,可見十分簡潔如下圖:



现在是空白的,我们还是使用现成的例子看看怎么搞:展开FILE下面的一系列菜单,最后找到Blink闪光程序,利用I/O板上引脚13连接的LED来运行它,如下:




点Blink,源代码就加入空白编辑区:



现在我们来考察一下这个arduino程序,或者就是他说的sketch:

为了清楚起见,我把代码复制到下面并加以势必要说明:

/*
* Blink
*
* The basic Arduino example. Turns on an LED on for one second,这个闪光例子是led亮1秒,灭1秒,之所以用13脚,因为在此
* then off for one second, and so on... We use pin 13 because, I/O板已经装有带限流电阻的LED
* depending on your Arduino board, it has either a built-in LED
* or a built-in resistor so that you need only an LED.
*
* http://www.arduino.cc/en/Tutorial/Blink
*/

int ledPin = 13; // LED connected to digital pin 13 :led连接到引脚13

void setup() // run once, when the sketch starts :程序启动后先运行此函数,内容应该自己编辑
{
pinMode(ledPin, OUTPUT); // sets the digital pin as output :这个函数指定引脚13为输出
}

void loop() // run over and over again :主循环部分,
{
digitalWrite(ledPin, HIGH); // sets the LED on :此函数让引脚13高:灯亮
delay(1000); // waits for a second :延时1000毫秒
digitalWrite(ledPin, LOW); // sets the LED off :灯灭
delay(1000); // waits for a second :延时1000毫秒
}
可以发现,这很像C,但又不是C,真是怪种,一般最前面是变量区,里面申明全局变量,然后他把C的main{}拆成了setup{}和loop{}两部分,另外C中的变量类型,运算符,条件判断,分支,循环,数学函数等等ARDUINO大都一样,所以会C,很快可以掌握这个东西。只是他还具有一些特色函数,举个例如map(val,x00,x01,y00,y01),就是把变量val的变化范围从x00最小到x01最大改变成y00最小到y01最大。好了程序有了,下面点File菜单下方的外园内三角按钮,来build可执行文件,此时按钮变黄,过几秒钟按钮恢复白色,下面的黑色信息窗里显示下图:



说明编辑成功,可以把它下载到I/O板上的mega8了。

为此打开tools菜单:



如果是串口选com1,usb选com3,点Tools下方的有右向箭头的方形按钮就开始下载了,等候一会i/o板上的串口灯交替闪动,过一会,下载完毕。按一下复位按钮,重新启动。你就发现启动后过一段时间,led闪光起来,程序成功了

还有一点要交待,就是必须选择I/O板的类型:打开Tools菜单项选择如下图:

现在用的mega8,就选这个。

另外菜单向下方的7个快捷按钮,2园5方,从左到右分别是:1,编译。2,停止编译。3。新建程序。4,打开已保存程序。5,程序存盘。6,下载可执行文件到I/O板。7,启用串口监视功能。

在写好了SKETCH以后,就要编译连接,生成可执行代码。在编译过程中如果有语法错误,他会自动停止,在下方信息创给出红字提示,那么就停止编译,修改好后再来。好后,在File菜单打开Save as另存为,保存到你所需的文件夹。其他就不多说,就最后一项说一下:在程序中可以设置通过串口上传数据,如果按下这个按钮,上传输局就会依次在下方的信息创显示出来,这个功能简直太方便了。可见ARDUINO的编程平台外表虽然简单,功能还是很有特色的。下面给出一个简单程序:用普通led测光并控制iI/O板上的13脚led:

//变量
int ledPin = 13; // LED ,13脚
int analogPin=0; //AD脚,0脚(AD端子)
int value=LOW; //val是让LED脚高或低,HIGH,LOW 是常量
int val=0; //这个是AD变换的初始值

long previousMillis = 0; //这两个用来计数延时,不用上例的延时函数方法
long interval = 1000;

void setup()
{
pinMode(ledPin, OUTPUT); // 输出I/O上的LED
Serial.begin(9600); //串口通信设置为9600速率
}

void loop()
{
if (millis() - previousMillis > interval) //判断当前时间和预设时间的差值毫秒,1000毫秒更新一次预设值
{ previousMillis = millis();
val=analogRead(analogvPin); //读出AD转换值
if(val<110) //下面是通过AD值控制13脚LED
value = HIGH;
else
{if (value == LOW)
value = HIGH;
else
value = LOW;
digitalWrite(ledPin, value); //控制LED
}
Serial.print("DETECT:"); //串口上传AD值
Serial.println(val);

}
}
这个实验用一个透明封装的高亮度LED作为测光元件,正极插在AD0引脚,光照下13脚LED闪光,遮住感光LED,13脚LED停止,运行如下图,:

点串口监视按钮后,AD数据在监视窗显示出来



下载 (55.3 KB)2009-7-11 07:07

总之,arduino能做的还真不少,特别是有些功能做起来很简单,例如1602液晶显示,通常avr编程时比较麻烦的,就是原样复制现成的程序也因为速度等原因不能保证完全成功,而这个arduino它的封装使得我们不必考虑细节以及初始化等等过程,而只要使用一个液晶显示函数便可,作为本贴结尾,最后给出一个我自己做的例子,sketch如下:

#include //需要包含文件
// LiquidCrystal display with: //下面是指定液晶的控制线和数据线在I/O板上的对应引脚
// rs on pin 12
// rw on pin 11
// enable on pin 10
// d4, d5, d6, d7 on pins 5, 4, 3, 2 //使用4线方式,实际连接时要按照这里指定的对应连接
LiquidCrystal lcd(12, 11, 10, 5, 4, 3, 2); //用这个定义一个液晶类型变量int ledPin = 13; // LED connected to digital pin 13
int recvPin=0; // 还是AD 0引脚输入
int wait=1000;
int val=0;
void setup()
{

pinMode(ledPin, OUTPUT); // LED引脚输出
Serial.begin(9600); //串口波特率
lcd.print(" Hello, World!"); //就这个在LCD上显示出来了
}

void loop()
{
digitalWrite(ledPin, HIGH); // LED 亮


delay(wait); // 延时1秒
digitalWrite(ledPin, LOW); // LED灭
delay(wait); // 延时1秒
val=analogRead(recvPin); //取AD值
Serial.print("DETECT:"); //在电脑显示AD值
Serial.println(val);

}
执行3个任务:
1,让一个LED每秒点灭;
2,用一个LED测光,并每秒把这个相关数值上传到电脑上显示
3,用1602显示“ Hallo, World!

实际如图:



好了,这次简介就到这里,希望对你有所启发!谢谢!

用 H-Bridge 來控制直流馬達
注意: 電路圖和PCB板子的差異 :
上圖中 CPU : atmega168 (16K flash)
XTAL : 20MHZ

Arduino NG Rev. C 電路圖
電路中 CPU : atmega8 (8K flash)

XTAL : 16MHZ


ATmega8 and ATmega168 的差異:
I have looked up both the datasheets of ATmega8 (not ATmega88) and ATmega168 and upon comparing the features listed in the first page of the datasheet and the pin out diagrams, I could see following differences:
(1) Amount of Flash memory (flash 大小不同)
(2) Interrupt and Wake-up on Pin Change (中斷和Wake-up 腳位交換)
The rest looks like pin to pin compatible. I am not sure how to compare 2 different micro controllers functionally without reading through 400 pages.

MEGA168 3.3V供電下 BOD設置 Vbod=2.7V
MEGA8 3.3V供電下 BOD設置 Vbod=2.6V
其它不同點請詳閱CPU datasheet

沒有留言:

張貼留言

注意:只有此網誌的成員可以留言。