1.硬體操作
動作說明:使用兩個SG90伺服馬達做為X軸與Y軸方向的轉向馬達,搭配一個搖桿作為轉向控制。當操作控制桿時,伺服馬達會隨搖桿控制幅度轉向至對應的位置。
控制板:Arduino UNO
材料: 伺服馬達SG90*2、XY軸控制桿*1
2.I/O與程式規劃
(1) 馬達控制: 2個PWM Output,輸出頻率操作在50Hz,Duty可操作在400us至2500us。
(2) 搖桿: 2個ADC Input,輸入X軸與Y軸電壓。
(3) 需要一個[map]函式,將ADC讀入值轉為馬達控制值。
3. PWM設定
(1)選D9與D10作為PWM輸出(Timer1)
(2)PWM操作在Mode14,所以要設定ICR1。
(3)在比較模式清除OC1A,OC1B,因此要設定COM1A1,COM1B1=1。
(4)需分頻除8,設定CS11=1。
16MHz/50Hz=320000 >65535,若以320000/65535=4.88,所以分頻要大於4.88,因此設除8。
ICR1=16MHz/8/50Hz=40000
(5)Duty正週期設定值400us~2500us,設定OCR1A,OCR1B=800~5000。
50Hz為計數40000次,所以1個Count=1/50Hz/40000=0.5us。
因此OCR1A=400us/0.5us=800
設定值整理如下
TCCR1A= (1 << COM1A1) | ( 1 << COM1B1) | ( 1 << WGM11)
TCCR1B= (1 << WGM13) | ( 1 << WGM12) | ( 1 << CS11)
4.完整程式碼
const int x_analogInPin = A0; const int y_analogInPin = A1; const int x_analogOutPin = 9; const int y_analogOutPin = 10; int sensorValue = 0; int outputValue = 0; void setup() { pinMode(x_analogOutPin, OUTPUT); pinMode(y_analogOutPin, OUTPUT); TCCR1A = ((1 << COM1A1) |(1 << COM1B1)| (1 << WGM11)); // TCCR1B = ((1 << WGM12) | (1 << WGM13) | (1 << CS11)); // ICR1 = 40000; //set ICR1 to produce 50Hz frequency (16000000 / 8 / 40000 = 50hz) OCR1A = 2000; // 40000 * 0.05 most left OCR1B=2000; } // the loop routine runs over and over again forever: void loop() { sensorValue = analogRead(x_analogInPin); if(sensorValue<=512) outputValue = map(sensorValue, 0, 512,1000, 2310); //MG90S=1600,5200 SG90=1000,4200 else outputValue = map(sensorValue, 513, 1023,2320, 4200); //MG90S=1600,5200 SG90=1000,4200 OCR1A = outputValue; // 40000 * 0.05 most left sensorValue = analogRead(y_analogInPin); if(sensorValue<=512) outputValue = map(sensorValue, 0, 512,1000, 2310); //MG90S=1600,5200 SG90=1000,4200 else outputValue = map(sensorValue, 513, 1023,2320, 4200); //MG90S=1600,5200 SG90=1000,4200 OCR1B = outputValue; // 40000 * 0.05 most left delay(20); }