Мазмуну:

Arduino жана One Servo менен автоматташтырылган шар ролиги: 3 кадам
Arduino жана One Servo менен автоматташтырылган шар ролиги: 3 кадам

Video: Arduino жана One Servo менен автоматташтырылган шар ролиги: 3 кадам

Video: Arduino жана One Servo менен автоматташтырылган шар ролиги: 3 кадам
Video: This newest airline in Korea has ONE unexpected drawback | Air Premia ICN - NRT 2024, Июль
Anonim
Image
Image

Бул жөнөкөй кичинекей Arduino жана servo долбоору, аны аягына чыгарууга эки сааттай убакыт кетет. Бул идиштин капкагынын бир четин көтөрүү үчүн servo колдонот, ошондо болоттун шарын ички айлананын айланасына айлантат. Бул өзү башталат, ылдамдыгын өзгөртө алат жана бир эле убакта эки (же андан көп?) Топту айланта алат. Куруу жана иштөө кызыктуу. Убакыт параметрлерин, балким, андан да ылдамыраак ойнотсо болот. Магниттик шар менен бир нече зал эффекти сенсорлору аны эң жакшы параметрлерди аныктай турган акылдуу машина кылуу үчүн колдонулушу мүмкүн.

Айта кетүүчү нерсе, Instructables.com сайтында кимдир бирөөнүн татаал шар ролиги бар:

Керектүү материалдар:

Arduino Uno (же ар кандай Arduino)

Серво калканы (милдеттүү эмес)

9g servo

банка капкагы

болот шар

кээ бир жыгач сыныктары

1 -кадам: Базаны жана топсого капкак кармагычты жасаңыз

Негизги жана илгичтүү капкак кармагыч жасаңыз
Негизги жана илгичтүү капкак кармагыч жасаңыз

База - жыгачтын бир үзүмү, ага илинген жыгачты орнотуу үчүн. Илгич жыгач сиз колдоно турган кумуранын капкагынан чоңураак болушу керек жана илгичтер үчүн жана сервону орнотуу үчүн жетиштүү орун бар.

Мен кичинекей пластикалык rc учак топсолорун колдонуп, аларды илгичтүү жыгачка жана базага жөн эле жабыштырдым.

2 -кадам: Серво колун узун кылып, Сервону тиркеңиз

Серво колун узартып, сервону тиркеңиз
Серво колун узартып, сервону тиркеңиз
Серво колун узартып, сервону тиркеңиз
Серво колун узартып, сервону тиркеңиз

Узунураак серво колун жасоо үчүн мен жөн эле 5 сантиметрлик жыгачты бир нече кичинекей бурамалар жана гайкалар менен серво колуна бекиттим. Серво колу базага горизонталдуу болгондо серводо 90 градус болушу керек.

Мен сервону илгичтүү жыгач кармагычка ысык кылып чаптадым, бирок эгер сиз аны бир нече мүнөттөн ашык иштетсеңиз, серво ысык желимди ысытат жана жыгачтан кетет. Ошентип, жакшы тиркөө ыкмасы кепилденет.

3 -кадам: Эскизди жүктөө жана иштетүү

Эскизди жүктөө жана иштетүү
Эскизди жүктөө жана иштетүү

Мен сервомду 7 -пинге калканч менен бекиттим, анткени бул ыңгайлуу жана алар бир нече долларга гана турат. Эгерде сизде калкан жок болсо, анда Arduinoдогу 7 -пинге кызыл сигналды Arduinoдогу 5v -ге жана жердин зымын Arduinoдогу GNDге туташтырыңыз. Arduino сервону иштетүү үчүн жетиштүү токту камсыздашы керек. Мен калканы колдоном, анткени тышкы чыңалууну жөн гана серво үчүн колдонуу оңой.

Мына эскиз. Мен сервонун ылдамдыгын өзгөртүү үчүн серво ылдамдыгын көзөмөлдөө тартибин жаздым, анткени ал толук ылдамдыкта жакшы иштебейт.

Сиз топтун ар кандай ылдамдыгын алуу үчүн кечиктирүүнү өзгөртө аласыз. Ошондой эле ылдамдыкты өзгөртүү үчүн myServo () функциясынын үчүнчү параметрин өзгөртө аласыз.

//////////////////////////////////////////////////// //////////////////////////////////////////////////// /////////////// Джим Демелло тарабынан түзүлгөн, Shangluo University, 2017

// сиз колдонууга, манипуляциялоого, бул код менен каалаганыңызды жасоого эркинсиз, менин атым талап кылынбайт

// Бул жол -жобо каалаган сандагы интерполяцияны жүргүзүүгө мүмкүндүк берет, эгерде серволордун саны 4төн ашса, жаңы саптарды кошуңуз

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

#кошуу

Myservo1, myservo2; // сервону көзөмөлдөө үчүн servo объектисин түзүү

int servoRead (int servoNumber) {

int servoCurrent;

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

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

return servoCurrent;

}

жараксыз servoWrite (int servoNumber, int офсет) {

if (servoNumber == 1) {myservo1.write (offset); }

if (servoNumber == 2) {myservo2.write (offset); }

}

жараксыз 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) {

үчүн (int бурч = curAngle; бурч <newAngle; бурч += angleInc) {

if (servoNum == 1) myservo1.write (бурч);

if (servoNum == 2) myservo2.write (бурч);

кечиктирүү (incDelay); }

}

башка болсо (curAngle> newAngle) {

үчүн (int angle = curAngle; бурч> newAngle; бурч -= angleInc) {

if (servoNum == 1) myservo1.write (бурч);

if (servoNum == 2) myservo2.write (бурч);

кечиктирүү (incDelay); }

}

}

жараксыз 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 жана 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; }

башка {cOffsetTotal = cOffsetTotal - cOffset; }

эгер (servo2Position> servo2Current) {dOffsetTotal = dOffsetTotal + dOffset; }

башка {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;

жараксыз орнотуу ()

{

Serial.begin (9600);

кечиктирүү (100);

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

myservo1.write (90);

myservo2.attach (8); // servo объектине 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 () {

// 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) * радиусу);

// xPos = тегерек (xPos);

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

// 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 ="); Serial. 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 () {

үчүн (int i = 0; i <= 360; i ++) {

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

float k = 20 * (күнөө ((3.14 * i)/180)) + 90;

myservo1.write (j);

myservo2.write (k);

Serial.print (j);

Serial.print (",");

Serial.println (k);

кечиктирүү (100);

}

}

Сунушталууда: