コメント
秋月のモーター
こんばんは。
秋月のモーター購入されたんですね!!
どうです?spinelifyさんの感触は??
秋月のモーター購入されたんですね!!
どうです?spinelifyさんの感触は??
使ってみての感想
バイポーラを1つも持っていなかったので勢いで購入しました。 くっついているタイミングプーリをどう活用しようか迷っています。
今まで回していたステッピングモータよりはコイル抵抗が少ないので、力強く回せそうです。
あまり試していませんが、高速回転できていないのが悩みどころです。今のところ1秒に4回転ぐらい?です。 あきらひとし様はバイポーラでどのぐらいまで回せましたか?
今まで回していたステッピングモータよりはコイル抵抗が少ないので、力強く回せそうです。
あまり試していませんが、高速回転できていないのが悩みどころです。今のところ1秒に4回転ぐらい?です。 あきらひとし様はバイポーラでどのぐらいまで回せましたか?
ごめんなさい。卑怯です。
2160rpmです。。ごめんなさい。。ある意味、ドーピングみたいなものです。。、
もちろんトルクはありません。
http://woodcnc300.blog.fc2.com/blog-entry-425.html
の記事に詳細は書いてあります。。
まだ、販売開始から1年も経ってない三洋セミコンダクタ製のLV8727を記事では使用しました。また、東芝セミコンダクタ製のTB6600HGでも、多分同じくらい回ると思います。。
これ以上の回転数を望むならコントローラーをCPLDにして、モータードライバ自体を自作しなければ、今のところ手段はないと思われます。
L6470では、まだ回してませんが、低抵抗なモーターはもしかしたらL6470さんは苦手なのかも。。
あ、そのステッピングモーター、ユニポーラにも出来そうですよ?なんなら、8芯にでも。。
もちろんトルクはありません。
http://woodcnc300.blog.fc2.com/blog-entry-425.html
の記事に詳細は書いてあります。。
まだ、販売開始から1年も経ってない三洋セミコンダクタ製のLV8727を記事では使用しました。また、東芝セミコンダクタ製のTB6600HGでも、多分同じくらい回ると思います。。
これ以上の回転数を望むならコントローラーをCPLDにして、モータードライバ自体を自作しなければ、今のところ手段はないと思われます。
L6470では、まだ回してませんが、低抵抗なモーターはもしかしたらL6470さんは苦手なのかも。。
あ、そのステッピングモーター、ユニポーラにも出来そうですよ?なんなら、8芯にでも。。
な・ん・だ・と!
おおぉぅ…!
恥ずかしながらその記事を見逃していました。既に分解してバイポーラシリアルとパイポーラパラレルで実験済みと・・・素晴らしい。
2160rpmですか・・・。そんなに回せるんですね^^;。ドライバが違うにしろその回転数は予想外です。パイポーラは高速に回らないと聞いていたので、もっと低く予想してました。
私が低抵抗なモータが苦手と言うよりも、L6470を使いこなせて無いだけのような気がします。頑張れL6470…。
L6470だと電流制限で無い分、高速回転時には電圧を高めに設定しなければならないかもしれません(低速だとモータが焼けてしまうので今までやっていませんでした)。
>ユニポーラにも出来そうですよ?なんなら、8芯にでも。。
なんですと!・・・でもユニポーラ持っているので大丈夫。バイポーラで頑張ります。
恥ずかしながらその記事を見逃していました。既に分解してバイポーラシリアルとパイポーラパラレルで実験済みと・・・素晴らしい。
2160rpmですか・・・。そんなに回せるんですね^^;。ドライバが違うにしろその回転数は予想外です。パイポーラは高速に回らないと聞いていたので、もっと低く予想してました。
私が低抵抗なモータが苦手と言うよりも、L6470を使いこなせて無いだけのような気がします。頑張れL6470…。
L6470だと電流制限で無い分、高速回転時には電圧を高めに設定しなければならないかもしれません(低速だとモータが焼けてしまうので今までやっていませんでした)。
>ユニポーラにも出来そうですよ?なんなら、8芯にでも。。
なんですと!・・・でもユニポーラ持っているので大丈夫。バイポーラで頑張ります。
結構常識は覆されるものです。
(^^)
普通じゃ、ないですよ?多分。。
私の思考だと、ステッピングモーターは電気的にバランスの悪いブラシレスモーターってイメージなので、逆に言えば回らないほうが???だったわけです。←バイポーラ。
高回転で回ってますが、回っているだけ(実用トルクは無い)、なので、用途としてはプロペラつけて扇風機くらいにしかなりませんよ~。
FETのON抵抗がとても小さくなった(反応がよくなった)ので、可能な事だと思います。
SLA707xもかなり前のICですが、能力は非常に高いICです。
L6470,燃やさないように電流電圧に気をつけてチャレンジしてくださいね。。
私はL6470の駆動周波数変更まで、できませんでしたがT.T
普通じゃ、ないですよ?多分。。
私の思考だと、ステッピングモーターは電気的にバランスの悪いブラシレスモーターってイメージなので、逆に言えば回らないほうが???だったわけです。←バイポーラ。
高回転で回ってますが、回っているだけ(実用トルクは無い)、なので、用途としてはプロペラつけて扇風機くらいにしかなりませんよ~。
FETのON抵抗がとても小さくなった(反応がよくなった)ので、可能な事だと思います。
SLA707xもかなり前のICですが、能力は非常に高いICです。
L6470,燃やさないように電流電圧に気をつけてチャレンジしてくださいね。。
私はL6470の駆動周波数変更まで、できませんでしたがT.T
はい、高速回転すればするほどトルクがなくなるのは重々承知しています。私はまだ240rpmで脱調してしますので、限界は500ぐらいかな?と勝手に思ってました。なので2160rpmの結果は予想外でした。L6470は導入が難しいですね。
L6470の駆動周波数変更でしたら、OSCINピンとOSCOUTピンに24Mhzか32Mhzの発振子をつける。もしくは、外部クロックをOSCINピンに入力しコントロールコマンドSetParam(PARAM,VALUE)でCONFIGレジスタの値を変更してあげればいいですよ。私の公開したスケッチだと、
L6470_setparam_config(val);
でできます。引数valはデータシートの9,1,21の項目をみればわかると思います。(多分これでいけるはずです)
L6470の駆動周波数変更でしたら、OSCINピンとOSCOUTピンに24Mhzか32Mhzの発振子をつける。もしくは、外部クロックをOSCINピンに入力しコントロールコマンドSetParam(PARAM,VALUE)でCONFIGレジスタの値を変更してあげればいいですよ。私の公開したスケッチだと、
L6470_setparam_config(val);
でできます。引数valはデータシートの9,1,21の項目をみればわかると思います。(多分これでいけるはずです)
スケッチの説明有り難うございます。
今しばらく試してみることはできませんが、やってみます。
今しばらく試してみることはできませんが、やってみます。
こんにちは!
L6470を購入し、ステッピングモーターを回そうとして ググッたところ、貴HPに来ました。L6470用のライブラリは https://github.com/ameyer/Arduino-L6470にもあります。
貴コマンドとこのライブラリの根本的な違いは、貴コマンドではPIN_BUSYを用いてwhile(!digitalRead(PIN_BUSY)){}//BUSYが解除されるまで待機させているのに対し、上記のライブラリを使ったスケッチでは 各コマンドごとにgetStatus()でリセットをかけてBusy状態が解除されるのを待機しているようです。
実際に二つ別々に回し 比べればいいのでしょうけれども、PIN_BUSYを用いる利点について教えていただけないでしょうか?
よろしくお願いします。
L6470を購入し、ステッピングモーターを回そうとして ググッたところ、貴HPに来ました。L6470用のライブラリは https://github.com/ameyer/Arduino-L6470にもあります。
貴コマンドとこのライブラリの根本的な違いは、貴コマンドではPIN_BUSYを用いてwhile(!digitalRead(PIN_BUSY)){}//BUSYが解除されるまで待機させているのに対し、上記のライブラリを使ったスケッチでは 各コマンドごとにgetStatus()でリセットをかけてBusy状態が解除されるのを待機しているようです。
実際に二つ別々に回し 比べればいいのでしょうけれども、PIN_BUSYを用いる利点について教えていただけないでしょうか?
よろしくお願いします。
カエルのおじさんはじめまして。
L6470用のライブラリが既にあることを知りませんでした。
URL先のライブラリを確認したところ、通信によりBUSYピンの状態を確認しています。私のライブラリ場合は、配線によりBUSYピンの状態を確認しています。どちらもやっていることは同じになります。
利点としては、私のライブラリはDigitalRead();の一文だけで処理が完了するため、処理が速く終わり、相手方のライブラリでは、通信を行い、受け取ったデータを一度処理しなければならないので、処理が遅いというところでしょうか。 処理が速いといっても、数マイクロ秒程度でしょうから、実用に差が出るほどでは無いと思います。逆にArduinoのピンを一つ消費するため、欠点が強いと思います。
どうも! 早速のご返事ありがとうございます。
当方 最終的には3台のステッピングモーターを同時に個別に制御したく思っています。
貴アイデアの「配線によりBUSYピンの状態を確認する」方法は良さそうなので 使おうと思います。その場合、MOSI, MISO, SCK, (SS, BUSY)x3 でArduinoのデジタルピンが9本塞がりますが。
先に連絡した既存ライブラリに若干の修正を加えようと思います。
このライブラリでは、ACC, DEC, MAX_SPEED, MIN_SPEED, FS_SPD, STEP_MODEの設定が直接step/sec2, step/secの値を入力すれば良いようですが、KVALのパラメータ設定はprivateになっているので Arduinoのスケッチから設定できるようにするには publicにする必要があるようです。
それで 貴コマンドとこのライブラリを見比べていて 気になったのですが、
① 貴コマンドではRESET_DEVICE 0xC0を送る前に 0x00を4回送っていますが、この4回はおまじないみたいなものなのですか?
② 貴コマンドとこのライブラリでは どちらもシリアル通信の転送速度が9600bpsになっていますが、L6470を使う上で9600にしなければいけないといった制約などはあるのでしょうか?
いろいろと教えてください。 よろしくお願いいたします。
当方 最終的には3台のステッピングモーターを同時に個別に制御したく思っています。
貴アイデアの「配線によりBUSYピンの状態を確認する」方法は良さそうなので 使おうと思います。その場合、MOSI, MISO, SCK, (SS, BUSY)x3 でArduinoのデジタルピンが9本塞がりますが。
先に連絡した既存ライブラリに若干の修正を加えようと思います。
このライブラリでは、ACC, DEC, MAX_SPEED, MIN_SPEED, FS_SPD, STEP_MODEの設定が直接step/sec2, step/secの値を入力すれば良いようですが、KVALのパラメータ設定はprivateになっているので Arduinoのスケッチから設定できるようにするには publicにする必要があるようです。
それで 貴コマンドとこのライブラリを見比べていて 気になったのですが、
① 貴コマンドではRESET_DEVICE 0xC0を送る前に 0x00を4回送っていますが、この4回はおまじないみたいなものなのですか?
② 貴コマンドとこのライブラリでは どちらもシリアル通信の転送速度が9600bpsになっていますが、L6470を使う上で9600にしなければいけないといった制約などはあるのでしょうか?
いろいろと教えてください。 よろしくお願いいたします。
Re: タイトルなし
私はC言語の初歩的な書き方しか知らないため、私のライブラリ(ただのコマンド集が正しい名称かな?)でL6470を複数動ような使い方は難しいでしょう。
質問にお答えします。
① 0x00の4回送信はArduinoのリセット時に前のコマンドを確実に終了させるためです。
例えば、座標0x012345にGOTOコマンド(0x60)で動かす場合、ArduinoからL6470に「0x60、0x01、0x23、0x45」と4回に分けて情報が送信されます。この送信途中にArduinoだけがリセットされた場合、L6470は残りの情報を待ち続けていますので、Arduinoから新しいコマンドを送っても正しく認識されません。そこで、0x00を送り埋め合わせを行います。(送りすぎた0x00はnop命令になります。) 4回必要なのは、L6470に一度に送る情報が最大で4byteだからです。
その後、すぐにRESET_DEVICEコマンドを送るので、モータは回転せず。L6470がリセットされます。
②私のスケッチ内の「Serial.begin(9600);」はL6470の制御に一切関係ないです。このシリアル通信はPCとの通信のためで、シリアルモニタでL6470の動作を動画のように、目に見える形にするのに利用しています。L6470との通信に使うSPIの速度はマイコンのクロック周波数に依存しています。詳しくはリファレンス「http://www.musashinodenpa.com/arduino/ref/」の次のページを確認してください。「SPI.setClockDivider(divider) 」
相手方のライブラリは確認していませんが、私と同じ使い方か、SPI通信の速度を制限しているのではないですか?
質問にお答えします。
① 0x00の4回送信はArduinoのリセット時に前のコマンドを確実に終了させるためです。
例えば、座標0x012345にGOTOコマンド(0x60)で動かす場合、ArduinoからL6470に「0x60、0x01、0x23、0x45」と4回に分けて情報が送信されます。この送信途中にArduinoだけがリセットされた場合、L6470は残りの情報を待ち続けていますので、Arduinoから新しいコマンドを送っても正しく認識されません。そこで、0x00を送り埋め合わせを行います。(送りすぎた0x00はnop命令になります。) 4回必要なのは、L6470に一度に送る情報が最大で4byteだからです。
その後、すぐにRESET_DEVICEコマンドを送るので、モータは回転せず。L6470がリセットされます。
②私のスケッチ内の「Serial.begin(9600);」はL6470の制御に一切関係ないです。このシリアル通信はPCとの通信のためで、シリアルモニタでL6470の動作を動画のように、目に見える形にするのに利用しています。L6470との通信に使うSPIの速度はマイコンのクロック周波数に依存しています。詳しくはリファレンス「http://www.musashinodenpa.com/arduino/ref/」の次のページを確認してください。「SPI.setClockDivider(divider) 」
相手方のライブラリは確認していませんが、私と同じ使い方か、SPI通信の速度を制限しているのではないですか?
Spinelify様、ご回答ありがとうございます。とても参考になります。
貴コマンド集も、いろいろと参考になります。
私もいろいろと調べてみましたが、ArduinoのSSピンは一つだけなので SPI通信で3台のL6470にそれぞれ別のSSを設定することはできないようです。
L6470ステッピングモータ・ドライバキットの説明書3ページ下段に書かれている「~CS信号を台数分用意して」云々はArduinoを想定したものではないようです。
3台のステッピングモータを1台のArduinoから制御する方法としては、デイジーチェーンにして接続し、例えば2台目のモータを回すには、1台目と3台目にはNOP命令を送り、2台目にはRUN命令を送ればいいようです。実際に動くかどうかまだ試していませんが、デイジーチェーンに対応したスケッチも見つけました。ただ、このスケッチだと うまく作動するとしても、同時に3台回すことはできないようです。
Arduinoで3台のステッピングモータを同時に個別に制御するのは、かなりハードルが高そうです。
貴コマンド集も、いろいろと参考になります。
私もいろいろと調べてみましたが、ArduinoのSSピンは一つだけなので SPI通信で3台のL6470にそれぞれ別のSSを設定することはできないようです。
L6470ステッピングモータ・ドライバキットの説明書3ページ下段に書かれている「~CS信号を台数分用意して」云々はArduinoを想定したものではないようです。
3台のステッピングモータを1台のArduinoから制御する方法としては、デイジーチェーンにして接続し、例えば2台目のモータを回すには、1台目と3台目にはNOP命令を送り、2台目にはRUN命令を送ればいいようです。実際に動くかどうかまだ試していませんが、デイジーチェーンに対応したスケッチも見つけました。ただ、このスケッチだと うまく作動するとしても、同時に3台回すことはできないようです。
Arduinoで3台のステッピングモータを同時に個別に制御するのは、かなりハードルが高そうです。
Re: タイトルなし
お節介かもしれませんが
> 私もいろいろと調べてみましたが、ArduinoのSSピンは一つだけなので SPI通信で3台のL6470にそれぞれ別のSSを設定することはできないようです。
ArduinoのdigitalWrite()でSSピンを3通つの役割をさせればできます。
> L6470ステッピングモータ・ドライバキットの説明書3ページ下段に書かれている「~CS信号を台数分用意して」云々はArduinoを想定したものではないようです。
出来るはずです。digitalWrite()で同時に3つのピンの出力を変えるのはできませんが、こちらを使えば、厳密に同時にCSピンの立ち上げ出来ます。http://www.musashinodenpa.com/arduino/ref/index.php?f=0&pos=850
> 3台のステッピングモータを1台のArduinoから制御する方法としては、デイジーチェーンにして接続し、例えば2台目のモータを回すには、1台目と3台目にはNOP命令を送り、2台目にはRUN命令を送ればいいようです。実際に動くかどうかまだ試していませんが、デイジーチェーンに対応したスケッチも見つけました。ただ、このスケッチだと うまく作動するとしても、同時に3台回すことはできないようです。
L6470アプリケーションノートの36、37ページを御覧ください。
http://strawberry-linux.com/pub/L6470.pdf
CSピンの状態により、L6470はSPI通信の信号をスルーして次のL6470に送ると書いてあるはずです。また、受信中8ビット以降の送られたデータは無視するはずです。これらを使えば、L6470を個別に動かしたり、同期させて動かすことが出来るはずです。
私の記憶で書きますが、3台同時に動かし始めるにはまず、DEV1のCSピンをたち下げ命令を送り、次にDEV2、最後にDVE3のCSピンをたち下げに命令を送り、最後にCSピンを同時に立ち上げればいいはずです。2代目だけ動かすには、DVE2のCSピンだけたち下げして命令を送ればいいはずです。DEV3は信号をスルーするはずです。
同時に命令を書き込むときは、DEV1→DEV3の順、getparamのときだけはDEV3→DEV1だったと思います。
> 私もいろいろと調べてみましたが、ArduinoのSSピンは一つだけなので SPI通信で3台のL6470にそれぞれ別のSSを設定することはできないようです。
ArduinoのdigitalWrite()でSSピンを3通つの役割をさせればできます。
> L6470ステッピングモータ・ドライバキットの説明書3ページ下段に書かれている「~CS信号を台数分用意して」云々はArduinoを想定したものではないようです。
出来るはずです。digitalWrite()で同時に3つのピンの出力を変えるのはできませんが、こちらを使えば、厳密に同時にCSピンの立ち上げ出来ます。http://www.musashinodenpa.com/arduino/ref/index.php?f=0&pos=850
> 3台のステッピングモータを1台のArduinoから制御する方法としては、デイジーチェーンにして接続し、例えば2台目のモータを回すには、1台目と3台目にはNOP命令を送り、2台目にはRUN命令を送ればいいようです。実際に動くかどうかまだ試していませんが、デイジーチェーンに対応したスケッチも見つけました。ただ、このスケッチだと うまく作動するとしても、同時に3台回すことはできないようです。
L6470アプリケーションノートの36、37ページを御覧ください。
http://strawberry-linux.com/pub/L6470.pdf
CSピンの状態により、L6470はSPI通信の信号をスルーして次のL6470に送ると書いてあるはずです。また、受信中8ビット以降の送られたデータは無視するはずです。これらを使えば、L6470を個別に動かしたり、同期させて動かすことが出来るはずです。
私の記憶で書きますが、3台同時に動かし始めるにはまず、DEV1のCSピンをたち下げ命令を送り、次にDEV2、最後にDVE3のCSピンをたち下げに命令を送り、最後にCSピンを同時に立ち上げればいいはずです。2代目だけ動かすには、DVE2のCSピンだけたち下げして命令を送ればいいはずです。DEV3は信号をスルーするはずです。
同時に命令を書き込むときは、DEV1→DEV3の順、getparamのときだけはDEV3→DEV1だったと思います。
Spinelify様
ありがとうございます。すごく勉強になります。
すいませんがもう少し教えてください。
①ArduinoのdigitalWrite()でSSピンを3通つの役割をさせればできます。
→申し訳ありませんが、良く分かりません。詳しく教えてください。
digitalWrite(SSPin, LOW);
SPI.transfer(val);
digitalWrite(SSPin, HIGH);
で、3つあるL6470ごとに、SSPinの番号を変えるということでしょうか?
これは試してみましたがうまくいきませんでした。
②出来るはずです。digitalWrite()で同時に3つのピンの出力を変えるのはできませんが、こちらを使えば、厳密に同時にCSピンの立ち上げ出来ます。
→”PORTD = B10101000; // デジタルピン7,5,3をHIGHに” すごく参考になります。
③L6470アプリケーションノートの36、37ページを御覧ください。
→言葉足らずですいません。
見つけたスケッチでは以下のようになっていました。
Byte dSPIN_Xfer(int device, byte data){
digitalWrite(SSPin, LOW);
for(int i = MOTOR_COOUNT -1;i>=0;i--){
if(i==device)
reply = SPI.transfer(data);
else
SPI.transfer((byte)0);
}
digitalWrite(SSPin, HIGH);
return reply;
}
これはデイジーチェーン用ですが、8ビット毎にデータを送り、所定のデバイスにはコマンドが、それ以外のデバイスにはNOPがいくようになっています。
見つけたスケッチには、モータ1を100step,モータ2を200step,モータ3を300step 同時に回せ といったコマンドはありませんでしたが、上記を参考にコマンドを作ってやれば 同時に回すことも可能だと思います。
では、申し訳ありませんが、①について詳しく教えてください。
デイジーチェーンにしないで、3つのモータを1台のArduinoで制御できたら すごいです。
ありがとうございます。すごく勉強になります。
すいませんがもう少し教えてください。
①ArduinoのdigitalWrite()でSSピンを3通つの役割をさせればできます。
→申し訳ありませんが、良く分かりません。詳しく教えてください。
digitalWrite(SSPin, LOW);
SPI.transfer(val);
digitalWrite(SSPin, HIGH);
で、3つあるL6470ごとに、SSPinの番号を変えるということでしょうか?
これは試してみましたがうまくいきませんでした。
②出来るはずです。digitalWrite()で同時に3つのピンの出力を変えるのはできませんが、こちらを使えば、厳密に同時にCSピンの立ち上げ出来ます。
→”PORTD = B10101000; // デジタルピン7,5,3をHIGHに” すごく参考になります。
③L6470アプリケーションノートの36、37ページを御覧ください。
→言葉足らずですいません。
見つけたスケッチでは以下のようになっていました。
Byte dSPIN_Xfer(int device, byte data){
digitalWrite(SSPin, LOW);
for(int i = MOTOR_COOUNT -1;i>=0;i--){
if(i==device)
reply = SPI.transfer(data);
else
SPI.transfer((byte)0);
}
digitalWrite(SSPin, HIGH);
return reply;
}
これはデイジーチェーン用ですが、8ビット毎にデータを送り、所定のデバイスにはコマンドが、それ以外のデバイスにはNOPがいくようになっています。
見つけたスケッチには、モータ1を100step,モータ2を200step,モータ3を300step 同時に回せ といったコマンドはありませんでしたが、上記を参考にコマンドを作ってやれば 同時に回すことも可能だと思います。
では、申し訳ありませんが、①について詳しく教えてください。
デイジーチェーンにしないで、3つのモータを1台のArduinoで制御できたら すごいです。
Spinelify様
返事を書いた後で、ポカをやっていたことに気づきました。
①ArduinoのdigitalWrite()でSSピンを3通つの役割をさせればできます。
→申し訳ありませんが、良く分かりません。詳しく教えてください。
digitalWrite(SSPin, LOW);
SPI.transfer(val);
digitalWrite(SSPin, HIGH);
で、3つあるL6470ごとに、SSPinの番号を変えるということでしょうか?
これは試してみましたがうまくいきませんでした。
うまくいかないはずです。L6470はまだ1台しか持っておらず、2台用のスケッチを書いて、1台のL6470だけにつないで、2台目にSPI信号を送ると何も返ってこないからダメだと思い込んでいました。
L6470を3台そろえてから試してみます。
すいませんでした。
返事を書いた後で、ポカをやっていたことに気づきました。
①ArduinoのdigitalWrite()でSSピンを3通つの役割をさせればできます。
→申し訳ありませんが、良く分かりません。詳しく教えてください。
digitalWrite(SSPin, LOW);
SPI.transfer(val);
digitalWrite(SSPin, HIGH);
で、3つあるL6470ごとに、SSPinの番号を変えるということでしょうか?
これは試してみましたがうまくいきませんでした。
うまくいかないはずです。L6470はまだ1台しか持っておらず、2台用のスケッチを書いて、1台のL6470だけにつないで、2台目にSPI信号を送ると何も返ってこないからダメだと思い込んでいました。
L6470を3台そろえてから試してみます。
すいませんでした。
Re: タイトルなし
はじめに、丸付き数字「①②③」が文字化けするのでカッコ数字「(1)(2)(3)」にしますね。
(1)について、
寝ぼけていたのか文がおかしなことになっていますね。言いたかったことは「ArduinoのSSピンはいくつでも用意できるので※、通信したいL6470に対してdigitalWrite()でCSピンを操作してあげればいいですよ」ということです。あなたの解釈で合っています。
※pinmode()で用意します。
(2)について少し補足すると、「 →”PORTD = B10101000; // デジタルピン7,5,3をHIGHに、6,4,3,2,1,0はLOWにする。」 となります。
(3)について
私がお節介でコメントした(3)は全て忘れてください。デイジーチェーン通信をおもいっきり間違っていました。デイジーチェーンについて以下のURLを参考にしてください。
http://japan.maximintegrated.com/app-notes/index.mvp/id/3947
L6470アプリケーションノートの37ページ
http://strawberry-linux.com/pub/L6470.pdf
あなたが見つけたスケッチでデイジーチェーン通信をすることが可能です。ほんの少し加筆訂正すれば使えるでしょう。CSピンの同時に立ち上げによる一斉動作を行うには、デイジーチェーン通信でなければならないようです。
ところで、参考URLの説明にあるデイジーチェーン通信の方式と、アプリケーションノートの37ページにあるタイミングダイアグラム図が一致してないように思えます。多分、表現の間違いで、実際には同じものだとは思いますが、デイジーチェーン通信に関するL6470の情報が少ないので、こればかりは実際にL6470でやってみないとわからないでしょう。
(1)について、
寝ぼけていたのか文がおかしなことになっていますね。言いたかったことは「ArduinoのSSピンはいくつでも用意できるので※、通信したいL6470に対してdigitalWrite()でCSピンを操作してあげればいいですよ」ということです。あなたの解釈で合っています。
※pinmode()で用意します。
(2)について少し補足すると、「 →”PORTD = B10101000; // デジタルピン7,5,3をHIGHに、6,4,3,2,1,0はLOWにする。」 となります。
(3)について
私がお節介でコメントした(3)は全て忘れてください。デイジーチェーン通信をおもいっきり間違っていました。デイジーチェーンについて以下のURLを参考にしてください。
http://japan.maximintegrated.com/app-notes/index.mvp/id/3947
L6470アプリケーションノートの37ページ
http://strawberry-linux.com/pub/L6470.pdf
あなたが見つけたスケッチでデイジーチェーン通信をすることが可能です。ほんの少し加筆訂正すれば使えるでしょう。CSピンの同時に立ち上げによる一斉動作を行うには、デイジーチェーン通信でなければならないようです。
ところで、参考URLの説明にあるデイジーチェーン通信の方式と、アプリケーションノートの37ページにあるタイミングダイアグラム図が一致してないように思えます。多分、表現の間違いで、実際には同じものだとは思いますが、デイジーチェーン通信に関するL6470の情報が少ないので、こればかりは実際にL6470でやってみないとわからないでしょう。
カエルのおじさんへ
カエルのおじさんへ
よくよく考えたら、SSピンを複数用意する必要はないですね。一個で十分でした。私の書いた(1)(2)も忘れてください。私の記憶違いで混乱を招いたかもしれません。すいません。
よくよく考えたら、SSピンを複数用意する必要はないですね。一個で十分でした。私の書いた(1)(2)も忘れてください。私の記憶違いで混乱を招いたかもしれません。すいません。
Spinelify様
お世話になります。
L6470とステッピングモータが3台揃いました。
まず、https://github.com/ameyer/Arduino-L6470 のライブラリに手を加えて(while(!digitalRead(BUSYPin))やbusyDelay(msec)等を借用しました。)、SSピンとBUSYピンを3つ使うスケッチを書いてみました。
moveだけでしか試していませんが、3つのモータにコマンドを送るのに要した時間は484microsecondでした。 単純に3で割ると、最初のモータにコマンドを送り 次のモータにコマンドを送るまでの時間差は 161microsecondで、私の実用には全く問題のないレベルです。
念のために、デイジーチェーンにした場合についても試してみます。
また、連絡します。
お世話になります。
L6470とステッピングモータが3台揃いました。
まず、https://github.com/ameyer/Arduino-L6470 のライブラリに手を加えて(while(!digitalRead(BUSYPin))やbusyDelay(msec)等を借用しました。)、SSピンとBUSYピンを3つ使うスケッチを書いてみました。
moveだけでしか試していませんが、3つのモータにコマンドを送るのに要した時間は484microsecondでした。 単純に3で割ると、最初のモータにコマンドを送り 次のモータにコマンドを送るまでの時間差は 161microsecondで、私の実用には全く問題のないレベルです。
念のために、デイジーチェーンにした場合についても試してみます。
また、連絡します。
Spinelify様
お世話になります。
複数のSSピンとBUSYピンを使う方法とは別に、デイジーチェーン方法のライブラリを作成し、move, run, stopを個別に指定でき、同時に開始するコマンドを作成しました。
問題なく動きましたが、moveのコマンドを送るのに要した時間は、16,520microsecon = 16.5msでした。
これも私としては問題のないレベルですが、複数のSSピンとBUSYピンを使う方法よりは大幅にコマンドを送るのに時間を要しています。
もう少し考えてみますが、複数のSSピンとBUSYピンを使う方法を採用しようと思います。厳密に言えば同時開始ではないし、Arduinoのピンを多く塞ぎますが。
いろいろとお世話になりました。お礼と云っては何ですが、今回作成したライブラリとスケッチ他をメールしておきます。
ありがとうございました。
お世話になります。
複数のSSピンとBUSYピンを使う方法とは別に、デイジーチェーン方法のライブラリを作成し、move, run, stopを個別に指定でき、同時に開始するコマンドを作成しました。
問題なく動きましたが、moveのコマンドを送るのに要した時間は、16,520microsecon = 16.5msでした。
これも私としては問題のないレベルですが、複数のSSピンとBUSYピンを使う方法よりは大幅にコマンドを送るのに時間を要しています。
もう少し考えてみますが、複数のSSピンとBUSYピンを使う方法を採用しようと思います。厳密に言えば同時開始ではないし、Arduinoのピンを多く塞ぎますが。
いろいろとお世話になりました。お礼と云っては何ですが、今回作成したライブラリとスケッチ他をメールしておきます。
ありがとうございました。
横から失礼致します。
カエルのおじさんと同様の手法で3つのL6470を一つのArduioで動かしていますが、
動作が不安定で時折意図しない挙動をし、リセットコマンドも送れなくなるという症状が出ます。
そちらでは、こういった症状は出ていませんでしょうか?
http://makonde.blog69.fc2.com/blog-entry-9.html
こちらの方はデイジーチェーンに切り替えたそうです。
カエルのおじさんと同様の手法で3つのL6470を一つのArduioで動かしていますが、
動作が不安定で時折意図しない挙動をし、リセットコマンドも送れなくなるという症状が出ます。
そちらでは、こういった症状は出ていませんでしょうか?
http://makonde.blog69.fc2.com/blog-entry-9.html
こちらの方はデイジーチェーンに切り替えたそうです。
Re: タイトルなし
加工済みチキンさん、こんにちは。
> カエルのおじさんと同様の手法で3つのL6470を一つのArduioで動かしていますが、
> 動作が不安定で時折意図しない挙動をし、リセットコマンドも送れなくなるという症状が出ます。
> そちらでは、こういった症状は出ていませんでしょうか?
すみませんが、私はL6470を一台しか持っていませんので、複数台の接続時おいての症状については、試したことがないので分かりません。一台のみの接続ですとこれといった問題は出ていません。
>http://makonde.blog69.fc2.com/blog-entry-9.html
>こちらの方はデイジーチェーンに切り替えたそうです。
私も初めからシリアル接続※が出来るものだと思っていましたが、言われてみれば確かにL6470のデータシートにはシリアル接続についての記述がないので、シリアル接続は無理なのかもしれません。 カエルのおじさんもシリアル接続を試した後にデイジーチェーン接続に移っています。シリアル接続では上手く行かなかったのだと思います。
カエルのおじさんと同様の方法というのがどの方法か分かりませんが、L6470の複数接続にはデイジーチェーン接続を使用したほうが無難だと思います。
※ http://japan.maximintegrated.com/app-notes/index.mvp/id/3947 図1の事です。
> カエルのおじさんと同様の手法で3つのL6470を一つのArduioで動かしていますが、
> 動作が不安定で時折意図しない挙動をし、リセットコマンドも送れなくなるという症状が出ます。
> そちらでは、こういった症状は出ていませんでしょうか?
すみませんが、私はL6470を一台しか持っていませんので、複数台の接続時おいての症状については、試したことがないので分かりません。一台のみの接続ですとこれといった問題は出ていません。
>http://makonde.blog69.fc2.com/blog-entry-9.html
>こちらの方はデイジーチェーンに切り替えたそうです。
私も初めからシリアル接続※が出来るものだと思っていましたが、言われてみれば確かにL6470のデータシートにはシリアル接続についての記述がないので、シリアル接続は無理なのかもしれません。 カエルのおじさんもシリアル接続を試した後にデイジーチェーン接続に移っています。シリアル接続では上手く行かなかったのだと思います。
カエルのおじさんと同様の方法というのがどの方法か分かりませんが、L6470の複数接続にはデイジーチェーン接続を使用したほうが無難だと思います。
※ http://japan.maximintegrated.com/app-notes/index.mvp/id/3947 図1の事です。
spinelify様
ご対応ありがとうございます。
<引用>もう少し考えてみますが、複数のSSピンとBUSYピンを使う方法を採用しようと思います。厳密に言えば同時開始ではないし、Arduinoのピンを多く塞ぎますが。
</引用>
と、ありますので、カエルのおじさんも図1のシリアル接続を採用したのかと思っていましたが、最終的にデイジーチェーンを採用されていたのですね。私もデイジーチェーンを試してみたいと思います。
ご対応ありがとうございます。
<引用>もう少し考えてみますが、複数のSSピンとBUSYピンを使う方法を採用しようと思います。厳密に言えば同時開始ではないし、Arduinoのピンを多く塞ぎますが。
</引用>
と、ありますので、カエルのおじさんも図1のシリアル接続を採用したのかと思っていましたが、最終的にデイジーチェーンを採用されていたのですね。私もデイジーチェーンを試してみたいと思います。
spinfly 様
結局デイジーチェーン接続は試していませんが、
現在信号のノイズを疑っています。
結局デイジーチェーン接続は試していませんが、
現在信号のノイズを疑っています。
苦戦しているようですね
加工済みチキンさんこんにちは、コメント気づかず返信遅くなりました。
> 結局デイジーチェーン接続は試していませんが、
> 現在信号のノイズを疑っています。
シリアル接続でいろいろ苦戦しているようですね。ステッピングモータの回転によっていくらかのノイズが信号線に乗りますが、L6470一台だけでノイズの影響が無いなら(正常に動くなら)、複数台にしてもノイズの影響は無いと思います。
もし、モータ電源Vsを複数のL6470で共有しているのなら、Vsが不安定になるのでそれが動作不安定、命令を受け付けない原因になっていると思います。モータ電源は別々に用意した方がいいです。
前にも言いましたが、L6470のデータシートにはシリアル接続についての記述がないので、シリアル接続は無理かもしれません。早めにデイジーチェーン接続に移行した方がいいと思います。加工済みチキンさんに紹介されたこちらのブログのhttp://makonde.blog69.fc2.com/blog-entry-9.htmlスケッチはシンプルで分かりやすく書かれているので、デイジーチェーン接続に移行するのもそれほど難しく無いと思います。
> 結局デイジーチェーン接続は試していませんが、
> 現在信号のノイズを疑っています。
シリアル接続でいろいろ苦戦しているようですね。ステッピングモータの回転によっていくらかのノイズが信号線に乗りますが、L6470一台だけでノイズの影響が無いなら(正常に動くなら)、複数台にしてもノイズの影響は無いと思います。
もし、モータ電源Vsを複数のL6470で共有しているのなら、Vsが不安定になるのでそれが動作不安定、命令を受け付けない原因になっていると思います。モータ電源は別々に用意した方がいいです。
前にも言いましたが、L6470のデータシートにはシリアル接続についての記述がないので、シリアル接続は無理かもしれません。早めにデイジーチェーン接続に移行した方がいいと思います。加工済みチキンさんに紹介されたこちらのブログのhttp://makonde.blog69.fc2.com/blog-entry-9.htmlスケッチはシンプルで分かりやすく書かれているので、デイジーチェーン接続に移行するのもそれほど難しく無いと思います。
setparam_config
後付クリスタルで24MHz駆動させたくて setparam_config で入力したのですが、うまく反映できません。
デフォルトが 0x2E88 で、0x2E86 に変更しようと
L6470_setparam_config(0x2E86);
としたのですが、serial.printで確認(getparam_config)すると、
0x3800になってしまいます。
なにか条件等あるのでしょうか?
デフォルトが 0x2E88 で、0x2E86 に変更しようと
L6470_setparam_config(0x2E86);
としたのですが、serial.printで確認(getparam_config)すると、
0x3800になってしまいます。
なにか条件等あるのでしょうか?
Re: setparam_config
> 後付クリスタルで24MHz駆動させたくて setparam_config で入力したのですが、うまく反映できません。
> デフォルトが 0x2E88 で、0x2E86 に変更しようと
>
> L6470_setparam_config(0x2E86);
>
> としたのですが、serial.printで確認(getparam_config)すると、
> 0x3800になってしまいます。
>
> なにか条件等あるのでしょうか?
私の手元には24MHzのクリスタルが無いので、16MHzのクリスタルで動作を確認しましたが、configレジスタの書き換え、読み込みに問題もなく、ステッピングモータも正しく動作しました。
ただし、configレジスタの書き換え後、クリスタルを外し、Arduinoだけをリセットした場合には、getparam_configの返り値が0x3800になりました。
このことから、クリスタルの故障、接触不良が考えられますので、そちらを確認してみてください。
その他条件として、データシートには「configレジスタの書き換えはL6470の出力がハイインピーダンスのときにしてください」と記載がありますので、その点に注意してください。電源投入時に書き換えを行えば問題ないはずです。
Re: setparam_config
アドバイスありがとうございます。
クリスタルの接触不良は直接半田付けしている為、問題ないと思います。
レジスタの書き換えがハイインピーダンスの時との事だったので、
void setup()内の digitalWrite(PIN_SPI_SS,HIGH); と L6470_resetdevice();
の間にコマンドを実行するようにしましたが、相変わらずです。
※クリスタル本体は一般的な2本足タイプですが、
4本足タイプでないといけないという事はないですか?
クリスタルの接触不良は直接半田付けしている為、問題ないと思います。
レジスタの書き換えがハイインピーダンスの時との事だったので、
void setup()内の digitalWrite(PIN_SPI_SS,HIGH); と L6470_resetdevice();
の間にコマンドを実行するようにしましたが、相変わらずです。
※クリスタル本体は一般的な2本足タイプですが、
4本足タイプでないといけないという事はないですか?
Re: Re: setparam_config
> クリスタルの接触不良は直接半田付けしている為、問題ないと思います。
了解です。(どうしても動かないときは、クリスタルの中身が壊れているかもしれません。)
> レジスタの書き換えがハイインピーダンスの時との事だったので、
> void setup()内の digitalWrite(PIN_SPI_SS,HIGH); と L6470_resetdevice();
> の間にコマンドを実行するようにしましたが、相変わらずです。
そこにコマンドを入れるとL6470_resetdevice();で初期化されてしまうので意味ないですよ。
入れるなら、void L6470_setup(){}の中に入れてください。
「ハイインピーダンスの時」とはL6470がモーターのコイルを励磁してないとき(電流を流していないとき)のことです。したがって、モーターを回転させ始める前までにするべきです。
> ※クリスタル本体は一般的な2本足タイプですが、
> 4本足タイプでないといけないという事はないですか?
私が使ったのも2本足のクリスタルです。2本でも大丈夫です。
私は半田付けはせず、手で押し当てていましたがそれでも動きました。途中で外すと回転止まったり、電流おかしくなるので、外部クロックで動いていたのは間違いないです。外部クリスタル16MHzだけどね…。
その他補足、
・L6470にロジック電源とモータ用電源を供給してから通信を行うこと。片方だけだと通信を正しく行わないので。
・L6470は電源を切ると、すべてのレジスタがリセットされる為、外部クロックへの変更コマンド等は毎回行うこと。
了解です。(どうしても動かないときは、クリスタルの中身が壊れているかもしれません。)
> レジスタの書き換えがハイインピーダンスの時との事だったので、
> void setup()内の digitalWrite(PIN_SPI_SS,HIGH); と L6470_resetdevice();
> の間にコマンドを実行するようにしましたが、相変わらずです。
そこにコマンドを入れるとL6470_resetdevice();で初期化されてしまうので意味ないですよ。
入れるなら、void L6470_setup(){}の中に入れてください。
「ハイインピーダンスの時」とはL6470がモーターのコイルを励磁してないとき(電流を流していないとき)のことです。したがって、モーターを回転させ始める前までにするべきです。
> ※クリスタル本体は一般的な2本足タイプですが、
> 4本足タイプでないといけないという事はないですか?
私が使ったのも2本足のクリスタルです。2本でも大丈夫です。
私は半田付けはせず、手で押し当てていましたがそれでも動きました。途中で外すと回転止まったり、電流おかしくなるので、外部クロックで動いていたのは間違いないです。外部クリスタル16MHzだけどね…。
その他補足、
・L6470にロジック電源とモータ用電源を供給してから通信を行うこと。片方だけだと通信を正しく行わないので。
・L6470は電源を切ると、すべてのレジスタがリセットされる為、外部クロックへの変更コマンド等は毎回行うこと。
No title
度々ありがとうございます。
まず、コマンドの順番を直しました。
ロジック電源とモータ電源を給電してから通信との事でしたので、
Arduinoの5Vから給電していたのを外部電源から給電し、やってみました。
結果、周波数変更の効果は感じられませんでしたが、変更できたようです。
できたよう・・・というのも、getparamの返り値がゼロになってしまうのです。
おそらく、arduino側16MHzに対し、L6470が24MHzなので、うまく取得出来ていないのかなと思います。(0x3800になり、制御出来ない訳ではないので。)
また、クリスタルの周波数を上げればモーター回転数(脱調までの限界)を上げられると思ってやってみたのですが、変化も無い感じでした。
(モーターの速度等設定がしっかりできていないだけかも知れませんが)
マイコンボードの制御はまだ始めたばかりで全然理解できていないのですが、
面白い反面、難しくもあり勉強になりました。
とりあえず、現状は config は0x2E88のままで使おうと思います。
色々知識を得て、再チャレンジしたいと思います。
ありがとうございました。
まず、コマンドの順番を直しました。
ロジック電源とモータ電源を給電してから通信との事でしたので、
Arduinoの5Vから給電していたのを外部電源から給電し、やってみました。
結果、周波数変更の効果は感じられませんでしたが、変更できたようです。
できたよう・・・というのも、getparamの返り値がゼロになってしまうのです。
おそらく、arduino側16MHzに対し、L6470が24MHzなので、うまく取得出来ていないのかなと思います。(0x3800になり、制御出来ない訳ではないので。)
また、クリスタルの周波数を上げればモーター回転数(脱調までの限界)を上げられると思ってやってみたのですが、変化も無い感じでした。
(モーターの速度等設定がしっかりできていないだけかも知れませんが)
マイコンボードの制御はまだ始めたばかりで全然理解できていないのですが、
面白い反面、難しくもあり勉強になりました。
とりあえず、現状は config は0x2E88のままで使おうと思います。
色々知識を得て、再チャレンジしたいと思います。
ありがとうございました。
Re: No title
9292さんへ
内部発振で行く事にしたのですね。問題が解決できなかったのは残念ですが、ここで躓いていては先に進まないのでそれが最善だと思います。
一応報告された事について返答しときます。
> ロジック電源とモータ電源を給電してから通信との事でしたので、
> Arduinoの5Vから給電していたのを外部電源から給電し、やってみました。
「L6470内蔵レギュレータを使って、モータ電源からロジック電源を供給するようにした」という解釈でいいのかな?。特に変更する必要は無かったと思いますけど、正常動作しているならここは私が気にしても仕方ないですね。次、
> 結果、周波数変更の効果は感じられませんでしたが、変更できたようです。
> できたよう・・・というのも、getparamの返り値がゼロになってしまうのです。
> おそらく、arduino側16MHzに対し、L6470が24MHzなので、うまく取得出来ていないのかなと思います。(0x3800になり、制御出来ない訳ではないので。)
SPI通信はArduino側からのクロック信号で通信を行うので、L6470が高速になっても関係ないと思います。……と思ったけど心当たりがありました。データシートに「クロックは5MHz以上にすれ」と書いたあるみたいなので、もしかしたらArduino側が早すぎたり遅すぎたりしているのかも知れない。
スケッチのSPI.setBitOrder(MSBFIRST);の次に以下の一文を付け足して見てください。
SPI.setClockDivider(SPI_CLOCK_DIV2);
これでどうにかなるかも知れない。(私は試せないので)
参照 http://www.musashinodenpa.com/arduino/ref/index.php?f=1&pos=613
> マイコンボードの制御はまだ始めたばかりで全然理解できていないのですが、
> 面白い反面、難しくもあり勉強になりました。
思った通りに行かないのがマイコン&電子工作ですよね。そのたびに時間は取られますが、解決するとうれしいですし、結構勉強になります。
ではでは、製作頑張ってくださいね。
Re: Re: No title
9292さんへ
間違えました。
「クロックは5MHz以上にすれ」ではなくて、「最大クロックは5MHz強です」でした。
SPI.setClockDivider(SPI_CLOCK_DIV2);をいれてしまうとこの範囲を超えてしまうのでだめですね。
入れるとしたら
SPI.setClockDivider(SPI_CLOCK_DIV8);
です。これを入れるとSPI通信速度は落ちますが、通信が安定するかも知れません。
間違えました。
「クロックは5MHz以上にすれ」ではなくて、「最大クロックは5MHz強です」でした。
SPI.setClockDivider(SPI_CLOCK_DIV2);をいれてしまうとこの範囲を超えてしまうのでだめですね。
入れるとしたら
SPI.setClockDivider(SPI_CLOCK_DIV8);
です。これを入れるとSPI通信速度は落ちますが、通信が安定するかも知れません。
No title
SBLから、L6480を搭載した大電流版が出ましたが、
このライブラリで動作しますでしょうか?
見たところレジスタ設定は同じようなのですが、
手元のL6480は、いまのとこ動いてないです。
このライブラリで動作しますでしょうか?
見たところレジスタ設定は同じようなのですが、
手元のL6480は、いまのとこ動いてないです。
Re: No title
データシートを比較してみましたが、通信方式やコマンドについては同じなので、ほぼそのままのライブラリで動作させることができます。
ただし、 CONFIGレジスタとSTATUSレジスタのアドレスが変化しており、新たにGATECFG1レジスタとGATECFG2レジスタが追加されているので、そこを修正しないと、今あげた4つのレジスタの読み書きはできません。それ以外は大丈夫です。
L6480がまったく動作しない原因はわかりませんが、こちらではないですか?
http://strawberry-linux.com/support/12080/1589616
これ以外では、配線間違いぐらいしか思いつきません。今一度確認してみてください。
ただし、 CONFIGレジスタとSTATUSレジスタのアドレスが変化しており、新たにGATECFG1レジスタとGATECFG2レジスタが追加されているので、そこを修正しないと、今あげた4つのレジスタの読み書きはできません。それ以外は大丈夫です。
L6480がまったく動作しない原因はわかりませんが、こちらではないですか?
http://strawberry-linux.com/support/12080/1589616
これ以外では、配線間違いぐらいしか思いつきません。今一度確認してみてください。
L6480
STBY(RESET)端子は確認してみました。
このリセット解除状態で、8mAの電力を食っているのでL6480は動いているようです。(スタンバイ中は、ほぼ0mA)
レジスタの設定やってみましたが、うまく行きません。
CONFIGのbit8 bit9あたりと
STATUS の全般かと思いますが
L6480Verのスケッチを頂けないでしょうか?
このリセット解除状態で、8mAの電力を食っているのでL6480は動いているようです。(スタンバイ中は、ほぼ0mA)
レジスタの設定やってみましたが、うまく行きません。
CONFIGのbit8 bit9あたりと
STATUS の全般かと思いますが
L6480Verのスケッチを頂けないでしょうか?
Re: L6480
L6480Verのスケッチです。これで調整してみてください。
https://dl.dropboxusercontent.com/u/64026163/L6480_SPI_stepMoter_sketch/L6480_SPI_stepMoter_sketch.zip
https://dl.dropboxusercontent.com/u/64026163/L6480_SPI_stepMoter_sketch/L6480_SPI_stepMoter_sketch.zip
L6480
URLのかんじで配線してます。
スタンバイも解除されてすんですが、動き出さないですねぇ。
スタンバイも解除されてすんですが、動き出さないですねぇ。
Re: L6480
配線はあっているように見えます。
ひとまずL6480と通信が出来るか確かめてみましょう。
以下のスケッチを書き込んで、シリアルモニターを確認してみてください。
レジスタの初期化された値が表示されるはずです。(データシートの42ページ reset Hex)
表示されるのが全て「00」もしくは「ff」ならば通信がうまくできてないです。
https://dl.dropboxusercontent.com/u/64026163/L6480_SPI_stepMoter_sketch_readtest/L6480_SPI_stepMoter_sketch_readtest.zip
ひとまずL6480と通信が出来るか確かめてみましょう。
以下のスケッチを書き込んで、シリアルモニターを確認してみてください。
レジスタの初期化された値が表示されるはずです。(データシートの42ページ reset Hex)
表示されるのが全て「00」もしくは「ff」ならば通信がうまくできてないです。
https://dl.dropboxusercontent.com/u/64026163/L6480_SPI_stepMoter_sketch_readtest/L6480_SPI_stepMoter_sketch_readtest.zip
L6480
結果は以下の様な感じです。
ひとまず、通信はできてるっぽいですねー。
0
0
0
0
8A
8A
41
0
27
29
29
29
29
408
19
29
29
0
7
8
10
7
FF
0
0
2C88
E003
ひとまず、通信はできてるっぽいですねー。
0
0
0
0
8A
8A
41
0
27
29
29
29
29
408
19
29
29
0
7
8
10
7
FF
0
0
2C88
E003
Re: L6480
通信は正しく動作していますね。
モータが動作しない原因はよくわかりませんが、GATECFG1レジスタおよびGATECFG2レジスタが関係しているような気がします。MOSFETのゲート電流が足りないのかもしれません。Igate、Tcc、Tobを増加してみてはいかがでしょうか。ひとまず、増加したものをおいておきますので試してみてください。
https://dl.dropboxusercontent.com/u/64026163/L6480_SPI_stepMoter_sketch/L6480_SPI_stepMoter_sketch101.zip
モータが動作しない原因はよくわかりませんが、GATECFG1レジスタおよびGATECFG2レジスタが関係しているような気がします。MOSFETのゲート電流が足りないのかもしれません。Igate、Tcc、Tobを増加してみてはいかがでしょうか。ひとまず、増加したものをおいておきますので試してみてください。
https://dl.dropboxusercontent.com/u/64026163/L6480_SPI_stepMoter_sketch/L6480_SPI_stepMoter_sketch101.zip
L6480
まだ、ピクリともしませんね。
通信状況は、以下をずっと吐いているんですが。
[通信開始]
0x0 0x10
0x0 0x10
0x0 0x10
0x0 0x10
0x0 0x10
0x0 0x10
0x0 0x10
0x0 0x10
0x0 0x10
0x0 0x10
0x0 0x10
0x0 0x10
0x0 0x10
0x0 0x10
以下同じ。
通信状況は、以下をずっと吐いているんですが。
[通信開始]
0x0 0x10
0x0 0x10
0x0 0x10
0x0 0x10
0x0 0x10
0x0 0x10
0x0 0x10
0x0 0x10
0x0 0x10
0x0 0x10
0x0 0x10
0x0 0x10
0x0 0x10
0x0 0x10
以下同じ。
Re: L6480
動いてないですね。
左の「0x0」は現在座標、右の「0x10」は回転速度なんですが、今はレジスタに設定された最低速度が出ています。本当は[0x00]です。これはMIN_SPEEDレジスタの12bit目が影響しているみたいです。
回らないのはサッパリわかりません。
とりあえずコマンド送信後のステータスレジスタフラグの変化を見てみましょう。これで原因がわかるかもしれません。
https://dl.dropboxusercontent.com/u/64026163/L6480_SPI_stepMoter_sketch/L6480_SPI_stepMoter_sketch_status.zip
左の「0x0」は現在座標、右の「0x10」は回転速度なんですが、今はレジスタに設定された最低速度が出ています。本当は[0x00]です。これはMIN_SPEEDレジスタの12bit目が影響しているみたいです。
回らないのはサッパリわかりません。
とりあえずコマンド送信後のステータスレジスタフラグの変化を見てみましょう。これで原因がわかるかもしれません。
https://dl.dropboxusercontent.com/u/64026163/L6480_SPI_stepMoter_sketch/L6480_SPI_stepMoter_sketch_status.zip
L6480
実行してみました。
E003のまま変わらないとこが怪しいですね。
resetdevice
E003
setup
E003
move
E003
run
E003
softstop
E003
goto
E003
run
E003
herdhiz
E003
end
E003のまま変わらないとこが怪しいですね。
resetdevice
E003
setup
E003
move
E003
run
E003
softstop
E003
goto
E003
run
E003
herdhiz
E003
end
Re: L6480
E003
私の英語の翻訳が正しければステータスの説明は以下のようになります。
ブリッジBでストールしていない。[○]
ブリッジAでストールしていない。[○]
過電流を検出していない。[○]
熱シャットダウンはしていない。[○]
ADCの低電圧イベントでない。[○]
UVLOが働いている[×]
ステップクロックモードでない。[○]
SPIでデータを受信することは可能である。[○]
モータは現在停止状態である。[○]
現在のモータの回転方向は逆転である。[○]
スイッチのターンオンイベントは発生していない。[○]
スイッチは押されていない。[○]
busyピンの状態。[○]
出力はハイインピーダンスである。[○]
○は正常と思われる項目につけています。(今の状態に合致しているも&特に問題にならないと思われるものも含む)
×は異常と思われる項目につけています。
結果からすると、モータ用電源が低すぎてUVLO保護が働いているのだと思います。L6480は直流12V以上で安定した電源が必要ですので、その辺どうですか?
私の英語の翻訳が正しければステータスの説明は以下のようになります。
ブリッジBでストールしていない。[○]
ブリッジAでストールしていない。[○]
過電流を検出していない。[○]
熱シャットダウンはしていない。[○]
ADCの低電圧イベントでない。[○]
UVLOが働いている[×]
ステップクロックモードでない。[○]
SPIでデータを受信することは可能である。[○]
モータは現在停止状態である。[○]
現在のモータの回転方向は逆転である。[○]
スイッチのターンオンイベントは発生していない。[○]
スイッチは押されていない。[○]
busyピンの状態。[○]
出力はハイインピーダンスである。[○]
○は正常と思われる項目につけています。(今の状態に合致しているも&特に問題にならないと思われるものも含む)
×は異常と思われる項目につけています。
結果からすると、モータ用電源が低すぎてUVLO保護が働いているのだと思います。L6480は直流12V以上で安定した電源が必要ですので、その辺どうですか?
L6480
あけましておめでとうございます。
年越しモーターです。
URLの通り、電圧は安定化電源から15Vぶち込んでいるのですが
なぜUVLOにひっかかるか謎ですねぇ。
年越しモーターです。
URLの通り、電圧は安定化電源から15Vぶち込んでいるのですが
なぜUVLOにひっかかるか謎ですねぇ。
re
あけましておめでとうございます。
証明写真までありがとうございます。なんで動かないのでしょうかね?私はもうお手上げです。安定化電源装置ならこの際30Vぐらい入れてみてはいかがでしょ・・・もうやってますよね。うーんわかりません。とりあえず今は寝ます。
証明写真までありがとうございます。なんで動かないのでしょうかね?私はもうお手上げです。安定化電源装置ならこの際30Vぐらい入れてみてはいかがでしょ・・・もうやってますよね。うーんわかりません。とりあえず今は寝ます。
管理人のみ閲覧できます
このコメントは管理人のみ閲覧できます
管理人のみ閲覧できます
このコメントは管理人のみ閲覧できます
管理人のみ閲覧できます
このコメントは管理人のみ閲覧できます
spd (20bit)(0.015*spd[step/s])についてご教授ください。
はじめまして、ひろいしと申します。
30年前にBASICをかじった事がある年寄です。
4年ほど前からArduinoをいじり始めた初心者です。
L6470モータドライバーを調べていてたどり着きました。
サンプルスケッチもあり、大変勉強になりました。
恥ずかしながら私の頭脳では理解できない処があります。
L6470_run(dia,spd); //指定方向に連続回転
spd (20bit)(0.015*spd[step/s])
このコマンドの引数spdの計算方法がよくわかりません
勝手なお願いで申し訳ありませんが、ご教授のほどよろしくお願いいたします。
30年前にBASICをかじった事がある年寄です。
4年ほど前からArduinoをいじり始めた初心者です。
L6470モータドライバーを調べていてたどり着きました。
サンプルスケッチもあり、大変勉強になりました。
恥ずかしながら私の頭脳では理解できない処があります。
L6470_run(dia,spd); //指定方向に連続回転
spd (20bit)(0.015*spd[step/s])
このコマンドの引数spdの計算方法がよくわかりません
勝手なお願いで申し訳ありませんが、ご教授のほどよろしくお願いいたします。
Re: spd (20bit)(0.015*spd[step/s])についてご教授ください。
すいません。コメント見逃していました。
L6470_run(dia,spd); //指定方向に連続回転 (spd (20bit)(0.015*spd[step/s])
角括弧"[] "の中身は単位です。
"[step/s]"はステップ毎秒と読んで下さい。
"0.015*spd" が速度の計算式になります。
引数spdが100(10進数)ならば、
1.5[ステップ毎秒] の速度になります。
"spd (20bit)"は引数spdの値が20bitまで入力出来るという意味です。
20bitだと「0〜1048575(10進数)」の値が入力できます。
よろしくお願いします。
L6470_run(dia,spd); //指定方向に連続回転 (spd (20bit)(0.015*spd[step/s])
角括弧"[] "の中身は単位です。
"[step/s]"はステップ毎秒と読んで下さい。
"0.015*spd" が速度の計算式になります。
引数spdが100(10進数)ならば、
1.5[ステップ毎秒] の速度になります。
"spd (20bit)"は引数spdの値が20bitまで入力出来るという意味です。
20bitだと「0〜1048575(10進数)」の値が入力できます。
よろしくお願いします。
回答有り難うございました。
良く調べずに質問してしまった事を反省しております。
「L6470のスケッチを少しばかり修正」のページで同じ質問に回答しておられるのに気が付かないで
質問してしまいました。
ご丁寧に回答していただき有り難うございました。
「L6470のスケッチを少しばかり修正」のページで同じ質問に回答しておられるのに気が付かないで
質問してしまいました。
ご丁寧に回答していただき有り難うございました。
動作確認できません、ご教授ください。
スケッチをいただき、動作させてみたのですがシリアルモニタには
0x210000 0x24000
0x210000 0x24000
:
:
が永遠と続き、動作ができません。
解決方法を少々考えていただけると幸いです。
0x210000 0x24000
0x210000 0x24000
:
:
が永遠と続き、動作ができません。
解決方法を少々考えていただけると幸いです。
Re: 動作確認できません、ご教授ください。
すいません
原因はよくわかりません。
動いてないのに「0x24000」と表示されているのがおかしいので、
何らかの原因で通信がうまく出来ていないのだと思います。
配線を今一度確認してみてください。(差し間違えていないか等)
ご使用されているArduino が特殊サイズ(Mini,Micro,他等)だとピン配置が換わっている恐れがあります。
ピン番号等を確認してみてください。
原因はよくわかりません。
動いてないのに「0x24000」と表示されているのがおかしいので、
何らかの原因で通信がうまく出来ていないのだと思います。
配線を今一度確認してみてください。(差し間違えていないか等)
ご使用されているArduino が特殊サイズ(Mini,Micro,他等)だとピン配置が換わっている恐れがあります。
ピン番号等を確認してみてください。
承認待ちコメント
このコメントは管理者の承認待ちです
管理人のみ閲覧できます
このコメントは管理人のみ閲覧できます
承認待ちコメント
このコメントは管理者の承認待ちです
管理人のみ閲覧できます
このコメントは管理人のみ閲覧できます
管理人のみ閲覧できます
このコメントは管理人のみ閲覧できます
承認待ちコメント
このコメントは管理者の承認待ちです
承認待ちコメント
このコメントは管理者の承認待ちです
Re: スケッチのダウンロードについて
> スケッチをダウンロードできるようにしてくれないでしょうか.ダウンロードのところのサイトにいってもdropboxにファイルがありませんとなってしまいます.
> よろしくお願いします.
https://www.dropbox.com/s/udyxqwri81wt44y/L6470_SPI_stepMoter_sketch_ver1_02.zip?dl=0
> よろしくお願いします.
https://www.dropbox.com/s/udyxqwri81wt44y/L6470_SPI_stepMoter_sketch_ver1_02.zip?dl=0
承認待ちコメント
このコメントは管理者の承認待ちです
承認待ちコメント
このコメントは管理者の承認待ちです
管理人のみ閲覧できます
このコメントは管理人のみ閲覧できます
管理人のみ閲覧できます
このコメントは管理人のみ閲覧できます
最大スピードを0x01iいかにする方法
初めまして。アルディーノ&ステッピングモーター初心者です。こちらのページを参考にさせていただいて大変助かりました!。
何とかアルディーノ+L6470+ステッピングモーターで駆動できるようになりました。MaxSpeedは標準では0x40でした。
すごくゆっくりモーターを駆動したい(例えば10分で1回転)のですが、MaxSpeed を 0x01以下にすることはできるのでしょうか?その場合どのように表記すればよいのでしょうか?初歩的な質問で恐縮ですが、教えていただけると大変助かります。
jmkk
何とかアルディーノ+L6470+ステッピングモーターで駆動できるようになりました。MaxSpeedは標準では0x40でした。
すごくゆっくりモーターを駆動したい(例えば10分で1回転)のですが、MaxSpeed を 0x01以下にすることはできるのでしょうか?その場合どのように表記すればよいのでしょうか?初歩的な質問で恐縮ですが、教えていただけると大変助かります。
jmkk
Re: 最大スピードを0x01iいかにする方法
> 初めまして。アルディーノ&ステッピングモーター初心者です。こちらのページを参考にさせていただいて大変助かりました!。
> 何とかアルディーノ+L6470+ステッピングモーターで駆動できるようになりました。MaxSpeedは標準では0x40でした。
> すごくゆっくりモーターを駆動したい(例えば10分で1回転)のですが、MaxSpeed を 0x01以下にすることはできるのでしょうか?その場合どのように表記すればよいのでしょうか?初歩的な質問で恐縮ですが、教えていただけると大変助かります。
> jmkk
jmkkさんへ
Maxspeedを0x01以下に設定することはできませんが、例題の速度で回すことは可能です。
L6470_run(dia,spd);を使えばとてもゆっくり回転できます。
引数spdに0x01を指定した場合、0.015[step/s]の速さで回ります。連続回転です。
これはおよそ10分でモータの9ステップ分です。 これが最低速度です。※3
例えば
10分で一回転したい場合は【1回転が160stepのモータの場合】
(160step/600[秒])/0.015[step/s] =17.77 ≒18
となりますので、(十進数18 → 16進数0x12)
引数spdに0x12を指定すると、10分で代替1回転とちょっと回ります。
【1回転が200stepのモータの場合】は
同様の計算で
引数spdに0x16を指定すると、10分で代替1回転弱回ります。
※ L6470の都合上、ぴったり10分で1回転というような回し方はできないので、その辺は工夫が必要。
補足
Maxspeedが大きく関わってくるのは、座標を指定して回るような場合で、コマンドでいうと
L6470_move(dia,n_step);//指定方向に指定数ステップする[B]
L6470_goto(pos);//指定座標に最短でいける回転方向で移動[B]
L6470_gotodia(dia,pos);//回転方向を指定して指定座標に移動[B]
などです。
L6470_run(dia,spd);
については、MaxSpeedの設定最大速度以内であれば指定の速度で回転します。
以上
> 何とかアルディーノ+L6470+ステッピングモーターで駆動できるようになりました。MaxSpeedは標準では0x40でした。
> すごくゆっくりモーターを駆動したい(例えば10分で1回転)のですが、MaxSpeed を 0x01以下にすることはできるのでしょうか?その場合どのように表記すればよいのでしょうか?初歩的な質問で恐縮ですが、教えていただけると大変助かります。
> jmkk
jmkkさんへ
Maxspeedを0x01以下に設定することはできませんが、例題の速度で回すことは可能です。
L6470_run(dia,spd);を使えばとてもゆっくり回転できます。
引数spdに0x01を指定した場合、0.015[step/s]の速さで回ります。連続回転です。
これはおよそ10分でモータの9ステップ分です。 これが最低速度です。※3
例えば
10分で一回転したい場合は【1回転が160stepのモータの場合】
(160step/600[秒])/0.015[step/s] =17.77 ≒18
となりますので、(十進数18 → 16進数0x12)
引数spdに0x12を指定すると、10分で代替1回転とちょっと回ります。
【1回転が200stepのモータの場合】は
同様の計算で
引数spdに0x16を指定すると、10分で代替1回転弱回ります。
※ L6470の都合上、ぴったり10分で1回転というような回し方はできないので、その辺は工夫が必要。
補足
Maxspeedが大きく関わってくるのは、座標を指定して回るような場合で、コマンドでいうと
L6470_move(dia,n_step);//指定方向に指定数ステップする[B]
L6470_goto(pos);//指定座標に最短でいける回転方向で移動[B]
L6470_gotodia(dia,pos);//回転方向を指定して指定座標に移動[B]
などです。
L6470_run(dia,spd);
については、MaxSpeedの設定最大速度以内であれば指定の速度で回転します。
以上
Re: 最大スピードを0x01以下にする方法
ありがとうございました!
ゆっくりと動くようになりました。
これでプロジェクトが進められました。
またお伺いすることもあるかもしれませんが、よろしくお願いいたします!
ゆっくりと動くようになりました。
これでプロジェクトが進められました。
またお伺いすることもあるかもしれませんが、よろしくお願いいたします!
承認待ちコメント
このコメントは管理者の承認待ちです
承認待ちコメント
このコメントは管理者の承認待ちです
move で速度を指定することはできませんか
以前 低速で回転させる方法を教えていただいたJMKKです。大変助かっております。仕事でつかっており、とある特許の申請に活躍いたしました。
今回は単純往復なのですが、「正回転を速く(1回転/秒)、逆回転を遅く1回転/10秒)」の運転をしたいと思っています。
moveコマンドで 速度指定できれば一番簡単なのですが可能でしょうか?
ほかにはrun コマンドで速度設定できますが、delay(すなわち時間)で止める必要があります。往復運動なので往復のステップ数が同一である必要があります。指定方法はあるのでしょうか?
よろしくお願いいたします。
今回は単純往復なのですが、「正回転を速く(1回転/秒)、逆回転を遅く1回転/10秒)」の運転をしたいと思っています。
moveコマンドで 速度指定できれば一番簡単なのですが可能でしょうか?
ほかにはrun コマンドで速度設定できますが、delay(すなわち時間)で止める必要があります。往復運動なので往復のステップ数が同一である必要があります。指定方法はあるのでしょうか?
よろしくお願いいたします。
Re: move で速度を指定することはできませんか
> 以前 低速で回転させる方法を教えていただいたJMKKです。大変助かっております。仕事でつかっており、とある特許の申請に活躍いたしました。
>
> 今回は単純往復なのですが、「正回転を速く(1回転/秒)、逆回転を遅く1回転/10秒)」の運転をしたいと思っています。
> moveコマンドで 速度指定できれば一番簡単なのですが可能でしょうか?
>
> ほかにはrun コマンドで速度設定できますが、delay(すなわち時間)で止める必要があります。往復運動なので往復のステップ数が同一である必要があります。指定方法はあるのでしょうか?
>
> よろしくお願いいたします。
回答1、速度指定はレジスタコマンドの中にあります。moveコマンドの前にその都度実行したらいいのではないでしょうか。
回答2、runの前に座標(pos)をレジスタから取得し、runの後にgoto(pos)を実行したらいいのではないでしょうか。どちらもspdを合わせればいいのではないでしょうか。
>
> 今回は単純往復なのですが、「正回転を速く(1回転/秒)、逆回転を遅く1回転/10秒)」の運転をしたいと思っています。
> moveコマンドで 速度指定できれば一番簡単なのですが可能でしょうか?
>
> ほかにはrun コマンドで速度設定できますが、delay(すなわち時間)で止める必要があります。往復運動なので往復のステップ数が同一である必要があります。指定方法はあるのでしょうか?
>
> よろしくお願いいたします。
回答1、速度指定はレジスタコマンドの中にあります。moveコマンドの前にその都度実行したらいいのではないでしょうか。
回答2、runの前に座標(pos)をレジスタから取得し、runの後にgoto(pos)を実行したらいいのではないでしょうか。どちらもspdを合わせればいいのではないでしょうか。
Re: move で速度を指定することはできませんか
ありがとうございました!。簡単なことなのですが気が付きませんでした。
これで 仕事に生かせます。
これで 仕事に生かせます。
No title
はじめまして、Toと申します。
こちらのページを参考にさせていただいて大変助かりました。ありがとうございます。
現在、オリエンタルモーターのPKP266D28AをarduinoとL6470のモータドライバを用いて制御させようとしています。
スイッチを押すとモータを一定ステップ正転させるというプログラムを作成したのですが、正転だけでなく反転もしてしまいます。
以下にコードを示しておきます。
よろしければ、どうしてこのような現象が起きているのか教えていただきたいです。
-------------
void loop()
{
val = digitalRead(5);
if((val==HIGH)&&(old_val==LOW))
{
flag = 1- flag;
delay(10);
}
else
{
}
old_val=val;
if (flag==1) {
L6470_move(1,3000);
delay(100);
L6470_hardhiz();
delay(500);
flag=0;
}
else
{ }
}
-------------
残りはこちらのサイトで参考にしたものと同様なので割愛しています。
loop()の箇所のみコードを書き込みました。
こちらのページを参考にさせていただいて大変助かりました。ありがとうございます。
現在、オリエンタルモーターのPKP266D28AをarduinoとL6470のモータドライバを用いて制御させようとしています。
スイッチを押すとモータを一定ステップ正転させるというプログラムを作成したのですが、正転だけでなく反転もしてしまいます。
以下にコードを示しておきます。
よろしければ、どうしてこのような現象が起きているのか教えていただきたいです。
-------------
void loop()
{
val = digitalRead(5);
if((val==HIGH)&&(old_val==LOW))
{
flag = 1- flag;
delay(10);
}
else
{
}
old_val=val;
if (flag==1) {
L6470_move(1,3000);
delay(100);
L6470_hardhiz();
delay(500);
flag=0;
}
else
{ }
}
-------------
残りはこちらのサイトで参考にしたものと同様なので割愛しています。
loop()の箇所のみコードを書き込みました。
モーター仕様の入力
最近、arduino を勉強し始めたものですが、無謀?にもspg20-1101を2台、l6470を使って、望遠鏡のアクセサリーを作ろうとしています。基本的な事で笑われてしまいそうですが、モーターの仕様はどこで入力するのでしょうか? step数/回転の入力は有りますが、最大許容電圧などはどこでしょうか?
違うモーター(12026)の場合のスケッチは有りますが、5vの入力電圧で、1101では12vなのでl 6470が自動判断するのでしょうか。
違うモーター(12026)の場合のスケッチは有りますが、5vの入力電圧で、1101では12vなのでl 6470が自動判断するのでしょうか。
承認待ちコメント
このコメントは管理者の承認待ちです