授業の事前準備
CHIRIMEN Hello world Edu
、
CHIRIMEN I2C sensor
の講義を終えておく。
サーボモータレシピ
を参照し、サーボモータを制御するデモが実演できる状態にしておく。
授業の開始
授業の目的、期待する成果について説明する。
学習の目的
CHIRIMENでサーボモータを扱う方法を理解する。
ロボットがどのように動いているのかを体感する。
学習の成果
MUST
見本通りにサーボモータ回路の配線を行い、サンプルアプリを使用してCHIRIMENでサーボモータを動かすことができる。
SHOULD
ライブラリを用いてCHIRIMENからサーボモータを制御する方法を理解し、自由な角度に動かすことができる。
MAY
複数のサーボモータを制御することができる。
サーボモータの特性を理解して、サーボモータを組み合わせたロボットやロボットアームの制御を行うことができる。
デモンストレーション
用意しておいたサーボモータ制御デモを用いて実演を行う。
学生に講義の達成イメージを認識させる。
学習の準備
学生のグループ分けを行う。
機材を配布する。
学生のグループ分け
授業の人数に応じて学生のグループ分けを行う。
1グループ4人が理想。
機材の配布
各グループに機材を配布する。
CHIRIMEN
microUSBケーブル
microHDMI-HDMIケーブル
ACアダプタ
HDMIディスプレイ
サーボモータ
サーボドライバ
ルーホール用ジャンパワイヤ適量
サーボモータとは?
サーボモータとは、回転位置を制御することができるモータで、ロボットの関節部分などに用いられることが多い。
回転位置の検出器付きのモーターで、フィードバック制御されるものが一般的。
サーボモータ - Wikipedia
サーボモータサンプルアプリの実行
サーボモータアプリのダウンロード
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:サーボモータ制御後の処理
サーボドライバ
サーボモータはPWM信号で制御されることが一般的。PWM制御とは電源オン/オフのパルス間隔を変化させることで制御を行う方式である。
CHIRIMENからPWM信号を出力するために、I2Cインターフェースを持つサーボドライバを使用する。
サーボドライバはI2Cの信号を受けて、PWM信号によってサーボモータを制御する。
MMMDB - PWM制御
複数のサーボモータを制御する方法を指導
サーボドライバには最大で16個のサーボモータを接続することができるため、複数のサーボモータを接続して制御してみる。
サーボモータの角度や個数によってはCHIRIMENからの電力供給では不足するため、外部電力を用いる。
CHIRIMENの破損や怪我につながりやすいため、外部電力を扱う場合は配線などに十分に注意する。
サーボモータの特性を指導
サーボモータでは回転位置検出とフィードバック制御が行われているため、サーボモータに物を取り付けた場合など、トルク不足や回転の反動などで正しく制御できない場合がある。
サーボモータの動きを確認することで、サーボモータのトルクや供給電力の特性を学習する。