arduinoと一緒にインストールされたマシンは、USBが抜かれたときに突然オンになります

コンピュータのUSBケーブルを外したときに、マシンが突然オンになるのはなぜですか? arduinoボードの自動リセット機能に接続していますか?

enter image description here

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();

}
0
シリアル接続を開くとボードがリセットされます。
追加された 著者 Al.,
回路図や配線を投稿し、マシン上のデータシートをポイントします。おそらく、アルドゥイノが消され、ピンがトライステートになると、あなたのマシンはもはやオンになることが禁止されなくなります。しかし、それはあなたの質問の情報に基づく推測に過ぎません。
追加された 著者 Dave X,
あなたの質問にそれを加えてください。エディタには、グラフィックスをアップロードできる小さな山形のアイコンがあります。
追加された 著者 Dave X,
あなたのArduinoはUSB経由でのみ電源供給されていますか、または代替電源はありますか?
追加された 著者 Dave X,
こんにちはDave X、スケマティックダイアグラムはどこに送ってもいいですか?電子メールや何かを持っていますので、配線コードとarduinoコードの両方を表示できます。前もって感謝します
追加された 著者 sborsher,
こんにちはデイブx、ここに行きます。あなたが関連付けるためにスケッチを追加しました。これは、レシピを自動的に選択することです。「レシピを送信」を押すと、ツールが自動的に開始されます。「開始」ボタンを1回押します。
追加された 著者 sborsher,
DaveXはいarduinoはツールのコントローラにも接続されており、これもボードに電力を供給します
追加された 著者 sborsher,
私はすでに自動リセットを無効にするために10ufのコンデンサを入れようとしましたが、PCからUSBケーブルを引き抜くとまだツールが起動します
追加された 著者 sborsher,

2 答え

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();

}

高いと思われるピンについては、プルアップ抵抗を推奨します。

  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秒ほど入ります。これらのピンはまだ高く設定されていません。プルアップ抵抗は、それらを低く駆動したい時まで、それらがハイであることを確認します。


あなたがArduinoの電源を切断したときにマシンがパワーアップしていると言っているのであれば、引き続きプルアップ抵抗を使用するのが良い理由です。そう。


どこでプルアップ抵抗を接続すればいいのですか?

通常、プルアップ抵抗は約10kΩで、ピンから+ 5Vに接続されています。もちろん、Arduinoに電源が供給されていない場合、+ 5Vの別の電源が必要です。


「ループからループにかけない」を明確にしてください。

次の2行を削除します。

else
    loop();

loop が終了するとすぐに再呼び出しされます。あなたはそれをそうする必要はありません、実際には悪い考えです。

1
追加された
修正された答えを見てください。
追加された 著者 Nick Gammon,
こんにちはニック、どこにプルアップ抵抗とどのように接続しますか?また、 "ループからループにかけないでください"を明確にしてください。削除する必要がある行は何ですか?ありがとう!
追加された 著者 sborsher,

あなたの設定では、この行のように見えます:

  digitalWrite(11,LOW);

...接点入力211をトリガし、スケッチが始まるたびに「D11がオフからオンに切り替わるときにプログラム運転の開始」を行います。

arduinoがリセットされた場合、このラインは低くなります。自動リセットはこれを開始します。

行を次のように変更すると、コードは行が下に引かれる前に 's'が得られるまで待機します。

  digitalWrite(11,HIGH);

私はArduinoを持っていませんが、おそらく http://playground.arduino.cc/Main/DisablingAutoResetOnSerialConnectionは、自動リセットの問題の管理に役立ちます。

0
追加された
デフォルトではLOWに設定されているため、削除するとあまり効果はありません。ここで必要な場合はHIGHに設定してください。
追加された 著者 Nick Gammon,
はい、ニックは言った。
追加された 著者 Dave X,
あなたのコードはピン11を最初にLOWに設定しているようです。
追加された 著者 Dave X,
こんにちはデイブX、ありがとう、私は何をする必要があるコード上のdigitalWrite(11、LOW)行を削除することです?
追加された 著者 sborsher,
混乱のために申し訳ありません。最初にピン11がHIGHに設定されているため、コントローラを外したときにマシンが突然オンになります。私はそれを低く設定すると、私は私のポートをPCにプラグを差し込んだときにマシンがオンになります。
追加された 著者 sborsher,
はい、それは実際にはHIGHです(タイプミス)。
追加された 著者 sborsher,