前回までは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; } } }