実践! ご主人様とメイドがステッピングモーターを動かす:江端さんのDIY奮闘記 EtherCATでホームセキュリティシステムを作る(7)(5/7 ページ)
さて、今回は、前回に続きEtherCATの“2大技巧”の1つである「SyncManager」を解説したいと思います。その後、ステッピングモーターを動かすためのプログラムを作成してみましょう。
"simple_test.c"の改造
では、これより、"simple_test.c"の改造を開始します(改造前のsimple_test.cは、念のため、別のファイル名で保存しておいてください)。
といっても、要するに、EtherCATスレーブのIO出力を、"simple_test.c"から、コントロールできるようにすれば良いだけのことです(なお、ステッピングモーターの動作原理については、ここでは説明しませんので、がんばって勉強*)してくださいね)。
*)編集注:そんな皆さまに送りたい、EDN Japan関連記事。まずはここから「「ステッピングモーター」で学ぶエンコーダの活用法」
今回は「ステッピングモーターを動かせればいい」という観点のみに注力して、考え得る最小の改造とします。
■37行目の下に、以下を追加 char stepping_Signal = 1; //00000001 /* Stepping motor value */ void CALLBACK Motorthread(UINT uTimerID, UINT uMsg, DWORD_PTR dwUser, DWORD_PTR dw1, DWORD_PTR dw2) { if (stepping_Signal == 1) stepping_Signal = 2; // 00000010 else if ( stepping_Signal == 2) stepping_Signal = 4; // 00000100 else if ( stepping_Signal == 4) stepping_Signal = 8; // 00001000 else if ( stepping_Signal == 8) stepping_Signal = 1; // 00000001 } ■41行目の”IOmap[0]++;” を以下の様に変更 IOmap[0] = stepping_Signal; // ここがLEDを点滅させるパラメータ // 必要に応じてslaveinfoの情報を使って、”[0]”を, "[2]"とか”[4]”とかに変更する ■128行目の” UINT mmResult;”の下に、以下を追加 UINT mmResult2; ■194行目の” mmResult = timeSetEvent(1, 0, RTthread, 0, TIME_PERIODIC);”の下に、以下を追加 mmResult2 = timeSetEvent(100, 0, Motorthread, 0, TIME_PERIODIC); // この”100”の値を小さくすると、モーターの速度が上がる ■252行目の" timeKillEvent(mmResult);"の下に、以下を追加 timeKillEvent(mmResult2);
これだけの変更で、とりあえず、モーターを動かす信号を作り出せます。
この”simple_test.c”では、一度キックすると、一定の時間間隔でずっと動き続ける、コールバック関数が重要な役割をしています。
常にプロセスデータをEthernetに流し続ける処理と、IOMap[]の内容を替え続ける処理を、コールバック関数に丸投げしておくという方法を採用しています。
もっとも、SOEMやこのプログラムは、非リアルタイムOSであるWindows7の上で動いているので、厳密な意味でのリアルタイム制御はできません。
EtherCATを、産業用ロボットの製造ラインや、ドローン撃退システムに使うには、ベンダー(ベッコフ社さんなど)が提供するマスタを購入した方が良いと思います。
しかし、江端家のホームセキュリティシステムに使うには、Windows7の上で動くSOEMでも、十分すぎるスペックなのです。
ソースコードを変更して、LEDの点滅パターンを自由に変えられるようになったら、前回の最初にご紹介した物品や回路図を使って、EtherCATスレーブとの接続を行ってください。
このプログラムによって動くはずの、ステッピングモーターの動画を再掲しておきます。
(回路図はこちら)
では、あなたの家のパトランプやステッピングモーターも、上手く動くことをお祈りしております。
Copyright © ITmedia, Inc. All Rights Reserved.