siroitori0413 が 2022年05月05日18時35分01秒 に編集
初版
タイトルの変更
「ラズパイピコ実験基板」を組み立てて実験してみた
タグの変更
RaspberryPiPICO
micropython
メイン画像の変更
記事種類の変更
セットアップや使用方法
本文の変更
# ラズパイピコ 実験基板 共立エレショップさんで発売されている、Raspberry Pi Pico(ラズパイピコ) を動かせる基板と部品のキットです。(ラズパイピコ本体付き) ![キャプションを入力できます](https://camo.elchika.com/9137c54558277c3b8c08eaf8b8610061e35e67aa/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f30613439623061322d303637642d343831662d616535342d6662376130303834316537342f65643033396361632d393664642d343138362d623035372d396564366437663263336234/) ▼ 製品概要については、共立エレショップさんの商品ページをご確認ください。 https://eleshop.jp/shop/g/gM48412/ はんだ付けがしたかったのとラズパイピコであまり遊べていなかったので勉強になるかなと購入しました。 結果、とても楽しかったです。 サンプルコードは付属していなかったので私が書いたプログラムを公開してみようと思いました。 # 部品実装 はんだ付けは下手の横好きレベルなので、見た目はいまいちです。。 ![ラズパイピコ実験基板-部品実装後](https://camo.elchika.com/ceb4f965fce07ad23a5ebf5aa880b935e6ae74bb/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f30613439623061322d303637642d343831662d616535342d6662376130303834316537342f32386432333362372d316630352d346239612d623936642d666462643337356531363539/) 外部電源入力のインタフェースもありますがこちらは部品が付属しておらず、付けたい場合は別途購入した部品をつけてねということらしいです。 部品実装後USB給電すると、下記のLEDが点きます。 - 基板上ラズパイピコの隣にある赤いLED(LED1。赤緑青が並んでるGP10のほうではない) # プログラムを動かす準備(MicroPython) プログラムは今回Thonnyを使ってMicroPythonで書きました。 ![Thonny](https://camo.elchika.com/c3683b2a42bfe8629806f234a1f82d5f91650484/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f30613439623061322d303637642d343831662d616535342d6662376130303834316537342f39623635623462382d353462382d346237612d386333322d306331313362313335303862/) ThonnyでMicroPythonをラズパイピコで動かせるようにセットアップする方法は、ここでは省略します。 「thonny micropython ラズパイピコ」とか「thonny micropython raspberry pi pico」などで検索すると情報が出てきますのでそちらをご覧ください。 以下の2点を行えば良いです。 - PCにThonnyをセットアップ - MicroPythonファームウェア(UF2ファイル)をラズパイピコに書き込む # LED(赤青緑)のプログラム GP10、GP11、GP12と書いてある3色のLEDを光らせるコードです。 ```Python:LED(赤青緑) # ラズパイピコ実験基板用サンプル LED-RGB from machine import Pin import utime #led = Pin(25, Pin.OUT) # RGB LED ledr = Pin(10, Pin.OUT) ledg = Pin(11, Pin.OUT) ledb = Pin(12, Pin.OUT) while True: # led.value(1) ledr.value(1) ledg.value(1) ledb.value(1) utime.sleep(1) # led.value(0) ledr.value(0) ledg.value(0) ledb.value(0) utime.sleep(1) ``` 3つのLEDを同時に点滅させています。 GPIO25のほうの led = Pin(25, Pin.OUT) のコメントを有効にすると、ラズパイピコ上のLEDも同時に点滅します。 @[twitter](https://twitter.com/siroitori0413/status/1521141631730487296) 最初赤しか光らなくて困ってたのですが、はんだづけがダメな部分がわかったのでつけなおしたら良くなりました。 # タクトスイッチのプログラム 次はタクトスイッチ(GP13、GP14、GP15)を押したらLEDが光るようにしてみました。 ```Python:タクトスイッチとLED # ラズパイピコ実験基板用サンプル スイッチとLED from machine import Pin import utime # RGB LED ledr = Pin(10, machine.Pin.OUT) ledg = Pin(11, machine.Pin.OUT) ledb = Pin(12, machine.Pin.OUT) # Switch switch1 = Pin(13, Pin.IN, Pin.PULL_DOWN) switch2 = Pin(14, Pin.IN, Pin.PULL_DOWN) switch3 = Pin(15, Pin.IN, Pin.PULL_DOWN) while True: if switch1.value()!=1: ledr.value(1) else: ledr.value(0) if switch2.value()!=1: ledg.value(1) else: ledg.value(0) if switch3.value()!=1: ledb.value(1) else: ledb.value(0) ``` GP13 …赤LED、GP14 …緑LED、GP15 …青LED が光るようにしてみました。 # ロータリーエンコーダーのプログラム ロータリーエンコーダーとは可変抵抗とは違って際限なく何回転でも右左にぐるぐる回すことができる電子部品です。 ロータリーエンコーダーを触るのは初めてで、下記サイトを参考にさせていただきました。 https://blog.goo.ne.jp/jh7ubc/e/ad009c6b32422ec8dee317d764be84b4 ピン番号が変わるのでそこだけを変えると、上記サイトのコードそのままで左回転右回転の判定ができます。 今回の基板ではGP16とGP17が繋がっているので、具体的には下記の書き換えが必要です。 ```Python:ロータリーエンコーダーのピン定義 #ロータリーエンコーダーのA,B端子 プルアップ pinA = Pin(17, Pin.IN, Pin.PULL_UP) pinB = Pin(16, Pin.IN, Pin.PULL_UP) ``` またさらにこれに手を加えて、ロータリーエンコーダーを回すことでLEDの明るさを変えるようなプログラムを作ってみました。 LEDの明るさを変えたいので、LEDはPWM制御にしています。 また、タクトスイッチを押しながらロータリーエンコーダーを回すことで明るさを変更する対象のLEDを決められるようにしました。 ```Python:ロータリーエンコーダーでLED(赤緑青)の明るさを変える # ラズパイピコ実験基板用サンプル ロータリーエンコーダーでLED3つをPWM制御 import time from machine import Pin, PWM # Switch switch1 = Pin(13, Pin.IN, Pin.PULL_DOWN) switch2 = Pin(14, Pin.IN, Pin.PULL_DOWN) switch3 = Pin(15, Pin.IN, Pin.PULL_DOWN) #ロータリーエンコーダーのA,B端子 プルアップ pinA = Pin(17, Pin.IN, Pin.PULL_UP) pinB = Pin(16, Pin.IN, Pin.PULL_UP) #回転方向判定初期値 befDat = 0x11 curDat = 0 count = 0 D = 0 #回転方向判定 def watchRotation(p): global curDat global befDat global count global direction curDat = pinA.value() + (pinB.value()<<1) if curDat != befDat: D = ((befDat<<1)^curDat) & 3 if D < 2: count = count + 1 else: count = count -1 befDat = curDat if count >= 3: print('ASC') direction = 500 count = 0 elif count <= -3: print('DESC') direction = -500 count = 0 #directionからduryを計算する def getDuty(duty, d): duty += d if duty > 65535: duty = 65535 elif duty < 0: duty = 0 return duty pinA.irq(trigger=Pin.IRQ_FALLING | Pin.IRQ_RISING, handler = watchRotation) pinB.irq(trigger=Pin.IRQ_FALLING | Pin.IRQ_RISING, handler = watchRotation) #PWM Pin pwmr = PWM(Pin(10)) pwmg = PWM(Pin(11)) pwmb = PWM(Pin(12)) pwmr.freq(1000) pwmg.freq(1000) pwmb.freq(1000) dutyr = 0 dutyg = 0 dutyb = 0 direction = 0 while True: #print(switch1.value()) if direction != 0: if switch1.value()!=1: dutyr = getDuty(dutyr, direction) print('dutyr =' + str(dutyr)) elif switch2.value()!=1: dutyg = getDuty(dutyg, direction) print('dutyg =' + str(dutyg)) elif switch3.value()!=1: dutyb = getDuty(dutyb, direction) print('dutyb =' + str(dutyb)) direction = 0 #dirctionのクリア pwmr.duty_u16(dutyr) pwmg.duty_u16(dutyg) pwmb.duty_u16(dutyb) time.sleep(0.0001) ``` @[twitter](https://twitter.com/siroitori0413/status/1521724528740933634) # LEDもぐらたたき 最後に、LEDとタクトスイッチを使ったゲームを作ってみました。 成功したか失敗したかわかりにくいので、圧電ブザー(型番:TMB12A05 アクティブブザー)をGP3に接続して音を鳴らせるようにしました。 GPIO3を使用するためにピンヘッダも追加ではんだ付けをしました。 ![GPIO3とGNDに圧電ブザーを直結](https://camo.elchika.com/c2694f0a5193c9639ebf72231ff77e81e870e1e9/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f30613439623061322d303637642d343831662d616535342d6662376130303834316537342f36323138653033302d356561652d343366302d386362352d653066343863623037653066/) ```Python:LEDもぐらたたき # ラズパイピコ実験基板用サンプル LEDもぐらたたき import utime from machine import Pin import random # RGB LED ledr = Pin(10, Pin.OUT) ledg = Pin(11, Pin.OUT) ledb = Pin(12, Pin.OUT) # Switch switch1 = Pin(13, Pin.IN, Pin.PULL_DOWN) switch2 = Pin(14, Pin.IN, Pin.PULL_DOWN) switch3 = Pin(15, Pin.IN, Pin.PULL_DOWN) # Buzzer - GPIO3に接続 buzzer = Pin(3, Pin.OUT) blink = 0.5 score = 0 def getHit(ledNum, pushedNum): global score if ledNum==pushedNum: # OK score+=10 print('score =' + str(score)) buzzer.value(1) utime.sleep(0.1) buzzer.value(0) else: #NG score-=10 print('score =' + str(score)) buzzer.value(1) utime.sleep(0.05) buzzer.value(0) utime.sleep(0.05) buzzer.value(1) utime.sleep(0.05) buzzer.value(0) def getInput(ledNum): blinkTime = random.randint(1, 100) counter = 0 while True: counter+=1 if switch1.value()!=1: getHit(ledNum, 1) break elif switch2.value()!=1: getHit(ledNum, 2) break elif switch3.value()!=1: getHit(ledNum, 3) break utime.sleep(0.01) if counter >= blinkTime: break while True: # 光らせるLEDをランダムに決定 p = random.randint(1, 3) if p == 1: ledTarget = ledr elif p == 2: ledTarget = ledg elif p == 3: ledTarget = ledb # ターゲットLEDを点灯・消灯 ledTarget.value(1) getInput(p) ledTarget.value(0) ``` @[twitter](https://twitter.com/siroitori0413/status/1521866734084714496) 遊び方は上記Tweetの動画を見ていただけたらと思いますが、タクトスイッチのプログラムと同じくGP13 …赤LED、GP14 …緑LED、GP15 …青LED に対応しています。 成功時は10点加算、失敗時(お手つき)は10点減点になっていて、コンソール上に得点を表示するようにしています。 LEDが点灯する長さもランダムにしたので一瞬で消えるときもありちょっと難しい感じになっています。 # さいごに ラズパイピコは発売当初に触ったきりでどうやってプログラムを書くのかも忘れてしまってましたが、今回こうやっていろいろ触って遊べたので良かったです。 はんだづけしたいという目的が大きかったので、購入してはんだ付けした後「これどうやって動作確認するんだっけ??」となってしまってネットで調べながら作ったのでここに公開しました。(付属された説明書にははんだづけ手順しか記載されていません。) ネットで調べたことにより思い出したこと・新しく知ったことの収穫があり、良かったです。 MicroPython楽しいなと思いました。