機材の準備
CHIRIMEN
microUSBケーブル
microHDMI-HDMIケーブル
ACアダプタ
HDMIディスプレイ
サーボモータ
サーボドライバ
ルーホール用ジャンパワイヤ適量
サーボモータとは?
サーボモータとは、回転位置を制御することができるモータで、ロボットの関節部分などに用いられることが多い。
回転位置の検出器付きのモーターで、フィードバック制御されるものが一般的。
サーボモータ - Wikipedia
サーボドライバ
サーボモータはPWM信号で制御されることが一般的。PWM制御とは電源オン/オフのパルス間隔を変化させることで制御を行う方式である。
CHIRIMENからPWM信号を出力するために、I2Cインターフェースを持つサーボドライバを使用する。
サーボドライバはI2Cの信号を受けて、PWM信号によってサーボモータを制御する。
MMMDB - PWM制御
サーボモータサンプルアプリの実行
サーボモータアプリのダウンロード
Web I2C Polyfillの導入
サーボモータアプリの読み込み
サーボモータ回路の配線
アプリ実行
サーボモータが動作しない場合の対処
サーボモータアプリのダウンロード
CHIRIMEN examples
をダウンロード(Download zipというボタンでダウンロード可能)して、任意のディレクトリに展開する。
Web I2C polyfillの導入
webi2c.js
と
worker.js
をi2c-PCA9685/jsディレクトリ内にダウンロード(RAWボタンを右クリックして別名でリンク先を保存を選択)し、index.htmlからの
参照先
を以下のように変更する。(worker.jsはwebgpio.js内で参照されている)
<script src="./js/webi2c.js"></script>
bowerを使える場合、i2c-PCA9685ディレクトリに移動し以下のコマンドを実行することで導入することもできる。
$ bower install
サーボモータアプリの読み込み
Web IDE左上の「パッケージ型アプリを開く」からi2c-PCA9685ディレクトリを読み込む。
サーボモータ回路の配線
配線図に従ってサーボモータ、サーボドライバを接続する。接続にはスルーホール用ジャンパ線を用いる。
CHIRIMENのI2C0_SDA(CN2-12)、I2C0_SCL(CN2-11)とサーボドライバのSDA、SCLを接続する。
CHIRIMENのGND(CN2-1)、VCC(CN2-18)とサーボドライバのGND、VCCを接続する。
サーボドライバのV+(モータ用の電源入力)とVCCを接続する。
サーボモータのPWM、V+、GNDとサーボドライバのPWM、V+、GNDを接続する。
アプリ実行
配線が正しいことを確認し、CHIRIMENとPCを接続する。
アプリをインストールする。
正しく動作すればサーボモータが回転し始めることが確認できる。
サーボモータが動作しない場合の対処
サーボモータを動かすとCHIRIMENが落ちるという現象が発生。サーボモー タは多くの電力を必要とするため、PCのUSB端子(500mA電源)から電源供給する場合、駆動電力不足となる場合がある。以下の対処により回避できることがある。
サーボモータへの供給電力を3.3Vにしてみる。
CHIRIMENに対して1A以上(2A推奨)の電流を供給する。
サーボドライバへの電源供給をCHIRIMENと別系統で用意する。
プログラムの解説
サンプルプログラムの
index.html
、
main.js
について解説する。
Index.htmlでpolyfillの読み込みを行う
I2CAccessインターフェースを取得する(おまじない)
I2C端子の初期設定を行う
サーボドライバのコンストラクタ呼び出し
サーボドライバの初期化
温度センサの読み取り
温度センサの読み取り後の処理
Index.htmlでpolyfillの読み込みを行う
webI2Cを扱うためのpolyfill(webi2c.js)を読み込む。
code:polyfillの読み込み
I2CAccessインターフェースを取得する(おまじない)
I2Cの操作を行うため、I2CAccessインターフェースを取得する。
code:I2CPortMapインターフェースの取得処理
と
code:エラー処理
をおまじない的に記述する。
I2C端子の初期設定を行う
i2cAccess.ports.get(<ピン番号>)でi2cPortオブジェクトを取得する。
code:I2CPortオブジェクトの取得
。
CHIRIMENにはI2C0(CN2側)、I2C2(CN1側)の二つの端子が出ているため、ピン番号には0か2を指定する。
サーボドライバのコンストラクタ呼び出し
サーボドライバ(PCA9685)のライブラリを読み込む。
code:サーボドライバライブラリの読み込み
new PCA9685(<i2cPortオブジェクト>,<i2cデバイスアドレス>)でPCA9685のコンストラクタ呼び出しを行う。
code:PCA9685コンストラクタ呼び出し
PCA9685使用サーボドライバのデバイスアドレスは初期値が0x40なので、これを指定する。
サーボドライバの初期化
pca9685.init(<最小パルス>,<最大パルス>,<角度範囲>)のように、呼び出したコンストラクタのinitメソッドを使用してサーボドライバの初期化を行う。
code:サーボドライバの初期化
最小パルス、最大パルス、角度範囲はサーボモータの型番毎に設定されている値であり、データシートを読み取り設定する。サンプルコードではSG90というサーボモータの設定が入力されている。
#commit ID:b762ccの時点のプログラムでは、サーボドライバが全て同じ型番の場合でしか利用できないように作られているため改良する必要がある。
サーボモータの制御
サーボドライバの初期化処理の結果はPromise型で帰ってくる。そのため、pca9685.init().then(function(){ //サーボドライバ初期化後の処理 });のように記述する。
code:サーボドライバ初期化後の処理
サーボドライバの初期化後、pca9685.setServo(<チャンネル>,<角度>)のようにsetServoメソッドを利用してサーボモータを指定の角度に制御することができる。
code:サーボモータの制御
チャンネルはサーボドライバにサーボモータを接続しているチャンネルを指定する。
角度はサーボモータで制御可能な角度範囲内で整数で指定する。
サーボモータ制御後の処理
サーボモータの制御後の結果はPromise型で帰ってくる。そのため、pca9685.setServo().then(function(){ //サーボモータ制御後の処理 });のように記述する。
code:サーボモータ制御後の処理