ワイヤレスリモコンを改造しよう5

前回の続き

前回まではRaspberry Pi 3を使っていて、Pythonで指定したパルス幅と実際があわないから、なんとかしたいと思いつつArduinoでやってみることにした。基本的には制御部分を移植しただけ。結局のところ、390usとか990usというのをそのものずばりは作り出せなかったから、測定しながら適当に調整してこんな感じになった。Arduinoもあんまりだ、という結論でいいのか、そもそも作り方がよくないのか、誰か教えてください。さらにWifiで通信する部分も移植したかったんだけど、うまくいかずに今のところ断念。

#define O 4 // control signal output pin
#define SHORT 390 -20 // target - adjustment us
#define LONG  990 -10 // target - adjustment us
#define INTER 9930 -1000 // us
#define NUM 5 // repeat the same command

String inputString = "";         // a String to hold incoming data
bool stringComplete = false;  // whether the string is complete

String on    = "0001010100010101010101110";
String off   = "0001010100010101010101000";

void setup() {
  pinMode(O, OUTPUT);
  digitalWrite(O, LOW);

  Serial.begin(9600);
  inputString.reserve(200);  // reserve 200 bytes for the inputString:
}

void short_out(){
  digitalWrite(O, HIGH);
  delayMicroseconds(SHORT);
  digitalWrite(O, LOW);
  delayMicroseconds(LONG);
}

void long_out(){
  digitalWrite(O, HIGH);
  delayMicroseconds(LONG);
  digitalWrite(O, LOW);
  delayMicroseconds(SHORT); 
}

void modulate_out(String s){
  int l = s.length();
  Serial.println(l);
  int i, j;
  short_out();
  for(j=0;j<NUM;j++){
    delayMicroseconds(INTER);
    for(i=0;i<l;i++){
      char c = s.charAt(i);
      if(c == '0'){ short_out(); }
      else{ long_out(); }
    }
  }
}

void loop() {
  // put your main code here, to run repeatedly:
  if (stringComplete) {
    Serial.println(inputString);
    if(inputString.startsWith("on")){
      Serial.println("command on");
      modulate_out(on);
    }
    else if(inputString.startsWith("off")){
      Serial.println("command off"); 
      modulate_out(off);
    }
    // clear the string:
    inputString = "";
    stringComplete = false;
  }
}

void serialEvent() {
  while (Serial.available()) {
    // get the new byte:
    char inChar = (char)Serial.read();
    // add it to the inputString:
    inputString += inChar;
    // if the incoming character is a newline, set a flag so the main loop can
    // do something about it:
    if (inChar == '\n') {
      stringComplete = true;
    }
  }
}