CircuitPython 10行プログラミング (2) ディジタルI/O

 Trinket M0マイコン・ボードとCircuitPythonを使って、定番のLチカをします。

13番はI/Oピンが出ていない

 Pinoutsのページによると、USBコネクタの横にある赤色のLEDはI/Oの13番からつながっています。ライブラリboardはボード固有のピンを指定します。from board import * ではD13で赤色LEDのポートを指定できます。import boardではboard.D13でポートを指定します。

 ライブラリdigitalioは、I/Oピンをディジタル入出力に使います。

  • DigitalInOut – I/Oピンを指定する
  • Direction – 入力、出力の指定
  • DriveMode – プッシュプル(PUSH_PULL)かオープン・ドレイン(OPEN_DRAIN)かの指定
  • Pull – 入力ピンのプルアップ(UP)かプルダウン(DOWN)の指定

(※)オープン・ドレインでは、HIGHを出力するとハイインピーダンスになる。

 解説のページには、次の事例が掲載されています。D13というピン番号を指定しています。

import digitalio
from board import *
import time

led = digitalio.DigitalInOut(D13)
led.direction = digitalio.Direction.OUTPUT
while True:
led.value = True
time.sleep(0.1)
led.value = False
time.sleep(0.1)

 上記のプログラムをMuに貼り込んで保存すると、USBコネクタの横の赤色LEDが点滅します。

 シルク印刷の0にLEDをつなぎ、上記のプログラムのD13をD0に変更して保存します。LEDが点滅します。23に変更しても同様にLEDが点滅しました。
 DotStar LEDがつながっているD7とD8は点滅しませんでした。

 上記の実験を整理したI/Oポートが次の図です。HIGHは3.3V、LOWは0Vです。各ポートは最大7mA流せます。すべてのポートで割り込みがかけられるようです。アナログのA0やI2C、SPIはまだ実験していません。

PWM出力

 ピン配置図では、ディジタル入出力に使えるD0~D4、D13のうち、D0、D2、D3、D4にはチルダのマークがついています。D1は含まれていません。D1は基板上のシルク印刷では1に~が印刷されていますが、PWM出力に対応していないようです。

 パルスを扱うpulseioモジュールには三つの機能あります。

  • PulseIn – 一連のパルスを読む
  • PulseOut – パルス列の出力。PWM信号のON/OFFに使う
  • PWMOut – PWMの出力

 掲載されているPWM出力のサンプルを動かします。

import pulseio
import time
from board import *

pwm = pulseio.PWMOut(D13)
pwm.duty_cycle = 2 ** 15
time.sleep(0.1)

 クラスpulseio.PWMOutがとりえるパラメータは、次の四つです。

  • pin(Pin) - 出力先のピン
  • duty_cycle(int) - 各パルスのHIGH部分。16ビット
  • frequency(int) - ターゲット周波数(Hz)(32ビット)
  • variable_frequency(ブール値) - 周波数が時間の経過とともに変化する場合はtrue

 ディーティ比2 ** 15は50%に相当します。

 実行すると、ImportError: no module named 'pulseio' と出るので、購入時に入っていたバージョンでは用意されていないようです。執筆時点で最新のCircuitPython 3.1.2をインストールしました。すると、エラーはなくなり、実行できるようになりました。
 time.sleep(0.1)を100に変更して、オシロスコープでLEDの端子(基板の外側)を観測しました。

 pwm = pulseio.PWMOut(D13, frequency=5000) と周波数を5kHzに変更しました。つづけて100kHzまで変更しながら実験しましたが、問題なくPWM出力が得られました。

 1MHzだと少し波形がなまってきました。

 パルス列の出力PulseOutのパラメータはPWMです。間欠PWM出力になると思います。サンプルで使われているarrayのパラメータの単位はusです。

import pulseio
from board import *
import array

pwm = pulseio.PWMOut(D13, duty_cycle=2 ** 15, frequency=1000)
pulse = pulseio.PulseOut(pwm)
pulses = array.array('H', [65000, 10000, 65000, 65000, 10000])
while 1:
pulse.send(pulses)

PWMが使えるI/Oポートの確認

 A0ポート(シルク印刷の1)はチルダ~が印刷されていますが、こちらの説明では、DAC(D-Aコンバータ)の出力なので、PWM出力には使えないと書かれています。使えるI/Oポートは下記の5本です。

  • D0(A2 SDA)
  • D2(A1 SCL MISO)
  • D4(A4 Tx MOSI)
  • D3(A3 Rx SCK)
  • D13(APA102_MOSI APA102_SCK)