マイコン(マイクロコントローラ)を使って、楽したり節約したりに調整してみようと思います。気軽に見てください。
パソコンしながらTickToKなどの動画を聞き流すことが多いのですが、最近、アプリの自動スクロール設定が効かない動画がちょくちょく入ってくるようになったため、指の代わりにタッチペンを自動で動かす装置をPICマイコン&サーボモーター&レゴパーツで作ってみました。
実際に動かしている様子がこちら↓
主な部材
サーボモーター(RCサーボ)
動力としてラジコンなどで使われるサーボモーター(SG92R)を使用しました。
これを動作させるためのPWM信号は周期20ms(周波数50Hz)でパルス幅0.5~2.4msに変化することで角度を制御角0~180°の範囲で制御できます。
タッチペンの固定
タッチペンは100均で購入したものを使用
これをRCサーボに小型の結束バンドで固定したのですが、スワイプ動作による遠心力でズレてしまうことが判ったため、サーボアームの穴に合わせてミニバイスで穴を開け、ピンヘッダを差し込むことで改善を図りました。
レゴでフレーム製作
昔、レゴ・マインドストームという学習キットで子供と遊んだことがあり、それに使われているレゴテクニック系のパーツを使ってフレームを組んでみました。
パーツ形状で制約がある中、試行錯誤するのはなかなか楽しいもので、レゴってよくできたおもちゃだとあらためて思いました。
【タッチペンを取り付ける部分(A)】
【スマホを載せる部分(B)】
【組み立てた状態(A)+(B)】
マイコン(ハードウェア)
今回はPICマイコンでRCサーボを制御して、タッチペンを回転させることでスワイプ動作をさせます。RCサーボを制御するにはPWM出力の機能が必要になるため今回は手持ちPICの中からPIC16F1778を使用しました。
フレーム組み立て詳細
組み立て方法を記録するのに写真以外の方法がないか調べたところ、bricklink から提供されているLEGO STUDIO 2.0というツールが使えそうなのでインストールした上で今回の装置のフレームを作成してみました。
LEGO STUDIO 2.0にはレンダリング機能もついていて、レンダリングしてみたところスタジオで撮影したのか!ってぐらいきれいに描画されています。
実物の写真
レンダリング画像
今回、LEGO STUDIO 2.0をインストールした理由として組み立て方法の記録を残すという目的があったのですが、それを実現する機能として「Instruction」機能があります。「説明書」を作る機能です。編集中の画面がこちらです。
完成した組み立て説明書はこちら↓
制御基板の回路
回路図は上記になります。
PICのRB0ピン(21番ピン)からPWM信号を出力し、RCサーボのPWM入力で受けています。
PICのRA0ピン(2番ピン)に可変抵抗を接続し、入力電圧を変更することでスワイプしてから次のスワイプを行うまでの時間を変更できるようにしています。
USBシリアル変換モジュール(FT232RL)は上記RA0ピンの読み取り値を確認するなど調整のために使用したのですが、VDDの供給も兼ねているので調整完了後も電源供給用コネクタとして使用しています。
基板外観
ブレッドボード上に上記回路を実装した状態です。
PICマイコンのソフトウェア
PICのソフトウェアはMPLAB X IDEのMCC機能を使用して作成しました。
プロジェクトを作る際、DeviceにPIC16F1778を選びます。
MCC設定
MCCを起動し、ProjectResourcesに「ADC」「EUSART」「PWM11」「TMR2」を追加します。
Pin Manager
PinManagerでADCに使用するピンとしてPortAの0(2番ピン)を選択します。
PWM11の出力ピンとしてPortBの0(21番ピン)を選択します。
ESUARTのRX(18番ピン)、TX(17番ピン)は自動で割り当てられます。
System Module
SystemModuleを選択し、System Clock Selectを「FOSC」、Internal Clockを「2MHz_HF」を選択します。
ADC
ADCの設定はデフォルトのままでよいと思います。
私が参考にしている書籍には1TADの時間が1μs以上になるようにするとの記述があります。
今回はデフォルトで1μs以上を満たしていたのでそのままにしました。
EUSART
開発する際、PICがプログラム通り動いているかをパソコンで確認するため、USBシリアル変換モジュール(FT232RL)とのUART通信機能が必要なのでMCCで設定しました。
printf命令を使うため「Redirect STDIO to USART」にチェックを入れます。
PWM11
PWM11のClockを「FOSC」,「No_Prescalar」、Periodを「20ms」、DutyCycleを「2.5%」に設定します。RCサーボのところで触れたPWM信号の周期20msがPeriodの「20ms」に当たります。
この設定画面のDutyCycleはPIC起動後の初期値だと思われるため、20ms×2.5%=0.5ms ⇒制御角0°にしておきます。
DutyCycleCountが1000になっているのは2MHzクロックにおける20msは40000周期となり、その2.5%は1000周期となるからです。したがって制御角180°時=2.4msは4800周期となります。
TMR2
0.5s毎に動作するタイマーを作成します。この周期で条件を判断し装置の動きを決めます。
ADC読み取り値の確認
PICのAN0(2番ピン)に接続した10kΩ可変抵抗のボリュームを回転することでAN0の値がどのように変化するかをパソコンで確認した時の画面です。
1~1023の範囲で変化しました。この値の変化を使ってスワイプ間隔(時間)を調整できるようにします。
ADC値を読み取るには ADC_GetConversion() という関数を使用するのですが、()内のチャネル名にはMCCのPin ModuleでAN0のCustumNameに指定した名称を入れます。
今回はPin Moduleで「POT1」と名付けましたので記述はADC_GetConversion(POT1)となります。
PICのコード
PICのソースコードは以下です。
17~21行目がタッチペンをスワイプ動作させる関数でset_dutyにはDutyCycleCount(1000~4800)を指定することで対応する角度までスワイプします。この動作はスワイプ後の定位置に戻すまでの動作にも使用しています。
42~45行目で初期位置の0°(DutyCycleCount=1000)から約110°(DutyCycleCount=2300)までスワイプさせます。
50~51行目で初期位置(DutyCycleCount=1000)まで小刻みに戻しています。
38~39行目でADCから取得した1~1023の値を待ち時間(30~122カウント)置き換えています。
振り返り
ADCやPWMモジュールの設定、使用クロックの選択など最適ではない部分が多々あるとは思いますが、いろいろなものを作って試行錯誤するうちに覚えていければよいかなと考えています。