サーボ制御とか

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;
    }
  }


}