Бесполезная проводка коробки и код

просто хочу сначала рассказать предысторию. Итак, я увидел это видео на YouTube о бесполезной коробке и подумал, что она станет отличным подарком для моего 7-летнего ребенка. Поэтому я пошел и купил все, что парень разместил в своем поле описания. Просто хочу сказать, что я очень новичок в Arduino и в том, как эти вещи работают. Я на самом деле просто хочу построить это в подарок своему сыну. Я знаю, что на платформах Stack, прежде чем задавать вопросы, вам нужно попробовать себя, я пытался заставить эту штуку работать последние 36 часов, и у меня ничего не получается.

Итак, вот список вещей, которые я уже пробовал.

  1. Сначала я купил все точно такое же, как у парня, импортировал, чтобы знать, что это то же самое.
  2. Я скачал код и схему.
  3. Я подключил плату 4 раза, чтобы убедиться, что все сделал правильно.
  4. Я перерисовал схему в tinkercad, чтобы убедиться, что все провода правильно расположены.

Вот ссылка на мой рисунок в tinkercad, код там тоже есть. Обратите внимание, что в tinkercad я не могу заставить плату arduino не подключаться через usb, она должна получать питание от внешнего источника питания (батарейки 4AA).

https://www.tinkercad.com/things/43WIrlmR1K3-project1

Вот ссылка на видео на YouTube: https://www.youtube.com/watch?v=cpdjQ0gheDQ&t=311s

Вот схема, которую он предоставил:

Вот код, который он предоставил:

 #include <Servo.h>                        

Servo handServo;                          
Servo boxServo;

int switchStatus=0, action=1, vot, randNumber=0;                 
const int ledPin = 13;                    
const int frontSwitchPin = 2;
const int handServoPin = 5;
const int boxServoPin = 6;


void setup()
{
  Serial.begin(9600);

  pinMode(ledPin, OUTPUT);                  
  digitalWrite(ledPin,HIGH);

  handServo.attach(handServoPin);              
  boxServo.attach(boxServoPin);
  handServo.write(180);                        
  boxServo.write(70);

  //случайное начальное число (аналоговое чтение (0));
}


void loop()
{
  switchStatus = digitalRead(frontSwitchPin); 
  // действие = случайное (1,16);

  if (switchStatus == LOW){                   

    if (action == 1)
    {
      Serial.println("Action 1");          
      for (int i = 70; i <= 110; i++)
      {
        boxServo.write(i);
        delay(20);
      }
      for (int i = 180; i >= 35; i--)
      {
        handServo.write(i);
        delay(20);
      }
      delay(1000);
      handServo.write(26);
      delay(200);
      for (int i = 26; i <=180; i++)
      {
        handServo.write(i);
        delay(20);
      }
      for (int i = 110; i >= 70; i--)
      {
        boxServo.write(i);
        delay(20);
      }
      action++;
    }


    else if (action == 2)
    {
      Serial.println("Action 2");         
      for (int i = 70; i <= 110; i++){
        boxServo.write(i);
        delay(6);
      }
      delay(550);
      handServo.write(26);
      delay(550);
      handServo.write(180);
      delay(550);
      boxServo.write(70);
      delay(1500);
      for (int i = 70; i <= 110; i++){
        boxServo.write(i);
        delay(6);
      }
      delay(3000);
      boxServo.write(70);
      action++;
    }

    else if (action == 3)
    {
      Serial.println("Action 3");         
      for (int i = 70; i <= 110; i++){
        boxServo.write(i);
        delay(6);
      }
      delay(1000);
      boxServo.write(70);
      delay(2000);
      for (int i = 70; i <= 110; i++){
        boxServo.write(i);
        delay(6);
      }
      handServo.write(26);
      delay(550);
      handServo.write(180);
      delay(500);
      boxServo.write(70);
      action++;
    }

    else if (action == 4)
    {
      Serial.println("Action 4");         
      for (int i = 70; i <= 110; i++)
      {
        boxServo.write(i);
        delay(20);
      }
      for (int i = 180; i >= 35; i--)
      {
        handServo.write(i);
        delay(20);
      }
      delay(2000);
      handServo.write(26);
      delay(200);
      handServo.write(180);
      delay(400);
      boxServo.write(70);
      action++;
    }

    else if (action == 5)
    {
      Serial.println("Action 5");     
      for (int i = 70; i <= 110; i++){
        boxServo.write(i);
        delay(6);
      }
      delay(2000);
      handServo.write(65);
      delay(550);
      handServo.write(40);
      delay(200);
      handServo.write(65);
      delay(200);
      handServo.write(40);
      delay(200);
      handServo.write(65);
      delay(200);
      handServo.write(40);
      delay(200);
      handServo.write(65);
      delay(200);
      handServo.write(40);
      delay(200);
      handServo.write(65);
      delay(200);
      handServo.write(40);
      delay(200);
      handServo.write(65);
      delay(2000);
      handServo.write(26);
      delay(400);
      handServo.write(180);
      delay(400);
      boxServo.write(70);
      action++;
    }

    else if (action == 6)             
    {
      Serial.println("Action 6");      
      for (int i = 70; i <110; i++)
      {
        boxServo.write(i);
        delay(20);
      }
      delay(1000);
      for (int i = 0; i < 12; i++)
      {
        for (int j = 70; j <= 110; j++){
          boxServo.write(j);
          delay(6);
        }
        delay(200);
      }
      for (int i = 180; i >= 35; i--)
      {
        handServo.write(i);
        delay(30);
      }
      handServo.write(26);
      delay(400);
      handServo.write(180);
      delay(400);
      boxServo.write(70);
      delay(1500);
      for (int i = 70; i <= 110; i++){
        boxServo.write(i);
        delay(6);
      }
      delay(3000);
      boxServo.write(80);
      action++;
    }

    else if (action == 7)
    {
      Serial.println("Action 7");      
      for (int i = 70; i <= 110; i++){
        boxServo.write(i);
        delay(6);
      }
      delay(400);
      handServo.write(26);
      delay(1000);
      for (int i = 0; i < 6; i++)
      {
        for (int j = 70; j <= 110; j++){
          boxServo.write(j);
          delay(6);
        }
        delay(200);
      }
      delay(500);
      handServo.write(180);
      delay(400);
      boxServo.write(70);
      action++;
    }

    else if (action == 8)
    {
      Serial.println("Action 8");    
      for (int i = 70; i <= 110; i++){
        boxServo.write(i);
        delay(6);
      }
      handServo.write(26);
      delay(2000);
      for (int i = 0; i < 7; i++)
      {
        handServo.write(75);
        delay(100);
        handServo.write(40);
        delay(100);
      }
      delay(500);
      handServo.write(180);
      delay(1000);
      boxServo.write(70);
      action++;
    }

    else if (action == 9)
    {
      Serial.println("Action 9");      
      for (int i = 70; i <= 105; i++){
        boxServo.write(i);
        delay(6);
      }
      delay(2000);
      boxServo.write(110);
      for (int i = 180; i >=35; i--)
      {
        handServo.write(i);
        delay(40);
      }
      delay(500);
      handServo.write(26);
      delay(200);
      for (int i = 26; i <=180; i++)
      {
        handServo.write(i);
        delay(40);
      }
      boxServo.write(70);
      delay(2000);
      boxServo.write(100);
      delay(3000);
      boxServo.write(70);
      action++;
    }


    else if (action == 10)
    {
      Serial.println("Action 10");      
      for (int i = 70; i <= 105; i++)
      {
        boxServo.write(i);
        delay(100);
      }
      delay(1000);
      for (int i = 0; i < 10; i++)
      {
        for (int j = 70; j <= 100; j++){
          boxServo.write(j);
          delay(6);
      }
        delay(100);
      }
      boxServo.write(110);
      delay(100);
      handServo.write(26);
      delay(650);
      handServo.write(180);
      delay(400);
      boxServo.write(70);
      action++;
    }

    else if (action == 11)
    {
      Serial.println("Action 11");     
      for (int i = 70; i <= 110; i++){
        boxServo.write(i);
        delay(6);
      }
      handServo.write(26);
      delay(2000);
      for (int i = 0; i < 3; i++)
      {
        handServo.write(65);
        delay(200);
        handServo.write(40);
        delay(200);
      }
      delay(1500);
      handServo.write(180);
      delay(400);
      boxServo.write(70);
      delay(1500);
      for (int i = 70; i <= 110; i++){
        boxServo.write(i);
        delay(6);
      }
      handServo.write(26);
      delay(3000);
      handServo.write(180);
      delay(400);
      boxServo.write(70);
      action++;
    }

    else if (action == 12)
    {
      Serial.println("Action 12");    
      for (int i = 70; i <= 110; i++)
      {
        boxServo.write(i);
        delay(50);
      }
      delay(1000);
      for (int i = 180; i >= 26; i--)
      {
        handServo.write(i);
        delay(50);
      }
      delay(2000);
      handServo.write(26);
      delay(200);
      handServo.write(180);
      delay(400);
      boxServo.write(70);
      action++;
    }

    else if (action == 13)
    {
      Serial.println("Action 13");     
      for (int i = 70; i <= 110; i++){
        boxServo.write(i);
        delay(6);
      }
      delay(2000);
      for (int i = 180; i >= 60; i--)
      {
        handServo.write(i);
        delay(40);
      }
      for (int i = 0; i < 3; i++)
      {
        handServo.write(60);
        delay(200);
        handServo.write(40);
        delay(800);
      }
      handServo.write(26);
      delay(2000);
      handServo.write(180);
      delay(500);
      boxServo.write(70);
      action++;
    }

    else if (action == 14)
    {
      Serial.println("Action 14");     
      for (int i = 70; i <= 105; i++){
        boxServo.write(i);
        delay(6);
      }
      delay(4000);
      boxServo.write(110);
      handServo.write(26);
      delay(650);
      handServo.write(180);
      delay(500);
      boxServo.write(100);
      delay(4000);
      boxServo.write(70);
      action++;
    }

    else if (action == 15)
    {
      Serial.println("Action 15");   
      for (int i = 70; i <= 105; i++){
        boxServo.write(i);
        delay(6);
      }
      delay(1000);
      for (int i = 0; i < 3; i++)
      {      
        for (int j = 70; j <= 105; j++){
          boxServo.write(j);
          delay(50);
        }
        for (int j = 105; j >= 70; j--)
        {
          boxServo.write(j);
          delay(50);
        }
      }
      for (int j = 70; j <= 110; j++){
        boxServo.write(j);
        delay(50);
      }
      for (int i = 180; i >= 35; i--)
      {
        handServo.write(i);
        delay(40);
      }
      delay(1000);
      handServo.write(26);
      delay(400);
      handServo.write(180);
      delay(400);
      boxServo.write(70);
      action = 1;
    }

  }

}

Итак, в моем tinkercad, когда я запускаю симуляцию, все работает (за исключением поломки двигателей, но я знаю это из-за дополнительной мощности, которую он получает от USB, который я могу отключить). Когда вы смотрите в Serial Monitor, он выполняет все «Действия», и когда вы имитируете кнопку, нажимаемую сервоприводом, все останавливается и ждет, пока вы снова не переключите переключатель, и он перейдет к следующему действию.

Я сделал то же самое и, как я уже сказал, подключил плату 4 раза, чтобы убедиться, что она точно такая же. Когда я включаю проект на своей плате, сервоприводы продолжают вращаться и не останавливаются и не ждут переключения, но когда я переключаю переключатель, он фактически воспроизводит следующее «Действие», но в то время, когда он должен ждать или останавливаться. когда переключатель находится в выключенном положении, сервоприводы продолжают вращаться против часовой стрелки.

Пожалуйста, любая помощь будет принята с благодарностью. Если вам нужна дополнительная информация или если что-то неясно, пожалуйста, попросите меня предоставить больше, и я это сделаю. Я постарался сделать это как можно более ясным. Спасибо

, 👍5

Обсуждение

Схема мне кажется нормальная. К сожалению, у меня нет под рукой Arduino, поэтому я не могу быть более точным. Вы можете попробовать другой скетч из примеров, демонстрирующий использование сервопривода. Вы адаптируете этот скетч к используемому вами сервоприводу, и таким образом вы сможете проверить, работают ли сервоприводы вообще., @the busybee

@thebusybee спасибо, я пробовал, чтобы сервоприводы работали. Я подключил пример смахивания, который дает вам Arduino, и он работает на 100%. Так что с сервоприводами проблем нет. Спасибо за ответ, @PeterJoe

Хорошо знать! Затем следующий эксперимент проверит переключатель. Для этого вам нужен скетч, который считывает значение переключателя и устанавливает светодиод на контакте 13 в считанное значение. Это должно показать, работает ли переключатель., @the busybee

О, и когда вы говорите «сервоприводы продолжают вращаться», означает ли это, что сервоприводы поворачивают свои рычаги на 360°, совершая бесконечные круги без остановки?, @the busybee

@thebusybeei Я также проверил тумблер. Я удалил весь код и использовал только переключатель, поэтому я сделал оператор if, чтобы проверить, является ли он ВЫСОКИМ или НИЗКИМ, и это также сработало отлично. Да, они поворачиваются на 360, и когда вы переключаете переключатель, он выполняет «Действие», которое он должен выполнять, а затем снова возвращается к повороту на 360, пока не запустится следующее действие. Таким образом, в основном он не «останавливается» и не ждет переключения, даже если в инструкции if указано, что сервопривод срабатывает только в том случае, если его НИЗКИЙ уровень., @PeterJoe


1 ответ


Лучший ответ:

3

Да, они поворачиваются на 360

Обычные сервоприводы поворачиваются на угол от 0 до 180° (или немного больше или меньше). На этих сервоприводах вы можете установить угол с помощью Servo.write(). Но если сервопривод вращается на 360° и более, то это сервопривод с непрерывным вращением. Здесь значение Servo.write() устанавливает скорость вращения, а не угол. Значение 90 позволяет ему стоять на месте. Значения ниже 90 означают вращение назад, выше 90 вперед. Чем больше расстояние от 90, тем выше будет скорость вращения.

В видео сервоприводы установлены таким образом, что они не могут вращаться на 360°, поэтому они должны быть обычными сервоприводами (это также соответствует коду). Если ваши сервоприводы вращаются больше, вы, к сожалению, купили сервопривод не того типа.

Код устанавливает положение покоя сервопривода коробки на 70, а ручного сервопривода на 180. Это означает, что при непрерывном вращении сервопривода оба сервопривода будут вращаться в состоянии покоя, при этом ручной сервопривод работает намного быстрее, чем сервопривод.

Поэтому для этого проекта вам потребуется купить обычные сервоприводы.

,

Ах хорошо я вижу. Я снова проверю свои сервоприводы, я знаю их сервоприводы MG996R Digital Servo TowerPro. Но теперь я вижу, что у вас есть один с надписью «DIGI HI TORQUE» и другой с надписью «360 Rotatable». Итак, вы говорите, что если сервопривод вращается на 360 градусов, то он не может работать с этим проектом?, @PeterJoe

это именно тот сервопривод, который я купил в этом месте. https://www.коммуникация.co.za/products/bsk-cont-rotat-servo-mg996-11kg, @PeterJoe

Эти сервоприводы будут работать? Я вижу, они говорят, что это Tower Pro Continuos Rotation Metal Gear Servo Motor 11KG Torque Vin 4.8~ 6.6V 360°, @PeterJoe

Вам может сойти с рук этот сервопривод, переписав код, но, честно говоря, я не думаю, что вы будете счастливы таким образом. Прямая покупка сервопривода, который не является сервоприводом с непрерывным вращением, создаст для вас гораздо меньше стресса., @chrisl

Большое спасибо, я куплю другие сервоприводы и попробую еще раз., @PeterJoe

Если вы считаете, что мой ответ хорош, вы можете принять его как правильный. И всегда можете задать дополнительные вопросы., @chrisl

О боже, одно и то же имя для разных сервоприводов или, по крайней мере, разной внутренней работы?! Неудивительно, что это не сработало..., @the busybee

Да, одно и то же имя, просто другое, что так странно. :( к сожалению. Заставляет меня чувствовать себя идиотом хахахаха, @PeterJoe

Еще раз @chrisl спасибо за вашу помощь! Это точно правильный ответ, @PeterJoe