Машина, встановлена ​​за допомогою 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., джерело
Розмістіть схему або проводку і вкажіть на дані на вашому комп'ютері. Можливо, коли arduino буде депонований і шпильки tristate, ваша машина більше не буде перешкоджати вмикання. Але це тільки здогадка, заснована на інформації у вашому питанні.
додано Автор Dave X, джерело
Додайте його до свого запитання. У редакторі є маленька піктограма гірського пейзажу, що дозволяє завантажувати графіку.
додано Автор Dave X, джерело
Ваш Arduino живиться тільки через USB або є альтернативний живлення?
додано Автор Dave X, джерело
привіт Дейв X, де я можу відправити/опублікувати мою схему? у вас є електронна пошта або щось, так що я можу показати як проводки, так і код arduino. Спасибі заздалегідь
додано Автор sborsher, джерело
Привіт Дейв х, тут ви йдете. Я також додав ескіз для вас, щоб співвіднести. це для автоматичного вибору рецепту одного разу натисканням кнопки "відправити рецепт" і автоматичного запуску інструменту один раз натисніть кнопку "Пуск"
додано Автор sborsher, джерело
DaveX так arduino підключений на контролері інструменту, а також, який також подавати живлення до дошки
додано Автор sborsher, джерело
Я вже намагався поставити 10uf конденсатор для відключення автоматичного скидання, але інструмент все ще починається, коли я зняти кабель USB від ПК
додано Автор sborsher, джерело

2 Відповіді

Не називайте loop з циклу . Ви швидко вичерпаєте оперативну пам'ять, а ескіз зірветься:

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 потужності вгору він входить в завантажувач на секунду або близько того. Ці контакти не будуть встановлені ще високо. Підтягуючий резистор буде переконатися, що вони високі до тих пір, поки ви хочете їздити на них низьким.


Якщо ви говорите, що машина вмикається, коли ви від'єднуєте живлення від Arduino, це все ще є вагомою причиною для використання підтягуючих резисторів, щоб переконатися, що він не працює, поки не буде наказано робити тому.


Де я підключу резистори і як?

Зазвичай підтягуючі резистори будуть близько 10k, і з'єднуються від штифта до + 5V. Звичайно, якщо Arduino не живиться, то потрібно ще одне джерело + 5V.


Будь ласка, поясніть, чи не викликати від циклу до петлі

Видалити ці два рядки:

else
    loop();

Коли loop виходить, це негайно повторно викликається. Вам не потрібно робити це так, адже це погана ідея.

1
додано
Див. Виправлену відповідь.
додано Автор Nick Gammon, джерело
Привіт Нік, де я підключити підтягти резистори і як? а також просимо уточнити "не викликати від циклу до петлі". Яку лінію потрібно видалити? Дякую!
додано Автор sborsher, джерело

Цей рядок у налаштуваннях виглядає так:

  digitalWrite(11,LOW);

... буде спрацьовувати контактний вхід 211 і робити "Початок роботи програми, коли D11 перемикається з вимкненого на" кожного разу, коли ескіз починається.

Якщо ардуіно скидається, це тягне цю лінію низькою. Autoreset ініціює це.

Змінивши рядок на наступний, код буде чекати, поки він не отримає 's' перед тим, як тягнути лінію низькою.

  digitalWrite(11,HIGH);

У мене немає Arduino, але, можливо, http://playground.arduino.cc/Main/DisablingAutoResetOnSerialConnection a> може допомогти в управлінні проблемою автоматичного скидання.

0
додано
Це значення за замовчуванням до LOW, тому видалення його не зробить багато. Встановіть значення HIGH, якщо це потрібно тут.
додано Автор Nick Gammon, джерело
Так, що сказав Нік.
додано Автор Dave X, джерело
Ваш код, здається, спочатку встановлює Pin 11 на LOW.
додано Автор Dave X, джерело
Привіт Дейв X, спасибі, так що мені потрібно зробити, це видалити DigitalWrite (11, LOW) лінії на код?
додано Автор sborsher, джерело
Вибачте за плутанину. Висновок 11 встановлюється на високий спочатку, тому, коли я відключав контролер, машина раптом включається. Якщо я встановлюю його на низький, машина увімкнеться, коли я відключити потім підключити мої порти до ПК.
додано Автор sborsher, джерело
Так, це насправді висока (помилка помилки).
додано Автор sborsher, джерело