Nanobit with microPython ตอนที่ 5

รับ Input จากสวิตช์ A B บนบอร์ด Nanobit

บนบอร์ด Nanobit มีสวิตช์ 2 ตัวที่สามารถเขียนโค้ดเพื่อรับค่าได้ในตำแหน่งดังรูป โดยมีรูปแบบคำสั่งดังนี้

รูปแบบคำสั่ง อ่านค่าสวิตช์

ถ้าปุ่ม A,B ถูกกดจะให้ค่าเป็น True (จริง)

ถ้าไม่ถูกกดจะให้ค่าเป็น False (เท็จ)

button_a.is_pressed()

    button_b.is_pressed()

ถ้าปุ่ม A,B ถูกกดรอจนกระทั่งปล่อยจะให้ค่าเป็น True

ถ้าไม่ถูกกดจะให้ค่าเป็น False

button_a.was_pressed()

    button_b.was_pressed()

ตัวอย่างที่ 14 ทดสอบคำสั่ง is_pressed()

 
 
from microbit import *
while True:
    if button_a.is_pressed():
        display.show('A',clear=True)
    if button_b.is_pressed():
        display.show('B',clear=True)
การทำงาน

is_pressed() ถ้ากดสวิตช์ค้างจะมีค่าเป็นจริงตลอดเวลา ดังนั้นคำสั่ง display.show ซึ่งกำหนดค่า clear เป็นจริง จะทำการเคลียร์ผลลัพธ์ข้อความหลังจากทำคำสั่งแล้ว จะเคลียร์ข้อความที่หน้าจอออก ถ้ากดค้างจะพบว่า LED 5×5 จะเกิดการกะพริบ

ตัวอย่างที่ 15 ทดสอบคำสั่ง was_pressed()

 
 
from microbit import *
while True:
    if button_a.was_pressed():
        display.show('A',clear=True)
    if button_b.was_pressed():
        display.show('B',clear=True)
การทำงาน

สำหรับคำสั่ง was_pressed() ถ้ามีการกดสวิตช์ค้าง จะเป็นจริงแค่ครั้งเดียว ถ้าจะให้เป็นจริงอีกครั้งจะต้องปล่อยสวิตช์ก่อนแล้วกดใหม่

ตัวอย่างที่ 16 ใน 10 วินาทีคุณกดสวิตช์ได้กี่ครั้ง

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

 
 
from microbit import *
while True:
    sleep(10000)
    display.scroll(button_a.get_presses())
การทดสอบ

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

การสุ่มค่าตัวเลข

เพื่อสุ่มค่าตัวเลขในที่นี้จะต้องเพิ่มโมดูลชื่อ random ไว้ที่ส่วนหัวของโค้ดก่อน โดยพิมพ์

import random

รูปแบบการใช้งานคำสั่ง random

การสุ่มค่าตัวเลขจำนวนเต็ม

random.randint(a,b)

ตัวอย่าง

random.randint(2,8)

#สุ่มค่าตัวเลขจำนวนเต็มตั้งแต่ค่า 2 ถึง 8

การสุ่มค่าตัวเลขทศนิยมตั้งแต่ 0.0 ถึง 1.0

random.random()

การสุ่มเลือกค่าจากสมาชิกในตัวแปรแบบ list

list = [“choice1”, “choice2”, “choice3”, “choice4”]

    random.choice(list)

ตัวอย่างที่ 17 การสุ่มค่าตัวเลขจาก 0.0 ถึง 1.0 แสดงผลที่ REPL

 
 
from microbit import *
import random
while True:
    print (random.random())
    sleep(100)

การทดสอบ

ให้เปิดหน้าต่าง REPL (คลิกที่ Open Serial ) เพื่อดูผลลัพธ์

ตัวอย่างที่ 18 สุ่มการติดสว่างของ LED 5×5

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

 
 
from microbit import *
import random
while True :
    x=random.randint(0,4)
    y=random.randint(0,4)
    display.set_pixel(x,y,9)
    sleep(100)
    display.set_pixel(x,y,0)
    sleep(50)

 

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

คำสั่ง random ไม่มีอยู่ในไลบรารี่หลัก microbit จึงต้อง import เข้ามาเพิ่ม จากนั้นสร้างตัวแปร x และ y สำหรับกำหนดตำแหน่งพิกัด x,y ของ LED 5×5 จากนั้นทำการสุ่ม 2 ครั้ง ครั้งแรกเป็นพิกัดแนวแกน x ครั้งที่ 2 เป็นพิกัดแนวแกน y แล้วส่งค่าไปแสดงด้วยคำสั่ง set_pixel() เว้นระยะ 0.1 วินาทีสั่งดับ LED ที่ตำแหน่งเดิมทิ้ง วนทำซ้ำไปเรื่อยๆ

ข้อแนะนำเพิ่มเติม

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

 
 
from microbit import *
import random
while True :
    x=random.randint(0,4)
    y=random.randint(0,4)
    display.set_pixel(x,y,9)
    sleep(100)

การใช้งานพอร์ตอินพุต/เอาต์พุต

Nanobit มีพอร์ตให้ใช้งานทั้งหมด 21 พอร์ต การติดต่อใช้ผ่านคำสั่ง pinx โดย x คือตำแหน่งขาตั้งแต่ 0-20 เพื่อทดสอบว่าคำสั่ง pinx มีคำสั่งอะไรให้ใช้งานบ้าง ให้ทำตามขั้นตอนดังนี้

1. เปิดหน้าต่าง REPL เพื่อเข้าสู่โหมดการพิมพ์คำสั่งแบบ Command Line

2. พิมพ์ >>> dir()
เพื่อดูว่ามีชุดโมดูลอะไรให้ใช้งานได้บ้าง

3. พิมพ์ >>> dir(pin2) เพื่อดูว่าคำสั่งที่ใช้งานได้ของ pin 2 มีอะไรบ้าง

คำสั่งสำคัญๆ ประกอบด้วย

write_digital(value)
กำหนดให้ขาที่ต้องการมีลอจิก “1” หรือ “0”

ตัวอย่าง

pin2.write_digtal(1)

กำหนดให้ขา P2 มีลอจิกเป็น “1”

read_digital()
คืนค่าสถานะของขาที่ต้องการอ่านค่า เป็นจริงหรือเท็จ (0,1)

ตัวอย่าง

x=pin3.read_digital()

อ่านค่าดิจิตอลจากขา P3 เก็บค่าในตัวแปร x

read_analog()
คืนค่าอะนาลอกของขาที่ต้องการอ่านค่า ค่าอะนาลอกมีค่าระหว่าง 0-1023 โดย 0 หมายถึงแรงดันที่ขา 0V ส่วน 1023 หมายถึงแรงดันที่ขา 3.3V

write_analog(value)
เป็นคำสั่งสำหรับสร้างสัญญาณพัลส์วิธมอดูเลเตอร์ออกไปยังขาพอร์ตที่ต้องการ โดยค่า Value เป็นค่าเปอร์เซ็นต์ดิวตี้ไซเกิ้ลมีค่าตั้งแต่ 0-1023 ค่า 0 หมายถึงค่าดิวตี้ไซเกิ้ล 0% ส่วน 1023 หมายถึงค่าดิวตีไซเกิ้ล 100%

ตัวอย่างที่ 19 ไฟกะพริบที่ขา 15

 
 
from microbit import *
while True :
    pin15.write_digital(1)
    sleep(200)
    pin15.write_digital(0)
    sleep(200)
การทำงาน

บนบอร์ด Nanobit มี LED ใช้งานทั่วไปติดตั้งเข้ากับขา 15 การสั่งงานให้ติดหรือดับ ทำได้โดยใช้คำสั่ง write_digital ในที่นี้จะให้ LED ที่ขา P15 ติดและค้างอยู่ 0.2 วินาที ดับและดับค้างอยู่ 0.2 วินาที วนซ้ำไปเรื่อยๆ

ตัวอย่างที่ 20 สวิตช์ A/B ควบคุมการติดดับของหลอดไฟ

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

 
 
from microbit import *
while True :
    if button_a.is_pressed():
        pin15.write_digital(1)
    elif button_b.is_pressed():
        pin15.write_digital(0)

ตัวอย่างที่ 21 เปิด/ปิด หลอดไฟด้วยสวิตช์ตัวเดียว

 
 
from microbit import *
x=0
while True :
    if button_a.was_pressed():
        if x==0:
            pin15.write_digital(1)
            x=1
        else :
            pin15.write_digital(0)
            x=0
การทำงาน

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

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

ตัวอย่างที่ 22 ปรับความสว่างของหลอดไฟด้วยสวิตช์ A B

 
 
from microbit import *
x=0
while True :
    if button_a.was_pressed():
        if x<900 :
            x=x+100
        else :
            x=1023
    if button_b.was_pressed():
        if x>100 :
            x=x-100
        else :
            x=0
    pin15.write_analog(x)
การทำงาน

คำสั่ง write_analog
จะส่งค่าระดับแรงดันที่ปรับเปลี่ยนตามค่าความกว้างพัลส์ ค่าแรงดัน 0-3.3V ปรับเปลี่ยนตามค่าที่เราส่งออกไป 0-1023 ตัวอย่างนี้ใช้การกดสวิตช์ A เพื่อเพิ่มค่าตัวแปร จากนั้นนำตัวแปรที่ถูกเพิ่มค่าทีละ 100 เป็นค่า PWM เพื่อขับ LED ให้ค่อยๆ สว่างมากขึ้น จนถึงค่าสูงสุด ถ้ากดสวิตช์ B จะเป็นการลดค่าตัวแปรลงทีละ 100 จนค่าเป็น 0 จะพบว่า LED ดับ

Facebook Comments Box

Press Ctrl+C to copy the following code.
"