• Home
  • Firgelli Articles
  • Arduinoを使用した2つの光学リニアアクチュエータの同期制御

Arduinoを使用した2つの光学リニアアクチュエータの同期制御

複数のリニアアクチュエータ間の同期運動は、一部の顧客アプリケーションの成功に不可欠である可能性があります。一般的なものの1つは、トラップドアを開く2つのリニアアクチュエータです。これを実現するには、専用のFirgelliを使用することをお勧めします 同期制御ボックスFA-SYNC-2およびFA-SYNC-4。ただし、一部のDIYやハッカーは、Arduinoなどのマイクロコントローラーが提供する自由を好み、代わりに独自の同期制御プログラムを作成することを好みます。このチュートリアルは、を使用してこれを実現する方法の概要を提供することを目的としています。 オプティカルシリーズリニアアクチュエータ.

序文

このチュートリアルは、Arduinoとの同期制御を実現するために必要な手順を厳密に扱ったものではなく、独自のカスタムプログラムの作成を支援するための大まかな概要です。 このチュートリアルは高度であり、Arduinoのハードウェア、ソフトウェアに精通しており、理想的にはパルス幅変調(PWM)信号、割り込みサービスルーチン(ISR)、センサーのデバウンス、およびモーターエンコーダーの経験があることを前提としています。 このチュートリアルで提供される例は、プリミティブ比例コントローラーです。次の例では、PID制御ループの実装や、3つ以上のリニアアクチュエータへのスケーリングなど、多くの改善を実装できます。 Arduinoアプリケーションの技術サポートを提供するためのリソースがなく、これらの公開されているチュートリアル以外でデバッグ、編集、コード、配線図を提供することはありませんのでご注意ください。

概要同期制御

同期制御は、2つのリニアアクチュエータの長さを比較し、それに比例して速度を調整することで実現されます。あるアクチュエータが別のアクチュエータよりも速く動き始めると、速度が低下します。内蔵の光学式エンコーダを介してリニアアクチュエータの位置を読み取ることができます。光学式エンコーダは、DCモーターに接続された、10個の穴が開いた小さなプラスチックディスクで、モーターが回転するとプラスチックディスクも回転します。赤外線LEDがプラスチックディスクに向けられているため、光が回転すると、光ディスクの穴を透過するか、ディスクのプラスチックによってブロックされます。ディスクの反対側にある赤外線センサーは、光が穴を透過したことを検出し、方形波信号を出力します。レシーバーが検出するパルス数をカウントすることにより、モーターのRPMとリニアアクチュエーターが移動した距離の両方を計算できます。 35ポンドの光リニアアクチュエータは1インチの移動あたり50(+/- 5)の光パルスを持ち、200ポンドと400ポンドのアクチュエータは両方とも1インチあたり100(+/- 5)のパルスを持ちます。各リニアアクチュエータがどれだけ伸びているかを比較することにより、2つのアクチュエータの速度を比例的に調整して、伸びている間、常に同じ長さに留まるようにすることができます。

必要なコンポーネント

配線図

Arduinoを使用した2つの光学リニアアクチュエータの同期制御

上記の配線接続を行ってください。リニアアクチュエータから出てくるワイヤの色を常に確認してください。色の規則が上の図に示されているものと異なる場合があります。デジタルピン7、8、9、およびGNDの間に接続されている3つの瞬間的なボタンを見落とさないように注意してください。

    クイックチュートリアル

    2つのリニアアクチュエータを同期させたいだけの場合は、次の手順に従ってください。

    • 配線図のように接続してください。
    • 以下の最初のプログラムをアップロードして実行します。
    • このプログラムによって出力された2つの値を、以下の2番目のプログラムの23行目にコピーします。
    • 2番目のプログラムをアップロードして実行します。
    • 変数K_pを変更してシステムを微調整します(37行目、2番目のプログラム)。これは、ポテンショメータをアナログピンA0に接続し、コードを変更してポテンショメータを読み取り、map()関数を使用することで最も簡単に実行できます。K_p= map(analogRead(A0)、0、1023、0、20000);

    このチュートリアルの残りの部分では、プログラムの主要な機能のいくつかについて詳しく説明します。繰り返しになりますが、これは完全なチュートリアルではなく、独自のプログラムを作成する際に考慮すべき事項の概要です。

    校正プログラムの概要

    同期制御を実現する前に、まずシステムを校正する必要があります。製品仕様に記載されているように、移動1インチあたり(+/- 5)パルスの許容誤差があるため、これには、作動サイクルあたりのパルス数のカウントが含まれます。以下のプログラムをアップロードして実行します。このプログラムは、アクチュエータを完全に収縮させ(53行目)、光パルスカウンタ変数をゼロに設定してから、完全に伸長および完全に収縮させます(それぞれ63行目と74行目)。この作動サイクル中、パルス数は割り込みサービスルーチン(ISR)の153行目と166行目でカウントされます。作動サイクルが完了すると、平均パルス数が出力されます(88行目)。後で使用するためにこれらの値をメモしてください。

    https://gist.github.com/Will-Firgelli/89978da2585a747ef5ff988b2fa53904

    同期プログラムの概要

    同期制御プログラムをアップロードする前に、まずキャリブレーションプログラムによって出力された値を23行目にコピーし、現在の配列{908、906}を独自の値に置き換える必要があります。さらに、35ポンドのリニアアクチュエータを使用している場合は、29行目の変数の値を20ミリ秒から8ミリ秒に変更する必要があります。

    (原点を特定するために)一度完全に収縮した後、伸長、収縮、および停止コマンドに対応する3つのボタンを押すことにより、両方のリニアアクチュエータを同期して動かすことができます。アクチュエータは、相対的なパルスカウンタを比較し、それらの間の速度を調整して常に同期を維持することにより、不均一な負荷の下でも同期を維持します。現在のプログラムは単純な比例コントローラー、ライン93を実装しているため、平衡の周りでオーバーシュートと振動が発生する可能性があることに注意してください。これは、37行目で定義されている変数K_pを変更することで調整できます。これは、ポテンショメータをアナログピンA0に接続し、コードを変更してポテンショメータを読み取り、map()関数を使用することで最も簡単に実行できます。K_p= map(analogRead(A0)、0、1023、0、20000);

    最良の結果を得るには、比例コントローラーを削除し、PID制御ループを実装することを強くお勧めします。ただし、これはこの入門チュートリアルの範囲を超えており、意図的に省略されています。

    https://gist.github.com/Will-Firgelli/44a14a4f3cac3209164efe8abe3285b6

    Bullet36およびBullet50アクチュエータを同期的に使用する

    オプティカルシリーズリニアアクチュエータに加えて、エンコーダを内蔵した2つのリニアアクチュエータを提供しています。Bullet36Calです。とBullet50 Calは、どちらも内部直交ホール効果エンコーダーを備えています。ホール効果エンコーダは光学式エンコーダと同じ原理で動作しますが、光を使用する代わりに磁気を利用します。さらに、直交エンコーダであるため、2つの信号出力があり、それぞれが90度位相がずれています。そのため、4つ以上の割り込みピンを備えたArduinoボードを使用し(Arduino Unoには2つしかない)、アクチュエータごとに2つの信号からの入力を処理するようにコードを変更する必要があります。さらに、デバウンス時間変数falsepulseDelayをK_pと一緒に調整する必要があります。

    独自のプログラムを作成するためのヒント

    3つ以上のリニアアクチュエータ

    2つ以上のリニアアクチュエータを使用する場合、Arduino Unoは2つの割り込みピンしか使用できないため、機能しなくなります。適切な数の割り込みピンが使用可能なArduinoボードを使用する必要があります。詳細については、以下を参照してください。 https://www.arduino.cc/reference/en/language/functions/external-interrupts/attachinterrupt/

    次に、効率を上げるために、配列とfor()ループを使用してプログラミングをベクトル化し、各アクチュエータを反復処理することをお勧めします。

    デバウンス

    多くのセンサーと同様に、バウンス信号を認識することが重要です。メカニカルスイッチと同様に、エンコーダもバウンスに苦しむ可能性があります。上記の例では、デバウンス処理は単純な遅延(falsepulseDelay変数で定義)によって処理されていますが、ソフトウェアの変更や物理的な回路で、バウンスノイズをフィルタリングする際に、この処理が重要です。

    ロールオーバーの処理

    コードを変更する場合は、millis() 関数を扱う際にロールオーバーに注意してください。millis() と lastDebounceTime 配列はどちらも、符号なしの long 変数として宣言されており、最大 4,294,967,295 (32^2-1) までの値を格納できます。これは、およそ49.7日のロールオーバー期間に変換されます。現在のプログラムは、ISR(割り込みサービスルーチン)機能でのロールオーバーを処理するように設計されています: count_0 & count_1ですが、このプログラムを変更した場合は、変数のロールオーバーを正しく処理するようにしてください、それ以外の場合は、プログラムが連続使用の〜49.7日後にクラッシュします。詳細については、以下を参照してください。 https://www.norwegiancreations.com/2018/10/arduino-tutorial-avoiding-the-overflow-issue-when-using-millis-and-micros/

     

    Share This Article
    Tags: