#include <avr/io.h>
const int potPin = A0; // ポテンショメータのアナログピン
void setup() {
Serial.begin(115200); // シリアル通信の初期化
ADCSRA = (1 << ADEN) | (1 << ADPS2) | (1 << ADPS1) | (1 << ADPS0);//AD変換を有効,分周比128
DDRB |= (1 << PB1); //9ピンを出力
ADMUX = (1 << REFS0); //デフォルトの参照電圧(Arduino Unoの場合は5V)
// タイマー1の設定
/*
TCCR0A = (1 << COM0A1) | (1 << WGM01); // 非反転モード、Fast PWMモード
TCCR0B = (1 << WGM02) | (1 << WGM01) | (1 << CS01);
ICR1 = 20000; // TOP値を設定(20ms周期になるように調整)
*/
TCCR1A = (1 << COM1A1) | (1 << WGM11); // 非反転モード、Fast PWMモード
TCCR1B = (1 << WGM12) | (1 << WGM13) | (1 << CS11); // プリスケーラを8で設定、
ICR1 = 40000; // TOP値を設定(20ms周期になるように調整)
}
void loop() {
// AD変換開始
ADCSRA |= (1 << ADSC); // ADSCビットをセットして変換開始
// 変換が終了するまで待つ
while (ADCSRA & (1 << ADSC)) {}
// アナログ値を読み取る
uint16_t sensorValue = ADC;
Serial.print("Analog Value: ");
Serial.println(sensorValue);
delay(100); // 少し待つ
// ポテンショメータの値をサーボ角度に変換(0-180度にスケーリング)
int servoAngle = map(sensorValue, 0, 1023, 0, 180);
// サーボ制御のためのPWM信号を生成
int onTime = map(servoAngle, 0, 180, 1000, 4800);
generatePWM(onTime); // オンタイムに基づいてPWM信号を生成
/*
generatePWM(1000); // オンタイムに基づいてPWM信号を生成 (0.5ms)
Serial.print("1000");
delay(2000);
generatePWM(3000); // オンタイムに基づいてPWM信号を生成 (1.5ms)
Serial.print("1500");
delay(2000);
generatePWM(4800); // オンタイムに基づいてPWM信号を生成 (2.4ms)
Serial.print("2000");
delay(2000);
//analogWrite(9, pulseWidth / 8);
*/
delay(15); // サーボの移動を安定させるための遅延
}
void generatePWM(int pulseWidth) {
// オンタイムの長さだけ待つ
OCR1A = pulseWidth;//PWM波形のHIGHの時間を決める。
}
/*
void generatePWM(int pulseWidth) {
// タイマー1を使ってPWM信号を生成
TCCR1A = 0; // タイマー1のモード設定(通常動作)
TCCR1B = (1 << WGM12) | // CTCモードで動作(TOP値に達したらカウンタをリセット)
(1 << CS11) | // プリスケーラを8に設定
(1 << CS10);
OCR1A = 20000; // TOP値の設定(20ms周期になるように調整)
// サーボ信号をHIGHに
TCCR1A |= (1 << COM1A1);
TCCR1A &= ~(1 << COM1A0);
// オンタイムの長さだけ待つ
delayMicroseconds(pulseWidth);
// サーボ信号をLOWに
TCCR1A &= ~(1 << COM1A1);
TCCR1A &= ~(1 << COM1A0);
}
*/