บอร์ดขยาย Wukong 2040 เป็นบอร์ดที่สามารถขยายอุปกรณ์ต่อพ่วง สำหรับ Raspberry Pi Pico รองรับการเชื่อมต่อสำหรับผู้สร้างโปรเจคหรือโครงงานในการขยายอินพุต เอาต์พุต ไม่ว่าจะเป็น ลำโพงแบบเปียโซ, ปุ่มกดแบบกดติดปล่อยดับ 2 ปุ่ม ปุ่มA และ ปุ่มB มีไฟแสดงผลแบบ RGB มีพอร์ตการเชื่อมต่อมอเตอร์กระแสตรง 4 ช่อง ใช้พลังงานไฟฟ้าด้วยถ่าน 18650 3.7V เพียง 1 ก้อน มี Chip การประมวลผลการจัดการด้านพลังงานในตัว แสดงสถานะพลังงานที่จะหมด อีกทั้งยังสามารถใช้งานได้ต่อเนื่องมากถึง 60 นาทีในการชาร์จ 1 ครั้ง และสามารถชาร์จถ่านได้จากช่อง USB Charger 5V บนบอร์ดได้อีกด้วย
ตำแหน่งของอุปกรณ์ต่างของบอร์ดขยาย Wukong 2040 สำหรับ Raspberry Pi Pico
คุณสมบัติด้านเทคนิคและขนาดของบอร์ดขยาย Wukong 2040 สำหรับ Raspberry Pi Pico
บอร์ดขยาย Wukong 2040 สามารถเชื่อมต่อมอเตอร์ไฟฟ้ากระแสตรงได้ถึง 4 ตัว และเซอร์โวมอเตอร์ได้ถึง 12 ตัว
รายละเอียด Pin ของอุปกรณ์ต่างๆที่เชื่อมต่อกับบอร์ด Raspberry Pi Pico
อุปกรณ์ที่ใช้ร่วมกับบอร์ดขยาย Wukong 2040 สำหรับ Raspberry Pi Pico
สามารถใช้บอร์ด Raspberry Pi Pico หรือ Pico W และใช้ถ่านชนิด 18650 จำนวน 1 ก้อน
การติดตั้งโปรแกรม CircuitPython
Raspberry Pi Pico รองรับการเขียนภาษา C, C++, MicroPython, CircuitPython
CircuitPython เป็นภาษาโปรแกรมที่ออกแบบมาเพื่อลดความซับซ้อนของการเรียนรู้ โดย CircuitPython เป็นวิธีที่ง่ายที่สุดในการเขียนโปรแกรมไมโครคอนโทรลเลอร์ สามารถดาวน์โหลด firmware .UF2 ได้ที่ Link นี้
หลังจากดาวน์โหลด firmware CircuitPython จากนั้นให้กดปุ่ม BOOTSEL ค้างไว้
จากนั้นเชื่อมต่อ Raspberry Pi Pico เข้ากับคอมพิวเตอร์ โดยใช้สาย USB และปล่อยปุ่ม BOOSEL บนบอร์ด Raspberry Pi Pico จากนั้นจะเห็นไดร์ของ Raspberry Pi Pico “RPI-RP2”
ทำการลากไฟล์ UF2 ที่ดาวน์โหลดมาก่อนหน้านี้ไปยังไดฟ์ “RPI-RP2” และเมื่อติดตั้งเสร็จสิ้น ไดรฟ์ “RPI-RP2” จะหายไป และไดรฟ์ “CIRCUITPY” จะปรากฏขึ้นแทนที่ จากนี้แสดงว่าคุณติดตั้ง CircuitPython สำเร็จแล้ว
การติดตั้ง Thonny IDE
โดยการทดสอบกับบอร์ด Raspberry Pi Pico เราจะใช้ Thonny เป็น Python IDE ระดับสำหรับเริ่มต้น ซึ่งออกแบบมาเหมาะสำหรับการเรียนรู้และการสอนการเขียนโปรแกรม พัฒนาโดย Tartu University ในเอสโตเนีย สามารถโหลดและติดตั้งโปรแกรมได้ที่ Link นี้
เปิด Thonny ขึ้นมา จากนั้นคลิกเมนู “Run” เลือก “Configure interperter”
ในตัวเลือก “Interperter”
- คลิกเลือก “CircuitPython(generic)”
- คลิก “OK” จากนั้นก็ทำการตั้งค่าเสร็จสิ้น
การใช้งานปุ่มกด A และ B
ปุ่มกด A จะเชื่อมต่อกับ GPIO 18 และ ปุ่มกด B จะเชื่อมต่อกับ GPIO 19 ของบอร์ด Raspberry Pi Pico
โค้ดทดสอบการใช้งานปุ่มกด A และ B
การทดสอบการใช้งาน ถ้าหากมีการกดปุ่ม A ไฟ LED บนบอร์ด Raspberry Pi Pico จะสว่างขึ้น หรือถ้าหากมีการกดปุ่ม B ไฟ LED บนบอร์ด Raspberry Pi Pico จะดับลง
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
import board import digitalio led_onboard = digitalio.DigitalInOut(board.LED) led_onboard.direction = digitalio.Direction.OUTPUT button_a = digitalio.DigitalInOut(board.GP18) # Create the wukong2040 button A object from the pins button_b = digitalio.DigitalInOut(board.GP19) button_a.direction = digitalio.Direction.INPUT # Set button_a to output mode button_b.direction = digitalio.Direction.INPUT button_a.pull = digitalio.Pull.UP # Set the pull-up button_b.pull = digitalio.Pull.UP while True: if button_a.value == False: # The value of button_a.value is the status value of button A. Pressing is 0, releasing is 1. led_onboard.value = True elif button_b.value == False: # The value of button_b.value is the status value of button B. Pressing is 0, releasing is 1. led_onboard.value = False |
การใช้งานลำโพงเปียโซ
ลำโพงเปียโซจะเชื่อมต่อกับ GPIO 9 ของบอร์ด Raspberry Pi Pico
โค้ดทดสอบการใช้งานลำโพงเปียโซ
การทดสอบการใช้งาน ถ้าหากมีการกดปุ่ม A จะทำการเล่นเสียงเพลง
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
import time import array import math import board import digitalio from audiocore import RawSample try: from audioio import AudioOut except ImportError: try: from audiopwmio import PWMAudioOut as AudioOut except ImportError: pass button = digitalio.DigitalInOut(board.GP18) button.switch_to_input(pull=digitalio.Pull.UP) tone_volume = 0.9 frequency = 440 length = 8000 // frequency sine_wave = array.array("H", [0] * length) for i in range(length): sine_wave[i] = int((1 + math.sin(math.pi * 2 * i / length)) * tone_volume * (2 ** 15 - 1)) audio = AudioOut(board.GP9) sine_wave_sample = RawSample(sine_wave) while True: if not button.value: audio.play(sine_wave_sample, loop=True) time.sleep(1) audio.stop() |
การแสดงไฟ LED แบบ RGB
ทดสอบการใช้งานไฟ RGB จะมีหลอดไฟ LED ชนิด RGB (ws2812b) อยู่ 2 ดวง โดยจะเชื่อมต่อกับ GPIO 22 ของบอร์ด Raspberry Pi Pico
การเพิ่ม lib สำหรับการการแสดงไฟ RGB
ในการเขียนโปรแกรมหลอดไฟ LED ชนิด RGB (ws2812b) ด้วย CircuitPython จะต้องใช้ไฟล์ไลบรารี่ neopixel ของ Adafruit สามารถดาวน์โหลดไฟล์ไลบรารี neopixel ได้โดย Link นี้และทำการคัดลอกไฟล์ไปไว้ในไดเร็กทอรี “lib” ของไดร์ “CIRCUITPY”
โค้ดทดสอบการแสดงไฟ RGB
ทดสอบโดยเขียนโปรแกรมให้ RGB 2 ดวงเปลี่ยนสีแบบสายรุ้งและกระพริบเปลี่ยนสีไปเรื่อยๆ
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
import time import board from rainbowio import colorwheel import neopixel NUMPIXELS = 2 SPEED = 0.05 BRIGHTNESS = 0.2 # Values in (0.0, 1.0), where 0.0 is off and 1.0 is maximum PIN = board.GP22 # Rainbow bead pins are GP22 pixels = neopixel.NeoPixel(PIN, NUMPIXELS, brightness=BRIGHTNESS, auto_write=False) def rainbow_cycle(wait): for color in range(255): for pixel in range(len(pixels)): pixel_index = (pixel * 256 // len(pixels)) + color * 5 pixels[pixel] = colorwheel(pixel_index & 255) pixels.show() time.sleep(wait) while True: rainbow_cycle(SPEED) |
การควบคุมมอเตอร์กระแสตรง
ทดสอบมอเตอร์กระแสตรง 4 ตัว โดยการเชื่อมต่อ Pin ของ
พอร์ต M1 จะเชื่อมต่อกับ GPIO20 กับ GPIO21
พอร์ต M2 จะเชื่อมต่อกับ GPIO10 กับ GPIO11
พอร์ต M3 จะเชื่อมต่อกับ GPIO12 กับ GPIO13
พอร์ต M4 จะเชื่อมต่อกับ GPIO14 กับ GPIO15 ของบอร์ด Raspberry Pi Pico
การเพิ่ม lib สำหรับการควบคุมมอเตอร์
ในการเขียนโปรแกรมควบคุมมอเตอร์กระแสตรง ด้วย CircuitPython จะต้องใช้ไฟล์ไลบรารี่ adafruit_motor
สามารถดาวน์โหลดไฟล์ไลบรารี adafruit_motor ได้โดย Link นี้ และทำการคัดลอกเฉพาะโฟลเดอร์ adafruit_motor ไปไว้ในไดเร็กทอรี “lib” ของไดร์ “CIRCUITPY”
โค้ดทดสอบการควบคุมมอเตอร์กระแสตรง 4 ตัว
ทดสอบการเขียนโปรแกรมให้สามารถตั้งค่าความถี่ของสัญญาณพัลล์ (PWM) เพื่อสามารถความคุมความเร็วของมอเตอร์ได้ โดยสร้างฟังก์ชั่นการเคลื่อนที่พื้นฐานของการหมุนมอเตอร์ เดินหน้า ถอยหลัง เลี้ยวซ้าย เลี้ยวขวา หยุดมอเตอร์ และทำการตั้งโปรแกรมให้วนลูป โดยให้มีการเดินหน้าเป็นเวลา 5 วินาที จากนั้นหยุดทุกมอเตอร์เป็นเวลา 1 วินาที จากนั้นสั่งให้มอเตอร์ถอยหลังเป็นเวลา 5 วินาที จากนั้นหยุดทุกมอเตอร์เป็นเวลา 1 วินาที ทำซ้ำไปเรื่อยๆ เป็นการทดสอบมอเตอร์เบื้องต้นทุกตัว
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 |
import board import digitalio import time import pwmio from adafruit_motor import motor motor1A = board.GP20 motor1B = board.GP21 motor2A = board.GP10 motor2B = board.GP11 motor3A = board.GP12 motor3B = board.GP13 motor4A = board.GP14 motor3B = board.GP15 pwm1A = pwmio.PWMOut(motor1A, frequency=50) pwm1B = pwmio.PWMOut(motor1B, frequency=50) pwm2A = pwmio.PWMOut(motor2A, frequency=50) pwm2B = pwmio.PWMOut(motor2B, frequency=50) pwm3A = pwmio.PWMOut(motor3A, frequency=50) pwm3B = pwmio.PWMOut(motor3B, frequency=50) pwm4A = pwmio.PWMOut(motor4A, frequency=50) pwm4B = pwmio.PWMOut(motor4B, frequency=50) motor1 = motor.DCMotor(pwm1A, pwm1B) motor2 = motor.DCMotor(pwm2A, pwm2B) motor3 = motor.DCMotor(pwm3A, pwm3B) motor4 = motor.DCMotor(pwm4A, pwm4B) def forward(speedM): motor1.throttle = speedM motor2.throttle = speedM motor3.throttle = speedM motor4.throttle = speedM def backward(speedM): motor1.throttle = -speedM motor2.throttle = -speedM motor3.throttle = -speedM motor4.throttle = -speedM def turnLeft(speedM): #max = 1 motor1.throttle = -speedM motor2.throttle = -speedM motor3.throttle = speedM motor4.throttle = speedM def turnRight(speedM): #max = 1 motor1.throttle = speedM motor2.throttle = speedM motor3.throttle = -speedM motor4.throttle = -speedM def stopall(): motor1.throttle = 0 motor2.throttle = 0 motor3.throttle = 0 motor4.throttle = 0 while True: forward(0.8) time.sleep(5) stopall() time.sleep(1) backward(0.8) time.sleep(5) stopall() time.sleep(1) |
การควบคุมเซอร์โวมอเตอร์
จุดเชื่อมต่ออินพุต เอาต์พุต มี 12 ตัวบนบอร์ด Wukong 2040 (GPIO: 0, 1, 2, 3, 4, 5, 6, 7, 8, 26, 27, 28) ซึ่งสามารถใช้ขับเคลื่อนเซอร์โวขนาดเล็กได้ ซึ่งในการทดลองนี้เราจะลองเชื่อมต่อ 1 เซอร์โวมอเตอร์ที่ช่อง 0
โค้ดทดสอบการควบคุมเซอร์โวมอเตอร์
ทดสอบโดยเขียนโปรแกรมให้ เซอร์โวมอเตอร์ทำการหมุนไป เริ่มจากค่า 0 องศาและหมุนไปที่ 180 องศา จากนั้น หมุนกลับจากค่า 180 องศาไปจนถึงค่า 0 ทำการวนซ้ำไปเรื่อยๆ
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
import time import board import pwmio from adafruit_motor import servo pwm = pwmio.PWMOut(board.GP0, duty_cycle=2 ** 15, frequency=50) my_servo = servo.Servo(pwm) while True: for angle in range(0, 180, 5): my_servo.angle = angle time.sleep(0.05) for angle in range(180, 0, -5): my_servo.angle = angle time.sleep(0.05) |
การแสดงผลออกหน้าจอ OLED
บอร์ดขยาย Wukong 2040 สำหรับ Raspberry Pi Pico มีพอร์ตสื่อสารสัญญาณแบบ IIC ในตัว (GP16, GP17) ซึ่งสามารถขับจอแสดงผล OLED ผ่าน IIC ได้ การทดสอบนี้ใช้ ความละเอียดของจอแสดงผล OLED คือ 128×64 พิกเซล
การเพิ่มไลบรารี่ สำหรับการหน้าจอ OLED SSD1306
ในการเขียนโปรแกรมแสดงผล OLED ด้วย CircuitPython จะต้องใช้ไฟล์ไลบรารี่ adafruitssd1306.py และไฟล์ไลบรารี adafru_framebuf.py
สามารถดาวน์โหลดไฟล์ไลบรารี adafruitssd1306.py ได้โดย Link นี้ และไฟล์ไลบรารี adafru_framebuf.py ได้โดย Link นี้ และทำการคัดลอกเฉพาะไฟล์ adafruit_ssd1306.py, adafru framebuf py ไปไว้ในไดเร็กทอรี “lib” ของไดร์ “CIRCUITPY”
โค้ดแสดงผลออกหน้าจอ OLED
ทดสอบโดยเขียนโปรแกรมให้ แสดงเป็นรูปแบบของกราฟฟิก การวาดเส้นแนวตั้ง การวาดเส้นแนวนอน การวาดรูปวงกลม การวาดรูปสี่เหลี่ยม เพื่อทดสอบการแสดงผลออกหน้าจอ
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 |
import board import busio import adafruit_ssd1306 import time i2c = busio.I2C(board.GP17, board.GP16) display = adafruit_ssd1306.SSD1306_I2C(128, 64, i2c, addr=0x3C) bgColor=0 display.fill(bgColor) for i in range(0,display.height,4): for j in range(0,display.width,4): display.pixel(j, i, not bgColor) display.show() display.fill(bgColor) for i in range(0,display.height,4): display.hline(0, i,display.width, not bgColor) display.show() display.fill(bgColor) for i in range(0,display.width,8): display.vline(i, 0,display.height, not bgColor) display.show() display.fill(bgColor) for i in range(0,display.height,4): display.line(0, 0, display.width, i, not bgColor) display.line(display.width, display.height, 0, display.height-i, not bgColor) display.show() display.fill(bgColor) for i in range(0,display.width//2,4): display.circle(display.width//2, display.height//2, i, not bgColor) display.show() display.fill(bgColor) for i in range(0,display.height,16): for j in range(0,display.width,16): display.rect(j, i, 12, 12, not bgColor) display.show() for i in range(0,display.height,16): for j in range(0,display.width,16): display.fill_rect(j+2, i+2, 8, 8, not bgColor) display.show() display.fill(bgColor) |
สรุป
บอร์ดขยาย Wukong 2040 สำหรับ Raspberry Pi Pico สามารถนำไปใช้ต่อยอดการเรียนรู้บอร์ด Raspberry Pi Pico ในการต่อโมดูลต่างๆที่ผมได้ทดสอบมาได้อีกหลายอย่าง อีกทั้งสามารถนำไปต่อยอดการประดิษฐ์เป็นโครงงานด้านวิศวกรรม หรือจะนำไปเป็นส่วนประกอบการสร้างหุ่นยนต์ขับเคลื่อนด้วยล้อ Mecanum เพราะบอร์ดขยาย Wukong 2040 สำหรับ Raspberry Pi Pico สามารถเชื่อมต่อมอเตอร์ไฟฟ้ากระแสตรงได้ถึง 4 ตัว สามารถเรียนรู้ด้วยภาษา CircuitPython ซึ่งเป็นพื้นฐานมาจากภาษา Pyhton ในปัจจุบัน อีกทั้งแหล่งพลังงานของบอร์ดใช้เพียงถ่าน 18650 เพียงก้อนเดียว และสามารถชาร์จถ่านบนบอร์ดได้ จะทำให้ช่วยประหยัดเวลาในการชาร์จและสะดวกสำหรับผู้เรียนและผู้สอนด้วย เหมาะมากๆสำหรับผู้ที่จะเริ่มต้นเรียนรู้การเขียนโปรแกรมกับบอร์ด Raspberry Pi Pico บอร์ดขยายนี้ตอบโจทย์ในการต่อยอดของนักประดิษฐ์
ผมต้องขอขอบคุณบริษัท ELECFREAKS ที่ส่งชุดบอร์ดขยาย Wukong 2040 สำหรับ Raspberry Pi Pico ได้มาทดสอบ สามารถซื้อ Wukong 2040 สำหรับ Raspberry Pi Pico ในราคา $9.90 (~350฿) ที่ร้านค้า ELECFREAKS
กรรมการผู้จัดการของโรงเรียนเกี่ยวกับหุ่นยนต์ในจ.เชียงใหม่, ชนะเลิศการแข่งขันหุ่นยนต์ต่างๆ ทั้งในและต่างประเทศ ได้แก่ Robocon และ Makerthon