星期一, 5月 13, 2013

Arduino筆記(十一):繼電器控制風扇

[2013/05/11]
遙控器的應用在一般家電是常見的,如電視遙控器、冷氣開關等都是利用紅外線遙控的方式控制家電的開關或調整。如果使用Arduino該如何做呢?就需要使用紅外線接收的晶體,作為接收訊號用,如果要控制啟動12V的風扇,就需要外接12V電源,並使用繼電器來控制,如果把兩項功能結合,就可以透過紅外線遙控風扇開關,這項功能在一般的電扇中很常見,我們就來看看如何使用Arduino進行控制。

[基礎知識]

繼電器(Relay),也稱電驛,是一種電子控制器件,它具有控制系統(又稱輸入迴路)和被控制系統(又稱輸出迴路),通常應用於自動控制電路中,它實際上是用較小的電流去控制較大電流的一種「自動開關」。故在電路中起著自動調節、安全保護、轉換電路等作用。[資料來源:維基百科]

[材料]

•麵包板 x 1
•Arduino 主板 x 1
•直流 12V 風扇 x 1
•紅外線接收晶體 x 1
•一路或二路繼電器模組 x 1
•連接線 x N條


[線路連接與電路圖]

•將繼電器模組的接地GND連接Arduino主版的GND,5V接繼電器的VSS, n1接 Pin 2接腳,電扇的紅色線(正極)接12V的正極,負極接到繼電器的常閉一個接點,再將共極接到12V的負極。
•紅外線接收器有三隻接腳,我用的接收器因型號不明,我用實驗的方式測試出接腳的位置,兩隻腳接分別接5V及接地,第三隻接腳則接pin 4。







[程式]

/* 紅外線遙控+繼電器控制 12V風扇 */

#include <IRremote.h>     // 引用 IRRemote 函式庫

const int irReceiverPin = 4;    // 紅外線接收器 OUTPUT 訊號接在 pin 2
int motor = 2;

IRrecv irrecv(irReceiverPin);   // 定義 IRrecv 物件來接收紅外線訊號
decode_results results;   // 解碼結果將放在 decode_results 結構的 result 變數裏

void setup()
{
  Serial.begin(9600);      // 開啟 Serial port, 通訊速率為 9600 bps
  irrecv.enableIRIn();     // 啟動紅外線解碼
  pinMode(motor, OUTPUT);     
}

void loop() 
{
  if (irrecv.decode(&results)){ // 解碼成功,收到一組紅外線訊號
            Serial.print("Protocol: ");  // 印到 Serial port  
  
      // 判斷紅外線協定種類
            switch(results.decode_type) {
        case NEC:
          Serial.print("NEC");
          break;
        case SONY:
          Serial.print("SONY");
          break;
        case RC5:
          Serial.print("RC5");
          break;
        case RC6:
          Serial.print("RC6");
          break;
        default:
          Serial.print("Unknown encoding");  
    }  

    Serial.print("  irCode: ");            
    Serial.print(results.value);    // 紅外線編碼
         if (results.value == 16724175) {  //遙控器上的 0
        digitalWrite(motor, LOW);
    }  
    if (results.value == 16738455) {  //遙控器上的 1
        digitalWrite(motor, HIGH);
    }    
    Serial.print(",  bits: ");           
    Serial.println(results.bits);   // 紅外線編碼位元數
    delay(500);
  irrecv.resume();            // 繼續收下一組紅外線訊號        
  }  
}

[實驗結果]






Share:

星期日, 4月 14, 2013

Arduino筆記(十):製作ATMega328燒錄器

[2013/5/7]
做了幾個Arduino實驗後,思考接下來要做什麼呢?還有哪些還要深入研究的,遙控車?藍芽?網路模組等,都是看看還有哪些要再深入想要再深入瞭解的。無意間瀏覽到有拍賣的賣家再賣ATMega328的IC,有些是燒好Arduino主程式Bootloader,有的是只賣IC。剛好看到Arduino網站上有一篇介紹如何將Arduino板子設定為燒錄器ISP(In-System Programmer)的做法,將程式燒到麵包板上的ATMega328 IC,因此想買材料自己做看看。

[材料]

 Arduino Uno R3  x1
 ATMega328P-PU  x1
 16 MHz Crystal  x1
 10k 電阻  x1
 陶瓷電容器 18 to 22 pf.  x2

[接線圖及步驟]

要燒錄Bootloader 的步驟如下:
1. 將Arduino Uno R3接到電腦,開啟IDE畫面,設定好版子類型(Tool > Board > Arduino Uno)及正確的Serial Port (Tool > Serial Port > COM3) *注:要設定成可用的Port,不是每部電腦都設定為COM3。

2. 將ArduinoISP程式上傳到Arduino版子,ISP程式可在IDE介面 File > Open > Examples > ArduinoISP目錄內的ArduinoISP.ino 檔案,開啟後,上傳到Arduino 版子。

3. 將線路依照下列方式連接:



4. 選擇Arduino版的類型:Tools > Board > Arduino Duemilanove w/ ATmega328 或是Arduino Nano w/ ATmega328兩類都可以。



5. 設定為ISP:Tool > Programmer > Arduino as ISP
6. 開始燒錄:Run Tools > Burn Bootloader
我用小的麵包版,接起來的樣子是這樣:

這個方法在官方網站說只能用在Arduino Duemilanove w/ an ATmega328,無法使用在Arduino Uno及較舊 Arduino ATmega168版子,但是我用Arduino UNO R3確可以成功。

[參考資料]

 http://arduino.cc/en/Tutorial/ArduinoToBreadboard
Share:

星期六, 4月 13, 2013

Arduino筆記(九):DHT11溫濕度感應偵測與LCD顯示

[2013/04/07]
昨天從拍賣網站上購買的RaspBerry pi終於寄到了,順便買了測量溫濕度的DHT11及一個雙通道光耦合繼電器,利用今天空檔時,找了一下這個元件的Datasheet,也找了一段程式進行測試。


[材料]


• 麵包板 x 1
• Arduino Uno x 1
• DHT11溫濕度感應器 x1
• 4.7K電阻  x 1
•連接線 x 3條

[接線]

DHT11共有四隻腳,左邊第一隻腳接+5V,第二隻腳接Arduino Pin2,第四隻腳接地,比較特別的是第一、二隻腳還要用一個4.7K的電阻連接,



[程式一]


#include <dht11.h>
dht11 DHT11;  
#define DHT11PIN 7   //定義讀取資料的 Pin腳 
void setup() 
{
  Serial.begin(9600);
}

void loop()  
{
  Serial.println("\n");
  int chk = DHT11.read(DHT11PIN);
  Serial.print("Read sensor: ");
  switch (chk)
  {
    case 0: Serial.println("OK"); break;
    case -1: Serial.println("Checksum error"); break;
    case -2: Serial.println("Time out error"); break;
    default: Serial.println("Unknown error"); break;
  }

  Serial.print("Humidity (%): ");
  Serial.println((float)DHT11.humidity, 2);

  Serial.print("Temperature (oC): ");
  Serial.println((float)DHT11.temperature, 2);

  Serial.print("Temperature (oF): ");
  Serial.println(Fahrenheit(DHT11.temperature), 2);

  Serial.print("Temperature (K): ");
  Serial.println(Kelvin(DHT11.temperature), 2);

  Serial.print("Dew Point (oC): ");
  Serial.println(dewPoint(DHT11.temperature, DHT11.humidity));

  Serial.print("Dew PointFast (oC): ");
  Serial.println(dewPointFast(DHT11.temperature, DHT11.humidity));

  delay(2000);
}

/*-----( Declare User-written Functions )-----*/
//
// 計算轉換為華式
double Fahrenheit(double celsius)
{
        return 1.8 * celsius + 32;
}

//轉換為蘭式
double Kelvin(double celsius)
{
        return celsius + 273.15;
}

// dewPoint function NOAA
// reference: http://wahiduddin.net/calc/density_algorithms.htm 
double dewPoint(double celsius, double humidity)
{
        double A0= 373.15/(273.15 + celsius);
        double SUM = -7.90298 * (A0-1);
        SUM += 5.02808 * log10(A0);
        SUM += -1.3816e-7 * (pow(10, (11.344*(1-1/A0)))-1) ;
        SUM += 8.1328e-3 * (pow(10,(-3.49149*(A0-1)))-1) ;
        SUM += log10(1013.246);
        double VP = pow(10, SUM-3) * humidity;
        double T = log(VP/0.61078);   // temp var
        return (241.88 * T) / (17.558-T);
}

// 轉換為露點溫度

// delta max = 0.6544 wrt dewPoint()
// 5x faster than dewPoint()
// reference: http://en.wikipedia.org/wiki/Dew_point

double dewPointFast(double celsius, double humidity)
{
        double a = 17.271;
        double b = 237.7;
        double temp = (a * celsius) / (b + celsius) + log(humidity/100);
        double Td = (b * temp) / (a - temp);
        return Td;
}

[執行結果]




如果每次要開Serial Port的視窗,覺得很麻煩,心想如果把測到溫濕度值顯示在LCD上,那就方便多了,只要接上電源,就可以知道現在溫濕度的狀況,於是將線路與程式改寫,分別說明如下:



[材料]

• 麵包板 x 1
• Arduino Uno x 1
• DHT11溫濕度感應器 x1
• HD44780 相容 LCD x 1 (本實驗使用 16 pin 有背光 LCD)
• 旋轉式可變電阻 x 1
• 4.7K電阻 x 1
• 220K電阻 x 1
• 連接線 x N條


[程式二]


/*    將DHT11測得的溫濕度顯示在LCD顯示器 */ 

#include <liquidcrystal.h>    //使用LiquidCrystal Library 
#include <dht11.h>                 //使用DHT11 Library
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);  //初始設定LCD顯示器的介面 
dht11 DHT11;     //定義DHT11 物件
#define DHT11PIN 7  //定義讀取資料的 Pin腳 

void setup() {     
   lcd.begin(16, 2);  // 設定LCD有2列16欄  
      Serial.begin(9600);  
} 

void loop() {  
   lcd.setCursor(0, 0); //將游標設定在第一行第一個位置(column 0, line 1)  
   int chk = DHT11.read(DHT11PIN);  //檢查DHT感測器的回應  

      switch (chk) {     
   case 0:       
     lcd.print("Humidity:");       
     lcd.print((float)DHT11.humidity, 1);       
     lcd.print("%");       
     lcd.setCursor(0, 1);       
     lcd.print("Tempure:");       
     lcd.print((float)DHT11.temperature, 1);       
     lcd.print("oC");     // 無法顯示度,只好用小寫的O表示       
           break;     
   case -1:       
     lcd.print("Checksum error"); 
     break;     
   case -2:       
     lcd.print("Time out error"); 
     break;     
   default:       
     lcd.print("Unknown error"); 
     break;   
   }  
   delay(1000); 
} 

[參考資料]

• http://arduino-info.wikispaces.com/DHT11-Humidity-TempSensor
Share:

星期六, 4月 06, 2013

Arduino筆記(八):控制步進馬達

[2013/04/06]
[2017/03/11] 更新
繼下午的Keypad與喇叭實作之後,晚上再拿出步進馬達來練習,當時買的套件之一就有附一個步進馬達及一個小模版,看了線路後,就將ULN2003APG這個 IC拆下來裝在麵包版上,看起來比較簡單些。我試著利用ULN2003這個 IC來推動步進馬達,並使用 Arduino 來控制步進馬達轉的角度,以下就試著連接線路,透過程式來進行控制。



[步進馬達]

有關步進馬達相關的知識,請參考:RASPBERRY PI 筆記(十二):控制步進馬達

[ULN2003]

ULN2003A,是一種高壓大電流的共發射極達林頓電晶體陣列 (Darlington Array )積體電路,內含 7組達林頓對管,每組對管的電流容量是500mA,輸出的電壓最高50V。該積體電路還整合了 7隻共陰極形式連接的續流二極體,用於電感性負載的開關動作的電流續流。[維基百科]

ULN2003 是一個反向器。所謂的反向器就是輸入是高電位時,輸出會是低電位,反之輸入低電位時,輸出會是高電位。

ULN2003A DIP封裝引腳圖 (來源:維基百科)

• 1B~7B:第一至第七組對管的基極    
• 1C~7C:第一至第七組對管的集電極
• E:公共發射極(一般接地)             
• COM:續流二極體共用陰極              

ULN2003在電子電路里的主要特點是大電流容量和高電壓輸出。常作爲驅動器使用,每組達林頓對管可並聯使用以達成更大的電流容量,甚至可以幾顆積體電路晶片堆疊並聯使用。步進馬達一般需要驅動器件有大電流輸出的能力,而微控制器等小電流的積體電路是不能直接驅動馬達的,因此可用作步進馬達的驅動器。

ULN2003內部的7組達林頓對管可以獨立操作,因爲它們的電路連接上除了發射極是一併接地共用E/GND引腳、續流二極體是共陰極接法共用一個COM引腳以外,集電極1C~7C以及基極1B~7B的引腳都是獨立對應的7組。若作爲步進馬達驅動器,則COM一端需要與步進馬達的公共供電端連接,爲馬達的反電動勢提供電流續流能力。

[Stepper Library]

Arduino IDE內有一個 Stepper Library,就是專門用來控制步進馬達的函式庫,以下是常用的函式:

Stepper(int steps, pin1, pin2, pin3, pin4):建立一個步進馬達的物件。
其中 step是指轉一圈所需的步數,假使馬達定義每步的角度,用360去除,就會得到步數。例如:Stepper myStepper = Stepper(100, 5, 6, 7, 8);  表示每一步為3.6度,轉一圈總共100步。

Stepper: setSpeed(long rpms):設定步進馬達每分鐘轉速 (RPMs) ,需為正數。
這個函式並不會讓馬達轉動,只是設定好轉速,當呼叫Step()函式時才會開始轉動。

Stepper: step(int steps):啟動馬達行進steps步數。setSpeed()定義速度,正的表示一個方向, 負數表示反方向。

步進馬達的型號是28BYJ-48, 5V DC,規格如下:

• 工作電壓: 5~12V DC
• 轉一圈步數:512 (搭配 1/64減速齒輪)
• 每分鐘圈數:80 RPM(Revolution per minute)
• 重量:37 公克

[材料]

• 麵包板 x 1
• Arduino Uno x 1
• 步進馬達(型號28BYJ-48, 5V DC) x1
• ULN2003APG x 1
•連接線 x N條

[接線]

步進馬達共有五條線,第一至第四條依序連接ULN2003APG的右側1-4接腳(即16~13接腳),第五條線則接上5V,Arduino的Pin11~Pin8依序接上ULN2003APG左側的1-4接腳(即1-4接腳),第8隻接腳連接GND。





[程式]

#include <Stepper.h>
#define STEPS 200  //定義步進馬達每圈的步數

//steps:代表馬達轉完一圈需要多少步數。如果馬達上有標示每步的度數,
//將360除以這個角度,就可以得到所需要的步數(例如:360/3.6=100)。(int)

Stepper stepper(STEPS, 11, 10, 9, 8);

void setup()
{
stepper.setSpeed(140);     // 將馬達的速度設定成140RPM 最大  150~160
}

void loop()
{
stepper.step(100);//正半圈
delay(1000);
stepper.step(-100);//反半圈
delay(1000);
stepper.step(200);//正1圈
delay(1000);
stepper.step(-200);//反1圈
delay(1000);
stepper.step(300);//正1圈半
delay(1000);
stepper.step(-300);//反1圈半
delay(1000);
stepper.step(1600);//正8圈
delay(1000);
stepper.step(-1600);//反8圈
delay(1000);
}

[參考資料]

• Arduino.cc: Stepper Library
• 維基百科:ULN2003A

Share:

星期五, 4月 05, 2013

Arduino筆記(七):3x4 Keypad 控制蜂鳴器發聲


[2013/04/05]
由於工作關係,隔了兩個多星期才又開始進行實驗,這次實驗的主題是從電料行買的3x4 Keypad,這個Keypad總共有八隻接腳,由於不知道行與列的線路連接方式,於是將拆開後背後的螺絲拆開看看線路圖:


仔細檢視每一個行(自右而左,分別為COL0 ~ COL2)與列(自上而下)的線路,知道接腳(從左至右)如下:

位置 KeyPad接腳 Arduino接腳
COL0
5
9
COL1
6
8
COL2
7
7
ROW0
1
13
ROW1
2
12
ROW2
3
11
ROW3
4
10

如要使用喇叭,Arduino有一個涵式庫已經定義好音調,只要用Include將"pitches.h"包含進來:
,以本單元的Do, Re ~ Si,總共七個,定義名稱如下:

#define NOTE_C5  523     // Do
#define NOTE_D5  587     // Re
#define NOTE_E5  659     // Me
#define NOTE_F5  698     // Fa
#define NOTE_G5  784    // So
#define NOTE_A5  880    // La
#define NOTE_B5  988    // Si

[材料]

• 麵包板 x 1
• Arduino 主板 x 1
• 3x4 Keypad x 1
• 喇叭 x 8
• 單心線 x 8

[接線]

將Keypad的第一隻腳接Pin 13,第二隻腳接Pin12,餘此類推至第八隻腳接Pin6,將喇叭的兩條線,一條接GND,一條接Pin4。





在畫Fritizing的電路圖時,內建沒有KeyPad圖形,可從http://code.google.com/p/fritzing/ 搜尋Keypad後下載Keypad.fzz匯入即可。雖然跟我買的Keypad圖樣不同,但是鍵盤排列位置是一樣的。

[程式]

// 引用 Keypad library
#include <Keypad.h>
#include <pitches.h>

// 3x4 Keypad
const byte ROWS = 4;  // 4 Rows
const byte COLS = 3;   // 3 Columns
int duration = 500;        // 500 miliseconds

// 定義 Keypad 的按鍵
char keys[ROWS][COLS] = {
  {'1','2','3'},
  {'4','5','6'},
  {'7','8','9'},
  {'*','0','#'}
};

// 定義 Keypad 連到 Arduino 的接腳
byte rowPins[ROWS] = {13, 12, 11, 10}; // 連到 Keypad 的 4 個 Rows: Row0, Row1, Row2, Row3 
byte colPins[COLS] = {9, 8, 7};   // 連到 Keypad 的 3 個 Columns: Column0, Column1, Column2

// 建立 Keypad 物件
Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );

void setup(){
  Serial.begin(9600); 
}
  
void loop(){
  // 讀取 Keypad 的輸入
  char key = keypad.getKey();
  
  // NO_KEY 代表沒有按鍵被按下
  if (key != NO_KEY){      // 假如有按鍵被按下,就印出按鍵對應的字元
      switch (key) {
     case '1':    
       tone(4, NOTE_C5, duration);
       break;
     case '2':    
       tone(4, NOTE_D5, duration);
       break;
     case '3':    
       tone(4, NOTE_E5, duration);
       break;
     case '4':    
       tone(4, NOTE_F5, duration);
       break;
     case '5':    
       tone(4, NOTE_G5, duration);
       break;
     case '6':    
       tone(4, NOTE_A5, duration);
       break;
     case '7':    
       tone(4, NOTE_B5, duration);
       break;       
     default:
       tone(4, NOTE_C8, duration);
     }
    Serial.println(key);
  }
}


[執行結果]

當按下數字1時,會發出Do的音,按下數字2時,會發出Re的音...直到
數字7為Si的音,其他鍵盤則為高音Do。




參考資料:
• Arduino Playground : The Matrix Keypad how-to
• Arduino  Examples > Digital I/O > Tone4
• Copper Maa:Arduino 筆記 – Lab6 控制蜂鳴器發聲
• Copper Maa:Arduino 筆記 – Lab18 讀取 3x4 Keypad 的輸入


Share:

星期日, 3月 17, 2013

Arduino筆記(六):紅綠燈號誌

[2013/03/17]
學了兩個多星期的Arduino,都是照著練習的範例做,今天下午跟Max在看前幾個實驗時,他就出了一個功課給我,要我做紅綠燈號控制,心想應該不難,於是找了三個不同顏色的LED燈,接到三個Pin腳,應該就可以做到了。於是就自己動手接。
剛完成時,竟然Pin腳設定為低電壓(LOW)時會亮,高電壓(HIGH)反而熄滅,一定是接錯了,於是重新檢查一次,才知道接地的腳接到+5V的電壓,重新調整後就好了。以下是實際執行的照片及線路圖。


[材料]

• 麵包板 x 1
• Arduino Uno x 1
• LED 紅色 x1、黃色x1、綠色x1、
• 220K電阻 x 3
• 連接線 x N條

[接線]

將LED的一端接地,另一端接220K電阻,電阻的另一端分別接Pin3,4,5代表紅黃綠。


[程式]

/*  Traffic Lights.*/

// 設定紅黃綠燈Pin 值
  int LEDRed = 3;
  int LEDYellow = 4;
  int LEDGreen = 5;
  
void setup() {                
  pinMode(LEDRed, OUTPUT);     
  pinMode(LEDYellow, OUTPUT);     
  pinMode(LEDGreen, OUTPUT);
}

void loop() {
  digitalWrite(LEDRed, LOW);     // 綠燈
  digitalWrite(LEDYellow, LOW);
  digitalWrite(LEDGreen, HIGH);
  delay(7000);      //等待7秒鐘

  digitalWrite(LEDRed, LOW);   // 黃燈
  digitalWrite(LEDGreen, LOW);
  digitalWrite(LEDYellow, HIGH);
  delay(2000);     //等待2秒鐘

  digitalWrite(LEDYellow, LOW);
  digitalWrite(LEDGreen, LOW);
  digitalWrite(LEDRed, HIGH);   // 紅燈
  delay(5000);     //等待5秒鐘    

}
Share:

Arduino筆記(五):使用可變電阻控制伺服馬達

[2013/03/17]
透過可變電阻,控制伺服馬達的轉向。

伺服馬達(Servo Motor)是可以提供動力的一種裝置,可藉由程式來控制速度和方向,伺服馬達內部包括了一個小型直流馬達伺服馬達、一組變速齒輪組、一個反饋可調電位器及一塊電子控制板。標準的微型伺服馬達有三條控制線,通常為紅色(+5V電源)、黑色(接地)及黃色或橘色(控制用, 連接至Arduino pin9)。由於我是在網站買實習的相容套件,這個伺服馬達的三條線顏色不太一樣,不過沒關係,總是離不開電源和控制兩類。

本實驗多接上一個可變電阻,控制伺服馬達的轉向。


[材料]

 麵包板 x 1
 Arduino Uno x 1
 伺服馬達 (Servo Motor) x 1
 10k 可變電阻 x 1
 連接線 x N條

[接線]

伺服馬達有三條線,紅線接電源+5V、黑線接GND,訊號線接Pin 9,可變電阻的中間接腳接到A0,作為類比數值讀取。


[程式]

// 引用 Servo Library
#include  

//建立一個伺服馬達控制物件 
Servo myservo; 

int potpin = 0;   //該變數用於存儲用電位器讀出的模擬值
int val;               // 該變數用於儲存伺服馬達角度位置 

void setup() 
{ 
myservo.attach(9);   // 由Pin 9控制伺服馬達
} 

void loop() 
{ 
val = analogRead(potpin);   //讀取電位器控制的模擬值 (範圍在0-1023) 
val = map(val, 0, 1023, 0, 179);   // 把0-1023的數值按比例縮放為0-180的數值

myservo.write(val);  // 指定伺服馬達轉向的角度 
delay(15);  // 等待15ms讓伺服馬達到達指定位置 
}


[參考資料]

• Arduino Learning:Examples > Servo Library

Share:

Arduino筆記(四):在2x16 LCD上顯示 Hello World訊息

[2013/03/16]
練習使用HD44780相容(或稱1602)液晶顯示 LCD(Liquid crystal display),在2x16的顯示幕印出"Hello World", 並測量可變電阻的數值,也同時學習使用analogRead()函式及LiquidCrystal Library。

執行結果如下圖:


[1602顯示器接腳說明]

LCD顯示器若無背光則會有14個Pin,若有背光則會有16個,而接腳位置大多如下:
------------------------------------
1 VSS (接地)
2 VDD (5V電源輸入)
3 VO 或稱 Vee:調整對比,需接一個1k的可變電阻
4 Register Select(RS):1: D0 – D7 當作資料解釋,0: D0 – D7 當作指令解釋
5 READ/WRITE(RW): 1: 從 LCD 讀取資料,0: 寫資料到 LCD
6 Enable
7 DB0
8 DB1
9 DB2
10 DB3

11 DB4
12 DB5
13 DB6
14 DB7
15 A(+) 背光:可接330 Ohm電阻到電源
16 K(-) 背光:接地
------------------------------------

看過一些HD44780相容的範例,Arduino對LCD的控制有兩個重要的Library,一個是LiquidCrystal,另一個是LCD4Bit,LCD4Bit是改良自LiquidCrystal,所以也提供了較多有趣的function及控制,最重要的是LCD4Bit使用的接腳較少,且可以控制多行顯示。使用 4-bit 模式主要的好處是節省 I/O 腳位,通訊的時候只會用到 4 個高位元 (D4-D7)。

[材料]

•麵包板 x 1
•Arduino 主板 x 1
•HD44780 相容 LCD x 1 (本實驗使用 16 pin 有背光 LCD)
•旋轉式可變電阻 x 1
•單心線 x N條


[接線圖]

• 將 LCD 的 RS(4), Enable(6), D4(11), D5(12), D6(13), D7(14) 依序接到 12, 11, 5, 4, 3, 2 腳位
• 將 LCD 的 VSS(1) 及 R/W(5) 接到 GND,VDD(2)接到 +5V
• 可變電阻中間腳位接到 LCD 的 VO,其中一支接到 5V,另外一支接 GND (註:或是在VO 上串接一顆 1k ohm 電阻連到 GND)


[實驗結果]

• analogRead()這個函式讀取的值是 10 bit,也就是一個位於0到1023之間的值
• analogRead()大約每秒鐘讀取10,000次
• LCD顯示的數值會一直改變,因為會受其他是否有類比輸入以及手是否靠近版子有關等


[程式]

/* 在2x16的顯示幕印出"Hello World", 並測量可變電阻的數值
 * This example code is in the public domain.
 * LCD RS pin to digital pin 12
 * LCD Enable pin to digital pin 11
 * LCD D4 pin to digital pin 5
 * LCD D5 pin to digital pin 4
 * LCD D6 pin to digital pin 3
 * LCD D7 pin to digital pin 2
 * 10K Potentiometer:
 * ends to +5V and ground
 * wiper to LCD VO pin (pin 3) */

// 引用 LiquidCrystal Library
#include 



// 建立 LiquidCrystal 的變數 lcd
// LCD 接腳: rs, enable, d4, d5, d6, d7 
// 對應到 Arduino 接腳: 12, 11, 5, 4, 3, 2
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

void setup() {
 // 設定 LCD 的行列數目 (2 x 16)
 lcd.begin(16, 2);

 // 設定類比串列速率
Serial.begin(9600);

 // 列印 "Hello World" 訊息到 LCD 上
lcd.print("hello, world!");
}

void loop() {
 // 將游標設到 column 0, line 1, (注意: line 1 是第二行(row),因為是從 0 開始數起)
lcd.setCursor(0, 1);

// 列印 Arduino 重開之後經過的秒數
// lcd.print(millis()/1000);

// 讀取A0的類比值
int sensorValue = analogRead(A0);

// 將類比的數值顯示在第二列
lcd.print(sensorValue);

// 顯在一份資料是視窗上

Serial.println(sensorValue);
  delay(2000);     // delay in between reads for stability
}


[參考資料]

Copper Maa Blog:Arduino 筆記 – Lab9 在 2x16 LCD 上顯示 "Hello World" 訊息
Arduino webSite:Examples > Libraries > LiquidCrystal


Share:

星期六, 3月 16, 2013

Arduino筆記(三 ):Arduino主程式與電路繪圖軟體

[2013/03/16] 原創
[2017/03/10] 最後更新
幾年後再度使用Arduino,官方網站已經提供 Web 版的 IDE 介面,可以到官方網站申請一個帳號,登入後,瀏覽器下載 plug-in,安裝完成後,即可開始使用Web IDE編輯 Arduino程式。

[Arduino IDE主程式]

軟體下載(官方網站下載 www.arduino.cc/en/Main/Software)

下載的arduino主程式是一個壓縮檔,解開後目錄內有arduino.exe (以Windows為例),只要執行該程式,就會打開主視窗,下圖為開啟程式後的畫面:



有兩個重要地方要設定,才能正常將程式燒錄到單晶片上:
● 主機板的種類 (在功能表[工具Tools] ➔ [開發板Board] 設定 )
● 連接Arduino主機板的Port (請參考 Arduino筆記(二):Arduino基本介紹 說明)。

設定完成後,就可以開始寫程式了。在程式撰寫區上方有五個按鍵,說明如下圖:


右上角有一個類似放大鏡的圖案,游標移至放大鏡時,左方會出現Serial Monitor,這個按鍵會打開一個視窗,將串列字元顯示在這個視窗內。

安裝完成後,要設定兩件事:一是 Arduino 開發板的名稱,另一件是設定使用的序列埠 Port 是否正確。如果都設定正確後,就可以開始撰寫程式了。

[Fritzing 電路繪製軟體]

「Fritzing」,這套軟體不只提供一個擬真的麵包板,可以讓你將實際麵包板的接線線路,完整的複製到此擬真的麵包板上儲存。除此之外,Fritzing 還會將此麵包板上所接的零件畫出線路圖及 PCB Layout 圖。下圖主程式畫面及16x2 LCD連接的線路圖,左方是工作區,右方有各種不同的電子元件,如電阻、電容及發光二極體等圖案。



軟體下載位置:http://fritzing.org/download/

如果要新增元件,可以到以下網址搜尋相關元件:
http://code.google.com/p/fritzing/issues/list

[2017/03/10] 上述網址已經移到:https://github.com/fritzing/

只要在元件區按右鍵,選擇 Import,再選擇檔案,即可將該元件匯入Fritzing。

[參考資料]

  Arduino.cc
Share:

星期五, 3月 15, 2013

Arduino筆記(二):Arduino介紹

[2013/03/14]
最後更新日:[2017/03/09]

過了四年,再回頭來看以前整理的資料,覺得自己好像成熟一些,覺得以前整理的文章,很生澀,也不夠齊全,因此想找時間,再補充或重新實做以前做過的實驗,甚至提出一些不同的想法,就從這篇文章開始修訂。

[Arduino簡介]

如果 Google一下 Arduino會發現已經有很多文章介紹他了,在此我們就參考一下維基百科的說明:Arduino,是一個開放原始碼的單晶片微控制器,它使用了Atmel AVR單片機,採用了開放原始碼的軟硬體平台,建構於簡易輸出/輸入(simple I/O)介面板,並且具有使用類似Java、C語言的Processing/Wiring開發環境。 [維基百科]
Arduino UNO r3版正面

 
來源:Arduino.cc

當然啦, Arduino不是只有 Uno一個版本,危機百科列了一張圖,有不同型號,不同大小與形狀,如果有興趣的可以自行 Google 一下相關介紹。

Arduino 是開放式的硬體,其線路圖也是公開的,如有興趣可到以下網站下載檔案:
http://arduino.cc/en/uploads/Main/Arduino_Uno_Rev3-schematic.pdf

 硬體規格:
 微控制器  ATmega328
 運作電壓  5V
 輸入電壓 (建議) 7 -12V
 輸入電壓 (限制)  6-20V
 數位 I/O Pins   14 (其中六個Pins 提供PWM輸出)
 3, 5, 6, 9, 10
11 共六支腳
 類比輸入 Pins  6
 I/O Pin直流電流  4 0 mA
 3.3V Pin直流電流   50 mA
 Flash 記憶體  32 KB (ATmega328) 其中 0.5 KB
 用於 bootloader
 SRAM  2 KB (ATmega328)
 EEPROM  1 KB (ATmega328)

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

電源:可使用USB或外部電源。

 VIN  當使用外部電源時,輸入電壓給Arduino版,可透過這個Pin腳提供電壓
 5V  該腳輸出5V的穩定電源,該板可提供(7-12V)直流電源,USB接口(5V)
 3.3V  產生3.3伏的電源板上穩壓器。最大電流消耗為50mA
 GND  接地引腳
 IOREF 提供Arduino板的參考電壓


數位 I/O Pins (0~13):共計14 支數位 I/O Pins,可以當作 input或 output 使用。利用 pinMode(), digitalWrite(), digitalRead() 等函式存取。其中幾支腳有特殊的功能:

 串列通訊  0(RX) 1 (TX) 用來接收(RX)與傳輸(TX) TTL訊號的序列資料。這
 兩支腳也連接到ATmega8U2USB串列晶片
 外部中斷  2 和 3 這兩支腳可以利用低電壓觸發外部中斷,請參考 attachInterrupt()
 PWM  (前置~符號) 3, 5, 6, 9, 10,11六支腳。透過 analogWrite()函式可提供 8-bit PWM 輸出
 SPI  10(SS), 11(MOSI), 12(MISO), 13(SCK)這四支腳搭配 SPI Library 可提供SPI 序列通訊
 LED  13。內建一顆 LED連接該Pin,當 pin腳為HIGH 時,LED亮,當 pin腳為 LOW時,LED關閉

I/O PWM:脈衝寬度調變(Pulse Width Modulation)說明請參閱:維基百科

類比輸入Pins (A0~A5):共計六個類比輸入,每支腳都可提供 10 位元的解析 (即 1024 種不同的數值)。預設電壓是0~5V,可透過 AREF 腳和 analogReference() 函式更改。
TWI A4或SDA引腳和A5或SCL引腳。支援TWI通信使用的Wire Library

其他:

AREF  類比輸入的參考電壓,使用 analogReference()函式
Reset 設定為LOW時,重新啟動,通常會有一個按鍵

USB電流負載過大保護:
Arduino UNO有一個POLYFUSE,當電流過大時,可以保護USB裝置。如果超過500 mA時,保險絲會自動斷開連接,直到短路或過載被移除。

[安裝Arduino驅動程式]

當Arduino連接電腦,出現需要安裝驅動程式時,需注意以下事項:


將路徑指定 "arduino-1.0.x\drivers" 這個資料夾


驅動程式安裝完成之後,在「裝置管理員」會多出一個 "Arduino UNO (COMx)" 的裝置,屆時打開Arduino主程式後,需要設定連接至此COMx Port。

[參考資料]

  Arduino.cc
Share:

星期二, 3月 12, 2013

Arduino筆記(一):緣起-- 巧遇Arduino

[2013/03/12]
從學校唸書開始,自動控制一直是我的興趣,能夠透過程式控制電器或開關,是多麼有趣的一件事。退伍回來,憑藉著學校學的程式語言,開始找相關的工作,十幾年來,都跟程式設計、資料庫離不開關係。在一個偶然的機會下負責專案,竟也成了後來主要的工作內容,心裡總還懷抱著一份想要學習自動控制的好奇心。剛開始時學8051,因為不夠專注,工作也忙(這是藉口),只學到一點皮毛,加上自己不是電子本科系畢業的學生,要瞭解這些電子的特性,更是摸不著頭緒,更別說要做出一些實用的作品來。

知道Arduino這個開放原始碼的硬體組件,是在今年一月底的台北書展,意外發現一本動手做電子相關的作品的雜誌 Make,已經出版到第六冊,就一次購買六本,再加訂一年份。Make雜誌教人如何動手做一些有創意的作品,有些需要搭配電子器材,有些則純粹是手工作品。就在翻閱時,看到Arduino這個名詞,看了相關介紹後,直覺這就是學習自動控制的入門關鍵。

當然,我也在過年後,在拍賣網站買了一個Arduino Uno及一些實習用的零件,如LCD、步進馬達、紅外線遙控等實驗設備,以後也會陸續在此紀錄我的學習心得與筆記。



由於Arduino是開放式硬體,網路上有很多介紹的文章或作品,都很值的參考。以下列出我常造訪的網站,希望對入門想學習的人有點幫助。



Arduino :http://www.arduino.cc/
Arduino 台灣:http://arduino.tw/
Cooper Maa的筆記:http://coopermaa2nd.blogspot.tw/
由RS Components 拍攝的Arduino入門套件中文字幕影片系列
極客工坊:http://www.geek-workshop.com/forum.php

如果你想買Arduino及擴充套件,可以在拍賣網站搜尋,應可找到您要的。

Share: