PRJ-02Boshlangʻich45 daqiqa8 ta detalSimulyatorda bor

Birinchi yurish: kvadrat boʻylab yuradigan mashina

CoreEngine robot-mashinasini yigʻing va uni kvadrat boʻylab yurgizing: toʻrtta toʻgʻri tomon va oʻngga toʻrtta burilish, vaqtni delay() belgilaydi. Soʻng burilishlarni sozlang.

Robot nima qiladi

Robot-mashina bir marta kvadrat boʻylab yuradi: 1,2 soniya toʻgʻri oldinga yuradi, oʻngga chorak burilish qiladi, buni toʻrt marta takrorlaydi va toʻxtaydi.

VideoYouTubeʼda

Robot-mashinangiz ilk bor kvadrat boʻylab yuradi: toʻgʻri oldinga harakatlanadi, oʻngga chorak burilish qiladi, buni toʻrt marta takrorlaydi va toʻxtaydi. Uno L298N motor drayveri orqali ikkita motorni qanday boshqarishini, PWM (impuls kengligi modulyatsiyasi) tezlikni qanday belgilashini va faqat vaqtni sanaydigan robot nega hech qachon mukammal kvadrat boʻylab yura olmasligini oʻrganasiz. Bu boshlangʻich loyiha, u taxminan 45 daqiqa vaqt oladi.

Nima kerak

Ushbu loyiha uchun detallarHammasi toʻplamda bor: Arduino bilan 2WD robot-mashina toʻplami

Yana toʻrtta AA batareya va L298N ning vintli klemmalari uchun kichik otvyortka kerak boʻladi. Marketda bu mashina robot-mashina toʻplami sifatida bor.

Qanday ishlaydi

L298N batareya va ikki motor orasida turadi. Uno unga ENA, IN1–IN4 va ENB orqali buyruq beradi.

Motor drayveri

Uno pini xavfsiz holatda taxminan 20 mA tok bera oladi. TT reduktorli motorga yurayotganda taxminan 0,3 A, toʻsilib qolganda esa taxminan 1 A gacha tok kerak boʻladi. Shuning uchun Uno faqat signal yuboradi. Batareya tokini motorlarga L298N motor drayveri ulaydi va uzadi.

L298N da ikkita H-koʻprik bor, har bir motor uchun bittadan. H-koʻprik motorni batareyaga toʻgʻri ham, teskari ham ulay oladi, shuning uchun motor oldinga yoki orqaga aylanadi. Chap motorni ENA, IN1 va IN2 boshqaradi:

ENA IN1 IN2 Motor
HIGH yoki PWM HIGH LOW oldinga aylanadi
HIGH yoki PWM LOW HIGH orqaga aylanadi
HIGH HIGH HIGH tormozlanadi
HIGH LOW LOW tormozlanadi
LOW istalgan istalgan inersiya bilan erkin aylanadi

Oʻng motor ham xuddi shunday ishlaydi, faqat uni ENB, IN3 va IN4 boshqaradi.

PWM: tezlik qanday belgilanadi

Pin faqat HIGH yoki LOW boʻla oladi. Tezlikni pasaytirish uchun analogWrite() ENA ga ulangan pinni juda tez yoqib-oʻchiradi: D5 va D6 da soniyasiga taxminan 980 marta. 0 dan 255 gacha boʻlgan son har bir siklning qancha qismida pin yoqilgan boʻlishini belgilaydi. 200 qiymatida motor vaqtning 200/255 qismida, yaʼni taxminan 78 foizida quvvat oladi, shuning uchun sekinroq aylanadi. Bu PWM, yaʼni impuls kengligi modulyatsiyasi deyiladi.

Quvvat

Toʻrtta AA batareya L298N ning +12V klemmasiga taxminan 6 V beradi. Klemma yonida +12V deb yozilgan, lekin modul 6 V da ham ishlaydi. L298N ichida taxminan 1,8 V yoʻqoladi, shuning uchun toʻliq tezlikda motorlarga taxminan 4,2 V yetib boradi.

L298N da kichik 5 V li stabilizator ham bor. Uning +5V klemmasi Unoning 5V piniga ulanadi va Unoni quvvat bilan taʼminlaydi. Toʻrtta AA batareyadan u taxminan 4,4 V beradi: bu yetarli, lekin biroz past. Ikki platani GND simi bogʻlaydi. Signallar ikkala platada bir xil 0 V boʻlgandagina ishlaydi. Bu umumiy yer (GND) deyiladi.

Ikki gʻildirak bilan boshqarish

Mashina yoʻnalishini ikki gʻildiragining tezligi bilan oʻzgartiradi. Ikkala gʻildirak oldinga aylansa, u toʻgʻri yuradi. Chap gʻildirak oldinga, oʻng gʻildirak esa orqaga aylansa, u joyida oʻngga aylanadi. Sharli tayanch esa shunchaki ergashib dumalaydi.

Ikkala motor bir xil, lekin oʻng motor koʻzgudagidek teskari oʻrnatilgan. Ulanish ham bir xil boʻlsa, «oldinga» signali uni orqaga aylantirardi. Shuning uchun uning simlari ataylab almashtirilib, OUT4 va OUT3 ga ulangan.

Kvadrat nega hech qachon mukammal chiqmaydi

Sketch hech narsani oʻlchamaydi. U «450 ms aylan» deydi va bu chorak burilish boʻladi, deb umid qiladi. Oʻlchamasdan boshqarish ochiq konturli boshqaruv (open-loop) deyiladi. Haqiqiy burilish quyidagilarga bogʻliq:

  • Batareyalar. Yangi AA batareyalarning har biri taxminan 1,5 V, hammasi birgalikda taxminan 6 V beradi. Deyarli tugaganlarining har biri taxminan 1,2 V, birgalikda esa taxminan 4,8 V beradi. L298N da 1,8 V yoʻqolgach, motorlarga 4,2 V oʻrniga taxminan 3 V yetadi va har bir burilish qisqaroq boʻladi.
  • Pol. Silliq kafelda gʻildiraklar sirpanadi, gilamda esa sharli tayanch yaxshi dumalamay, sudraladi.
  • Motorlar. Aynan bir xil boʻlgan ikkita TT motor boʻlmaydi. Biri biroz tezroq aylansa, mashina toʻgʻri tomonlarda egri yuradi.
  • Inersiya. Sketch yurishdan burilishga oʻtganda mashina birdaniga toʻxtamaydi. U yana biroz sirpanib boradi.

Shuning uchun TURN_MS siz uni sozlagan pol va batareyalar bilangina yaxshi kvadrat beradi. Aniq yurishi uchun robot aslida nima boʻlganini oʻlchashi kerak. Bu ishni datchiklar bajaradi, keyingi loyihalarda esa ular qoʻshiladi.

Yigʻish

1. Simulyatorda mashinani tanlang

Oʻyinda boshidanoq bor boʻlgan Obstacle avoider mashinasida shu mashinadagi qavatlar, motorlar, gʻildiraklar, batareya qutisi, Uno va L298N bor. Unda HC-SR04 ham bor, lekin bu loyihada u kerak emas: uni «Yigʻish» boʻlimida olib tashlang yoki qoldiring, sketch undan foydalanmaydi. Uning simlari quyidagi jadvaldagidek ulanmagan, shuning uchun 2-qadamda ularni qaytadan ulaysiz.

Haqiqiy yigʻishda: ikkita TT motorni pastki plastinaning (qavatning) ostiga vint bilan mahkamlang, 65 mm li gʻildiraklarni kiygizing va sharli tayanchni old tomonga, plastina ostiga oʻrnating. Batareya qutisini ikki plastina orasiga qoʻying. Yuqori plastinada Unoni orqa tomonga, L298N ni esa uning oldiga oʻrnating. Batareyalarni hozircha solmang.

2. Mashinaning simlarini ulang

QayerdanQayergaNima uchun
Batareya +L298N +12VMotorlar quvvati: toʻrtta AA batareyadan taxminan 6 V
Batareya -L298N GNDBatareya minusi
L298N +5VUno 5VDrayver stabilizatori Unoni quvvatlaydi: taxminan 4,4 V
L298N GNDUno GNDUmumiy yer: signallarga bir xil 0 V kerak
Uno D5L298N ENAChap motor tezligi (PWM); ENA jumperi olib qoʻyilgan
Uno D4L298N IN1Chap motor yoʻnalishi
Uno D7L298N IN2Chap motor yoʻnalishi
Uno D8L298N IN3Oʻng motor yoʻnalishi
Uno D12L298N IN4Oʻng motor yoʻnalishi
Uno D6L298N ENBOʻng motor tezligi (PWM); ENB jumperi olib qoʻyilgan
Chap motor M+L298N OUT1
Chap motor M-L298N OUT2
Oʻng motor M+L298N OUT4Ataylab almashtirilgan: bu motor koʻzgudagidek oʻrnatilgan
Oʻng motor M-L298N OUT3Ataylab almashtirilgan: bu motor koʻzgudagidek oʻrnatilgan

Simulyator ulanishni tekshiradi va muammolarni koʻrsatadi, masalan, umumiy yer yoʻqligini yoki L298N ning 5 V chiqishi 5V pini oʻrniga VIN ga ulanganini.

Haqiqiy yigʻishda: ENA va ENB pinlarida ikkita jumper (kichik qalpoqcha) turadi. D5 va D6 ni ulashdan oldin ularni sugʻurib oling. Jumperlar joyida boʻlsa, motorlar doim toʻliq tezlikda aylanadi. Koʻpchilik modullarda quvvat klemmalari yonida yana bitta jumper bor. Uni joyida qoldiring: u 5 V li stabilizatorni yoqadi. Vintli klemmadagi har bir simni ohista tortib, mahkam turganini tekshiring.

3. Sketchni yuklang

«Kod» boʻlimini oching, shu sahifadagi FirstDrive sketchini qoʻying, «Tekshirish» tugmasini, keyin «Yuklash» tugmasini bosing.

Haqiqiy yigʻishda: batareyalarni soling va mashinani gʻildiraklari havoda osilib turadigan qilib quti ustiga qoʻying. USB kabelni ulang va sketchni yuklang. Gʻildiraklar aylana boshlagach, ularni tekshiring. Toʻgʻri tomonlarda ikkala gʻildirak oldinga aylanadi. Burilishlarda chap gʻildirak oldinga, oʻng gʻildirak esa orqaga aylanadi.

4. Kvadrat boʻylab yurgizing

Arenada robotni ishga tushiring. Bir soniyadan keyin mashina bir marta kvadrat boʻylab yuradi va toʻxtaydi. Motorlar va batareya jonli koʻrsatkichlarda koʻrinib turadi.

Haqiqiy yigʻishda: USB kabelni uzing. Mashinani har tomonida taxminan bir metr boʻsh joy boʻlgan tekis polga qoʻying va Unodagi RESET tugmasini bosing. Bir soniyadan keyin mashina kvadrat boʻylab yuradi. Takrorlash uchun RESET tugmasini yana bosing.

5. Burilishni sozlang

Birinchi burchakni kuzating. Mashina chorak burilish (90 gradus) qildimi, undan koʻproqmi yoki kamroqmi?

Nimani koʻryapsiz Nimani oʻzgartirish kerak
Burilish juda kichik TURN_MS ni 20–30 ga oshiring
Burilish juda katta TURN_MS ni 20–30 ga kamaytiring
Burilishlar har safar har xil SPEED ni kamaytiring, masalan 160 gacha, keyin TURN_MS ni qaytadan sozlang
Tomonlar juda uzun yoki juda qisqa STRAIGHT_MS ni oʻzgartiring

Bir vaqtda faqat bitta sonni oʻzgartiring, keyin sketchni yuklab, yana sinab koʻring. Sekinroq aylanish uchun TURN_MS kattaroq boʻlishi kerak. SPEED ni taxminan 90 dan yuqori saqlang, chunki undan past qiymatda TT motorlar faqat gʻuvillashi mumkin. Keyin oʻz sonlaringizni haqiqiy mashinada, keyinroq esa eskiroq batareyalar bilan sinab koʻring. Sketch oʻzgarmasa ham, kvadrat oʻzgaradi.

Kod

FirstDrive.ino
// First drive: the robot drives a square once, then stops.
// L298N: ENA -> D5, IN1 -> D4, IN2 -> D7 (left motor, A)
//        ENB -> D6, IN3 -> D8, IN4 -> D12 (right motor, B)
// The ENA and ENB jumpers are off: the Arduino sets each motor's speed with PWM.

const byte ENA = 5, IN1 = 4, IN2 = 7;
const byte ENB = 6, IN3 = 8, IN4 = 12;

const int SPEED = 200;           // 0..255
const int STRAIGHT_MS = 1200;    // one side of the square
const int TURN_MS = 450;         // about a quarter turn: tune it for your robot and floor

// speed from -255 (full backwards) to 255 (full forwards); 0 lets the motor coast
void setMotor(byte enablePin, byte inA, byte inB, int speed) {
  speed = constrain(speed, -255, 255);
  digitalWrite(inA, speed > 0);
  digitalWrite(inB, speed < 0);
  analogWrite(enablePin, abs(speed));
}

void drive(int left, int right) {
  setMotor(ENA, IN1, IN2, left);
  setMotor(ENB, IN3, IN4, right);
}

void setup() {
  const byte pins[] = {ENA, IN1, IN2, ENB, IN3, IN4};
  for (byte pin : pins) pinMode(pin, OUTPUT);

  delay(1000);                   // one second to put the robot down
  for (int side = 0; side < 4; side++) {
    drive(SPEED, SPEED);         // straight ahead
    delay(STRAIGHT_MS);
    drive(SPEED, -SPEED);        // spin right on the spot
    delay(TURN_MS);
  }
  drive(0, 0);                   // done: stop
}

void loop() {
  // Nothing here: the square is driven once, in setup().
}

Pinlar va sozlamalar

Birinchi qatorlar drayverning oltita piniga ulanish jadvalidagidek nom beradi. Ularning ostida siz sozlaydigan uchta sozlama turadi: SPEED, STRAIGHT_MS va TURN_MS.

setMotor(): bitta motor

void setMotor(byte enablePin, byte inA, byte inB, int speed) {
  speed = constrain(speed, -255, 255);
  digitalWrite(inA, speed > 0);
  digitalWrite(inB, speed < 0);
  analogWrite(enablePin, abs(speed));
}

Tezlik -255 dan 255 gacha boʻladi: -255 orqaga toʻliq tezlik, 255 esa oldinga toʻliq tezlik. constrain() uni shu oraliqda ushlab turadi. Tezlik oldinga boʻlsa, speed > 0 rost (true) boʻladi, true esa HIGH degani. Shunday qilib, inA HIGH, inB esa LOW boʻladi: bu drayver jadvalidagi «oldinga». Orqaga tezlikda buning teskarisi boʻladi. Tezlik 0 boʻlsa, enable (ruxsat) pini ham LOW boʻladi, shuning uchun motor erkin aylanadi. analogWrite() PWM ni tezlikning ishorasiz qiymatidan belgilaydi: abs(-200) 200 ga teng.

drive(): ikkala motor

drive(left, right) funksiyasi setMotor() ni ikki marta chaqiradi: ENA, IN1 va IN2 dagi chap motor uchun va ENB, IN3 va IN4 dagi oʻng motor uchun. Bundan keyin sketch faqat gʻildiraklar tezligi bilan ish koʻradi.

setup(): butun kvadrat

Avval oltita boshqaruv pini chiqishga aylanadi: for (byte pin : pins) massivdagi har bir pin uchun pinMode() ni chaqiradi. Keyin kvadratning oʻzi keladi:

  delay(1000);                   // one second to put the robot down
  for (int side = 0; side < 4; side++) {
    drive(SPEED, SPEED);         // straight ahead
    delay(STRAIGHT_MS);
    drive(SPEED, -SPEED);        // spin right on the spot
    delay(TURN_MS);
  }
  drive(0, 0);                   // done: stop

for sikli oʻz tanasini toʻrt marta, har bir tomon uchun bir marta bajaradi. drive() motorlarni sozlaydi, delay() esa ularga ishlashga vaqt beradi. Sketch oʻzgartirmaguncha pinlar oʻz holatini saqlaydi. Oxirida drive(0, 0) ikkala motorni toʻxtatadi. loop() boʻsh, shuning uchun kvadrat faqat bir marta bajariladi. Mashinani kvadrat boʻylab yana yurgizish uchun RESET tugmasini bosing.

Agar ishlamasa

  • Gʻildirak notoʻgʻri tomonga aylanyapti yoki mashina toʻgʻri yurish oʻrniga joyida aylanyapti. L298N da oʻsha motorning ikkita simini almashtiring: OUT1 ni OUT2 bilan yoki OUT3 ni OUT4 bilan. 3-qadamdagidek gʻildiraklar havoda turganda sinab koʻring.
  • Hech narsa qimirlamayapti. Batareyalarni, +12V va GND ga boradigan simlarni hamda L298N bilan Uno orasidagi GND simini tekshiring. Simulyatorda ulanish tekshiruvi koʻrsatgan muammolarni oʻqing.
  • Motorlar doim toʻliq tezlikda aylanyapti (haqiqiy yigʻish). ENA va ENB dagi jumperlar hali ham joyida.
  • Bitta motor aylanmayapti. Uning enable simini (D5 dan ENA ga, D6 dan ENB ga) va motor simlarini tekshiring.
  • Uno batareyalardan ishga tushmayapti. L298N ning +5V klemmasi VIN ga emas, Unoning 5V piniga ulanishi kerak. VIN ga 7–12 V kerak, shuning uchun u yerdagi 4,4 V juda kam.
  • Mashina kvadratni boshlaydi, toʻxtaydi va yana boshlaydi. Uno qayta ishga tushib qolyapti. Ishga tushayotgan motorlar batareya kuchlanishini pasaytiradi, Unoning taʼminot kuchlanishi ham tushib ketadi. Bu kuchlanish pasayishi (brown-out) deyiladi. Yangi batareyalar va qisqa quvvat simlaridan foydalaning. Drayver yonida +12V va GND orasiga 100–470 mkF li kondensator ulang, uning - oyogʻi GND ga ulansin. Robotlar nega qayta ishga tushib qolishi haqidagi maqolani oʻqing.

Keyingi qadamlar

Vaqt boʻyicha yurishning chegarasi bor: robot nima qilganini koʻra olmaydi. Keyingi loyihada mashinaga ultratovush datchigi qoʻshiladi, shunda u devorni koʻrib, unga javob bera oladi: bu toʻsiqni aylanib oʻtuvchi robot.

Koʻproq bilish uchun motorlar va L298N haqidagi darsni, shuningdek TT reduktorli motorlar va qaysi motor drayverini tanlash haqidagi maqolalarni oʻqing. Robotlar bilan endi tanishayotgan boʻlsangiz, robot nima ekani haqidagi darsdan boshlang.

Yanada yaxshilang

  1. Mashinani uchburchak boʻylab yurgizing: uchta tomon va 120 gradusli uchta burilish. Burilish uchun yangi vaqtni toping.
  2. Kvadratni chapga burilib yuradigan qiling: burilishdagi minus ishorasini ikkinchi gʻildirakka oʻtkazing.
  3. Mashina toʻgʻri tomonlarda egri yursa, tezroq motorga biroz kamroq tezlik bering.