December 5, 2021

Blogna Kang U-2 Man

STM32, Embedded System, Microcontroller, ARM Cortex-M, RTOS, FreeRTOS

Machine Learning di Mikrokontroler Bagian 2: STM32Cube.AI Hello World

8 min read

بِسْمِ اللَّهِ الرَّحْمَنِ الرَّحِيم

Pada awalnya bingung apa contoh “Hello World” untuk aplikasi AI? Maklum setiap belajar pemrograman selalu dimulai dengan “Hello World”. Kalau di mikrokontroler biasa di mulai dengan “Blink”. Kemudian ketika membaca tentang TensorFlow Lite untuk mikrokontroler ternyata ada contoh program dengan judul “Hello World” yang menunjukan bagaimana TensorFlow Lite berjalan di beberapa board seperti Arduino, ESP32 bahkan di STM32 (menggunakan board STM32F746 Discovery). Contoh program tersebut menjalankan model sinewave dan menampilkannya ke LED (dengan sinyal PWM) atau ke LCD.

Dan ketika melihat-lihat youtube tentang TinyML, ada video yang menunjukan board dari Adafruit juga menjakankan TensorFlow Lite. Terinspirasi kedua contoh di atas, akhirnya diputuskan untuk membuat contoh program yang sama, yaitu menjalankan model sine-wave di STM32, saya akan menggunakan board STM32F429 Discovery di contoh program kali ini dan contoh-contoh AI yang nanti Insya Allah akan dibuat.

TENTANG BOARD 32F429IDISCOVERY

Board F429IDiscovery

Board 32F429IDiscovery merupakan development board yang dibuat oleh ST Microelectronics. Sesuai dengan namanya, board ini menggunakan mikrokontroler STM32F429ZIT6 yang menggunakan core ARM Cortex-M4. STM32F429ZI mempunyai memori flash 2 Mbyte dengan RAM 256 Kbyte (SRAM 192 KB dan CCMRAM 64 KB) dengan package LQFP144 pin. Mikrokontroler di board ini bisa dijalankan sampai dengan 180 MHz (board ini dipasang kristal 8 MHz).

Sesuai dengan jenisnya, board discover tidak mengeluarkan semua fitur yang dimiliki oleh mikrokontroler yang dipasang. Untuk IO, board ini hanya mempunyai LED dan push-button. Selain itu board ini dilengkapi dengan sensor giroskop 3-sumbu L3GD20. Sebuah konektor USB OTG (USB micro) terhubung ke fitur USB STM32F429, sehingga board ini bisa digunakan sebagai USB host atau USB device. LCD dengan resolusi 240×320 dengan ukuran 2.4 inch memungkinkan board ini cocok untuk digunakan dalam aplikasi AI yang akan kita bahas, ditambah dengan SD RAM eksternal sebesar 64 Mbit.

Dan tentu saja, ST Link sudah termasuk dalam board discovery ini, sehingga memudahkan untuk mendownload dan debugging program melalui IDE.

SOFTWARE PACKAGE X-CUBE AI

Dalam proyek ini, untuk pembuatan programnya digunakan STM32CubeIDE, jika diinginkan menggunakan IDE yang lain, misal Keil, IAR, True Studio, maka bisa digunakan STM32CubeMX. Langkah-langkah pembuatan proyeknya sama dengan langkah pembuatan proyek di tutorial ini, tetapi di STM32CubeMX pilih IDE dengan IDE yang digunakan. Lalu tinggal copy saja source code dari proyek ini ke proyek yang dibuat dengan IDE tersebut.

Sebelum membuat proyek, pastikan terlebih dahulu bahwa software package untuk AI sudah terinstal. Dari STM32CubeIDE, menu klik Help/Manage Embedded Software Package, dan pastikan X-CUBE AI (Artificial Intelligence) telah terinstal. Pada saat tutorial ini ditulis, versi STM32Cube.AI adalah versi 5.0.0. Jika belum terinstal maka pilih versi terakhir lalu klik tombol Install Now. Pastikan komputer terhubung dengan internet. Jika digunakan STM32CubeMX, pastikan bahwa versinya adalah versi 5.0.1 atau lebih.

Embedded Software Package

Pastikan juga software package untuk STM32F4 telah terinstal. Cek dengan cara yang sama dengan cara di atas.

STM32F4 Software Package

PEMBUATAN PROYEK APLIKASI AI DENGAN STM32CUBEMX

Langkah-langkah pembuatan proyek aplikasi AI menggunakan STM32CubeMX bisa dilihat dari video berikut.

Dalam pembuatan aplikasi AI menggunakan STM32CubeMX, perlu memperhatikan hal-hal berikut:

  1. STM32Cube.AI hanya bisa digunakan untuk keluarga STM32 dengan core ARM Cortex-M4 (seperti STM32F4, STM32F3 dan STM32L4), ARM Cortex-M7 (STM32F7 dan STM32H7) dan ARM Cortex-M33 (STM32L5).
  2. Aplikasi AI membutuhkan dataset (data training). STM32Cube AI mendukung data set dari berbagai platform machine learning yang banyak digunakan, yaitu Keras, TensorFlow Lite, Lassagne, Caffe, ONNX dan ConvNetJS. Dalam proyek kali ini akan digunakan dataset dengan tipe TensorFlow Lite dan model yang digunakan dalam proyek ini bisa di-download di sini.
  3. Dataset perlu di-analisa (Analyze) dan di validasi (Validation) untuk meyakinkan bahwa model tersebut bisa dijalankan di mikrokontroler dan memori mikrokontroler (flash dan SRAM) cukup untuk menjalankan model tersebut.
  4. Mikrokontroler bisa menjalankan beberapa model sekaligus, asalkan memori mikrokontroler cukup untuk menyimpan model-model tersebut.

Proses Analisa

Proses Analisa

Di proses analisa ini, STM32 AI Tool akan menganalisa model yang diberikan, mengecek apakah model yang diberikan merupakan model yang valid atau tidak. Jika model tersebut valid maka AI Tool kemudian akan mengecek apakah model tersebut cukup untuk disimpan di memori mikrokontroler yang dipakai atau tidak. Ada 2 memori yang diperlukan, pertama adalah memori flash yang digunakan untuk menyimpan model yang digunakan. AI Tool akan mengubah model tersebut menjadi sebuah tabel data berbentuk array dalam bahasa C. Array tersebut akan ditempatkan di memori flash. Memori kedua adalah RAM yang digunakan untuk Activation buffer. Buffer ini akan digunakan oleh library AI STM32, misalkan untuk transfer data dari layer 1 ke layer yang lain.

Hasil Analisa

Apabila hasil analisa menunjukan bahwa memori tidak cukup, maka bisa digunakan fungsi kompresi, saat ini ada 2 pilihan, di-kompres 4 atau 8 kali. Dalam tutorial kali ini, tidak dilakukan kompresi, karena ukuran model yang digunakan cukup kecil. Hasil analisa menunjukan memori yang diperlukan flash 1.28 KB dan RAM 128 byte. Jika setelah kompresi ukuran memori masih belum cukup, maka bisa digunakan memori eksternal (Flash maupun RAM), dengan meng-klik icon gear.

Memori EKseternal

Tentu saja untuk menggunakan memori eksternal, diperlukan juga memori eksternal terpasang di board yang digunakan. Untuk STM32 mendukung NAND dan NOR Flash, dan untuk RAM mendukung SRAM dan SD RAM. Memori flash QSPI juga bisa digunakan. Dan pastinya diperlukan program driver untuk mengaksesnya.

Cara lain agar model tetap bisa cukup di memori STM32 adalah dengan membuat model yang digunakan lebih kecil. Terus terang, sampai saat ini saya belum mencoba untuk membuat model atau dataset sendiri. Model-model yang digunakan di tutorial web ini berasal dari internet.

Selain ukuran memori, hasil dari proses analisa adalam MACC (Multiply and Accumulate Complexity) yang menunjukan kekomplekan dari model yang dianalisa. Nilai MACC ini nantinya akan menentukan berapa siklus yang dibutuhkan oleh CPU untuk menjalankan model AI tersebut. Tidak ada teori yang pasti untuk menentukan berapa siklus yang diperlukan oleh CPU untuk menjalankan, karena akan ditentukan oleh tool-chain/compiler yang digunakan, topologi NN, memori dan optimasi yang digunakan. Proses validasi di target bisa menunjukan berapa estimasi siklus CPU yang dibutuhkan.

CPU Cycles/MACC

Prose Validasi

Proses Validasi

Proses selanjutnya setelah analisa adalah validasi. Proses validasi ini akan membandingkan antara model original yang diimpor ke proyek dengan model yang sudah diubah ke dalam bahasa C. Kedua model diberi masukan (Validation Input) yang sama, yang bisa dipilih antara nilai acak (Random Numbers) atau berasal dari file (format csv). Error relatif L2 kemudian dihitung, L2 di bawah 0.01 proses validasi dianggap sudah OK.

Ada 2 cara validasi, yaitu validasi di desktop dan validasi di board target. Validasi di desktop dilakukan melalui STM32CubeMX (AI Tool) dengan meng-compile model yang dibuat dengan core x86 (arsitektur PC) sedangkan validasi di target yaitu validasi langsung dilakukan di borad target. Untuk bisa validasi di target, maka board target harus terhubung dengan debugger (untuk download program), misal ST Link dan harus disediakan komunikasi serial antara PC dengan board target, misal dalam proyek ini digunakan USART1. STM32CubeMX kemudian akan membuat proyek sementara (dummy) sesuai dengan IDE yang dipilih, misal STM32CubeIDE, kemudian akan meng-compile proyek tersebut, proyek diisi dengan aplikasi validasi AI, kemudian men-download file hasil kompilasi ke memori flash board target melalui ST Link. Proses validasi kemudian dilakukan melalui komunikasi serial antara PC dengan board target.

Error Hasil Validasi

Hasil validasi dari proyek ini, baik validasi melalui desktop atau langsung ke target, di bawah 0.01, sehingga model dianggap OK.

PROGRAM STM32CUBE.AI HELLO WORLD

Struktur Program STM32Cube.AI

Ketika STM32CubeMX meng-generate proyek dengan aplikasi AI, maka STM32CubeMX akan meng-copy middle-ware STM32Cube.AI dan aplikasi X-CUBE-AI.

Middle-ware STM32Cube.AI

Seperti telah dijelaskan bahwa ST mendistribusikan algoritma AInya dalam bentuk library yang sudah di-kompilasi, bukan dalam bentuk source code. ST hanya menyediakan file-file header untuk mengakses API yang ada di library tersebut. Karena di proyek ini digunakan compiler ARM GCC, maka library yang di-include juga merupakan library untuk ARM GCC.

Struktur APlikasi AI

Folder X-CUBE-AI berisi file-file yang dihasilkan oleh AI Tool. File network_data.c berisi tabel data dari model yang sudah diubah ke array data 8 bit. File app_x-cube-ai.c berisi dfungsi inisialsasi AI dan menjalankan fungsi AI. Kita bisa membuat aplikasi AI di file ini, walaupun sih sebenarnya bukan sebuah keharusan.

Program Hello World

Program Hello World ini menggunakan LCD, sehingga diperlukan program driver LCD yang ada di board discovery yang digunakan. Untuk driver ini, saya menggunakan driver dari contoh-contoh program F429Discovery (BSP, Board Support Package) bawaan STM32Cube. STM32CubeMX tidak secara otomatis menambahkan file-file BSP, sehingga harus ditambahkan secara manual. BSP di copy ke folder Drivers/BSP. Selain folder BSP diperlukan file fonts yang diperlukan untuk menampilkan tulisan di LCD. Jangan lupa mengatur path agar compiler bisa meng-compile source code yang ditambahkan.

Setting Path

Oleh karena kita menggunakan fungsi-fungsi dari BSP, maka fungsi-fungsi inisialisasi LCD (LTDC) dan RAM eksternal RAM yang dihasilkan oleh STM32CubeMX kita matikan. Selanjutanya kita buat fungsi LCD_Config() untuk memanggil fungsi inisialisasi dari BSP.

Di program utama (main loop) akan memanggil fungsi aplikasi AI (MX_X_CUBE_AI_Process), tentu saja proses inisialisasi AI harus dipanggil terlebih dahulu (MX_X_CUBE_AI_Init).

Proses AI

Di STM32Cube.AI, AI dijalankan dengan memanggil fungsi aiRun(), fungsi ini membutuhkan parameter in_data dan out_data. Variabel in_data menunjuk ke pointer dari input yang akan diberikan ke Network AI, sedangkan out_data merupakan proses dari Network AI. Variabel in_data dan out_data selalu berbentuk data array 8 bit. Ukuran array ditentukan dari model yang digunakan. Sebagai contoh, dalam model di tutorial ini, input dan output AI nya adalah bilangan floating 32 bit, sehingga ukuran dari in_data dan out_data adalah 4 byte.

Nilai input untuk jaringan AI ini berasal dari nilai x_val, yang berasal dari nilai postiin. Nilai positiin sendiri berasal dari pembagian nilai inference_count dengan kInferencesperCycle. Nilai inference_count kemudian akan di-increament secara terus-menerus dan ketika sampai dengan nilai kInferencePerCycle akan kembali ke 0.

Jaringan AI kemudian akan memprediksi sesuai nilai masukannya. Jika AI berjalan dengan baik, maka nilai prediksinya akan merupan fungsi sinus dari nilai masukan. Hasil prediksi ini kemudian digambarsebagai lingkaran ke LCD sebagai nilai koordinat y (masukan menjadi koordinat x) dengan fungsi BSP_LCD_FillCircle().

Untuk mengubah nilai floating ke array 8 bit digunakan fungsi berikut

Sedangkan untuk mengubah array 4 byte menjadi bilangan floating 32 bit digunakan fungsi berikut:

Setelah di-compile dan di-download ke board discover, hasil aplikasi AInya bisa dilihat dari video berikut.

Sedangkan source code dari proyek ini bisa di-download di sini.

Semoga bermanfaat.

Visits: 5 Visits: 97942

2 thoughts on “Machine Learning di Mikrokontroler Bagian 2: STM32Cube.AI Hello World

    1. Terimakasih telah mampir.
      Nantikan artikel berikutnya, Insya Allah akan ada yang lebih menarik lagi…

Leave a Reply

Your email address will not be published. Required fields are marked *

Copyright © All rights reserved. | Newsphere by AF themes.