[フレッシャーズ特別企画]
初めの一歩!ラズパイPicoマイコン×PythonでLチカ入門

開発環境のセットアップから点灯/消灯制御プログラミングまで

著者:田口 海詩 / 企画:ZEPエンジニアリング /

【PR】「実習キットでできる!ラズパイPicoでマイコン入門」講義ビデオ付きパーツセット

本製品は,ZEPエンジニアリングが企画・主催した全国オンラインセミナ「実習キットでできる!ラズパイPicoでマイコン入門」で使用したパーツセットと,講義の録画(328分),講義テキスト(194頁)、およびお手本Pythonソースコードをセットにした商品です.

詳しくはこちら を参照ください.

購入する

第1章 今こそマイコン入門!2大ツール“Pico”と“Python”

Pythonが使える500円マイコン・ボード“Pico”

動作クロックが高く,メモリ容量が大きい

2021年1月20日,ラズベリーパイ財団が500円のマイコン・ボード「Raspberry Pi Pico」(写真1)をリリースしました.本稿では,Pico(ピコ)と呼びます.

写真1 ラズベリーパイ財団が発表したマイコン・ボード“Raspberry Pi Pico”
搭載されているマイコンは“RP2040”

ラズベリーパイ財団のPico開発スタートページでは,Picoのプログラム開発言語として最初に“Python”を推奨しています.さらに,Python開発環境として,エストニアのTartu(タルトゥ)大学が開発した“Thonny”(トニーまたはソニーと読む)を勧めています(図1).

図1 Pythonプログラミング開発環境“Thonny”

マイコン・ボード Picoの脳ミソ“RP2040”

Picoに搭載されているマイコン“RP2040”の中央には,ラズベリーパイのロゴ・マークが印刷されています(写真2).です.ここで,RP2040マイコンが備える機能を説明しましょう.

図2に示すのは,RP2040マイコンのブロック・ダイヤグラムです.

プロセッサ,メモリ,GPIOなど外部回路との接続用回路(インターフェース),$\mathrm{ I^{2}C}$通信回路などの周辺回路(ペリフェラル)を内蔵しています.

RP2040の仕様を次に示します.

  1. ARM Cortex M0+デュアル・コア
  2. 最大動作周波数 133 MHz
  3. USBを介しマスストレージを使ったドラッグ・アンド・ドロップによるプログラム書き込み可能
  4. SRAM:264Kバイト
  5. フラッシュ・メモリ:2Mバイト
  6. USB 1.1 ホスト/デバイス両対応
  7. 多機能GPIOピン 26チャネル
  8. SPI/$\mathrm{ I^{2}C}$/UART 各2チャネル
  9. A-Dコンバータ(分解能12ビット)
  10. PWMチャネル 16チャネル
  11. 高速な浮動小数点ライブラリを搭載
  12. プログラマブルI/O:8チャネル
写真2 Picoに搭載されているマイコン“RP2040”
ラズベリーパイ財団が設計したデュアル・コアARMマイコン
図2 RP2040のブロック・ダイヤグラム

世界の定番!プログラミング言語“Python”

人間とRP2040内CPUの通訳担当“MicroPython”

従来のC言語を利用したマイコン・プログラミングでは,パソコンの開発環境(コンパイラ)を使って,数百~数千行もある一連のプログラムを一括で機械語に変換してから,マイコンに書き込みます.

RP2040に“MicroPython”という通訳ファームウェアを書き込んだら,パソコンでPythonプログラムを1行書いて,USB経由でRP2040に送信してみてください,MicroPythonは,その1行のPython言語を翻訳して,CPUが理解できる言葉(機械語)に変換してくれます.

この仕組みのおかげで,プログラミングしたソースコードを直ぐにマイコンで試すことができます.プログラムの一部分をマイコンに投げかけなら反応を見ることができるのです.このような開発環境のことを“REPL(Read-Eval-Print Loop)”と呼びます.

MicroPythonを使えば,従来の一連のソースコードを書き終えてから一括で機械語に変換する「コンパイル作業」が不要になります.プログラム・コード片を1行ずつマイコンに直接投入すると,そのたびに応答して,マイコンの内部回路を動かしてくれるのです.ただし,処理速度がかなり遅くなるので,実用性があるとは言いにくいです.

Pythonがお勧めな理由

世界中で使われている

Pythonは,他のプログラミング言語と比べて短い行数で動作記述できる効率のよい言語です.また動作に直接関係しない暗黙のルールをあまり覚える必要もありません.

Pythonユーザは,全世界に無数にいます.使い方がわからなくても,インターネットで検索すればたくさんの答えがヒットします.

プログラミング言語の分厚い教科書は,やる気をなくさせます.でもPython言語なら,少しの文法を覚えるだけで,コンピュータを操縦できます.

プログラミングの上達のこつは,簡単なプログラムをたくさん書くことですが,行き詰ることも多いでしょう.いまどきは,インターネットで調べればたくさんの答えが得られることでしょう(図3図4).

すぐにペリフェラルを動かせる出来合いのライブラリがそろっている

A-Dコンバータ,D-Aコンバータ,GPIO,$\mathrm{ I^{2}C}$インターフェース回路など,ハードウェアを制御する制御プログラムがそろっています.これらのライブラリを呼び出しながら,効率よくプログラミングできます.

第2章 プログラミング開発環境の準備

Python-機械語翻訳ファームウェアMicroPythonを使った最新開発環境

従来は,マイコンのプログラムを開発するとき,次の手順を繰り返します.

  1. 処理全体のソースコードを記述する
  2. ソースコード全体をコンパイルして機械語に変換する
  3. USB経由でマイコン内のメモリに転送する
  4. プログラムを実行する
  5. ソースコードのミスを修正する

これら一連の作業は,「統合開発環境」(IDE:Integrated Development Environment)というアプリケーション・ソフトウェアをパソコンにインストールして利用します.

一方ラズベリーパイ財団は,Picoのプログラミング開発用として,Python言語専用の統合開発環境“Thonny”を推奨しています.図5に示すのは,Picoのプログラミングを行うための開発環境全体像を示します.

パソコン上で統合開発環境“Thonny”上で,Python言語を使ってソースコードを記述し,Picoに転送してプログラムを実行します.MicroPythonは,Python言語を機械語に翻訳するマイコン用のファームウェアであり,プログラミング言語ではありません.RP2040マイコンに,このMicroPythonをあらかじめ書き込んでおくと,Pythonで書いたソースコードをそのまま,RP2040マイコンに送り込むことができます.1行ずつのPython言語をCPUが理解できるバイナリ・コード(機械語)に変換してくれるわけです.

図5 ラズベリーパイ財団が推奨するPicoのプログラミング環境

開発環境のセットアップ

Pythonプログラミング開発環境の構築方法は,ラズベリーパイ財団のRP2040ホームページ(図3)に解説があります.

(1)PicoをBOOTSELモードで起動し,RP2040ページにアクセス

写真3に示すように,Picoの[BOOTSEL]ボタンを押しながらUSBケーブルをパソコンに接続すると,PicoはBOOTSELモードで起動します.

BOOTSELモードで起動すると,パソコンのファイル・ブラウザからPicoのドライブ(RPI-RP2)を見ることができるようになります.RPI-RP2フォルダにある“index.htm”ををクリックすると,図6に示すRaspberry PiのRP2040ページにアクセスできます.

(a)BOOTSELモードで起動 (b)BOOTSELモードのPicoドライブ
写真3 PicoをBOOTSELモードで起動する
Picoの[BOOTSEL]ボタンを押しながら,パソコンにUSBケーブルを接続すると,PicoはBOOTSELモードで起動する
図6 Picoの心臓部「RP2040マイコン」の開発スタートページ

(2)MicroPythonファームウェアをダウンロードして,Picoにコピー

Raspberry PiのRP2040ページにアクセスして,図6に示すMicroPythonのスタートページのタグをクリックします.MicroPythonファームウェア(UF2ファイル)をダウンロードします.

ダウンロードしたMicroPythonファームウェアのUF2ファイルをPicoのRPI-RP2ドライブにコピーします.これで,MicroPythonファームウェアはRP2040に書き込まれました.

(3)統合開発環境Thonnyをダウンロードしセットアップ

Pythonの統合開発環境“Thonny”をセットアップします.

図7に示すようにThonnyのホームページにアクセスします.ページの右上にダウンロード先を示すリンクが表示されています.自分のOSにあったソフトウェアをダウンロードします.“Thonny-3.3.x.exe”をダウンロードし,指示にしたがってThonnyをインストールします.

図8に示すように,インストール後Thonnyを起動すると,上下に2つのフレームがあるウインドウが開きます.

上部フレームを「コードエディタ」と呼び,Pythonプログラムを記述・実行するときに用います.下部フレームを「シェル」と呼び,Picoに直接コマンドを送るときやプログラム実行結果を表示するときに用います.シェルの領域にプロンプト“>>>”が表示されたら,Picoとの通信ができる状態になっています.

“>>>”が表示されない場合は,通信設定が“MicroPython(Raspberry Pi Pico)”になっていることを確認して,[STOP]アイコンを押してください.

Thonnyには,「ファイルのSave・Open機能」や「プログラムのStart・STOP機能」のボタンがあります.また,[View]-[ファイル]を選ぶと,ファイル・ブラウザが開きパソコン上のファイルやPicoのフラッシュ・メモリ上のファイルを確認したり操作できたりします.

図7 統合開発環境Thonnyの準備
Thonnyは,Ver.3.3.3からPicoを標準でサポートし始めた

図8 Pythonの開発環境“Thonny”の起動画面
Thonnyの起動画面.シェルに“>>>”が表示されていたら,開発環境は正常である

初めてのマイコン・プログラミング(プログラム名 L_chika.py)

準備ができたら,リスト1に示すLチカ・プログラムを動かしてみましょう.

プログラムの説明

1行目は,Lチカに必要なモジュール(ライブラリ)の読み込みを行います.

machineモジュールのI/Oピン制御命令でLEDを点滅させます.utimeモジュールは,時間を管理するための命令です.

2行目は,LEDに接続されているGPIO25ピンを出力端子にして,“led”と命名します.

3行目以降は,実際にLEDを点滅するための命令です.

4行目は,GPIO25ピンをONにしてLEDを発光させてます.4行目で0.5秒待ち,6行目でLEDを消します.

7行目で,再度0.5秒待ち,4行目に戻り,これを延々と繰り返します.

リスト1 Picoに実装されたLEDを点滅させる「Lチカ」プログラム

第3章 初めてのコンピュータ制御「Lチカ」

[やってみよう1]LEDの点灯/消灯を繰り返す

写真4のように,Picoには緑色LEDが1個付いています.

このLEDは,マイコンのGPIO25ピンに接続されています.プログラムでGPIO25ピンの電圧をを“H”にしたり“L”にしたりすると,同時に,LEDが点灯したり消灯したりします.

リスト2に示すのは,LEDを0.5秒ごとにON(LED点灯)OFF(LED消灯)を繰り返すプログラムです.これがいわゆる「Lチカ」のプログラムです.6行目の待ち時間で点灯時間を,また8行目の待ち時間で消灯時間を決めています.

図9に,プログラムで設定したON/OFF繰り返し波形を示します.

ON時間を$t_{on}$,OFF時間を$t_{off}$と定義します.周期(T)は,$t_{on}$と$t_{off}$を足し合わせた時間です.周期Tの逆数($1/T$)は繰り返し周波数($f$)です.そして,周期(T)のうON時間が占める割り合いを「デューティ比」と呼びます.図9(b)に示す式で表されます.

では,次の2パターンで点灯時間を変更して,LEDの点滅の違いを確認してみてください.

  • デューティ比10%「点灯時間:0.1秒,点灯時間:0.9秒
  • デューティ比90%「点灯時間:0.9秒,点灯時間:0.1秒
写真4 動作確認などにも使うRaspberry Pi PicoのLED
Raspberry Pi Picoに実装されているLEDは,RP2040のGPIO25ピンに接続されている.プログラムで,GPIO25ピンの電位を“H”,または“L”に制御することで,点灯させたり消灯させたりできる

リスト2 LEDを点滅(Lチカ)させるプログラム
図9 LEDを駆動するPWM信号のデューティ比を変える

[やってみよう2]LED点滅の周波数を変えてみる

リスト2に示したLチカ・プログラムは,周期Tが1秒の点滅プログラムです.周期Tを1秒(1Hz)から0.1秒(10Hz),0.01秒(100Hz)と変化させるとLEDの発光はどのように変化していくのでしょうか?

6行目と8行目のsleep(0.5)の数字を0.05,0.005と変化させてみてください.0.05秒(周期0.1秒:周波数10Hz)まではLEDの点滅を目で確認できるでしょう.しかし,0.005秒(周期0.01秒:周波数100Hz)になると,目が追いつかなくなります.

点滅が見えなくなる周波数100Hzで,今度はデューティ比を変えてみましょう.次のような条件にプログラムを変更すると,LEDの光の強さが変わって見えます.

  • デューティ比10%:点灯時間:0.001秒,点灯時間:0.009秒
  • デューティ比90%:点灯時間:0.009秒,点灯時間:0.001秒

これを「パルス幅変調(PWM:Pulse Width Modulation)調光」と呼びます.

[やってみよう3]明るさをふんわり変えられる“PWM”

リスト2のLチカ・プログラムでは,GPIO端子の出力信号をプログラムで直接制御する方法を用いていましたが,Picoにはパルス幅制御を専用に行うPWM機能が周辺回路(ペリフェラル)として組み込まれています.

リスト3にPWM機能を使用してLEDを点滅するプログラムを記述します.PWM機能を使用すれば,わずか数行でLEDのデューティ比を制御するプログラムを記述できます.

プログラムの説明

1行目は必要なモジュールをインポートします.GPIOピンとPWM機能が必要なのでmachineモジュールの中からPinとPWMの機能をインポートします.

3行目でPWM波形をGPIO25ピンから出力できるようにするための設定を行い,pwmという名前を付けます.4行目の“pwm.freq(10)”はPWM波形の繰り返し周波数を設定します.

リスト3では10Hzで設定しています.

“pwm.freq(100)”を変更すれば周波数を100Hzに設定できます.PWM機能の周波数の設定下限は8Hzです.

5~6行目でデューティ比の設定を行います.5行目の変数“duty”でデューティ比を[%]で指定します.

6行目のpwm.duty_u16()がPWMのデューティ比を設定するメソッドです.()の中は16ビット(0~65535)の整数値を引数として入れてデューティ比を設定します.引数が0のときは0%,65535のときは100%になります.

引数“int(65535 *duty/100)”の計算で,デューティ比に合った16ビットの整数値を算出しています.計算の中に割算“/”が入っているため,計算結果が浮動小数点型になります.そこで,int関数を使用して整数値に変換しています.

リスト1のLチカ・プログラムと同じようにPWMの周波数を10Hzから100Hzに変更すると,LEDの点滅を目で確認できなくなります.そして,デューティ比を変えることで光の発光強度を変えることができます.

リスト3 PWM機能を利用してLEDをふんわり点灯させるPythonプログラム

[やってみよう4]パルス幅変調調光を用いて発光強度を変えよう

LEDの輝度をランダムに変えてみましょう.リスト4にプログラムを示します.

1行目は,machineモジュールからPinとPWMの機能をインポートしています.

2行目で時間管理のutimeモジュールと,乱数関数のrandomモジュールをインポートします.

3行目は,PWM機能をGPIO25ピンから出力するように“pwm”という名前で設定を行っています.4行目では,PWMの繰り返し周波数を100Hzと設定します.

6行目以降は,繰り返しwhile文です.Whileの条件文を“True”にすることで,7~10行目のインデントされた制御範囲部分を無限で繰り返します.

7行目は,ランダム関数を用いて,0~1.0の乱数を作り変数xに代入します.

8行目は.PWMのデューティを設定するメソッドです.PWMのデューティ値は16ビットで設定するので,範囲は“:0~65535(0x0000~0xffff)”の整数値で設定します.プログラムは,最大値65535に乱数(0~1.0)の値を掛け算し,int関数を用いて整数値に変換します.

9行目では,0.1秒プログラムを休止します.

10行目は,変数xの値を確認できるように,print関数でThonnyのシェルに表示させています.

リスト4 ランダム関数を使うとLEDをふんわり点灯させることができる

コラム ろうそく風のゆらゆらLチカのプログラミング

鍵は“$1/f$”

光がゆらゆら揺れる「ろうそく型LEDライト」が,100円ショップなどで買えます. この動きは,心地よいリズムを出す「$1/f$ゆらぎ」で実現されています.

マイコンを使って疑似的に$1/f$ゆらぎを実現するときは,「間欠カオス法」を利用します.現在の発光強度x(t)が0.5未満かそれ以上で,次の発光強度を求める演算方法を変えます(図10).x(t)が,完全OFF(0)や完全ON(1.0)に近づくと,発光強度の値 “x(t+1)”が変化して難くなり貼り付くため,ランダム関数を使って値を設定しなおすのです.

リスト5に実際のプログラムを示します.

プログラムの説明

1~4行目は,リスト4のプログラムと同じです.5行目は,LEDの発光強度初期値を0.5に設定しています.

6行目以下はwhile文による繰り返しです.

7~12行目は,“if~elif~else”文を用いて,現在の発光強度x(t)の値を見て,次の演算方法を分岐させています(図10).いわゆる間欠カオス動作を実現する部分です.

発光強度xが5%以上50%未満の場合,次のxの値を$x+2x^{2}$で演算します.発光強度xが50%以上95%未満の場合次のxの値を$x-2(1-x)^{2}$で演算します.発光強度xがそれ以外の場合は,ランダム関数を使って再度,発光強度xを設定します.

13行目でデューティ比設定を行い14行目で,0.1秒待ちます.

15行目で,発光強度xの値をThonnyのシェルに表示して確認します.


図10 間欠カオス法によるゆらぎの演算
リスト5 ろうそく風ゆらぎ発光(間欠カオス発光)のプログラム

(c)2021 Uta Taguchi All Right Reserved.
Page Top