Мазмұны:

Arduino және бір сервисі бар автоматтандырылған шар ролигі: 3 қадам
Arduino және бір сервисі бар автоматтандырылған шар ролигі: 3 қадам

Бейне: Arduino және бір сервисі бар автоматтандырылған шар ролигі: 3 қадам

Бейне: Arduino және бір сервисі бар автоматтандырылған шар ролигі: 3 қадам
Бейне: This newest airline in Korea has ONE unexpected drawback | Air Premia ICN - NRT 2024, Шілде
Anonim
Image
Image

Бұл қарапайым Arduino мен servo жобасы, оны аяқтауға екі сағаттай уақыт кетеді. Болат шарды ішкі айналдыра айналдыру үшін банканың қақпағының бір ұшын көтеру үшін серво пайдаланады. Ол өздігінен басталады, жылдамдықты өзгерте алады және бірден екі (немесе одан да көп) шарды айналдыра алады. Құру және жұмысқа кірісу қызықты. Уақыт параметрлерін одан да жоғары жылдамдықта ойнауға болады. Ең жақсы параметрлерді анықтай алатын ақылды машинаға айналдыру үшін магниттік шарлы бірнеше холлдық сенсорларды қолдануға болады.

Айта кету керек, Instructables.com сайтында біреудің шарикті роликті машинасы бар:

Қажетті материалдар:

Arduino Uno (немесе кез келген Arduino)

Серво қалқаны (міндетті емес)

9г серво

құмыра қақпағы

болат шар

бірнеше ағаш сынықтары

1 -қадам: Негіз мен топсалы қақпақ ұстағышын жасаңыз

Негізгі және топсалы қақпақ ұстағышын жасаңыз
Негізгі және топсалы қақпақ ұстағышын жасаңыз

Негіз - бұл топсалы ағашты бекітуге арналған ағаш түйіршігі. Топсалы ағаш сіз қолданатын құмыра қақпағынан үлкен болуы керек және топсалар мен серво орнатуға жеткілікті орын болуы керек.

Мен шағын пластикалық ұшақтардың ілмектерін қолдандым және оларды топсалы ағаш пен негізге жай ғана жапсырдым.

2 -қадам: Серво қолын ұзартып, серво бекітіңіз

Серво қолын ұзартып, серво бекітіңіз
Серво қолын ұзартып, серво бекітіңіз
Серво қолын ұзартып, серво бекітіңіз
Серво қолын ұзартып, серво бекітіңіз

Ұзын серво қолын жасау үшін мен серво қолына 5 сантиметрлік ағаш кесіндісін бірнеше кішкене бұрандалармен және жаңғақтармен жаптым. Серво тұтқасы негізге көлденең орналасқан кезде серво бойынша 90 градус болуы керек.

Мен сервоны топсалы ағаш ұстағышқа жай ғана жапсырдым, бірақ егер сіз оны бірнеше минуттан артық жұмыс істеуге рұқсат етсеңіз, серво ыстық желімді қыздырып, ағаштан кететінін білдім. Сондықтан бекітудің жақсы әдісі кепілдік береді.

3 -қадам: Эскизді жүктеңіз және іске қосыңыз

Эскизді жүктеу және іске қосу
Эскизді жүктеу және іске қосу

Мен өз серводымды қалқанның көмегімен 7 -пинке бекітіп қойдым, себебі бұл өте ыңғайлы және олардың бағасы бірнеше долларды құрайды. Егер сізде қалқан жоқ болса, онда Arduino 7 -ші түйреуішке серво сигналдық сымды, Arduino -дағы 5В -қа қызыл сымды және Arduino -дағы GND -ге жерге сымды жалғаңыз. Arduino сервопривод үшін жеткілікті ток беруі керек. Мен қалқанды қолданамын, себебі тек қана серво үшін сыртқы кернеуді қолдану оңай.

Міне эскиз. Мен серво жылдамдығын өзгерту үшін серво жылдамдығының реттегішін жаздым, себебі ол толық жылдамдықта жақсы жұмыс істемеуі мүмкін.

Доптың айналуының әр түрлі жылдамдығын алу үшін уақытты кешіктіруге болады. Сондай -ақ, жылдамдықты өзгерту үшін myServo () функциясының үшінші параметрін өзгертуге болады.

/// /// ////////////// // жасаған, Джим Демелло, 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 ofset) {

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

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

}

жарамсыз myServo (int newAngle, int angleInc, int incDelay, int servoNum) {

int curAngle;

егер (servoNum == 1) {curAngle = myservo1.read (); }

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

if (curAngle <newAngle) {

үшін (int бұрышы = curAngle; бұрыш <newAngle; бұрыш += бұрышInc) {

if (servoNum == 1) myservo1.write (бұрыш);

if (servoNum == 2) myservo2.write (бұрыш);

кешіктіру (кешіктіру); }

}

әйтпесе (curAngle> newAngle) {

үшін (int бұрышы = curAngle; бұрыш> newAngle; бұрыш -= 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 және 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; }

басқа {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); // серво объектісіне 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);

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 (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 * (sin ((3.14 * i)/180)) + 90;

myservo1.write (j);

myservo2.write (k);

Serial.print (j);

Serial.print («,»);

Serial.println (k);

кешіктіру (100);

}

}

Ұсынылған: