วันจันทร์ที่ 21 กันยายน พ.ศ. 2563

ตอนพิเศษ (2) การสร้างสื่อการเรียนรู้จากบอร์ด KidBright เรื่องอัตราทดเฟืองและการเปลี่ยนแปลงความเร็ว

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

    ภาพด้านล่างคือโค้ดทั้งหมดจะเห็นว่าตัวโค้ดแบ่งเป็นโปรแกรมหลัก (ที่มีคำสั่ง Forever ครอบอยู่) และฟังก์ชันย่อยที่ชื่อ VELO โดยโปรแกรมหลักจะทำหน้าที่แสดงค่าความเร็วเฉลี่ยบนจอ OLED ขณะที่ฟังก์ชัน VELO ใช้คำนวณค่าได้จากเซ็นเซอร์มาลองดูรายละเอียดกัน



    ขออธิบายตามลำดับการทำงานของโปรแกรมเลย จากโปรแกรมหลัก เราตั้งค่าตัวแปร count กับ read เป็น 0 จากนั้นให้จอ OLED แสดงข้อความขนาดใหญ่ว่า "Speed" ที่ตำแหน่ง (1,1) (column, row) แล้วเรียกฟังก์ชัน VELO มาใช้งาน

    ที่ฟังก์ชัน VELO จะเข้าสู่การวนลูปการทำงานไปเรื่อย ๆ เมื่อค่า count < 10 ด้วยคำสั่ง Repeat while... (จำได้เนาะว่าเมื่อตอนต้นเราตั้งค่า count = 0 ดังนั้นตอนนี้ count < 10) ลำดับต่อไปโปรแกรมเลยอ่านค่าจาก Encoder ด้วยคำสั่ง Pulse capture read ตรงนี้ตั้งค่าให้อ่านจากพอร์ต IN1 ตามตำแหน่งที่ได้ต่อเซ็นเซอร์ไว้ก่อนหน้านี้ ค่าที่อ่านได้จะวัดจากขาลงของสัญญาณของสองลูกพัลส์มีหน่วยเป็นไมโครวินาทีเท่ากับว่าเราจะทราบว่าคลื่นพัลส์มีความยาวเท่าไหร่ก็เก็บค่าไว้ในตัวแปร pulse

   การหาค่าความเร็วในหน่วยรอบต่อนาทีเราต้องแปลงค่าที่อ่านได้ (pulse) อีกทีหนึ่ง จากที่เราทราบว่า านนับความเร็วรอบที่เราใช้มี 20 ช่อง ดังนั้นเมื่อหมุนครบ 1 รอบเราจะได้ค่าเวลารวม (20 x pulse) ไมโครวินาที หรือ (20 x pulse) ไมโครวินาทีต่อรอบ เมื่อต้องการค่าในหน่วยรอบต่อนาที (rpm) ก็ทำการแปลงหน่วยซะ จะได้ว่า

    Speed (rpm) = (1 x 60)/(20 x pulse x 10^-6)

ใช้คำสั่ง Set speed = ....ใส่ค่าตามสมการด้านบน

    ลำดับต่อมาเราเก็บค่าความเร็วที่คำนวณแล้วไว้ในตัวแปร Read เดิมตัวแปรนี้มีค่าเป็น 0 ดังนั้นเมื่อจบลูป while รอบแรกค่า Read = Speed คำสั่งต่อมาในลูปโปรแกรมจะตั้งค่า count = count+1 เพื่อบอกโปรแกรมว่าตอนนี้ค่า count เปลี่ยนเป็น 1 แล้ว ดังนั้นเมื่อวกกลับไปเช็คค่า count ที่คำสั่ง while โปรแกรมก็จะอ่านค่าและคำนวณความเร็วอีกครั้งเพราะค่า count ยังน้อยกว่า 10 การทำงานครั้งที่สองนี้ค่า Read จะเป็นค่าสะสมของ Speed ที่อ่านได้ครั้งที่สอง และค่า count ก็จะเปลี่ยนไปด้วยวนไปอย่างนี้จนสะสมครบ 10 ค่า ครั้งนี้ count = 10 ไม่ตรงตามเงื่อนไข while จึงออกจากลูป 

    ค่าความเร็วเฉลี่ยได้มาจากค่า Read ซึ่งเป็นผลรวมของค่าความเร็ว 10 ค่า ใช้คำสั่ง Set average = เพื่อเก็บค่าเฉลี่ยความเร็วไว้ที่ตัวแปรที่ชื่อว่า average จึงจบการทำงานของฟังก์ชัน VELO

    กลับมาที่โปรแกรมหลัก กรณีนี้ใช้คำสั่ง if...do...เพื่อตรวจสอบว่าค่าที่คำนวณได้เป็น infinity หรือไม่ ถ้าใช่ให้ลบหน้าจอทั้งหมด ตรงนี้ใส่ไว้เพราะไม่ต้องการแสดงผลบนหน้าจอซึ่งจะทำให้การแสดงค่าตัวเลขตอนหลังไม่สวยงาม

    คำสั่งสุดท้ายคือการแสดงค่าความเร็วเฉลี่ยบนจอ OLED ระบุขนาดตัวอักษรและตำแหน่งเพื่อให้อ่านค่าได้ง่าย ตรงนี้อาจปรับเปลี่ยนได้ตามความเหมาะสม กรณีที่มีปัญหาการแสดงผลให้ลองตรวจสอบดูว่าจอ OLED ที่เลือกใช้เป็นชิปรุ่นไหน อาจจะต้องเปลี่ยนจาก SSD1306 เป็น SH1116 

    เมื่อจบโปรแกรม KidBright จะเริ่มทำงานใหม่จากคำสั่งแรกอีกครั้ง และทุกครั้งที่เริ่มวนกลับมา ตัวแปร count กับ Read ที่ใช้เก็บค่าสะสมในฟังก์ชันจะกลับมาเป็น 0 ทุกครั้งที่เริ่มต้นใหม่ 

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

ข้อสังเกต ไม่ว่าจะเอาเฟืองกี่ตัวมาต่อเชื่อมกัน

  • เฟืองที่อยู่ติดกันจะหมุนในทิศทางตรงกันข้าม
  • เฟืองขนาดใหญ่กว่าจะหมุนด้วยความเร็วรอบที่ช้ากว่า
  • เฟืองที่มีขนาดเท่ากันจะหมุนด้วยความเร็วรอบเท่ากัน
วันนี้เอาไว้แค่นี้ก่อนน้อ...

2 ความคิดเห็น:

  1. อาจารย์ครับ block ที่เป็น Pulse capture read start ได้มาจากไหนครับ ผมหา plugin ไม่เจอ

    ตอบลบ
    คำตอบ
    1. ติดตั้งไว้ใน Kidbright IDE แล้วค่ะ อยู่ในแถบ Plugins => GPIO

      ลบ

ตอนที่ 11 KidBright ต่อ Output ควบคุมพัดลมตามเวลาและอุณหภูมิผ่านรีเลย์

     เมื่อเรามีบอร์ดควบคุมอย่าง KidBright และมีรีเลย์พร้อมกับแหล่งจ่ายไฟภายนอกเราก็สามารถควบคุมการทำงานของอุปกรณ์ขนาดใหญ่ขึ้นได้      บอกเสร...