編輯:關於Android編程
對Arduino,官方有一堆解釋。
作為一個軟件程序猿,在我眼裡,Arduino是學習“可怕硬件”的一個便捷通道。它把復雜的硬件名稱,屬性給我們隱藏起來,只需要一些簡單的軟件知識,就可以學習硬件開發。
Arduino是開源項目,硬件結構,軟件設計都開源。
所以不存在盜版的問題。
官方版質量肯定是槓槓的,但價格也貴。
兩者價格數字差不多,一個賣人民幣,一個賣美元。
不差錢就買官方版,否則兼容版也不錯。
Arduino有一系列各種用途的開發板,最常見的有兩種,Uno和Mega。
Uno價格便宜一些,功能簡單。
Mega價格比Uno貴二十多塊,官方版貴二十多美元,兼容版貴二十多人民幣。
大家買Arduino開發板,主要用途就是學習,要求能方便的了解到更多特性。
Uno接口太少,比如做個小車,接了四個馬達後,基本就不能再添加其他模塊了。
如果你要做個藍牙小車,調試時噩夢就來了。因為Uno只有一個串口,藍牙和USB共用。
你的先拔下藍牙模塊的連接線才能上傳程序,上傳完成後,然後再插上藍牙連接線才能開始測試。
如果你不只是學習,而是要研發產品,要考慮產品的成本價。。。
選擇Mega也任然沒有錯,你可以現在Mega上完成開發,最後在Uno上做性能測試。
所以,我的建議是選Mega。
我記得從學習C語言開始,都是先寫個HelloWorld程序。
Arduino我們也從這裡開始吧。
官網下載Arduino集成開發環境(以後都簡稱Arduino IDE)。
解壓後,雙擊此目錄下的arduino.exe,啟動Arduino IDE。
我這裡是以Windows平台為例,Mac,Linux界面、操作基本相同,也可以參照本例學習。
啟動Arduino IDE,點擊菜單 文件->新建(快捷鍵Ctrl+N),生成新的工程。
點擊菜單 文件->保存(快捷鍵Ctrl+S),保存生成的工程。
文件名這裡我填“HelloWorld”,Arduino IDE會生成一個名稱叫“HelloWorld”的文件夾,並在這個文件夾下生成一個同名的HelloWorld.ino文件。
.ino文件是Arduino工程的主文件,Arduino要求ino文件必須置於一個同名文件夾下。
新生成的工程自動生成了setup()
和loop()
兩個函數。
我們先改改代碼,輸出“Hello World”,有點切身感受。稍後再來講解代碼結構。
在setup函數裡設置串口波特率
void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
}
用串口輸出”Hello world!”
void loop() {
// put your main code here, to run repeatedly:
Serial.println("Hello world!");
}
點右上角的按鈕打開串口監視器(快捷鍵Ctrl+Shift+m)
波特率必須和setup裡設置的相同,本例是9600.
可以看到不斷輸出“Hello world!”
HelloWorld.ino文件就兩個函數
void setup()
void loop()
它們是怎麼運行起來的呢?
看下面這段代碼
void setup(void);
void loop(void);
int main(void) {
setup();
while(1) {}
loop();
}
return 0;
}
是不是很清楚了。
main和while這些代碼去哪了呢?Arduino IDE隱藏了,讓我們的代碼結構更清晰。
setup()
只執行一次,用來放初始化的函數
loop()
不斷循環執行,用來檢查各傳感器狀態,驅動程序運行。
Arduino IDE通過串口和PC(或其他設備)通訊。
在Arduino IDE中Serial就是串口的化身。
注意,Serial是系統對象,不是類,所以使用時直接Serial.begin()。
詳細內容可以參看官網的描述:
https://www.arduino.cc/en/Reference/Serial
學習Arduino,官網要隨時訪問。
Uno示例
USB接口和0、1引腳都是接Serial
Mega示例
USB接口和0、1引腳都是接Serial
18、19引腳是接Serial1
16、17引腳是接Serial2
14、15引腳是接Serial3
Arduino自帶了很多例子。
Blink是其中為數不多的只要有Arduino開發板就可以開始學習的例子。
菜單 文件->示例->01.Basic->Blink打開今天要講的例子。
void setup() {
// initialize digital pin 13 as an output.
pinMode(13, OUTPUT);
}
學習硬件開發,一個很大的門檻是要記住許多復雜的寄存器地址。
Arduino的NB之處就在於她簡化了這許多地址,定義了幾種不同類型的硬件插口,稱為引腳。
編程時只需要對這幾類引腳做操作就可以了。
今天先講最常用的引腳,DigitalPins。
官網解釋如下:
https://www.arduino.cc/en/Tutorial/DigitalPins
簡單說就是一種可以輸入或輸出數字信號0,1的引腳。
某個引腳是用來輸入還是輸出信號,就通過pinMode函數來定義。
pinMode(13, OUTPUT);
這段代碼的意思是編號為D13的引腳,定義為輸出模式。
因為D13引腳連接著一個焊接在Arduino開發板上的LED燈。
所以,如果沒有可外接的LED模塊,就用D13引腳來做演示。
void loop() {
digitalWrite(13, HIGH); // turn the LED on (HIGH is the voltage level)
delay(1000); // wait for a second
digitalWrite(13, LOW); // turn the LED off by making the voltage LOW
delay(1000); // wait for a second
}
loop函數總共4行代碼
digitalWrite(13, HIGH);
將D13置高,也就是通電。
切記,只有之前將引腳設置為OUTPUT,digitalWrite才能生效。
delay(1000);
延時1秒,在這1秒鐘,LED燈狀態不變,即點亮狀態。
digitalWrite(13, LOW);
將D13置低,也就是斷電。
delay(1000);
延時1秒,在這1秒鐘,LED燈狀態不變,即熄滅狀態。
之後loop函數被再次執行,我們看到的現象就是LED燈一秒亮、一秒暗的不停閃爍。
不同的開發板,D13控制的LED燈位置,顏色都略有不同。
相信大多數看官我在下一樣,都是搞軟件出身的。根本分不清LED燈長啥樣:P
開發板連接到上電源(USB線接電腦也算)後,如果只有一個LED燈亮著,這個LED燈旁邊肯定有一個“On”標記,這個是表示電源接通的LED燈。
上傳本例到開發板後,閃爍的那個就是我們要找到D13 LED燈了。可以在這個LED燈旁看到個‘L’標記。
LED燈是最常見的Arduino模塊,上一節我們講了控制Arduino開發板自帶的LED燈。
這一節還講LED燈,講外接、可控亮度的LED燈。
先介紹個概念,Pulse Width Modulation簡稱PWM。
數字接口只能輸出0或1兩種狀態,PWM通過在0、1兩種狀態間快速切換,生成一個介於0、1之間的值。
比如1000ms中,平均400ms處於1(高),平均600ms處於0(低),兩種狀態均勻分布,就輸出了一個0.4的值。
詳細內容參加官網:
https://www.arduino.cc/en/Tutorial/PWM
你的LED模塊可能是這樣子
也可能是這樣子
不管長什麼樣,只要單色可調光LED,都是三根線。
標注字符IN的是控制線、VCC是電源線、GND是地線。
Mega開發板,2-13引腳都支持PWM,隨便選一個都可以。
Uno開發板,3,5,6,9,10,11引腳支持PWM,可以在開發板上看到引腳數字邊上有個’~’。
LED燈IN連接到Mega D2引腳;VCC接到Mega 5V引腳;GND接到Mega GND引腳。
早期的開發板,為了防止電壓不穩定擊穿電子器件,需要連接個電阻。
現在的開發板,只在接馬達時才需要增加電阻,慣常的做法是增加一塊擴展板。
因為這次我們使用了D2引腳,所以需要修改此處的13為2
pinMode(13, OUTPUT);
還要修改此處的13為2
void loop() {
digitalWrite(13, HIGH); // turn the LED on (HIGH is the voltage level)
delay(1000); // wait for a second
digitalWrite(13, LOW); // turn the LED off by making the voltage LOW
delay(1000); // wait for a second
}
點擊菜單 項目->上傳,上傳代碼到開發板。
可以看到這個外接的LED燈也像內置的LED燈一樣閃爍了。
剛才我們因為更換引腳,修改了3處代碼。
在arduoni開發中,更換引腳是很經常發生的事,常見的做法是在setup函數之前增加宏定義
define LED_PIN 2
void setup() {
...
將代碼中的D2相關代碼都用LED_PIN替換,以後再更換引腳就很方便了。
用analogWrite函數控制PWM引腳,第一個參數是引腳序號,第二個是輸出到這個引腳的值,范圍0~255.
analogWrite(LED_PIN, 10)這行代碼使LED燈發出微弱的光。
void loop() {
analogWrite(LED_PIN, 10);
}
我們通過串口輸入一個介於0-255的數字來調整LED燈亮度。
本例我們將演示四個Serial對象函數的使用方法。
使用begin()
函數在setup函數裡設置串口波特率。
void setup() {
Serial.begin(9600);
pinMode(LED_PIN, OUTPUT);
}
Serial.available()
返回true表示串口有數據待讀取
void loop() {
while (Serial.available()) {
...
Serial.parseInt()
讀取串口中輸入的字符串。如果輸入的是非數字,會被解析為0.
void loop() {
while (Serial.available()) {
Serial.parseInt();
analogWrite()
函數用來給模擬接口寫入數據。
第一個參數指定引腳序號,第二個參數指定寫入引腳的值。
long ledLevel = 10;
void loop() {
while (Serial.available()) {
ledLevel = Serial.parseInt();
}
analogWrite(LED_PIN, ledLevel);
}
因為analogWrite接受的值在0-255之間,所以代碼可以做些優化。
用uint8_t代替long型。
uint8_t ledLevel = 10;
void loop() {
while (Serial.available()) {
ledLevel = Serial.parseInt();
}
analogWrite(LED_PIN, ledLevel);
}
print在串口輸出參數信息。
println在串口輸出參數信息,並回車。
uint8_t ledLevel = 10;
void loop() {
while (Serial.available()) {
ledLevel = Serial.parseInt();
Serial.print("ledLevel=");
Serial.println(ledLevel);
}
analogWrite(LED_PIN, ledLevel);
}
串口模擬器稍作修改,右下角這裡改成“沒有結束符”。
否則parseInt會把結束符解析成0,導致LED燈錯誤熄滅。
在android開發中,用戶能夠撥打電話是最基本的需求。俗話說“條條大路通羅馬”,實現撥打電話的方式有多種,今天,就提供最常用兩種。 首先,撥打電話,對於用戶來說,是一
在Android應用開發中,打造良好的用戶體驗是非常重要的。而在用戶體驗中,界面的引導和跳轉是值得深入研究的重要內容。在開發中,與界面跳轉聯系比較緊密的概念是Task(任
新項目需要做短信模塊功能,此短信模塊非安卓系統短信模塊,是利用了360張勇主導的開源框架,進行URL攔截,剝離出來的短信模塊第一步:去下載安卓系統源碼,通過對比4.4和4
小米手機的WIFI設置是在沒有某WIFI熱點的情況下,即使已經保存了的WIFI密碼也是不顯示的,這樣就造成我們沒法將其刪除.只能再回到原來的WIFI熱點下才