第3章 RPシリーズポートについて
今回は第3章の途中まで(たぶん PIO の前あたりまで)。
3.1 Timer
いきなり難しいところからきたなぁという感じ。Lチカを Timer 機能を使って実現する方法について記載している。
Timer は主に特定の処理を定期的に呼び出すときに使う。要するにタイマー割り込み。CircuitPython が嫌う割り込みのAPIですな。
from machine import Pin, Timer
led = Pin("LED", Pin.OUT)
tim = Timer()
def tick(timer):
global led
led.toggle()
tim.init(freq=2.5, mode=Timer.PERIODIC, callback=tick)
tim.init()
により、2.5Hz でtick()関数を繰り返し呼び出すようになる。この呼び出しはタイマー割込みで行われるので、並行して別の処理を動かすことができる。
この程度の処理では問題ないが、MicroPython の割り込み処理には注意しなければならないことがある。こちらを参照。本ドキュメントには、そのへんの記載がないので注意である。
3.2 UART
UART1からUART0にバイト列を送り込む簡単な例が示されている。
from machine import UART, Pin
import time
uart1 = UART(1, baudrate=9600, tx=Pin(8), rx=Pin(9))
uart0 = UART(0, baudrate=9600, tx=Pin(0), rx=Pin(1))
txData = b'hello world\n\r'
uart1.write(txData)
time.sleep(0.1)
rxData = bytes()
while uart0.any() > 0:
rxData += uart0.read(1)
print(rxData.decode('utf-8'))
3.3 ADC
ADコンバータの使い方について記述している。
ADCクラスのコンストラクター第1引数には、GPIO番号かチャンネル番号を指定できるとあるが、どう区別しているのであろうかと思ったら、単純に 0〜4 をチャンネル番号と見ているらしい。GPIOからADCに使えるのはGP26〜GP29なので、同じ整数値で与えても何を示しているのか判別できる。ただ、API設計としてはあまりよろしくないように思える。
例としては、特にセンサーを外付けしなくても試せる内蔵の温度センサー(チャンネル4)の読み出し方が載っている。
3.4 割込み
一般的な割込みの使い方が載っている。
ここでも指定するコールバックについての注意書きがない。こちらを参照。
3.5 マルチコアのサポート
Pico 用 MicroPython のスクリプトは通常 core0 で動いている。core1 を使うために、なぜかマルチスレッドの API (_thread
)を使うことになっている。
このため、Picoシリーズ用の MicroPython では、core1 の1スレッドでしか _thread を動かせない。GIL がないという利点もあるにはあるのだが。
3.6 I2C
ハードウェア I2C バスの使用例が記載されている。
MicroPython には、この他にソフトウェア I2C バスの API があるが、本ドキュメントには記載なし。ソフトウェア I2C についてはこちらを参照。
3.7 SPI
ハードウェア SPI バスの使用例が記載されている。
MicroPython には、この他にソフトウェア SPI バスの API があるが、本ドキュメントには記載なし。ソフトウェア SPI についてはこちらを参照。
3.8 PWM
Pico の内蔵LEDをPWMを使ってゆっくり明滅しているように見せるデモを載せている。GPIOに直接繋がっていない Pico W ではさずがにこのデモは動かせないので、注意書きがある。Pico W では外部の LED を繋いで試してくれと。
ここまで読んできて、SDK のドキュメントという割には API についてあまり説明されていない。APIは本家のドキュメントを読めということなのか。