Arduino側のプログラム(スケッチ)
#include <Servo.h>
unsigned long mytime = 0;
unsigned long hittime;
unsigned long duration;
boolean sensorBool = false;//センサ計測制御用
boolean servoUp = false;//servo上下のBool
int input_value;//A1入力値
Servo myservo;//サーボ設定
int kaisu = 0; // 角度のカウンタ max10で使うのは8がいい
int power;//サーボ動作速度
unsigned long startTime;//タイマー用
int servoTime;
void stageReset() {
myservo.write(0);//最大斜度にする(リセット)
delay(5000);//最大斜度になるのを待つ
//約4度傾けて水平にする
servoUp = true;
power = 180;
startTime = millis();
servoTime = 3200;
kaisu = 4;//4度にセット
}
void setup() {
Serial.begin(9600);
myservo.attach(9, 1000, 2000);
mytime = millis();
stageReset();//ステージ水平にする
}
void mysend() {
Serial.println(duration);//シリアルに計測時間送る
}
void loop() {
//回転間隔計測
input_value = analogRead(1);
if (sensorBool) {
if (input_value < 70) {//3.3V is under 70 is read sw ON
sensorBool = false;
hittime = millis();
duration = hittime - mytime;
mysend();
mytime = hittime;
}
} else if (!sensorBool) {
if (input_value > 300) {
sensorBool = true;
}
}
//サーボ動作
if (servoUp) {
if (millis() > startTime + servoTime) {
servoUp = false;
}
myservo.writeMicroseconds(map(power, 0, 255, 1500, 2000));
} else if (!servoUp) {
myservo.writeMicroseconds(map(0, 0, 255, 1500, 2000));
}
}
void serialEvent() {
if (Serial.available() > 0) {
byte var = Serial.read();
var = var - 0x30;//16進数でくるので16進数のゼロひく
switch (var) {
case 1://stage UP
if(kaisu > -1){
servoUp = true;
power = 180;
startTime = millis();
servoTime = 700;
kaisu--;
}
break;
case 2://stage Down
if(kaisu < 8){
power = -180;
servoUp = true;
servoTime = 700;
startTime = millis();
kaisu++;
}
break;
}
}
}