[20日目] 基板を起こしてモータを動かそう

べーた べーた

男の子ならいくつになっても動くオモチャって楽しいですよね。エンジンやモータが好物です。電気エンジニアのべーたです。

今回は簡単にモータを回して遊ぶ方法をご紹介します。
趣味で工作をされる方にはArduinoやmbedで動かしている人が多いので、それらとは違うアプローチで動かしてみます。
 

サーボモータを動かす

ラジコンサーボを動かしてみましょう。ラジコンや工作をする方にはおなじみのアクチュエータですね。こんなやつです。

DSC_0677

MG-90S (Tower Pro 社製)

制御回路やモータドライバ、ギアやポジションセンサがパッケージングされている便利なモータです。

電源と、たった1本の信号線を繋ぐだけで動作させられるので簡単に扱うことができます。サーボモータは目標角度の指令を入力すると出力軸が目標角度まで回転します。ミニ四駆に入っているようなブラシモータとは違って何回転も回すことはできませんが、ある角度の範囲内であれば大きな力で指令の向きまで出力軸の向きを変えてくれます。

どんな信号が必要か

一般的な小型のサーボでは電源電圧に4.8から6Vを与えます。位置指令はパルスの長さで与えます。このとき、パルスの長さが1.5ms(ミリ秒)で中央となり、そこから±0.5ms程度でそれぞれ両端まで動くサーボが多いようです。これについては様々な方が解説してくれているのでそちらへ譲ります(「サーボ 動かし方」などでググって下さい)。

ところで、サーボへ入力するパルスの電圧振幅はどれくらいが良いのでしょうか。一般的には、LレベルはGNDでHレベルはサーボに与えている電源電圧でしょう。

では、ちょっと真面目に考えてみます。サーボモータのトルクを目いっぱい使いたい時には6Vの電源を用意するでしょう。しかし6Vの信号を出力できるマイコンはそうそう無いはずです。逆にマイコンが5Vや3.3Vで動作している場合はサーボの電源も合わせて5Vや3.3Vを供給しなければならないでしょうか?

私が実際にサーボモータに6Vを供給し、マイコンから3.3Vのパルスをサーボに与えてみたところ、正常に動作することを確認しました。手元で1台動いたからと言っても100台で正しく動くでしょうか?1000台では……?設計者がもしもこのままサーボを量産で使ったとしたら歩留まりが気になって眠れなくなってしまいます。実際にはどれくらいの電圧の信号が許容されるのでしょうか?エビデンスを残しましょう。

その答えはサーボモータに内蔵されている制御回路を司るICのデータシートにありました。電気エンジニアにとっては非常にメジャーなICメーカに新日本無線という会社があります。このメーカがサーボに内蔵されている制御用ICを製造しているようです(互換品をルネサスや中国メーカも製造しています。電気的仕様もほぼ同じようです)。

では、NJM2611のデータシートを見てみましょう。注目すべきは「電気的特性」の表です。

電気的特性

NJM2611データシートより

「最小パルス電圧」という項目がありました。所謂「Hレベルの入力電圧VIH」と同様のパラメータでしょう。これによると「最小1.85V」とあります。言い換えると、Hレベルが1.85V以上のパルスを与えれば良いということになります。

これで3.3Vや5V振幅のパルスで問題ないというエビデンスが得られました。すっきりしましたね。(どうやら他メーカのサーボコントローラICも同様の入力特性であり、おおよそTTLレベルと考えて良さそうです)
 

マイコンを動かそう

さて、どのような信号を用意すれば良いのかがわかったので実際に信号を作っていきましょう。マイコンからはパルス幅が最小1ms, 最大2msのワンショットパルスを出力することにします。それをタイマ割り込みで20ms程度毎に出力すれば良いでしょう。こういう場合にトラディショナルなマイコンであれば、

タイマのレジスタを探す → ワンショット動作&ピン出力に設定 → コンペア値をセット

というような手順を踏むかと思います。最近の高級な開発環境であればタイマ周りの設定をするAPIが提供されていて、それを叩く方が多いでしょうか。そこで、今回はモータを回すのが目的なので、面倒な設定を考えずに済むPSoC5LPを使ってみます。PSoC5LPとは、ARM Cortex-M3コアとプログラマブルロジックを搭載したマイコンです。このプログラマブルロジックを使うにはGUIで線を繋いでいくだけできます。ペリフェラルを自由に構成することができるため、PWMをたくさん欲しい時に重宝します。他にどのような活用方法があるのかは拙著のプレゼン資料をご覧いただくか、ちょうど PSoC Advent Calendar 2016 が開催されています。こちらを眺めてみると良いでしょう。私が初めてPSoC5を使った時はマイコンのアーキテクチャを意識せずに扱えるのがとても新鮮だったことを覚えています。

今回はPSoC Creator にて提供されているPWMコンポーネントを使います。ツリーからPWMと出力ピン、クロックを持ってきてこのように繋ぎました。リセットを操作するためにControlRegを接続しました。

コンポーネントの配置と配線

コンポーネントの配置と配線

パルス幅の分解能を10us単位にすると扱いやすそうだったのでクロック入力は100kHzとしました。8bit幅なので0.01msから2.55msまでのパルスを生成できます。続いてPWMコンポーネントをダブルクリックして表示されるダイアログを設定します。

PWMコンポーネントの設定

PWM

PWMコンポーネントの設定

こんな感じにしてみました。

ポイントは Run Mode を “One Shot with Single Trigger” にするところでしょうか。デフォルトの “Continuous” のままでは間髪入れずにパルスが出続けてしまいます。ワンショット動作であれば、Trigger後に1つしかパルスが出ないので、トリガをソフトウェアから適切なタイミングで与えるようにします。
 

基板を作る

サーボを動かせそうな目処が立ったので、せっかくなので基板を起こしてみます。そのほうがたくさんのサーボを接続するのが楽です。

最近は無料でもそれなりの機能をもっていて、回路図から基板ガーバ作成までできるソフトウェアが増えてきました。CircuitMaker(オススメ)KiCAD(日本語文献が豊富)DesignsparkPCBなどが流行っているようです。更に、格安で基板を作れるサービスも増えてきました。スイッチサイエンスPCB(日本語で利用可)やSeeedStudioのFusionPCB(オプション豊富で安い)、ElecrowのPCB Prototyping service(基板だけでなくステンシルも安い)などが非常に安価に利用可能です。5cm角の両面基板なら10枚で10ドル程度から製造してくれます。ユニバーサル基板と変わらない値段ですね。

では、まずは好きなCADを使って回路図を引きます。PSoCはIOピンを非常に自由に割当可能なのでざっくり適当に引きます。

回路図

これを

ここから基板を引きます。モータ用電源はマイコンとは分離してアートワークするのがポイントです。

基板

こうして

こうしてできたデータを今回はElecrowで製造してみました。基板が9.5ドルと送料がOCSで13.23ドルでした。

こうじゃ

こうじゃ

部品をはんだ付けして完成です。

要求電流の見当がつかない上に、電流をたくさん流せるような電源コネクタを用意するのが面倒だったので、横着して圧着端子直付けにしてしまいました。良い子のエンジニアは真似しないでくださいね。これは後々サーボの評価とキャリブレーションに使う予定です。
 

ソースコード

PWMやControlRegはAPIを使って操作します。APIのリファレンスはデータシートを読んでいただくとして、叩く必要のあるAPIは以下で済みそうです。

void PWM_Start(void)

void PWM_WriteCompare(uint8/16 compare)

void ControlReg_Write (uint8 control)

これらを、タイミングよく操作するために一定間隔で割り込みを発生させます。プログラマブルロジックをなるべく消費したくないので、ARM系CPUが必ず持っているSystickと呼ばれるカウンタを使ってみます。設定は以下です。

CyIntSetSysVector(15,<割り込みルーチンへのポインタ>);

SysTick_Config( (<バスクロックの周波数>) / <割り込み周波数>);

これらを使ってサイン波のテーブルを順次読み出すようにしてみました(ソースはこちら)。

動作確認ができました。この基板はサーボをたくさん接続できるようにしたので、せっかくなので繋いでみます。Creator上でコンポーネントを並べます。コピペを多用します。

PWMコンポーネント1つあたり2本のPWMを出せます

PWMコンポーネント1つあたり2本のPWMを出せます

コードも同様にコピペで増やします(ソースはこちら)。

それぞれのサーボが独立して動いているのがおわかりいただけるでしょうか。ハードウェアタイマを使って16本のPWMを出力しています。他のマイコンではなかなかできない芸当ですよね。

この状態でもまだまだ半分以上のリソースが余っているので50本以上のPWMを出力することができそうです。サーボに限らず一般的なDCモータやブラシレスモータも楽に駆動できそうです。
 

たくさんのモータを回しています

という事で、絶賛開発中のタチコマには20を超えるモータが搭載されています。現在は様々なアクションを楽しんでいただけるよう調整を行っています。もちろん、機能はモータだけではないですよ。これからの発表を是非楽しみにしていてください。

ぼくタチコマ

ぼくタチコマ

※写真は開発中のものです。
 

Reference:

Cerevo Blog: 「攻殻機動隊」に登場するタチコマを現実世界に再現するプロジェクトを開始
Engadget Japanese: Cerevo、1/8スケールの『タチコマ』をニコニコ超会議で披露。クラウド経由で学習内容の並列化機能も搭載予定?