「ラズパイピコ実験基板」を組み立てて実験してみた
ラズパイピコ 実験基板
共立エレショップさんで発売されている、Raspberry Pi Pico(ラズパイピコ) を動かせる基板と部品のキットです。(ラズパイピコ本体付き)
▼ 製品概要については、共立エレショップさんの商品ページをご確認ください。
https://eleshop.jp/shop/g/gM48412/
はんだ付けがしたかったのとラズパイピコであまり遊べていなかったので勉強になるかなと購入しました。
結果、とても楽しかったです。
サンプルコードは付属していなかったので私が書いたプログラムを公開してみようと思いました。
部品実装
はんだ付けは下手の横好きレベルなので、見た目はいまいちです。。
外部電源入力のインタフェースもありますがこちらは部品が付属しておらず、付けたい場合は別途購入した部品をつけてねということらしいです。
部品実装後USB給電すると、下記のLEDが点きます。
- 基板上ラズパイピコの隣にある赤いLED(LED1。赤緑青が並んでるGP10のほうではない)
プログラムを動かす準備(MicroPython)
プログラムは今回Thonnyを使ってMicroPythonで書きました。
ThonnyでMicroPythonをラズパイピコで動かせるようにセットアップする方法は、ここでは省略します。
「thonny micropython ラズパイピコ」とか「thonny micropython raspberry pi pico」などで検索すると情報が出てきますのでそちらをご覧ください。
以下の2点を行えば良いです。
- PCにThonnyをセットアップ
- MicroPythonファームウェア(UF2ファイル)をラズパイピコに書き込む
LED(赤青緑)のプログラム
GP10、GP11、GP12と書いてある3色のLEDを光らせるコードです。
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も同時に点滅します。
最初赤しか光らなくて困ってたのですが、はんだづけがダメな部分がわかったのでつけなおしたら良くなりました。
タクトスイッチのプログラム
次はタクトスイッチ(GP13、GP14、GP15)を押したらLEDが光るようにしてみました。
タクトスイッチと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が繋がっているので、具体的には下記の書き換えが必要です。
ロータリーエンコーダーのピン定義
#ロータリーエンコーダーのA,B端子 プルアップ
pinA = Pin(17, Pin.IN, Pin.PULL_UP)
pinB = Pin(16, Pin.IN, Pin.PULL_UP)
またさらにこれに手を加えて、ロータリーエンコーダーを回すことでLEDの明るさを変えるようなプログラムを作ってみました。
LEDの明るさを変えたいので、LEDはPWM制御にしています。
また、タクトスイッチを押しながらロータリーエンコーダーを回すことで明るさを変更する対象のLEDを決められるようにしました。
ロータリーエンコーダーで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)
LEDもぐらたたき
最後に、LEDとタクトスイッチを使ったゲームを作ってみました。
成功したか失敗したかわかりにくいので、圧電ブザー(型番:TMB12A05 アクティブブザー)をGP3に接続して音を鳴らせるようにしました。
GPIO3を使用するためにピンヘッダも追加ではんだ付けをしました。
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)
遊び方は上記Tweetの動画を見ていただけたらと思いますが、タクトスイッチのプログラムと同じくGP13 …赤LED、GP14 …緑LED、GP15 …青LED に対応しています。
成功時は10点加算、失敗時(お手つき)は10点減点になっていて、コンソール上に得点を表示するようにしています。
LEDが点灯する長さもランダムにしたので一瞬で消えるときもありちょっと難しい感じになっています。
さいごに
ラズパイピコは発売当初に触ったきりでどうやってプログラムを書くのかも忘れてしまってましたが、今回こうやっていろいろ触って遊べたので良かったです。
はんだづけしたいという目的が大きかったので、購入してはんだ付けした後「これどうやって動作確認するんだっけ??」となってしまってネットで調べながら作ったのでここに公開しました。(付属された説明書にははんだづけ手順しか記載されていません。)
ネットで調べたことにより思い出したこと・新しく知ったことの収穫があり、良かったです。
MicroPython楽しいなと思いました。
投稿者の人気記事
-
siroitori0413
さんが
2022/05/05
に
編集
をしました。
(メッセージ: 初版)
ログインしてコメントを投稿する