จะ LED หรือหลอดไฟในบ้าน มันก็เขียนโปรแกรมคล้ายกันนั่นแหละ เรียนรู้การเขียนควบคุม output


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


แต่ก่อนจะเริ่มเข้าเนื้อหา อยากจะขอทำความเข้าใจอะไรบางอย่างก่อน.. เราได้ยินคำว่า Arduino กันมาตั้งแต่บทความที่แล้วแล้ว แต่ Arduino คืออะไร หลาย ๆ คนก็อาจจะยังไม่รู้จักเลยด้วยซ้ำ ซึ่งจริง ๆ แล้วก็มีคนเข้าใจผิดเกี่ยวกับ Arduino อยู่กันพอสมควร ถ้าอยากรู้เพิ่มเติมก็อ่านบทความนี่เพิ่มอีกนิด Arduino คืออะไร? แต่อยากให้รู้ไว้อีกนิดนะว่าถ้าเจ้าของพูดถึง Arduino ในบทความนี้ มันก็คือเจ้าบอร์ดตัวสีฟ้า ๆ ที่เสียบอยู่ในบอร์ดชุดเรียนรู้นั่นเอง


บอร์ดตัวนี้ถือว่าเป็นพระเอกของเราเลยก็ว่าได้ เพราะถ้าไม่มีตัวนี้เราก็เขียนโปรแกรมหรือเรียนรู้อะไรไม่ได้เลยย.. เพราะงั้นมาดูบอร์ดนี้กันให้ชัด ๆ

ผลการค้นหารูปภาพสำหรับ arduino nano
https://www.amazon.com/ATmega328P-Microcontroller-Board-Cable-Arduino/dp/B00NLAMS9C
เมื่อเรารู้จักตัวเอกของเรากันไปแล้ว เราก็มาเริ่มกันเลยดีกว่า ถึงตรงนี้เจ้าของบล็อกก็คิดว่าในเครื่องคอมของผู้อ่านเองคงมีโปรแกรม Arduino IDE กันแล้วใช่ไหม..? ห๊ะยังไม่มีอีกหรอ ถ้าไม่มีก็ไปโหลดมาไว้เลยยยย กดดด ถ้าพูดถึงการติดตั้งโปรแกรมเจ้าของบล็อกไม่สอนนะ คิดว่าไม่ยากเกินกำลังของผู้อ่านนะครับ แต่ก็ส่งใจช่วย 

เนื้อหาที่มีในบทความนี้
• การใช้งาน Arduino IDE เบื้องต้น
• เรียนรู้ function ควบคุม Output
• ใช้งาน Relay ต่อกับหลอดไฟ


การใช้งาน Arduino IDE เบื้องต้น

ก่อนที่เราจะเริ่มเขียนโปรแกรม เราก็ต้องมารู้จักเครื่องมือของเราก่อน ถ้าเราไม่รู้จักเครื่องมือของเราดีพอ เราก็คงดึงศักยภาพในการทำงานของเราออกมาไม่ได้ทั้งหมดจริงมั้ย..?

นี่คือหน้าตาของ Arduino IDE ที่ผู้อ่านทุกคนจะต้องเจอ เมื่อเปิดโปรแกรมหลังจากที่ติดตั้งเสร็จเรียบร้อยกันแล้ว ส่วนการใช้งานเบื้องต้นคร่าว ๆ มีคนเขียนไว้เยอะมากและเจ้าของบล็อกก็ไม่อยากเขียนซ้ำกับชาวบ้าน (แอบขี้เกียจ) ก็ลอง search หา key word ง่าย ๆ ก็ยังเจอ Arduino IDE การใช้งาน แต่ยังไงก็จะมีการแนะนำการติดตั้งให้เหมาะสมกับการใช้งานบอร์ดเรียนรู้ชุดนี้

อย่างแรกให้เราไปเลือกบอร์ด Arduino Nano เป็นบอร์ดที่เราไว้ใช้เรียนรู้ร่วมกับชุดทดลองชุดนี้ และถ้าหากว่าเราเลือกบอร์ดไม่ตรง โปรแกรมก็จะมี Error หรือข้อผิดพลาดทำให้ไม่สามารถลงโปรแกรมใน Arduino ได้
ไปที่ Tools -> Board -> Arduino Nano
ใกล้ ๆ กัน ให้เราเลือก Processor เป็น "ATmega328P (Old Bootloader)" ตรงนี้สำคัญ เพราะปกติมันจะเลือกแบบธรรมดา ซึ่งบอร์ด Arduino nano ที่เราใช้ ๆ กันอยู่ทั่วไป ส่วนใหญ่ยังใช้ Bootloader รุ่นเก่า ๆ อยู่ แต่ถ้าใช้แบบ Old bootloader ไม่ได้ก็กลับไปใช้แบบปกติดู "ATmega328P" 

ไปที่ Tools -> Processor -> ATmega328P (Old Bootloader)
ในส่วนต่อไปคือการ config ให้กับตัว Arduino IDE นิดหน่อย เวลาใช้งานเราจะได้เขียนโปรแกรมง่ายขึ้น
ไปที่ File -> Preferences
เมื่อกดไปที่ Preferences จะขึ้นหน้าต่างนี้ ให้เราเลือกตามเจ้าของบล็อกได้เลย  

ซึ่งในส่วนของ Show verbose output during ก็คือให้เราเลือกโชว์รายละเอียดตอนที่เรากำลัง compile และก็ upload

Display line numbers เราก็จะเห็นเลขบรรทัด มันง่ายเวลาเราไล่ดูโค้ดว่าเราผิดตรงไหน

Enable code folding เมื่อเราติ๊กตรงนี้ ก็จะเพิ่มความสามารถ พับเก็บโค้ดได้ ในกรณีที่เราเขียนโปรแกรมย้าวยาว ขี้เกียจเลื่อน เราก็พับเก็บโค้ดบางส่วนที่เรายังไม่ได้สนใจเก็บไว้ แต่ว่าตอน upload โค้ดพวกนี้ลงบอร์ด โค้ดพวกนี้ก็ยังใช้ได้อยู่ แค่ไม่ได้แสดงให้เห็นแค่นั้น


เรียนรู้ function ควบคุม Output

ในที่สุดก็เริ่มได้เล่นบอร์ดกันซักที เจ้าของบล็อกก็ตื่นเต้นเหมือนกัน :D มาเข้าเรื่องกันดีกว่า ในบทความที่แล้วเราได้พูดถึงเรื่อง Digital output ไปบ้าง ซึ่งในส่วนนี้นี่แหละเราจะมาทำความเข้าใจและใช้งานกัน

เป็น function ที่เรียบง่ายและใช้งานสะดวก เกี่ยวกับการใช้ Output ของ Arduino ซึ่งมี function ที่เราควรรู้อยู่ได้กัน 2 function นั่นก็คือ..
pinMode(pin, mode) และ digitalWrite(pin, value)
digitalWrite(pin, value) เป็นคำสั่งที่ตรงไปตรงมา แปลตามตัวก็คือการเขียน digital ออกมา โดย Pin ที่เราใช้จะมีตัว 'D' นำหน้าตัวเลข 



เราใส่ค่าเข้าไปใน function digitalWrite(pin, value) ซึ่ง pin ก็คือ Digital Pin ที่ขึ้นต้นด้วยตัว D นั่นแหละ และ value ก็คือค่าที่จะสั่งให้ pin นั้นเป็น 1 หรือ 0 ซึ่ง 1 ก็คือ HIGH (จ่ายไฟออกที่ pin นั้น) และ 0 ก็คือ LOW (หยุดจ่ายไฟที่ pin นั้น) ทีนี้เรามาดูที่ชุดบอร์ดการเรียนรู้เรากันดีกว่าว่า LED ของเราอยู่ที่ pin ไหนบ้าง



จะเห็นว่า LED ของเราทั้ง 4 ดวงจะต่อไว้ที่ pin D9 D6 D5 และ D3 ซึ่ง LED ที่เห็นจะใช้ pin ที่ขึ้นต้นด้วย D ทั้งหมด ทีนี้ถึงเวลาที่เราลองมาเขียนควบคุม LED กัน!!
void setup() {
  // put your setup code here, to run once:

}

void loop() {
  // put your main code here, to run repeatedly:
  digitalWrite(9, 1);
  delay(500);
  digitalWrite(9, 0);
  delay(500);
}
จะมี function แปลก ๆ เพิ่มมา 1 อัน ก็คือ delay ตรงนี้ไม่ต้องแปลกใจ แปลตรงตัวก็คือการหน่วงเวลานั่นเอง โดยที่เจ้าของบล็อกให้มันหน่วงเวลาไว้ที่ 500 millisecond หรือก็คือ 0.5 วินาที นั่นเอง

ให้ผู้อ่านลองเขียนโดยเลือก pin ของเราขึ้นมาเอง โดยเลือกจาก pin LED ทั้ง 4 ดวงนี้ แล้วลองดูผลลัพธ์กัน!!?


. . .


จากที่เจ้าของบล็อกได้ลองไป ผลลัพธ์ของเจ้าของบล็อกคือ LED มันติดและดับนะ แต่ว่าแสงไฟมันหรี่มาก หรือผู้อ่านบางคนอาจจะไม่ติดเลย สาเหตุที่เป็นแบบนี้เพราะว่าเรายังไม่ได้กำหนด pin ว่าจะให้ pin นั้นทำงานยังไง โดย Arduino จะให้เราเลือกอยู่ด้วยกัน 2 แบบ ก็คือจะให้ pin นั้นเป็น Output หรือว่าจะให้ LED pin นั้นเป็น Input นั่นเอง ซึ่งไอ่ตัวที่กำหนดหน้าที่ให้ pin ใด ๆ ก็ตามมันก็คือ function pinMode(pin,mode) ถึงตรงนี้เราควรจะกำหนด pin LED นี้เป็น Input หรือ Output..? คำตอบก็คือ Output นั่นเอง ถ้าใครตอบไม่ถูกก็เขกโต๊ะ 3 ที แล้วลองย้อนกลับไปอ่านบทความที่แล้วใหม่นะ :p
void setup() {
  // put your setup code here, to run once:
  pinMode(9,OUTPUT);
}

void loop() {
  // put your main code here, to run repeatedly:
  digitalWrite(9, 1);
  delay(500);
  digitalWrite(9, 0);
  delay(500);
}
เมื่อเราลองเติม pinMode เข้าไป ก็ลองอัพโปรแกรมลงบอร์ดใหม่แล้วรอดูผลลัพธ์ ถึงตรงนี้เจ้าของบล็อกก็คิดว่าไม่น่ามีปัญหาอะไรแล้ว สิ่งที่เจ้าของบล็อกอยากจะแนะนำคือ อยากให้ผู้อ่านลองเขียนควบคุม LED หลาย ๆ ตัวดู ลองเล่น ๆ ทำความคุ้นเคยกับ function นี้ digitalWrite ซึ่งเป็น function พื้นฐานที่สำคัญ และคิดว่าได้ใช้บ่อย ๆ ด้วย

ใช้งาน Relay ต่อกับหลอดไฟ

ต่อยอดกับเนื้อหาก่อนหน้านี้ที่เราได้ลองเขียนโปรแกรมควบคุม Output ของ Arduino กันแล้ว หัวข้อถัดมาก็ยังเกี่ยวกับ Output ของ Arduino อยู่ดี แต่ว่าเราจะไม่ใช้หลอด LED แล้ว เจ้าของบล็อกจะใช้เป็นหลอดไฟที่ต่อกับไฟบ้านแทน (แต่ในตัวอย่างก็เป็นหลอด LED อยู่ดี ><)


จะเห็นว่าเจ้าของบล็อกได้ตัดสายไฟเส้นนึงออก เพราะเราจะเอาตัวที่ทำหน้าที่เป็น switch มาต่อขั้นตรงกลางไว้ เพื่อทำหน้าที่ตัดและต่อวงจร ถ้าวงจรถูกต่อหลอดไฟก็จะติด
โดยปกติทั่วไปที่บ้านเราก็จะเป็น switch ที่ติดตามผนังเปิดปิดไฟธรรมดา ตรงนั้นจะเป็นแบบ manual switch หรือก็คือ switch ที่เราต้องไปกดเปิดปิดมันเอง แต่ในหัวข้อนี้เราจะใช้ Arduino เป็นตัวเปิดปิดไฟให้เรา เพราะฉะนั้นเราก็ต้องใช้ switch ทางวงจรของเรา นั่นก็คือ Relay นั่นเอง

หลาย ๆ คนมักสับสนระหว่าง relay กับ delay คำมันจะใกล้เคียงกัน แต่คนละความหมายโดยสิ้นเชิง relay ก็คือ switch ทางวงจร พูดง่าย ๆ คือแทนที่เราจะใช้มือเราไปเปิดปิด switch เอง เราก็จะใช้ arduino มาเปิดปิด switch ให้แทนแต่มันต้องใช้ switch แบบเฉพาะหน่อยนั่นก็คือ relay นั่นแหละ


เจ้าของบล็อกจะต่อไว้ที่ช่อง com และ NO(Normal Open) ซึ่งการต่อแบบนี้คือเวลาปกติไม่ทำอะไรหลอดไฟมันจะไม่ทำงาน อยุ่ยังไงก็อยู่อย่างนั้น แต่ถ้าเกิดเจ้าของบล็อกลองสลับ NO ย้ายไป NC(Normal Close) หลอดไฟก็จะติดโดยที่เรายังไม่ทำอะไร แต่ถ้าเราสั่ง switch ที่ relay หลอดไฟก็จะดับ พูดง่าย ๆ คือ 2 ช่องนี้มันทำงานตรงข้ามกันอยู่ ต่อแบบนึงก็จะดับตลอด ต่ออีกแบบก็จะติดตลอด

โปรแกรมการทำงานของ relay ก็จะเหมือนกันเป๊ะ ๆ กับที่เราเขียน LED ก่อนหน้านี้เลย แต่เราแค่เปลี่ยน pin ให้ตรงกับ pin ของ Relay นั่นเอง ถ้าเราดูจากบอร์ดก็จะเห็นว่ามันคือ pin D4
void setup() {
  // put your setup code here, to run once:
  pinMode(4,OUTPUT);
}

void loop() {
  // put your main code here, to run repeatedly:
  digitalWrite(4, 1);
  delay(1000);
  digitalWrite(4, 0);
  delay(1000);
}
ผลลัพธ์ก็จะได้ออกมาคล้าย ๆ กับด้านล่าง



นี่เป็นอีกตัวอย่างนึงที่คิดว่า การใช้งาน Arduino มันก็ไม่ได้ยากอย่างที่คิด เพียงแค่เราเข้าใจมัน ที่สำคัญคือแค่ผู้อ่านมองให้ออกว่าอุปกรณ์ที่เรากำลังจะใช้นี่เป็น Input หรือ Output เราก็สามารถเดาการเขียนโปรแกรมของเราได้แล้วว่า เวลาเขียนควรจะเขียนเป็นยังไง LED เป็น Output เราน่าจะได้เขียน digitalWrite แน่นอน แต่ถ้าเป็น Input ละจะเป็นยังไง..? ซึ่งหัวข้อนี้ก็จะไปต่อในบทความ Arduino ก็มีความรู้สึกนะ.. เขียนโปรแกรมรับรู้จาก sensor เจ้าของบล็อกเชื่อว่าเมื่อได้อ่านบทความนี้แล้วจะทำให้ผู้อ่านมองเห็นภาพในการนำเอาไปใช้ต่อยอดได้อีกแน่นอน

ก่อนจะจากกัน เจ้าของบล็อกอยากจะฝากเกร็ดความรู้ไว้อีกหน่อย เกี่ยวกับการใช้ตัวแปร
const int ledPin = 4;
void setup() {
  // put your setup code here, to run once:
  pinMode(ledPin,OUTPUT);
}

void loop() {
  // put your main code here, to run repeatedly:
  digitalWrite(ledPin, HIGH);
  delay(1000);
  digitalWrite(ledPin, LOW);
  delay(1000);
}
ให้ผู้อ่านลองสังเกตุคำว่า HIGH กับ LOW ในก่อนหน้านี้เราจะใช้เป็น 1 หรือไม่ก็ 0 แต่ว่าทาง Arduino เองเขาก็เขียนตัวแปรมาให้เราไว้เหมือนกัน เวลาเรียกใช้เป็น HIGH หรือ LOW ซึ่งมันก็ไม่ต่างจาก 1 หรือ 0 เลย แต่สิ่งที่มันต่างคือเราเข้าใจตัวเลข 1 กับ 0 มากขึ้นโดยการให้ความหมายให้กับตัวเลขโดยการกำหนดตัวแปร

สิ่งที่เจ้าของบล็อกอยากจะบอกคือ เราควรจะตั้งชื่อตัวแปรให้กับ pin ใด ๆ หรือค่าใด ๆ ก็ตามที่เราใช้ด้วย ถามว่าทำไมเราถึงต้องทำแบบนี้ด้วย ?

  • ทำให้ตัวเลขโดด ๆ มีความหมาย การสร้างตัวแปรมาให้กับ pin จะทำให้เรารู้ว่า pin นั้น ๆ ไว้ใช้ทำอะไร หรือต่ออะไรอยู่ บางทีมีแค่ตัวเลขเฉย ๆ เราอาจจะจำไม่ได้
  • การแก้ไขง่ายขึ้น กรณีที่เราต้องการเปลี่ยน pin เราก็ไปแก้แค่ตัวแปร เช่นการเปลี่ยนจาก pin 4 เป็น pin 9 แก้แค่จุดเดียว ทั้งโปรแกรมก็จะถูกแก้ไปด้วย ต่างจากก่อนหน้านี้ที่เราต้องไปแก้ทุกที่
สำหรับบทความนี้ก็จบลงเท่านี้แหละ ไว้เจอกันบทความหน้ากันเนอะ :D



ความคิดเห็น

โพสต์ยอดนิยมจากบล็อกนี้

ว่าด้วยเรื่องหน่วยความจำ สิ่งที่หลายคนมองข้าม : รู้จักกับ Memory

คณิตศาสตร์กับโปรแกรมมิ่งมันเป็นยังไงนะ ตอนที่ 1 เกริ่นพีทาโกรัส

Pointer กับตัวแปร Array นะจ๊ะ.. [Back to basic แต่ไม่ basic]