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

ตอนที่9 การอ่านค่า Digital ของ Arduino

สัญญาณ Digital นั้นมีแค่สองค่านะครับ คือ 0 กับ 1 ง่ายแค่นี้แหละครับจบ ไม่ต้องงงครับมาดูความหมายนี้กันต่อครับ ที่สัญญาณ Digital มีค่าเป็น 0 ความหมายคือ มันมีปริมาณไฟเป็น 0 Volt ครับ และที่สัญญาณ Digital มีค่าเป็น 1 หมายความว่า มีปริมาณไฟเป็น 5 Volt ครับ
คราวนี้เรามาดูวิธีการอ่านค่า Digital กันเลยดีกว่า ซึ่งเราจะใช้อุปกรณ์ดังนี้
1. สวิทช์กดติด ปล่อยดับ จำนวน 1 ตัว
2. ตัวต้านทาน 10K Ω จำนวน 1 ตัว (โดยทั่วไปเค้าจะนิยมใช้ 5K – 20K Ω ครับ)
3. สายไฟ
4. บอร์ดทดลอง
อุปกรณ์ตัวสำคัญที่ใช้สำหรับอ่านค่า Digital คือ เจ้าสวิทช์กดติด ปล่อยดับ นี่แหละครับ พอเรากดปุ่มสวิทช์มันก็จะส่งสัญญาณ Digital ออกมาเป็น 1 แล้วพอเราปล่อยมือออกจากสวิทช์มันก็ส่งสัญญาณ Digital ออกเป็น 0
เรามาดูวิธีการต่อวงจรกันเลยดีกว่า

จากรูปการต่อวงจร เจ้าตัวสวิทช์มันต้องการไฟ 5V ซึ่งต่ออยู่ที่ขาทางขวาของสวิทช์ ที่นี้มาดูขาของสวิทช์ทางซ้ายกัน ดูที่สายไฟเส้นสีเขียวก่อน เส้นสีเขียวนี้เราเอาไว้สำหรับให้ส่งสัญญาณไปบอก Arduino ถ้าท่านกดปุ่มอยู่ก็จะส่งสัญญาณ Digital เป็น 1 ไป ถ้าท่านไม่ได้กดปุ่มอยู่ ก็จะส่งสัญญาณ Digital ออกไปเป็น 0 ที่ก็เป็นหน้าที่ของท่านละ ว่าเมื่อเวลากดปุ่มสวิทช์แล้วจะให้มันทำอะไรต่อ
คราวนี้มาดูที่สายไฟสีดำซึ่งเป็น Ground ต่ออยู่กับตัวต้านทาน การต่อแบบนี้เค้าเรียกว่าการต่อวงจรแบบ Pull Down Resistor คราวนี้มาดูการเขียนโปรแกรมสำหรับอ่านค่าการกดปุ่ม หรือไม่ได้กดปุ่ม Switch และผลลัพธ์กัน

void setup() {
  pinMode(2, INPUT);
  Serial.begin(9600);
}

void loop() {
  int stateButton;
  stateButton = digitalRead(2);
  Serial.println(stateButton);
  delay(500);
}

ผลลัพธ์จากการต่อวงจรแบบ Pull Down Resistor

(ภาพ ผลที่ได้จากการต่อวงจรแบบ Pull Down Resistor)

จากผลลัพธ์ที่ได้ในตอนแรกค่าที่ได้เป็น 0 ซึ่งยังไม่มีการกดปุ่ม switch พอเรากดปุ่ม switch ค่าที่ได้จะเป็น 1 ซึ่งสรุปได้ว่าการต่อวงจรแบบ Pull Down Resistor จะทำงานที่ Active เป็น HIGH ครับ
ที่นี้ผมจะขอย้อนกลับไปอธิบายโปรแกรม
ในส่วนของ function setup() ก็มี 2 คำสั่ง

pinMode(2, INPUT);
บรรทัดนี้คือเป็นการบอกว่าให้รับค่าการกดปุ่มที่ PIN 2

Serial.begin(9600);
บรรทัดนี้เป็นการกำหนดให้ Serial Port รับส่งข้อมูลกันที่ความเร็ว board rate 9600

ต่อมาในส่วนของ function loop()
int stateButton;
ประกาศตัวแปรชื่อ stateButton เป็นแบบ integer
stateButton = digitalRead(2);
เราใช้คำสั่ง digitalRead(2) คำสั่งนี้ใช้สำหรับอ่านค่า digital จากขา(PIN) ที่เราต้องการ แล้วนำไปเก็บลงตัวแปร stateButton 

Serial.println(stateButton);
บรรทัดนี้ก็สั่งให้ปริ้นค่า digital ที่อ่านได้ออกทาง serial monitor

คราวนี้เรามาดูวิธีการต่อวงจรกันอีกแบบครับ เป็นการต่อวงจรแบบ Pull Up Resistor ซึ่งเป็นที่นิยมมากกว่าในการนำไปใช้งาน

ต่อมาเรามาดูโปรแกรมกันเลยครับ

void setup() {
  pinMode(2, INPUT);
  Serial.begin(9600);
}

void loop() {
  int stateButton;
  stateButton = digitalRead(2);
  Serial.println(stateButton);
  delay(500);
}

คุ้นไหมครับโปรแกรม ท่านผู้อ่านบางท่านอาจจะร้อง “เอ้ย นี่มันโปรแกรมเดิมนี่นา” ใช่แล้วครับผมเอาโปรแกรมตัวเดิมมาใช้เลย ผมอยากจะให้ท่านเห็นอะไรบางอย่าง มาดูภาพนี้กันเลยครับ

(ภาพ ผลที่ได้จากการต่อวงจรแบบ Pull Up Resistor)

รูปด้านบนเป็นผลลัพธ์ที่ได้จากการต่อวงจรแบบ Pull up resistor ท่านเห็นอะไรไหมครับ พอเราเปิด Serial Monitor ขึ้นปั๊บ ก็จะเห็นเลข 1 เรียงลงมาเลย แล้วต่อมาก็ตามมาด้วยเลย 0 เลข 1 ที่ท่านเห็นคือสถานะของ Switch ที่ยังไม่ได้กดปุ่มนะครับ พอผมกดปุ่ม Switch ปั๊ม ก็จะได้เลข 0 เรียงลงมา

ผมขอชี้ให้ท่านเห็นอะไรบางอย่าง ผมขอให้ท่านกลับไปรูปผลลัพธ์ที่ได้จากต่อวงจรแบบ Pull Down Resistor ก่อนครับ ท่านจะเห็นว่า ในตอนเริ่มต้นนั้นยังไม่ได้ทำการกดปุ่ม Switch ผลที่ได้เราจะได้ค่าสถานะของ Switch เป็น 0 พอกดปุ่ม Switch ผลที่ได้ เป็น 1 การเขียนโปรแกรมก็จะเขียนโปรแกรมเมื่อวงจรมีสถานะเป็น Active High

ที่นี้พอเรามาต่อวงจรแบบ Pull Up Resistor ผลที่ได้จากค่าสถานะของ Switch ก็จะกลับกันครับ การเขียนโปรแกรม ก็จะเขียนโปรแกรมเมื่อวงจรมีสถานะเป็น Active Low

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


จากรูปด้านบนผมนำมาประยุกต์ใช้งานกับ Pull Up Resistor นะครับ ทีนี้มาดูโปรแกรมกันต่อเลยครับ

void setup() {
  pinMode(2, INPUT);
  pinMode(7, OUTPUT);
  Serial.begin(9600);
}

void loop() {
  int stateButton;
  stateButton = digitalRead(2);
  if (stateButton == LOW) {
    digitalWrite(7, HIGH);
  }
  else {
    digitalWrite(7, LOW);
  }
  Serial.println(stateButton);
  delay(500);
}

จากรูปการต่อวงจร ผมได้เพิ่ม LED เข้าไป ตามโจทย์ โดยจะให้ LED เป็น วงจร OUTPUT ซึ่งผมต่อไว้กับขาที่ 7 ของ Arduino จากโปรแกรมผมขอไม่อธิบายการทำงานเบื้องต้นแล้วนะครับ เพราะผมได้อธิบายไปหมดแล้วในตอนต้น ซึ่งในวงจรนี้มีแค่การเพิ่ม LED เข้ามา 1 ดวง ให้ท่านมาดูที่หัวใจของโปรแกรมกันเลยดีกว่าครับ ผมจะยกเอาแค่ส่วนนี้มาอธิบายนะครับ

  if (stateButton == LOW) {
    digitalWrite(7, HIGH);
  }
  else {
    digitalWrite(7, LOW);
  }

อธิบายง่ายๆ เลย ถ้า stateButton มีค่าเท่ากับ LOW ก็ให้ LED สว่าง ถ้าไม่ใช่มันก็จะมาตกที่ else คือทำงานในคอกของ else {} เครื่องหมายปีกกาเปิด-ปิด นี่แหละครับผมเรียกมันว่าคอก ในคอกของ else มีอยู่คำสั่งเดียวคือ 
digitalWrite(7, LOW);
คำสั่งนี้คือ ให้ Arduino ไม่ต้องจ่ายไฟออกมา ซึ่งจะทำให้ LED ดับนั่นเอง

ในตอนแรกเราได้ทดลองอ่านค่าสถานะของ Switch แล้วใช่ไหม นี่แหละครับพอเราอ่านค่ามันออกมาได้แล้ว ค่าที่เราได้จากสถานะของ Switch มี 0 กับ 1, 0 ก็คือ LOW, 1 ก็คือ HIGH ครับ ทีนี้เราก็จะนำมาเขียนโปรแกรมต่อก็ได้แล้ว และจากการนำมาประยุกต์ใช้งาน ผมนำเอาวงจรแบบ Pull Up Resistor มายกตัวอย่างการนำไปใช้งาน และที่ผมได้บอกไปว่า วงจรแบบ Pull Up Resistor เวลาเขียนโปรแกรม เราต้องเขียนโปรแกรม Active LOW ครับ ก็ตาม CODE ที่ได้ยกตัวอย่างไปนั่นแหละครับ

วันพฤหัสบดีที่ 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 ที่ขามันเท่ากันละ ไปดูวิธีสุดท้ายเลย

วิธีที่สาม


วันพุธที่ 8 กรกฎาคม พ.ศ. 2558

ตอนที่6 การออัพโหลดโปรแกรมไปให้กับ Arduino

ดูตามภาพเลยนะครับ


อันดับแรกให้กดปุ่มกรอบสีแดงที่หมายเลขหนึ่ง ซึ่งเป็นการ compile โปรแกรมที่เราเขียนเสร็จแล้ว บางท่านอาจจะไม่เคยเขียนโปรแกรม ก็อาจจะสงสัยว่า compile คืออะไร ผมจะอธิบายให้ท่านทราบคร่าวๆ ง่ายๆ อย่างนี้นะครับ ตัวที่เราใช้เขียนโปรแกรม ดูจากภาพด้านบนนะครับ พูดง่ายๆ มันก็คือโปรแกรมตัวหนึ่งที่สร้างขึ้นมาเพื่อให้เหล่าโปรแกรมเมอร์ทั้งหลาย ได้ใช้สร้างโปรแกรม ซึ่งเค้าได้ตั้งซื่อให้มันว่า Arduino ผมขอเรียกมันว่า โปรแกรม Arduino ก็แล้วกันนะครับ เจ้าตัวโปรแกรม Arduino ตัวนี้ มันก็จะมีกฎกติกาต่างๆ เก็บเอาไว้ที่ตัวมัน พอเราเขียนโปรแกรมเสร็จ แล้วกดปุ่ม compile หรือ verify นั่นแหละ มันก็เอาโปรแกรมที่เราเขียนขึ้นไปตรวจเช็คกับกฎกติกาต่างๆ ของมัน ว่ามีข้อผิดพลาดหรือไม่ นี่แหละครับที่ภาษาโปรแกรมเมอร์เค้าเรียกกันว่า compile

ถ้าหากไม่มีข้อผิดพลาดอะไร ท่านก็จะเห็นข้อความด้านล่างในกรอบสีฟ้าเขียว จะขึ้นข้อความ Done comiling.

แต่ถ้าหากมีข้อผิดพลาด


ท่านก็จะเจอข้อความบอกว่า Error compiling. ในกรอบสีส้มด้านบน และมีข้อความสามบรรทัดด้านล่างบอกลักษณะของ Error
Arduino: 1.6.0 (Windows 8), Board: "Arduino Uno"

sketch_mar11a.ino: In function 'void loop()':
sketch_mar11a.ino:9:3: error: expected ';' before 'delay'
Error compiling.

บรรทัดแรกบอกว่า อยู่ใน function void loop นั่นแหละ ลองหาดู
บรรทัดที่สองบอกว่ายังไม่ได้ใส่เครื่องหมาย ";" ก่อน delay นะ
ปรากฏว่าพอกลับไปดูที่โปรแกรมที่เราเขียน ก็จะเห็นว่าเราลืมใส่เครื่องหมาย ";" ที่บรรทัด digitalWrite(13, LOW)

void loop() {
  digitalWrite(13, HIGH);  
  delay(1000);         
  digitalWrite(13, LOW)
  delay(1000);           
}

เจอ Error แล้วก็จัดการแก้ให้ถูกต้องซะ พอเราแก้ไขโปรแกรมเสร็จเรียบร้อยแล้วก็ให้เราทำการอัพโหลดโปรแกรมไปให้กับ Arduino Uno ให้ท่านทำตามภาพ


กดปุ่ม Upload ในกรอบสีแดงที่หมายเลขสอง แล้วก็รอจนกว่าจะมีข้อความบอกว่า Done compiling เท่านี้ก็เสร็จสิ้นแล้วครับ กับการ Upload โปรแกรมไปให้ Arduino Uno

ตอนที่5 มาเริ่มต้นกันเลยดีกว่า

ในบทนี้เราจะมาเริ่มจากการต่อวงจรอย่างง่ายกัน เป็นวงจรควบคุมไฟ LED ครับ ซึ่งเป็นพื้นฐานอย่างดีในการเรียนรู้ Microcontroller กับเจ้า Arduino ครับ
อุปกรณ์ที่ต้องใช้สำหรับการเรียนในบทนี้
1. Arduino Uno R3
2. Protoboard หรือบอร์ดทดลองครับ มันใช้สำหรับออกแบบวงจรที่เป็นต้นแบบ หลังจากที่เราออกแบบเสร็จ แก้โน่นนี่จนพอใจแล้ว ก็นำวงจรนี้ไปใช้งานกับบอร์ดจริงครับ
3. LED 1 ดวง
4. ตัวต้านทาน 220Ω หรือ 330Ω ก็ได้นะครับ
5. สายไฟ


จากนั้นให้ท่านต่อวงจรตามภาพด้านบนนะครับ


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

จากนั้นให้ท่านเขียนโปรแกรมตามนี้ครับ

void setup() {
  pinMode(13, OUTPUT);
}

void loop() {
  digitalWrite(13, HIGH);  
  delay(1000);         
  digitalWrite(13, LOW);  
  delay(1000);           
}

การเขียนโปรแกรมสำหรับ Arduino นั้นจะมีฟังก์ชั่นหลักๆ อยู่สองฟังก์ชั่นนะครับ ผมขอเขียนคำว่าฟังก์ชั่น เป็น function แบบภาษาอังกฤษดีกว่านะครับ ดูแล้วเข้าท่ากว่า เอาละ มาต่อกัน

Function แรก ก็คือ void setup() {...} ให้ท่านเข้าใจคร่าวๆ ไว้ดังนี้ก่อนนะครับ หลังจากเราพิมพ์คำว่า void setup() เสร็จ แล้วตามด้วยเครื่องหมายปีกกาเปิด ภายในเครื่องปีกกาเปิดจะเป็นคำสั่งเอาไว้สำหรับ กำหนดค่าเริ่มต้นต่างๆ ให้กับ Arduino อย่างเช่น กำหนดขา Digital ให้ใช้สำหรับ Input ข้อมูล หรือ Output ข้อมูล โดยการใช้คำสั่ง pinMode

pinMode(13, OUTPUT) 

จากตัวอย่างบรรทัดด้านบน หมายความว่ากำหนดให้ขาที่ 13 ของ Arduino ใช้สำหรับ OUTPUT ทีนี้แล้วมันจะ OUTPUT ยังไง ก็จะต้องมีอุปกรณ์ OUTPUT มาต่อเข้าที่ขา 13 ที่ได้ประกาศเอาไว้ จากตัวอย่างก็คือใช้ ตัว LED เป็นอุปกรณ์ OUTPUT นอกจากนี้ก็ยังมีอีก อย่างเช่น

Serial.begin(9600)

บรรทัดนี้เป็นการกำหนดค่าเริ่มต้นให้กับ Serial Port หรือ เรียกอีกอย่างว่า RS232 ให้รับส่งข้อมูลระหว่างเครื่องคอมพิวเตอร์ของเรากับเจ้า Arduino ที่ความเร็ว 9600 ตัวเลข 9600 ที่อยู่ภายในวงเล็บเรียกอีกอย่างว่า ความเร็ว Baud ratesตัวเลข Baud rates นี้ไม่ได้มีแค่ 9600 นะครับ ยังมีค่าอื่นๆ อีก ถ้าท่านอยากรู้เพิ่มเติมก็ให้ไปเปิดตาราง RS232 เอานะครับ แต่ตอนนี้ให้เราใช้ 9600 ไปก่อน
หรือ อีกสักตัวอย่าง คือพอเราเปิด Arduino ทำงานปั๊มก็ให้ LED ติดขึ้นมาเลย ก็ให้ใช้คำสั่งนี้

digitalWrite(13, HIGH) 

พอเรากำหนดค่าเริ่มต้นต่างๆ ให้กับ Arduino เสร็จแล้วก็ให้ใส่เครื่องปีกปิดให้เรียบร้อยด้วย ดังตัวอย่าง

void setup() {
  pinMode(13, OUTPUT);
}

อย่างนี้คือเสร็จเรียบร้อย

ต่อมา Function  void loop(){...} ซึ่งเจ้า void loop() จะเริ่มทำงานหลังจากที่ void setup() ทำงานเสร็จแล้ว คราวนี้มาดูตัวอย่างคำสั่งที่อยู่ใน function void loop() กัน

  digitalWrite(13, HIGH);  
  delay(1000);         
  digitalWrite(13, LOW);  
  delay(1000);           

จากตัวอย่าง 4 บรรทัดด้านบน 
บรรทัดแรก digitalWrite(13,HIGH); หมายความว่า สั่งให้ LED ที่ต่ออยู่ที่ขา 13 ของ Arduino สว่าง หรือติดนั่นเอง หรือจะตีความหมายในทางเทคนิคก็ได้นะครับ ความหมายในทางเทคนิคก็คือ สั่งให้ Arduino ปล่อยไฟขนาด 5V. ออกจากขาที่ 13 ซึ่งก็จะทำให้ LED สว่างครับ

บรรทัดที่สอง delay(1000); หมายความว่าให้หยุดอยู่ที่บรรทัดนี้ 1 วินาที แล้วจึงค่อยไปทำงานที่บรรทัดถัดไป แล้วถ้าเราอยากได้มากว่า 1 วินาทีละ ทำอย่างไร ก็เอา 1000 คูณเข้าไปครับ หรืออยากได้ครึ่งวินาทีละ ก็ใส่ 500 เข้าไปครับ

ต่อมาบรรทัดที่สาม อันนี้ง่ายมากทุกท่านนะจะเดาออกนะครับ บรรทัดนี้ก็เหมือนกับบรรทัดแรก เพียงแต่กลับกัน คือจาก LED สว่างอยู่ ก็ให้ดับ หรืออีกความหมายก็คือ Arduino ปล่อยไฟ 0V ออกมาให้นั่นเองครับ

บรรทัดสุดท้าย บรรทัดที่สี่ครับ ทำงานเหมือนกันเลยกับบรรทัดที่สอง

พอทำงานจนถึงบรรทัดสุดท้ายเสร็จแล้ว เจ้า function void loop() เนี่ยมันมีความสามารถพิเศษอยู่อย่างหนึ่งก็คือ มันจะวนกลับขึ้นไปทำงานที่คำสั่ง บรรทัดแรกไล่ลงมาเรื่อยๆ บรรทัดที่สอง... จนถึงบรรทัดที่สี่อีก วนไปอย่างนี้ตลอดครับ นี่แหละที่เค้าตั้งชื่อให้ function นี้ ชื่อว่า loop ก็เพราะสาเหตุนี้แหละครับ

อธิบายเพิ่มอีกสักหน่อยนะครับ เริ่มแรกเลยพอเราจ่ายไฟให้กับ Arduino เจ้า Arduino ก็เริ่มทำงาน มันจะวิ่งไปหาว่า function void setup(){...} อยู่ที่ตรงไหน พอมันเจอปั๊ม มันก็เริ่มทำงาน บรรทัดคำสั่งที่ถัดจากเครื่องหมายปีกกาเปิด ไล่ลงมาเรื่อยๆ บรรทัดที่สอง บรรทัดที่สาม... จนมาเจอเครื่องหมายปีกกาปิด คือสิ้นสุดการทำงานของ function void setup() เจ้า function void setup() นี้ทำงานแค่ครั้งแรก และครั้งเดียวนะครับ ต่อจากนั้นมันก็วิ่งไปทำงานที่ function loop() ต่อ ซึ่งการทำงานภายใน function นี้จะเป็นการทำงานที่ไม่รู้จบ นะครับ

ในเบื้องต้นเราจะใช้แค่สอง function ที่เราจะใช้ในการเขียนโปรแกรมสั่งงาน Arduino ครับ และผมต้องขอบอกอีกอย่างนะครับ เนื่องจากภาษาที่เราใช้โปรแกรม Arduino นี้มาจากภาษา C ซึ่งจะมีกฎเกณฑ์เหมือนกับภาษา C เลยครับ กฎข้อแรกที่ท่านต้องจำเอาไว้ก็คือ การเขียนโปรแกรม Arduino นั้น เวลาที่ท่านพิมพ์ ตัวพิมพ์เล็ก ตัวพิมพ์ใหญ่ มีความสำคัญนะครับ ความหมายคือ ต้องพิมพ์ให้ถูกเปะๆ เลยครับ อย่างเช่น คำสั่ง pinMode(13, HIGH) นี่คือคำสั่งที่ถูกต้อง แต่ถ้าท่านพิมพ์แบบนี้เมื่อไหร่ pinmode(13, high) ผิดเลยทันทีครับ

ซึ่งถ้าท่านอยากมีพื้นฐานที่ดีสักหน่อย ผมขอแนะนำเลยครับ ให้ไปหาหนังสือภาษา C เบื้องต้นมาฝึกครับ ฝึกอย่างไร ก็ฝึกจากการดูตัวอย่างลองเขียนโปรแกรม ศึกษากฎกติกาต่างๆ ที่ภาษาเค้ากำหนดเอาไว้ เบื้องต้นเอาแค่นี้ก่อน แล้วท่านจะไปได้เร็วขึ้นครับ