MicroPython adalah implementasi bahasa pemrograman Python untuk mikrokontroler yang memungkinkan pemirsa bahasa ini menggunakan sintaksis yang dikenal dan prinsip pemrograman untuk bekerja dengan perangkat komputasi kecil.
Dalam pekerjaan saya, saya menggunakan MicroPython untuk membuat prototipe, dengan cepat menguji ide dan membuat tegakan kecil. Berkat REPL dan sintaksis yang sederhana, MicroPython juga bagus untuk proyek DIY dan untuk pengajaran pemrograman.
Ketika datang ke interaksi komputer dengan dunia nyata, saya selalu tertarik pada kecepatan interaksi mereka. Dalam beberapa kasus, penggunaan teknologi mikroprosesor, misalnya dalam bidang Internet hal, kecepatan reaksi perangkat tidak begitu penting. Tidak ada banyak perbedaan ketika sirene alarm menyala: 10 mikrodetik setelah deteksi gerakan atau 10 milidetik.
Tetapi dalam beberapa aspek, kecepatan dan waktu reaksi adalah penting dan muncul pertanyaan apakah MicroPython harus digunakan. Jadi saya melakukan sedikit riset, yang terinspirasi oleh
video dari pidato pencipta MicroPython Damien George. Saya bertanya-tanya seberapa cepat sebuah program yang ditulis dengan Micropython akan merespons dampak input.
Perangkat eksperimental akan menjadi mikrokontroler ESP8266, pada papan NodeMcu dengan versi MicroPython esp8266-2018511-v1.9.4 di papan tulis.

Saya akan menekan tombol dan mendaftar pada osiloskop perbedaan waktu antara menekan dan penampilan 3,3 V di kaki lain dari mikroprosesor. Setiap pengukuran dilakukan 15 kali, rata-rata diambil (diilustrasikan dalam grafik) dan standar deviasi dihitung (bilah hitam dalam grafik).
Tes nomor 1.
Jika Anda memecahkan masalah ini "langsung", maka program ini terlihat sangat sepele:
import machine import time o = machine.Pin(5, machine.Pin.OUT)
Bentuk gelombang khas dengan program seperti ini terlihat seperti ini:

Di sini dan di bentuk gelombang lain, sinyal "biru" adalah pin dengan tombol, pin respons "hijau". Dengan 15 pengulangan, gambar berikut diperoleh:

Rata-rata, waktu reaksi adalah sekitar 310 mikrodetik, maksimum adalah 356 μs, tidak terlalu cepat, tetapi untuk beberapa aplikasi itu cukup dapat diterima.
Nomor tes 2
Anda dapat mempercepat kode standar "out of the box" melalui penanganan interupsi.
import machine import time o = machine.Pin(5, machine.Pin.OUT)
Dan gambarnya adalah sebagai berikut:


dan waktu respons maksimum adalah 306 μs.
Menggunakan interupsi memberikan peningkatan kecepatan sekitar 20%, tetapi pada saat yang sama memberikan penyebaran yang agak besar dalam waktu respons.
Tes nomor 3
Jika kecepatan yang diperoleh tidak cukup, maka langkah selanjutnya adalah menggunakan konstruksi @ micropython.native, yang memungkinkan untuk mengubah kode Python menjadi kode mesin asli. Tetapi ada beberapa
batasan .
Opsi Kode:
import machine import time o = machine.Pin(5, machine.Pin.OUT)
Pola respons khas pada gelombang:

Dibandingkan dengan metode sebelumnya, akselerasi hampir dua kali lipat:

Waktu respons terlama adalah 128 μs.
Nomor tes 4
Langkah selanjutnya dalam mencari MicroPython “cepat” adalah menggunakan konstruk @ micropython.viper dan mengakses register mikroprosesor secara langsung (alamat register dapat ditemukan di
sini .
import time @micropython.viper def f(): O = ptr32(0x60000300)
Dan sebagai hasilnya, responsnya terasa dipercepat:

Waktu respons sangat kecil dan tidak dapat dibandingkan dengan metode lain (maksimum 820 ns):


Jika ini tidak cukup, maka Anda dapat menggunakan sisipan assembler melalui dekorator @ micropython.asm_thumb. Dengan metode ini, python tidak memiliki banyak yang tersisa (dan keuntungan tingkat tinggi dari Python hilang), dan jika kecepatan yang lebih tinggi diperlukan, lebih baik menggunakan perangkat keras lain, misalnya FPGA (di mana Python juga dapat bermanfaat, lihat di
sini dan di
sini ).
UART
Jika ada kebutuhan untuk mengirimkan banyak informasi setelah beberapa peristiwa, Anda dapat menggunakan antarmuka serial UART.
Ambil contoh dua opsi implementasi.
Yang pertama adalah melalui penanganan interupsi:
import machine i = machine.Pin(4, machine.Pin.IN)
Dan gelombang respons:

Waktu respons maksimum adalah 248 μs.
Dan tes kedua melalui viper:
import machine import time i = machine.Pin(4, machine.Pin.IN)
Dan bentuk gelombang pada tes kedua:

Waktu respons maksimum dengan kode ini adalah 71 μs.
Waktu reaksi rata-rata dalam dua tes:

Percepatan reaksi dicapai karena deteksi efek input yang lebih cepat pada tes kedua.
Kesimpulan
MicroPython memungkinkan Anda untuk menggunakan hal-hal yang merupakan karakteristik bahasa tingkat tinggi (OOP, penanganan pengecualian, daftar dan diksi comprahansions, dll.) Saat memprogram mikrokontroler, dan, jika perlu, secara signifikan mempercepat kode Python "klasik".