Оглавление:

Автоматизированный шариковый каток с Arduino и одним сервоприводом: 3 шага
Автоматизированный шариковый каток с Arduino и одним сервоприводом: 3 шага

Видео: Автоматизированный шариковый каток с Arduino и одним сервоприводом: 3 шага

Видео: Автоматизированный шариковый каток с Arduino и одним сервоприводом: 3 шага
Видео: БОКОВУШЕЧКА У ТУАЛЕТА в плацкарте 2024, Июль
Anonim
Image
Image

Это простой небольшой проект Arduino и сервопривода, который занимает около двух часов. Он использует сервопривод, чтобы поднять один конец крышки банки, чтобы вращать стальной шар по внутренней окружности. Он самозапускается, может изменять скорость и может вращать два (или более?) Шарика одновременно. Весело строить и работать. С параметрами синхронизации можно играть, возможно, даже на более высоких скоростях. Несколько датчиков Холла с магнитным шариком можно было бы использовать, чтобы сделать его более умным устройством, способным определять наилучшие параметры.

Я должен упомянуть, что у кого-то здесь, на Instructables.com, есть более сложная машина с роликовыми шариками:

Необходимые материалы:

Arduino Uno (или любой Arduino)

Серво щиток (опционально)

Сервопривод 9g

крышка от банки

стальной шар

немного лома дерева

Шаг 1. Изготовьте основание и шарнирный держатель крышки

Сделайте основание и откидной держатель крышки
Сделайте основание и откидной держатель крышки

Основание - это просто кусок дерева, на который можно установить навесной кусок дерева. Деревянный шарнир должен быть больше крышки банки, которую вы будете использовать, и иметь достаточно места для петель и установки сервопривода.

Я использовал маленькие пластиковые петли для самолетов с радиоуправлением и просто приклеил их горячим клеем к навесному дереву и основанию.

Шаг 2: сделайте более длинный рычаг сервопривода и прикрепите сервопривод

Сделайте более длинный рычаг сервопривода и прикрепите сервопривод
Сделайте более длинный рычаг сервопривода и прикрепите сервопривод
Сделайте более длинный рычаг сервопривода и прикрепите сервопривод
Сделайте более длинный рычаг сервопривода и прикрепите сервопривод

Чтобы сделать серво-рычаг большей длины, я просто прикрепил 5-сантиметровый кусок дерева к серво-рычагу с помощью пары маленьких винтов и гаек. Сервопривод должен находиться под углом 90 градусов к сервоприводу, когда он горизонтален по отношению к основанию.

Я просто приклеил сервопривод к навесному деревянному держателю горячим клеем, но обнаружил, что если вы дадите ему поработать дольше нескольких минут, сервопривод нагреет горячий клей и отпустит дерево. Таким образом, гарантируется лучший способ крепления.

Шаг 3: Загрузите и запустите Sketch

Загрузить и запустить эскиз
Загрузить и запустить эскиз

Я прикрепил сервопривод к контакту 7 с помощью щита, потому что это просто удобно и стоит всего несколько долларов. Если у вас нет экрана, подключите провод сервосигнала к контакту 7 на Arduino, красный провод к 5 В на Arduino и заземляющий провод к GND на Arduino. Ардуино должно обеспечивать достаточный ток для работы сервопривода. Я использую экран, потому что легко использовать внешнее напряжение только для сервопривода.

Вот набросок. Я написал программу регулятора скорости сервопривода, чтобы изменить скорость сервопривода, потому что он, вероятно, не будет работать на полной скорости.

Вы можете изменить TimingDelay, чтобы получить разные скорости качения шарика. Вы также можете изменить третий параметр функции myServo (), чтобы изменить скорость.

////////////////////////////////////////////////// ////////////////////////////////////////////////// ////////////// // создано Джимом Демелло, Университет Шанлуо, 2017 г.

// вы можете использовать, манипулировать, делать с этим кодом все, что хотите, мое имя не требуется

// Эта процедура позволяет интерполировать любое количество сервоприводов, просто добавьте новые строки, если количество сервоприводов превышает 4

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////

#включают

Серво myservo1, myservo2; // создаем сервообъект для управления сервоприводом

int servoRead (int servoNumber) {

int servoCurrent;

если (servoNumber == 1) {servoCurrent = myservo1.read (); }

если (servoNumber == 2) {servoCurrent = myservo2.read (); }

return servoCurrent;

}

void servoWrite (int servoNumber, int offset) {

если (servoNumber == 1) {myservo1.write (смещение); }

если (servoNumber == 2) {myservo2.write (смещение); }

}

void myServo (int newAngle, int angleInc, int incDelay, int servoNum) {

int curAngle;

если (servoNum == 1) {curAngle = myservo1.read (); }

если (servoNum == 2) {curAngle = myservo2.read (); }

if (curAngle <newAngle) {

for (int angle = curAngle; angle <newAngle; angle + = angleInc) {

if (servoNum == 1) myservo1.write (угол);

if (servoNum == 2) myservo2.write (угол);

задержка (incDelay); }

}

else if (curAngle> newAngle) {

for (int angle = curAngle; angle> newAngle; angle - = angleInc) {

if (servoNum == 1) myservo1.write (угол);

if (servoNum == 2) myservo2.write (угол);

задержка (incDelay); }

}

}

void interpolate2Servos (int servo1, int servo1Position, int servo2, int servo2Position, int numberSteps, int timeDelay) {

int servo1Current, servo2Current;

servo1Current = servoRead (серво1);

servo2Current = servoRead (серво2);

// Serial.print ("Servo3Pos и текущий"); Serial.print (servo3Position); Serial.print (""); Serial.println (servo3Current);

// Serial.print ("Servo4Pos и текущий"); Serial.print (servo4Position); Serial.print (""); Serial.println (servo4Current);

// Serial.print ("Servo5Pos и текущий"); Serial.print (servo5Position); Serial.print (""); Serial.println (servo5Current);

// Serial.print ("Servo6Pos и текущий"); Serial.print (servo6Position); Serial.print (""); Serial.println (servo6Current);

// Serial.println ("");

int cOffset = (servo1Position - servo1Current); cOffset = abs (cOffset) / numberSteps;

int dOffset = (servo2Position - servo2Current); dOffset = abs (dOffset) / numberSteps;

int cOffsetTotal = 0, dOffsetTotal = 0;

cOffsetTotal = servo1Current;

dOffsetTotal = servo2Current;

для (int x = 0; x

если (servo1Position> servo1Current) {cOffsetTotal = cOffsetTotal + cOffset; }

иначе {cOffsetTotal = cOffsetTotal - cOffset; }

если (servo2Position> servo2Current) {dOffsetTotal = dOffsetTotal + dOffset; }

иначе {dOffsetTotal = dOffsetTotal - dOffset; }

если (servo1Position! = servo1Current) servoWrite (servo1, cOffsetTotal);

если (servo2Position! = servo2Current) servoWrite (servo2, dOffsetTotal);

// Serial.print ("Смещение a и b"); Serial.print (aOffsetTotal); Serial.print (""); Serial.println (bOffsetTotal); задержка (10);

задержка (timeDelay);

} // конец для

//////////////////////////////////////

// позаботимся об остатках по модулю //

/////////////////////////////////////

if (servo1Position! = servo1Current) servoWrite (servo1, servo1Position);

if (servo2Position! = servo2Current) servoWrite (servo2, servo2Position);

}

int TimingDelay = 100;

int servoDelay = 100;

int degGap = 10;

// Это начальная степень (должна быть меньше конечной степени)

int degStart = 0;

// Это конечный градус (должен быть больше начального)

int degEnd = 360;

// Это радиус круга

int radius = 8;

установка void ()

{

Serial.begin (9600);

задержка (100);

myservo1.attach (7); // присоединяет сервопривод на выводе 7 к сервообъекту

myservo1.write (90);

myservo2.attach (8); // прикрепляет сервопривод на выводе 8 к сервообъекту

myservo2.write (90);

задержка (1000); // ждем, пока сервопривод доберется туда

interpolate2Servos (1, 90, 2, 90, 10, 60); // нейтральный

задержка (1000);

}

void loop () {

TimingDelay = 15; // работает на 10

servoDelay = 4;

spin4 ();

// интерполировать2Servos (1, 90, 2, 90, 1, 60); // нейтральный

// задержка (1000);

// выход (0); // приостановить программу - нажмите сброс, чтобы продолжить

}

void spin3 () {

interpolate2Servos (1, 90, 2, 110, 1, 60); // нейтральный

задержка (TimingDelay);

interpolate2Servos (1, 90, 2, 80, 1, 60); // нейтральный

задержка (TimingDelay);

}

void spin2 () {

// интерполировать2Servos (1, 80, 2, 90, 1, 50); // нейтральный

задержка (TimingDelay);

interpolate2Servos (1, 80, 2, 80, 1, 60); // нейтральный

задержка (TimingDelay);

interpolate2Servos (1, 110, 2, 80, 1, 60); // нейтральный

задержка (TimingDelay);

// интерполировать2Servos (1, 110, 2, 110, 1, 60); // нейтральный

задержка (TimingDelay);

}

void spin1 () {

// int deg = (degStart / (180 / 3.14));

float deg = (degStart * 3.141592 / 180); // конвертируем градусы в радианы

float xPos = 90 + (cos (град) * радиус);

// xPos = round (xPos);

float yPos = 90 + (sin (град) * радиус);

// yPos = round (yPos);

Serial.print ("degGap ="); Serial.print (degGap); Serial.print ("deg ="); Serial.print (deg); Serial.print ("cos ="); Serial.print (cos (deg)); Serial.print ("degStart ="); Serial.print (degStart); Serial.print ("x ="); Serial.print (xPos); Serial.print ("y ="); Serial. println (yPos);

// интерполировать2Servos (1, xPos, 2, yPos, 1, servoDelay); // нейтральный

myservo1.write (xPos);

myservo2.write (yPos);

задержка (TimingDelay);

if (degStart> = degEnd) {

degStart = 0;

если (degGap> 180)

degGap = 180;

// degGap = 0;

еще

degGap = degGap + 2;

degGap = degGap - 2;

// degStart = degStart + degGap;

}

degStart = degStart + degGap;

}

void spin4 () {

for (int i = 0; i <= 360; i ++) {

поплавок j = 20 * (cos ((3.14 * i) / 180)) + 90;

float k = 20 * (sin ((3.14 * i) / 180)) + 90;

myservo1.write (j);

myservo2.write (k);

Serial.print (j);

Serial.print (",");

Serial.println (k);

задержка (100);

}

}

Рекомендуемые: