PICマイコンでサーボモータを動かしたい方
本記事ではPICマイコン(12F1822)を使ってサーボモータを動かす方法について紹介します。
arduinoなどのマイコンボードを使用するより小型化ができ、タイマーICやバイブレーター回路などより安定した動きができます。
サーボモータを動かすには一番良い方法かもしれません。
- サーボモータSG92Rの仕様
- PICマイコン(12F1822)の仕様
- コードの作成
- 配線(PICマイコンとサーボモータの接続方法)
サーボモータSG92Rの仕様
今回は「SG92R」というサーボモータを動かしていきたいと思います。
SG92Rは橙色の配線に制御信号を入力することで角度を指定します。
各スペックは下記の通りです。
- PWMサイクル:20ms
- 制御パルス:0.5ms~2.4ms
- 制御角:±約90°(180°)
- 配線:茶=GND、赤=電源[+]、橙=制御信号 [JRタイプ]
- トルク:2.5kgf・cm
- 動作速度:0.1秒/60度
- 動作電圧:4.8V
- 温度範囲:0℃~55℃
- 外形寸法:23×12.2x27mm
- 重量:9g
スペックに書いてあることから
20msに1サイクルのPWM波形(50Hz)を作り、パルス幅(HIGHとなる部分の長さ)を0.5ms~2.4msと変化させることにより -90°~+90° の合計 180°動く角度を変化させられることがわかります。
下記にパルス幅ごとの角度表を添付します。
ms | us | 角度 |
0.5 | 500 | -90 |
0.6 | 600 | -80.53 |
0.7 | 700 | -71.05 |
0.8 | 800 | -61.58 |
0.9 | 900 | -52.11 |
0.975 | 975 | -45 |
1 | 1000 | -42.63 |
1.1 | 1100 | -33.16 |
1.2 | 1200 | -23.68 |
1.3 | 1300 | -14.21 |
1.4 | 1400 | -4.74 |
1.45 | 1450 | 0 |
1.5 | 1500 | 4.74 |
1.6 | 1600 | 14.21 |
1.7 | 1700 | 23.68 |
1.8 | 1800 | 33.16 |
1.9 | 1900 | 42.63 |
1.925 | 1925 | 45 |
2 | 2000 | 52.11 |
2.1 | 2100 | 61.58 |
2.2 | 2200 | 71.05 |
2.3 | 2300 | 80.53 |
2.4 | 2400 | 90 |
PICマイコン(12F1822)の仕様
今回使用するPIC12F1822には8個のピンがあります。ピンの配置はMICROCHIP社が発行しているデータシートで確認できます。データシートにはピン配置以外にもいろいろな情報に乗っています。ネットで検索すれば出てくるので確認してみましょう。
番ピン(VDD)は電源のプラス、8番ピン(VSS)は電源のマイナスになります。また、2~7番ピンのRA0~5はIOピンとなっており、入出力ができるピンになっています。2~7番ピンには他にも機能が多くあり、それらはでデータシートで確認できます。
コードの作成
サンプルコードを下記に示します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 |
//12F1822_Servomotor_1 //コンフィグレーションの設定 #pragma config FOSC = INTOSC #pragma config WDTE = OFF #pragma config PWRTE = ON #pragma config MCLRE = OFF #pragma config CP = OFF #pragma config CPD = OFF #pragma config BOREN = OFF #pragma config CLKOUTEN = OFF #pragma config IESO = OFF #pragma config FCMEN = OFF #pragma config WRT = OFF #pragma config PLLEN = OFF #pragma config STVREN = ON #pragma config BORV = LO #pragma config LVP = OFF //ヘッダファイルの読み込みインクルード #include <xc.h> //その他の設定 #define _XTAL_FREQ 31250 //PICのセットアップ int main(void) { OSCCON = 0b00010000;//オシレータ31.25kHzに設定 ANSELA = 0x00;//全ピン デジタルI/Oピンとして設定 TRISA = 0b00011000;//RA3,4は入力 それ以外は出力に設定 PORTA = 0x00;//全てのピンを初期化(LOW(0)に設定) WPUA = 0b00011000;//RA3,4をプルアップする OPTION_REGbits.nWPUEN = 0;//プルアップ機能を有効にする //プログラム本体 while(1) { if(RA3 == 0) { //180° RA2 = 1; __delay_us(2400); RA2 = 0; __delay_us(17600); }else if(RA4 == 0){ //90° RA2 = 1; __delay_us(1450); RA2 = 0; __delay_us(18550); }else{ //0° RA2 = 1; __delay_us(500); RA2 = 0; __delay_us(19500); } } } |
RA3及びRA4を入力ピンとし、ともにプルアップさせています。
何もしていないときにはRA3,4ともにHIGHになっているため、サーボモータを0°にする波形を出力します。
RA3をLOWにすると180°回転する波形をRA2から出力し、RA4をLOWにすると90°回転する波形をRA2から出力します。
コードをPICマイコンに書き込む方法は別の記事
にて紹介してますので参考にしてください。
配線(PICマイコンとサーボモータの接続方法)
配線は下の写真のようになります。
黒のボタンを押すとプルアップされている4番ピン(RA3)がLOWになり、サーボモータが180°回転します。
また、茶色いボタンを押すとプルアップされている3番ピン(RA4)がLOWになり、サーボモータが90°回転します。
何も押していないとサーボモータが0°になります。