Robit blog

株式会社ロビットの公式ブログです

卓上CNCをEdisonを使ってSlack連携させてみた

f:id:yuki_robit:20161014153910j:plain

はじめまして。ロビットの新井(id:gracefulsea)です。
もともとアプリやらWeb周りの開発をしていたのですが、トイレ掃除から組み込みソフトウェアまで、幅広くやっております。




今までのBlogは物理的なものを作ることがメインだったので、今回はWebな技術とハードを組み合わせたIoT事例をご紹介したいと思います。

ロビットは今でこそ切削加工機が4台もある切削大好き企業ですが、今のオフィスに移転する前には、卓上CNC一台で全てを済ませていました。


f:id:gracefulsea:20161002223624j:plain
我々を支えてくれたORIGINALMIND KitMill SR420。今も基板加工機として愛用中。

このCNCは非常にコスパがよく、制御用ソフトも扱いやすいのでおすすめの一品なのですが、切粉(切削した削りかす)を排出する仕組みや、切削工具を自動で交換する機構がありません。


f:id:gracefulsea:20161002233058j:plain
様々な切削工具。グレン○ガンのドリルみたいのまである。(出典:ミスミ)

樹脂を切削するときに長い間放置しておくと、ふわっふわの雪原みたいな切粉の山が出来て、さらにそれを放置すると、切粉と切削工具が擦れて溶けてドロドロになってしまいます。
また、複雑な形状を作ろうとすると様々な種類の切削工具を使用する必要がありますが、工具交換のタイミングになるとCNCの稼働が止まるだけで、ブザーが鳴ったり通知が飛んだりするわけではないので、ちょくちょく状態を見に行ってあげないといけません。

自分がPC上で作ったデータを機械に作らせていたつもりが、気付いたら機械様の身の回りの世話をして、1日が終わる。
これはもう機械様の奴隷ですよ。これが近未来!!来るAI人類統治時代!!!


f:id:gracefulsea:20161003092622j:plain
機械様の奴隷化した高橋

しかし今はまだ2016年、機械様に支配されるには時期尚早。まだまだ機械には人間様の思った通り自動で動いていてもらわないと困ります。

前振りが長くなりましたが、かくして卓上CNCをIoT化して可能な限り放置できるようにしてみました。

具体的には、
・切削が終了したり、工具を交換するタイミングでSlackに通知を入れる
・切粉がたまらないように掃除機を自動で強弱つけながら動かす(常時最強だとうるさすぎる)
・主軸(切削工具を回すモーター)の温度に応じてファンを回して主軸を冷やす

といった機能を追加してみます。



まずはハードウェア周りから。

Slack連携のトリガー検出機能
はじめに、どのタイミングでSlackと連携するか決めていきます。CNCはGコードと呼ばれる命令で動いていますが、このGコードに工具を変える命令や、切削終了の命令も含まれています。なので、このGコードが特定の命令を実行したら通知を投げる、といったことも出来ますが、何らかの問題で異常停止してしまった場合なども通知が欲しいので、もっとアナログに、主軸が回ったり、止まったタイミングでSlackに通知を投げるようにしました。

※ここから先の改造は制御盤の破損や火災といった様々なリスクを含む作業になりますので、全て自己責任で行ってください。

まずはCNCの制御盤を開けて、主軸を制御している素子を見つけます。この制御盤に関しては、ご丁寧に主軸の信号はSPINDLEと書いてあるターミナルの所から取れるような回路になっているようです。パターンに書いてあるとは言え、必ず回路のパターンを追いながら、素子の形を見て検討をつけ、最後に電圧を確認して間違いないかチェックしましょう。


f:id:gracefulsea:20161003092911j:plain
中央右下の黒いターミナルから主軸のラインを引っ張れる

次にどのマイコンを使うかを決めます。今回はWi-Fi接続可能、アナログ・デジタルともに利用可能というのが必須条件になってくるので、Intel Edison Kit for Arduinoを使うことにしました。node.jsをはじめとした高級言語からマイコン的な機能が簡単に使え、Wi-FiBluetoothが両方使えるのでこういった一品モノには最適です。


f:id:gracefulsea:20161003093716j:plain

主軸を回転させる電源ラインを直接Edisonに入れると主軸側の電圧が高すぎて漏れなく死亡するので、フォトカプラを使って電気的に絶縁し、Edisonを保護しながら主軸のON/OFFだけ取れるようにします。本当は保護用の素子をフォトカプラ側にも付けたほうがいいと思いますが、オフィスに転がっているもので作ったので今回はつけませんでした。


f:id:gracefulsea:20161003094012j:plain

NC Signalに主軸の電源ラインとグラウンドを入れます。主軸の電源ラインが変化すると、フォトカプラの出力も変化します。

あとはマイコンでフォトカプラの出力の変化を割り込みかポーリングで認識すれば主軸の回転状況がわかるようになります。


掃除機制御機能
私は切削スピード狂なので、切粉がすごいことになるような切削をする場合、CNCの限界まで攻めて動かします。むしろ限界を超えたまま動かしてしまってCNC自体にガタがきてメンテ必須になってしまったこともある位切削を早く終わらせたい位にはスピード狂です。
ただ、全力で切削しているとあっという間に切粉がたまり、それこそ数分毎に掃除機で切粉を吸ってあげないとまともに切削出来ないこともありました。
主軸に掃除機を付けて切削開始と同時に吸いっぱなしで放置してみたりしましたが、常時吸い込み力最強で動かしているとうるさすぎるので、切粉がたくさん出るような状況、つまり主軸に負荷がかかって主軸が熱くなったら掃除機のパワーをあげる、という形で制御することにしました。
また、当時はマンションの一室にオフィスを構えていたにもかかわらず、夜通し切削をする必要があるくらい酷使していたので、騒音対策も必須でした。そのため、夜間は掃除機を低速で固定で動かせるように、主軸温度ベースの制御か、つまみで掃除機のパワーを変更出来るような回路にしました。


f:id:gracefulsea:20161003094125j:plain
ここのスイッチを切り替えると自動制御か固定の出力にするか切り替えられる

掃除機がACモーターだったので、ACの電力を無段階で調整出来る、トライアック万能調光器を使って掃除機のパワーを制御します。
つまみの部分をデジタルポテンショにすればソフトウェアで簡単に回転数を制御出来ますが、オフィスにデジタルポテンショが転がっていなかったのと、つまみ部分を色々変えるのも面倒くさそうだったので、安いサーボとつまみをリンク機構でつなげて、サーボでつまみを回転させて抵抗値をコントロールするようにしました。


f:id:gracefulsea:20161003094234j:plain
針金みたいなやつがサーボと一緒に動いて、つまみを回す

あとは温度センサーを主軸に貼り付けて、温度の変化に応じてサーボを制御するだけで掃除機のパワーを制御することが出来るようになります。


f:id:gracefulsea:20161003094416j:plain
中央上部からヒョロっと伸びている細い線が温度センサー(サーミスタ)

※AC電源はDC電源とは比べ物にならないほど危険です。場合によっては命の危険もあるため、回路の取扱には細心の注意を払い、絶対に感電しないように対策した上で実験しましょう。我々も最初に実験したときは調光器回路に実装ミスがあり、回路爆発+ブレーカー落とすというコンボをやらかしました。



ファンコントロール機能
一般的にモーターを高温のまま動作させ続けると寿命が早く来てしまいます。卓上CNCの場合は著しく熱くなるほど回転数が上がらないので、そよ風を感じる位のファンでも十分な延命効果があります。なので、これまたオフィスに転がっていた適当なファンを取り付けました。
PWM制御するだけなので、何ら特殊なことはしなくても回路的には制御出来ますが、主軸の周りにファンを取り付けられそうな場所がなかったので、ファンを取り付けるための部品を3Dプリンタで作りました。


f:id:gracefulsea:20161003094628j:plain
主軸とネジの間にL字のブラケット挟み込むようにして、ファンを取り付ける

以上の機能をEdisonのピン配置に合わせて回路を設計します。主軸や主電源との配線は繰り返し脱着が容易で、ショートもしにくいターミナルブロック端子を使っています。また、今回使用したボードはArduinoと互換性のあるものなので、Arduinoのシールドとして設計しました。
今回作った回路図と、完成した回路はこんな感じです。





クリックでPDF表示

f:id:gracefulsea:20161003094837j:plain

回路はいつも通り切削で作っています。
最後に作った回路をそこらへんに転がっていたタカチのケースに詰め込んでハードウェアは完成です!


f:id:gracefulsea:20161003095719j:plain

それでは次にソフトウェア側を見ていきます。
Edisonはmraaというライブラリを使うとnode.jsやPythonといった高級言語からGPIOを簡単にコントロールすることが出来ます。
詳細なmraaの使い方はEdison Labを始めとした様々なところで紹介されているので割愛しますが、
今回はGPIO、AnalogInput、PWMを使うので、下記のようなコードになります。

var potentio   = new mraa.Aio(0);
var thermistor = new mraa.Aio(1);
var autoSwitch = new mraa.Gpio(2);
var analogSwitch = new mraa.Gpio(4);
var ncSignal     = new mraa.Gpio(12);
var fanControlPWM = new mraa.Pwm(6);
var acControlPWM = new mraa.Pwm(9);

各種GPIOの初期化と、割り込みの設定を以下のように行います。回路図を見ていただくとわかる通り、掃除機の制御を自動制御にするか、つまみで制御するかはプルアップされているので、信号がLowになった時にだけ割り込みが発生するようにしています。

function initIOs() {
    autoSwitch.dir(mraa.DIR_IN);
    analogSwitch.dir(mraa.DIR_IN);
    ncSignal.dir(mraa.DIR_IN);
    autoSwitch.isr(mraa.EDGE_FALLING, onSwitchIRQ);
    analogSwitch.isr(mraa.EDGE_FALLING, onSwitchIRQ);
    ncSignal.isr(mraa.EDGE_BOTH, onNCSignalIRQ);
}

あとは主軸の割り込みを基準に稼働状況に応じて、主軸が回転している間は温度センサーの値をポーリングをし続けて監視し、温度の値に応じて掃除機の出力を変えてあげるだけで電子工作的なところは完成です。
温度センサーの値に対してどのように掃除機の出力を変化させるかは、分圧抵抗の精度や主軸のどこに温度センサーをつけたかで大きく変わってしまうので、ある程度実際に動かしながら決めました。

最後に、切削の開始と終了をSlackに投稿できるようにしていきます。Slackは豊富なAPIがあるので、こちらを利用してEdisonからSlackへ投稿します。
基本的にTokenを取るだけですぐに使い始められるので、先人の知恵を借りてTokenを取得します。
あとはこのTokenを利用して、Slack APIを叩くだけで投稿できます。node.jsにはslack-nodeのような便利モジュールがいくつかあるので、この辺りを使って実装すれば今なら問題ないかと思いますが、
これを制作した当時はまだこの辺りのモジュールを長期間稼働させておくと動作が不安定だったので、下記のようにchild_processとcurlを組み合わせて動かしています。

function postToSlack(message) {
  var child = exec('curl -X POST -F token=' + TOKEN
                + ' -F channel=' + CHANNEL + ' -F "text='
                + message + '" -F username=ncbot -F '
                + 'icon_emoji=:nut_and_bolt: https://slack.com/api/chat.postMessage',
    function (error, stdout, stderr) {
      if (error !== null) {
        console.log('exec error: ' + error);
      } else {
        console.log('Posted to Slack.');
      }
    }
  );
}

ロビットではこんな感じに切削の開始の通知と、終了時に何秒稼働したかを通知させています。

function postFinish() {
  var duration = parseInt(moment().unix()) - ncStartTime;
  postToSlack("切削終わったよ。" + parseInt(duration / 60)
               + "分" + parseInt(duration % 60) + "秒かかったよ。");
}

function postStart() {
  ncStartTime = parseInt(moment().unix());
  postToSlack("切削開始したよ。");
}

実際に動かすと、こんな感じで投稿されます。


f:id:gracefulsea:20161003095847p:plain

卓上CNCは意外と静かで、樹脂や回路を2.5次元的に掘る程度だと別の部屋にあると音が聞こえないこともあるので、このbotがあると何も考えずに他のことに集中できて、とても便利です。
Pebbleのようなウェアラブル系で通知を受け取れる人は、半田付けのようなPCから離れて作業をしている時にでも工具交換のタイミングがわかるので、CNCの稼働率を大きくあげることが出来ました。


f:id:gracefulsea:20161003100035j:plain

ベンチャーはとにかくスピードが大事なので、機械様の奴隷にならず、ものづくりにおいても自動化できるところはどんどん自動化していくことが大切です。ロビットでは他にも様々な取り組みをしていますので、そのあたりの話もまたいずれご紹介したいと思います。

購入(amazon)はこちら
> ロビットのWebサイトへ
> 採用情報はこちら