ステッピングモーターを回したい!
ステッピングモーター関連を触ろうとすると高いんですよね・・・なんで、なんとか秋月で買えるもので。
というわけでFT232HとL6470を使ってWindowsからUSB、SPI経由でステッピングモーターを回してみようと思います。
なーんも考えることはありません。ピンアサインに従ってSPIをつなぎます。FT232H基板はUSB電源で、L6470基板は独自に12V電源をつなぎます。なんで、2枚の基板間ではGNDはつなぎますが、電源はつなぎません。
写真ではモーターはつないでませんが、動かすときには右側のコネクタにモーターをつなぎます。まぁ、当たり前ですね。
で、次にWindows上での環境セットアップ。Pythonをインストールして、FT232Hを使うための環境を構築します。すでにまとめてくださってる方がいらっしゃるので、こちらを参考にしてもらったほうが早いでしょう。FT232Hのメーカーのページもリンクしておく。
まぁ、簡単に書くと、
- FDTI社のサイトからチップドライバーをとってきてインストール
- Zadigを使ってドライバーを入れ替える
- Pythonをインストールする
- pyftdiをGit公開されているものに入れ替える
- pipでAdafruit / Blinkaをインストールする
こんな感じ。
で、この記事のポイントはここから。
FT232Hで記事を探すと GPIO を使う話がひじょーに多くて、次にI2Cの記事が出てくる。SPIをやってる人がほとんど見つからなかったので、この記事を書いてます。
まずは、ソースをどーん!
from pyftdi.spi import SpiController
spi = SpiController()
spi.configure('ftdi://ftdi:232h:1/1')
dev=spi.get_port(cs=0, freq=12E3, mode=0)
# GetStatus CMD
dev.exchange([0xd0])
val1 = dev.exchange([], 1)
val = 0
val = val1[0] << 8
val1 = dev.exchange([], 1)
val = val | val1[0]
print("Status : %04x" % val)
こんな感じです。
前半4行がFT232HでSPIを使うための初期化部分。後半8行は L6470 の Status レジスターを読みだす処理です。
SPI に関する初期化は FTDI 社のライブラリにお任せです。特に3行目のURLっぽい指定方法は知らなきゃわかんねーよって言いたい書き方ですね。
で、次に L6470 のアクセス処理。ここが割と特殊です。
L6470 は仕様でコマンド 0xd0 を 1Byte 書き込むと、2Byte 使ってステータスレジスターの値を返してきます。
で、その書き方がポイント。
FTDIライブラリのサンプルとかに従って書くと、
val = dev.exchange([0xd0], 2)
と書くはずなんですが、これだと動きません。この時のSPIの波形がこんな感じです。
上からSPICLK、(FT232Hからみて)SPIOUT、SPIIN、SPICSです。
なぜかSPIOUTで書き込んだコマンド波形がそのままSPIINにエコーバックしてます。なぜなのか分かりませんが、こういう仕様のようです。
上記の正しく動くコードだと、こんな波形になります。
違いはSPICSの動き。8bit おきにCS が Diassert されてます。まぁ、実はデータシートに「各バイト送信ごとにCSをHにしろ」って書いてあるので、ちゃんと読めっていうだけの話なんですけどね。
最後におまけ。
from pyftdi.spi import SpiController
spi = SpiController()
spi.configure('ftdi://ftdi:232h:1/1')
dev=spi.get_port(cs=0, freq=12E3, mode=0)
speed = 45000
cmd = 0x50
dev.exchange([cmd])
val = (speed & 0xff0000) >> 16
dev.exchange([val])
val = (speed & 0x00ff00) >> 8
dev.exchange([val])
val = (speed & 0x0000ff)
dev.exchange([val])
とりあえずモーターを定速で回転させるスクリプトです。
内容はデータシートみて読み解いてください(を
このスクリプトを実行したときのSPIはこんな感じ。
コメントする