Issuu on Google+

電子科技創意獎勵計劃 ARDUINO™設計和應用簡介

香港中文大學

電子工程學系


目錄 Arduino簡介 Arduino編程簡介 Arduino硬件簡介和組裝周邊元件 產品設計過程 電路設計範例


甚麼是Arduino? Arduino是一個利用微控制器的開發平台 能透過不同的週邊元件與環境互動 對組裝和編程有完善支援 設有不同型號和規格以配合不同需要

Arduino Mega2560

Arduino LilyPad


Arduino是怎樣運作的? 設計者透過編寫程式去決定整個電路的運作方式 Arduino模組包括一個微處理器(Microcontroller Unit, MCU)電路,能夠控制整個系統的運作 設計者可以在輸入/輸出端口(I/O Ports)接駁不同的 週邊元件,這些元件可以和使用者作不同互動或執行 來自微處理器的指令

自行設計的 程式

+

週邊元件

你設計的電 子產品 !


怎樣為Arduino編寫程式? 你需要使用 Arduino environment (http://arduino.cc/en/Main/Software) 你的程式必需: { {

使用為setup()Arduino作配置 在loop()函式設計系統的控制流程

不同的週邊硬件需要不同的函式作指令,而網上已有 不少的函式庫可作參考 (http://arduino.cc/en/Reference/Libraries)


一個簡單的Arduino程式 http://arduino.cc/en/Tutorial/Blink Setup 函式把13號引腳設定為輸出引腳,而Loop函式則指令該引腳的值 每秒(1000微秒)改變,而數值只有「高」和「低」 void setup() { // initialize the digital pin 13 as an output. pinMode(13, OUTPUT); } void loop() { digitalWrite(13, HIGH); delay(1000); digitalWrite(13, LOW); delay(1000); }

// wait for a second(1000ms) // wait for a second


Arduino編程 建基於C++程式語言 一個Arduino程式必需包含兩個函式: setup() 和 loop() 呼叫函式時你需要使用函式名稱和輸入參數: yourFunction(); yourFunction1(var1, var2);


函式 float divide (int a, int b) { float c = 0; c = a / b; return c; }

函式被呼叫(call)時能利用輸入參數作特定的工作,並把工作結果以傳回 值輸出 float 是這個函式的傳回值類型 divide 為函式的名稱 int a, int b是指一些在呼叫這個函式時需要的參數。 C是這個函式的傳回值


程式的其他元素 不同種類的變數和參數 邏輯運算符和算術運算符 { {

用作比較,運算和決定 例:“and”: &&, “or”: ||, “equal”: == , +,-, *, / 等

預設常數 {

Arduino開發環境中已預設一些常數值,例如“HIGH”和“LOW”, “INPUT”和 “OUTPUT”

控制流程和條件表達式 {

if…else if…else, for loop, while loop, do while loop

詳細編程教學可參閱: http://arduino.cc/playground/Main/ManualsAndCurriculum


如何把這個程式載入到Arduino? 把Arduino連接到電腦的USB端口 安裝Arduino的驅動程式 開啟Arduino Environment並開啟你已編寫的程式 在Tool>Board選取你使用的Arduino型號 選取連接到Arduino模組的序列端口並選取Upload to I/O Board載入程式 詳情請參考: http://arduino.cc/en/Guide/Windows


Arduino的部分引腳配置 第13引腳已 連接內置 LED指示燈

脈衝寬度 調變輸出

4組UART序行傳送端口 (Tx為傳輸,Rx為接收) 外置中斷引腳

TWI內部整合電 路通訊匯流排

USB 連接端口

序列週邊端口 外接電源(可使用由電 池或直流-交流轉換器 輸出的7-12V電源,接 線 需 使 用 2.1 空 心電源 插頭,內芯為正極)

不同電源引 腳

模擬輸入 引腳


如何連接週邊硬件到Arduino上? Arduino模組有兩種I/O引腳 數位引腳可以被設定為輸出/輸入引腳,而其中一些 引腳更可作特別用途 (http://arduino.cc/playground/Learning/Pins) 模擬引腳(Ax)可以當作數碼引腳,也可以用來接駁模 擬元件 {

進入Arduino的模擬訊號會透過模擬數位轉換器轉成一個數碼訊 號,由0-1023,一共1024個級別代表。以5V為上限的話,每一 個級別代表0.005V。例如3.25V將會由676來代表


甚麼是數位和模擬? 信號水平

信號水平 低 高 高 高

「高」

時間

「低」 訊號在固定時間有意義 信號的值有限

較不容易被雜訊干擾 取樣時可能出現錯誤

時間 訊號在每個時刻也有意義 沒有固定的信號值 能直接從環境獲取信號 容易受其他訊號或雜訊干擾


我可不可以直接把週邊硬件接駁到Arduino的I/O端口? 不一定! 有些元件需要較大的功率,或者和Arduino能輸入或 輸出的電壓和電流有分別。 直接接駁可能會對 Arduino或元件做成損害 你可能需要先把I/O端口連接到額外的驅動電路,再 把驅動電路的輸出連接到元件 Arduino可能未能直接處理部份週邊元件所產生的信 號,你可能需要在元件和Arduino之間接駁額外的信 號處理電路 所有電路的接地(Ground)必需連接在一起


我怎樣知道是否需要額外的電路? 你可以在網上查看有關元件的數據表(Datasheet) 你會找到有關元件的功率要求,然後和Arduino的輸 入/輸出要求作比較 { {

I/O端口最大直流電流:0.04安培 最高直流電壓:除了Diecimila是3.3V,其他皆是5V

你也可以從Arduino官方網站或其他網站找到一些展 示元件用法的電路圖作為參考。


Component A

Component B

元件A和B的輸入要求也不超過Arduino的最高輸出電流 和電壓,所以它們能直接接駁到Arduino的I/O端口


這元件的輸入電壓和電流皆超過Arduino I/O端口能輸出的, 所以在Arduino和這元件之間,我們需要接駁額外的驅動電路。


使用Arduino設計產品的過程展示 事前準備: { {

Arduino模組及所需要的周邊元件 完成Arduino environment和你使用的Arduino模組所需的驅動 程式 (有關驅動程式的安裝可參考: http://arduino.cc/en/Guide/Windows#toc4)

例子使用的程式碼及電路圖請參考: http://arduino.cc/en/Tutorial/Button


電路和程式設計 {

設計過程 z 電路和程式設計 z 建立電路 z 編程 z 上載程式至Arduino z 完成

{ {

{

先設計你的產品的功能和用法 基於你的設計,尋找適用的元件和電路 設計你的產品程式流程,並記下適用的函式集 和函式 設計Arduino引腳和元件的接駁編排,並畫下示 意圖以作參考,其中一個適合作Arduino設計的 軟件為Fritzing(http://fritzing.org/download/)


建立電路 {

設計過程

利用麵包板: 頂部和底部有兩行水平連接插孔,多有紅 色和藍色線指示連接方式 其他插孔以五個一組並垂直連接 較容易有接觸不良令電路不完整

z 電路和程式設計 z 建立電路 z 編程

{ z 上載程式至Arduino

利用萬用電路板 使用方法和麵包板相近,但電路的元件佈 局較靈活 電路需要焊接或繞接

z 完成

{

使用印刷電路板(PCB) 連接較良好,需要焊接 設計和製作也較複雜,也不能輕易改變電 路設計


建立電路 {

設計過程 z 電路和程式設計 z 建立電路 z 編程 z 上載程式至Arduino z 完成

{

根據你設計的電路示意圖,在電路板上 連接Arduino和各個元件 跳線是較容易改變電路的連接用具,在 設計初期較為適合


建立電路 {

設計過程 z 電路和程式設計

{

z 建立電路 z 編程 z 上載程式至Arduino

{

切記留意Arduino和你使用的元件對電 流和電壓的輸入/輸出要求 小心接駁有極性的元件,以免弄錯電極 而損壞元件和模塊 小心計劃電路和元件位置,以免短路或 元件過熱

z 完成

(+)

(-) (-) (+)


編程 {

設計過程 z 電路和程式設計 z 建立電路 z 編程 z 上載程式至Arduino z 完成

在Arduino Environment裡編寫你的程 式


編程 {

設計過程

把已完成的程式碼儲存到純文字檔案 (例如*.pde)

z 電路和程式設計 z 建立電路 z 編程 z 上載程式至Arduino z 完成

button_example.pde

pde


上載程式至Arduino {

設計過程 z 電路和程式設計 z 建立電路 z 編程 z 上載程式至Arduino z 完成

把Arduino模塊連接到電腦USB端口, 在模塊上將有指示燈亮起


上載程式至Arduino {

設計過程 z 電路和程式設計 z 建立電路 z 編程 z 上載程式至Arduino z 完成

在Arduino Environment中選取你使用 的型號


上載程式至Arduino {

在“Tools”選擇連接著Arduino的序列端 口,然後選“Upload”

{

完成上載之後,在Arduino Environment視窗的底部會出現“Done Uploading”字句

設計過程 z 電路和程式設計 z 建立電路 z 編程 z 上載程式至Arduino z 完成


完成! {

設計過程 z 電路和程式設計 z 建立電路 z 編程 z 上載程式至Arduino z 完成

你現在可以測試軟件和硬件是否如你設 計般運作!


電路設計範例


跳字時鐘 跳字時鐘在日常生活非常普遍。 跳字時鐘可粗略分為時、分、秒 編寫程式時需要運用簡單數式來進行運算

製作時鐘需要考慮到時、分、秒的進位和歸零的動作


跳字時鐘線路圖


16×2 LCD LCD – Liquid Crystal Display 16×2 LCD較為常見及容 易使用。16×2是指LCD 有二行,每行能顯示十六 個字符。 {

例如:16x4 LCD 是每行十 六個字符,有四行。 圖片來源: http://www.skpang.co.uk/catalog/lcddisplays-16x2-lcd-5v-c-91_206.html


16×2 LCD – 硬件設定


跳字時鐘-1602 LCD Display 跳字時鐘最重要的器件就是LCD Display Google Search Æ LCM 1602 datasheet and application note { { {

Pin Number Interface Pin Function Instruction Table


16×2 LCD – 參考 Arduino LCD Library {

http://arduino.cc/en/Reference/LiquidCrystal

LCD Datasheet {

{

http://www.crystalfontz.com/products/datasheet/210/CFAH1 602XYYHJP.pdf http://www.lcdmodule.com.hk/image/TOPWAY/LMB162ABC-1-Manualpdf.pdf

Notes: All above websites are visited on 14th Nov. 2011


跳字時鐘–軟件設定 #include <LiquidCrystal.h> void show_time(); void updata(); void set_time(); //set const const const const const int int int int int int int int

connection of arduino int setbutton=6; int exitbutton=7; int upbutton=8; int downbutton=9; int Relay=13;

buttonstate = 0; hour = 0; minute = 0; second = 0; temp; readdata; sensorValue; tempstate = LOW;

// initialize the library with the numbers of the interface pins LiquidCrystal lcd(12, 11, 5, 4, 3, 2); void setup() { Serial.begin(9600); lcd.begin(16,2); pinMode(setbutton,INPUT); pinMode(exitbutton,INPUT); pinMode(upbutton,INPUT); pinMode(downbutton,INPUT); pinMode(Relay,OUTPUT); } void loop() { show_time(); show_temp(); delay(1000); second++; updata(); analogread();


跳字時鐘–軟件設定 tempstate = digitalRead(setbutton); if(tempstate==HIGH) { set_time(); } tempstate=LOW; TempButton = digitalRead(SetTempButton); if(TempButton==HIGH) { set_temp(); } TempButton=LOW; compare(); } void show_time() { lcd.setCursor(0, 0); lcd.print("TIME:"); temp = hour/10; lcd.print(temp); temp = hour%10; lcd.print(temp); lcd.print(":"); temp = minute/10; lcd.print(temp); temp = minute%10; lcd.print(temp);

lcd.print(":"); temp = second/10; lcd.print(temp); temp = second%10; lcd.print(temp); } void set_time() { int index=3; lcd.setCursor(0, 1); lcd.print("set time while(index) {

");

tempstate = digitalRead(exitbutton); delay(10); if(tempstate==HIGH)


跳字時鐘–軟件設定 {

} index--; delay(400); } tempstate=LOW; if(index==3) { lcd.setCursor(14, 1); lcd.print("s"); tempstate = digitalRead(upbutton); delay(10); if(tempstate == HIGH) { second++; delay(400); } tempstate=LOW;

if(index==2) { lcd.setCursor(14, 1); lcd.print("M"); tempstate = digitalRead(upbutton); delay(10); if(tempstate == HIGH) { minute++; delay(400); } tempstate=LOW;

tempstate = digitalRead(downbutton); delay(10);

tempstate = digitalRead(downbutton); delay(10);

if(tempstate==HIGH) { second--; delay(400); } tempstate=LOW;

if(tempstate==HIGH) { minute--; delay(400); }


跳字時鐘–––軟件設定 tempstate=LOW; } if(index==1) { lcd.setCursor(14, 1); lcd.print("H"); tempstate = digitalRead(upbutton); delay(10); if(tempstate == HIGH) { hour++; delay(400); } tempstate=LOW; tempstate = digitalRead(downbutton); delay(10); if(tempstate==HIGH) { hour--; delay(400); } tempstate=LOW; }

updata(); show_time(); } lcd.clear(); }


跳字時鐘及溫度控制 自動化溫度控制多在大型商場內應用。 溫度控制分為數位和模擬(Digital and Analog)兩種 模擬信號需要使用運算放大器(Operational Amplifier) 放大後才能處理 模擬電路(Analog Circuit)是初學者學習電子線路的必 要基礎


跳字時鐘及溫度控制線路總圖


跳字時鐘及溫度控制–器件 16x2 LCD Display (顯示時,分,秒) Switch button (調整時間) Variable Resistor (調較螢幕光暗) LM35DZ 溫度控制 IC LM358 Operation Amplifier (放大信號) Relay (連接其他硬件控制溫度, 例如: 風扇, 冷氣機開 闢)


跳字時鐘及溫度控制–器件

Google Search Æ LM35DZ, LM358 datasheet and application note { {

Operating Temperature Range Pin Number


跳字時鐘及溫度控制–軟件設定 #include <LiquidCrystal.h> void void void void void void void

show_time(); show_temp(); updata(); analogread(); set_time(); set_temp(); compare();

//set const const const const const const int int int int int int int int int int int

connection of arduino int setbutton=6; int exitbutton=7; int upbutton=8; int downbutton=9; int SetTempButton=10; int Relay=13;

buttonstate = 0; hour = 0; minute = 0; second = 0; temp; readdata; sensorValue; tempstate = LOW; TempButton = LOW; RelayPin = HIGH; room_temp=27;

// initialize the library with the numbers of the interface pins LiquidCrystal lcd(12, 11, 5, 4, 3, 2); void setup() { Serial.begin(9600); lcd.begin(16,2); pinMode(SetTempButton,INPUT); pinMode(setbutton,INPUT); pinMode(exitbutton,INPUT); pinMode(upbutton,INPUT); pinMode(downbutton,INPUT); pinMode(Relay,OUTPUT); } void loop() { show_time(); show_temp(); delay(1000); second++; updata(); analogread();


跳字時鐘及溫度控制–軟件設定 tempstate = digitalRead(setbutton); if(tempstate==HIGH) { set_time(); } tempstate=LOW; TempButton = digitalRead(SetTempButton); if(TempButton==HIGH) { set_temp(); } TempButton=LOW; compare(); } void show_time() { lcd.setCursor(0, 0); lcd.print("TIME:"); temp = hour/10; lcd.print(temp); temp = hour%10; lcd.print(temp); lcd.print(":"); temp = minute/10; lcd.print(temp); temp = minute%10; lcd.print(temp);

lcd.print(":"); temp = second/10; lcd.print(temp); temp = second%10; lcd.print(temp); } void show_temp() { lcd.setCursor(10,1); lcd.print("RT:"); lcd.print(room_temp); } void updata() { if(second>=60) { second=0; minute++; }


跳字時鐘及溫度控制–軟件設定 if(minute>=60) { minute=0; hour++; } if(hour>=24) { hour=0; } if(second<0) { second=59; } if(minute<0) { minute=59; } if(hour<0) { hour=23; } } void analogread() { int TempD; sensorValue= analogRead(A0); //leave the calculate

TempD = sensorValue % 10; sensorValue = sensorValue / 10; Serial.println(sensorValue,DEC); lcd.setCursor(0, 1); lcd.print("T:"); lcd.print(sensorValue); lcd.print("."); lcd.print(TempD); } void set_time() { int index=3; lcd.setCursor(0, 1); lcd.print("set time while(index) {

");

tempstate = digitalRead(exitbutton); delay(10); if(tempstate==HIGH)


跳字時鐘及溫度控制–軟件設定 {

} index--; delay(400); } tempstate=LOW; if(index==3) { lcd.setCursor(14, 1); lcd.print("s"); tempstate = digitalRead(upbutton); delay(10); if(tempstate == HIGH) { second++; delay(400); } tempstate=LOW;

if(index==2) { lcd.setCursor(14, 1); lcd.print("M"); tempstate = digitalRead(upbutton); delay(10); if(tempstate == HIGH) { minute++; delay(400); } tempstate=LOW;

tempstate = digitalRead(downbutton); delay(10);

tempstate = digitalRead(downbutton); delay(10);

if(tempstate==HIGH) { second--; delay(400); } tempstate=LOW;

if(tempstate==HIGH) { minute--; delay(400); }


跳字時鐘及溫度控制–軟件設定 tempstate=LOW; } if(index==1) { lcd.setCursor(14, 1); lcd.print("H"); tempstate = digitalRead(upbutton); delay(10); if(tempstate == HIGH) { hour++; delay(400); } tempstate=LOW; tempstate = digitalRead(downbutton); delay(10); if(tempstate==HIGH) { hour--; delay(400); } tempstate=LOW; }

updata(); show_time(); } lcd.clear(); } void set_temp() { int TempIndex=1; int exitTemp; lcd.setCursor(15, 1); lcd.print("?"); lcd.setCursor(13, 1); while(TempIndex) { show_time(); show_temp(); delay(1000); second++; updata(); analogread();


跳字時鐘及溫度控制–軟件設定 lcd.setCursor(13, 1); TempButton = digitalRead(upbutton); delay(10); if(TempButton == HIGH) { room_temp++; } TempButton=LOW; TempButton = digitalRead(downbutton); delay(10); if(TempButton==HIGH) { room_temp--; } TempButton=LOW; exitTemp = digitalRead(exitbutton); if(exitTemp==HIGH) { break; } } lcd.clear(); }

void compare() { int OffTemp; OffTemp = room_temp - 3; if (sensorValue >= room_temp) { digitalWrite(Relay, LOW); } if (sensorValue <= OffTemp) { digitalWrite(Relay, HIGH); } }


鍵盤(Keypad) Keypad 是一種較為常用 的輸入器件。 Keypad Library {

http://arduino.cc/playgroun d/Code/Keypad


鍵盤(Keypad)

3×4 Keypad Pinout : C0(zero), c1, C2, R0(zero), R1, R2, R3

4×4 Keypad Pinout : C0(zero), c1, C2, C3, R0(zero), R1, R2, R3


3×4鍵盤(Keypad) – 硬件設定


3×4 鍵盤(Keypad) – 軟件設定 #include <Keypad.h> const byte ROWS = 4; //four rows const byte COLS = 3; //three columns char keys[ROWS][COLS] = { {'1','2','3'}, {'4','5','6'}, {'7','8','9'}, {'*','0','#'} }; byte rowPins[ROWS] = {28, 30, 32, 34}; byte colPins[COLS] = {22, 24, 26; Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS ); char key, temp=0; void setup() { Serial.begin(115200); } void loop() { temp = keypad.getKey(); if(temp != NO_KEY) { Serial.print("Key Input:"); Serial.print(temp); Serial.print("\n"); } }

使用Keypad 的函式庫 (Library) 定義 Keypad 的規格

定義 Keypad 的接線腳位 初始化 Keypad 的變數

設定 Serial 的通訊協議

獲取按鍵 如果按了鍵,所按的鍵會透過 Serial 通訊協議傳送到 電腦顯示


4×4 鍵盤(Keypad) – 軟件設定 #include <Keypad.h> const byte ROWS = 4; //four rows const byte COLS = 4; //four columns char keys[ROWS][COLS] = { {'1','2','3', 'A'}, {'4','5','6', 'B'}, {'7','8','9', 'C'}, {'*','0','#', 'D'} }; byte rowPins[ROWS] = {22, 23, 24, 25}; byte colPins[COLS] = {26, 27, 28, 29; Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS ); char key, temp=0; void setup() { Serial.begin(115200); } void loop() { temp = keypad.getKey(); if(temp != NO_KEY) { Serial.print("Key Input:"); Serial.print(temp); Serial.print("\n"); } }

使用Keypad 的函式庫 (Library) 定義 Keypad 的規格

定義 Keypad 的接線腳位 初始化 Keypad 的變數

設定 Serial 的通訊協議

獲取按鍵 如果按了鍵,所按的鍵會透過 Serial 通訊協議傳送到 電腦顯示


DS18B20 溫度感應器 IC DS18B20 是一個數字溫度 感應器 其有效溫度感應範圍是由55攝氏至+125攝氏,-10攝 氏 至+85攝氏,其精確度為 ±0.5攝氏 Arduino函式庫(Library) {

{

OneWire 函式庫 http://www.pjrc.com/teens y/td_libs_OneWire.html DS18B20 函式庫 http://www.milesburton.co m/?title=Dallas_Temperatu re_Control_Library


DS18B20 – 硬件設定


DS18B20 – 軟件設定 #include <OneWire.h> #include <DallasTemperature.h> //Define DS18B20 CONNECTION Pin #define ONE_WIRE_BUS 7 //Define resolution of Temperature Sensor #define TEMPERATURE_PRECISION 12 // Setup a oneWire instance to communicate with // any OneWire devices (not just Maxim/Dallas // temperature ICs) OneWire oneWire(ONE_WIRE_BUS); // Pass our oneWire reference to Dallas // Temperature. DallasTemperature sensors(&oneWire);

// Number of temperature devices found int numberOfDevices;

// We'll use this variable to store a found // device address DeviceAddress tempDeviceAddress;

包含 OneWire 函式庫 (Library) 包含 DS18B20 函式庫 (Library) 設定DS18B20數據IC腳連接到Arduino 板上的7腳 設定DS18B20的解析度,由9到12

設定OneWire 通訊協議及創建一個新的oneWire 變數

設定DS18B20的變數,並將oneWire的通訊協議遞給 DS18B20 設定一個變數,儲存有多少粒DS18B20 IC 同時連接 到數據腳上

設定一個變數,儲存DS18B20的內部地址 備註:每一粒DS18B20其內部地址都是不同的


DS18B20 – 軟件設定 void setup(){ // Grab a count of devices on the wire numberOfDevices = sensors.getDeviceCount(); //Get Address of device, Only one device sensors.getAddress(tempDeviceAddress, 0);

// set the resolution to TEMPERATURE_PRECISION // bit (Each Dallas/Maxim device is capable of // several different resolutions) sensors.setResolution(tempDeviceAddress, TEMPERATURE_PRECISION); Serial.begin(115200); }//end setup

搜索有多少DS18B20 IC 在數據腳上 獲第一粒DS18B20 IC 的內部地址 備註:第二個參數,零為第一粒搜索到的IC,1為第二粒,如此類 推

設定DS18B20的解析度,每一粒DS18B20 IC 皆由其 內部地址劃分 備註:第一個參數為DS18B20的內部地址,第二個參數用作設定 解析到之用

設定Serial 通訊協議 備註:這份例子裏,溫度數據會被傳送到電腦顯示


DS18B20 – 軟件設定 void loop() { //Send a ommand to DS18B20 and //ask it to do the conversion of temperature sensors.requestTemperatures(); //Send a string to PC through Serial Port Serial.print("Temperature :"); //Get Temperature Value from DS18B20 and send //to PC Serial.println(sensors.getTempC(tempD eviceAddress), 2); //Delay 500ms delay(500); }//end loop

要求DS18B20 IC 獲取即時的溫度數據

傳送文字『Temperature :』到電腦 sensors.getTempC(tempDeviceAddress),作用是獲取指定 地址的DS18B20 最新被要求獲取的溫度數據,之後會 將數據到傳送到電腦

延遲0.5秒 備註:1秒 = 1000毫秒 1s = 1000ms


Analog to Digital Converter Arduino 內置了Analog to Digital Converter (ADC) {

ADC 主要作用將模擬訊號(Analog Signal) 轉換成數字訊號 (Digital Signal)

Arduino Mega 2560 有16個Analog Input Pins 預設的Analog Reference 電壓 { { {

5V Arduino Boards,其 Analog Reference 電壓為 5V 3.3V Arduino Boards,其 Analog Reference 電壓為 3.3V 這個參數很重要

模擬訊號由 0V 至 Analog Reference 電壓變換成數字 訊號由 0至1023 表示


Analog to Digital Converter – 硬件設定


Analog to Digital Converter – 硬件設定 光敏電阻作為模擬訊號的來源 { { { {

這裏的光敏電阻,完全無光線照射,其電阻值大約為 150KOhm,在強光照射的狀況下,其電阻值大約為150Ohm。 其大約最小電壓:Vo = 0.3125V 其大約最大電壓:Vo = 4.92V 轉換成數字訊號 最小值:64 最大值:1008

64 至 1008 平均分成八級,每一級由一粒 LED 表示 100nF 電容是旁路電容,作用是減少雜訊(Noise) 當亮度去到第八級,單聲峰鳴器會發聲。


Analog to Digital Converter – 硬件設定 將 9012 Transistor 視為開關,其條件為 {

9012 的 Emitter 腳必須接電源(Vcc )

在這個簡報裏的例子 當 V = 0V, 9012 Transistor 為開的狀態 當 V = 5V, 9013 Transistor 為關的狀態


Analog to Digital Converter – 軟件設定 #define #define #define #define #define #define #define #define

LED_PIN1 LED_PIN2 LED_PIN3 LED_PIN4 LED_PIN5 LED_PIN6 LED_PIN7 LED_PIN8

42 41 40 39 38 37 36 35

#define BUZZER_PIN 34 #define maximum 990 #define minimum 0 int val=0; int interval = (maximum - minimum) / 8;

定義LED的 IO 連接端口

定義峰鳴器的 IO 連接端口 定義最大和最小的數字訊號值 val 變數,儲存數字訊號的數值 定義每一級的數值


Analog to Digital Converter – 軟件設定 void setup() { Serial.begin(115200); pinMode(LED_PIN1, OUTPUT); pinMode(LED_PIN2, OUTPUT); pinMode(LED_PIN3, OUTPUT); pinMode(LED_PIN4, OUTPUT); pinMode(LED_PIN5, OUTPUT); pinMode(LED_PIN6, OUTPUT); pinMode(LED_PIN7, OUTPUT); pinMode(LED_PIN8, OUTPUT); pinMode(BUZZER_PIN, OUTPUT); }//end setup

設定 Serial Communication Baud Rate 為115200 設定 LED 和 Buzzer 的 IO 端口為輸出狀態


Analog to Digital Converter – 軟件設定 void loop() { val = analogRead(0); Serial.println(val); if(val >= interval) digitalWrite(LED_PIN1, LOW); else digitalWrite(LED_PIN1, HIGH);

if(val >= interval * 2) digitalWrite(LED_PIN2, LOW); else digitalWrite(LED_PIN2, HIGH); if(val >= interval * 3) digitalWrite(LED_PIN3, LOW); else digitalWrite(LED_PIN3, HIGH); if(val >= interval * 4) digitalWrite(LED_PIN4, LOW); else digitalWrite(LED_PIN4, HIGH);

獲取 Analog Input 的訊號,並轉換成數字訊號 將訊號透過 Serial Communication 傳送到電腦 根據光的強度亮起第一粒 LED 燈 至第八粒 LED 燈


Analog to Digital Converter – 軟件設定 if(val >= interval * 5) digitalWrite(LED_PIN5, LOW); else digitalWrite(LED_PIN5, HIGH); if(val >= interval * 6) digitalWrite(LED_PIN6, LOW); else digitalWrite(LED_PIN6, HIGH); if(val >= interval * 7) digitalWrite(LED_PIN7, LOW); else digitalWrite(LED_PIN7, HIGH); if(val >= interval * 8){ digitalWrite(LED_PIN8, LOW); digitalWrite(BUZZER_PIN, LOW); }else{ digitalWrite(LED_PIN8, HIGH); digitalWrite(BUZZER_PIN, HIGH); } delay(200); }//end loop

當光強度為最大時,峰鳴器發聲


Analog to Digital Converter – 參考 http://arduino.cc/en/Reference/AnalogReference http://arduino.cc/en/Reference/AnalogRead


直流馬達控制 直流馬達在日常的控制系統裏較為常見。 直流馬達的控制線路可粗略分為兩種 {

直流馬達只能向一個方向運轉,順時針方向或逆時針方向 靈活性較低,線路亦相對簡單 這個方法不會在這個簡報裏作介紹

{

直流馬達可順時針方向或逆時針方向運轉 其原理是透過改變電流流入直流馬達的方向 靈活性較高,但線路較為複雜

這簡報裏的馬達驅動線路為 H-Bridge 馬達驅動線 路。 在這個例子裏,H-Bridge 的運作電壓 VCC 不能超過 30V,電流不能超過10A。


直流馬達控制 – H-Bridge 線路圖


直流馬達控制 – 器件 IRF9530 (Q1 和 Q2) 是 P-Channel Power MOSFET IRF530 (Q3 和 Q4) 是 N-Channel Power MOSFET 9013 (Q5 和 Q6) 是 NPN Bipolar Junction Transistor 詳細的運作原理和特性,現階段不需要作深入了解, 只將其視為一個開關去理解。

IRF9530 及 IRF530 的腳位圖 G = Gate D = Drain S = Source

9013 Transistor 的 腳位圖,下面所顯 示的是其底視圖 (Bottom View) E = Emiter B = Base C = Collector


直流馬達控制 – Power MOSFET MOSFET 其中一個重要的參數叫VTH (Threshold Voltage) {

IRF9530 和 IRF530 的VTH 大約為 3Volt (其絕對值),詳細的參數請參 考Datasheet。

P-Channel MOSFET, IRF9530 {

{

處於關閉的狀態,其條件為 VGS ≥ VTH 處於全開的狀態,其條件為 VGS ≤ VTH 及 |VDS| ≥ |(VGS - VTH)| ≥ 0

N-Channel MOSFET, IRF530 {

{

處於關閉的狀態,其條件為 VGS ≤ VTH 處於全開的狀態,其條件為 VGS ≥ VTH 及 VDS ≥ (VGS - VTH) ≥ 0


直流馬達控制 – Power MOSFET VGS = G腳和S腳之間的電壓 { {

數字電壓表 (Digital Meter):紅棒接G腳,黑棒接S腳 指針式電壓表 (Analog Meter): 量度IRF9530時 | 紅棒接S腳,黑棒接G腳,量度出來的數值是負數 量度IRF530時 | 紅棒接G腳,黑棒接S腳

VDS = D腳和S腳之間的電壓 { {

數字電壓表 (Digital Meter) :紅棒接D腳,黑棒接S腳 指針式電壓表 (Analog Meter): 量度IRF9530時 | 紅棒接S腳,黑棒接D腳,量度出來的數值是負數 量度IRF530時 | 紅棒接D腳,黑棒接S腳


直流馬達控制 – Transistor 將 9013 Transistor 視為開關,Emitter 腳必須接地 (Ground, GND) 在這個簡報裏的例子 V 當 V = 5V, 9013 Transistor 為開的狀態 當 V = 0V, 9013 Transistor 為關的狀態


直流馬達控制 – H-Bridge 運作原理 當 JP17 的 Pin1 = 5 V, Pin2 = 0V {

Q6 的 VC 約等於 0.7V,Q5 的 VC 等於 VCC Q1 和 Q4 處於關閉狀態 因此,電流會由Q2 通過,之後,會流入馬達,再經Q3 流入地 | 此時,馬達會向一個方向運轉

當 JP17 的 Pin1 = 0 V, Pin2 = 5V {

Q5 的 VC 約等於 0.7V,Q6 的 VC 等於 VCC Q2 和 Q3 處於關閉狀態 因此,電流會由Q1 通過,之後,會流入馬達,再經Q4 流入地 | 此時,馬達會逆方向運轉

當 JP17 的 Pin1 = 0 V 及 Pin2 = 0V,或者, Pin1 = 5 V 及 Pin2 = 5V {

馬達會停止運轉


直流馬達控制 – 硬件設定


直流馬達控制 – 硬件設定 在 上 述 的 硬 件 設 定 裏 的 電 容 C1 , 被 視 為 旁 路 電 容 (Bypass Capacitor),其主要作用是減低馬達運件其間所釋放出的干擾。由 於,馬達運作其間會產生反電動勢(Back EMF),因此,系統的運 作電壓會受到干擾,處於不穩定的狀態。 在上述的硬件設定裏的電容C2,其主要作用是穩定系統的運作電 壓。由於,馬達開關時的瞬間電流很大,而電池或者電源供應器 (電流限制的情況)不能瞬間將電流提高到馬達所需要的電流時,大 部份電流都會流入馬達,因而令到其他器件得不到足夠的電流運 作,令系統不穩定。 Arduino Board 的地(Ground)要與馬達的地連接。 注意: {

Arduino Board 最大的運作電壓為5V,千萬不要將馬達的運作電壓接 到Arduino Board上。


直流馬達控制– 軟件設定 //Define PinOut of DC Moto Control #define DC_ControlPin0 7 #define DC_ControlPin1 6 void setup() { //Set DC Motor Control Pins are Output pinMode(DC_ControlPin0, OUTPUT); pinMode(DC_ControlPin1, OUTPUT); }//end setup void loop() { //Make DC Motor turn left digitalWrite(DC_ControlPin0, HIGH); digitalWrite(DC_ControlPin1, LOW); delay(500); //Make DC Motor turn right digitalWrite(DC_ControlPin1, HIGH); digitalWrite(DC_ControlPin0, LOW); delay(500); //Make DC Motor Stop digitalWrite(DC_ControlPin0, LOW); digitalWrite(DC_ControlPin1, LOW); delay(500); }//end loop

定義直流馬達的控制腳

將直流馬達的控制腳設定為輸出狀態

當 DC_ControlPin0 = 1 及 DC_ControlPin1 = 0 直流馬達會向一個方向 運轉

當 DC_ControlPin0 = 0 及 DC_ControlPin1 = 1 直流馬達會逆方向運轉

當 DC_ControlPin0 = 0 及 DC_ControlPin1 = 0 直流馬達停止運轉


直流馬達控制 – 參考 控制直流馬達的轉向和速度 {

http://www.arduino.cc/playground/Main/DCMotorControl

馬達驅動原理 {

http://www.thebox.myzen.co.uk/Workshop/Motors_1.html

使用 H‐Bridge 線路控制直流馬達 { { {

http://mfa.techart.tnua.edu.tw/~m9793012/blog/?p=165 http://en.wikipedia.org/wiki/H_bridge http://itp.nyu.edu/physcomp/Labs/DCMotorControl

旁路電容 ( Bypass Capacitor) {

http://www.seattlerobotics.org/encoder/jun97/basics.html

Note: All above websites are visited on 5th Nov. 2011


步進馬達(Step Motor / Stepper) 步進馬達在日常的控制系統裏較為常見,它能夠準確 地控制所需要的機械動作。 Unipolar Step Motor 的驅動線路較為簡單,只需一粒 ULN2803 IC。


步進馬達(Step Motor / Stepper) 每一個狀態之間的改變為 1.8度。(e.g. 1->2, 2->3) 狀態改變後,需要等待一 段時間。(e.g. 10ms) 全步進角

這個例子裏,Unipolar Step Motor 的全步進角為 1.8度,運作電壓為12V。 Unipolar Step Motor 的 圖示

狀態

A

C

B

D

1

1

0

1

0

2

0

1

1

0

3

0

1

0

1

Forward

4 1 0 0 1 注意:這裏的1代表12V, 並不是5V。

Backward


步進馬達(Step Motor / Stepper) 每一個狀態之間的改變為 0.9度。(e.g. 1->2, 2->3) 狀態改變後,需要等待一 段時間。(e.g. 10ms) 半步進角

全步進角為1.8度,而半 步進角為0.9度。 Unipolar Step Motor 的 圖示

注意:這裏的1代表12V, 並不是5V。

狀態

A

C

B

D

1

1

0

0

0

2

1

0

1

0

3

0

0

1

0

4

0

1

1

0

5

0

1

0

0

6

0

1

0

1

7

0

0

0

1

8

1

0

0

1

Forward

Backward


步進馬達(Step Motor / Stepper) – 硬件設定


步進馬達(Step Motor / Stepper) – 軟件設定 unsigned char FULL_STEPS[] = {0x0A, 0x06, 0x05, 0x09}; unsigned char HALF_STEPS[] = {0x08, 0x0A, 0x02, 0x06, 0x04, 0x05, 0x01, 0x09};

int int int int

StepperPin0 StepperPin1 StepperPin2 StepperPin3

= = = =

定義 半步進角的狀態 定義 步進馬達的接線腳位

43; 44; 45; 46;

void setup() { pinMode(StepperPin0, pinMode(StepperPin1, pinMode(StepperPin2, pinMode(StepperPin3, }//end setup

定義 全步進角的狀態

OUTPUT); OUTPUT); OUTPUT); OUTPUT);

void loop() { full_step_forward(200, 20); full_step_backward(200, 20); delay(2000); half_step_forward(200, 20); half_step_backward(200, 20); delay(1000); }//end loop

將步進馬達的連接口,設為輸出狀態。

全步進角順時運行一圈,之後逆時運行一圈。

半步進角順時運行半圈,之後逆時運行半圈。


步進馬達(Step Motor / Stepper) – 軟件設定 void full_step_forward(int steps, unsigned long delay_ms) { int i=0, j=0; for(i=0; i<steps; i++) { if((FULL_STEPS[j] & 0x08) == 0x08) digitalWrite(StepperPin0, HIGH); else digitalWrite(StepperPin0, LOW); if((FULL_STEPS[j] & 0x04) == 0x04) digitalWrite(StepperPin1, HIGH); else digitalWrite(StepperPin1, LOW); if((FULL_STEPS[j] & 0x02) == 0x02) digitalWrite(StepperPin2, HIGH); else digitalWrite(StepperPin2, LOW); if((FULL_STEPS[j] & 0x01) == 0x01) digitalWrite(StepperPin3, HIGH); else digitalWrite(StepperPin3, LOW);

全步進角的順行針運行的控制Function


步進馬達(Step Motor / Stepper) – 軟件設定 j++; if(j == 4) j=0; delay(delay_ms); }//end for }//end full_step_forward


步進馬達(Step Motor / Stepper) – 軟件設定 void full_step_backward(int steps, unsigned long dly_ms) { int i=0, j=3; for(i=0; i<steps; i++) { if((FULL_STEPS[j] & 0x08) == 0x08) digitalWrite(StepperPin0, HIGH); else digitalWrite(StepperPin0, LOW); if((FULL_STEPS[j] & 0x04) == 0x04) digitalWrite(StepperPin1, HIGH); else digitalWrite(StepperPin1, LOW); if((FULL_STEPS[j] & 0x02) == 0x02) digitalWrite(StepperPin2, HIGH); else digitalWrite(StepperPin2, LOW); if((FULL_STEPS[j] & 0x01) == 0x01) digitalWrite(StepperPin3, HIGH); else digitalWrite(StepperPin3, LOW);

全步進角的逆行針運行的控制Function


步進馬達(Step Motor / Stepper) – 軟件設定 j--; if(j == -1) j=3; delay(dly_ms); }//end for }//end full_step_backward


步進馬達(Step Motor / Stepper) – 軟件設定 void half_step_forward(int steps, unsigned long delay_ms) { int i=0, j=0; for(i=0; i<steps; i++) { if((HALF_STEPS[j] & 0x08) == 0x08) digitalWrite(StepperPin0, HIGH); else digitalWrite(StepperPin0, LOW); if((HALF_STEPS[j] & 0x04) == 0x04) digitalWrite(StepperPin1, HIGH); else digitalWrite(StepperPin1, LOW); if((HALF_STEPS[j] & 0x02) == 0x02) digitalWrite(StepperPin2, HIGH); else digitalWrite(StepperPin2, LOW); if((HALF_STEPS[j] & 0x01) == 0x01) digitalWrite(StepperPin3, HIGH); else digitalWrite(StepperPin3, LOW);

半步進角的順行針運行的控制Function


步進馬達(Step Motor / Stepper) – 軟件設定 j++; if(j == 8) j=0; delay(delay_ms); }//end for }//end half_step_forward


步進馬達(Step Motor / Stepper) – 軟件設定 void half_step_backward(int steps, unsigned long dly_ms) { int i=0, j=7; for(i=0; i<steps; i++) { if((HALF_STEPS[j] & 0x08) == 0x08) digitalWrite(StepperPin0, HIGH); else digitalWrite(StepperPin0, LOW); if((HALF_STEPS[j] & 0x04) == 0x04) digitalWrite(StepperPin1, HIGH); else digitalWrite(StepperPin1, LOW); if((HALF_STEPS[j] & 0x02) == 0x02) digitalWrite(StepperPin2, HIGH); else digitalWrite(StepperPin2, LOW); if((HALF_STEPS[j] & 0x01) == 0x01) digitalWrite(StepperPin3, HIGH); else digitalWrite(StepperPin3, LOW);

半步進角的逆行針運行的控制Function


步進馬達(Step Motor / Stepper) – 軟件設定 j--; if(j == -1) j=7; delay(dly_ms); }//end for }//end full_step_backward


無線通訊 – nRF24L01+模塊 nRF24L01+ 模塊是基於 nRF24L01+ 的IC來實行 無線電通迅。 Arduino 函式庫(Library) {

由香港中文大學電子工程 系提供 只能在 Shock Burst Mode 或 Dynamic Payload Length Mode 運作。

注意:使用nRF24L01+ IC 必須參考Datasheet。

nRF24L01+模槐

http://trade.taobao.com /trade/detail/tradeSnap. htm?tradeID=105257706 403316


無線通訊 – nRF24L01+模塊 nRF24L01+ IC { { { { { { {

無線頻率為2.4GHz 125 Channels 6 Data Pipes 負載32Bytes (Max.) 可設定為傳送或接收模式,並不能同一時處於傳送和接收狀態 運作電壓為1.9V-3.3V 當控制腳的輸入電壓大於3.6V時,運作電壓必須為2.7V-3.3V。


無線通訊 – nRF24L01+模塊 – 硬件設定(傳送)


無線通訊 – nRF24L01+模塊 – 硬件設定(接收)


無線通訊 – nRF24L01+模塊 – 軟件設定 (傳送) #include <nRF24L01P.h>

nRF24L01+ 的函式庫

//Target Board's Address unsigned char TX_Addr[5] ={0x12, 0xDE, 0x78, 0x98, 0xDF};

定義目標板的地址 定義 本板的接收地址

//Address of this program's board unsigned char RX_Addr[5] ={0xFF, 0xCD, 0xAB, 0xE7, 0x72}; //Data to be sent unsigned char DATA[3][11] = {"QWERTYUIOP", "ASDFGHJKL0", "MNBVCXZ346"};

會被傳送的數據

unsigned char i; //Assignment nRF24L01P Pin to Arduino Mega //Prototype nRF24L01P(CE_Pin, CSN_Pin, CLK_Pin, //MOSI_Pin, MISO); nRF24L01P RF(7, 6, 5, 4, 3);

定義nRF24L01+ 的IO腳


無線通訊 – nRF24L01+模塊 – 軟件設定 (傳送) void setup() { //Use the on board LED pinMode(13, OUTPUT);

使用 Arduino Mega 2560 板上的LED

//Initialize the nRF24L01+ RF module RF.DefaultShockBurstSetting(); //Set Address Width is 5 Bytes RF.setAddressWidth(5); //Set Target Board's Address RF.setTXAddress(TX_Addr, 5);

with 5 Bytes

//Data Pipe 0's RX Address MUST be same as //target board's address //This is required for auto acknowledgement //function RF.setRXAddress(TX_Addr, 5, 0); //Use Data Pipe 1 as main receiver channel //of this board RF.setRXAddress(RX_Addr, 5, 1);

將nRF24L01+模式設為在 Shock Burst Mode 下運作

定義地址的長度為 5 Bytes 設定目標板的地址,而其長度為 5 Bytes

使用Auto Acknowledgement 的功能,必須將Data Pipe 0 的接收地址和目標板的地址設為一樣。

設定本板的 Data Pipe 1的接收地址


無線通訊 – nRF24L01+模塊 – 軟件設定 (傳送) //set Payload Width is 10 Bytes in Data Pipe 0 //Payload means number of bytes of data //which to be received //******************************************* //* Note: * //* Please always keep in mind that the * //* receiver data pipe payload length MUST * //* be the length of transmitted data. * //* Othwerise, receiver will not receive * //* any data. * //******************************************* RF.setRXPayloadWidth(0, 10); //set Payload Width is 10 Bytes in Data Pipe 1 RF.setRXPayloadWidth(1, 10); }//end setup

設定Data Pipe 0接收數據的長度 設定Data Pipe 1接收數據的長度

注意:傳送板的數據長度必須與接收板的接收數據長 度為一樣。


無線通訊 – nRF24L01+模塊 – 軟件設定 (傳送) void loop() { //Send data to target board for(i=0; i<3; i++) { //Send out 10 bytes data RF.Transmit(DATA[i], 10); //The data cannot be sent //to target board. The on //board LED will be flashed. if(!RF.isTransmitted()) { digitalWrite(13, HIGH); delay(200); digitalWrite(13, LOW); delay(200); } //Delay 500ms delay(500); }//end for loop }//end loop

使用 For Loop 傳送三組數據 傳送數據

數據不能傳送到目標板,LED會閃爍。


無線通訊 – nRF24L01+模塊 – 軟件設定 (接收) #include <nRF24L01P.h>

nRF24L01+ 的函式庫

//Address of this program's board unsigned char RX_Addr[5] ={0x12, 0xDE, 0x78, 0x98, 0xDF};

定義 本板的接收地址

//Target Board's Address unsigned char TX_Addr[5] ={0xFF, 0xCD, 0xAB, 0xE7, 0x72};

定義目標板的地址

unsigned char i; //Assignment nRF24L01P Pin to Arduino Mega //Prototype nRF24L01P(CE_Pin, CSN_Pin, CLK_Pin, //MOSI_Pin, MISO); nRF24L01P RF(7, 6, 5, 4, 3);

定義nRF24L01+ 的IO腳


無線通訊 – nRF24L01+模塊 – 軟件設定 (接收) void setup() { //Set Baudrate 115200 Serial.begin(115200);

使用Serial Communication ,Baud rate 為115200

//Use the on board LED pinMode(13, OUTPUT);

使用 Arduino Mega 2560 板上的LED

//Initialize the nRF24L01+ RF module RF.DefaultShockBurstSetting();

將nRF24L01+模式設為在 Shock Burst Mode 下運作

//Set Address Width is 5 Bytes RF.setAddressWidth(5);

定義地址的長度為 5 Bytes

//Set Target Board's Address with 5 Bytes RF.setTXAddress(TX_Addr, 5);

設定目標板的地址,而其長度為 5 Bytes

//Data Pipe 0's RX Address MUST be same as //target board's address //This is required for auto acknowledgement //function RF.setRXAddress(TX_Addr, 5, 0); //Use Data Pipe 1 as main receiver channel //of this board RF.setRXAddress(RX_Addr, 5, 1);

使用Auto Acknowledgement 的功能,必須將Data Pipe 0 的接收地址和目標板的地址設為一樣。

設定本板的 Data Pipe 1的接收地址


無線通訊 – nRF24L01+模塊 – 軟件設定 (接收) //set Payload Width is 10 Bytes in Data Pipe 0 //Payload means number of bytes of data //which to be received //******************************************* //* Note: * //* Please always keep in mind that the * //* receiver data pipe payload length MUST * //* be the length of transmitted data. * //* Othwerise, receiver will not receive * //* any data. * //******************************************* RF.setRXPayloadWidth(0, 10); //set Payload Width is 10 Bytes in Data Pipe 1 RF.setRXPayloadWidth(1, 10); }//end setup

設定Data Pipe 0接收數據的長度

設定Data Pipe 1接收數據的長度 注意:傳送板的數據長度必須與接收板的接收數據長 度為一樣。


無線通訊 – nRF24L01+模塊 – 軟件設定 (接收) void loop() { //Data Received if(RF.Available()) { //Flash on board LED digitalWrite(13, HIGH); delay(50); digitalWrite(13, LOW); delay(50); //To obtain the received data from // nRF24L01+ RF module //DataPipe for holding that the data is //came from which data pipe //DataWidth for holding the number of bytes // of received data //If Data Pipe and Data Width are not been //cared, //RF.getData(ReceivedData) can be used. RF.getData(ReceivedData, &DataPipe, &DataWidth);

接收數據了 LED 閃爍

獲接數據,Data Pipe ,數據長度 注:若果不在乎Data Pipe 及數據長度可以使用 RF.getData(ReceivedData)。


無線通訊 – nRF24L01+模塊 – 軟件設定 (接收) //Send to PC Serial.print("Payload / Received Data: "); for(i=0; i<DataWidth; i++) Serial.print(ReceivedData[i]); Serial.print("\n"); Serial.print("From Data Pipe: "); Serial.println(DataPipe, DEC); Serial.print("Data Width in Byte(s): "); Serial.println(DataWidth, DEC); Serial.print("\n"); }//end if }//end loop

將數據透過 Serial Communication 傳送到電腦


無線通訊 – nRF24L01+模塊 – 參考 Datasheet {

{

http://www.nordicsemi.com/kor/Products/2.4GHzRF/nRF24L01P http://www.nordicsemi.com/kor/nordic/download_resource/ 8765/2/52101226


Visual Basic .Net 2010 Visual Basic .Net 2010 Express 是一套免費的 Windows 軟件開發工具 {

http://www.microsoft.com/visualstudio/enus/products/2010-editions/express

Visual Basic .Net 能夠快捷到開發 Windows GUI 軟件 應用程式 可以利用 Visual Basic .Net 裏 SerialPort Components 會實現與 Arduino Board 溝通,甚至可以實現即時監 控功能。


Visual Basic .Net 2010 主界面


Visual Basic .Net 2010 SerialPort Component 可以Toolbox -> All Windows Form 找到 使用SerialPort 前,需要設定二項參數 { {

SerialPort.PortName = “COM1” SerialPort.BaudRate = 115200

接着,使用 SerialPort.open() 這條指令 來監控 Serial Communication 讀取Serial Communication 資料 { {

Data = SerialPort.read() Data = SerialPort.readline()


Visual Basic .Net 2010 透過 SerialPort 傳送資料 { {

SerialPort.Write(Data_to_be _sent) SerialPort.WriteLine(Data_to_be _sent)


Visual Basic .Net 2010 ─ 參考 http://msdn.microsoft.com/enus/vstudio/hh388568 http://msdn.microsoft.com/enus/library/system.io.ports.serialport.aspx http://tiktakx.wordpress.com/2010/11/21/serialport-interfacing-with-vb-net-2010/


Eia workshop