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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Raspberry Pi

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

Q&A

解決済

1回答

18861閲覧

RaspberryPiのSPI通信について

Ryupe

総合スコア426

Raspberry Pi

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

1グッド

2クリップ

投稿2017/12/07 09:16

###具体的な問題の内容
--まず、回路関係やプログラミング関係に関しては初心者であることを先に申し上げておきます。--

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

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


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

ピン位置

直面した問題

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

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

退会済みユーザー👍を押しています

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

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 10:17

編集2017/12/07 11:42
ozwk

総合スコア13521

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Ryupe

2017/12/07 10: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)
ozwk

2017/12/07 11:27

足りない分ではなく、cs全部です。 正規のcsは通信の際に操作されてしまうので。 対象のcsとなるgpioを下げる spi通信する 済んだら下げたgpioを上げる
ozwk

2017/12/07 11:52

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

2017/12/07 13:32

なるほど。 出来るならラズパイのみで完結させたいので、前者の方法を選ばせてもらいます。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問