サーボのプログラムを更新しました
サーボ(といくかアクチュエイター)の負荷を下げるために稼働時間を短く(速く動かす)しています
#include <Servo.h>
unsigned long mytime = 0;
unsigned long hittime;
unsigned long duration;
boolean sensorBool = false;//センサ計測制御用
boolean servoUp = false;//servo上下のBool
boolean serialFilter = true;//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 < 130) {//3.3V is under 130 is read sw ON Long cable version
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;
serialFilter = true;
}
myservo.writeMicroseconds(map(power, 0, 255, 1500, 2000));
} else if (!servoUp) {
myservo.writeMicroseconds(map(0, 0, 255, 1500, 2000));
Serial.flush();
}
}
void serialEvent() {
if (Serial.available()) {
if(serialFilter){
serialFilter = false;
byte var = Serial.read();
int myvar = var - 0x30;//16進数でくるので16進数のゼロひく
//int myvar = int(var);
// switch (var) {
// case 1://stage UP
if(myvar > 8){
myvar = 8;
}else if (myvar < 0){
myvar = 0;
}
if(kaisu > -1 && kaisu < 9){ //ex2 var0
int sabun = myvar - kaisu;
//Serial.println(sabun);
servoUp = true;
if(sabun > 0){
power = 240;///up
}else if (sabun < 0){
power = -220;//down
}
startTime = millis();
servoTime = 350 * abs(sabun);
// if(kaisu > -1 && kaisu < 9){
if(myvar < 0){
kaisu = 0;
}else if (myvar >8){
kaisu = 8;
}else{
kaisu = myvar;
}
// Serial.println(kaisu);
//}
//kaisu--;
}
// break;
// case 2://stage Down
//else if(kaisu < 9){
// power = -180;
// servoUp = true;
// servoTime = 700;
// startTime = millis();
// kaisu++;
//}
// break;
}
}
}
なお,これに対応するUnity側のスクリプトは
using UnityEngine;
using System.Collections;
using System;//use for time
using UnityEngine.UI;//use for UI
using System.Threading;
public class serialSender2 : MonoBehaviour {
public SerialHandler serialHandler;
float myangle;
int kakudoDummy;
//Thread mythread;//use thread
public Text myuitext;
void Start () {
Invoke("startLoop", 10f);//10秒後にコルーチン開始
}
void Update () {
}
public void startLoop(){
StartCoroutine(angleSend());
}
IEnumerator angleSend() {
while (true) {
myangle = this.transform.localEulerAngles.x;
if (myangle < 360f && myangle > 180f) {
myangle = 360f - myangle;
}else{
myangle = (myangle * -1f) ;
}
myangle = Mathf.Round(myangle) + 4;//まるめた角度
if (myangle > 8) {
myangle = 8;
} else if (myangle < 0) {
myangle = 0;
}
string _myangle = myangle.ToString();
serialHandler.Write (_myangle);//send Angle
//ui display
myuitext.text = myangle.ToString ();
// Debug.Log(_myangle);
yield return new WaitForSeconds(5f);
}
}
}
です
角度を5秒ごとにサンプリングし,0〜8の数値(角度の近似値)に変化させシリアルで送信しています