byte OK[] = {'O', 'K'}; byte NG[] = {'N', 'G'}; void setup() { // シリアル接続開始 Serial.begin(115200); // 3〜13PINを出力定義 for (int i = 3; i <= 13; i++) { pinMode(i, OUTPUT); } } void loop() { int c; c = Serial.read(); if (c != -1) { if (c == 'A') { if (Serial.read() == 'T') { Serial.write(OK, 2); //ATコマンドに応答 } } else if (c == 'P') { //NATOCコマンド if (Serial.read() == 'C') { c = Serial.read(); if (c == 'P') { //PWM用コマンド int val = Serial.parseInt(); //速度パーセント if (val == 0) { //停止 analogWrite(3, 255); //ブレーキモード analogWrite(5, 255); } else { int pwm = abs(val) * 255 / 100; //出力値換算 if (val < 0) { //後転 analogWrite(3, 0); analogWrite(5, pwm); } else { //正転 analogWrite(5, 0); analogWrite(3, pwm); } } } else { while (c != -1) { if (c == 'R') { //リレー制御 int pin = Serial.read() - '0' + 6; //リレーIDをピン番号に変換 if (pin > 13) pin = 4; //転車台用リレー c = Serial.read(); //ON/OFF値 if (c == '1') digitalWrite(pin, HIGH); else if (c == '0') digitalWrite(pin, LOW); } else if (c == 'T') { ///ポイント制御 int pin = Serial.read() - '0' + 6; //リレーIDをピン番号に変換 digitalWrite(pin, HIGH); int t = (Serial.read() - '0') * 1000 + (Serial.read() - '0') * 100 + (Serial.read() - '0') * 10; delay(t); //リレーのONの時間(1/100秒で指定) digitalWrite(pin, LOW); } else if (c == 'S') { //センサー制御 int pin = Serial.read() - '0'; //センサー番号 int val = (int) (((long) ((Serial.read() - '0') * 10 + Serial.read() - '0') * 1024) / 100); // しきい値(パーセント=00〜99)をアナログレベルに変換(0〜1023) long time = (long) Serial.parseInt() * 8200; //タイムアウト秒数(擬似的=8200は1秒のループ回数) long t = 0; while (analogRead(pin) > val) { //アナログ値がしきい値以上の場合はループ if (t++ > time) { Serial.write(NG, 2); //タイムアウト return; } } } c = Serial.read(); //次の命令取得 } Serial.write(OK, 2); //全ての命令処理応答 } } } else { //サーボに対するコマンド while (c != -1) { Serial.write(c); //全てをシリアルに転送 c = Serial.read(); } } } delay(100); //次のコマンドまで待機(これがないと命令を読み飛ばす事がある) }