วันศุกร์ที่ 15 กรกฎาคม พ.ศ. 2559

การใช้งาน ADC และ PWM

Hello everyone !!

ทำความรู้จักสัญญาณ Analog กันก่อนนะครับ

สัญญาณแอนะล็อก (Analog Signal) เป็นสัญญาณแบบต่อเนื่อง มีลักษณะเป็นคลื่นไซน์ (sine wave) โดยที่แต่ละคลื่นจะมีความถี่และความเข้มของสัญญาณที่ต่างกัน

Credit:  https://th.wikipedia.org



จากรูปด้านบนก็จะเห็นว่า Digital signal จะมีลักษณะที่แน่นอน คือ มีระดับสัญญาณที่ชัดเจนและคาดเดาได้ คือ "0" หรือ "1" (HIGH or LOW) ในขณะที่ Analog signal มีระดับสัญญาณที่ไม่แน่นอน สามารถปรับเปลี่ยนได้ตลอดเวลา

คำถามก็คือ แล้วเราจะอ่านสัญญาณ Analog นี้ได้อย่างไรล่ะ แล้วนำไปใช้งานอะไรได้บ้าง ????
คำตอบก็คือ ต้องใช้ตัวแปลงสัญญาณ Analog to Digital นะซิ

Arduino ได้เตรียมฟังก์ชั่นไว้ให้ สามฟังก์ชั่น คือ

ฟังก์ชั่น analogReference()

ใช้สำหรับกำหนดค่าแรงดันอ้างอิง สามารถกำหนดได้ดังนี้
 1. DEFAULT    ค่าปกติคือ 5V
 2. INTERNAL  - มีค่าเท่ากับ 1.1V สำหรับ ATmega168, ATmega328
                      - มีค่าเท่ากับ 2.56V สำหรับ ATmega8
 3. EXTERNAL  กำหนดได้เองโดยป้องแรงดันเข้าที่ PIN AREF

เช่น
- analogReference(DEFAULT);
- analogReference(INTERNAL);
- analogReference(EXTERNAL);


คำเตือน
ห้ามต่อ AREF PIN กับ 0V หรือมากกว่า 5V เพราะอาจทำให้บอร์ดเสียหายได้ แต่ถ้าต้องการใช้ external voltage จากภายนอกให้กับ AREF ให้เรียกใช้งานฟังก์ชั่น analogReference(EXTERNAL) ก่อนทุกครั้ง และต้องต่อตัวต้านทานขนาด 5k อนุกรมกับ AREF PIN ด้วย แต่แรงดันจะตกลงไปนิดหน่อย ดังตัวอย่างนี้
- สมมติว่าป้องแรงดันภายนอกให้กับ AREF PIN เท่ากับ 2.5V จะได้ 2.5 * 32 / (32 + 5) = ~2.2V
32 คือความต้านทานภายในของ AREF PIN ที่มีค่าเท่ากับ 32k

ฟังก์ชั่น analogRead()

ใช้สำหรับอ่านค่าแรงดันจาก PIN ที่ถูกอ้างอิง ซึ่งจะให้ค่าระหว่าง 0-1023 ฉนั้นหากเรากำหนดแรงดันอ้างอิงไว้ที่ 5V จะได้ 5/1024 = 0.0049V คือความละเอียดในการอ่านค่าแรงดันอินพุต แต่หากกำหนดแรงดันอ้างอิงไว้ที่ 2.56V จะได้ 2.56/1024 = 0.0025V ซึ่งให้ผลลัพธ์ที่ละเอียดกว่า

เช่น
- var = analogRead(A0);
- out = analogRead(A3);


ฟังก์ชั่น analogWrite()

คร่าวหน้ามา ต่อ analogWrite พร้อมตัวอย่างทั้งหมดนะ ครับ

วันจันทร์ที่ 11 กรกฎาคม พ.ศ. 2559

การใช้งานพอร์ต Digital I/O

Hello everyone !!

บล๊อกแรกของทีมงาน BannokArduino (บ้านนอกอาดูโน่) ขออนุญาติเริ่มการใช้งานเบื้องต้น โดยทีมงานใช้บอร์ด Arduino UNO R3 เป็นหลักนะครับ แต่ทำไมต้องเลือกบอร์ดตัวนี้ด้วยล่ะ ??? เป็นเพราะว่าบอร์ดตัวนี้ ได้รับความนิยมมากกว่าบอร์ดเวอร์ชั่นอื่นๆ เราจะเริ่มต้นจากทำความรู้จักพอร์ตดิจิตอลอินพุตและเอาต์พุตกันก่อน ครับ ซึ่งมีอยู่นั้นหมด 14 pin นะครับ แต่ถูกใช้ไป 2 pin สำหรับ Download โปรแกรมที่เราเขียนขึ้นลงบอร์ด นั้นก็คือ TX, RX ฉนั้นก็เหลือเพียง 12 pin แต่ไม่เป็นไรครับ เพราะเพียงพอสำหรับการเริ่มต้นการเรียนรู้ Arduino นะจ๊ะ นอกจากเป็น digital I/O ธรรมดาแล้วนั้นก็สามารถให้เอาต์พุตเป็น PWM ได้ 6 pin ด้วยกัน คร่าวนี้มาดูตำแหน่งขาใช้งานดังรูปข้างล่างนี้นะ


มาดูกันต่อครับ digital I/O นั้นอยู่ขวามือของรูปนะ ครับ พอเรารู้แล้วว่าตำแหน่งขาอยู่ตรงไหน คร่าวนี้มาดูฟังก์ชั่นที่ต้องใช้งานกัน ดังนี้ ครับ

ฟังก์ชั่น pinMode()
คือฟังก์ชั่นกำหนดทิศทางการทำงานของ PIN ที่ถูกอ้างอิงให้ทำงานอยู่ในโหมด อินพุต (INPUT) หรือ เอาต์พุต (OUTPUT) 

ฟังก์ชั่น digitalWrite()
คือฟังก์ชั่นเขียน/ส่งสถานะทางเอาต์พุต ว่าต้องการส่งลอจิก “HIGH” หรือ “LOW” ไปยัง PIN ที่ถูกกำหนด

ฟังก์ชั่น digitalRead()
คือฟังก์ชั่นที่ใช้อ่านค่าจากอินพุตว่ามีสถานะลอจิกใด ซึ่งสามารถเป็นได้สองสถานะคือ “1” หรือ “0”

Example 1

int ledSck = 13;                    // กำหนดตัวแปรชนิด int ชื่อ ledSck มีค่าเท่ากับ 13
void setup()
{
  pinMode(ledSck, OUTPUT);   // กำหนดให้ PIN 13 เป็น OUTPUT
}
void loop()
{
  digitalWrite(ledSck, HIGH);     // ส่งลอจิก HIGH ให้ PIN 13
  delay(1000);                       // หน่วงเวลา 1 วินาที
  digitalWrite(ledSck, LOW);    // ส่งลอจิก LOW ให้ PIN 13
  delay(1000);                      // หน่วงเวลา 1 วินาที
}

Example 2

void setup()
{
  pinMode(8, OUTPUT);    // กำหนดให้ PIN 8 เป็น OUTPUT
}
void loop()
{
  digitalWrite(8, HIGH);     delay(1000);       // ส่งลอจิก HIGH ให้ PIN 8 และหน่วงเวลา 1 วินาที
  digitalWrite(8, LOW);     delay(1000);       // ส่งลอจิก LOW ให้ PIN 8 และหน่วงเวลา 1 วินาที
}


Example 3 

int ledPin = 13; // LED connected to digital pin 13
int inPin = 7;   // pushbutton connected to digital pin 7
int val = 0;     // variable to store the read value
void setup()
{
  pinMode(ledPin, OUTPUT);      // sets the digital pin 13 as output
  pinMode(inPin, INPUT);      // sets the digital pin 7 as input
}
void loop()
{
  val = digitalRead(inPin);   // read the input pin
  digitalWrite(ledPin, val);    // sets the LED to the button's value
}

=======================================================

@@ โอกาสหน้ามาดูการใช้พอร์ต Analog and PWM กันนะครับ