บทที่ 5 Analog Input & switch case |
||
[วิดีโอประจำบท] | ||
หลังจากบทที่ 3 เรื่อง digital input ที่มีค่าเพียง HIGH กับ LOW บทนี้เราจะมาว่ากันด้วยเรื่อง analog input ซึ่งมันจะซับซ้อนอีกนิดนึง และเกรงด้วยเนื้อหามันจะสั้นไปเลยพ่วงเรื่อง switch case ซึ่งเป็นคำสั่งภาษาซีลงไปด้วยซะเลย อย่างที่บอกครับว่า analog input มันจะยุ่งๆกว่า digital input หน่อย คือมันจะมีเรื่องของ ADC (Analog to Digital Converter) ซึ่งเป็นการแปลงสัญญาณอนาลอกเป็นดิจิตอล เนื่องด้วยเหตุผลที่ว่าตัวบอร์ด Arduino หรือไมโครคอนโทรเลอร์ตัวไหนๆก็ตามมันเข้าใจแต่ภาษาดิจิตอลครับ เอาค่าอนาลอกใส่เข้าไปมันไม่เข้าใจ เอ๋อรับประทานกันเลยทีเดียว แต่ก็ยังโชคดีหน่อยๆที่ Arduino ของเรานี้มีวงจร ADC อยู่ในตัว ทำให้ไม่ต้องปวดหัวไปเยอะกว่านี้ ใน Arduino UNO ที่เราใช้นี้จะแปลงสัญญาณอนาลอกเป็นสัญญาณดิจิตอลที่ความละเอียด 10 bit |
||
![]() รูปแสดงสัญญาณดิจิตอลและสัญญาณอนาลอก ที่มา : https://learn.sparkfun.com/tutorials/logicblocks--digital-logic-introduction/what-is-digital-logic สัญญาณอนาลอกหลังผ่านการแปลงแล้ว ที่มา : https://learn.sparkfun.com/tutorials/analog-vs-digital |
||
จากรูปที่ผ่านมาเห็นได้ค่อนข้างชัดนะครับว่าสัญญาณอนาลอกนั้นมันมีความต่อเนื่อง ลื่นไหลเหมือนคลื่นทะเล แต่เมื่อผ่านการ ADC แล้ว จากสัญญาณอนาลอกเนียนๆมันกลายเป็นหยักๆขั้นๆเหมือนบันได ตรงนี้ล่ะครับความละเอียดของ ADC ที่ว่า ยิ่ง ADC มี bit สูงๆ ก็จะยิ่งซอยขั้นบันไดนี้ได้มากขั้นขึ้น สัญญาณที่ได้ก็จะมีความละเอียดมากขึ้น ฉะนั้นไมโครคอนโทรเลอร์เบอร์ ATmega328P ใน Arduino UNO มี ADC 10 bit ก็จะแปลงสัญญาณได้ละเอียดดีกว่าเบอร์ที่มี ADC 8 bit หรือแปลงได้ละเอียดน้อยกว่า ADC 16 bit เป็นต้น พอเราแปลงเป็นสัญญาณดิจิตอลขั้นๆแบบนี้ ไมโครคอนโทรเลอร์มันไม่งงแล้วครับ เป็นภาษาดิจิตอลที่มันเข้าใจแล้ว |
||
เรามาเริ่มดูตัวอย่างกันเลยครับ ต่อวงจรไว้ก่อนตามรูป![]() |
||
จากนั้นเขียนโค้ดลงไป
อัพโหลดโค้ดให้เรียบร้อย ลองหมุนตัวต้านทานดู หลอด LED บนบอร์ดจะติดและดับเมื่อเราหมุนผ่านจุดๆหนึ่ง ประมาณกึ่งกลางใช่มั๊ยครับ นั่นเหตุเพราะในคำสั่ง if เราได้ใส่ค่า 512 ไว้ มันคือค่ากึ่งกลางระหว่าง 0 – 1023 เลขนี้ก็มาจาก Arduino UNO ของเรามี ADC ละเอียด 10 bit ซึ่งมันหมายความว่า 210 เท่ากับ 1024 อธิบายง่ายๆคือมันจะซอยค่า 0-5V ออกเป็น 1024 ขั้น เรา if ไว้ที่ 512 ก็คือถ้าค่ามันมากกว่าขั้นที่ 512 ก็ให้หลอด LED มันสว่างขึ้นมา ถ้าค่าน้อยกว่าขั้นที่ 512 ก็ให้มันดับไปซะ จุดที่ต้องสังเกตุคือ มี 1024 ขั้น แต่ช่วงคือ 0-1023 นะครับ ดิจิตอลมันจะเริ่มจาก 0 ทำให้ขั้นที่ 1 มันคือศูนย์ ขั้นที่สองคือ 1 ….. ขั้นที่หนึ่งพันยี่สิบสี่คือ 1023 (PWM ในบทที่ผ่านมาก็เช่นกันครับ มันมี 256 ค่า แต่ช่วงของมันคือ 0-255) |
||
เพิ่มเติมวงจรอีกนิด |
||
แล้วเขียนโค้ดตามนี้
อัพโหลดโค้ด ลองหมุนตัวต้านทานดูนะครับ LED มันสว่างตามที่เราหมุนรึเปล่า นั่นเพราะว่าเราสั่งให้ค่า level เป็น PWM เพื่อออกไปที่ LED ส่วนที่ต้องเอา vol มาหารด้วย 4 ก่อนก็เพราะ analog input มันมี 1024 ขั้น แต่ PWM มันมีแค่ 256 ขั้น เทียบบัญญัติไตรยางค์ธรรมดาได้ 4 ขั้นของ analog input จะเท่ากับ 1 ขั้นของ PWM |
||
switch case switch case เป็นคำสั่งภาษาซีอีกชนิดหนึ่ง ว่าไปก็คล้ายๆกับ if…else ครับ เพียงแค่ if…else มันตรวจเป็นลำดับทีละเงื่อนไขไล่ลงไป แต่ switch case นี่เลือกเอาตรงๆ เหมือนเรายืนอยู่หน้าตู้แช่ เราอยากกินน้ำอันลมก็หยิบเอาตรงๆ ไม่ต้องมาไล่ขวดแรกน้ำเปล่าไม่เอา ขวดสองชาเขียวไม่เอา ขวดสามน้ำอัดลมจะเอา ค่อยหยิบเอาตอนนี้ ประมาณนั้น รูปแบบของ switch case ก็มีตามด้านล่างนี้
|
||
มาดูตัวอย่างดีกว่า
จากตัวอย่างที่ยกไปนั้น คือให้เลือกชนิดของขวดน้ำอัดลมดู กรณีมันเป็นขวดพลาสติกก็สั่งให้บิดเปิดฝา กรณีมันเป็นขวดแก้วแบบฝาจีบก็ให้เอาที่เปิดขวดมางัด ส่วน default คือวิธีทั่วไปที่ให้ทำงานกรณีที่ไม่มีให้เลือก ในตัวอย่างค่อนข้างรุนแรงนิดคือถ้าไม่ใช่ขวดพลาสติก ไม่ใช่ขวดแก้ฝาจีบ ดันเป็นแบบกระป๋อง เป็นแก้ว เป็นกล่อง ก็ให้ทุบเอาซะเลย พอจะได้คอนเซ็ปของ switch case กันรึยังครับ |
||
เป็นเรื่องเป็นราวกันมาเยอะพอสมควร เรามาลองเล่นกันสนุกๆดีกว่าครับ ต่อวงจรเตรียมไว้ |
||
เขียนโค้ดตามนี้เลยครับ
ผลออกมาแบบไหนพอเดาได้มั๊ยครับ ผมไม่ขออธิบายนะว่ามันจะเป็นยังไง ให้ลองเล่นกันเองดีกว่า มันจะเป็นแบบที่คิดรึเปล่า ผมว่าทุกคนน่าจะเข้าใจโค้ดกันนิดๆจนพอจะเดาออกกันแล้วนะครับว่ามันควรทำงานแบบไหน ก่อนที่จะยาวเกินไปขออนุญาตเอวังไปก่อน บทนี้อธิบายค่อนข้างเยอะ ตัวอย่างน้อย ยังไงก็ลองไปปรับเปลี่ยนเล่นๆกันเหมือนเดิมนะครับ |
||
*ข้อสังเกตุ* : ใน if…else แต่ละ if…else จะมีวงเล็บปีกกาเป็นของตัวเอง |
||
[ดาวน์โหลด] [กลับหน้าหลักของคอร์ส] |