食休みした話【ラズパイ⇒ラズパイpico】

あわてないあわてない　食休み食休み

# はじめに
- ラズパイの環境設定ばかりしていて精神がやられたので、[間違えて買ってしまったpico](https://qiita.com/kei_tnk/items/2815002705fcf4c994f0#fn-4)を[ここ](https://www.marutsu.co.jp/pc/static/large_order/zep/m-z-picoled-da1)を参考に触ることとした
![スクリーンショット 2024-05-26 13.38.00.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2733720/054669ca-59c2-9a04-5c18-384b81b533fc.jpeg)
- はぁ、落ち着いた
- 同じように、ラズパイpicoをラズパイ一味と間違えて買ってしまった人の参考になれば良いな

# picoについて
- cpuは[rp2040](https://www.raspberrypi.com/documentation/microcontrollers/rp2040.html)
- 動かすpythonは[microPython](https://www.raspberrypi.com/documentation/microcontrollers/micropython.html)。arduinoがc++を若干いじって使ってるのと違う概念の存在で、rp2040で稼働し、対話型プロンプト(REPL)が可能なpythonのこと。昔、[haskell](https://ja.wikipedia.org/wiki/Haskell)をREPLでいじって遊んでたことを思い出した。
![スクリーンショット 2024-05-26 14.20.02.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2733720/4f17f251-8c9b-2b0f-427f-01dd29411aaf.jpeg)
- pico専用の[sdk](https://github.com/raspberrypi/pico-sdk)も用意されている
![スクリーンショット 2024-05-26 14.24.08.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2733720/46becabf-a69b-19a0-9ec2-22347e463cf7.jpeg)
- arduinoIDEみたいのとして、[thonny](https://thonny.org/)があるけど、政治主張をしているのがちょっとなあ、と思ったら個人開発者だった。なら、むしろ政治主張するのも当然だね。使わせて貰ってありがとう。

# 動かしかた
- [参考HP](https://www.marutsu.co.jp/pc/static/large_order/zep/m-z-picoled-da1)を読めば、Lチカまで一通り動かせると思うけど、自分の場合は、pimoroniの[explorerbase](https://shop.pimoroni.com/products/pico-explorer-base?variant=32369514315859)も買ってしまったので、これを動かせるように若干異なる手順を踏んでいる。
- 「bootsel」ボタンを押しながら、macにusb-cケーブルで刺すのは参考HPと同じだけど、picoの中に入れるファームウェア(uf2ファイル)は[公式](https://www.raspberrypi.com/documentation/microcontrollers/micropython.html)からではなく、[pimoroniの](https://github.com/pimoroni/pimoroni-pico/releases/tag/v1.21.0)「pimoroni-pico-v1.21.0-micropython」を使った。
 公式
 ![スクリーンショット 2024-05-26 14.45.03.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2733720/289b9753-de00-3613-e642-1e3a9b4f86e3.jpeg)
pimoroni
![スクリーンショット 2024-05-26 14.49.31.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2733720/8aedd3d6-49e2-e72b-c31c-e938f84844a6.jpeg)
- picoの中にuf2ファイルを入れると、勝手にpicoが再起動して、macに接続してきた。下記がuf2を入れた後に認識されたpico。
![スクリーンショット 2024-05-26 14.54.26.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2733720/29ae4e0d-d43a-bb41-e106-7f8e4e472ec2.jpeg)
- 後は、[tonny]()をインストールして、設定画面で、インタプリタとして、picoを選ぶ。
![スクリーンショット 2024-05-26 14.59.42.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2733720/35e2d582-ed8f-5c5c-7811-dc23c69c8616.jpeg)
- 設定画面で、インタプリタをMicroPython(Raspberry Pi Pico)を選ぶ。これにより、Thonnyのpythonコードを実行するのはpicoとなる。その代わり当然だけど、picoを繋いでないと、何も出来ず「print(1+3)」すら計算してくれない。
![スクリーンショット 2024-05-26 15.05.52.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2733720/aa0d59bd-bd6e-8fb0-062c-1d1bc258b4c0.jpeg)
![スクリーンショット 2024-05-26 15.04.43.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2733720/344f16a0-d8e3-c299-55d3-3f21ac1468b2.jpeg)
- インタプリタをmacos内のpythonにしておけば、当然、計算が実行される。上の枠内にプログラムを書いて、右上の実行を押すと、下枠内のシェルで結果が返される。なお、インタプリタの変更については、設定画面を開かずとも、エディタ画面のシェル下側にある赤線部分「ローカルpython3」のところをクリックして可能。
![スクリーンショット 2024-05-26 15.11.26.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2733720/e9ef67bc-96ea-6446-c2a2-398febdf7a1c.jpeg)
![スクリーンショット 2024-05-26 15.23.28.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2733720/b38a43a6-347f-e7d5-2f42-6cdbd4e08251.jpeg)

# 実行結果
- thonnyのインタプリタをpicoに戻して、pimoroniの[githubページ](https://github.com/pimoroni/pimoroni-pico/tree/main/micropython/examples/pico_explorer)から、下記のお試しプログラム[balls_demo](https://github.com/pimoroni/pimoroni-pico/blob/main/micropython/examples/pico_explorer/balls_demo.py)をthonnyコピペして実行したら、ecplorer base上の液晶画面でballが動いた。
![スクリーンショット 2024-05-26 15.39.06.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2733720/587e245f-0bbf-e911-1162-36f9ece4e02a.jpeg)
```py
import time
import random
from picographics import PicoGraphics, DISPLAY_PICO_EXPLORER, PEN_P8

display = PicoGraphics(display=DISPLAY_PICO_EXPLORER, pen_type=PEN_P8)

WIDTH, HEIGHT = display.get_bounds()

# We're creating 100 balls with their own individual colour and 1 BG colour
# for a total of 101 colours, which will all fit in the custom 256 entry palette!


class Ball:
    def __init__(self, x, y, r, dx, dy, pen):
        self.x = x
        self.y = y
        self.r = r
        self.dx = dx
        self.dy = dy
        self.pen = pen


# initialise shapes
balls = []
for i in range(0, 100):
    r = random.randint(0, 10) + 3
    balls.append(
        Ball(
            random.randint(r, r + (WIDTH - 2 * r)),
            random.randint(r, r + (HEIGHT - 2 * r)),
            r,
            (14 - r) / 2,
            (14 - r) / 2,
            display.create_pen(random.randint(0, 255), random.randint(0, 255), random.randint(0, 255)),
        )
    )

BG = display.create_pen(40, 40, 40)

while True:
    display.set_pen(BG)
    display.clear()

    for ball in balls:
        ball.x += ball.dx
        ball.y += ball.dy

        xmax = WIDTH - ball.r
        xmin = ball.r
        ymax = HEIGHT - ball.r
        ymin = ball.r

        if ball.x < xmin or ball.x > xmax:
            ball.dx *= -1

        if ball.y < ymin or ball.y > ymax:
            ball.dy *= -1

        display.set_pen(ball.pen)
        display.circle(int(ball.x), int(ball.y), int(ball.r))

    display.update()
    time.sleep(0.01)
```
- 特にthonnyに対して、重要そうなライブラリらしき[PicoGraphics](https://github.com/pimoroni/pimoroni-pico/tree/main/micropython/modules/picographics)を取り込ませる作業をしてないのに、上記のコードをthonnyに読ませて動作したのは、picoに入ってるuf2ファイルに、既にライブラリがとりこまれているから。
![スクリーンショット 2024-05-26 15.27.53.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2733720/c67f644a-acc2-07c2-8176-b150aca0b6f2.jpeg)
- なるほど、picoの流儀はそうなのね。
- なお、thonnyのストップボタンをしたら、液晶画面上のボールの動きは止まったものの、ボール自体は表示されたままだった。再度、実行ボタンを押したら、一回画面が消えて新たに動くボールが表示された。

# 最後に
- とりあえず、土曜日のストレスが多少は解消されて良かったよ。
- picoって良い子だなぁ