Мазмуну:

Arduino менен жөнөкөй жана акылдуу робот колу !!!: 5 кадам (сүрөттөр менен)
Arduino менен жөнөкөй жана акылдуу робот колу !!!: 5 кадам (сүрөттөр менен)

Video: Arduino менен жөнөкөй жана акылдуу робот колу !!!: 5 кадам (сүрөттөр менен)

Video: Arduino менен жөнөкөй жана акылдуу робот колу !!!: 5 кадам (сүрөттөр менен)
Video: REAL RACING 3 LEAD FOOT EDITION 2024, Июнь
Anonim
Image
Image
Сизге керектүү нерселер
Сизге керектүү нерселер

Бул көрсөтмөдө мен жөнөкөй робот колун жасайм. Бул башкы кол менен башкарылат. Кол кыймылдарды эстеп, ырааттуу ойнойт. Концепция жаңы эмес, мен идеяны "Stoerpeak аркылуу мини робот колунан" алдым, мен муну көптөн бери жасагым келген, бирок ал кезде мен таптакыр жокмун жана программалоо жөнүндө эч кандай маалыматым жок болчу. Эми акырында мен бирин куруп жатам, аны жөнөкөй, арзан кылып, баарыңар менен бөлүшөм.

Андыктан баштайлы ….

1-кадам: Сизге керектүү нерселер:-

Сизге керектүү нерселер
Сизге керектүү нерселер
Сизге керектүү нерселер
Сизге керектүү нерселер

Бул жерде сизге керектүү нерселердин тизмеси:-

1. Серво моторлору x 5 АКШ үчүн шилтеме:- https://amzn.to/2OxbSH7Link for Europe:-

2. Потенциометрлер x 5 (мен 100к колдондум.) АКШ үчүн шилтеме:- https://amzn.to/2ROjhDMLink Europe үчүн:-

3. Arduino UNO. (Сиз дагы Arduino Nano колдоно аласыз) АКШга шилтеме:- https://amzn.to/2DBbENWLink Europe үчүн:-

4. Нан тактасы. (Мен бул комплектти сунуштайм) АКШга шилтеме:- https://amzn.to/2Dy86w4Link for Europe:-

5. Батарея. (милдеттүү эмес, мен 5v адаптерин колдонуп жатам)

6. Картон/Wood/Sun-board/акрил качан жеткиликтүү же оңой табылса.

Ошондой эле сизге Arduino IDE орнотулушу керек.

2-кадам: Кол жасоо:-

Кол салуу
Кол салуу
Кол салуу
Кол салуу

Бул жерде мен колду жасоо үчүн попсикула таяктарын колдондум. Сизге жеткиликтүү болгон бардык материалдарды колдоно аласыз. Жана дагы жакшыраак кол жасоо үчүн ар кандай механикалык конструкцияларды колдонуп көрсөңүз болот. менин дизайн абдан туруктуу эмес.

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

Мастер колу үчүн мен потенциометрлерди попсикул таякчаларына чаптап, колумду жасадым.

Сүрөттөргө шилтеме жасоо сизге жакшы идея берет.

Мен бардыгын негиз катары колдонулган А4 өлчөмүндөгү холст тактага орноттум.

3-кадам: Байланыштарды түзүү:-

Кабыл алуу Байланыш
Кабыл алуу Байланыш
Кабыл алуу Байланыш
Кабыл алуу Байланыш
Кабыл алуу Байланыш
Кабыл алуу Байланыш

Бул кадамда биз бардык керектүү байланыштарды жасайбыз, Жогорудагы сүрөттөргө кайрылыңыз.

  • Алгач электр сервисине параллелдүү түрдө баардык серволорду туташтырыңыз (Кызыл сым +жана кара же күрөң зым Gndге)
  • Андан кийин сигнал зымдарын, башкача айтканда, сары же кызгылт сары зымды arduino PWM пинине туташтырыңыз.
  • Эми потенциометрлерди +5v жана Gnd arduino менен параллель туташтырыңыз.
  • Орто терминалды аркунионун аналогдук пинине туташтырыңыз.

Бул жерде Digital Pins 3, 5, 6, 9 & 10 серволорду көзөмөлдөө үчүн колдонулат

Потенциометрлерден киргизүү үчүн A0 - A4 аналогдук пиндери колдонулат.

3 -пинге туташкан серво A0го туташкан потенциометр менен башкарылат

5 -пинге туташтырылган сервисти A1деги казан башкарат жана башкалар …

Эскертүү:- Серверлер arduino менен иштебесе дагы, Gnd серводорун arduino менен туташтыргыла, болбосо кол иштебейт.

4-кадам: Коддоо:-

Коддоо
Коддоо

Бул коддун логикасы өтө жөнөкөй, потенциометрлердин мааниси массивде сакталат, андан кийин жазуулар for циклинин жардамы менен өтөт жана серволор баалуулуктарга ылайык кадамдарды жасашат. Сиз "Arduino потенциометринин Servo Control & Memory" справкасы үчүн колдонгон бул окуу куралын текшере аласыз.

Код:- (Төмөндө жүктөлүүчү файл тиркелет.)

Биринчиден, биз глобалдуу түрдө бардык керектүү өзгөрмөлөрдү жарыялайбыз, андыктан аларды программа бою колдоно алабыз. Бул үчүн атайын түшүндүрмөнүн кереги жок

#кошуу

// Servo Objects Servo Servo_0; Servo Servo_1; Servo Servo_2; Servo Servo_3; Servo Servo_4; // Потенциометр объекттери int Pot_0; int Pot_1; int Pot_2; int Pot_3; int Pot_4; // Servo Position int Servo_0_Pos сактоо үчүн өзгөрмө; int Servo_1_Pos; int Servo_2_Pos; int Servo_3_Pos; int Servo_4_Pos; // Мурунку абалдын маанилерин сактоо үчүн өзгөрмө int Prev_0_Pos; int Prev_1_Pos; int Prev_2_Pos; int Prev_3_Pos; int Prev_4_Pos; // Учурдагы абалдын маанилерин сактоо үчүн өзгөрмө int Current_0_Pos; int Current_1_Pos; int Current_2_Pos; int Current_3_Pos; int Current_4_Pos; int Servo_Position; // бурчту сактайт int Servo_Number; // Дүкөндөрдө servo int Storage жок [600]; // Дайындарды сактоо үчүн массив (Массивдин өлчөмүн көбөйтүү көбүрөөк эстутумду сарптайт) int Index = 0; // Array индекси 0 -позициядан башталат char data = 0; // сериялык киргизүүдөн маалыматтарды сактоо үчүн өзгөрмө.

Эми биз орнотуу функциясын жазабыз, анда пиндерди жана алардын функцияларын орнотобуз. Бул биринчи орунда турган негизги функция

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

{Serial.begin (9600); // arduino менен IDEнин ортосундагы сериялык байланыш үчүн. // Серво объекттери PWM казыктарына бекитилет. Servo_0.attach (3); Servo_1.attach (5); Servo_2.attach (6); Servo_3.attach (9); Servo_4.attach (10); // Серверлер инициализацияда 100 позицияга коюлган. Servo_0.write (100); Servo_1.write (100); Servo_2.write (100); Servo_3.write (100); Servo_4.write (100); Serial.println ( Жазуу үчүн 'R' баскычын жана ойнотуу үчүн 'P' баскычын басыңыз)); }

Эми биз аналогдук кирүү казыктарын колдонуп, потенциометрлердин маанилерин окуп, аларды карточкага алышыбыз керек., сиз каалаган нерсени атасаңыз болот, бул колдонуучу тарабынан аныкталган функция

жараксыз Map_Pot ()

{ / * Серволор 180 градуска айланат, бирок аны чектерде колдонуу жакшы идея эмес, анткени ал серволорду тынымсыз ызалантат, андыктан биз сервону чектейбиз: 1-179 * / Pot_0 = analogRead (A0); // Казандан келген маалыматты окуп, Variable Pot_0до сактаңыз. Servo_0_Pos = карта (Pot_0, 0, 1023, 1, 179); // Картанын серверлери 0дон 1023ка чейинки мааниге ылайык Servo_0.write (Servo_0_Pos); // Сервону ошол позицияга жылдырыңыз. Pot_1 = analogRead (A1); Servo_1_Pos = карта (Pot_1, 0, 1023, 1, 179); Servo_1.write (Servo_1_Pos); Pot_2 = analogRead (A2); Servo_2_Pos = карта (Pot_2, 0, 1023, 1, 179); Servo_2.write (Servo_2_Pos); Pot_3 = analogRead (A3); Servo_3_Pos = карта (Pot_3, 0, 1023, 1, 179); Servo_3.write (Servo_3_Pos); Pot_4 = analogRead (A4); Servo_4_Pos = карта (Pot_4, 0, 1023, 1, 179); Servo_4.write (Servo_4_Pos); }

Эми биз цикл функциясын жазабыз:

боштук цикл ()

{Map_Pot (); // Функциянын чалуусу казандын маанилерин окуп жатканда (Serial.available ()> 0) {data = Serial.read (); if (data == 'R') Serial.println ("Moves Recording…"); if (data == 'P') Serial.println ("Жазылган кыймылдарды ойнотуу…"); } if (data == 'R') // Эгерде 'R' киргизилсе, жазууну баштаңыз. {// Маанилерди Prev_0_Pos = Servo_0_Pos өзгөрмөсүндө сактоо; Prev_1_Pos = Servo_1_Pos; Prev_2_Pos = Servo_2_Pos; Prev_3_Pos = Servo_3_Pos; Prev_4_Pos = Servo_4_Pos; Map_Pot (); // Карта функциясы эгерде (abs (Prev_0_Pos == Servo_0_Pos))) // абсолюттук маанини {Servo_0.write (Servo_0_Pos) салыштыруу аркылуу алынса, салыштыруу үчүн кайра чакыртылган; // Эгерде баалуулуктар дал келүүчү сервонун ордуна которулса, анда (Current_0_Pos! = Servo_0_Pos) // Эгерде маанилер дал келбесе {Storage [Index] = Servo_0_Pos + 0; // Индекс ++ массивине маани кошулат; // 1} Current_0_Pos = Servo_0_Pos менен көбөйтүлгөн индекстин мааниси; } /* Ушундай эле маанини салыштыруу бардык серволор үчүн жүргүзүлөт, +100 ар бир кирүү үчүн дифференциалдык мааниге кошулат. */ if (abs (Prev_1_Pos == Servo_1_Pos)) {Servo_1.write (Servo_1_Pos); if (Current_1_Pos! = Servo_1_Pos) {Storage [Index] = Servo_1_Pos + 100; Index ++; } Current_1_Pos = Servo_1_Pos; } if (abs (Prev_2_Pos == Servo_2_Pos)) {Servo_2.write (Servo_2_Pos); if (Current_2_Pos! = Servo_2_Pos) {Storage [Index] = Servo_2_Pos + 200; Index ++; } Current_2_Pos = Servo_2_Pos; } if (abs (Prev_3_Pos == Servo_3_Pos)) {Servo_3.write (Servo_3_Pos); if (Current_3_Pos! = Servo_3_Pos) {Storage [Index] = Servo_3_Pos + 300; Index ++; } Current_3_Pos = Servo_3_Pos; } if (abs (Prev_4_Pos == Servo_4_Pos)) {Servo_4.write (Servo_4_Pos); if (Current_4_Pos! = Servo_4_Pos) {Storage [Index] = Servo_4_Pos + 400; Index ++; } Current_4_Pos = Servo_4_Pos; } / * Маанилер сериялык монитордо басылат, '\ t' таблицалык форматта баалуулуктарды көрсөтүү үчүн * / Serial.print (Servo_0_Pos); Serial.print ("\ t"); Serial.print (Servo_1_Pos); Serial.print ("\ t"); Serial.print (Servo_2_Pos); Serial.print ("\ t"); Serial.print (Servo_3_Pos); Serial.print ("\ t"); Serial.println (Servo_4_Pos); Serial.print ("Индекс ="); Serial.println (Индекс); кечиктирүү (50); } if (data == 'P') // IF 'P' киргизилсе, жазылган кыймылдарды ойнотууну баштаңыз. {for (int i = 0; i <Index; i ++) // Массивди цикл үчүн колдонуу {Servo_Number = Storage /100; // Servo_Position = Сактагычтын санын табат % 100; // Серво которгучтун абалын табат (Servo_Number) {0 0: Servo_0.write (Servo_Position); тыныгуу; 1 -жагдай: Servo_1.write (Servo_Position); тыныгуу; 2 -жагдай: Servo_2.write (Servo_Position); тыныгуу; 3 -жагдай: Servo_3.write (Servo_Position); тыныгуу; 4 -жагдай: Servo_4.write (Servo_Position); тыныгуу; } кечиктирүү (50); }}}

Код даяр болгондон кийин, аны arduino тактасына жүктөңүз

Акылдуу кол иштөөгө даяр. Функция азырынча Stoerpeak тарабынан түзүлгөндөй жылмакай эмес.

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

Муну айткандан кийин, тестке өтөлү ….

5-кадам: Тестирлөө:-

Кодду тактага ийгиликтүү жүктөгөндөн кийин, "Сериялык Мониторду" ачыңыз, аны Куралдар тандоосунан таба аласыз. Сериялык монитор башталганда arduino баштапкы абалга келет. Эми сиз роботтун колун башкы кол менен башкара аласыз. Бирок эч нерсе жазылган эмес.

Жазууну баштоо үчүн, мониторго 'R' киргизиңиз, эми сиз жазгыңыз келген кыймылдарды жасай аласыз.

Кыймылдар аяктагандан кийин, жазылган кыймылдарды ойнотуу үчүн 'P' киришиңиз керек. Такта баштапкы абалга келтирилбесе, servos кыймылдарды аткарууну улантат.

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