วันพฤหัสบดีที่ 9 กรกฎาคม พ.ศ. 2558

ตอนที่8 การอ่านค่า Analog ของ Arduino

เรามาทำความรู้จักกับสัญญาณ Analog กัน ให้ท่านลองออกเสียงคำว่า “อา…” ค้างเอาไว้ และทำเสียงหนักบ้าง เบาบ้าง นี่แหละครับ เสียง “อา…” ที่เราเปล่งออกมาก็ถือว่าเป็นสัญญาณ Analog ครับ สัญญาณ Analog คือ สัญญาณที่มีความต่อเนื่องและขนาดของสัญญาณมีการเปลี่ยนแปลงไปตามเวลา
คราวนี้เรามาดูวิธีการอ่านค่า Analog ของ Arduino Uno R3 กัน Arduino Uno มีขาที่สามารถอ่านค่า Analog ได้ทั้งหมด 6 ขา คือ ขา A0 – A5 เราจะใช้อุปกรณ์อย่างหนึ่งที่ตัวมันสามารถส่งค่า Analog ออกให้เรา ก็คือ เจ้า Variable Resistor (VR) VR คือ ตัวต้านทานชนิดหนึ่งซึ่งมีความสามารถพิเศษคือ มันสามารถปรับค่าความต้านทานได้ เราไปทดลองต่อวงจรเพื่ออ่านค่า Analog จากเจ้า VR กันเลยดีกว่าครับ
ให้ท่านต่อวงจรตามภาพนะครับ การต่อ VR นั้นจากรูปท่านจะเห็นว่าขาซ้ายสุดของ VR ผมเอาไปต่อกับ Ground และขาขวาสุดของ VR ต่อกับไฟ 5V ทั้งสองขาที่ผมกล่าวมานั้นสามรถที่จะสลับการเชื่อมต่อได้นะครับ ท่านจะเอา Ground ไปต่อทางขาขวาสุดก็ได้ แล้วก็ต่อไฟ 5V ให้กับขาทางซ้ายสุด ก็ทำได้ครับ ไม่ผิดแต่ประการใด ใช้งานได้เหมือนกัน แต่ขาที่ VR มันส่งสัญญาณ Analog ออกมาให้เรา ต้องเป็นขากลางเท่านั้นนะครับผม
คราวนี้มาเขียนโปรแกรมกัน

int GetAnalog;
void setup()
{
Serial.begin(9600);
}
void loop()
{
GetAnalog = analogRead(A0);
Serial.println(GetAnalog);
delay(500);
}

เรามาทำมาทำความเข้าใจโปรแกรมกันสักหน่อย เริ่มที่บรรทัดแรก เป็นการประตัวแปรชื่อว่า GetAnalog เป็นแบบ int คือเราจะเอาค่าที่อ่านได้จาก VR มาเก็บลงตัวแปรที่ชื่อว่า GetAnalog ครับ พอเราเก็บค่า Analog เอาไว้ที่ตัวแปร GetAnalog แล้ว เราจะเอาตัวแปร GetAnalog ไปใช้งานต่อก็ง่ายแล้วครับ
บรรทัดต่อมาเป็น function void setup ภายใน function นี้นะครับ เราจะเซต Serial Port ครับ ด้วยคำสั่งนี้

Serial.begin(9600);

ทำไมเราต้องใช้ Serial Port ด้วย จริงๆ เราไม่ต้องใช้ก็ได้นะครับ แต่ที่นี้ถ้าท่านไม่ใช้ Serial Port แล้วท่านจะรู้ได้อย่างไร ว่าค่า Analog ที่ Arduino อ่านได้มันเป็นค่าอะไร เท่าไหร่ นี้แหละครับคือเหตุผลที่ต้องใช้ Serial Port เพื่อที่เวลาที่ Arduino มันอ่านค่ามาได้แล้วก็ให้ส่งค่านั้นมาให้กับคอมพิวเตอร์ผ่านทาง Serial Port คราวนี้เราก็จะรู้ได้แล้วว่า อ๋อ ค่า Analog ที่ Arduino มันอ่านได้จาก VR เป็นค่าเท่านี้ๆ นะ หรือในทางภาษาที่โปรแกรมเมอร์เค้าเรียกกันว่า debug นะครับ
ต่อมาเป็น function void loop ภายใน function นี้มีอยู่ 3 คำสั่ง

GetAnalog = analogRead(A0);
Serial.println(GetAnalog);
delay(500);

คำสั่งแรก
GetAnalog = analogRead(A0);
บรรทัดนี้ คือการสั่งให้ Arduino อ่านค่า Analog ซึ่งอ่านค่าจากขา Analog ที่ A0 ตามที่เราต่อวงจรเอาไว้ การอ่านค่า Analog เราจะใช้ function analogRead() ภายในวงเล็บให้เราใส่หมายเลขขา Analog ของ Arduino ที่เราต้องการจะอ่านค่า

คำสั่งที่สอง
Serial.println(GetAnalog);
คำสั่งนี้แหละครับจะทำให้เรารู้ว่าค่า Analog ที่ Arduino อ่านได้ ที่เก็บเอาไว้ในตัวแปร GetAnalog เป็นเท่าไร โดยที่ Arduino จะส่งค่าที่อ่านได้ผ่านทาง Serial Port มายังคอมพิวเตอร์ และแสดงผลออกที่หน้าจอคอมพิวเตอร์

คำสั่งสุดท้าย
delay(500);
หยุดการทำงานครึ่งวินาที คำสั่งนี้ผมไม่ขออธิบายแล้วนะครับ หากไม่เข้าใจก็ให้วกกลับไปอ่านบทที่ 3
จากนั้นให้ท่านเสียบสาย USB เพื่อเชื่อมต่อระหว่าง Arduino กับคอมพิวเตอร์ ต่อจากนั้นให้ท่านอัพโหลดโปรแกรมไปยัง Arduino แล้วให้ท่านเปิด Serial Monitor ขึ้นมาเพื่อดูค่า Analog ที่ Arduino อ่านค่าได้ ให้ท่านค่อยๆ ลองหมุนปรับ VR จะเห็นว่าค่า Analog ได้มีการเปลี่ยนแปรงค่า


จากภาพจะเห็นว่าพอเราหมุน VR ค่า Analog ที่ Arduino อ่านได้แล้วส่งผ่านมาทาง Serial Port ก็มีการเปลี่ยนแปลงค่า ทีนี้ให้ท่านหมุน VR ไปทางขวาจนสุด ค่าสุดท้ายที่ได้ มาดูภาพนี้กัน (หากท่านดูภาพไม่ชัดให้ท่านกดซูมเข้าไปนะครับ)


จะเห็นว่าค่าสุดท้ายที่ได้ คือ 1023 ท่านเห็นอะไรไหมครับ จากตอนแรกเรายังไม่ได้หมุนปรับ VR ค่าที่ได้เป็น 0 พอเราหมุนปรับ VR เพิ่มขึ้นมาเรื่อยๆ จนได้ค่าสุดท้ายก็คือ 1023 ผมจะสรุปอะไรให้ท่านสักอย่างหนึ่ง คือตรงนี้เราได้ข้อสรุปแล้วว่า ค่า Analog จะมีค่าตั้งแต่ 0 จนถึง 1023
และเรายังได้ข้อสรุปอีกอย่างหนึ่ง นั่นก็คือ ตอนแรกที่เรายังไม่ได้หมุนปรับ VR ค่า Analog ที่อ่านได้คือ 0 ก็หมายความได้อีกอย่างคือ มีไฟเป็น 0 Volt นั่นเอง และเมื่อหมุนปรับเพิ่มค่าไปจนได้ค่าสุดท้ายคือ 1023 อันนี้ก็หมายว่า ค่า Analog ที่ 1023 เราได้ไฟเป็น 5 Volt ท่านอาจจะสงสัยว่าแล้วรู้ได้อย่างไรว่าได้ไฟ 5 Volt ก็มาแหล่งจ่ายไฟก็คือ Arduino จ่ายไฟออกมาให้ VR 5 Volt  ซึ่งเมื่อเราหมุนปรับ VR ไปจนได้ค่าที่ 1023 มันก็จะไม่มีการต้านทานปริมาณไฟแล้วครับ เราจึงได้ไฟ 5 Volt เท่ากันกับแหล่งจ่ายไฟเลย

คราวนี้มาดูการประยุกต์นำไปใช้งาน
เดียวเราจะเอา LED หนึ่งตัว มาต่อเพิ่มเข้าไปในวงจร โดยมีโจทย์อยู่ว่า พอเราหมุนปรับ VR เพิ่มขึ้นก็ให้แสง LED สว่างเพิ่มขึ้น พอเราหมุนปรับ VR ลดลงก็ให้ LED สว่างน้อยลง มาดูวิธีการต่อวงจรกัน


ต่อไปมาดูการเขียน code โปรแกรมกัน

int GetAnalog;
int Fade;
void setup() {
  pinMode(6, OUTPUT);
  Serial.begin(9600);
}

void loop() {
  GetAnalog = analogRead(A0);
  Serial.print(GetAnalog);
  Fade = GetAnalog / 4;
  Serial.print(" ");
  Serial.println(Fade);
  analogWrite(6, Fade);
  delay(100);
}

ในส่วนของโปรแกรมผมขออธิบายที่ function void loop เลยนะครับ
GetAnalog = analogRead(A0);
บรรทัดนี้ก็เหมือนกับโปรแกรมที่เราได้เขียนไปในตอนแรก

Serial.print(GetAnalog);
Serial.print(" ");
Serial.println(Fade);
สามบรรทัดนี้ก็เอาไว้สำหรับ debug นะครับ เพื่อดูค่าที่ Arduino ส่งกลับมา
เรามาดูหัวใจสำคัญกันดีกว่าครับ

Fade = GetAnalog / 4;
analogWrite(6, Fade);
สองบรรทัดนี้แหละครับ บรรทัดแรก เราเอา GetAnalog หารด้วย 4 แล้วก็เอาไปเก็บลงตัวที่ตัวแปร Fade ซึ่งเป็นแบบ int

พอเราได้ค่า Fade ออกมาแล้ว เราก็สั่งให้มัน analogWrite(6, Fdade) คือสั่งให้ LED สว่าง ซึ่ง LED มันต่ออยู่กับขาที่ 6 ของ Arduino

บางท่านอาจจะสงสัยว่าทำไมเราต้องเอา GetAnalog หารด้วย 4 แล้วเก็บลงที่ตัวแปร Fade คืออย่างนี้ครับ ผมขออธิบายที่ function analogWrite(pin, value) ผมขอให้ท่านเปิดไปที่ Documet ของ Arduino นะครับ ไปดูคำอธิบาย function analogWrite(pin, value) ตาม url: http://arduino.cc/en/Reference/analogWrite นี้ครับ ผมขอ copy มาอธิบายเลยนะครับ


Description บอกเราว่า ค่า analog จะเป็นแบบ (PWM Wave) คือจะใช้ได้กับ pin ที่เป็นแบบ PWM อันนี้ให้กลับไปดูในบทที่ 1 นะครับ ว่าขาที่เป็นแบบ PWM มีขาอะไรบ้าง และมันก็บอกเราต่อว่า สามารถนำไปใช้ปรับเพิ่มหรือลดความสว่างของ LED ได้ หรือจะเอาไปใช้สำหรับควบคุม speed motor ก็ได้ครับ
ทีนี้ให้มาดูที่ Parameters เลยครับ การใส่ function anlogWrite() มันต้องการ Parameters 2 ตัวครับ คือ pin กับ value

มาดูที่ Parameter ตัวแรกกันก่อน คือ pin ก็คือ ขาที่เราต้องการให้มัน OUTPUT ออกไปนั่นแหละครับ
Parameter ตัวที่สอง value ใน Document บอกว่า value: the duty cycle: between 0 (always off) and 255 (always on). ก็คือ ค่ามันจะเป็นได้ตั้งแต่ 0 – 255 ครับ ค่าตัวนี้มันเป็นค่าแบบ PWM ครับ ให้ท่านคลิกเข้าไปดูที่ Document ของ PWM Wave ที่อยู่ในส่วนของ Description หรือที่ url: http://arduino.cc/en/Tutorial/PWM แล้วให้ท่านดูที่ภาพนี้ ท่านจะเข้าใจได้ง่ายขึ้น


ให้ท่านดูที่ 0% Duty Cycle - analogWrite(0) จะเห็นว่าจะได้ไฟเป็น 0 Volt นะครับ
คราวนี้มาดูต่อที่ 50% Duty Cycle - analogWrite(127) ค่า analogWrite ที่ 127 จะได้ไฟเป็น 50% ไม่รู้ได้กี่ Volt ผมเดาว่านะจะได้ไฟที่ 2.5 Volt
สุดท้ายให้ท่านมาดูที่ 100% Duty Cycle - analogWrite(255)  ค่า analogWrite ที่ 255 จะได้ไฟเป็น 5 Volt

นี่แหละเป็นที่มาของ Parameter ของเจ้า value มีค่าได้ตั้งแต่ 0 - 255

ที่นี้ย้อนกลับไปที่ว่าทำไมเราต้องเอา GetAnalog หารด้วย 4 นะครับ จากตอนแรกที่เปิดดูค่า debug ทาง Serial Monitor เราจะเห็นว่าค่า GetAnalog มีค่าตั้งแต่ 0 ไปจนถึง 1023 ใช่ไหมครับ คราวนี้ให้ท่านเอา 1023 ตั้งแล้วหารด้วย 4 ดูซิครับ จะได้ค่าเป็นเท่าไร?
คำตอบคือ 1023 / 4 = 255.75 ค่าที่เราได้เป็น 255.75 ใช่ไหมครับ แต่ที่นี้เราเอาค่า 255.75 ไปเก็บไว้ที่ตัว Fade ซึ่งเป็นแบบ int ที่บรรทัดนี้
Fade = GetAnalog / 4;

ตัวแปรที่เป็นแบบ int มันคือตัวแปรที่ใช้เก็บค่าจำนวนเต็ม จะเป็นเต็มบวก หรือเต็มลบก็สามารถเก็บได้ ซึ่งมันสามารถเก็บค่าได้ตั้งแต่ -32,768 ถึง 32,767
เพราะฉะนั้นแล้วตรงนี้เราจะได้ผลลัพธ์ คือ 255 ครับ .75 เป็นเศษก็จะถูกตัดทิ้ง เหลือแต่ส่วนที่เป็นจำนวนเต็ม นี่แหละครับเป็นที่มาว่าทำไมเราต้องเอา GetAnalog มาหารด้วย 4

ตอนที่7 พื้นฐานการใช้งานบอร์ดทดลอง หรือ Protoboard หรืออีกชื่อเรียกว่า Breadboard









ภาพบนนี่แหละครับคือ บอร์ดทดลอง หรือ Protoboard









การใช้งาน Protoboard ผมจะอธิบายง่ายๆ อย่างนี้ครับ
อันดับแรกให้ท่านดูที่หมายเลขหนึ่งก่อนครับ เส้นสีเขียวแต่ละเส้นให้ท่านมองว่ามันเป็นเหมือนสายไฟหนึ่งเส้นครับ ส่วนเส้นสีแดงที่ลากยาวให้ใช้เป็นไฟบวก ส่วนเส้นสีฟ้าที่ลากยาวก็ให้ใช้เป็น Ground
หมายเลขสอง ให้ท่านดูเส้นสีเขียวอีกเหมือนกัน ผมก็ให้ท่านนึกภาพว่าเส้นสีเขียวก็คือเสมือนสายไฟหนึ่งเส้น
อธิบายง่ายๆ ก็คือเส้นสีเขียวที่ผมวาดให้ท่านดูเมื่อท่านเอาไฟมาจิ้มที่รูไหนก็จะมีไฟเชื่อมต่อถึงกันหมดทุกรู

คราวนี้เรามาดูตัวอย่างการต่อวงจรบน Protoboard กัน

จากรูปเป็นการต่อไฟมาใช้แค่เพียงจุดเดียว เพื่อป้อนไฟให้กับ LED 1 ดวง


จากรูปนะครับ จะเห็นว่าเราลากไฟ 5V จากขาที่ 13 ของ Arduino มาจั๊มไว้ที่ตำแหน่งหมายเลขหนึ่งบน Protoboard พอเราได้ไฟ 5V มาใช้งานแล้ว คราวนี้เราจะนำไปใช้งานที่จุดไหนก็ง่ายแล้วครับ ก็แค่จั๊มไฟไปยังจุดที่ต้องการ อย่างในภาพผมต้องการนำไฟไปใช้ยังจุดต่างๆ ตามหมายเลขสอง 

บางท่านอาจจะสงสัยว่าทำไมต้องจั๊มจากขาของตัวต้านทาน คืออย่างนี้ครับ LED นี่มันจะมีขาที่เป็นขาบวก  และขาที่เป็นขาลบอยู่ ซึ่งเราจะต้องต่อให้ถูกครับ ที่ผมต้องจั๊มไฟมาต่อที่ตัวต้านก็เพราะว่า ตัวต้านทานมันต่ออยู่กับขาบวกของ LED ครับ ส่วนการต่อตัวต้านนั้นท่านไม่ต้องคิดมากครับ เพราะตัวต้านมันไม่มีขาบวก หรือขาลบ ต่อด้านไหนก็ได้จากรูป ท่านจะกลับหัวกลับหางตัวต้านก็ได้ไม่ผิดครับ

ไขข้อสงสัย LED และตัวต้านทาน (Resistor)
บางท่านอาจจะมีคำถามทำไหม๊ทำไม เวลาต่อ LED แล้วจะต้องต่อตัวต้านทานในวงจรด้วยทุกครั้ง แล้วอีกคำถามคือเราจะรู้ได้ยังไงว่าเราจะต้องตัวต้านทานขนาดกี่โอห์ม (Ω) 
เรามาดูคำถามแรกกันก่อนดีกว่า ว่าทำไมเวลาต่อ LED แล้วจะต้องต่อตัวต้านทานด้วย ตอบง่ายๆ เลยก็คือเพื่อลดขนาดหรือปริมาณของไฟลง เพื่อป้องกันไม่ให้อุปกรณ์เสียหายเนื่องจากปริมาณไฟเข้าสู่อุปกรณ์มากเกินไป ทำไมผมจึงใช้คำว่าปริมาณหรือขนาดของไฟ เพราะถ้าผมจะใช้คำว่ากระแสไฟผมดูแล้วมันจะขัดๆ อยู่นิดหน่อย เพราะคำว่ากระแสไฟมันหมายถึงแอมป์ ซึ่งมันจะทำให้ท่านสับสนได้ การใช้คำว่าปริมาณหรือขนาดของไฟ มันหมายถึงว่ามีทั้งโวลต์ และแอมป์จ่ายมาพร้อมกัน ถ้าผมพูดว่าลดกระแสลง บางท่านอาจจะเข้าใจว่า อ๋อมันลดจำนวนแอมป์ลง ซึ่งจริงๆ แล้วไม่ใช่ จริงๆ คือมันลดทั้งสองอย่าง
คราวนี้มาดูคำถามที่สองกัน ว่าเราจะต้องใช้ตัวต้านทานกี่โอห์ม อันนี้เป็นข้อมูลที่ผมไปค้นเจอมานะครับ


นี่แหละครับสูตรที่ใช้ในการคำนวณหาค่าตัวต้านทานว่าจะต้องกี่โอห์ม ที่นี้การที่เราจะรู้ค่าตัวแปรพวกนี้เราก็ต้องไป Datasheet ของ LED ครับ แต่อย่างแรกเลยที่เรารู้ค่าได้แน่ๆ คือ Vs ครับ Vs คือ ไฟที่เราจ่ายให้กับอุปกรณ์ ที่เราไม่รู้คือ
R = ?
Vf = ?
If = ?
ที่เราต้องรู้เพิ่มอีกสองตัวคือ Vf กับ If เราจึงจะได้ R ออกมา ที่นี้มาดู Vf กับ If จาก Datasheet ของ LED กัน


ให้ท่านดูที่กรอบสีแดงนะครับ คือ If ที่ Maximum คือ 20 mA คือกระแสที่ไหนผ่าน LED ได้สูงสุด คราวนี้เราได้ If มาแล้ว เหลือ Vf มาดู Datasheet กันต่อ


นี่ครับ Vf ที่ If = 20mA ค่าที่น้อยที่สุดคือ 1.8V ค่าสูงสุดที่ยอมรับได้คือ 2.2V เวลาเอามาคำนวณให้เราใช้ค่า Vf ที่น้อยที่สุดนะครับ คือ 1.8V เพื่อป้องกันความเสียที่จะเกิดกับอุปกรณ์ครับ
คราวนี้มาดูตัวอย่าง ตัวอย่างนี้ผมจะใช้ Arduino เป็นตัวจ่ายไฟนะครับ ซึ่งไฟที่ Arduino จ่ายออกมาคือ 5V ครับ
ที่นี้ก็เอามาเข้าสมการ R = (Vs – Vf) / If แทนค่าในสมการครับ
R = (5-1.8)/0.02 (0.02 คือแปรงจาก 20mA ให้มีหน่อยเป็น A นะครับ ก็เอา 20/1000 จะได้ 0.02A ครับ)
R = 160 Ω
เราได้ค่า R มาแล้วนะครับ เป็น 160 Ω คราวนี้เราก็มาดูมีตัวต้านทานตัวไหนบ้างที่มีขนาดใกล้เคียง 160 Ω สำหรับผมนะครับที่หาได้ใกล้เคียงที่สุด ก็คือ 220 Ω ครับ ให้ปัดขึ้นนะครับ นี่แหละที่มาของการหาค่า R ให้กับ LED ครับ

ผมลืมบอกไปอีกอย่างคือ วิธีหาขาบวก ขาลบ ของ LED
มีอยู่กัน 3 วิธีนะครับ
วิธีแรก คือใช้ มัลติมิเตอร์วัดไปเลย อันนี้ถ้าไครมีมัลติมิเตอร์ก็ง่ายเลยนะครับ แล้วถ้าไครไม่มีละจะทำอย่างไร มาดูกันต่อ

วิธีที่สอง ให้สังเกตที่ขาของ LED ครับ ขายาวเป็นขาบวก ขาสั้นเป็นขาลบครับ ง่ายๆ มากๆ ใช่ไหมครับ แล้วถ้าเกิดว่าท่านเจอ LED ที่ขามันเท่ากันละ ไปดูวิธีสุดท้ายเลย

วิธีที่สาม