パソコンのUSBを抜くと、突然マシンの電源が入るのはなぜですか?arduinoボードのオートリセット機能と関係があるのでしょうか?
String input = "";
void setup(){
Serial.begin(9600); // Sets up communication with the serial port
pinMode(6,OUTPUT);
pinMode(7,OUTPUT);
pinMode(8,OUTPUT);
pinMode(9,OUTPUT);
pinMode(10,OUTPUT);
pinMode(11,OUTPUT); // for start of program operation
digitalWrite(6,HIGH);
digitalWrite(7,HIGH);
digitalWrite(8,HIGH);
digitalWrite(9,HIGH);
digitalWrite(10,HIGH);
digitalWrite(11,LOW);
}
void loop(){
int recipe;
//Serial.print("Enter recipe number: ");
while(Serial.available()==0){ // Waits for data from serial port
}
while(Serial.available() > 0){
int data = Serial.read();
// convert the incoming byte to a char
// and add it to the string
input += (char)data;
recipe = input.toInt()+'0'; //recipe=0 if not a digit
if(recipe == '0')
recipe = data;
if(data == '\n'){
//Serial.print("Recipe: ");
//Serial.println(recipe);
//Serial.print("String: ");
//Serial.println(input);
input = "";
}
}
if(recipe == 's'){
digitalWrite(11,HIGH);
delay(1000);
digitalWrite(11,LOW);
digitalWrite(6,LOW);
digitalWrite(7,LOW);
digitalWrite(8,LOW);
digitalWrite(9,LOW);
digitalWrite(10,LOW);
}
else if(recipe>'0' && recipe<'32'){
recipe = recipe-'0';
char binary[7] = {0}; // This is where the binary representation will be stored
recipe += 32; // Adding 32 so that there will always be 6 digits in the string
itoa(recipe,binary,2); // Convert recipe to a string of base 2 and save it in array 'binary'
char* signals = binary + 1; // Get rid of the most significant digit to get the 5 bits
//Serial.print(signals); // Print out the signals in binary
int i;
for(i=0; i<5; i++){
if(signals[i] == '0')
signals[i] = '1';
else
signals[i] = '0';
digitalWrite(i+6, signals[i]-'0'); // write to pin; converts the bit of the string to HIGH or LOW
//Serial.print(signals[i]);
}
}
else
loop();
}
loopから
loop` を呼び出さないようにしてください。すぐに RAM が足りなくなり、スケッチがクラッシュしてしまいます。
void loop(){
int recipe;
//Serial.print("Enter recipe number: ");
while(Serial.available()==0){ // Waits for data from serial port
}
while(Serial.available() > 0){
...
}
else
loop();
}
Highになるはずのピンには、プルアップ抵抗をお勧めします。
pinMode(6,OUTPUT);
pinMode(7,OUTPUT);
pinMode(8,OUTPUT);
pinMode(9,OUTPUT);
pinMode(10,OUTPUT);
pinMode(11,OUTPUT); // for start of program operation
digitalWrite(6,HIGH);
digitalWrite(7,HIGH);
digitalWrite(8,HIGH);
digitalWrite(9,HIGH);
digitalWrite(10,HIGH);
Arduinoの電源が入ると、1秒ほどブートローダに入ります。これらのピンはまだHighに設定されていません。プルアップ抵抗を使用すれば、LowにしたいときまでHighであることを確認できます。
Arduinoの電源を切るとマシンの電源が入るということであれば、やはりプルアップ抵抗を使って、指令があるまで動作しないようにするのがよいでしょう。
プルアップ抵抗はどこに、どのように接続するのですか?
一般的にプルアップ抵抗は10k程度で、ピンから+5Vに接続されます。もちろん、Arduinoに電源が供給されていない場合は、+5Vの別の電源が必要です。
ループからループへ呼び出さないようにする。
この2行を削除してください。
else
loop();
loop` が終了したとき、すぐに再コールされますか。そのようにする必要はありませんし、むしろバッドアイディアです。
あなたの設定にあるこの行のようです。
digitalWrite(11,LOW);
...すると接点入力211がトリガーとなり、スケッチが起動するたびに "D11がオフからオンに切り替わるときにプログラム動作開始"を実行します。
arduinoがリセットされると、このラインをLowにします。 オートリセットはこれを開始します。
この行を以下のように変更することで、コードは 's' を取得するまで待ってから、この行をLowに引きます。
digitalWrite(11,HIGH);
私はArduinoを持っていませんが、おそらくhttp://playground.arduino.cc/Main/DisablingAutoResetOnSerialConnection、オートリセットの問題を管理するのに役立つかもしれません。