🚀

メモ帳だけで開発できる!CircuitPythonでもっとお手軽にマイコンを触ろう

に公開

みんな、こんにちは!ArduinoやM5Stack、ラズパイなど色々なマイコンがあるけど、これらのマイコン用のプログラムを作ろうと思ったら、ArduinoやPlatformIOのような開発環境をインストールしないといけないと思っているよね?でも、マイコンをこれから始めようと思っているみんなにとって、環境構築も一つのハードルに感じることもあるんじゃないかな?そこで、今回は開発環境不要のCircuitPythonの使い方を紹介するよ!

CircuitPythonって?

CircuitPythonはMicroPythonから派生したマイコン向けの開発環境で、Adafruitさんが開発を支援しているよ。だから、Adafruit製品の多くがサポートされているんだけど、他社製マイコンモジュールもサポートされているよ。Pythonって名前が入っている通り、Pythonを使ってプログラムを作成することができるよ。一番の特徴はArduinoのような開発環境が不要で作成したプログラムをとっても簡単にマイコンで動かすことができるところ。CircuitPythonが動いているマイコンはPC上で外付けドライブとして認識されて、そこにあるファイルを編集するだけでオッケー!ビルドや書き込みも不要だよ。とっても簡単でしょ?

この記事はこんな人にオススメ

  • マイコンを始めたいけど開発環境構築難しそう…
  • 教育、ハンズオンでマイコンを使いたい
  • 手っ取り早く動作確認したい

何ができるの?

CircuitPythonを使うと、ArduinoやPlatformIOのような開発環境がなくてもマイコンを制御するためのプログラムを作って簡単に書き込んで実行することができるよ。あと、PythonだからC++よりも比較的理解しやすいというのもあるね。プログラミングやマイコンをこれから始めるというみんなにとって、ハードルを下げることができるよ。

ここではXIAO RP2350を使って、CircuitPythonを導入してXIAOに搭載されたLEDでLチカするまでの方法を説明しているよ。

一方でCircuitPythonが万能ってわけでもなくて、プログラムの実行速度やライブラリの多さでは、Arduino環境(C++)に敵わないと思うから、適材適所で使ってみてね。ただ、これからマイコンを始めようかなってみんなにとっては十分だと思うから、まずはCircuitPythonでマイコンの扱い方を勉強して、その次のステップでArduinoという進み方も良いよね。

環境

  • UF2 Bootloader導入済みのマイコン(XIAO RP2040/2350, RaspberryPi Picoなど)
  • PC (Win/Macどちらでも)

UF2って聞いたことが無いかもしれないけど、マイコンへのプログラム書き込みを簡単にしてくれる仕組みで、マイコンをPCへ接続するとマイコンがドライブとして認識されて、そこへプログラムをコピペするだけで書き込みができるよ。RP2040やRP2350を搭載したマイコンモジュールはUF2 Bootloaderが最初から書き込まれていることが多いよ。


UF2 Bootloaderが書き込まれたマイコンはBootモードでPCに接続するとこのようなドライブが出てくるよ。これはRP2350を接続した例で、RP2040だとRPI-RP2というドライブが表示されるはずだよ。

このドライブに.uf2という形式のプログラムをコピペすると自動的にマイコンのフラッシュにプログラムを書き込んでくれるよ。とっても便利だね!

CircuitPythonの導入

CircuitPythonの導入はとっても簡単!以下の手順で、マイコンにCircuitPythonを導入するよ。

  1. CircuitPythonのサイトからマイコンに合ったUF2ファイルを入手
  2. マイコンをBootモードにする
  3. PC上で認識されたドライブにUF2をコピーする

もう少し詳細な手順を説明するよ。
1. CircuitPythonのサイトからマイコンに合ったUF2ファイルを入手
CircuitPythonのサイトにアクセスして、Downloadsを開いてね。
https://circuitpython.org/

検索のボックスがあると思うから、お手元のマイコンモジュールの名前を入れてね。ボクの場合は"XIAO RP2350"と入力したよ。

お目当てのマイコンが見つかったら、マイコンを選択して表示されたページで"DOWNLOAD .UF2 NOW"からCircuitPythonのUF2をダウンロードしてね。

2. マイコンをBootモードにする
CircuitPythonのUF2をマイコンに書き込むには、マイコンをBootモードにする必要があるよ。通常、マイコンは電源Onになるとブートローダーが実行されて、そのままプログラムを読み込みに行くんだけど、プログラムを読み込まずにプログラムを書き込むためのモードにする必要があるよ。全てのマイコンにBootモードがあるわけではないけど、今回使っているRP2040/2350ではプログラムを書き込むためのBootモードというものが存在しているよ。

Bootモードへの入り方はマイコンモジュールごとに違っていたりするから、マイコンの説明を見てね。XIAOとRaspberryPi Picoは以下の通りだよ。

XIAO RP2040/2350
Bボタンを押しならがRボタンでリセットする。

RaspberryPi Pico
BOOTSELボタンを押しながらUSBケーブルをPCと接続する。

3. PC上で認識されたドライブにUF2をコピーする
正しくBootモードに入っていると、以下のようなドライブがPC上で認識されるよ(RP2040だとRPI-RP2)。もし、表示されていなければ、もう一度Bootモードに入る手順を試してみてね。

ドライブが表示されている場合は、CircuitPythonからダウンロードしたUF2ファイルをドライブへコピペしてね。UF2ファイルの書き込みが完了するとマイコンは自動的にリブートするよ。

マイコンが自動的にリブートすると、PC上にCIRCUITPYというドライブが表示されていれば成功!これでCircuitPythonを使う準備が完了したよ。簡単だよね?

最初のプログラム

CIRCUITPYというドライブを表示するところまではOKかな?いよいよCircuitPythonの最初のプログラムを書き込むよ。書き込むというよりも、ドライブ上のファイルを直接編集するんだけど。

CIRCUITPYドライブを開くとcode.pyというPythonのコードがあるから、これをお好きなエディタで開いてね。メモ帳でもテキストエディットでもなんでも良いよ。エディタでファイルが開けたら以下のプログラムをコピペして保存してね。

import board  # マイコンのピンを扱うためのモジュール
import digitalio  # デジタル入出力制御用のモジュール
import time  # 時間制御用のモジュール

print("Hello World!!!")  # 起動時にメッセージを表示
led = digitalio.DigitalInOut(board.LED)  # LEDピンを設定
led.direction = digitalio.Direction.OUTPUT  # LEDを出力モードに設定

while True:
    led.value = False  # LED点灯
    time.sleep(0.5)  # 0.5秒待つ
    led.value = True  # LED消灯
    time.sleep(0.5)  # 0.5秒待つ

プログラムを保存するとXIAO上のLEDが緑とか赤でチカチカした後にLEDが点滅し始めるとLチカ成功だね!CircuitPythonのサイトではMuエディタというのがオススメされているから、もしよかったら使ってみてね。

https://codewith.mu/

REPL

REPLっていうのは対話モードで1行ずつプログラムを実行することができるモードだよ。PC上のPythonでもPython単体で実行するとREPLになるよね。CircuitPythonのもう1つの特徴はこのREPLで1行ずつプログラムを実行できるところだね。Arduinoでは少しでもプログラムを変えたらビルドが必要だけど、CircuitPythonではビルド無しで、この関数を呼ぶとどんな動作するんだろ?っていうのを簡単に試すことができるよ。

REPLに入るには、PCからシリアルでマイコンに接続するよ。CircuitPythonのサイトで紹介されているMuエディタを使うと簡単に接続できるから試してみてね。もちろん別のターミナルソフトでもOKだよ。Muエディタの場合は上のメニューからシリアルボタンを押すと接続されるよ。

接続しても何も表示されないと思うけど、その状態でCtrl+Cを入力してね。すると日本語版のCircuitPythonだと「REPLに入るため、エンターキーを押す。リーロードするため、Ctl-Dを入力する。」と表示されるから、Enterキーを押してね。(英語だとpress any keyなのでどんなキーでも良いと思うよ)

以下のように>>>とプロンプトが表示されるとREPLになっているよ。

例えば、さっき使ったコードを1行ずつ入力してみると、led.value = False/TrueでLEDを点灯させたり消灯させたりできるよ。

>>> import board
>>> import digitalio
>>> led = digitalio.DigitalInOut(board.D0)
>>> led.direction = digitalio.Direction.OUTPUT
>>> led.value = False
>>> led.value = True

こんな感じで、REPLを使うことで、ちょっと試したい時にビルドすることなく簡単にプログラムを実行することができるよ。便利だね!

まとめ

XIAO RP2350にCircuitPythonを導入してXIAO上のLEDをLチカするまでの方法を説明したよ。また、REPLっていうPythonならではの対話モードも少し説明したよ。マイコンで何か作るっていうとちょっとハードル高く感じてしまうかもしれないけど、今はメモ帳1つでマイコンのプログラムを作成できることが分かってもらえたかな?

今回はLチカだけだったけど、CircuitPythonを使うとこで、ボタンやセンサーから値を読み取って何かしたり、モーターを制御したりなど、Arduinoでできるようなことは同じようにできるよ。

CircuitPythonはArduinoと完全に同じことができるかと言われると、そうではないけど、これからマイコンで何か作りたいみんなにとっては、ハードルが低いところからマイコンに慣れてみるのも1つの方法じゃないかな。マイコンを動かすための基本的な機能はCircuitPythonにも備わっているから、CircuitPythonを最初のステップにして、ちょっと物足りなくなってきたらArduinoに進んでみるのはどうかな?

みんなが作ったものはぜひXとかでシェアして教えてね。じゃあ、またね!

Discussion