Бесполезная проводка коробки и код
просто хочу сначала рассказать предысторию. Итак, я увидел это видео на YouTube о бесполезной коробке и подумал, что она станет отличным подарком для моего 7-летнего ребенка. Поэтому я пошел и купил все, что парень разместил в своем поле описания. Просто хочу сказать, что я очень новичок в Arduino и в том, как эти вещи работают. Я на самом деле просто хочу построить это в подарок своему сыну. Я знаю, что на платформах Stack, прежде чем задавать вопросы, вам нужно попробовать себя, я пытался заставить эту штуку работать последние 36 часов, и у меня ничего не получается.
Итак, вот список вещей, которые я уже пробовал.
- Сначала я купил все точно такое же, как у парня, импортировал, чтобы знать, что это то же самое.
- Я скачал код и схему.
- Я подключил плату 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 раза, чтобы убедиться, что она точно такая же. Когда я включаю проект на своей плате, сервоприводы продолжают вращаться и не останавливаются и не ждут переключения, но когда я переключаю переключатель, он фактически воспроизводит следующее «Действие», но в то время, когда он должен ждать или останавливаться. когда переключатель находится в выключенном положении, сервоприводы продолжают вращаться против часовой стрелки.
Пожалуйста, любая помощь будет принята с благодарностью. Если вам нужна дополнительная информация или если что-то неясно, пожалуйста, попросите меня предоставить больше, и я это сделаю. Я постарался сделать это как можно более ясным. Спасибо
@PeterJoe, 👍5
Обсуждение1 ответ
Лучший ответ:
Да, они поворачиваются на 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
- boxservo работает вопреки коду
- Почему loop() останавливается?
- Почему сервопривод вращается на 360 градусов?
- Как использовать фотодиод для arduino?
- Может ли датчик 12 В, быть подключен к выходному сигналу 5 В Arduino Uno
- Как повторить код
- Arduino-проект с датчиком цвета и rgb-светодиодом
- Почему я не могу контролировать скорость двигателя? (М1 и Е1)
Схема мне кажется нормальная. К сожалению, у меня нет под рукой Arduino, поэтому я не могу быть более точным. Вы можете попробовать другой скетч из примеров, демонстрирующий использование сервопривода. Вы адаптируете этот скетч к используемому вами сервоприводу, и таким образом вы сможете проверить, работают ли сервоприводы вообще., @the busybee
@thebusybee спасибо, я пробовал, чтобы сервоприводы работали. Я подключил пример смахивания, который дает вам Arduino, и он работает на 100%. Так что с сервоприводами проблем нет. Спасибо за ответ, @PeterJoe
Хорошо знать! Затем следующий эксперимент проверит переключатель. Для этого вам нужен скетч, который считывает значение переключателя и устанавливает светодиод на контакте 13 в считанное значение. Это должно показать, работает ли переключатель., @the busybee
О, и когда вы говорите «сервоприводы продолжают вращаться», означает ли это, что сервоприводы поворачивают свои рычаги на 360°, совершая бесконечные круги без остановки?, @the busybee
@thebusybeei Я также проверил тумблер. Я удалил весь код и использовал только переключатель, поэтому я сделал оператор if, чтобы проверить, является ли он ВЫСОКИМ или НИЗКИМ, и это также сработало отлично. Да, они поворачиваются на 360, и когда вы переключаете переключатель, он выполняет «Действие», которое он должен выполнять, а затем снова возвращается к повороту на 360, пока не запустится следующее действие. Таким образом, в основном он не «останавливается» и не ждет переключения, даже если в инструкции if указано, что сервопривод срабатывает только в том случае, если его НИЗКИЙ уровень., @PeterJoe