TD4の命令を実行できる自作CPU「Kageki」 でサーボ SG90 を操作してみた。
サーボ SG90
SG90 は、小型サーボであり、電気信号によって回転角度を制御することができる。
例えば秋月電子通商で売られている。(M-08761)
以下のように、20ms間隔で0.5~2.4msのパルスを与えることで制御を行う仕様である。
回転角度はパルスの幅で表現する。
今回の仕様
サーボを制御する用の信号を、出力ポートのビット0から出力する。
入力ポートの値により、パルスの幅を変える。値が大きいほどパルスを長くする。
プログラム
位置 機械語 アセンブリ言語
--------------------------------
0 00100000 FIRST: IN A
1 10110001 OUT 0001
2 01010001 WAIT1: ADD B, 0001
3 11100010 JNC WAIT1
4 00001111 SIG: ADD A, 1111
5 11100111 JNC OFF
6 11111000 JMP NOOFF
7 10110000 OFF: OUT 0000
8 01010001 NOOFF: ADD B, 0001
9 11100100 JNC SIG
A 00110000 MOV A, 0000
B 01010001 WAIT2: ADD B, 0001
C 11101011 JNC WAIT2
D 00000001 ADD A, 0001
E 11101011 JNC WAIT2
F 11110000 JMP FIRST
0番地:入力ポートの値を読む。
1番地:信号をHIGHにする。
2~3番地:固定の時間待つ。
4~9番地:入力ポートの値によって変わるタイミングで信号をLOWにする。
A~E番地:二重ループにより、長めの時間待つ。
F番地:最初に戻る。
実行結果
50kHzのクロックで実行した。
動作の様子
軸の回転により0~Fを切り替え、2進数で出力するスイッチを用いた回路を入力ポートに接続した。
これにより、入力ポートに 0000
~ 1111
を入力し、それに応じてサーボが回転している。
信号の確認
オシロスコープ FNIRSI-1013D を用い、出力信号を観察した。
パルスの間隔の確認
0000
を入力したとき、パルスの間隔は 13.1ms であった。
仕様の 20ms よりかなり短いが、動いたのでヨシ…?
1111
を入力したときも、パルスの間隔は 13.1ms であった。
パルスの間隔は入力によらないようである。
パルスの幅の確認
0000
を入力したとき、パルスの幅は約 0.7ms であった。
1111
を入力したとき、パルスの幅は約 2.2ms であった。
いずれも、仕様 (0.5~2.4ms) 内に収まっている。