Агуулгын хүснэгт:

Arduino ба нэг Servo бүхий автомат бөмбөг өнхрөх: 3 алхам
Arduino ба нэг Servo бүхий автомат бөмбөг өнхрөх: 3 алхам

Видео: Arduino ба нэг Servo бүхий автомат бөмбөг өнхрөх: 3 алхам

Видео: Arduino ба нэг Servo бүхий автомат бөмбөг өнхрөх: 3 алхам
Видео: Big Tree Tech — SKR 3EZ — Основы 2024, Долдугаар сарын
Anonim
Image
Image

Энэ бол дуусгахад хоёр цаг орчим хугацаа шаардагдах энгийн жижиг Arduino болон servo төсөл юм. Ган бөмбөгийг дотор тойруулан эргүүлэхийн тулд савны тагны нэг үзүүрийг өргөхдөө servo ашигладаг. Энэ нь өөрөө эхэлдэг, хурдыг өөрчилж, хоёр (эсвэл түүнээс дээш) бөмбөгийг нэгэн зэрэг эргүүлж чаддаг. Барих, ажил хийх нь хөгжилтэй байдаг. Хугацааны параметрүүдийг илүү хурдтай тоглуулах боломжтой. Соронзон бөмбөлөг бүхий хэд хэдэн танхимын эффект мэдрэгчийг ашиглан хамгийн сайн параметрүүдийг олох чадвартай ухаалаг машин болгон ашиглаж болно.

Instructables.com дээр байгаа хэн нэгэн илүү боловсронгуй бөмбөг булны машинтай болохыг би дурдах ёстой:

Шаардлагатай материал:

Arduino Uno (эсвэл ямар ч Arduino)

Servo бамбай (заавал биш)

9 гр servo

савны таг

ган бөмбөг

зарим хаягдал мод

Алхам 1: Суурь ба нугастай малгай хийх

Суурь ба нугастай малгай хийх
Суурь ба нугастай малгай хийх

Суурь нь нугастай модон хэсгийг бэхлэх зориулалттай мод юм. Нугастай мод нь ашиглах савны тагнаас том хэмжээтэй байх ёстой бөгөөд нугас болон servo -ийг холбох хангалттай зайтай байх ёстой.

Би жижиг хуванцар rc нисэх онгоцны нугас ашиглаж, нугастай мод, сууринд наасан.

Алхам 2: Servo гараа урт болгоод Servo хавсаргана уу

Servo гараа урт болгоод Servo холбоно уу
Servo гараа урт болгоод Servo холбоно уу
Servo гараа урт болгоод Servo холбоно уу
Servo гараа урт болгоод Servo холбоно уу

Урт servo гар хийхийн тулд би 5 сантиметр хэмжээтэй модыг хэд хэдэн жижиг эрэг, самар ашиглан servo гарт хавсаргасан. Серво гар нь суурин дээр хэвтээ байх үед servo дээр 90 градус байх ёстой.

Би зүгээр л servo -ийг нугастай мод эзэмшигчид халуунаар наасан боловч хэрэв та үүнийг хэдэн минутаас илүү удаан ажиллуулах юм бол серво халуун цавууг халааж, модноос гарах болно гэдгийг олж мэдэв. Тиймээс илүү сайн бэхэлгээний аргыг батлах болно.

Алхам 3: Sketch -ийг ачаалж ажиллуулна уу

Sketch -ийг ачаалах ба ажиллуулах
Sketch -ийг ачаалах ба ажиллуулах

Би servo -оо бамбай ашиглан 7 -р зүүгээр холбосон, учир нь энэ нь маш тохиромжтой бөгөөд хэдхэн долларын үнэтэй. Хэрэв танд бамбай байхгүй бол Arduino дээрх 7 -р зүү, улаан утсыг 5v -т, улаан утсыг Arduino дээрх GND -д холбоно. Arduino нь servo -ийг ажиллуулах хангалттай гүйдэл өгөх ёстой. Гадаа хүчдэлийг зөвхөн сервод ашиглахад хялбар байдаг тул би бамбайгаа ашигладаг.

Энд ноорог байна. Би servo хурдны хянагчийн горимыг бичсэн бөгөөд энэ нь servo -ийн хурдыг өөрчлөх болно, учир нь энэ нь бүрэн хурдтай ажиллахгүй байж магадгүй юм.

Бөмбөгийг өнхрүүлэх янз бүрийн хурдыг авахын тулд хойшлуулах хугацааг өөрчилж болно. Та мөн myServo () функцын гурав дахь параметрийг өөрчилж, хурдыг нь өөрчилж болно.

///////////////////////////////////////////////////// ///////////////////////////////////////////////////// /////////////// // Жим Демелло бүтээсэн, Shangluo их сургууль, 2017 он

// та энэ кодоор хүссэн зүйлээ ашиглах, удирдах, хийх эрх чөлөөтэй, миний нэрийг оруулах шаардлагагүй

// Энэхүү журам нь ямар ч тооны servo -ийг интерполяцлах боломжийг олгодог бөгөөд хэрэв servo -ийн тоо 4 -ээс хэтэрсэн бол шинэ мөрүүдийг нэмж оруулаарай.

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

#оруулах

Servo myservo1, myservo2; // servo хянахын тулд servo объект үүсгэх

int servoRead (int servoNumber) {

int servoCurrent;

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

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

буцах servoCurrent;

}

void servoWrite (int servoNumber, int офсет) {

if (servoNumber == 1) {myservo1.write (офсет); }

if (servoNumber == 2) {myservo2.write (офсет); }

}

хүчингүй 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; өнцөг += өнцөгInc) {

if (servoNum == 1) myservo1.write (өнцөг);

if (servoNum == 2) myservo2.write (өнцөг);

саатал (хойшлуулах); }

}

өөр бол (curAngle> newAngle) {

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

if (servoNum == 1) myservo1.write (өнцөг);

if (servoNum == 2) myservo2.write (өнцөг);

саатал (хойшлуулах); }

}

}

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

int servo1Current, servo2Current;

servo1Current = servoRead (servo1);

servo2Current = servoRead (servo2);

// 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;

for (int x = 0; x

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

өөр {cOffsetTotal = cOffsetTotal - cOffset; }

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

өөр {dOffsetTotal = dOffsetTotal - dOffset; }

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

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

// Serial.print ("a ба b офсет"); Serial.print (aOffsetTotal); Serial.print (""); Serial.println (bOffsetTotal); саатал (10);

саатал (цаг хойшлуулах);

} // төгсгөл

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

// модулийн үлдэгдлийг анхаарч үзээрэй //

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

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;

хүчингүй тохиргоо ()

{

Цуваа эхлэх (9600);

саатал (100);

myservo1.attach (7); // 7 -р зүү дээрх servo -ийг servo объект руу хавсаргана

myservo1.write (90);

myservo2.attach (8); // 8 -р зүү дээрх servo -ийг servo объект руу хавсаргана

myservo2.write (90);

саатал (1000); // servo тийшээ очихыг хүлээж байна

interpolate2Servos (1, 90, 2, 90, 10, 60); // төвийг сахисан

саатал (1000);

}

void loop () {

timingDelay = 15; // 10 цагт ажилладаг

servoDelay = 4;

эргэх4 ();

// interpolate2Servos (1, 90, 2, 90, 1, 60); // төвийг сахисан

// саатал (1000);

// гарах (0); // програмыг түр зогсоох - үргэлжлүүлэхийн тулд дахин тохируулах дээр дарна уу

}

void spin3 () {

interpolate2Servos (1, 90, 2, 110, 1, 60); // төвийг сахисан

саатал (цагийг хойшлуулах);

interpolate2Servos (1, 90, 2, 80, 1, 60); // төвийг сахисан

саатал (timingDelay);

}

void spin2 () {

// interpolate2Servos (1, 80, 2, 90, 1, 50); // төвийг сахисан

саатал (timingDelay);

interpolate2Servos (1, 80, 2, 80, 1, 60); // төвийг сахисан

саатал (timingDelay);

interpolate2Servos (1, 110, 2, 80, 1, 60); // төвийг сахисан

саатал (timingDelay);

// interpolate2Servos (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 (deg) * radius);

// xPos = дугуй (xPos);

float yPos = 90 + (sin (deg) * radius);

// yPos = дугуй (yPos);

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

// interpolate2Servos (1, xPos, 2, yPos, 1, servoDelay); // төвийг сахисан

myservo1.write (xPos);

myservo2.write (yPos);

саатал (timingDelay);

хэрэв (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;

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

myservo1. бичих (j);

myservo2. бичих (k);

Цуваа.хэвлэх (j);

Serial.print (",");

Serial.println (k);

саатал (100);

}

}

Зөвлөмж болгож буй: