Съдържание:

Автоматизирана топка с Arduino и едно серво: 3 стъпки
Автоматизирана топка с Arduino и едно серво: 3 стъпки

Видео: Автоматизирана топка с Arduino и едно серво: 3 стъпки

Видео: Автоматизирана топка с Arduino и едно серво: 3 стъпки
Видео: 🌿Контроллер умной теплицы своими руками 2024, Юли
Anonim
Image
Image

Това е прост малък Arduino и серво проект, който отнема около два часа. Той използва серво за повдигане на единия край на капачката на буркан, така че да завърти стоманена топка около вътрешната обиколка. Той се стартира самостоятелно, може да променя скоростта и може да завърти две (или повече?) Топки наведнъж. Забавно за изграждане и работа. Параметрите на времето могат да се играят с вероятно дори по -бързи скорости. Няколко сензора за ефект на Хол с магнитна топка могат да бъдат използвани, за да го направят по -умна машина, която може да разбере най -добрите параметри.

Трябва да спомена, че някой тук от instructables.com има по-усъвършенствана машина за ролкови топки:

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

Arduino Uno (или който и да е Arduino)

Серво щит (по избор)

9 г серво

капачка на буркан

стоманена топка

малко скрап

Стъпка 1: Направете основата и държача на шарнирната капачка

Направете държач за основа и шарнирна капачка
Направете държач за основа и шарнирна капачка

Основата е само парче дърво, върху което да се монтира шарнирно парче дърво. Пантираното дърво трябва да е по -голямо от капачката на буркан, която ще използвате, и да има достатъчно място за пантите и за монтиране на серво.

Използвах малки пластмасови самолетни панти за дистанционно управление и просто ги залепих към шарнирната дървесина и основата.

Стъпка 2: Направете по -дълго серво рамо и прикрепете серво

Направете по -дълго серво рамо и прикрепете серво
Направете по -дълго серво рамо и прикрепете серво
Направете по -дълго серво рамо и прикрепете серво
Направете по -дълго серво рамо и прикрепете серво

За да направя по -дълго серво рамо, просто прикрепих 5 сантиметрово парче дърво към серво рамото с няколко малки винта и гайки. Серво рамото трябва да е на 90 градуса върху серво, когато е хоризонтално спрямо основата.

Току -що топло залепих сервопривода към шарнирния дървен държач, но открих, че ако го оставите да работи повече от няколко минути, сервото ще загрее горещото лепило и ще се освободи от дървото. Така че е оправдан по -добър метод на закрепване.

Стъпка 3: Заредете и стартирайте Sketch

Зареждане и изпълнение на скица
Зареждане и изпълнение на скица

Прикрепих моето серво към щифт 7 с помощта на щит, защото това е просто удобно и те струват само няколко долара. Ако нямате щит, след това свържете серво сигналния проводник към щифт 7 на Arduino, червения проводник към 5v на Arduino и заземителния проводник към GND на Arduino. Arduino трябва да осигурява достатъчно ток за работа на серво. Използвам щита, защото е лесно да се използва външно напрежение само за серво.

Ето скицата. Написах рутина на серво регулатор на скоростта, за да променя скоростта на серво, защото вероятно няма да работи добре на пълна скорост.

Можете да промените timingDelay, за да получите различни скорости на търкаляне на топката. Можете също да промените третия параметър на функцията myServo (), за да промените и скоростта.

//////////////////////////////////////////////////////// //////////////////////////////////////////////////////// //////////////// // създадено от Jim Demello, University Shangluo, 2017

// свободни сте да използвате, манипулирате, правите каквото искате с този код, моето име не е задължително

// Тази рутина позволява интерполиране на произволен брой серво, просто добавете нови редове, ако броят на сервомоторите надвишава 4

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

#включва

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

int servoRead (int servoNumber) {

int servoCurrent;

if (servoNumber == 1) {servoCurrent = myservo1.read (); }

if (servoNumber == 2) {servoCurrent = myservo2.read (); }

servoCurrent за връщане;

}

void servoWrite (int servoNumber, int offset) {

if (servoNumber == 1) {myservo1.write (отместване); }

if (servoNumber == 2) {myservo2.write (отместване); }

}

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

int curAngle;

if (servoNum == 1) {curAngle = myservo1.read (); }

if (servoNum == 2) {curAngle = myservo2.read (); }

if (curAngle <newAngle) {

for (int ъгъл = curAngle; ъгъл <newAngle; ъгъл += angleInc) {

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

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

забавяне (incDelay); }

}

else if (curAngle> newAngle) {

for (int ъгъл = curAngle; ъгъл> newAngle; ъгъл -= angleInc) {

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

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

забавяне (incDelay); }

}

}

void interpolate2Servos (int servo1, int servo1Position, int servo2, int servo2Позиция, int numberSteps, int timeDelay) {

int servo1Current, servo2Current;

servo1Current = servoRead (servo1);

servo2Current = servoRead (servo2);

// Serial.print ("Servo3Pos и Current"); Serial.print (servo3Position); Serial.print (""); Serial.println (servo3Current);

// Serial.print ("Servo4Pos и Current"); Serial.print (servo4Position); Serial.print (""); Serial.println (servo4Current);

// Serial.print ("Servo5Pos и Current"); Serial.print (servo5Position); Serial.print (""); Serial.println (servo5Current);

// Serial.print ("Servo6Pos и Current"); 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

if (servo1Position> servo1Current) {cOffsetTotal = cOffsetTotal + cOffset; }

else {cOffsetTotal = cOffsetTotal - cOffset; }

if (servo2Position> servo2Current) {dOffsetTotal = dOffsetTotal + dOffset; }

else {dOffsetTotal = dOffsetTotal - dOffset; }

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

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

// Serial.print ("a и b Offset"); 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 радиус = 8;

void setup ()

{

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

// interpolate2Servos (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); // конвертираме градуси в радиани

поплавък xPos = 90 + (cos (deg) * радиус);

// xPos = кръг (xPos);

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

// yPos = кръг (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);

// interpolate2Servos (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 ++) {

float j = 20 * (cos ((3.14 * i)/180)) + 90;

поплавък k = 20 * (sin ((3.14 * i)/180)) + 90;

myservo1.write (j);

myservo2.write (k);

Serial.print (j);

Serial.print (",");

Serial.println (k);

забавяне (100);

}

}

Препоръчано: