05 กรกฎาคม 2559

อาร์ดุยโน : PWM

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

ในตอนนี้ ครูจะแนะนำการส่งข้อมูลออกอีกแบบหนึ่ง จากเดิมที่เคยแนะนำเรื่องการส่งข้อมูลออกจากอาร์ดุยโนแบบดิจิทัลแล้ว คราวนี้จะพาทดลองส่งข้อมูลออกแบบแอนะล็อก หรือที่เรียกว่า PWM (Pulse Width Modulation)

พัลส์ (Pulse) กับความกว้างของพัลส์

มาเริ่มที่คำแรกก่อนเลย คำว่า พัลส์ ก็คือ สัญญาณไฟฟ้าที่มีลักษณะเป็นลูกคลื่น หรือมีสัญญาณไฟฟ้าเป็นลูกๆ โดยความหมายแล้วก็คล้ายๆ กับสัญญาณดิจิทัล ก็คือเคยพูดถึงมาแล้วนั่นเอง (คลิก ถ้าต้องการทบทวน)


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



การกำเนิดสัญญาณพัลส์จะมีความถี่เป็นค่าที่ระบุชัดเจนว่ามีความถี่เท่าใด อย่างเช่นในอาร์ดุยโนเนี่ย ความถี่ที่ใช้ในการสร้างพัลส์คือ 490 Hz (โดยประมาณ) โดยใช้โวลท์เตจที่ระดับสูงสุดเป็น 5 โวลท์ (หรือ 3.3 โวลท์ในบางรุ่น) เพราะฉะนั้นพัลส์ 1 ลูก แต่ละแท่งของมันจะสูง 5 โวลท์ ต่ำสุดก็คือ 0 โวลท์ เนื่องจากถูกกำหนดให้ผลิตพัลส์ที่ความถี่ \(f\) =490 Hz  มันจึงมีคาบเวลา \(T\) =  \(\frac{1}{490}\) วินาทีหรือประมาณ 2 มิลลิวินาที  ดังนั้นความกว้างของพัลส์โดยปกติก็คือ  \(\frac{T}{2} = \frac{1}{980} \) วินาที หรือประมาณ 1 มิลลิวินาที

Duty Cycle หรือดิวตี้ไซเคิ้ล

มีบางคนแปลคำคำนี้ว่า "วัฏจักรหน้าที่" แต่ครูขอใช้ทับศัพท์ดีกว่า นะ

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

\(D = \frac{PW}{T}*100 \%\)

หรือ \(D = PW*f*100 \%\)

D ก็คือ ดิวตี้ไซเคิ้ล นิยมบอกกันในรูปของเปอร์เซ็นต์ PW ก็คือความกว้างของพัลส์(ในรูปของเวลา) T ก็คือคาบเวลา \( f \) ก็คือ ความถี่

ค่าดิวตี้ไซเคิ้ลสามารถคำนวณกลับไปเป็นกำลังเฉลี่ยได้ โดยใช้ความสัมพันธ์ต่อไปนี้

\(P_{average} =P_{peak}*D \)
 

ไดอะแกรมแสดงค่าดิวตี้ไซเคิ้ลค่าต่างๆ



analogWrite(pin_number, value)

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

คำสั่งที่ใช้ก็คือ analogWrite(pin_number,value)
pin_number ก็คือ ขาที่เราจะส่งพัลส์ที่กำหนดค่าดิวตี้ไซเคิ้ลออกไป ซึ่งขาที่สามารถส่งค่าที่แบบนี้ออกไปได้ก็คือ 3,5,6,9,10,11
value ก็คือ ค่าดิวตี้ไซเคิ้ลแต่แทนที่จะเป็น 1 ถึง 100 ในอาร์ดุยโนเราจะกำหนดค่านี้จาก 1-256

ทดลอง

 ต่ออุปกรณ์ดังภาพ


ในที่นี้ครูใช้ขา 11 ส่งออกพัลส์ไปยัง LED โดยควบคุมจากสัญญาณแอนะล็อกซึ่งใช้ตัวต้านทานปรับค่าได้ ต่อเข้าที่ขา A5

สเก็ตช์


ตัวแปรที่ใช้ในที่นี้มี 3 ตัวแปร คือ

  •  ledPin คือขาที่จะต่อเข้ากับ LED (ในที่นี้่คือ 11)
  • inputPin คือขาที่จะรับสัญญาณแอนะล็อกเข้าทางอินพุท ในที่นี้คือ A5
  • inputValue คือตัวแปรที่ใช้รับค่าแอนะล็อกเข้ามา ซึ่งจะมีค่าระหว่าง 0-1023

จากโปรแกรมตัวแปร inputValue จะรับค่า 0-1023 จากฟังก์ชั่น analogRead() แต่เวลาที่จะนำไปใช้ในฟังก์ชั่น analogWrite() จะใช้เกิน 256 ไม่ได้ เราจึงต้องหารค่า inputValue ด้วย 4 ก่อน

เมื่อเราบิดโวลุ่มมาซีกหนึ่งจะสังเกตเห็นการเปลี่ยนแปลงของหลอด LED โดยมันจะมืดลงด้านหนึ่ง และเมื่อบิดมาอีกด้านหนึ่งความสว่างของ LED ก็จะสว่างขึ้นจนสว่างมากที่สุด

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

ขอบคุณที่ติดตาม แล้วพบกันใหม่นะครับ

19 มิถุนายน 2559

อิเล็กทรอนิกส์ : ทรานซิสเตอร์

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

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

ทรานซิสเตอร์มีหลากหลายรูปร่าง และหลากหลายขนาด ตั้งแต่ตัวเล็กๆ ที่สร้างบนชิปไมโครโพรเซสเซอร์ที่มองไม่เห็นชัดเจนเป็นตัวๆ เพราะมีขนาดเล็กมาก จนถึงทรานซิสเตอร์ขนาดใหญ่ๆ ประมาณปลายหัวมือมือของเราประมาณนั้น (ชิปไมโครโพรเซสเซอร์ของ Intel® รุ่นใหม่ๆ มีจำนวนทรานซิสเตอร์ได้ถึงหลายร้อยล้านตัว ดูรายละเอียดจำนวนทรานซิสเตอร์ บนที่ใช้ในไมโครโพรเซสเซอร์ของ Intel®  ได้ที่ http://www.intel.com/pressroom/kits/quickreffam.htm )

ตัวอย่างทรานซิสเตอร์รูปร่างและขนาดต่างๆ 

ไม่ว่าจะเป็นทรานซิสเตอร์แบบไหน ตัวใหญ่หรือตัวเล็ก พวกมันล้วนแล้วแต่มีหลักการทำงานที่เหมือนกันทั้งสิ้น ทรานซิสเตอร์แต่ละตัวจะมีเบอร์หรือชื่อเรียกของมันซึ่งจะพิมพ์ติดไว้กับตัวมันเสมอ (ยกเว้นทรานซิสเตอร์บนชิปวงจรรวม) ทรานซิสเตอร์มีขา 3 ขา เรียกว่า คอลเล็กเตอร์ (Collector) เบส (Base) และอีมิตเตอร์ (Emitter) หรือเรียกย่อๆ ว่า C B E การวางตำแหน่งขาของมัน จะเป็นอย่างไรเราต้องเปิดดูจากดาต้าชีต(Datasheet) ของมัน เพราะถึงแม้จะทรานซิสเตอร์จะมีรูปร่างเหมือนกันแต่การวางตำแหน่งขาอาจต่างกันได้  ดังนั้นสิ่งสำคัญก็คือดูเบอร์ของมัน เมื่อได้เบอร์แล้วก็เอาไปเปิดดูดาต้าชีต  ซึ่งในปัจจุบันนี้เราไม่จำเป็นต้องพกเอกสารที่เรียกว่าดาต้าชีตเลย เพราะเพียงป้อนเบอร์ทรานซิสเตอร์ลงไปในช่องค้นหาของ Google ผลการค้นหาก็จะพบดาต้าชีต ซึ่งเป็นเอกสารอิเล็กทรอนิกส์ให้เราเปิดดูได้ทันที

ตัวอย่างการค้นหา datasheet ของทรานซิสเตอร์เบอร์ bc547
ลักษณะของดาต้าชีตที่มีการบอกการวางตำแหน่งขาของทรานซิสเตอร์ไว้

สัญลักษณ์ในวงจร

ทรานซิสเตอร์มีสองชนิด คือ NPN และ PNP ชนิดที่ใช้กันโดยส่วนใหญ่ก็คือ NPN รายละเอียด 2 อย่างนี้ ถ้าต้องการเจาะลึก ไปอ่านเอาเองที่ https://en.wikipedia.org/wiki/Bipolar_junction_transistor ครูจะเน้นเฉพาะในส่วนการใช้งานในวงจรจริง ซึ่งเราต้องดูสัญลักษณ์ของทรานซิสเตอร์ให้ออก

และนี่คือสัญลักษณ์ของทรานซิสเตอร์ทั้งสองชนิด


วงจรพื้นฐาน

ด้วยเหตุที่ทรานซิสเตอร์ชนิด NPN ใช้กันอย่างแพร่หลายกว่าชนิด PNP  ดังนั้นครูก็จะนำเอาทรานซิสเตอร์ชนิด NPN นี่แหละมาเป็นตัวอย่าง

วงจรทรานซิสเตอร์( NPN ) อย่างง่าย 

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

ทีนี้เราลองหาอุปกรณ์มาทำการทดลองกันนะครับ จากรูปวงจรก็จะมี

  1. แบตเตอรี่ขนาด 9 โวลท์ 1 ก้อน
  2. ตัวต้านทาน 560 โอห์ม 1 ตัว 
  3. LED 1 หลอด
  4. เบรดบอร์ด 1 แผ่น
  5. ทรานซิสเตอร์ NPN เบอร์ 2N2222  1 ตัว  



การวางตำแหน่งขาของ 2N2222

ทดลองบนเบรดบอร์ด

ต่ออุปกรณ์ตามรูปด้านล่างนี้ เมื่อต่อเสร็จแล้วลองใช้นิ้วแตะที่คู่สายไฟ จะเห็นหลอด LED สว่าง




การทำงานของวงจร

เมื่อเราใช้นิ้วไปแตะบริเวณปลายของลวดทองแดง นิ้วมือของเราจะทำหน้าที่คล้ายตัวต้านทานตัวหนึ่ง และจะมีกระแสไฟฟ้าขนาดเล็กๆ จำนวนหนึ่งไหลผ่านเข้าไปยังขาเบสของทรานซิสเตอร์ ทำให้เกิดศักย์ไฟฟ้าคร่อมระหว่างขา Base-Emitter  ผลเช่นนี้จะเป็นการกระตุ้นให้ทรานซิสเตอร์ระหว่างขา Collector -Emitter ทำหน้าที่คล้ายสวิทช์ ทำให้กระแสไฟฟ้าไหลผ่านระหว่างขา Collector-Emitter ได้ ทำให้หลอด LED ซึ่งต่ออนุกรมอยู่กับ ขา C-E นี้มีกระแสไฟฟ้าไหลผ่านด้วยและแสดงผลให้เราเห็นได้ด้วยการเปล่งแสงสว่างออกมา

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

อุปมาเหมือนเช่นดั่งท่อน้ำที่มีวาล์วควบคุมการไหล

จะเห็นว่าการไหลของกระแสไฟฟ้าระหว่าง Collector-Emitter สามารถเปรียบได้กับการไหลของน้ำผ่านวาล์วน้ำที่ควบคุมได้ เปรียบเสมือนว่าน้ำจะไหลจากด้าน Collector ไปยัง Emitter โดยการควบคุมวาล์ว จากขา Base

กรณีที่ไม่มีกระแสไฟฟ้าไหลเข้าที่ขาเบส กระแสไฟฟ้าที่ไหลผ่าน C-E มีค่าเป็นศูนย์ จะเปรียบเสมือนกับวาล์วน้ำปิด น้ำไม่สามารถไหลได้(หรือไหลได้น้อยมาก)

กรณีที่กระแสไฟฟ้าที่ขาเบส มีค่ามากจนถึงค่าหนึ่ง กระแสไฟฟ้าที่ไหลผ่าน C-E ได้เต็มที่ จะเปรียบเสมือนกับวาล์วน้ำเปิดเต็มที่ น้ำไหลได้เต็มท่อ


กรณีที่กระแสไฟฟ้าที่ขาเบสน้อยๆ กระแสไฟฟ้าที่ไหลผ่าน C-E จะไหลได้ไม่เต็มที่ จะเปรียบเสมือนกับวาล์วน้ำเปิดไว้ส่วนหนึ่ง น้ำก็สามารถไหลได้แต่ไม่เต็มท่อ

สรุป

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

ขอจบตอนนี้เพียงเท่านี้ก่อน

ขอบคุณที่ติดตามนะครับ

11 มิถุนายน 2559

อาร์ดุยโน : serial monitor

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

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


จุดประสงค์ของการเล่น


  1. เพื่อทำความเข้าใจกับการติดต่อสื่อสารระหว่างบอร์ดอาร์ดุยโนกับคอมพิวเตอร์ผ่านพอร์ตแบบอนุกรม
  2. เพื่อทำความเข้าใจกับการอ่านข้อมูลเข้าทางแอนะล็อก

ลุย

ต่ออุปกรณ์ดังภาพ



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


เปิด IDE แล้วก็คลิก File > Examples > Basics > ReadAnalogVoltage




ครั้งนี้ ย้อนกลับมาเล่นกับโค้ดมาตรฐานที่อาร์ดุยโนเผยแพร่ดู



คลิกปุ่ม  (ตรวจสอบ,คอมไพล์,อัพโหลด ในคลิกเดียว) แล้วก็คลิกที่ปุ่มแว่นขยาย(อยู่ด้านขวาสุดของแถบเครื่องมือในเมนู)

เราจะเห็นตัวเลขแสดงแรงดันไฟฟ้าปรากฏขึ้น แต่อาจวิ่งเร็วเกินไป จนดูไม่ทัน ลองเพิ่มบรรทัดคำสั่งนี้ ลงไปด้านล่างสุดของโปรแกรม

delay(1000);

แล้วอัพโหลดใหม่อีกครั้งหนึ่ง คราวนี้ก็จะเห็นตัวเลขวิ่งช้าลง หาไขควงปลายแฉกก็ได้ ปลายแบนก็ได้ ลองหมุน VR ดู ก็จะพบตัวเลขที่แปรเปลี่ยนไประหว่าง 0-5 หรือถ้าต้องการให้มีคำว่า volts ต่อท้าย ก็ให้แก้ไขโค้ดอีกเล็กน้อย ใน 2 บรรทัดสุดท้าย ดังนี้

Serial.print(voltage);
Serial.println("  volts");
delay(1000);

นี่คือผลลัพธ์ (ค่อยๆ หมุน VR ไปด้วย)




การทำงานของโปรแกรม

Serial.begin(9600);

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

serial.Println(voltage);

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

ถ้ายังไม่เข้าใจอีก ก็ทิ้งคำถามไว้นะครับ

ขอบคุณที่ติดตาม



10 มิถุนายน 2559

อาร์ดุยโน : นำเข้าสัญญาณแอนะล็อก

ลองเล่นอินพุท-เอาท์พุทกับสัญญาณดิจิทัลแล้ว มาในตอนนี้ ลองเล่นการนำเข้าสัญญาณแอนะล็อกกันบ้าง

ก่อนอื่นเราลองทำมาทำความเข้าใจกับสัญญาณแอนะล็อกกันสักหน่อยก่อน

สัญญาณแอนะล็อกเป็นสัญญาณที่ค่าสัญญาณทางไฟฟ้ามีการเปลี่ยนแปลงแบบต่อเนื่อง หมายความว่า เมื่อจะมีการเปลี่ยนแปลงแรงดันไฟฟ้า ระหว่าง 0 ถึง 5 โวลท์ มันจะค่อยๆ เปลี่ยนแปลง เช่นจาก 0.1, 0.2, 0.3, .... ไปเรื่อยๆ จนกระทั่งถึง 5 โวลท์ ซึ่งแตกต่างจากสัญญาณดิจิทัล ที่มันจะมีเพียง 2 สถานะ คือ ประมาณ 0 โวลท์ กับประมาณ 5 โวลท์ เท่านั้น ใครยังไม่เข้าใจ ลองอ่านเรื่อง สัญญาณแอนะล็อก กับสัญญาณดิจิทัล เมื่อบทความที่แล้วดูอีกที

อาร์ดุยโนจัดการสัญญาณแอนะล็อกอย่างไร

เมื่อมีสัญญาณแอนะล็อก ซึ่งอยู่ในรูปแรงดันไฟฟ้า(voltage)ที่มีการเปลี่ยนแปลงอย่างต่อเนื่องเข้ามายังขาเข้าแอนะล็อก ไม่ว่าขาไหนช่องใดก็ตาม อาร์ดุยโนก็ต้องแปลงมันให้เป็นดิจิทัลอยู่ดี การแปลงนี้เรียกว่า ADC (Analog to Digital Converter) วิธีการแปลงก็คือ มันจะแบ่งระดับของแรงดันไฟฟ้าขาเข้าออกเป็น 1024 ระดับ (210) คือตั้งแต่ค่า 00000000002 (010) จนถึง 11111111112 (102310) ตัวเลขที่ห้อยท้ายหมายถึงฐานของเลขที่เราต้องการอ้างถึงนะครับ

สมมติว่าแรงดันไฟฟ้าที่ผ่านเข้ามายังช่องแอนะล็อก มีตั้งแต่ 0 โวลท์ ถึงสูงสุด 5 โวลท์ นั่นคือ
แรงดันไฟฟ้าที่เข้ามา 0 โวลท์ จะถูกแปรผลเป็นตัวเลข 0
แรงดันไฟฟ้าที่เข้ามา 0.005 โวลท์ จะถูกแปรผลเป็นตัวเลข 1
แรงดันไฟฟ้าที่เข้ามา 0.010 โวลท์ จะถูกแปรผลเป็นตัวเลข 2
แรงดันไฟฟ้าที่เข้ามา 0.015 โวลท์ จะถูกแปรผลเป็นตัวเลข 3
.
.
.
แรงดันไฟฟ้าที่เข้ามา 4.995 โวลท์ จะถูกแปรผลเป็นตัวเลข 1022
แรงดันไฟฟ้าที่เข้ามา 5.000 โวลท์ จะถูกแปรผลเป็นตัวเลข 1023

โดย...

ในแต่ละวินาทีอาร์ดุยโนจะทำการจัดเก็บข้อมูลแปลงค่าแอนะล็อกเป็นดิจิทัล 10,000 ครั้ง  หรือจะพูดอีกแบบหนึ่งก็คือ อาร์ดุยโนจะเก็บข้อมูลทุกๆ 0.0001 วินาทีอย่างต่อเนื่องเป็นสายของตัวเลขยาวเหยียดตามระยะเวลาที่สัญญาณแอนะล็อกส่งเข้ามา


จุดประสงค์การทดลอง

  • เพื่อทำความเข้าใจกับการจัดการสัญญาณป้อนเข้าแบบแอนาล็อกของอาร์ดุยโน

อุปกรณ์การทดลอง

  1. บอร์ด Arduino UNO
  2. ตัวต้านแบบปรับค่าได้ 10kΩ (แบบเกือกม้าก็ได้ แบบมือหมุนก็ได้)
  3. สายไฟ
  4. magnetic buzzer (ลำโพงขนาดเล็กๆ นิยมนำมาทำเป็นเสียงออด)
ต่ออุปกรณ์ดังรูป


ขยายให้เห็นชัดๆ ต่อจะได้ไม่ผิด



จากรูปภาพตัวต้านทานที่ปรับค่าได้แบบโวลุ่มหรี่เสียง ด้านหนึ่งต่อเข้ากับแหล่งจ่ายกำลัง 5 โวลท์ อีกด้านหนึ่งต่อลงกราวด์ ส่วนตรงกลางนั้นต่อเข้ากับทางเข้าสัญญาณแอนะล็อกช่อง A5 หรือช่องไหนก็ได้ ส่วนบัซเซอร์ ขั้วบวกต่อเข้ากับช่องทางดิจิทัลช่อง 9 (หรือตามสะดวก เขียนโปรแกรมให้ถูกช่องก็แล้วกัน) ขั้วลบขั้วเข้ากับกราวด์โดยใช้จุดพักดังแสดงให้ภาพ

เขียนและรันโปรแกรม 


  1. เปิด IDE
  2. คลิก File > New
  3. บันทึกไฟล์ให้เรียบร้อย เสียบสาย USB จากบอร์ดเข้ายังคอมพิวเตอร์
  4. คลิก  เพื่อทำการตรวจสอบ คอมไพล์และอัพโหลด(ในคลิกเดียว) ถ้ามีปัญหาอะไร IDE ก็จะแจ้ง ครูเชื่อว่าถ้าพิมพ์ตามที่ครูบอกก็จะไม่มีปัญหาอะไร
  5. ตอนนี้ควรจะได้ยินเสียงออด (ฟังดูน่ารำคาญอยู่ ) ลองหมุนปรับโวลุ่มดู จะเห็นว่าเสียงออดมีการแปรเปลี่ยนได้ ด้านหนึ่งจะได้ยินเสียงต่ำ ด้านหนึ่งจะได้ยินเสียงสูง

การทำงานของโปรแกรม

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


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

aValue=analogRead(5);
digitalWrite(9, HIGH);
delayMicroseconds(1000+10*aValue);
digitalWrite(9, HIGH);
delayMicroseconds(1000+10*aValue);

ค่า aValue คือ ค่าตัวเลขที่ได้จากฟังก์ชั่น analogRead(5);
ถัดมาก็เซตสถานะสัญญาณดิจิทัลช่อง 9 เป็น HIGH แรงดัน 5 โวลท์จะถูกจ่ายออกไปที่บัซเซอร์ ถัดมาอีกบรรทัดหนึ่งเป็นคำสั่งที่เลื่อนเวลาออกไป เป็นเวลา 1000+10*aValue  ในหน่วยไมโครวินาที ค่า aValue จะมีค่าจะอยู่ระหว่าง 0-1023 ดังได้กล่าวมาแล้ว เมื่อเอามาคูณ 10 แล้วบวกกับ 1000 ก็จะกลายเป็นจาก 1000-11230 ไมโครวินาที จากนั้นก็เซตสถานะสัญญาณดิจิทัลของช่อง 9 เป็น LOW (0 โวลท์) แล้วก็รอไปอีกเท่าช่วงเวลาเดิม ก่อนวนกลับไปเริ่มทำใหม่

แล้วเสียงเกิดได้อย่างไร 

ปกติความถี่เสียง(ƒ) ที่เราได้ยินคือ 20-20000 Hz หรือหากเราคิดเป็นคาบ(T) คือ 0.05-0.00005 วินาที หรือ 50000 ไมโครวินาที - 50 ไมโครวินาที

ทีนี้ไปพิจารณาการรอจังหวะสถานะ HIGH และสถานะ LOW รวมกัน (ครบ 1 ลูกคลื่น) จะมีค่าระหว่าง 2000 - 22460 ไมโครวินาที ซึ่งคิดเป็นความถี่เสียงที่ได้คือ 45-500 Hz

สรุป

อาจจะไม่หรูหราฟู่ฟ่า แต่ตัวอย่างโปรแกรมง่ายๆ อย่างนี้ หากเข้าใจมันอย่างถ่องแท้ ครูเชื่อว่า ตอนนี้น่าจะเริ่มมองโปรเจกต์ที่จะนำเอาอาร์ดุยโนไปใช้งานได้แล้ว

ขอบคุณที่ติดตามครับ

09 มิถุนายน 2559

อิเล็กทรอนิกส์ : สัญญาณดิจิทัล กับ สัญญาณแอนะล็อก

ทุกวันนี้เราอยู่ในยุค "ดิจิทัล" นี่เป็นคำพูดที่ได้ยินกันโดยทั่วไป หรือไม่ก็จะมีอีกคำพูดหนึ่งว่า เทคโนโลยีทุกวันนี้ อะไรๆ ก็ "ดิจิทัล"  แล้วยังไงล่ะทีนี้ คำถามที่น่าจะถามกัน คือ ก่อนหน้าที่จะมี "ดิจิทัล" มันมีอะไรมาก่อน คำถามนี้ครูไม่เคยได้ยินจากเด็กนักเรียนที่ตัวเองสอนสักที แต่ก็อยากทำความเข้าใจ ใครรู้แล้ว ก็ไม่ต้องอ่านก็แล้วกัน

เริ่มแรกเรามารู้จักกับนิยามมันก่อนดีกว่า เข้าใจหรือไม่เข้าใจก็ให้รู้จักกันไว้ก่อน

สัญญาณทางไฟฟ้า ในวิชาอิเล็กทรอนิกส์เขาแบ่งไว้เป็น 2 ประเภทคือ

  • สัญญาณดิจิทัล (Digital Signal)
    ใน wikipedia.org ได้ให้ความหมายของสัญญาณดิจิทัลไว้ว่า เป็นสัญญาณทางกายภาพที่เป็นตัวแทนของลำดับของค่าที่แยกจากกัน(สัญญาณที่มีปริมาณไม่ต่อเนื่องในแกนเวลา)
  • สัญญาณแอนะล็อก (Analog Signal)
    ใน wikipedia.org ได้ให้ความหมายของสัญญาณแอนะล็อกไว้ว่า เป็นสัญญาณแบบต่อเนื่อง มีลักษณะเป็นคลื่นไซน์ (sine wave) โดยที่แต่ละคลื่นจะมีความถี่และความเข้มของสัญญาณที่ต่างกัน
อ่านแล้วแม้คนที่มีพื้นฐานทางไฟฟ้า อิเล็กทรอนิกส์มาบ้างแล้วก็อาจจะยังงง ยิ่งไปอ่าน wikipedia ฉบับภาษาอังกฤษ ยิ่งมีการอธิบายไว้แบบพิสดาร

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

สัญญาณดิจิทัล

พิจารณาวงจรดังต่อไปนี้


จากวงจร เมื่อเรากดปุ่มสวิทช์แบบกดติด-ปล่อยดับ(puth button) กระแสไฟฟ้าจะเคลื่อนที่ผ่านตัวต้านทาน ทำให้เกิดความต่างศักย์คร่อมที่ตัวต้านทาน 5 โวลท์ (อ่านค่าได้จากโวลท์มิเตอร์) เมื่อเราปล่อยสวิทช์ กระแสไฟฟ้าถูกกั้นไว้ที่สวิทช์ไม่ให้ไหลผ่านตัวต้านทานได้ ทำให้ความต่างศักย์ที่คร่อมตัวต้านทานลดค่าลงเหลือ 0 โวลท์ จะเห็นว่า สถานะ 5 โวลท์ ถูกเปลี่ยนเป็น 0 โวลท์ และเมื่อกดสวิทช์อีกครั้ง สถานะความต่างศักย์คร่อมตัวต้านทานก็จะกลายเป็น 5 โวลท์ ค่าความต่างศักย์ 1 โวลท์ 2 โวลท์ หรือค่ากี่โวลท์ก็ตามระหว่าง 0 ถึง 5 โวลท์ จะไม่มีโอกาสเกิดขึ้นเลยที่ตัวต้านทาน R   ซึ่งการเปลี่ยนแปลงในลักษณะนี้ เรียกกันว่า การเปลี่ยนแปลงแบบไม่ต่อเนื่อง

ทีนี้ลองเขียนแผนภาพเวลา (time diagram) โดยแกนตั้งให้เป็นค่าความต่างศักย์คร่อมตัวต้านทาน ส่วน แกนนอนเป็นแกนของเวลา สมมติว่ามีการกด-ปล่อย กด-ปล่อย สวิทช์ด้วยช่วงเวลา 1 วินาทีเท่าๆ กัน


นี่ล่ะที่เขาเรียกกันว่า สัญญาณดิจิทัล  ถ้าเราให้สถานะที่มีความต่างศักย์คร่อมตัวต้านทาน 0 โวลท์ หมายถึง สถานะ LOW หรือ 0 และสถานะที่มีความต่างศักย์คร่อมตัวต้านทาน 5 โวลท์ หมายถึง สถานะ HIGH หรือ 1 จากตัวอย่างที่ให้มาดังภาพ ด้านบนนี้ ก็จะแปลความหมายได้เป็นตัวเลขได้ คือ  00101010

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

สัญญาณแอนะล็อก

พิจารณาวงจรดังต่อไปนี้


คล้ายๆ กับวงจรที่แสดงในหัวข้อสัญญาณดิจิทัล เพียงแต่เปลี่ยนจาก สวิทช์กดติด-ปล่อยดับ มาเป็น ตัวต้านทานปรับค่าได้  โดยสมมติต่อไปอีกว่า ขณะเริ่มต้นให้ VR(ตัวต้านทานที่ปรับค่าได้) มีค่าความต้านทานมากที่สุด หลังจากนั้นมีการหมุน VR จากค่ามากที่สุดมายังค่าน้อยที่สุดในเวลา 1 วินาที และหมุนกลับมาในทันทีจากความต้านทานน้อยที่สุดมาหาความต้านทานมากที่สุดในเวลา 1 วินาทีเช่นกัน ทำเช่นนี้อย่างต่อเนื่อง


มาพิจารณาว่าเกิดอะไรขึ้น
จะเห็นว่าตัวต้านทานที่ต่อกันแบบอนุกรม มันก็คือวงจรแบ่งแรงดันนั่นเอง ในสภาวะเริ่มต้นที่กำหนดให้ VR มีค่าความต้านทานมากที่สุด แรงเคลื่อนไฟฟ้าส่วนใหญ่ก็จะไปตกคร่อมที่ VR  ประมาณ 4.5 โวลท์ ส่วนที่เหลือ 0.5 โวลท์จะตกคร่อมที่ R ซึ่งเราสามารถอ่านได้จากโวลท์มิเตอร์  ครั้นเมื่อเราหมุน VR ให้มีค่าน้อยลง ความต่างศักย์คร่อม R ก็จะเพิ่มขึ้น (เพราะความต่างศักย์ของ VR จะลดลง) จนกระทั่งเมื่อค่าความต้านทานVR มีค่าน้อยที่สุด(ใกล้เคียง 0) ความต่างศักย์ส่วนใหญ่ก็จะไปตกคร่อมที่ R คือประมาณ 5 โวลท์  (การคำนวณค่าความต่างศักย์ ศึกษาได้จากหัวข้อ Voltage Divider ที่่ http://hyperphysics.phy-astr.gsu.edu/hbase/electric/voldiv.html ) และเมื่อหมุนค่าความต้านทานของ VR กลับจากน้อยไปหามาก ความต่างศักย์ที่คร่อม R ก็จะค่อยๆ น้อยลง จนเหลือประมาณ 0.5 โวลท์เหมือนสภาวะเริ่มต้น แล้วก็กลับไปกลับมาเช่นนี้ ตามจังหวะการหมุน VR

ลองเอาเหตุการณ์ที่เกิดขึ้นมาสร้างเป็นกราฟเวลา เหมือนในหัวข้อสัญญาณดิจิทัล



จะแผนภาพเวลา จะเห็นว่าการเปลี่ยนแปลงสภาวะจาก 0.5 โวลท์(โดยประมาณ) ที่คร่อม R ก่อนไปเป็นสภาวะที่มีความต่างศักย์ 5 โวลท์นั้น ความต่างศักย์ที่คร่อม R จะไม่กระโดดทีเดียวจากค่าน้อยๆ ไปหาค่ามากเลยทีเดียว แต่จะค่อยๆ เปลี่ยนจาก 0.5 เป็น 0.6, 0.7, 0.8, 0.9, 1.0 ... ไปเรื่อยๆ จนถึง 5 โวลท์ ในทำนองเดียวกัน การเปลี่ยนแปลงความต่างศักย์จาก 5 โวลท์มาเป็น 0.5 โวลท์ ก็จะในทำนองเดียวกัน คือ เปลี่ยนแปลงอย่างต่อเนื่อง ไม่มีการกระโดดข้ามช่วง  และนี่คือต้วอย่างหนึ่งของสัญญาณที่เราเรียกกันว่า สัญญาณแอนะล็อก

ตัวเลขที่บอกสภาวะของสัญญาณแอนะล็อกจึงเป็นปริมาณที่เกี่ยวข้องกับไฟฟ้าโดยตรงเช่น ความต่างศักย์ไฟฟ้า หรือกระแสไฟฟ้า เป็นต้น 

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


มาถึงตรงนี้ก็คาดหวังว่า ผู้ที่ยังไม่รู้จัก สัญญาณดิจิทัล สัญญาณแอนะล็อก ก็คงจะรู้จักกันบ้างแล้ว ส่วนจะมองภาพออกต่อไปจนว่ามันมีบทบาทอย่างไรต่อเทคโนโลยีในทุกวันนี้ ก็ต้องศึกษากันต่อไปครับ

ตอนนี้คงจบไว้แค่นี้ ขอบคุณที่ติดตามนะครับ



07 มิถุนายน 2559

อาร์ดุยโน : นำเข้าสัญญาณดิจิทัล

ตอนที่แล้ว เราได้ลองเล่น(และเรียนรู้ไปพร้อมๆ กัน) โดยการตั้งค่าให้มีการส่งสัญญาณออกผ่านช่องทางดิจิทัลกันไปแล้ว ในบทความนี้ ครูจะทำกลับกัน นั่นคือจะมีการตั้งค่าเพื่อให้ช่องทางดิจิทัลรับข้อมูลจากภายนอกเข้ามายังอาร์ดุยโนของเรา

สัญญาณดิจิทัล เป็นสัญญาณที่มีสองสถานะ เช่นถ้าเราใช้แรงเคลื่อนไฟฟ้า 5 โวลท์ เป็นระดับอ้างอิง สัญญาณจะมีสองระดับ คือ 0 โวลท์ (อยู่ในสถานะ LOW) กับ 5 โวลท์ (อยู่ในสถานะ HIGH) ซึ่งใครที่ทำการทดลองตามครูเมื่อคราวที่แล้ว จะเห็นได้ว่าเมื่อเราใช้คำสั่ง digitalWrite(pinNumber, state) หมายถึง การสั่งให้ส่งสัญญาณดิจิทัลออกไปยังหมายเลขช่องที่ระบุใน pinNumber เช่น pinNumber = 10 ส่วน state เซตเป็น LOW  ก็จะมีแรงเคลื่อนไฟฟ้า 0 โวลท์ ออกที่ขาหมายเลข10 (LED ดับ) แต่หากระบุ state เป็น HIGH แรงเคลื่อนไฟฟ้าที่ช่องหมายเลข 10 จะมีแรงเคลื่อนไฟฟ้ากลายเป็น 5 โวลท์ (LED สว่าง)

สิ่งที่เราจะทำในครั้งนี้ก็คือ เซตสถานะจากภายนอกให้เป็น LOW (0 โวลท์) หรือ HIGH (5 โวลท์) แล้วให้ช่องรับข้อมูลของอาร์ดุยโนรับไปปฏิบัติงานต่อไป

จุดประสงค์ของการทำการทดลองหรือเล่นในครั้งนี้ 

  1. รู้จักสัญญาณดิจิทัลและสร้างสัญญาณดิจิทัลง่ายๆ เพื่อป้อนเข้าสู่บอร์ดอาร์ดุยโน
  2. เขียนโปรแกรมสั่งให้อาร์ดุยโนนำสัญญาณดิจิทัลขาเข้า มาควบคุม LED ให้ติดหรือดับ ผ่านช่องทางดิจิทัลขาออก

อุปกรณ์ต้องใช้ 

  1. บอร์ด Arduino UNO 1 บอร์ด
  2. เบรดบอร์ด 1 แผ่น
  3. สวิทช์กดติด ปล่อยดับ (push button) 1 ตัว
  4. หลอด LED 1 หลอด
  5. ตัวต้านทาน 10k , 220 Ω อย่างละตัว
  6. สายไฟสำหรับเสียบแผ่นบอร์ด

ลุย 

ต่ออุปกรณ์ดังภาพ

ขยายหน่อยให้เห็นชัดๆ ตัวต้านทาน 10k คือตัวนอน 220 Ω คือตัววางตั้ง

 


การทำงาน

      เมื่อกดสวิทช์ กระมีกระแสไฟฟ้าจากแหล่งจ่ายกำลัง 5 โวลท์ที่เราต่อออกจากบอร์ด ไหลผ่านตัวต้านทาน 10k ซึ่งจำให้เกิดความต่างศักย์ตกคร่อมที่ตัวต้านทานนี้ เกิดเป็นสถานะ HIGH ป้อนเข้าสู่ช่อง 11 ของพอร์ทดิจิทัล และเมื่อเราปล่อย กระแสไฟฟ้าไม่สามารถไหลผ่านตัวต้านทาน 10k ได้ ก็จะเกิดเป็นสถานะ LOW ขึ้น เราจะใช้ 2 สถานะนี้ในการควบคุมการกระพริบของ LED ที่เราต่อไว้ที่ขา 0 ของพอร์ทดิจิท้ล

ตรวจสอบความเรียบร้อยของสายไฟให้ดีก่อนนะครับ เตรียมสาย USB ไว้อย่าเพิ่งเสียบเข้ากับเครื่องคอมพิวเตอร์ รอก่อน

การดำเนินการทางซอฟท์แวร์
  1. เปิด IDE
  2. คลิก File > New
    พิมพ์โค้ดของโปรแกรมเข้าไปดังแสดงในภาพ

  3. คลิก File > Save
    ตั้งชื่อไฟล์ในโฟลเดอร์ที่เราต้องการ ครูตั้งชื่อไฟล์นี้ว่า digital_IN
  4. เสียบสาย USB จากบอร์ดอาร์ดุยโน เข้ากับเครื่องคอมพิวเตอร์
  5. คลิกที่ปุ่ม  เพื่อคอมไพล์ ตรวจสอบและอัพโหลดไฟล์ที่คอมไพล์แล้วไปยังหน่วยความจำแฟลชของอาร์ดุยโน
  6. ทดลองกดปุ่มสวิทช์กดติด ปล่อยดับ โดยกดแช่ไว้นิ่งๆ (เซตสถานะของสัญญาณดิจิทัลให้เป็น HIGH) สลับกับการปล่อย (เซตสถานะของสัญญาณดิจิท้ลให้เป็น LOW) แล้วเปรียบเทียบความแตกต่าง โดยสังเกตการกระพริบของ LED ทั้งสองสถานะเปรียบเทียบกัน

ผล

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

การทำงานของโปรแกรม

โปรแกรมนี้เราพิมพ์ขึ้นมาโล้นๆ เลย ไม่มีคอมเมนต์ใดๆ ทั้งสิ้นให้เสียเวลาล่ะ เริ่มต้นขึ้นมาก็
int button;

นี่เป็นการประกาศตัวแปร ให้เป็นแบบ int (หรือจะประกาศให้เป็นก boolean ก็ได้) ตั้งชื่อตัวแปรว่า button ตั้งไว้เฉยๆ ยังไม่มีการกำหนดค่าใดๆ 
จากนั้นในส่วนของการตั้งค่า ก็มีการตั้งค่าให้ช่อง 0 เป็นขาส่งออก(OUTPUT) ช่อง 11 เป็นขารับข้อมูล (INPUT) ด้วยโค้ดต่อไปนี้

pinMode(0, OUTPUT);
pinMode(11, INPUT);

ส่วนการวนรอบ(loop() ) เริ่มต้นก็มีการอ่านข้อมูลสถานะจากช่อง 11 โดยค่าที่ได้นำมาเก็บไว้ในตัวแปรชื่อ button ดังโค้ดคำสั่งต่อไปนี้

button=digitalRead(11);

แล้วก็นำมาตรวจสอบกับเงื่อนไขว่า button นี้สถานะอย่างไร HIGH หรือ LOW โดยใช้นิพจน์

if (button==HIGH) 

ถ้าเป็นไปตามเงื่อนไขนี้ (ปุ่มกดถูกกด สถานะสัญญาณดิจิทัลขาเข้าเป็น HIGH) หลอด LED ก็จะกระพริบอย่างรวดเร็ว ตามคำสั่งในโค้ดดังนี้

  digitalWrite(0, HIGH);
  delay(100);
  digitalWrite(0, LOW);
  delay(100);

แต่ถ้าไม่เป็นไปตามเงื่อนไข(ปุ่มกดไม่ถูกกด สถานะสัญญาณดิจิทัลขาเข้าเป็น LOW) หลอด LED จะกระพริบช้าๆ  ตามคำสั่งในโค้ด ดังนี้

  digitalWrite(0, HIGH);
  delay(1000);
  digitalWrite(0, LOW);
  delay(2000);

สรุป

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

if (เงื่อนไขหรือตัวแปรที่ต้องการตรวจสอบ) { 
ข้อความคำสั่ง เมื่อเงื่อนไขเป็นจริง ;
}
else {
ข้อความคำสั่ง เมื่อเงื่อนไขเป็นเท็จ ;
}

เริ่มสนุกขึ้นแล้วนะครับ

แล้วพบกันใหม่ ตอนต่อไปครับ



06 มิถุนายน 2559

อาร์ดุยโน : ไฟแอล อี ดี กระพริบ ตอนสอง

ด้วยความที่ไม่อยากให้แต่ละตอนยาวเกินไป ครูจึงแบ่งไฟแอล อี ดี กระพริบด้วยอาร์ดุยโน เป็นสองตอน และตอนนี้ก็ตามมาอย่างเร็ว เพราะเดี๋ยวอุปกรณ์จะเคลื่อนย้ายซะก่อน

ครั้งนี้ให้ต่ออุปกรณ์ดังรูป แต่ก่อนอื่นควรถอดสาย USB ที่เชื่อมต่อกับคอมพิวเตอร์ก่อน ถอดออกเลยครับ ไม่ต้องคิดมาก เผื่อเวลาต่อสายไฟเกิดมันลัดวงจรจะเสียหายถึงคอมพิวเตอร์เรา


LED ตัวที่สองนี้ อาโนดถูกต่อเข้ากับช่องหมายเลข 5 (digital) ส่วนคาโทดต่อเข้ากับตัวต้านทาน 220 โอห์ม ส่วนของด้านหนึ่งของตัวต้านทานต่อเข้ากับกราวด์ซึ่งเราใช้สายโยงมายังต้วต้านทานตัวแรกได้เลยครับ แล้วมันจะมาลงกราวด์ที่บอร์ดด้วยกัน

ตรวจดูความเรียบร้อยอีกครั้ง ก่อนเสียบสาย USB เข้ากับคอมพิวเตอร์ แล้วดำเนินการ ดังนี้

  1. เปิด IDE
  2. เปิดไฟล์โปรแกรมที่เราได้แก้ไขไว้ เมื่อตอนที่แล้วขึ้นมา
  3. พิมพ์แก้ไขโปรแกรม ดังต่อไปนี้
  4. คลิกปุ่ม  เพื่อคอมไฟล์ ตรวจสอบ และอัพโหลด พร้อมกันเลยทีเดียว

คราวนี้ก็จะสังเกตเห็นหลอด LED ทั้งสองหลอดผลัดกันติด ผลัดกันดับช่วงเวลาละ 1 วินาที

อธิบายการทำงาน

ก่อนอื่นครูให้ข้อสังเกตว่า เราสามารถ Comment ด้วยภาษาไทยก็ได้นะครับ เพื่อให้เด็กๆ ที่ไม่ยังไม่ค่อยเก่งภาษาอังกฤษสามารถทำความเข้าใจกับโปรแกรมได้ แต่ครูก็ยังใช้ปนๆ กันอยู่ เพราะโปรแกรมต้นฉบับเดิมเขาคอมเมนต์เป็นภาษาอังกฤษ

ทีนี้มาดูส่วนส่วนแรก ซึ่งเป็นการประกาศตัวแปร ที่มีประเภทของตัวแปรเป็นจำนวนเต็ม โดยใช้คีย์เวิร์ดว่า int แล้วตามด้วยชื่อตัวแปร led1, led2 สำหรับเก็บหมายเลขพอร์ทดิจิทัล 10 และ 5 ตามลำดับ ส่วน delayTime1, delayTime2 สำหรับเก็บตัวเลขค่าหน่วงเวลาของการเกิดแสงสว่างของหลอดที่ 1 และ 2 ตามลำดับ

ต่อจากนั้นก็เป็นส่วน void setup()  ซึ่งเป็นการตั้งค่าให้พอร์ทดิจิทัล ทำหน้าที่เป็นเอาท์พุทส่งค่าไปยังภายนอก 
   pinMode(led1, OUTPUT) ;  //เป็นการเซ็ตพอร์ท led1 เป็นเอาท์พุด
   pinMode(led2, OUTPUT);  //เป็นการเซ็ตพอร์ท led2 เป็นเอาท์พุต

ส่วนที่สาม void loop() เป็นส่วนของการวนรอบการทำงานไม่สิ้นสุด ซึ่งก็จะเหมือนกับตัวอย่างในตอนที่แล้ว เพียงแต่ในตอนนี้ จะมีการควบคุมหลอด 2 หลอด โดยให้หลอดที่หนึ่ง led1 สว่างก่อน จากนั้นหน่วงเวลาตามค่าที่ตั้งไว้ที่ delayTime1 แล้วให้หลอดที่สอง led2 สว่าง จากนั้นก็หน่วงเวลาไว้อีกตามค่า delayTime2 จากนั้นก็ปิด แล้ววนรอบกลับไปทำซ้ำใหม่ ..... เรื่อยๆ ไม่รู้จบ

หากเราต้องการเปลี่ยนจังหวะการหน่วงเวลา ก็ทำได้โดยการแก้ไขค่าของตัวแปร delayTime1 กับ delayTime2 เราก็จะได้รูปแบบการกระพริบที่แปลกๆ ออกไปอย่างง่ายดาย 

คงพอมองเห็นภาพของการใช้พอร์ทดิจิทัลสำหรับการส่งข้อมูลออก(OUTPUT) กันบ้างแล้วนะครับ ซึ่งจะเป็นพื้นฐานสำคัญในการเรียนรู้ต่อไป

แล้วพบกันใหม่ครับ