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をインストールする

0 件のコメント:

コメントを投稿