什么是arduino?
Arduino,是一個開放源代碼的單芯片微控制器,它使用了Atmel AVR單片機,采用了開放源代碼的軟硬件平臺,建構于簡易輸出/輸入(simple I/O)界面板,并且具有使用類似Java、C語言的Processing/Wiring開發環境。
以上是維基百科的解釋,我覺得這個解釋雖然很到位,但不好,在于它忽略了解釋的對象,如果我是一個IT小白,那真不明白在說的什么。
那到底如何告訴別人什么是arduino?可以去看arduino中文論壇的初識arduino。我介紹不來,不多說了,這篇文章主要針對熟悉電子電路的IT從業者以及工作交差。
很多電子從業者的朋友或許會鄙視arduino,不就是一塊低性能的AVR單片機開發板嗎?搭積木一樣的傻瓜式編程的東西,給外行人玩的東西,有什么了不起。誠然,arduino表現出來的是一塊單片機開發板,但仔細摸索你會發現,在GitHub里面有Arduino for STM32的源碼,各類的IOT芯片也支持arduino,如wifi soc ESP8266等,各類芯片都把自己開發封裝成arduino,你還覺得他是只是一塊逼格比較高的AVR得開發板嗎?所以說按我的理解,arduino是一個準標準的軟硬件開發平臺,類似VC開發Windows軟件一樣的平臺,集成各類庫文件,可以這樣類比,電腦硬件對于arduino的硬件板,它的IDE類似VC,它集成各類嵌入式軟件開發的庫文件,比如delay(),Serial.read()等單片機開發常用函數,以及一些像I2C、SPI接口庫或者傳感器庫,與單片機開發不同之處在于不需要對寄存器進行操作,直接調用函數,簡單快捷。有人又說了,STM32、PIC、芯唐什么的單片機也有庫函數,也可不直接操作寄存器。可是那些庫函數只是簡化寫寄存器的方式,要使用對應的功能,還是要熟悉對應的寄存器操作,arduino的庫函數是完全不用知道那些底層的寄存器的,不同的arduino板直接可以使用相同的函數,像不同單片機跑UCOS一樣,移植后開發都一樣。所以別說arduino是淘汰AVR的破板了,也別亂鄙視,電腦雖然強大,但8位單片機的出貨量是電腦的幾何倍,每個東西都有存在的空間,不是越強大越好,只有哪個場所合適用哪個的問題,況且讓編程越來越簡單是大勢所趨,重復造輪子的事很沒必要,arduino雖然不算完美方案,但是個指明出路的地方,Windows跟Ubuntu對比起來也丑,但第一系統是Windows,除了它出的早外,有個很大的原因就是基于VC的開發平臺真是誰用誰知道,微軟量身定做一大堆標準庫,簡簡單單就上手的IDE平臺,讓多少程序員投入Windows懷抱,才有了現在Windows的生態。所以也很希望在嵌入式開發領域也有個類似的平臺,可能arduino不是最終出路,但一定是那個出路的一個臺階。
arduino的優點
? 跨平臺
Arduino IDE可以在Windows、Macintosh OSX、Linux三大主流操作系統上運行,而其他的大多數控制器只能在Windows上開發。
? 簡單清晰的開發
Arduino IDE基于processing IDE開發。對于初學者來說,極易掌握,同時有著足夠的靈活性。Arduino語言基于wiring語言開發,是對 AVRGCC庫的二次封裝,不需要太多的單片機基礎、編程基礎,簡單學習后,你也可以快速的進行開發。
? 開放性
Arduino的硬件原理圖、電路圖、IDE軟件及核心庫文件都是開源的,在開源協議范圍內里可以任意修改原始設計及相應代碼。
? 社區與第三方支持
Arduino有著眾多的開發者和用戶,你可以找到他們提供的眾多開源的示例代碼、硬件設計。例如,可以在Github.com、Arduino.cc、Openjumper.com等網站找到Arduino第三方硬件、外設、類庫等支持,更快更簡單的擴展你的Arduino項目。
? 硬件開發的趨勢
Arduino不僅僅是全球最流行的開源硬件,也是一個優秀的硬件開發平臺,更是硬件開發的趨勢。Arduino簡單的開發方式使得開發者更關注創意與實現,更快的完成自己的項目開發,大大節約了學習的成本,縮短了開發的周期。
以上摘自《Arduino程序設計基礎》
使用arduino的注意事項
每個東西都有其適用性的地方,其實對于熟悉某個單片機開發的人來說,使用arduino是不合適的,它雖然開發非常簡單,對于簡單項目,只要關注自己的業務邏輯,直接上手就行了。然而,就是因為他的簡單,導致使用不靈活,片上資源也少,有些時候真的會掉進坑里,所以使用時三思,以下是我自己測試后,有些要注意的地方,可能不對,幫忙提醒下。
- 處理速度慢,實時性不高,基本的arduino版本都是ATmage做主控芯片,它時鐘頻路16M,跟增強型51差不多,而且代碼又做了第二次封裝,所以對處理性能要要求的應用自己酌情使用。別說Arduino for STM32,不是官方的,誰知道有什么坑。
- 多任務、多線程編程有點麻煩,雖然GitHub里可以找到多任務切換的源碼,但使用時需要注意每個任務的時間片格,相對于UCOS、RT-Thread之類實時操作系統,各種優先級、搶占機制、線程通訊。用arduino累啊。
- 中斷2個,計數器無,時鐘頻率設置麻煩,比如IO口的時鐘頻率基本不能設置,I2C、SPI口也是少的可憐,好多東西都要外擴,沒有片上集成。
- PWM輸出、模擬輸入口到挺多的,但PWM的頻率最大是500Hz,對于一些控制是不符合要求的,比如有些電機及配套的驅動,用這個頻率控制會導致電機振動厲害,另外占空比設置只能0-255,對于一些性能要求比較嚴格的控制也是比較麻煩的。模擬輸入的采樣精度是10位,采用間隔是100us,這些都是比較低的值,雖然能滿足大部分傳感器的值,選用開發時還是需要注意的。
- 串口緩存最大的數是128,而且不能中斷接收,對于一些通訊協議定義起來需要注意了。
舉例介紹下arduino的開發過程
說了這些,其實要是沒自己上手下不會有概念的,那么我取個例子來說明下arduino的開發過程,就舉個避障小車開發的例子。小車的系統結構大致如圖。
采用帶編碼器的直流電機,PWM方式控制電機轉速度,各類傳感器先舉紅外傳感器,其他待定,arduino控制電機以及各類傳感器,于上層主控制器一起構成一個智能小車。
由于編碼器需要采集電機脈沖信號,為了方便無誤采用arduino的兩個中斷計數,串口通信和各類傳感器采用遍詢式判斷,為了簡化編程,采用任務調度器實現編程。
那么現在開始這個arduino的開發吧!
默認你準備了硬件,那么先Arduino IDE下載安裝吧,驅動安裝不上看各版本驅動安裝方法。安裝好后打開軟件如下圖。
配置好后就可以上手了,這里推薦你看Arduino.Cookbook.Michael.Margolis這本書,上面有具體常用函數用法,有些不明白的可以查閱arduino IDE自帶的例程,我覺得這樣上手比較快,最后具體項目可以Google。比如我需要用到一個任務調度器,找到一個大神弄好的任務調度器,先自己測試下這個調度器的性能,代碼如下:
#include "TaskScheduler.h" //下載源碼放到項目目錄下,引用
const int ledPin=13;//led引腳IO號
int ledState=0;//led狀態標志
void setup()
{
// put your setup code here, to run once:
pinMode(ledPin,OUTPUT); //led引腳的IO設置成輸出模式
Sch.init(); //初始化調度器
Sch.addTask(ledtest,20,1000,1); //從第 20 毫秒開始閃爍 LED,每隔 1s, LED 狀態改變一次
Sch.addTask(serialtest,0,1,0); //串口測試程序
Serial.begin(9600); //開始串口通信
Sch.start() ;//啟動調度器
}
void loop()
{
// put your main code here, to run repeatedly:
Sch.dispatchTasks(); // 執行被調度的任務,用調度器時放上這一句即可
}
void ledtest()
{
if(ledState==0) digitalWrite(ledPin,HIGH); //輸出為高電平
else digitalWrite(ledPin,LOW); //輸出為低電平
ledState=~ledState; //取反
}
void serialtest()
{
if(Serial.available()) //判斷串口緩存是否有數據
{
Serial.print((char)Serial.read()); //將讀到的數據發送回去
Serial.flush(); //清空串口緩存
}
}
測試下,除了需要注意每個任務的調用時間片,其他都OK,就用這個做小車的軟件框架。
未完待續……