3.1. Mikrokontroler

OpenMV Cam berjalan di atas mikrokontroler (MCU): sebuah chip tunggal yang menggabungkan CPU, memori kerja (RAM), penyimpanan program (flash), dan sekumpulan periferal -- blok perangkat keras untuk berinteraksi dengan dunia luar.

Periferal adalah bagian yang menarik. Setiap periferal adalah sepotong silikon yang didedikasikan untuk satu tugas: menggerakkan pin ke tinggi atau rendah, mengukur tegangan analog, mengirim byte melalui bus serial. CPU mengonfigurasi dan membaca setiap periferal melalui register -- alamat memori tetap yang dipantau dan diperbarui oleh perangkat keras.

MicroPython membungkus register-register tersebut dalam kelas-kelas di dalam modul machine. machine.Pin(...) mengembalikan objek yang mengontrol pin input/output serba guna (GPIO) -- kabel yang dapat dipegang chip pada kondisi tinggi (sekitar 3,3 V) atau rendah (sekitar 0 V), atau dibaca sebagai salah satu dari dua keadaan tersebut ketika sesuatu dari luar menggerakkannya. machine.ADC(...) mengekspos konverter analog-ke-digital, yang mengukur tegangan pada sebuah pin dan melaporkannya sebagai angka. machine.UART(...) menjalankan universal asynchronous receiver/transmitter (UART) -- sebuah periferal yang mengirim dan menerima byte satu bit pada satu waktu melalui sepasang kabel, TX (transmit) dan RX (receive). Kelas-kelas lain mencakup periferal lainnya. Skrip membaca dan menulis objek Python; MicroPython menerjemahkan setiap akses menjadi pembacaan dan penulisan register yang sesuai, dan hal tersebut memindahkan bit pada kabel fisik.

A single chip outline containing labelled blocks -- CPU, RAM, flash, and a row of peripheral blocks (GPIO, ADC, Timer/PWM, UART/SPI/I2C, CAN) connected by an internal bus, with arrows from each peripheral exiting the chip toward physical pin labels.

MCU mengemas CPU, memori, dan periferal dalam satu chip. Setiap periferal diekspos ke Python melalui sebuah kelas dalam modul machine.

3.1.1. Loop utama

Hampir setiap program mikrokontroler memiliki bentuk yang sama: pengaturan satu kali di bagian atas skrip (impor modul, konfigurasi pin, buka bus), kemudian loop while True: tanpa henti di bagian bawah. Di dalam loop, program membaca input, membuat keputusan, dan memperbarui output berulang kali. Loop adalah programnya; ketika skrip keluar, perangkat berhenti melakukan apa pun.

# setup, runs once
from machine import Pin
led = Pin("P0", Pin.OUT)

# main loop, runs forever
while True:
    led.value(1)
    # ... do work ...
    led.value(0)
    # ... do other work ...

Bentuk ini -- atur sekali, lalu loop selamanya -- adalah pola loop utama. Semua yang mengikuti adalah tentang apa yang ada di dalamnya.

3.1.2. Kontrol waktu nyata

Program desktop berjalan bersama banyak program lainnya. Sistem operasi menjadwalkan kerjanya di satu atau lebih thread -- aliran eksekusi independen yang bergantian setiap milidetik. Ketika satu thread menunggu I/O (disk, jaringan, pengguna menggerakkan mouse), OS menyerahkan CPU ke thread lain. Program sebagian besar digerakkan oleh event: manajer jendela memanggil kode Anda saat input tiba, pustaka HTTP melanjutkan kode Anda saat byte tiba di soket. Ada sesuatu yang lebih besar yang memanggil Anda.

Program mikrokontroler adalah kebalikannya. Secara default tidak ada sistem operasi, tidak ada penjadwal, dan tidak ada thread lain. Loop utama yang baru ditunjukkan adalah loop satu-satunya. Periferal memicu interupsi atau mengekspos flag status; loop melakukan polling terhadapnya atau menangani interupsi secara langsung. Jika loop terhenti dalam time.sleep_ms(1000), perangkat tidak melakukan apa pun selama satu detik tersebut; tidak ada thread lain untuk mengisi kekosongan itu.

Dua konsekuensi muncul dan berlaku di mana-mana:

  • Waktu adalah nyata. Membaca sebuah pin dua kali dalam loop ketat membutuhkan mikrodetik; tidur selama sepuluh milidetik berarti sepuluh milidetik di mana tidak ada hal lain yang terjadi. Pola timing non-blocking adalah responsnya.

  • Perangkat keras adalah nyata. Mengatur machine.Pin.value ke 1 menempatkan sekitar 3,3 V pada kabel fisik; mengaturnya ke 0 menempatkan sekitar 0 V di sana. Bagian lain dari rangkaian segera melihat tegangan tersebut -- termasuk komponen apa pun yang dapat rusak jika pin digerakkan dengan salah.