はじめに
サーボドライバは、サーボモータを制御するためのモジュールです。
サーボモーターは、主にGWS S03T 2BBMGとHSR-5980SGを使用します。
それぞれのパルス幅の範囲は,1.5ms±0.8ms(A08),1.5ms±0.5ms(A04)となっており,パルスの周期は20msなっています.
注意点
サーボドライバのアドレス設定は,基本アドレスの0x06に4bitDIPスイッチの値を4回左シフトした値を足したものになります.
>例)Address = 0b0000 0110(基本アドレス:0x06) + xxxx(4bitDIPスイッチの値) 0000
4bitDIPスイッチの値が0b0010の場合,0b0010 << 4 = 0b0010 0000となるため,
サーボドライバのアドレス = 0b0000 0110 + 0b0010 0000 = 0b0010 0110 = 0x26となる.
下にDIPスイッチがOFFの場合の画像を記載します.
回路
・回路図
回路図はBSch3Vで作成しました.ファイル名は,servo2012.CE3となっています.下に回路図を記載します.
・回路の説明
上に書いたように,サーボのパルスの周期は20msであるため,1つのサーボにつき2.5msを割り当てることで,1つのPWM端子で8つのサーボを制御できる.
PWM信号の分配器には,74HC238を使用します.常にG1にPWMを,G2A,Bは0の状態にします.そして,A,B,Cの組み合わせによって,Y0~Y7のどこに信号を流すかを決定します.
詳しくは74HC238のデータシートを見てください.
基板
基板図は,mbe(Minimal Board Editor) を使用して作成しました.ファイル名は,servo2012.mb3となっています.
・表面
・裏面
プログラム
・概要
サーボドライバのプログラムは,高速PWM制御,flash memoryの読み込みとマスターからのコマンドとデータの受信を主に行っている.
以下にそれぞれの項目についてまとめる.
・高速PWM制御(ATmega168)
TCNT1は0からICR1の値になるまでカウントする.つまり,ICR1によって,パルス幅を設定するということです.
(今回はICR1の値を50000に設定して,TCNT1は0~50000までカウントされます)
そして,OCR1Aの値によってOC1AのON,OFFを決めます.
OCR1Aの値または,ICR1の値とTCNT1の値が同じになった時に,OC1Aをセットまたはクリアします.
OC1Aがセットかクリアどちらの状態で始まるのかはCOM1Aで決めます.
(今回はセットされた状態から始めるので,COM01Aの値は0b10です。【非反転動作】)
WGM1では波形生成種別を設定する※データシートに表が載ってます.
(今回はICRをTOP値とする高速PWM制御をするのでWGM1 3~0は0b1110に設定してください)
COM01AやWGM1はTCCR1AとTCCR1Bの中にあります.(データシートに書いてあります)
・flash memoryの読み込み
flash memoryへの読み込みを行うには,まずavr/pgmspace.hをインクルードします.