วันพฤหัสบดีที่ 30 พฤศจิกายน พ.ศ. 2560

การเขียนโปรแกรมเบื้องต้นกับ Arduino (การอ่านค่า Analog )

ไม่มีความคิดเห็น

การอ่านค่า 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

ไม่มีความคิดเห็น :

แสดงความคิดเห็น