Raspberry pi pico WHをMicroPythonで動かす

# 本実習の概要
　本実習の目的はマイコン制御を通じて、たとえ1人でも調べたり試したりすることで各人が要求するデバイスを設計、制御できるようになることです。
 　そのために今回はRaspberry Pi pico WHというマイコンを用いて基本のLチカから車輪走行ロボットの制御まで幅広く経験し、マイコン制御、プログラミングに慣れてもらえるような講義を目指しています。また、本授業を経て今後自主的にモノづくりをしたくなって頂ければ幸いです。

## マイコンとは？
そもそもマイコンとはなんでしょう？
　マイコンとはマイクロコンピュータ（Micro Computer）の略称であり、その名の通り小型のコンピュータの事を指します。マイコンはI/O、CPU、ROM、RAMといった電子部品で構成されています。
I/O：入出力を行うピン
CPU：中央演算処理装置（Central Processing Unit）のこと。
ROM：データを長期的に保存する電子部品（read‐only memory）。フラッシュメモリ。
RAM：データを一時的に保存する電子部品（Random Access Memory）。

 例えばArduino Uno(左)やESP32(右)、Raspberry piもマイコンの一種です。そしてこれらはシングルボードマイコンと呼ばれます。これは1つの基板上に最低限の入出力装置と電子部品が付けられたマイコンです。これをさらに小型化したものにワンチップマイコンというものがあります。こちらも興味があれば調べてみて下さい。
![52372.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3802511/658de241-ec60-1c34-3ee2-67a9bc5e718e.jpeg)

 ワンチップマイコンについて：https://www.marutsu.co.jp/pc/static/large_order/begin_pic?srsltid=AfmBOooU3Ulu3S-k1tUsWFKor4DmccYHMG2ONTvYHxaVyHbnUus6rIbj


## Raspberry Pi pico WHの選定理由
上で述べたようにマイコンにはたくさんの種類があります。そのなかでRaspberry Pi Pico WHを選定した理由を以下にまとめます。
・マイコンの中で比較的安価であり、かつWiFi・Bluetooth機能をデフォルトで備えている点で、マイコンを用いた実習に適当

・micropythonというpythonの機能をマイコン用に絞ったプログラム言語でコーディングが出来るため、実装が簡単である。また参考文献も多い点も👍

・micropython以外にもC/c++でコーディングが可能なため、1台で幅広く学ぶことが可能（雰囲気はArduinoやESP32と似た感じ）

以上の理由からこのマイコンを選定しました。

今回使用するロボットはplumbotという車輪走行ロボットです。システム構成は以下の通りです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3802511/fcc0dc1c-04bc-5822-c8a4-c97ef1855d99.png)

下部の基板にはDCモーターを２つとそれを制御するためのモータードライバ(緑〇)、加えて超音波センサ(青▢)およびフォトリフレクタ(青〇)を備えています。また電源供給はリチウムイオンバッテリー（通称リポバッテリー）から３Vが供給されます。電池は当然ながら時間とともに出力が衰えていくので、それをカバーするために昇圧コンバーター(赤〇)を搭載しています。これによって安定して3.3Vが供給できるようになっています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3802511/7ee600b9-a5a8-cf1c-2d1d-14707726655d.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3802511/e38a2ab6-b035-ced0-de56-842fd831b2b5.png)


そして上部の基板にはRaspberry Pi Pico WHというマイコンを取り付けてられるようになっています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3802511/1abb1407-035c-000c-e505-d8840a29c30e.png)
その入出力信号を中央の長いピンから下部の基板に通し、各センサおよびモータと送受信をしています。各部品とマイコンとのピン対応は以下の通りです。これを見るとわかる通り、マイコンの全てのピンは中央のピンソケットにつながっています。

また、2x15のピンヘッダーが4列並んだところは下図のように導通しています。ブレッドボードの代わり程度に思って下さい。ですので、このピンソケットたちをジャンパ線で繋げば自由に電子部品を付け足していくことができます。また基板およびタイヤは学内の3Dプリンタおよび基盤加工機で製作が可能ですので、興味がある方は制作してみて下さい。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3802511/370dc487-1382-9795-f94f-c5bb6ceaffc8.png)


このロボットの最大の特徴は「汎用性」です。例えばこの授業の中でPythonでは難しいとなった場合、上部の基盤を付け替えmicro:bitにすることでブロックプログラミングを扱えるようになります。

紹介はこの程度にして、使うにあたっての注意事項をまとめていきます。
・電源周りの配線は特に注意して下さい。間違えると最悪マイコンが壊れてしまいます。(詳しいことは実際に扱うときに紹介します)
・配線を追加する際は、gndは中央のピンソケットの部分と共通化して下さい。ノイズまみれになってしまいます。
・下部基板上のスイッチをオンにした際に基板上のLEDが光らない場合はすぐにスイッチをオフにして下さい。回路基板に問題があります。
・下部基板前方のLED2つは明るさが自動で変わりますが問題ないです。(詳しくはライントレースの回で紹介します。)


## Raspberry Pi picoのための環境構築
まずraspberry pi pico W（以下RPi picoとします）専用のuf2ファイルをダウンロードして下さい。以下のウェブページで「Raspberry Pi Pico W with Wi-Fi and Bluetooth LE support」と検索するとダウンロードURLが見つかります。
公式サイト:https://www.raspberrypi.com/documentation/microcontrollers/micropython.html#drag-and-drop-micropython
次にRPi pico本体についているBootselボタン(赤◯)を押しながらUSBコネクタを差して下さい。（BootselはRPi picoのディレクトリを開くためのボタンなので、普段の接続時は押さなくてよいです）
![image.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3802511/94b393c8-0528-c78f-23ff-cb48935ae4be.jpeg)

下図のようにRPI-RP2フォルダが開かれますので、そこに先ほどダウンロードしたuf2ファイルを移動（コピーペーストも可）して下さい。下図はファイル名が違いますがご容赦ください。
![image.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3802511/6f192fec-7064-2560-7e35-cf0464749758.jpeg)


次にプログラムを編集しRPi Picoに書き込むためのソフトウェアであるThonnyをインストールしましょう。Thonnyのウェブページへ移動し、下図の赤枠部分からダウンロードして下さい。（versionはWindowsのversionに対応したものを選びましょう）
![スクリーンショット 2024-08-30 104755.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3625743/c269ffaa-df0b-7929-50a7-2e18abddab0a.png)
Thonny公式サイト：https://thonny.org/

インストールした.exeファイルを開きインストールします。
ポップアップが出るので「日本語（ALPHA)」を選択して下さい。
参考文献：https://sanuki-tech.net/and-more/2022/install-thonny-python-ide/

アップデートのため以下の作業をもう一度行う（順番が悪かった？）
「raspberry pi pico W（以下RPi picoとする）専用のuf2ファイルを取得しておく。」

というよりはMicropythonの設定かな？
Thonnyが開けたら右下のところから必要な設定を行います。
![image.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3802511/e9501bc6-7332-40eb-17b8-a3539d4b7075.jpeg)

「Micropythonをインストール」を選択します。
![スクリーンショット (70).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3802511/44a3f100-50ee-0515-e7dc-c592463da2aa.png)
Ras
下図のようなポップアップが出るので、Raspberry Pi Pico W/WHを選択します。
![スクリーンショット (71).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3802511/cbec7883-51ca-14c6-5600-291d732a2c6c.png)

Versionが自動で選択されるので、「インストール」ボタンを押します。
![スクリーンショット (72).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3802511/23eb30a0-25ab-104f-0224-9895588dfa6d.png)

以上でセットアップは完了です。


最後にインストールが正常に実行されたかを確認するため、定番のLチカをやってみましょう。
## 基板上のLEDをチカチカさせる（Lチカ）
Thonnyのコードエディタに以下のコードを入力し実行して下さい。

```
# マイコンを動かすためのライブラリをimportする
from machine import Pin, Timer

# 制御するピン番号を指定する
led = Pin("LED", Pin.OUT)

# タイマーを準備する
tim = Timer()

def tick(timer):
    global led
    # ledを反転させる
    led.toggle()

# 周波数1Hz(1[回/ｓ])でtick()を起動する
tim.init(freq=1.0, callback=tick)
```
このプログラムについて簡単に解説しておきます。
まず最初の```from machine import Pin, Timer```という部分は、machineというライブラリからPinという名前の関数とTimerという名前の関数をこれから使うということを宣言しています。これをしないとライブラリの中身が使えません。
次に```led = ("LED", Pin.OUT)```という部分ですが、これはマイコンのI/Oピンのうちどのピンを使うかを宣言したものです。そして使用するピンにledという名前を付けることで、ピンの呼び出しが楽になります。
そして```tim = Timer()```という部分ですが、ここでは関数を変数に代入しています。何をしているか分からなければ以下のプログラムを追加してみて下さい。関数の中身が自動で計算され、それがtimという変数の中に代入されています。
```
print(Timer())
print(tim)
```
その次はtick()という関数の定義がされています。関数を扱う際に注意することは変数の有効範囲です。一般的に変数は同じ名前でも、関数の中と外で別物として認識されます。これを同じものと認識させるために```global led```というコードがあります。これをすればledという名前の変数(ピン設定)が関数の中と外で同じものだと認識されます。そして```led.toggle()```は現在の出力を反転させる関数の出力をledというピンに渡すためのコードです。
最後に```tim.init(freq=1.0, callback=tick)```です。これは周期1Hz(1回/s)でtick()という関数を実行するコードです。ちなみにinitはInitialize(初期化する)ということを表しています。
以上がプログラムの概要です。

左の赤丸がプログラムの実行、右の青丸がプログラムの停止のためのボタンです。それでは実行してみて下さい。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3802511/5f0bf94f-c376-af35-2daf-84a7bd1b6199.png)

また、プログラムを保存する際は以下のようなポップアップが出るので、好きな方を選択しましょう。（選択した方にプログラムが保存されますが、RPi picoはメモリが小さいので注意してください。特に理由がないならthis computerを選択しましょう。）This Computer（ローカル）に保存する場合は必ずフォルダを作成し、その中に保存しましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3802511/074c6df4-8249-e707-deda-fde23e1b21f5.png)


実行した時エラーが出なければ正常にインストールが完了したことになります。
※「ImportError: no module named 'machine'」が出る場合はRPi picoとの接続が出来ていない状態です。

RPi picoにmain.pyという名前でPythonファイルを保存しておくと、次回から接続時に自動で処理が実行されますのでファイルの名前にはご注意ください(RPi picoの仕様)。

## vscodeでコーディングがしたいなら
Thonnyをインストールして頂きましたが、ことコーディングにおいては正直使いづらいです。そこでコーディングが非常に簡単になるvs codeの環境構築を行いましょう。vscodeは便利ですが、RPi Picoを操作するにはところどころ扱いづらい部分がありますのでご注意ください。

まずvscodeでコーディングする場合はPC内にvscodeとPythonがインストールされている必要があります。ここまでのやり方及びvscodeの使い方は以下のページを参照して下さい。
参考文献：https://www.python.jp/python_vscode/windows/setup/install_vscode.html

vscodeとPythonのインストールが完了すれば、後は以下の流れに沿って作業をするだけです。
・vs codeを開き、Extentionsの検索ボックスで「micropico」と調べて下さい。すると以下の拡張機能があるのでインストールします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3625743/4ad58f2d-4138-7d89-7fee-9638b4adc5ac.png)

・次にRPi pico用のフォルダを作成しましょう。エクスプローラーやあるいはデスクトップから直接フォルダを作成してください。名前は何でも大丈夫ですが日本語はお勧めしないです。

・次に赤枠部分を選択し、赤線部分のNO FOLDER OPENEDをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3802511/f08a06a3-7761-5004-8578-1ce744b2d41e.png)

・赤枠部分をクリックし、先程作成したフォルダを選択してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3802511/a072310d-e9ce-ff67-900c-ee9e340e8e57.png)


・Terminalを開き、Pico（W）vREPLを選択して下さい。
![スクリーンショット (61).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3625743/8018695f-e2cd-f5cd-5783-bf9f703c70d3.png)

・作成したら「Ctrl+Shift+P」を押しコマンドパレットを開いてください（Mac,Linuxは違うかも）。

・コマンドパレットの検索バーから「micropico:configure project」を選択して下さい。

・RPi Picoを接続した状態で、コマンドパレットの検索バーから「micropico:Connect」を選択して下さい。

![スクリーンショット (60).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3625743/c1a9c252-03ef-6b79-4da1-6c388bd83b2e.png)

ここでもう一度インストールが正常に実行されたかを確認するためにLチカをやってみましょう。

pythonファイルを新規作成し以下のコードを保存して下さい。新規作成は下図の赤枠をクリックするとできます。Pythonファイルは拡張子を.pyにしてください。これをしないと動かなくなります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3802511/145aadfa-c734-27b4-0c7e-b026513ad9f7.png)


実行するときは画面下部の「Run」を押すことで出来ます。この時、Run横の文字が「Pico　Connected」になっていることを確認して下さい。なっていなければ文字をクリックし、「Pico　Connected」にして下さい。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3625743/4f06c4eb-e75c-f548-917f-f3ab69b72c45.png)

これで接続できなければ何かが間違っているので、色々確認してください。
一番多いのはThonnyがすでにRPi Picoにつながっているため接続が競合していることです（普通、もともとつながっている方が優先される）。その場合はThonnyを閉じるかThonnyにあるコマンドバーの「実行」<「切断」を選択すると接続が切れます。

```
# マイコンを動かすためのライブラリをimportする
from machine import Pin, Timer

# 制御するピン番号を指定する
led = Pin("LED", Pin.OUT)

# タイマーを準備する
tim = Timer()

def tick(timer):
    global led
    # ledを反転させる
    led.toggle()

# 周波数1Hz(1[回/ｓ])でtick()を起動する
tim.init(freq=1.0, mode=Timer.PERIODIC, callback=tick)
```

RUNした時エラーが出なければ正常にインストールが完了したことになります。




# PWMを体験する　～モーターの回転制御～


少し話が変わるが、基板上のLEDはPWM制御できない（Pico Wに限る）。これはPico Wのポートが内部でWiFiの機能と共有されているからである。

このようなエラーが出る場合はエラー文に従って「STOP」ボタンを押してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3625743/fff9147b-f8f0-65fa-459c-0ec04ed54157.png)

### 注意事項
・VSYS、VBUSとUSBポートの電源線は内部でつながっているらしいので、同時につながないように（してください（PCや電源が壊れる可能性あり）。よって、遠隔操作するときの作業の流れは以下の通りです。
　・USBコードを接続しプログラムを書き込む。
  ・main.pyとしてRPi picoに保存する。
　・USBコードを抜く
　・VSYSに電源(1.8~5.5V)を供給する。

 ・3V3（OUT）に電源供給しない。

 ・ThonnyとVScodeを併用すると起きやすいミスとして、RPi Picoの接続が競合することが良くある。接続できない旨のエラーが表示されたらまずそれぞれのソフトウェアで勝手に接続されていないか調べよう