質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

91.36%

  • Raspberry Pi

    467questions

    Raspberry Piは、ラズベリーパイ財団が開発した、名刺サイズのLinuxコンピュータです。 学校で基本的なコンピュータ科学の教育を促進することを意図しています。

RaspberryPiのSPI通信について

解決済

回答 1

投稿 2017/12/07 18:16

  • 評価
  • クリップ 1
  • VIEW 73

Ryupe

score 4

具体的な問題の内容

--まず、回路関係やプログラミング関係に関しては初心者であることを先に申し上げておきます。--

RaspberryPiのSPI通信でステッピングモーターを動かし装置を動作させようとしています。
現在はRaspberryPiでモーターを動かす練習をしています。

今回、RaspberryPi単体でステッピングモーターを6つ動かしたいと思っています。モーターはそれぞれ違う動きをします。


モーター:バイポーラ ステッピングモーターSM-42BYG011
ドライバ:L6470使用 ステッピングモータードライブキット

ピン位置

直面した問題

RaspberryPiの「SPIO CS0」と「SPIO CS1」の2ピンに対してドライバー6個とモーターを6個つなげようとした時にピンが足りなくなってしまう事態に気が付きました。そこで何か解決策はないのかと模索中ですが、今ひとつです。

ピンが足りないことをカバーできる部品や方法はないでしょうか?
例えばRaspberryPiを2つ追加し、3つのRaspberryPiを同期させながらモーターを制御するなどでも可能でしょうか?

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+1

spi通信というのはmosi,miso,sclkは共通です。
それだと誰と通信してるか判断できないので、
通信相手一つ一つに固有のcs(チップセレクト)をつなげて識別します。
通信したい相手のcsだけLレベルにすることでその相手と通信するという取り決めです。

そういうわけなので、別にcsは専用ピンでなくても比較的簡単に代用できます。

SPI通信の大まかな手順は

  1. CSを下げる
  2. SCLKを動かしながらデータを送受信する(再現が難しい)
  3. CSを上げる

となります
SPI通信をやってくれる関数があったとすると、この手順を勝手にやってくれるわけです。

ですので、CSをGPIOで代用する場合

  1. GPIOを下げる
  2. 適当なダミーのチャンネルでSPI通信の関数を呼ぶ
  3. GPIOを上げる

とすれば、動きは再現できます。
ただし、ダミーで使ったCSも同時に下がってしまうので、このCSは繋がないでおく必要があります。

投稿 2017/12/07 19:17

編集 2017/12/07 20:42

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/12/07 19:46

    回答ありがとうございます。

    つまりCSピンが足りない分をGPIOピンで代用して通信ができるということですね?
    私はPython3のwiringPiでプログラムを書いています。
    その場合どのようなコーディングをすると実現できるのでしょうか?
    今、私が作成途中のコードをそのまま丸投げで以下に(すみません。。)
    ---------------------------------
    #!/usr/bin/env python
    # -*- coding: utf-8 -*-

    import wiringpi2 as wp
    import time
    import struct
    import sys

    L6470_SPI_SPEED = 1000000

    # PIN の設定
    BUSY_PIN_0 = 21
    wp.wiringPiSetupGpio()
    io = wp.GPIO(wp.GPIO.WPI_MODE_GPIO)
    io.pinMode(BUSY_PIN_0,io.INPUT)
    #io.digitalWrite(8,io.LOW)
    print("***OK SET PIN***")


    def L6470_write(channel, data):
    bydata = struct.pack("B", data)
    print(bydata)

    wp.wiringPiSPIDataRW(channel, bydata)


    def RESET():
    L6470_write(0, 0x00)
    L6470_write(0, 0x00)
    L6470_write(0, 0x00)
    L6470_write(0, 0x00)
    L6470_write(0, 0xc0)

    def SETUP():
    #ACC加速係数
    L6470_write(0, 0x05)
    L6470_write(0, 0x00)
    L6470_write(0, 0x10)

    #MAX_SPEED設定
    L6470_write(0, 0x09)
    #L6470_write(0, 0x00)
    L6470_write(0, 0x10)


    def L6470_MOVE(channel,n_step):
    # 方向検出。
    if (n_step < 0):
    dir = 0x40
    stp = -1 * n_step
    else:
    dir = 0x41
    stp = n_step

    # 送信バイトデータ生成。
    stp_h = (0x3F0000 & stp) >> 16
    stp_m = (0x00FF00 & stp) >> 8
    stp_l = (0x0000FF & stp)

    # コマンド(レジスタアドレス)送信。
    L6470_write(channel, dir)
    # データ送信。
    L6470_write(channel, stp_h)
    L6470_write(channel, stp_m)
    L6470_write(channel, stp_l)

    while( io.digitalRead(pin) == 0 ):
    pass


    if __name__=="__main__":

    wp.wiringPiSPISetup (0, L6470_SPI_SPEED)
    RESET()
    print("***OK RESET***")

    SETUP()
    print("***OK SET UP***")

    #正転せよ
    L6470_MOVE(0, 35000)

    キャンセル

  • 2017/12/07 20:27

    足りない分ではなく、cs全部です。

    正規のcsは通信の際に操作されてしまうので。

    対象のcsとなるgpioを下げる
    spi通信する
    済んだら下げたgpioを上げる

    キャンセル

  • 2017/12/07 20:52

    ちなみに6本もGPIO使うのはちょっと・・・という場合は
    デコーダ(例えばhttp://www.tij.co.jp/jp/lit/ds/symlink/cd54hc154.pdf)を使うという手があります。

    キャンセル

  • 2017/12/07 22:32

    なるほど。
    出来るならラズパイのみで完結させたいので、前者の方法を選ばせてもらいます。

    ありがとうございました。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

ただいまの回答率

91.36%

関連した質問

同じタグがついた質問を見る

  • Raspberry Pi

    467questions

    Raspberry Piは、ラズベリーパイ財団が開発した、名刺サイズのLinuxコンピュータです。 学校で基本的なコンピュータ科学の教育を促進することを意図しています。