mbed用にL6470のライブラリを書き直しました

https://developer.mbed.org/users/Yajirushi/code/L6470SDC/
名前にRyota Yamamotoとか出てきますが明らかに偽名です。
既にL6470のライブラリっぽいものは4つくらい上がっていますが、どれもデイジーチェーンは未サポートで、
おまけに計算式は丸投げですが、このライブラリは計算までサポート・・・できてるはずなんだけどなぁ
あとはコンストラクタが妙に多いことがメリットです。
L6470SDC.png

このなんの魅力もないはずのブログを日当たり20回以上リロードしている工業大関連の皆さん、
ライセンスに縛りはありませんので、mbedとL6470を使う際はどうぞ上記をご賞味ください(サポートするとは言ってない)。
しかしこのmbedのページ。上の検索の部分に該当の語句を入れても出てきたり出てこなかったり。
オンラインコンパイラも相変わらずの不安定だし。mbedフェスタとかやってる場合じゃねーぞ・・・。
(Arduino界隈と同じく興味を持ってもらってユーザーを増やすことで土台を固める作戦なんだろうけど・・・)


9 comments to this article

  1. 匿名

    on 2015年7月24日 at 4:12 PM - 返信

    ライブラリの製作ありがとうございます。
    早速ですが、このライブラリを使ってステッピングモータを指定した角度だけ回転させたいと思っています。
    あまりコードを理解することが出来ていなくて申し訳ないのですが、そのようなことができる関数は実装されてますでしょうか?
    また、どのようにしたら指定角度だけ回したりできますでしょうか?
    ご教授お願いします。

  2. Level52

    on 2015年7月24日 at 8:48 PM - 返信

    > あまりコードを理解することが出来ていなくて申し訳ないのですが、そのようなことができる関数は実装されてますでしょうか?
    > また、どのようにしたら指定角度だけ回したりできますでしょうか?
    モーターの性能によって1回転あたりのステップ数が異なるため角度指定での回転を行う関数は実装していません。
    お手元にあるステッピングモーターの1ステップあたりの角度(ステップ角)を調べることによって
    それを使用して指定角度分掛けることで実現できます。
    (関数はmove(int motorNumber, unsigned long stepsCount, bool isClockwise) を使用)
    モーターの性能表でステップ角が1.8°となっていたとすると、
    360°/ 1.8° = 200ステップで1回転することになります。
    このモーターで45°回転させたい場合は、45°/ 1.8°= 25ステップ回せばよいことになります。
    マイクロステップ駆動している場合は、算出ステップ数にマイクロステップの値を掛けなければなりません。
    私が作ったライブラリではデフォルトで128分の1のマイクロステップ駆動になっていますので、
    25ステップ × 128 = 3200 が実際の指定パラメータとなります。
    (マイクロステップモードはsetStepMode(int motorNumber, unsigned char value)で変更可能です)
    上記に従い、ステップ角が1.8°のモーターNo.1を、128分の1マイクロステップで時計回りに45°回転する場合は、
    L6470.move(1, 3200, true);
    となります。
    手元に実行環境がないため確認はできていませんが、正しいと思います。ご確認ください。

  3. 匿名

    on 2015年7月25日 at 12:04 PM - 返信

    move関数を使えば良いのですね。分かりましたありがとうございます。
    こちらも今ドライバキットを注文したばかりで手元にないのですが、数日して届いたら確認してみようと思います。

  4. 吉澤

    on 2018年4月10日 at 5:45 PM - 返信

    お世話になります。
    L6470のデージチェインのライブラリを使用したいと思ってやっておりまが、動作
    させる事が出来ずにおります。クラスの事があまり良く分かっていません。
    クラスのコンストラクトの宣言で、PinName があるのですがここでエラーになってしまいます。これはどこかで宣言されているものでしょうか?
    また、なぜ10個もコンストラクタが必要なのかも良くわからずにおります。
    当方の環境では、SPI通信は、cpuの機能で実現出来ますので
    下記宣言が必要でない様な気がいたします。
    private:
    Serial *pc;
    SPI *spi;
    DigitalOut *cs;
    ですので、コンストラクタの書き方も違ったものになると思っているのですが、良くわからずにおります。
    何か、アドバイス頂ければ幸いです。

  5. Level52

    on 2018年4月10日 at 9:11 PM - 返信

    C++のクラスのことについてアドバイスがほしいのか、
    PinNameの宣言場所について聞きたいのか、
    ライブラリのコンストラクタ宣言の数が多すぎるから文句をつけに来たのか、
    通信関係はCPU任せだからライブラリの変数が不要だと言いに来たのか、
    自分の環境を全く提示せずにアドバイスだけを求めて相手のエスパー大喜利を楽しむために煽りに来たのか・・・。
    申し訳ありません。意図がまったく読み取れず、良くわからずにおります。
    何か、アドバイス頂ければ幸いです。

  6. 吉澤

    on 2018年4月11日 at 10:08 AM - 返信

    自分勝手な質問で申し訳ありませんでした。
    当方の環境は、nxp社のCPU(LPC11U14)を使用し、LPCXpresso IDE環境
    を使ってプログラムを作成しております。L6470のデバイスを、デージーチェイン
    ではない接続では、動作させる事はできております。
    この記事を拝見し、デージーチェイン接続で、プログラムでキュー導入すると同時に
    複数のステッピングモータを動作させる事が出来ると思いました。
    キューとクラスの関係も良くわかってないですが。。。
    当方の環境では、このLPC11U14のCPUがSPIをサポートしています。
    ただ、この記事のソースをコンパイルすると、クラスのコンストラクタの宣言でエラーになってしまい、質問させて頂きました。

  7. Level52

    on 2018年4月11日 at 8:27 PM - 返信

    こちらの記事はmbedまたはmbed OS用の記事です。
    先のコメントで「PinNameの宣言が見つからない」「CPUがSPIをサポートしている」と仰っていましたので、
    そもそもLPCマイコンをmbedボードとして利用していないと推察できます。
    こちらのライブラリはmbed用のものですので、LPCマイコンの生のコードでは勿論動作しません。
    私が探した限りでは、ネット上でタダで配られている親切なLPCマイコン用の
    L6470/L6480のデイジーチェーンをサポートしたライブラリは見つかりませんでした。
    お金をかけるか時間をかけるかして、ご自身で作成していただく他に道はないかと・・・。

  8. 吉澤

    on 2018年4月12日 at 9:16 AM - 返信

    アドバス、ありがとうございました。 がんばって見たいと思います。
    また、1つ質問したいのですが? プログラムで、キューを導入することで
    同時に複数のパルスモータを制御させる事は、そこそこ可能になる物
    でしょうか? たびたび申し訳ありません。

  9. Level52

    on 2018年4月12日 at 10:27 PM - 返信

    L6470のデイジーチェーンの場合、命令の塊を一つ目のドライバが受け取って
    残りを次のドライバに渡します。次のドライバは残った命令の塊からまた自分のものだけ受け取って次のドライバに渡します。
    このような処理がちょうどキュー(Queue)の概念に合致したため、私が作ったライブラリにキューを導入しただけで
    もしかしたらそれよりも簡単でL6470に適した処理があるかもしれません。
    しかし、やはり一番プログラムとして作りやすくわかりやすいのはキューを導入することだと思います。
    ※デイジーチェーンでのデータのやりとりは下記URLの「デイジーチェーンSPIでのデータ送受信」に簡単にまとめてます
    http://l52secondary.blog.fc2.com/blog-entry-2.html#more
    ですので、[太字]「キューを導入したからモーターが複数制御できる」[/太字]というのではなく
    [太字]「L6470を使ってモーターを複数同期制御するためにデイジーチェーンが必要で、デイジーチェーンの命令処理のためにプログラム側でキューを導入する必要がある」[/太字]が正解です。
    ちなみに「同時に複数のパルスモータを制御」はもちろん可能です。
    ただし、「まったくの同時」というのは難しいようです。
    私の実験ではモーター配線の伝送損失等の影響で数十マイクロ秒程度の誤差は生じているかんじでした。

コメントを残す