arduino workshop in macau

113
2014.08.04~05 主辦:藝術無國界 贊助機構:澳門文化局 課程講師:張傑名(Jimmy) ARDUINO 自造機工作坊

Upload: chieh-ming-chang

Post on 24-Jun-2015

298 views

Category:

Devices & Hardware


7 download

TRANSCRIPT

Page 1: Arduino workshop in Macau

2014.08.04~05 主辦:藝術無國界 贊助機構:澳門文化局 課程講師:張傑名(Jimmy)

ARDUINO 自造機工作坊

Page 2: Arduino workshop in Macau
Page 3: Arduino workshop in Macau
Page 4: Arduino workshop in Macau
Page 5: Arduino workshop in Macau
Page 6: Arduino workshop in Macau

What is Arduino?

Page 7: Arduino workshop in Macau
Page 8: Arduino workshop in Macau

Arduino robotics

Page 9: Arduino workshop in Macau

VertiBOT

Page 10: Arduino workshop in Macau

8x8x8 LED

Page 11: Arduino workshop in Macau

EyeWriter

Page 12: Arduino workshop in Macau

Secret Knock Door Lock

Page 13: Arduino workshop in Macau

Turn Signal Biking Jacket

Page 14: Arduino workshop in Macau

Botanicalls

Page 15: Arduino workshop in Macau

Sigh Collector

Page 16: Arduino workshop in Macau

Tweet a watt

Page 17: Arduino workshop in Macau

Bubblesteen

Page 18: Arduino workshop in Macau

Air Drums

Page 19: Arduino workshop in Macau

Cloud

Page 20: Arduino workshop in Macau

Flappy Bird in a Box

Mario in a Box

Page 21: Arduino workshop in Macau

Super Angry Birds

Page 22: Arduino workshop in Macau

Moody Useless Machines

Page 23: Arduino workshop in Macau

Knock Knock

Page 24: Arduino workshop in Macau

Moving Mario

Page 25: Arduino workshop in Macau

Pinokio

Page 26: Arduino workshop in Macau

Laser Harp

Page 27: Arduino workshop in Macau

Football Hero

Page 28: Arduino workshop in Macau

CirCAT Board

Page 29: Arduino workshop in Macau

MaKey MaKey

Page 30: Arduino workshop in Macau

Mimicry

Page 31: Arduino workshop in Macau

Reference

Page 32: Arduino workshop in Macau

What is Arduino?

Arduino is an open-source electronics platform based on easy-to-use hardware and software. It's intended for anyone making interactive projects.

Page 33: Arduino workshop in Macau

Massimo Banzi

David Cuartielles

Page 34: Arduino workshop in Macau

Board

http://arduino.cc/en/Main/ArduinoBoardUno

Page 35: Arduino workshop in Macau

Schematic

http://arduino.cc/en/Main/ArduinoBoardUno

Page 36: Arduino workshop in Macau
Page 37: Arduino workshop in Macau
Page 38: Arduino workshop in Macau

Types of Arduino

Page 39: Arduino workshop in Macau

Arduino UNO

Page 40: Arduino workshop in Macau

Arduino MEGA

Page 41: Arduino workshop in Macau

Arduino NANO

Page 42: Arduino workshop in Macau

Arduino MINI

Page 43: Arduino workshop in Macau

LilyPad

Page 44: Arduino workshop in Macau

Arduino Shield

Page 45: Arduino workshop in Macau

http://shieldlist.org

Shield List

Page 46: Arduino workshop in Macau

http://shieldlist.org

Page 47: Arduino workshop in Macau

Ethernet

Page 48: Arduino workshop in Macau

Motor Shield

Page 49: Arduino workshop in Macau

Wave Shield

Page 50: Arduino workshop in Macau

RFID Shield

Page 51: Arduino workshop in Macau

XBee

Page 52: Arduino workshop in Macau

Extreme Sensor Kit

Page 53: Arduino workshop in Macau
Page 54: Arduino workshop in Macau
Page 55: Arduino workshop in Macau
Page 56: Arduino workshop in Macau

Where To Buy?

Page 57: Arduino workshop in Macau

Handbook

Page 58: Arduino workshop in Macau

Handbook

Page 59: Arduino workshop in Macau

Circuit Sketch

Page 60: Arduino workshop in Macau

Fritzing

Page 61: Arduino workshop in Macau

123D Circuits

Page 62: Arduino workshop in Macau

Electronics Toolkit

Page 63: Arduino workshop in Macau
Page 64: Arduino workshop in Macau

Specification

Page 65: Arduino workshop in Macau
Page 66: Arduino workshop in Macau

ATmega328 ( Single Chip Microcomputer )

Flash Memory : 32KB儲存⾃自定程式碼及開機程式

!SRAM : 2KB

暫存程式執⾏行中所需要的資料

EEPROM : 1KB 儲存程式永久資料

Clock Speed : 16 MHz

Analog Input x 6 pins Digital I/O Pins : 14

Page 67: Arduino workshop in Macau

One Chip Arduino

Page 68: Arduino workshop in Macau

PWM x 14 pins

Digital I/O x 14 pins

Analog Input x 6 pins

ATMEGA328P

Type-B USB

DC Jack

Input / Output

Page 69: Arduino workshop in Macau

Development Tools

Page 70: Arduino workshop in Macau

Lets Get Rocked…

Page 71: Arduino workshop in Macau
Page 72: Arduino workshop in Macau

http://arduino.cc/en/Main/Software

Page 73: Arduino workshop in Macau
Page 74: Arduino workshop in Macau
Page 75: Arduino workshop in Macau
Page 76: Arduino workshop in Macau
Page 77: Arduino workshop in Macau

ctrl + u

Done compiling

Page 78: Arduino workshop in Macau

Hello World

Page 79: Arduino workshop in Macau

communication

Analog I/O

Digital I/O重

點精 華

Page 80: Arduino workshop in Macau

Digital I/O x 14 pins

ATMEGA328P

Page 81: Arduino workshop in Macau

A.標準LED B.雙⾊色或三⾊色(RGB)LED C.閃光LED D.紅外線(IR)LED E.⻝⾷食⼈人⿂魚LED(⾼高功率LED) F.表⾯面黏著型LED(SMD) G.紫外線LED(⿊黑光LED)

LED

+ _

A B D E

F

+_

電路符號

Page 82: Arduino workshop in Macau

A.碳膜電阻 B.⽔水泥電阻 C.可變電阻(電位計) D.滑桿電阻

Resistor電路符號

A

B

C

D

Page 83: Arduino workshop in Macau

A.按鈕/鍵開關 B.⽔水銀開關 C.微動開關 D.震動開關 E.磁簧開關 F.搖頭開關

Switch/Button

電路符號

A

BC

D

E F

Page 84: Arduino workshop in Macau

數位輸出像電池⼀一樣可提供⾼高電位(正極)每個腳位最⼤大可輸出40mA 加⼊入負載元件連接⾄至地極便可形成⼀一個可控制的迴路

1 0 1 0 1 0 1 0

0V

5V

Page 85: Arduino workshop in Macau

Digital Output

int led = 13; !void setup() { pinMode(led, OUTPUT); } !void loop() { digitalWrite(led, HIGH); delay(1000); digitalWrite(led, LOW); delay(1000); }

Page 86: Arduino workshop in Macau

Digital Output

int LEDs[] = {9,11,13}; int total = sizeof(LEDs); int index = 0; !void setup() { for(int i=0; i<total; i++) { pinMode(LEDs[i], OUTPUT); } } !void loop() { for(int i=0; i<total; i++) { digitalWrite(LEDs[i], LOW); } digitalWrite(LEDs[index], HIGH); index++; if(index == total) index=0; delay(200); }

Page 87: Arduino workshop in Macau

7-Segment Display

共負或共正

共負或共正

共負:負極都接在⼀一起

共正:正極都接在⼀一起

Page 88: Arduino workshop in Macau

Digital Output

int LEDs[] = {2,3}; int total = sizeof(LEDs); int index = 0; !void setup() { for(int i=0; i<total; i++) { pinMode(LEDs[i], OUTPUT); } } !void loop() { for(int i=0; i<total; i++) { digitalWrite(LEDs[i], LOW); } }

共正極

Page 89: Arduino workshop in Macau

Shift Register

輸⼊入間隔

最後同時⼀一次輸出

74HC595

10110111 1 0 1 1 0 1 1 1

Page 90: Arduino workshop in Macau

Digital Output

int dataPin = 9; int gatePin = 11; int clockPin = 12; !void setup() { pinMode(dataPin, OUTPUT); pinMode(gatePin, OUTPUT); pinMode(clockPin, OUTPUT); } !void loop() { digitalWrite(gatePin, LOW); shiftOut(dataPin, clockPin, LSBFIRST, B00000011); digitalWrite(gatePin, HIGH); }

12

8

34 56 7B00000011LSBFIRST

18

Page 91: Arduino workshop in Macau

數位輸⼊入可提供低電位(接地)每個腳位最⼤大可輸⼊入40mA 通常與開關連接形成迴路 來控制輸出或通訊

1 0 1 0 1 0 1 0

0V

5V

Page 92: Arduino workshop in Macau

13

pin D11

9

按住亮,放開暗

Page 93: Arduino workshop in Macau

Digital Input

int led = 13; int send = 11; int receive = 9; !void setup() { pinMode(led, OUTPUT); pinMode(send, OUTPUT); pinMode(receive, INPUT); } !void loop() { digitalWrite(send, HIGH); boolean val = digitalRead(receive); if(val) digitalWrite(led, HIGH); else digitalWrite(led, LOW); }

Page 94: Arduino workshop in Macau

彈跳 (Bouncing)這是機械開關最常⾒見的問題 我們以為只有按⼀一次 但實際上會產⽣生多次按壓的現象 雖然發⽣生在幾微秒的時間內 卻⾜足以上微電腦記錄下來造成誤判

期望 00000001111111111111 實際 00000000100101111111

按下 放開按下

放開

Page 95: Arduino workshop in Macau

消除彈跳 (De-Bouncing)硬體解法:RC電路

軟體解法:當程式在讀取輸⼊入腳位的狀態並且偵測到變化時,在⼀一定時間的延遲後再進⾏行⼀一次讀取⼯工作。如果程式確認狀態有變化 則代表開關/按鈕已經改變了位置。

Page 96: Arduino workshop in Macau

Digital Input

int led = 13; int send = 11; int receive = 9; boolean oldState = LOW; boolean nowState = LOW; !void setup() { pinMode(led, OUTPUT); pinMode(send, OUTPUT); pinMode(receive, INPUT); oldState = digitalRead(receive); } !void loop() { digitalWrite(send, HIGH); boolean r1 = digitalRead(receive);

Page 97: Arduino workshop in Macau

Digital Input

if(r1 != oldState) { delay(20); boolean r2 = digitalRead(receive); if(r1 == r2) { oldState = r1; nowState = !nowState; digitalWrite(led, nowState); } } }

Page 98: Arduino workshop in Macau

按下,放開,亮按下,放開,暗按下,放開,亮

Practice 1

Practice 2按住三秒,閃爍三秒 像機器Reset情形

Page 99: Arduino workshop in Macau

Digital Input

#include <IRremote.h> int RECV_PIN = 13; IRrecv irrecv(RECV_PIN); decode_results results; !void setup() { irrecv.enableIRIn(); pinMode(9, OUTPUT); } !void loop() { if (irrecv.decode(&results)) { if(results.value == 16593103) digitalWrite(9, HIGH); else digitalWrite(9, LOW); } }

對準IR接收器 按下遙控器電源鍵

Page 100: Arduino workshop in Macau

Digital Input

int irRece = 10; int led = 13; !void setup() { pinMode(led, OUTPUT); pinMode(irRece, INPUT); digitalWrite(led, LOW); } !void loop() { boolean val = digitalRead(irRece); if (val) digitalWrite(led, HIGH); else digitalWrite(led, LOW); }

IR接收

IR發射

Page 101: Arduino workshop in Macau

ATMEGA328P

Analog Input x 6 pins

Page 102: Arduino workshop in Macau

類⽐比輸⼊入不同於數位訊號只有兩種狀態 類⽐比訊號為⼀一串連續的數值 在Arduino代表0V~5V之間可能的數值 透過內建A/D轉換器進⾏行取樣

Page 103: Arduino workshop in Macau

Potentiometerc

電流從A流⼊入,CW與CB流出,當W為量測腳位時 測量到的電阻值為AC

+ _

Page 104: Arduino workshop in Macau

int pot = 0; int led = 13; !void setup() { pinMode(led, OUTPUT); pinMode(pot, INPUT); Serial.begin(9600); } !void loop() { boolean val = analogRead(pot); Serial.println(val); digitalWrite(led, HIGH); delay(val); digitalWrite(led, LOW); delay(val); }

Analog Input

按下IDE右上⽅方 圖⽰示

將數據顯⽰示在Serial Monitor

Page 105: Arduino workshop in Macau

Analog Input

int pot = 0; int led = 13; !void setup() { pinMode(led, OUTPUT); pinMode(pot, INPUT); Serial.begin(9600); } !void loop() { boolean val = analogRead(pot); Serial.println(val); digitalWrite(led, HIGH); delay(val); digitalWrite(led, LOW); delay(val); }

將可以換成蜂鳴⽚片 觀察在Monitor的數值變化 (中間接正,外圈接負)

Page 106: Arduino workshop in Macau

PWM

橫軸為時間,analogWrite(64)代表在⼀一個⼯工作週期的時間中,⾼高電位(5V)的時間佔整個週期時間的25%, 所以平均來看像是提供了1.25V的電⼒力,因此利⽤用此概念,我們可以⽤用來控制LED的亮度或⾺馬達的轉速

t

t

t

t

t

Page 107: Arduino workshop in Macau

Analog Outputint analogOutPin = 11; !void setup() { pinMode(analogOutPin, OUTPUT); } !void loop() { analogWrite(analogOutPin, 0); delay(500); analogWrite(analogOutPin, 64); delay(500); analogWrite(analogOutPin, 128); delay(500); analogWrite(analogOutPin, 255); delay(500); analogWrite(analogOutPin, 128); delay(500); analogWrite(analogOutPin, 64); delay(500); }

最亮

Page 108: Arduino workshop in Macau

Analog Output

#include <Servo.h> Servo myservo; int pot = 0; int val; !void setup() { myservo.attach(9); } !void loop() { val = analogRead(pot); val = map(val, 0, 1023, 0, 179); myservo.write(val); delay(15); }

讀⼊入類⽐比訊號數值介於0~1023,透過map⽅方法 將數值依照⽐比例轉換為0~179數值

Page 109: Arduino workshop in Macau

ATMEGA328P

serial communication

Page 110: Arduino workshop in Macau

Serial Communication

int led = 11; !void setup() { pinMode(led, OUTPUT); Serial.begin(9600); digitalWrite(led, LOW); } !!void loop() { if(Serial.available()>0) { int val = Serial.read(); Serial.println(val); if(val==97) { digitalWrite(led, HIGH); } } }

代表有收到資料

傳送過來的數值會轉換為 ascii碼,因此97代表⼩小寫‘a’

Page 111: Arduino workshop in Macau

Serial Communication

利⽤用Aeduino上的Serial Library我們可以很容易的利⽤用任何⼀一種⼯工具語⾔言來跟Aeduino進⾏行資料傳輸與溝通,以下我們將透過Apache來架設網⾴頁伺服器,並利⽤用PHP的Serial⽅方法與Aeduino進⾏行溝通 !⾸首先安裝XAMPP這套整合軟體,其內建Apache + MySQL + PHP,可以幫助我們輕鬆地建⽴立網⾴頁開發環境,接著只需要三⾏行PHP程式碼我們就透過網⾴頁跟Arduino溝通囉!

XAMPP https://www.apachefriends.org/zh_tw/index.html

=

Page 112: Arduino workshop in Macau

Serial Communication

XAMPP安裝完成後,打開manager-osx管理介⾯面中的Manage Servers並按下右⽅方Start鍵,接著在瀏覽器網址列地⽅方輸⼊入127.0.0.1或localhost,若有看到XAMPP歡迎畫⾯面代表你安裝成功囉! !!!!!!若Apache Web Server無法啟動,請打開MAC終端 機輸⼊入sudo apachectl stop

Page 113: Arduino workshop in Macau

Serial Communication

接著我們在應⽤用程式找到XAMPP資料夾,其中htdocs中我們可以看到⼀一個名為index.php的檔案,⽤用⽂文字編輯器打開index.php,刪除所有內容後輸⼊入以下程式碼並存檔: !<?php $fp =fopen("連接埠", "w"); fwrite($fp, 'a'); fclose($fp); ?> !

window作業系統在連接埠填⼊入如”COM?” mac作業系統則填⼊入如”/dev/tty.usbmodem?”

最後打開瀏覽器並在網址列中輸⼊入127.0.0.1,此時網⾴頁會透過Serial傳送⼀一個⼩小寫的’a’字元給Arduino,Arduino在接收到資料後便會將LED點亮