Machine geïnstalleerd met Arduino wordt plotseling ingeschakeld wanneer usb is losgekoppeld

Waarom staat mijn apparaat plotseling AAN als ik de USB-poort van mijn computer loskoppeld? Heeft het een verbinding op de automatische reset-functie van mijn Arduino-bord?

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
Het openen van een seriële verbinding zal het bord resetten.
toegevoegd de auteur Al., de bron
Plaats uw schema of bedrading en wijs naar de datasheet op uw machine. Misschien als de arduino depowered is en de pinnen tristeren, is uw machine niet meer geremd om AAN te zijn. Maar dat is slechts een schatting op basis van de informatie in uw vraag.
toegevoegd de auteur Dave X, de bron
Voeg dit toe aan uw vraag. De editor heeft een klein pictogram voor een berglandschap waarmee u afbeeldingen kunt uploaden.
toegevoegd de auteur Dave X, de bron
Wordt uw Arduino alleen via USB gevoed of is er alternatief vermogen?
toegevoegd de auteur Dave X, de bron
Hoi Dave X, waar kan ik mijn schematische diagram verzenden/plaatsen? heb je een e-mail of zo, dan kan ik zowel de bedrading als de Arduino-code laten zien. bij voorbaat dank
toegevoegd de auteur sborsher, de bron
Hallo Dave, alsjeblieft. Ik heb de schets ook toegevoegd om te correleren. dit is om het automatisch geselecteerde recept te selecteren, druk eenmaal op "verzend recept" en start automatisch met het gereedschap eenmaal op de "start" knop
toegevoegd de auteur sborsher, de bron
DaveX ja, de arduino is ook op de controller van de tool aangesloten en levert stroom aan het bord
toegevoegd de auteur sborsher, de bron
Ik heb al geprobeerd om een ​​10uf condensator in te schakelen om de automatische reset uit te schakelen, maar het gereedschap start nog steeds wanneer ik de USB-kabel van de pc verwijder
toegevoegd de auteur sborsher, de bron

2 antwoord

Roep loop niet aan vanuit loop . Je raakt snel RAM en de schets loopt vast:

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

}

Voor de pins die hoog zouden moeten zijn, stel ik pull-up weerstanden voor:

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

Wanneer de Arduino opstart, komt het een seconde of zo in de bootloader. Die pinnen staan ​​nog niet hoog. Een pull-up-weerstand zorgt ervoor dat ze hoog zijn totdat je ze laag wilt laten rijden.


Als je zegt dat het apparaat opstart wanneer je de stroom naar de Arduino koppelt , is dat nog steeds een goede reden om pull-up weerstanden te gebruiken, om er zeker van te zijn dat het niet werkt totdat bevolen om te doen zo.


waar sluit ik de pull-up weerstanden aan en hoe?

Typische pull-up weerstanden zullen rond de 10k zijn en zijn verbonden van de pin naar + 5V. Natuurlijk, als de Arduino niet van stroom wordt voorzien, dan heb je een andere bron van de + 5V nodig.


alsjeblieft om het "niet bellen van lus naar lus"

te verduidelijken

Verwijder deze twee regels:

else
    loop();

Wanneer lus wordt afgesloten, wordt deze onmiddellijk opnieuw aangeroepen. Je hoeft het niet op die manier te doen, het is in feite een slecht idee.

1
toegevoegd
Zie gewijzigd antwoord.
toegevoegd de auteur Nick Gammon, de bron
Hallo Nick, waar sluit ik de pull-up weerstanden aan en hoe? en ook alsjeblieft om het "do not call from loop to loop" te verduidelijken. Welke regel moet ik verwijderen? bedankt!
toegevoegd de auteur sborsher, de bron

Het lijkt op deze regel in uw opstelling:

  digitalWrite(11,LOW);

... contactingang 211 zou triggeren en "Start van programmabediening wanneer D11 van uit naar aan schakelt" elke keer dat de schets start.

Als de Arduino opnieuw wordt ingesteld, wordt deze lijn laag getrokken. Autoreset zou dit initiëren.

Door de regel naar het volgende te wijzigen, wacht de code totdat deze een 's' krijgt voordat de lijn laag wordt getrokken.

  digitalWrite(11,HIGH);

Ik heb geen Arduino, maar misschien http://playground.arduino.cc/Main/DisablingAutoResetOnSerialConnection kan helpen bij het beheer van het Auto-Reset-probleem.

0
toegevoegd
Het is standaard ingesteld op LAAG, dus het verwijderen ervan zal niet veel doen. Stel het in op HOOG als dat hier is wat nodig is.
toegevoegd de auteur Nick Gammon, de bron
Ja, wat Nick zei.
toegevoegd de auteur Dave X, de bron
Uw code lijkt in eerste instantie Pin 11 op LOW te zetten.
toegevoegd de auteur Dave X, de bron
Hallo Dave X, bedankt, dus wat ik moet doen is de regel digitalWrite (11, LOW) van de code verwijderen?
toegevoegd de auteur sborsher, de bron
Sorry voor de verwarring. Pin 11 is in eerste instantie ingesteld op HOOG. Daarom heb ik de stekker van de controller plotseling uitgeschakeld wanneer ik de stekker uit het stopcontact haal. Als ik het op laag zet, wordt het apparaat ingeschakeld wanneer ik de stekker uit het stopcontact trek en daarna mijn poorten op de pc.
toegevoegd de auteur sborsher, de bron
Ja dat is eigenlijk HOOG (typefout).
toegevoegd de auteur sborsher, de bron