วันอังคารที่ 26 สิงหาคม พ.ศ. 2557

Build Micro Python ไปใช้บน STM32F4

KickStarter โครงการแรกที่ผมจ่ายเงินซื้อผลิตภัณฑ์ แล้วมีความสุขมาก คือ MicroPython เป็นการพัฒนา Micro Processor board เล็กๆ น่ารักๆ ให้มีความสามารถของภาษา Python Embed ลงไปใน CPU ARM Cortex-M4 ซึ่งเห็นครั้งแรกผมไม่รอช้าที่จะ "เข้าคิว" เพื่อรอสั่งซื้อมาเป็นเจ้าของ เมื่อของพร้อม...

แล้ววันที่ของพร้อมก็มาถึง ผมสั่ง Micro Python ไปหนึ่งชุด พร้อม LCD Skin และ AMP Skin โดยทั้งสอง Skin เป็น expansion board ประกบเข้ากับ Micro Python board ให้มีความสามารถของการแสดงผล  LCD และ ภาคเสียง

ผ่านไปเจ็ดวัน ของก็อยู่ในมือ ส่งตรงจาก Cambridge UK โดยจ่าหน้าซองด้วยลายมือคนออกแบบเองเลย Damien George

หลังจากต่อสาย USB แล้วลองเล่นไปได้ สิบห้านาทีก็หลงรัก บอร์ด นี้เข้าจับใจ ความจริงตัวบอร์ดก็น่ารักดีครับ แต่ที่น่าสนใจกว่าตัวบอร์ดคือ การนำเอา Python มา compile เข้ากับ ARM Cortex-M ทำให้สามารถเขียน Python ได้ทันที่เมื่อเปิดเครื่อง เหมือนกับ ใช้ Apple Soft Basic เลย

เรื่อง MicroPython บอร์ดนี่คุยกันสามหน้าเจ็ดหน้าคงไม่จบ ไว้ค่อยว่ากัน ประเด็นบทความนี้อยู่ที่ Spec CPU ARM Cortex-M4 ตัวนี้คือตัวเดียวกับ development board STM32F4 ซึ่งผมก็มีอยู่บอร์ดนึง อีกทั้ง MicroPython ก็เป็น opensource project เลยเข้าไปดูใน source tree พบว่า นอกจาก George จะได้สร้าง build script (folder) สำหรับ Windows, Unix (สามารถ build และเขียน micro python บน Winodws, Linux และ OSX ได้) ยังสร้างสำหรับ stmhal (STM Hardware Abstraction Layer) ก็แน่นอน เพราะ MicroPython boad สนับสนุน CPU STM นี่นะ

อีกอย่าง ราคา MicroPython Board อยู่ที่ 29 ปอนด์ หรือประมาณ 1,500 บาท ในขณะที่ STM32F4-Disc อยู่ที่ 700 บาท (รุ่นไม่มีจอ touch screen)

เลยเกิดแรงบันดาลใจให้ลอง build micropython มาใช้บน STM32F4-Discovery ของตัวเองบ้าง โดยผมเริ่มจาก

เตรียม ARM Cross-Compiler
ผม build และทำงานต่อไปนี้ทั้งหมดบน UbuntuGnome 14.04 LTS นะครับ โดยติดตั้ง ARM cross-compiler ดังนี้

$ sudo apt-get install gcc-arm-none-eabi

จากนั้น clone micropython

$ git clone https://github.com/micropython/micropython.git

cd เข้าไปใน micropython/stmhal และเริ่ม build

$ make BOARD=STM32F4DISC

เครื่องที่ติดตั้ง UbuntuGnome ของผมเป็น Macbook white 2008 ใช้เวลา compile นาทีเดียวเองครับ :)

จากนั้นเราจะได้ file firmware.elf ใน folder stm/build-STM32F4DISC

ง่ายมาก แต่จะ download firmware.elf ยังไงล่ะ!!!

เตียมเครื่องมือสำหรับการ download firmware
สิ่งแรกที่ต้องการเลยคือ GDB สำหรับ ARM ให้ติดตั้ง package ดามนี้

$ sudo apt-get install -d gdb-arm-none-eabi

เครื่องผมมี gdb ติดตั้งอยู่แล้วเลยโดน reject ต้อง force install ด้วย

$ sudo dpkg -i --force-overwrite /var/cache/apt/archives/gdb-arm-none-eabi_7.6.50.20131218-0ubuntu1+1_amd64.deb

จากนั้นต้องใช้ tools สำหรับ upload เข้า STM board ผมใช้ project ใน github ชื่อ stlink clone มาแล้ว จัดการ build ได้เลยครับ

$ ./autogen.sh
$ ./configure
$ make
$ sudo make install

ส่วนเครื่องผมไม่ได้ลง autoreconf เลยต้องติดตั้ง

$ sudo apt-get install dh-autoreconf

พอตอนทำ configure พบว่าไม่มี libusb ก็ต้องติดตั้ง

$ sudo apt-get install libusb-1.0.0-dev

น่าจะครบกระบวนความในการ  compile stlink

มา download firmware กัน...
เชื่อมต่อบอร์ด STM32F4-Discovery ผ่าน USB (เป็นสาย Mini-B นะครับ อย่าต่อ OTG บน board STM32 จะมี USB สอง port หัวท้าย) เรียก

$ st-link

โปรแกรมจะรอ connection จาก GDB ให้เราเข้าไปที่ micropython/stmhal จากนั้น เปิด terminal ใหม่ขึ้นมาอีกหนึ่งจอ แล้วเรียก

$ arm-none-eabi-gdb build-STM32F4DISC/firmware.elf

พอเข้า CLI ของ GDB ก็ให้กำหนด target ตามนี้ครับ

(gdb) target extended localhost:4242

แล้ว สร้าง flash firmware ด้วย

(gdb) load

LED จะกระพริบอย่างสวยงามในระหว่างที่ firmware กำลัง flash เมื่อ LED ดับ ก็ terminate GDB แล้วดึงสาย USB ออกจากนั้นต่อสาย USB เข้าเครื่องใหม่ เราจะเห็น boot.py และ main.py แล้ว

เราสามารถ interactive กับ board ได้ด้วย REPL เหมือน Apple soft BASIC ด้วยวิธีดังนี้ครับ

$ sudo screen /dev/ttyACM0 

หลังจากต่อสาย USB แล้ว

เราจะพบว่า Micro Controller ไม่ใช่เรื่องยากอีกต่อไป ตอนผมได้ STM32F4-Disc มาครั้งแรก แล้วควานหา IDE หา compiler มาเขียนงานเล็กๆ ง่ายๆ นี่มันช่างวุ่นวาย ยุ่งยากเหมือลเกิน (ตอนหลังมาใช้ EWARM) แถมต้องจบที่ Assembly กับ C เท่านั้นอีก

MicroPython ก็แล้ว หรือเราจะลอง MicroLUA กันมั่งดีแมะ :p

ชอให้สนุกกับ micopython ครับ