lynx   »   [go: up one dir, main page]

ラベル RaspberryPiPico の投稿を表示しています。 すべての投稿を表示
ラベル RaspberryPiPico の投稿を表示しています。 すべての投稿を表示

2022年4月20日水曜日

Raspberry Pi PicoとSHT31センサーで温度と湿度を計測する

Raspberry Pi PicoとSHT31センサーで温度と湿度を計測するには、以下の手順を実行します。

実行手順 1. Raspberry Pi PicoとSHT31センサーモジュールの配線
SHT31は秋月電子さんのSHT31モジュールを使用します。

・SHT31使用 高精度温湿度センサモジュールキット
https://akizukidenshi.com/catalog/g/gK-12125/

Raspberry PicoとSHT31モジュールの端子を以下のように接続します。
Raspberry Pi Pico pin36 : 3V3(OUT) → SHT31モジュール pin1 : VDD
Raspberry Pi Pico pin26 : GP20 SDA → SHT31モジュール pin2 : SDA
Raspberry Pi Pico pin27 : GP21 SCL → SHT31モジュール pin3 : SCL
Raspberry Pi Pico pin28 : GND → SHT31モジュール pin5 : GND

・回路図

・配線例

2. Thonnyを使用してSHT31ドライバーの導入
以下のgithubリポジトリから、sht31.pyをダウンロードします。
micropython-sht31
https://github.com/kfricke/micropython-sht31

sht31.pyのURL
https://github.com/kfricke/micropython-sht31/blob/master/sht31.py

/libフォルダが無い場合は、Thonny IDEでRaspberry Pi Pico側の/直下にlibフォルダを作成します(/lib)。そのあと、/libフォルダにsht31.pyをアップロードします。

3. 温度・湿度計測を行うプログラムの導入
以下のMicroPythonをRaspberry Pi Picoに保存し、Thonnyから実行します。実行すると温度と湿度が表示されます。
main.py
from machine import Pin, I2C
import sht31

i2c = I2C(0, scl=Pin(21), sda=Pin(20), freq =400000)
sensor = sht31.SHT31(i2c, addr=0x45)

(temperature, humidity) = sensor.get_temp_humi()
print("temp: {}".format(temperature))
print("humidity: {}".format(humidity))

関連情報 ・Windows10にPython3.9とThonnyをインストールする

・DHT11センサーを使用して温度・湿度を計測することも出来ます。
Raspberry Pi PicoでDHT11センサーを使用して温度・湿度を取得する

2021年8月14日土曜日

OpenSCADとUltimaker Curaを使用して、Raspberry Pi PicoをLEGOブロック上に固定できるマウンタを作成する

OpenSCADとUltimaker Curaを使用して、Raspberry Pi PicoをLEGOブロック上に固定できるマウンタを作成するには以下の手順を実行します。

〇Raspberry Pi PicoをLEGOブロック上に固定できるマウンタの写真1
マウンタとRaspberry Pi PicoはM2のネジで固定しています。

〇Raspberry Pi PicoをLEGOブロック上に固定できるマウンタの写真2
Raspberry Pi Picoを固定していない状態です。

作成手順 1. OpenSCADで以下のコードを実行して形状を調整し、STLファイルにエクスポートします。
3Dプリンタの種類や設定によって、LEG_HOLE_DIAMETERで穴の半径のパラメータを微調整してください。

// Raspberry Pi Picoのベースサイズ
PICO_W=51;
PICO_D=22;

// Raspberry Pi Picoを支える足の部分
LEG_HEIGHT=4;
LEG_DISTANCE=8.2;
LEG_SIZE=4;
LEG_HOLE_DIAMETER=1.5+0.5;

// Raspberry Pi Pico固定用足のオフセット
LEG_OFFSET_W=1;
LEG_OFFSET_D=0.8;

// プレートの厚さ
PLATE_THICK=2;

// LEGOの1ブロック
LEGO_SQUARE=7.95;
// LEGOの側面の厚さ
LEGO_WALL=1.5;
// 突起の直径
LEGO_PEG=4.8;
LEGO_PEG_R=LEGO_PEG/2;
LEGO_PEG_H=2.8;
// LEGOの底面の円の直径
LEGO_BOTTOM_CIRCLE=6.4;

// プレートのサイズ(ブロック単位)
NUM_HOLE_W=7;
NUM_HOLE_D=3;

module pico_mounter_lego()
{
    // ベースプレート
    translate([0, 0, 0])
    linear_extrude(height=PLATE_THICK){
        square([LEGO_SQUARE*NUM_HOLE_W, LEGO_SQUARE*NUM_HOLE_D]);
    }

    //壁
    translate([0, 0, -LEGO_PEG_H])
    linear_extrude(height=LEGO_PEG_H){
        square([LEGO_SQUARE*NUM_HOLE_W, LEGO_WALL]);
    }

    translate([0, LEGO_SQUARE*NUM_HOLE_D-LEGO_WALL, -LEGO_PEG_H])
    linear_extrude(height=LEGO_PEG_H){
        square([LEGO_SQUARE*NUM_HOLE_W, LEGO_WALL]);
    }

    translate([0, 0, -LEGO_PEG_H])
    linear_extrude(height=LEGO_PEG_H){
        square([LEGO_WALL, LEGO_SQUARE*NUM_HOLE_D]);
    }

    translate([LEGO_SQUARE*NUM_HOLE_W-LEGO_WALL, 0, -LEGO_PEG_H])
    linear_extrude(height=LEGO_PEG_H){
        square([LEGO_WALL, LEGO_SQUARE*NUM_HOLE_D]);
    }


    for( lw = [0 : NUM_HOLE_W-2] ){
        for( ld = [0 : NUM_HOLE_D-2] ){
            translate([LEGO_SQUARE*(lw+1), LEGO_SQUARE*(ld+1), -LEGO_PEG_H])
            linear_extrude(height=LEGO_PEG_H){
                circle(LEGO_BOTTOM_CIRCLE/2, $fn=50);
            }
        }
    }
}

module pico_mounter()
{
    difference(){
        union(){
            // 底面
            translate([0, 0, 0])
            linear_extrude(height=PLATE_THICK){
                square([PICO_W, PICO_D]);
            }

            translate([LEG_OFFSET_W, PICO_D/2-LEG_DISTANCE/2-LEG_SIZE, PLATE_THICK])
            linear_extrude(height=LEG_HEIGHT){
                square([LEG_SIZE, LEG_SIZE]);
            }
            translate([LEG_OFFSET_W, PICO_D/2+LEG_DISTANCE/2, PLATE_THICK])
            linear_extrude(height=LEG_HEIGHT){
                square([LEG_SIZE, LEG_SIZE]);
            }    
            translate([PICO_W-LEG_SIZE+LEG_OFFSET_W, PICO_D/2-LEG_DISTANCE/2-LEG_SIZE, PLATE_THICK])
            linear_extrude(height=LEG_HEIGHT){
                square([LEG_SIZE, LEG_SIZE]);
            }
            translate([PICO_W-LEG_SIZE+LEG_OFFSET_W, PICO_D/2+LEG_DISTANCE/2, PLATE_THICK])
            linear_extrude(height=LEG_HEIGHT){
                square([LEG_SIZE, LEG_SIZE]);
            }
        }
        union(){
            translate([LEG_SIZE/2+LEG_OFFSET_W, PICO_D/2-LEG_DISTANCE/2-LEG_SIZE/2, 0])
            linear_extrude(height=LEG_HEIGHT+PLATE_THICK){
                circle(LEG_HOLE_DIAMETER/2, $fn=50);
            }
            translate([LEG_SIZE/2+LEG_OFFSET_W, PICO_D/2+LEG_DISTANCE/2+LEG_SIZE/2, 0])
            linear_extrude(height=LEG_HEIGHT+PLATE_THICK){
                circle(LEG_HOLE_DIAMETER/2, $fn=50);
            }
            translate([PICO_W-LEG_SIZE/2+LEG_OFFSET_W, PICO_D/2-LEG_DISTANCE/2-LEG_SIZE/2, 0])
            linear_extrude(height=LEG_HEIGHT+PLATE_THICK){
                circle(LEG_HOLE_DIAMETER/2, $fn=50);
            }
            translate([PICO_W-LEG_SIZE/2+LEG_OFFSET_W, PICO_D/2+LEG_DISTANCE/2+LEG_SIZE/2, 0])
            linear_extrude(height=LEG_HEIGHT+PLATE_THICK){
                circle(LEG_HOLE_DIAMETER/2, $fn=50);
            }
        }
    }
}

pico_mounter_lego();
translate([LEG_OFFSET_W, LEG_OFFSET_D, 0])
pico_mounter();

・OpenSCADの画面

2. Ultimaker CuraでSTLファイルを読み込み、スライスしてgcodeを保存します。

3. 3Dプリンターで印刷します

関連情報 ・OpenSCADまとめ

OpenSCADとUltimaker Curaを使用してRaspberry Pi Picoのケースを作成する

2021年7月24日土曜日

Raspberry Pi PicoにTPA2006使用D級アンプキットを接続して、wav形式のオーディオファイルを再生する

Raspberry Pi PicoにTPA2006使用D級アンプキットを接続して、wav形式のオーディオファイルを再生するには、以下の手順を実行します。

〇Raspberry Pi PicoとTPA2006使用D級アンプキット、スピーカーを接続した写真

開発手順 1. Raspberry Pi Pico以外に必要な部品の準備
以下の部品を準備します。
・TPA2006使用 超小型D級アンプキット
https://akizukidenshi.com/catalog/g/gK-08161/

・ダイナミックスピーカー 8Ω7W
https://akizukidenshi.com/catalog/g/gP-10366/

・単3電池4本が入る電池ボックス
 ※電池ボックスでは何でも良いのですが、取り外し可能にするために、以下の3つを使用しました。
 ・電池ボックス 単3×4本 スイッチ付 XHコネクタ付
 https://akizukidenshi.com/catalog/g/gP-12242/

 ・XHコネクタ ベース付ポスト トップ型 2P B2B-XH-A(LF)(SN
 https://akizukidenshi.com/catalog/g/gC-12247/

 ・16ホールユニバーサル基板(2.54mm)
 https://akizukidenshi.com/catalog/g/gP-02515/

2. 部品の接続・配線
以下の回路図のように各部品を配線します。

3. Raspberry Pi Picoに必要ライブラリのアップロード
/libフォルダが無い場合は、Thonny IDEでRaspberry Pi Pico側の/直下にlibフォルダを作成します(/lib)。
※Thonnyでのフォルダの作成・ファイルのアップロードに関しては、Raspberry Pi PicoでDHT11センサーを使用して温度・湿度を取得するを参照してください。

awesome-micropython-libプロジェクトのAudioから以下の2つのファイルをダウンロードして/libフォルダにアップロードします。
https://github.com/joeky888/awesome-micropython-lib/tree/master/Audio
chunk.py
wave.py

PicoAudioPWMプロジェクトから以下の3つのファイルをダウンロードして/libフォルダにアップロードします。
https://github.com/danjperron/PicoAudioPWM
myDMA.py
myPWM.py
wavePlayer.py

4. /soundsフォルダの作成と、wavファイルのアップロード
Raspberry Pi Pico側に/直下にsoundsフォルダを作成します(/sounds)。/soundsフォルダに再生したいwav形式のオーディオファイルをアップロードします。

5. プログラミングとオーディオ再生
以下のプログラムをmain.pyとして保存し、Thonny IDEから実行します。/soundsフォルダに配置したオーディオファイルが逐次再生されます。
import wavePlayer
import uos
player = wavePlayer.wavePlayer()

soundsFolder= "/sounds"

try:
    for file in uos.listdir(soundsFolder):
        print(soundsFolder + "/" + file)
        player.play(soundsFolder + "/" + file)
except KeyboardInterrupt:
    player.stop()

関連情報 ・OpenSCADとUltimaker Curaを使用してスピーカー用のケースを作成する

Raspberry Pi PicoでBME680センサーを使用して温度・湿度・気圧・ガスの値を取得する

2021年7月16日金曜日

Raspberry Pi PicoとGrove rotary angleセンサーを接続して、回転角度データを取得する

Raspberry Pi PicoとGrove rotary angleセンサーを接続して、回転角度データを取得するには、以下の手順を実行します。

〇Raspberry Pi PicoとGrove rotary angleセンサー・Groveスクリューターミナルを接続した写真

開発手順 1. 部品の用意と配線
Raspberry Pi Picoの他、以下の部品とジャンパー線を用意します。

・GROVE - rotary angleセンサ
※以下の様なスターターキットに含まれています
Groveスターターキット(Raspberry Pi Pico用)
https://www.switch-science.com/catalog/7103/

・Grove - スクリューターミナル
https://www.switch-science.com/catalog/7102/

スクリューターミナルを上面手前に配置したとき、以下の様にスクリューターミナルとRaspberry Pi Picoを接続します。
・GND(左から1番目の端子)をRaspberry Pi PicoのAGNDと印字されているピン(33番ピン)に接続
・VCC(左から2番目の端子)をRaspberry Pi Picoの3V3と印字されているピン(36番ピン)に接続
・D1(右から1番目の端子)をRaspberry Pi Picoの26番ピン(GP26_A0)に接続

Grove - スクリューターミナルとGROVE rotary angleセンサはGroveケーブルで接続します。

2. プログラミングと実行 ThonnyでRaspberry Pi Picoにmain.pyとして以下のプログラムを保存して、実行します。ターミナルに回転角度データ(0-65535)が表示されるのを確認します。
import machine
import time

# Raspberry Pi Picoの26ピン=ADC0
pin26 = machine.ADC(0)

while True:
    value = pin26.read_u16()
    print("rotary angle sensor:{}".format(value))
    time.sleep(1)

関連情報 ・Groveデバイスまとめ

2021年7月15日木曜日

Raspberry Pi PicoとGroveブザーを接続して、音を鳴らす

Raspberry Pi PicoとGroveブザーを接続して、音を鳴らすには、以下の手順を実行します。

〇Raspberry Pi PicoとGroveブザー・Groveスクリューターミナルを接続した写真

開発手順 1. 部品の用意と配線
Raspberry Pi Picoの他、以下の部品とジャンパー線を用意します。

・GROVE - ブザー
https://www.switch-science.com/catalog/804/

・Grove - スクリューターミナル
https://www.switch-science.com/catalog/7102/

スクリューターミナルを上面手前に配置したとき、以下の様にスクリューターミナルとRaspberry Pi Picoを接続します。
・GND(左から1番目の端子)をRaspberry Pi PicoのAGNDと印字されているピン(33番ピン)に接続
・VCC(左から2番目の端子)をRaspberry Pi Picoの3V3と印字されているピン(36番ピン)に接続
・D1(右から1番目の端子)をRaspberry Pi PicoのGP5番ピンに接続

Grove - スクリューターミナルとGROVEブザーはGroveケーブルで接続します。

2. プログラミングと実行
ThonnyでRaspberry Pi Picoにmain.pyとして以下のプログラムを保存して、実行します。2秒おきに短いブザー音がなることを確認します。
import machine
import time

PIN5 = machine.Pin(5, machine.Pin.OUT)

while True:
    # 2秒おきに短いブザー音を出力
    PIN5.value(1)
    time.sleep(0.1)
    PIN5.value(0)
    time.sleep(1.9)

関連情報 ・Groveデバイスまとめ

2021年6月28日月曜日

Raspberry Pi PicoとGrove光センサーを接続して、明るさを取得する

Raspberry Pi PicoとGrove光センサーを接続して、明るさを取得するには、以下の手順を実行します。

〇Raspberry Pi PicoとGrove光センサー・Groveスクリューターミナルを接続した写真

開発手順 1. 部品の用意と配線
Raspberry Pi Picoの他、以下の部品とジャンパー線を用意します。

・GROVE - 光センサ v1.2
https://www.switch-science.com/catalog/3284/

・Grove - スクリューターミナル
https://www.switch-science.com/catalog/7102/

スクリューターミナルを上面手前に配置したとき、以下の様にスクリューターミナルとRaspberry Pi Picoを接続します。
・GND(左から1番目の端子)をRaspberry Pi PicoのAGNDと印字されているピン(33番ピン)に接続
・VCC(左から2番目の端子)をRaspberry Pi Picoの3V3と印字されているピン(36番ピン)に接続
・D1(右から1番目の端子)をRaspberry Pi Picoの26番ピン(GP26_A0)に接続

Grove - スクリューターミナルとGROVE - 光センサーはGroveケーブルで接続します。

2. プログラミングと実行
ThonnyでRaspberry Pi Picoにmain.pyとして以下のプログラムを保存して、実行します。コンソールに明るさの値が表示されるのを確認します。
import machine 
import time

# Raspberry Pi Picoの26ピン=ADC0
pin26 = machine.ADC(0)

while True:
    value = pin26.read_u16()

    print("lightness:{}".format(value))
    time.sleep(1)

関連情報 ・Groveデバイスまとめ

2021年6月17日木曜日

Raspberry Pi Zero/Raspberry Pi PicoとLazurite MJ2001を接続して、920MHz無線で通信する

送信側のRaspberry Pi PicoとMJ2001、受信側のRaspberry Pi ZeroとMJ2001の間で通信するには、以下の手順を実行します。
今回は単にRaspberry Pi Picoでの値をカウントするメッセージをRaspberry Pi Zeroで受信します。

〇Raspberry Pi PicoとLazurite MJ2001を接続した写真

開発手順 1. 必要部品の準備
・MJ2001(Lazurite Miniシリーズ、920J後継品)
https://www.switch-science.com/catalog/7162/
※Raspberry Pi Pico/Raspberry Pi Zeroそれぞれに接続するので2台必要です。

・Lazurite Mini writer Type B(Lazurite Miniシリーズ)
https://www.switch-science.com/catalog/2956/
※MJ2001にプログラムを書き込むのに必要です。これは1台でOKです。

・ピッチ変換基板 2×5⇔1×10
https://akizukidenshi.com/catalog/g/gP-14224/
※ハーフピッチ(1.27mm)を2.54mmピッチに変換してくれる基板です。変換基板を2枚用意します。

・ピンソケット 1.27mm 2×5(10P)
https://akizukidenshi.com/catalog/g/gC-13806/
※こちらも2個用意します。

・分割ロングピンソケット 1×42 (42P)
https://akizukidenshi.com/catalog/g/gC-05779/
※10ピン分に切っておきます。

2. 2台分の変換基板の作成&Lazurite MJ2001にtest920jプログラムを書き込み
LazuriteとRaspberry Pi Pico/Raspberry Pi Zeroを接続するための変換基板を2枚作成します。変換基板の作成方法は以下を参照してください。

Raspberry Pi ZeroとLazurite MJ2001を接続して、Lazurite上の青LEDをLチカする

3. Raspberry Pi Zero側: MJ2001の接続&Serialのraspi-configでSerial Portの有効化&pipenvのインストール&pyserialのインストールされた仮想環境の作成
以下の記事を参照して、Raspberry Pi Zero側の環境を整えます。
Raspberry Pi ZeroとLazurite MJ2001を接続して、Lazurite上の青LEDをLチカする

4. Raspberry Pi Zero側: 受信プログラムの作成と実行
以下のプログラムをmj2001_recv.pyとして保存して実行します。受信側のMJ2001のアドレスを表示するので控えておきます(sggma:で始まる表示の後の16進数が受信機のアドレスです)。
import serial
import time

PANID="0x1111"

try:
    ser = serial.Serial(port='/dev/serial0',baudrate=115200,timeout=None)

    # initialize subGHz
    ser.write("sgi\n".encode("utf-8"))
    ser.flush()
    line = ser.readline()
    print("result:{}".format(line.decode('utf-8').strip()))

    # start with ch=36 and PANID=0x1111
    ser.write(("sgb,36,"+PANID+",100,20\n").encode("utf-8"))
    ser.flush()
    line = ser.readline()
    print("result:{}".format(line.decode('utf-8').strip()))

    # get my address
    ser.write("sggma\n".encode("utf-8"))
    ser.flush()
    myaddress = ser.readline().decode('utf-8').strip().split(',')[1]
    print("sggma:{}".format(myaddress))

    # get send mode
    ser.write("sggsm\n".encode("utf-8"))
    ser.flush()
    line = ser.readline()
    print("result:{}".format(line.decode('utf-8').strip()))

    # Enable Rx
    #ser.write("sgre\n".encode("utf-8"))
    ser.write("sgra\r\n".encode("utf-8"))
    ser.flush()
    line = ser.readline()
    print("result:{}".format(line.decode('utf-8').strip()))

    try:
        while True:
            rl = ser.readline()
            #print(rl)
            recv = rl.decode('utf-8').strip().split(',')
            if len(recv) >= 8 and len(recv[8]) > 0:
                print("result:{}".format(recv[8]))
    except KeyboardInterrupt:
        # close
        ser.write("sgc\n".encode("utf-8"))
        ser.flush()
        line = ser.readline()
        print("result:{}".format(line.decode('utf-8').strip()))
finally:
    ser.close()

・実行コマンド
以下のコマンドで受信プログラムを実行します。
python3 mj2001_recv.py

5. Raspberry Pi Pico側: Raspberry Pi PicoとLazurite MJ2001の接続
Raspberry Pi Picoと変換基板を以下の様に接続します。

Raspberry Pi Pico 3V3ピン(Picoを裏側・USBを上にした時、左列の上から5番目) -> 変換ピンの10番ピン
Raspberry Pi Pico GNDピン(Picoを裏側・USBを上にした時、左列の上から3番目) -> 変換ピンの8番ピン
Raspberry Pi Pico GP0/UART0 Txピン(Picoを裏側・USBを上にした時、右列の上から1番目) -> 変換ピンの1番ピン
Raspberry Pi Pico GP1/UART0 Rxピン(Picoを裏側・USBを上にした時、右列の上から2番目) -> 変換ピンの2番ピン

変換コネクタとMJ2001は2x5ピンを合わせて接続します。ピンの位置などがずれないように合わせます。

6.Raspberry Pi Pico側: MicroPythonのプログラム書き込みと実行
Thonnyで以下のMicroPythonプログラムを書き込んで実行します。dest_addrは手順4で控えた受信機のアドレスを設定します。受信側のRaspberry Pi Zeroに「count:N」のメッセージが表示されることを確認します。
import machine 
import time

PANID="0x11111"
dest_addr="0xABCD"

# initialize UART.
uart = machine.UART(0, 115200)

ct = 0
# initialize subGHz
uart.write('sgi\n')
print(uart.readline())


while True:
    # begin with ch=36,PANID=0x1111
    uart.write("sgb,36,"+PANID+",100,20\n")
    print(uart.readline())

    # send count message
    uart.write("w,count:{}    \n".format(ct))
    print(uart.readline())
    uart.write("sgs,"+PANID+","+dest_addr+"\n")
    print(uart.readline())
    
    # close
    uart.write("sgc\n")
    print(uart.readline())

    ct=ct+1
    time.sleep(1)

関連情報 ・Raspberry Pi ZeroとLazurite MJ2001を接続して、Lazurite上の青LEDをLチカする

Windows10にPython3.9とThonnyをインストールする

Raspberry Pi Picoと照度センサーモジュールで照度を測る

Raspberry Pi Picoと照度センサーモジュールで照度を測るには、以下の手順を実行します。
照度モジュールは、秋月電子さんの以下の照度センサーモジュールを使用しました。i2cでRaspberry Pi Picoと通信します。

TSL25721使用 照度センサーモジュール
https://akizukidenshi.com/catalog/g/gK-15536/

実行手順 1. ピンのハンダ付けと、Raspberry Pi Zeroへの接続
・Raspberry Pi Picoとジャンパー線で接続した照度センサーモジュール

Raspberry Pi Picoと照度センサーモジュールは以下の様に接続します(モジュールの裏面にピン略称が印刷されています)
Raspberry Pi Pico 3.3Vピン(ピン36) -> TSL25721のVIN
Raspberry Pi Pico GP0ピン(ピン1) -> TSL25721のSDA
Raspberry Pi Pico GP1ピン(ピン2) -> TSL25721のSCL
Raspberry Pi Pico GNDピン(ピン38) -> TSL25721のGND

2. プログラムの作成と実行
以下のプログラムをmain.pyファイルとしてRaspberry Pi Picoに保存して、実行します。
import time
from machine import Pin, I2C
i2c=I2C(0, scl=Pin(1), sda=Pin(0), freq=400000)

addr_tsl25721=0x39
#print(i2c.scan())
FIELD_COMMAND = 0x80 # Write
FIELD_TYPE = 0x20 #  Auto-increment protocol transaction

REG_CONTROL = 0x0F # Control Register
VAL_CONTROL_RESET = 0x00 # Reset Value for Control Register
REG_CONFIG = 0x0D # Config Register
VAL_CONFIG_RESET = 0x00 # Reset Value for Config Register
REG_ATIME = 0x01 # ATIME(ALS time) Register
VAL_ATIME_C64 = 0xC0 # INTEG_CYCLE=64, Time=175ms
REG_ENABLE = 0x00 # Enable Register
VAL_ENABLE_PON = 0x01 # Power ON
VAL_ENABLE_AEN = 0x02 # ALS Enable
VAL_ENABLE = VAL_ENABLE_PON | VAL_ENABLE_AEN

REG_C0DATA = 0x14 # CH0 ADC low data register

# Initialize
# Reset Control Register
buf = bytearray(1)

buf[0] = VAL_CONTROL_RESET
i2c.writeto_mem(addr_tsl25721, FIELD_COMMAND | FIELD_TYPE | REG_CONTROL, buf)

# Reset Config Register
buf[0] = VAL_CONFIG_RESET
i2c.writeto_mem(addr_tsl25721, FIELD_COMMAND | FIELD_TYPE | REG_CONFIG, buf)

# Set ALS time
buf[0] = VAL_ATIME_C64
i2c.writeto_mem(addr_tsl25721, FIELD_COMMAND | FIELD_TYPE | REG_ATIME, buf)

# Power on and enable ALS
buf[0] = VAL_ENABLE
i2c.writeto_mem(addr_tsl25721, FIELD_COMMAND | FIELD_TYPE | REG_ENABLE, buf)
time.sleep(1)

def read_lux():
  atime = 0xC0 # 192
  gain = 1.0

  dat = i2c.readfrom_mem(addr_tsl25721, FIELD_COMMAND | FIELD_TYPE | REG_C0DATA, 4)
  adc0 = (dat[1] << 8) | dat[0]
  adc1 = (dat[3] << 8) | dat[2] 

  cpl = (2.73 * (256 - atime) * gain)/(60.0)
  lux1 = ((adc0 * 1.00) - (adc1 * 1.87)) / cpl
  lux2 = ((adc0 * 0.63) - (adc1 * 1.00)) / cpl
  lux = 0
  if ((lux1 <= 0) and (lux2 <= 0)) :
    lux = 0
  if (lux1 > lux2) :
    lux = lux1
  elif (lux1 < lux2) :
    lux = lux2

  return lux

while True:
  lux= read_lux()
  print("lux:{:.1f}".format(lux))
  time.sleep(1)

2021年6月16日水曜日

Raspberry Pi PicoとGrove温度センサーを接続して、温度を取得する

Raspberry Pi PicoとGrove温度センサーを接続して、温度を取得するには、以下の手順を実行します。

〇Raspberry Pi PicoとGrove温度センサー・Groveスクリューターミナルを接続した写真

開発手順 1. 部品の用意と配線
Raspberry Pi Picoの他、以下の部品とジャンパー線を用意します。

・GROVE - 温度センサ
https://www.switch-science.com/catalog/806/

・Grove - スクリューターミナル
https://www.switch-science.com/catalog/7102/

スクリューターミナルを上面手前に配置したとき、以下の様にスクリューターミナルとRaspberry Pi Picoを接続します。
・GND(左から1番目の端子)をRaspberry Pi PicoのAGNDと印字されているピン(33番ピン)に接続
・VCC(左から2番目の端子)をRaspberry Pi Picoの3V3と印字されているピン(36番ピン)に接続
・D1(右から1番目の端子)をRaspberry Pi Picoの26番ピン(GP26_A0)に接続

Grove - スクリューターミナルとGROVE - 温度センサはGroveケーブルで接続します。

2. プログラミングと実行
ThonnyでRaspberry Pi Picoにmain.pyとして以下のプログラムを保存して、実行します。ターミナルに温度が表示されるのを確認します。
import machine
import time
import math

# Raspberry Pi Picoの26ピン=ADC0
pin26 = machine.ADC(0)

while True:
    value = pin26.read_u16()
    r = 100000.0 * (65535.0 / value - 1.0)
    temperature = 1.0 / (math.log10(r / 100000.0) / 4275.0 + 1 / 298.15) - 273.15

    print("temp:{:.2f}".format(temperature))
    time.sleep(1)

関連情報 ・Groveデバイスまとめ

2021年6月13日日曜日

Raspberry Pi PicoでBME680センサーを使用して温度・湿度・気圧・ガスの値を取得する

Raspberry Pi PicoでBME680センサーを使用して温度・湿度・気圧・ガスの値を取得するには、以下の手順を実行します。

〇Raspberry Pi PicoとBME680センサーを接続した写真

作成手順 1. 部品の用意
以下の部品を用意します。

・BME680センサーモジュール
BME680は秋月電子さんの「BME680使用 温湿度・気圧・ガスセンサモジュールキット」を使用しました。
https://akizukidenshi.com/catalog/g/gK-14469/

2. Raspberry Pi PicoとBME680センサーモジュールを配線します
BME680のVINピン -> Raspberry Pi Picoの3.3Vピン
BME680のSCLピン -> Raspberry Pi PicoのGP1番ピン
BME680のSDAピン -> Raspberry Pi PicoのGP0番ピン
BME680のGNDピン -> Raspberry Pi PicoのGNDピン

3. MicroPython用「bme680」モジュールの導入
Thonnyを利用する場合、bme680モジュールのインストールは以下の手順を実行します。

3-1.MicroPython用のbme680モジュールのダウンロード
robert-hhさんが公開している以下のページからCode -> Download ZIPを選択して、モジュールのソースコードをダウンロードします。
ZIPファイルをダウンロード後、解凍しておきます。
https://github.com/robert-hh/BME680-Micropython

3-2.bme680.pyのアップロード
Thonnyの「表示」メニューから→「ファイル」を選択します。Rapberry Pi Pico側に/libフォルダがなければ、ペイン下側のフォルダで右クリックメニューから[ New Directory...」を選択し、フォルダ名を入力して/libフォルダを作成します。

フォルダ作成ダイアログ

3.3.ローカルPCのフォルダ内のPythonモジュールをアップロード
Raspberry Pi Pico側の/libフォルダに移動後(左側ペインの下のlibフォルダをダブルクリックで移動)、ローカルPCのフォルダにあるbme680.pyで右クリックメニューから「upload to /lib」を選択してモジュールのライブラリをアップロードします。

4. プログラミングとプログラムのアップロード
以下のプログラムをmain.pyとしてRaspberry Pi Picoに保存して、実行します。実行後3秒おきに温度・湿度・気圧・ガスの値を取得できることを確認します。
main.py
from bme680 import *
from machine import I2C, Pin
import time
scl = Pin(1)
sda = Pin(0)
bme = BME680_I2C(I2C(0, scl=scl, sda=sda))

while True:
    print("Temp:{}, Humidity:{}, Pressure:{}, Gas:{}".format(bme.temperature, bme.humidity, bme.pressure, bme.gas))
    time.sleep(3)

Raspberry Pi PicoでDHT11センサーを使用して温度・湿度を取得する

Raspberry Pi PicoでDHT11センサーを使用して温度・湿度を取得するには、以下の手順を実行します。

〇Raspberry Pi PicoとDHT11センサーを接続した写真

開発手順 1. 部品の用意
以下の部品を用意します。

・DHT11センサーモジュール
DHT11温湿度モジュール(Temperature and Humidity Sensor)
https://akizukidenshi.com/catalog/g/gM-07040/

2. Raspberry Pi PicoとDHT11センサーモジュールを配線します
DHT11のDigitalピンへ(付属ケーブルの緑) -> Raspberry Pi PicoのGP28ピン
DHT11のGNDへ(付属ケーブルの黒) -> Raspberry Pi PicoのGNDピン
DHT11のVへ(付属ケーブルの赤) -> Raspberry Pi Picoの3V3(OUT)ピン(36番ピン)

3. Raspberry Pi用「dht」モジュールの導入
Thonnyを利用する場合、dht11モジュールのインストールは以下の手順を実行します。

3-1.Raspberry Pi Pico用のdhtモジュールのダウンロード
ikornaselurさんが公開している以下のページからCode -> Download ZIPを選択して、モジュールのソースコードをダウンロードします。
ZIPファイルをダウンロード後、解凍しておきます。
https://github.com/ikornaselur/pico-libs

3-2.dht11.pyのアップロード
Thonnyの「表示」メニューから→「ファイル」を選択します。Rapberry Pi Pico側に/libフォルダがなければ、ペイン下側のフォルダで右クリックメニューから「New Directory...」を選択し、フォルダ名を入力して/libフォルダを作成します。

フォルダ作成ダイアログ

3.3.ローカルPCのフォルダ内のPythonモジュールをアップロード
Raspberry Pi Pico側の/libフォルダに移動後(左側ペインの下のlibフォルダをダブルクリックで移動)、ローカルPCのフォルダにあるdht11.pyで右クリックメニューから「upload to /lib」を選択してモジュールのライブラリをアップロードします(dht.pyはpico-libs-master/src/dht11にあります)。

4. プログラミングとプログラムのアップロード
以下のプログラムをmain.pyとしてRaspberry Pi Picoに保存して、実行します。実行後2秒おきに温度・湿度を取得できることを確認します。
main.py
import time
from machine import Pin
from dht import DHT11, InvalidChecksum

time.sleep(1)
dht11 = DHT11(Pin(28))

while True:
    try:
        print("temp: {}".format(dht11.temperature))
        print("humidity: {}".format(dht11.humidity))
    except InvalidChecksum:
        print("invalid checksum")
    time.sleep(2)

※プログラムを実行したときに、「InvalidPulseCount: Expected 84 but got 0 pulses」という例外が発生する場合は、Raspberry Pi Pico上に保存した/lib/dht11.pyを開いて、_send_init_signal関数のutime.sleep_ms(50)をutime.sleep_ms(250)に変更します。
    def _send_init_signal(self):
        self._pin.init(Pin.OUT, Pin.PULL_DOWN)
        self._pin.init(Pin.OUT)
        self._pin.value(1)
        #utime.sleep_ms(50)
        utime.sleep_ms(250)
        self._pin.value(0)
        utime.sleep_ms(18)

2021年6月8日火曜日

OpenSCADとUltimaker Curaを使用してRaspberry Pi Picoのケースを作成する

OpenSCADとUltimaker Curaを使用して、Raspberry Pi Picoのケースを作成するには以下の手順を実行します。

〇Raspberry Pi Picoのケース/フタ

作成手順 1. OpenSCADで以下のコードを実行して形状を調整し、STLファイルにエクスポートします。
・ケース部分のOpenSCADコード
// Raspberry Pi Picoのベースサイズ
PICO_W=52;
PICO_D=22;

PICO_PIN_D=4;
PICO_PIN_H=9;

HOLE_SPACE_W = 2;
HOLE_SPACE_D = 4;

WALL_THICK=2;

WALL_H=16;

MICROUSB_D=9;

BOARD_THICK=1;

LEG_HEIGHT=1;
LEG_DISTANCE=8;
LEG_SIZE=3;
LEG_HOLE_DIAMETER=1.5+0.5;
LEG_OFFSET_W=1;

module pico_base()
{
    difference(){
        union(){
            // 底面
            translate([0, HOLE_SPACE_D, 0])
            linear_extrude(height=PICO_PIN_H){
                square([PICO_W, PICO_D-HOLE_SPACE_D*2]);
            }

            translate([LEG_OFFSET_W, PICO_D/2-LEG_DISTANCE/2-LEG_SIZE, PICO_PIN_H])
            linear_extrude(height=LEG_HEIGHT){
                square([LEG_SIZE, LEG_SIZE]);
            }
            translate([LEG_OFFSET_W, PICO_D/2+LEG_DISTANCE/2, PICO_PIN_H])
            linear_extrude(height=LEG_HEIGHT){
                square([LEG_SIZE, LEG_SIZE]);
            }    
            translate([PICO_W-LEG_SIZE-LEG_OFFSET_W, PICO_D/2-LEG_DISTANCE/2-LEG_SIZE, PICO_PIN_H])
            linear_extrude(height=LEG_HEIGHT){
                square([LEG_SIZE, LEG_SIZE]);
            }
            translate([PICO_W-LEG_SIZE-LEG_OFFSET_W, PICO_D/2+LEG_DISTANCE/2, PICO_PIN_H])
            linear_extrude(height=LEG_HEIGHT){
                square([LEG_SIZE, LEG_SIZE]);
            }
        }
        union(){
            translate([LEG_SIZE/2+LEG_OFFSET_W, PICO_D/2-LEG_DISTANCE/2-LEG_SIZE/2, LEG_HEIGHT])
            linear_extrude(height=PICO_PIN_H){
                circle(LEG_HOLE_DIAMETER/2, $fn=50);
            }
            translate([LEG_SIZE/2+LEG_OFFSET_W, PICO_D/2+LEG_DISTANCE/2+LEG_SIZE/2, LEG_HEIGHT])
            linear_extrude(height=PICO_PIN_H){
                circle(LEG_HOLE_DIAMETER/2, $fn=50);
            }
            translate([PICO_W-LEG_SIZE/2-LEG_OFFSET_W, PICO_D/2-LEG_DISTANCE/2-LEG_SIZE/2, LEG_HEIGHT])
            linear_extrude(height=PICO_PIN_H){
                circle(LEG_HOLE_DIAMETER/2, $fn=50);
            }
            translate([PICO_W-LEG_SIZE/2-LEG_OFFSET_W, PICO_D/2+LEG_DISTANCE/2+LEG_SIZE/2, LEG_HEIGHT])
            linear_extrude(height=PICO_PIN_H){
                circle(LEG_HOLE_DIAMETER/2, $fn=50);
            }
        }
    }
}

module pico_wall()
{
    // microusb
    translate([-WALL_THICK, -WALL_THICK, 0])
    linear_extrude(height=WALL_H){
        square([WALL_THICK, (PICO_D-MICROUSB_D)/2+WALL_THICK]);
    }
    translate([-WALL_THICK, (PICO_D-MICROUSB_D)/2, 0])
    linear_extrude(height=PICO_PIN_H+BOARD_THICK){
        square([WALL_THICK, MICROUSB_D]);
    }
    translate([-WALL_THICK, (PICO_D-MICROUSB_D)/2+MICROUSB_D, 0])
    linear_extrude(height=WALL_H){
        square([WALL_THICK, (PICO_D-MICROUSB_D)/2+WALL_THICK]);
    }

    translate([0, -WALL_THICK, 0])
    linear_extrude(height=WALL_H){
        square([PICO_W, WALL_THICK]);
    }

    translate([0, PICO_D, 0])
    linear_extrude(height=WALL_H){
        square([PICO_W, WALL_THICK]);
    }

    translate([PICO_W, -WALL_THICK, 0])
    linear_extrude(height=WALL_H){
        square([WALL_THICK, PICO_D+WALL_THICK*2]);
    }

}

pico_base();
pico_wall();

・フタ部分のOpenSCADコード
// Raspberry Pi Picoのベースサイズ
PICO_W=52;
PICO_D=22;

WALL_THICK=2;
WALL_H=2;

module nano_lid()
{
    translate([-WALL_THICK, -WALL_THICK, 0])
    linear_extrude(height=WALL_H){
        square([PICO_W+WALL_THICK*2, PICO_D+WALL_THICK*2]);
    }

    translate([0, 0, WALL_H])
    linear_extrude(height=WALL_H){
        square([PICO_W, PICO_D]);
    }

}

nano_lid();

〇OpenSCADの画面(ケース)

〇OpenSCADの画面(フタ)

2. Ultimaker CuraでSTLファイルを読み込み、スライスしてgcodeを保存します。

3. 3Dプリンターで印刷します

関連情報 ・そのほかの3Dプリンターを活用した記事は以下を参照してください。
OpenSCADまとめ

2021年5月28日金曜日

Raspberry Pi Picoとpico displayで1文字ごとに色を変えて描画する

MicroPythonでpico displayに1文字だけを描画するcharacterメソッドが用意されています。ここでは、繰り返しcharacterメソッドを使用して各文字で色の異なるように描画します。

〇Raspberry Pi Picoとpico displayの写真

実行手順 ※既に実行環境が整っている場合は手順1-3は飛ばしてください。
1. Raspberry Pi Picoとpico displayを接続します(pico displayの裏にUSBコネクタの絵が印刷されているので、Raspberry Pi PicoのUSBと向きを合わせます)。
pico displayは秋月電子で購入しました。
Pico Display Pack
https://akizukidenshi.com/catalog/g/gM-16238/

2. piromoni-picoのリポジトリの最新releaseのuf2ファイルをダウンロードする
https://github.com/pimoroni/pimoroni-pico/releases
※2021/05/08時点では、以下のファイルが最新でした。
pimoroni-pico-v0.1.5-micropython-v1.15.uf2

3. BOOTSELボタンを接続しながら、パソコンにUSBケーブルで接続します
2でダウンロードしたuf2ファイルをコピーします。

4. Thonnyで以下のプログラムをRaspberry Pi Picoにmain.pyとして保存して、実行します。
import utime
import picodisplay

# initialize
buf = bytearray(picodisplay.get_width() * picodisplay.get_height() * 2)
picodisplay.init(buf)

# clear background
picodisplay.set_pen(0, 0, 0)
picodisplay.clear()

characters = [
    [ord('A'), 255, 0, 0],
    [ord('B'), 0, 255, 0],
    [ord('C'), 0, 0, 255]
]

px=50
py=40
for ch in characters:
    picodisplay.set_pen(ch[1], ch[2], ch[3])
    picodisplay.character(ch[0], px, py, 8)
    px+=50
picodisplay.update()

characterメソッドで文字コードとX/Y座標と文字の大きさを指定します。

関連情報 ・Raspberry Pi Picoとpico displayで文字列を表示する

Raspberry Pi Picoとpico displayで水玉模様を描画する

Raspberry Pi Picoとpico displayで市松模様を描画する

Raspberry Pi Picoとpico displayでフルカラーLEDを光らせる

Raspberry Pi Picoとpico displayでバックライトの明るさを変更する

Raspberry Pi Picoとpico displayでボタンの状態を取得する

2021年5月27日木曜日

Raspberry Pi Picoとpico displayで水玉模様を描画する

MicroPythonでpico displayに円を描画するcircleメソッドが用意されています。ここでは、繰り返しcircleメソッドを使用して水玉模様を描画します。

〇Raspberry Pi Picoとpico displayの写真

実行手順 ※既に実行環境が整っている場合は手順1-3は飛ばしてください。
1. Raspberry Pi Picoとpico displayを接続します(pico displayの裏にUSBコネクタの絵が印刷されているので、Raspberry Pi PicoのUSBと向きを合わせます)。
pico displayは秋月電子で購入しました。
Pico Display Pack
https://akizukidenshi.com/catalog/g/gM-16238/

2. piromoni-picoのリポジトリの最新releaseのuf2ファイルをダウンロードする https://github.com/pimoroni/pimoroni-pico/releases
※2021/05/08時点では、以下のファイルが最新でした。
pimoroni-pico-v0.1.5-micropython-v1.15.uf2

3. BOOTSELボタンを接続しながら、パソコンにUSBケーブルで接続します
2でダウンロードしたuf2ファイルをコピーします。

4. Thonnyで以下のプログラムをRaspberry Pi Picoにmain.pyとして保存して、実行します。
import utime
import picodisplay

# initialize
buf = bytearray(picodisplay.get_width() * picodisplay.get_height() * 2)
picodisplay.init(buf)

px=0
py=0
space=20
radius=8
while py < picodisplay.get_height():
    while px < picodisplay.get_width():
        pat = ((py/space)%2+(px/space)%2)%2
        if pat == 0:
            picodisplay.set_pen(0, 0, 0)
        else:
            picodisplay.set_pen(128, 128, 255)
        picodisplay.circle(px, py, radius)
        px += space
    px = 0
    py += space
picodisplay.update()

circleメソッドでX/Y座標と半径を指定します。

関連情報 ・Raspberry Pi Picoとpico displayで文字列を表示する

Raspberry Pi Picoとpico displayで1文字ごとに色を変えて描画する

Raspberry Pi Picoとpico displayで市松模様を描画する

Raspberry Pi Picoとpico displayでフルカラーLEDを光らせる

Raspberry Pi Picoとpico displayでバックライトの明るさを変更する

Raspberry Pi Picoとpico displayでボタンの状態を取得する

2021年5月26日水曜日

Raspberry Pi Picoとpico displayで市松模様を描画する

MicroPythonでpico displayに四角形を描画するrectangleメソッドが用意されています。ここでは、繰り返しrectangleメソッドを使用して市松模様を描画します。

〇Raspberry Pi Picoとpico displayの写真

実行手順 ※既に実行環境が整っている場合は手順1-3は飛ばしてください。
1. Raspberry Pi Picoとpico displayを接続します(pico displayの裏にUSBコネクタの絵が印刷されているので、Raspberry Pi PicoのUSBと向きを合わせます)。
pico displayは秋月電子で購入しました。
Pico Display Pack
https://akizukidenshi.com/catalog/g/gM-16238/

2. piromoni-picoのリポジトリの最新releaseのuf2ファイルをダウンロードする
https://github.com/pimoroni/pimoroni-pico/releases
※2021/05/08時点では、以下のファイルが最新でした。
pimoroni-pico-v0.1.5-micropython-v1.15.uf2

3. BOOTSELボタンを接続しながら、パソコンにUSBケーブルで接続します
2でダウンロードしたuf2ファイルをコピーします。

4. Thonnyで以下のプログラムをRaspberry Pi Picoにmain.pyとして保存して、実行します。
import utime
import picodisplay

# initialize
buf = bytearray(picodisplay.get_width() * picodisplay.get_height() * 2)
picodisplay.init(buf)

px=0
py=0
sx=16
sy=16
while py < picodisplay.get_height():
    while px < picodisplay.get_width():
        pat = ((py/sx)%2+(px/sy)%2)%2
        if pat == 0:
            picodisplay.set_pen(0, 0, 100)
        else:
            picodisplay.set_pen(200, 200, 0)
        picodisplay.rectangle(px, py, sx, sy)
        px += sx
    px = 0
    py += sy
picodisplay.update()

rectangleメソッドでX/Y座標と幅・高さを指定します。

関連情報 ・Raspberry Pi Picoとpico displayで文字列を表示する

Raspberry Pi Picoとpico displayで1文字ごとに色を変えて描画する

Raspberry Pi Picoとpico displayで水玉模様を描画する

Raspberry Pi Picoとpico displayでフルカラーLEDを光らせる

Raspberry Pi Picoとpico displayでバックライトの明るさを変更する

Raspberry Pi Picoとpico displayでボタンの状態を取得する

2021年5月25日火曜日

Raspberry Pi Picoとpico displayでボタンの状態を取得する

MicroPythonでpico displayについているA/B/X/Yボタンの状態を取得する事が出来ます。今回は押されたボタンの文字をディスプレイに表示します。

実行手順 ※既に実行環境が整っている場合は手順1-3は飛ばしてください。
1. Raspberry Pi Picoとpico displayを接続します(pico displayの裏にUSBコネクタの絵が印刷されているので、Raspberry Pi PicoのUSBと向きを合わせます)。
pico displayは秋月電子で購入しました。
Pico Display Pack
https://akizukidenshi.com/catalog/g/gM-16238/

2. piromoni-picoのリポジトリの最新releaseのuf2ファイルをダウンロードする
https://github.com/pimoroni/pimoroni-pico/releases
※2021/05/08時点では、以下のファイルが最新でした。
pimoroni-pico-v0.1.5-micropython-v1.15.uf2

3. BOOTSELボタンを接続しながら、パソコンにUSBケーブルで接続します
2でダウンロードしたuf2ファイルをコピーします。

4. Thonnyで以下のプログラムをRaspberry Pi Picoにmain.pyとして保存して、実行します。
import utime
import picodisplay

# initialize
buf = bytearray(picodisplay.get_width() * picodisplay.get_height() * 2)
picodisplay.init(buf)


while True:
    # clear background
    picodisplay.set_pen(0, 0, 0)
    picodisplay.clear()
    picodisplay.set_pen(255, 255, 255)

    message = ''
    # A button
    if picodisplay.is_pressed(picodisplay.BUTTON_A):
        message += 'A'
    # B button
    if picodisplay.is_pressed(picodisplay.BUTTON_B):
        message += 'B'
    # X button
    if picodisplay.is_pressed(picodisplay.BUTTON_X):
        message += 'X'
    # Y button
    if picodisplay.is_pressed(picodisplay.BUTTON_Y):
        message += 'Y'
    picodisplay.text(message, 4, 4, picodisplay.get_width(), 5)
    picodisplay.update()
    utime.sleep_ms(1000)

is_pressedメソッドでボタンの状態を取得します。状態を取得するボタンの指定は引数としてBUTTON_A/BUTTON_B/BUTTON_X/BUTTON_Yを渡します。

関連情報 ・Raspberry Pi Picoとpico displayで文字列を表示する

Raspberry Pi Picoとpico displayで1文字ごとに色を変えて描画する

Raspberry Pi Picoとpico displayで水玉模様を描画する

Raspberry Pi Picoとpico displayで市松模様を描画する

Raspberry Pi Picoとpico displayでフルカラーLEDを光らせる

Raspberry Pi Picoとpico displayでバックライトの明るさを変更する

2021年5月22日土曜日

Raspberry Pi Picoと赤外線受信モジュールとサーボモーターで赤外線リモコンカーを作成する

Raspberry Pi Picoと赤外線受信モジュールとサーボモーターを組み合わせて、赤外線リモコンカーを作成します。電源はエネループ3本と5V出力昇圧DCDCコンバーターを使用します。

〇赤外線リモコンカーの写真

作成手順 1. 電子部品の準備
以下の電子部品を準備します
・Raspberry Pi Pico ベーシックセット
https://akizukidenshi.com/catalog/g/gK-16149/

・5V出力昇圧DCDCコンバーター
https://akizukidenshi.com/catalog/g/gK-13065/

・赤外線リモコン受信モジュールOSRB38C9AA(2個入)
https://akizukidenshi.com/catalog/g/gI-04659/

・オプトサプライ赤外線リモコン
https://akizukidenshi.com/catalog/g/gM-07245/

・360°連続回転サーボ(ローテーションサーボ) SG90-HV
https://akizukidenshi.com/catalog/g/gM-14382/
左右それぞれに使用するので2つ用意します。

・電池ボックス 単3×3本 リード線
https://akizukidenshi.com/catalog/g/gP-02667/

以下は配線用のジャンパー線です。必須ではないですが、あると便利です。
・コネクタ付コード 3P (黒赤黄)
https://akizukidenshi.com/catalog/g/gC-15384/

・ブレッドボード・ジャンパーワイヤ(オス-メス) 15cm(赤) (10本入)
https://akizukidenshi.com/catalog/g/gC-08933/

・ブレッドボード・ジャンパーワイヤ(オス-メス) 15cm(黒) (10本入)
https://akizukidenshi.com/catalog/g/gC-08932/

・ブレッドボード・ジャンパーワイヤ(オス-メス) 15cm(黄) (10本入)
https://akizukidenshi.com/catalog/g/gC-08936/

・ブレッドボード・ジャンパー延長ワイヤ(メス-メス) 15cm赤 (10本入)
https://akizukidenshi.com/catalog/g/gP-03474/

・ブレッドボード・ジャンパー延長ワイヤ(メス-メス) 15cm黒 (10本入)
https://akizukidenshi.com/catalog/g/gP-03475/

以下は、5V出力昇圧DCDCコンバーターとの接続用基板の部品として使用しました。必要に応じて使用してください。
・ICソケット ( 6P)
https://akizukidenshi.com/catalog/g/gP-08616/

・ピンヘッダ 2×40 (80P)
https://akizukidenshi.com/catalog/g/gC-00082/

・両面スルーホールガラスコンポジット・ユニバーサル基板 Fタイプ
https://akizukidenshi.com/catalog/g/gP-12731/

2. 電子回路の配線
以下の回路図に基づいて、配線します。

※赤外線受光モジュールとRaspberry Pi Picoとの接続は以下の様に行います。
OSRB38C9AAのピン配列を受光面&足を下にした面から見て、
OSRB38C9AAの左側のピン -> Raspberry Pi PicoのGP0ピン
OSRB38C9AAの中央のピン -> Raspberry Pi PicoのGNDピン
OSRB38C9AAの右側のピン -> Raspberry Pi Picoの3V3(OUT)ピン(36番ピン)

※サーボモータとRaspberry Pi Picoとの接続は以下の様に行います
SG90-HVの赤い線 -> 5V出力昇圧DCDCコンバーターのOUT端子
SG90-HVの茶色線 -> 5V出力昇圧DCDCコンバーターのGND端子
SG90-HVの黄色線 -> Raspberry Pi PicoのGP2またはGP4ピン

※5V出力昇圧DCDCコンバーターとRaspberry Pi Picoの接続は以下の様に行います
Raspberry Pi PicoのVSYS -> 5V出力昇圧DCDCコンバーターのOUT端子
Raspberry Pi PicoのGND -> 5V出力昇圧DCDCコンバーターのGND端子

〇結線を行った電子回路の写真

3. リモコンカーの部品の準備
以下の部品または相当するものを準備します。

・TAMIYAユニバーサルプレート (2枚セット)
https://www.tamiya.com/japan/products/70157/index.html

・TAMIYAトラックタイヤセット (36mm径)
https://www.tamiya.com/japan/products/70101/index.html

・OpenSCADとUltimaker Curaを使用して、サーボモーターにつける事ができるホイールを作成する https://serverarekore.blogspot.com/2021/05/openscadultimaker-cura.html

・自在ゴム車
※ホームセンターで大きさにもよりますが、以下の様な自在ゴム車が70円~100円位で手に入ります。

・3Dプリンタで作成したタミヤのユニバーサルプレートとRaspberry Pi Picoを固定する部品
作成方法については以下を参照してください。
OpenSCADとUltimaker Curaを使用して、タミヤのユニバーサルプレートにRaspberry Pi Picoを固定する事のできるマウンタを作成する

・3Dプリンタで作成したタミヤのユニバーサルプレートとサーボモーターを固定する部品
作成方法については以下を参照してください。
OpenSCADとUltimaker Curaを使用して、タミヤのユニバーサルプレート用のサーボモーター固定部品を作る

・低頭タイプのM3ネジとナット
TAMIYAのユニバーサルプレートに合うネジのM3のネジ・ナットを用意します。

4. 赤外線リモコンカーの作成
以下の様に、3Dプリントした部品をユニバーサルプレートにつけます。電池ボックスも穴が空いているので、低頭M3ネジとナットを使用してユニバーサルプレートに固定します。Raspberry Pi Picoとユニバーサルプレートの固定は、上記で作成した3Dプリンタのマウンタを使用します。
下から見た場合、以下のように固定します。

5. プログラミング
Thonnyを使用して、以下のプログラムをRaspberry Pi Picoに書き込みます。
import time
from machine import Pin, PWM
from ir_rx.nec import NEC_8

keydata = {
0xD8:"Power button",
0xF8:"A button",
0x78:"B button",
0x58:"C button",
0xB1:"Upper left button",
0xA0:"Up button",
0x21:"Upper right button",
0x10:"Left button",
0x20:"Center button",
0x80:"Right button",
0x11:"Bottom left button",
0x00:"Down button",
0x81:"Bottom right button",
0xFF:"N/A"
}
last_code=0xFF

def callback(data, addr, ctrl):
    global last_code
    if data < 0:  # repeat code
        print(keydata[last_code])
    else:
        last_code = data
        print(keydata[data])
    if last_code == 0xA0: # Up button -> foward
        pos=20
        servo1.duty_u16(int((1.5 + (pos / 180)) * 65535 / 20 + 0.5))
        pos=-20
        servo2.duty_u16(int((1.5 + (pos / 180)) * 65535 / 20 + 0.5))
        time.sleep_ms(1000)
        pos=0
        servo1.duty_u16(int((1.5 + (pos / 180)) * 65535 / 20 + 0.5))
        servo2.duty_u16(int((1.5 + (pos / 180)) * 65535 / 20 + 0.5))
    elif last_code == 0x00: # Down button -> Back
        pos=-20
        servo1.duty_u16(int((1.5 + (pos / 180)) * 65535 / 20 + 0.5))
        pos=20
        servo2.duty_u16(int((1.5 + (pos / 180)) * 65535 / 20 + 0.5))
        time.sleep_ms(1000)
        pos=0
        servo1.duty_u16(int((1.5 + (pos / 180)) * 65535 / 20 + 0.5))
        servo2.duty_u16(int((1.5 + (pos / 180)) * 65535 / 20 + 0.5))
    elif last_code == 0x10:    # Left button -> turn left
        pos=-20
        servo1.duty_u16(int((1.5 + (pos / 180)) * 65535 / 20 + 0.5))
        pos=-20
        servo2.duty_u16(int((1.5 + (pos / 180)) * 65535 / 20 + 0.5))
        time.sleep_ms(1000)
        pos=0
        servo1.duty_u16(int((1.5 + (pos / 180)) * 65535 / 20 + 0.5))
        servo2.duty_u16(int((1.5 + (pos / 180)) * 65535 / 20 + 0.5))
    elif last_code == 0x80:    # Right button -> turn right
        pos=20
        servo1.duty_u16(int((1.5 + (pos / 180)) * 65535 / 20 + 0.5))
        pos=20
        servo2.duty_u16(int((1.5 + (pos / 180)) * 65535 / 20 + 0.5))
        time.sleep_ms(1000)
        pos=0
        servo1.duty_u16(int((1.5 + (pos / 180)) * 65535 / 20 + 0.5))
        servo2.duty_u16(int((1.5 + (pos / 180)) * 65535 / 20 + 0.5))

6. Raspberry Pi Picoリモコンカーの動作確認
単3電池3本を電池ボックスに挿入し、赤外線リモコンを使用して動作を確認します。
上ボタンで全身・左ボタンで左旋回・右ボタンで右旋回。下ボタンで後進します。

関連情報 ・OpenSCADとUltimaker Curaを使用して、タミヤのユニバーサルプレートにRaspberry Pi Picoを固定する事のできるマウンタを作成する

OpenSCADとUltimaker Curaを使用して、サーボモーターにつける事ができるホイールを作成する

OpenSCADとUltimaker Curaを使用して、タミヤのユニバーサルプレート用のサーボモーター固定部品を作る

2021年5月21日金曜日

KiCADにRaspberry Pi Picoのシンボルを追加する

KiCADにRaspberry Pi Picoのシンボルを追加するには、以下の手順を実行します。

シンボル追加手順 1. ライブラリファイルのダウンロード
任意の場所に、ライブラリファイルをダウンロードします。
wget https://github.com/blippy/rpi/raw/master/pico/kicad/pico_rp2040.dcm

wget https://github.com/blippy/rpi/raw/master/pico/kicad/pico_rp2040.lib

2. ライブラリの追加
Eeschemaを起動してPreferencesメニューからManage Symbol Libraries...を選択します。次に、Symbol LibrariesダイアログのGlobal Librariesタブの一覧の下の+ボタンをクリックして、任意のニックネームを入力し、libファイルを選択します。

3. 確認
EeschemaでRaspberry Pi Picoのシンボルが利用できることを確認します。

関連情報 ・Githubリポジトリ
https://github.com/blippy/rpi/tree/master/pico/kicad

2021年5月20日木曜日

Raspberry Pi Picoとpico displayでフルカラーLEDを光らせる

MicroPythonでpico displayのフルカラーLEDを光らせる事が出来ます。赤・緑・青・白の順に繰り返して点灯します。

〇Raspberry Pi Picoとpico displayの写真

実行手順 ※既に実行環境が整っている場合は手順1-3は飛ばしてください。
1. Raspberry Pi Picoとpico displayを接続します(pico displayの裏にUSBコネクタの絵が印刷されているので、Raspberry Pi PicoのUSBと向きを合わせます)。
pico displayは秋月電子で購入しました。
Pico Display Pack
https://akizukidenshi.com/catalog/g/gM-16238/

2. piromoni-picoのリポジトリの最新releaseのuf2ファイルをダウンロードする
https://github.com/pimoroni/pimoroni-pico/releases
※2021/05/08時点では、以下のファイルが最新でした。
pimoroni-pico-v0.1.5-micropython-v1.15.uf2

3. BOOTSELボタンを接続しながら、パソコンにUSBケーブルで接続します
2でダウンロードしたuf2ファイルをコピーします。

4. Thonnyで以下のプログラムをRaspberry Pi Picoにmain.pyとして保存して、実行します。
import utime
import picodisplay

# initialize
buf = bytearray(picodisplay.get_width() * picodisplay.get_height() * 2)
picodisplay.init(buf)

# clear background
picodisplay.set_pen(0, 0, 0)
picodisplay.clear()
picodisplay.update()

while True:
    # red
    picodisplay.set_led(255, 0, 0)
    utime.sleep_ms(1000)
    # green
    picodisplay.set_led(0, 255, 0)
    utime.sleep_ms(1000)
    # blue
    picodisplay.set_led(0, 0, 255)
    utime.sleep_ms(1000)
    # white
    picodisplay.set_led(255, 255, 255)
    utime.sleep_ms(1000)
set_ledメソッドでR, G, Bの値を0-255の範囲で指定します。

関連情報 ・Raspberry Pi Picoとpico displayで文字列を表示する

Raspberry Pi Picoとpico displayで1文字ごとに色を変えて描画する

Raspberry Pi Picoとpico displayで水玉模様を描画する

Raspberry Pi Picoとpico displayで市松模様を描画する

Raspberry Pi Picoとpico displayでバックライトの明るさを変更する

Raspberry Pi Picoとpico displayでボタンの状態を取得する

2021年5月13日木曜日

Raspberry Pi Picoとpico displayでバックライトの明るさを変更する

MicroPythonでpico displayのバックライトの明るさを変更する事が出来ます。今回は水色っぽい背景をバックライトで明るくしたり暗くしたりを繰り返すプログラムを作成します。

〇Raspberry Pi Picoとpico displayの写真

実行手順 ※既に実行環境が整っている場合は手順1-3は飛ばしてください。
1. Raspberry Pi Picoとpico displayを接続します(pico displayの裏にUSBコネクタの絵が印刷されているので、Raspberry Pi PicoのUSBと向きを合わせます)。
pico displayは秋月電子で購入しました。
Pico Display Pack
https://akizukidenshi.com/catalog/g/gM-16238/

2. piromoni-picoのリポジトリの最新releaseのuf2ファイルをダウンロードする
https://github.com/pimoroni/pimoroni-pico/releases
※2021/05/06時点では、以下のファイルが最新でした。
pimoroni-pico-v0.1.4-micropython-v1.15.uf2

3. BOOTSELボタンを接続しながら、パソコンにUSBケーブルで接続します
2でダウンロードしたuf2ファイルをコピーします。

4. Thonnyで以下のプログラムをRaspberry Pi Picoにmain.pyとして保存して、実行します。
import utime
import picodisplay

# initialize
buf = bytearray(picodisplay.get_width() * picodisplay.get_height() * 2)
picodisplay.init(buf)

# clear background
picodisplay.set_pen(200, 220, 255)
picodisplay.clear()

backlight=[0.0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9,
    1.0, 0.9, 0.8, 0.7, 0.6, 0.5, 0.4, 0.3, 0.2, 0.1]

# change brightness of backlight...
while True:
    for brightness in backlight:
        picodisplay.set_backlight(brightness)
        picodisplay.update()
        utime.sleep_ms(200)

set_backlightメソッドで0.0から1.0の値を指定して、バックライトの明るさを指定します。

関連情報 ・Raspberry Pi Picoとpico displayで文字列を表示する

Raspberry Pi Picoとpico displayで1文字ごとに色を変えて描画する

Raspberry Pi Picoとpico displayで水玉模様を描画する

Raspberry Pi Picoとpico displayで市松模様を描画する

Raspberry Pi Picoとpico displayでフルカラーLEDを光らせる

Raspberry Pi Picoとpico displayでボタンの状態を取得する

Лучший частный хостинг