メカキネを使った自動人形

メカキネを使って自動人形を作りたいと考えています。

イメージしている動きは以下のようになります。

1 舞台のカーテンが上がる
2 少年が立っている 背景は雪がやさしく降っている絵
3 舞台のカーテンが下がる

4 舞台のカーテンが上がる
5 青年が立っている 背景は雪がやや強く降っている絵
6 舞台のカーテンが下がる

7 舞台のカーテンが上がる
8 大人が立っている 背景は雪が激しく降っている絵
9 舞台のカーテンが下がる

さっそく質問があります。

ホーミングをする際、CNCのように軸を直線運動するときは
リミットスイッチが押されることで原点が設定されますが、
軸が回転運動をする場合、メカキネではどのような方法で原点を設定すれば良いでしょうか?

(例えば、軸が時計回りに回転するとして、
最初に反時計回りに回ってリミットスイッチを押し、原点を設定して、
それから時計回りに回転するとリミットスイッチを逆側から押してしまいます。。。)

ちなみにArduinoを使って作品制作をしたとき、同様のケースでは透過型光電センサを使って
非接触で原点を設定していました。

こんにちは。

回転物の原点検出方法は悩みますよね・・・。
原点検出センサーの基本的な考えとしてはリミットスイッチと同じように、ホーミングのセンサーを探して動く時に電気的にオン→オフ、あるいはオフ→オンにされれば原点として認識されます。
Duet制御基板にはハードリミット(駆動中にリミットスイッチを押されると停止)の機能がないので、通常の駆動中にスイッチが押されてしまうことに関しては気にしなくても問題ありません。

スイッチの検出はホーミング時のスイッチを検出しながら動く特殊な移動の時のみ検出されます。
なので、原点設定後に時計周りをしてスイッチを押しても原点が再設定されないです。
ただし、現状のhomingファイルは直線駆動向けになっていたと思うので、ホーミングするときの移動量の調整は必要かもしれません。(home◯.gとかhomeall.gを編集して調整することになります。)

同じようにフォトインタラプタ(透過型光電センサ)を使ってもよいと思います。
あるいは、スイッチやボタンを押すような突起を作ってそれらを押すハード的解決でもいいかもしれません。

一応、フォトインタラプタ(透過型光電センサ)を使う場合の配線例をあげておきます。
ほぼリミットスイッチと同じで、追加でモジュールのVに制御基板の3.3Vを繋ぐだけです。

画像のような3Dプリンター向けの光学式リミットスイッチモジュール(フォトインタラプタ)を使ったことがあるのですが、その時は上記のような配線で特に問題なく機能していました。
モジュール品以外にも単品のセンサーなど色々なセンサーがあるので、必ず上記の配線でいけるとは言いませんが、もし使う場合は3Dプリンター向けのものを選んでおくと接続関係は楽かもしれません。

「いいね!」 1

↑まさに知りたかったことでした。
とても助かります。
どうもありがとうございました!!

光学式リミットスイッチモジュールをDUET3に配線したところ、
センサーに障害物がないときにTriggeredがyesとなり、
センサーを障害物があるとTriggeredがnoとなります。
期待したのと逆の動きをするのですが、これを解決するにはどうすればよいでしょうか?

confin.gは以下のようになっています。

; Endstops
M574 X1 S1 P"!^io0.in" ; configure active-high endstop for low end on X via pin io0.in

追記
解決しました。
!を消したら良かったのですね。

「いいね!」 1

制作を再開しました!
年明けの完成を目指しています。

「いいね!」 2

大まかに動くようになりました。これから細かい部分を詰めていきます。

ひとつ質問があります。
正面の黒いボタンを押すと幕が上がり、
人形が動き出します。3場面切り替わると幕が閉じます。
幕が閉じると、幕の向こうで人形の台が逆回転して初期位置に戻ります。

幕が閉じて、幕の向こうで人形の台が逆回転しているときは
ボタンを押しても入力を受け付けないのですが、
お客さんはなぜボタンを押しても何も起きないのだろう?と
思われる可能性が高いです。
モーターが動いている間は赤いライトが点灯して、
ライトが消えているときに、黒いボタンを押すと
人形が動き始める(赤いライトが付いているときは黒いボタンは押さないでね)
というようにできると理想なのですが、
DUET3でそのようなことが出来るのでしょうか?

こんにちは。
素晴らしい作品ですね!

可能だと思います。モーションのファイルの最初と最後にライトをオン・オフするGコードを差し込めば実現可能のように思います。
ただし少し変更が必要になります。

  1. config.gを編集して出力ピンの定義をする
  2. 再生するNCファイルの先頭と最後に出力ピンのONOFFのGコードの追記
  3. ライト関連の配線

ざっくり説明します。
どんなライトを使うつもりかによって若干配線やDuetの使うピンが変わると思いますが、一番簡単そうなDuetの出力ピンに直接ランプやLEDをつなぐ方法で考えてみます。

1. config.gを編集して出力ピンの定義をする

1.1 使う出力ピンを決めます。

DuetのOUT7~9のピンがプラスマイナスの2ピンしかなくて非常にわかりやすいと思います。ただし、自分で圧着してコネクタ作りが必要です。

コネクタづくりが難しそうであれば空いているIO0~8のGNDとio◯.outを使うことにすれば、リミットスイッチのケーブルのコネクタの金具部分を入れ替えて配列を変えることで使えるので、多少楽です。
これも難点があり、IO0~8のio◯.outは3.3V出力のため、使いたいランプに対して電圧が不十分な可能性があります。

使う予定のランプに合わせて出力ピンを選んでください。

1.2 Duetのconfigに出力ピンの定義

Duetのconfig.gに以下を追記します。
OUT7を前提に記載していますが、他のピンに変える場合はout7の部分を変更してください。

;出力ピン定義
M950 P0 C"out7"                              ;出力ピンP0作成
M42 P0 S0.0                                  ;出力ピンP0 デフォルトはオフ

1.3 動作確認

実際に配線してみて、WEBUIにて以下のGコードを送信してみて
M42 P0 S1.0 でランプがオン
M42 P0 S0.0 でランプがオフ
になるかを確認します

2. 再生するNCファイルの先頭と最後に出力ピンのONOFFのGコードの追記

WEBUIでジョブメニューのところにあるtrigger◯.gのファイルを編集で開いて先頭と最後に上記の動作確認で使ったGコードを差し込みます。

先頭 M42 P0 S1.0
最後 M42 P0 S0.0

これでおそらくボタンが押されたら最初にランプが点灯し、最後にランプが消灯するように動作するかと思います。
ただし、このジョブメニュー内のtrigger◯.gのファイルはメカキネソフトでモーションを変更して送信すると上書きされてしまいますので、ご注意ください。

たぶんこれでいけると思うのですが、一度ご確認ください

「いいね!」 1

おお!出来るんですねー!
分かりやすい説明ありがとうございます。
早速必要な部品を取り寄せて試してみたいと思います。

中原中也記念館(山口県山口市)にて
オートマタ(カラクリ人形)の展覧会を開催中です。
新作10点のうち、4点にメカキネを使用しています。機会があれば、ぜひご覧ください。

「いいね!」 1

質問があります。

ボタンを押して、ステッピングモーターが動いている間、
DFPlayer 等を使って、音楽を鳴らすことは可能でしょうか?
(DUET3からDFPlayerを再生・停止することは可能でしょうか?)

こんにちは。

おそらく可能だとは思いますが、工夫しないといけないかと思います。

以下はすべて推測ですが

DFPlayerのwikiのページをちらっとみた限りだと
DFPlayerのKEYやPLAYのピンをGNDピンにつなげると、PLAYスイッチを押している挙動をすると思われるので、リレーをPLAY or KEYピンとGNDピン間にいれ、そのリレーをDuet3でオンオフすれば再生停止できるのではないかと思います。

前述のように出力ピンをON/OFFすることはDuet3では可能なので、

出力ピン定義

configにて空いているioピンを出力ピンとして定義

;出力ピン定義
M950 P1 C"io◯.out"                              ;出力ピンP1作成
M42 P1 S0.0                                  ;出力ピンP1 デフォルトはオフ

再生するNCファイルの先頭と最後に出力ピンのONOFFのGコードの追記

オン→少し待つ→オフでスイッチ動作を再現

M42 P1 S1.0                                  ;出力ピンP1をオン
G4 P500                                      ;500ms待つ
M42 P1 S0.0                                  ;出力ピンP1をオフ

上記のようなことをすれば可能かなとは思うのですが、実際はどうなるかわからないです。
参考にしてみてください

「いいね!」 1

お返事ありがとうございます!
自分では全くどうして良いのか分かっていなかったので、手がかりを教えていただき助かります。
さっそく必要なものを取り寄せて試してみます。

【メモ】

Chat GPTに聞いてみました。(未検証です。)

Duet 3でDFPlayer Miniを使用して音楽を再生する方法を説明します。
Duet 3はRepRapFirmwareを搭載した3Dプリンター向けのコントローラーですが、DFPlayer MiniはMP3/WAVオーディオプレーヤーモジュールです。Duet 3のGPIOまたはUARTを使用してDFPlayer Miniを制御できます。


必要なもの

  • Duet 3(Mini 5+、6HC など)
  • DFPlayer Mini
  • MicroSDカード(FAT32フォーマット)
  • スピーカー
  • ジャンパーワイヤー
  • 5V電源(DFPlayer Mini用)

1. ハードウェア接続

Duet 3とDFPlayer Miniを以下のように接続します。

DFPlayer Mini Duet 3
VCC (5V) 5V
GND GND
RX Duet 3のTXピン (GPIO/UART)
TX Duet 3のRXピン (GPIO/UART)
SPK1, SPK2 スピーカー
  • 注意: DFPlayer MiniのRXは3.3Vトレラントではないため、Duet 3 (3.3V) と接続する際は1KΩ + 2KΩの分圧回路を使って電圧を調整してください。

2. MicroSDカードの準備

  1. MicroSDカードをFAT32フォーマットにする(32GB以下推奨)。
  2. “mp3” フォルダを作成し、その中に “0001.mp3”, “0002.mp3” などの形式でMP3ファイルを保存する。

3. Duet 3の設定(RepRapFirmwareのGコード)

DFPlayer MiniはUART(シリアル通信)で制御するため、Duet 3のシリアルポートを有効にします。

M575でシリアルポートを設定

M575 P1 S2 B9600  ; UART1 (通常は IO_1) を9600bpsで設定
  • P1: UART1 (Duet 3のIO_1ポート)
  • S2: 通信モード(DFPlayer Mini向け)
  • B9600: 通信速度(DFPlayer Miniのデフォルト)

DFPlayer Miniにコマンドを送る

Duet 3のM118(シリアル通信送信コマンド)を使用してMP3を再生します。

音楽を再生

M118 P1 S"T001"  ; 0001.mp3を再生

音量調整

M118 P1 S"VOL15"  ; 音量を15に設定(0-30)

再生停止

M118 P1 S"STOP"

4. その他の方法(拡張ボードを使用)

  • I/Oピンを使う方法:
    DFPlayer MiniのADKEY(IO制御)機能を使い、DuetのGPIOピンをON/OFFすることで再生可能(スイッチ制御)。
  • 外部マイコン(Arduinoなど)を使用:
    Duet 3のGコードからArduino経由でDFPlayer Miniを制御すると、より詳細な制御が可能。

まとめ

Duet 3のUARTを使ってDFPlayer Miniにコマンドを送ることで、Gコード経由でMP3を再生できます。設定はM575でUARTを有効化し、M118でシリアルコマンドを送信します。

もし具体的な設定やトラブルがあれば教えてください!

Duet3でシリアル通信を使ってデバイスを制御する発想がなかったです。
CNCペンダントとかは同様の仕組み(ファームウェアレベルで組み込まれているので若干異なりますが)で制御しているので、DFPlayerでもやってみないとわからないですができるかもしれないですね。

ちなみにChatGPTあるあるで、ちょいちょい内容的には間違っているので少し訂正しておくと
(DFPlayer側の設定関連は使うモジュールの種類にもよると思うので深くは触れません)

シリアルポートの設定では
M575 P◯ S2 B9600
IO1を使う場合はP2、IO0を使う場合はP1となっています。

なのでDuetのRX:受信、TX:送信ピンはそれぞれIO0かIO1のio.inとio.outに該当します。
DFPlayer(TX)→Duet(RX)の経路は使うことが無いと思うので、繋がなくてもいいかもしれませんね。

M118 P◯ S"メッセージ"
の部分のPパラメータはIO0を使っている場合はP2、IO1の場合はP5を指定する必要がありそうです。

一番の問題がメッセージの部分が結構厄介で、DFPlayerの種類によるかと思いますがコマンドが全然違いそうです。


from: MP3-Player-DFPlayer/DFPlayer Mini Manual.pdf at master · RalphBacon/MP3-Player-DFPlayer · GitHub

少なくとも"STOP"とかではなく、0x01とかの値をコマンドとして送らないといけない気がします。
Arduinoとかだとこの辺はライブラリとして上手く見えないようにしてくれているのですが、Duetにはそういった仕組みはないので、元の通信の仕様を確認して対応する必要がありそうです。

なので、試してみても全然いいとは思うのですが、試す手軽さでいうならリレーを使う方が手軽かなぁと思います。

「いいね!」 1

ありがとうございます。リレーにします!笑