LoginSignup
0
0

More than 1 year has passed since last update.

wiringpiを使ってデイジーチェーン用のデータ送信する際にハマったこと

Last updated at Posted at 2022-09-08

デイジーチェーンで繋いでいたモータードライバー(L6470)にデータを送るときに、
wiringpiを用いたときの書き方がわからずにハマってました。

RPi.GPIOでCSのpinをLOW → データ送信 → CSのpinをHIGH の方法もありますが、
WiringPiを使うパターンだと記述量が少なくて済む。

結論:シフトする数に合わせてstruct.pack()の引数を整える

import wiringpi as wp
import struct

SPI_CH = 0
SPI_HZ = 100000

# SPI データ送信
def send(SPI_CH, byte_ary_1, byte_ary_2):
    # バイト配列には[0x10, 0xc0, 0x15], [0x10, 0x00, 0x21]などが来るものと仮定します
    # バイト配列の中の個数が違うときは事前に0x00で埋めて配列数を最大数に合わせています
    byte_len = len(byte_ary_1)

    for i in range(byte_len):

        # デイジーチェーンの時は各モーターへの値を1バイトずつのパックにするのがミソ
        #(ドライバによるかも)
        # なお、データは押し出される形でシフトするので、データの順番に注意

        mosi = struct.pack("BB", byte_ary_2[i], byte_ary_1[i])  # ←ここで各バイトをパックする

        # 1台なら mosi=struct.pack("B", ary) 
        # 2台なら mosi=struct.pack("BB", ary1, ary2)

        wp.wiringPiSPIDataRW(SPI_CH, mosi)

if __name__ == "__main__":
    wp.wiringPiSPISetup(SPI_CH,SPI_HZ)
    send(SPI_CH, [<任意のバイト配列>], [<任意のバイト配列>] )

structのpythonドキュメントページ

やり方が分かればこれだけのことだったんですけどね。
あとはバイト配列の中身の数が異なるときや、データ取得するときなどは送信するバイト配列数にも気をつけましょう。

0
0
4

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0