03-darsOson30 daqiqaOʻZ · РУ · ENSimulyatorda bor

Motorlar va L298N drayveri

Nega pin motorni aylantira olmaydi, L298N ning H-koʻprigi yoʻnalish va tezlikni qanday belgilaydi, Unoni undan qanday xavfsiz quvvatlantirish kerak va setMotor() har bir qatorda nima qiladi.

VideoYouTubeʼda

Asosiysi

  • Pin 20 mA beradi, TT motorga esa robotni yurgizish uchun taxminan 0,3 A, toʻsilib qolganda 1 A gacha tok kerak.
  • H-koʻprik motordan oʻtadigan tokning yoʻnalishini teskarisiga oʻzgartiradi, shuning uchun motor ikki tomonga ham aylana oladi.
  • IN1 va IN2 yoʻnalishni belgilaydi; jumperi olib tashlangan ENA ga beriladigan PWM esa tezlikni 0 dan 255 gacha belgilaydi.
  • L298N ichida taxminan 1,8 V yoʻqoladi: 6 V dan motorlarga taxminan 4,2 V yetib boradi.
  • L298N ning +5V chiqishi Unoning 5V pinini taʼminlaydi; GND larni oʻzaro ulang va batareyani hech qachon 5V piniga ulamang.

Motorga Arduino pini bera oladiganidan ancha koʻp tok kerak. Ular orasida L298N motor drayveri turadi. Uno kuchsiz signallar yuboradi, L298N esa batareya quvvatini motorlarga beradi yoki uzadi, ularni oldinga yoki orqaga, tez yoki sekin aylantiradi.

Nega pin motorni aylantira olmaydi

TT motor-reduktor: 1:48 reduktorli kichik doimiy tok motori. 65 mm gʻildiragi oq valga kiydiriladi.

Foto: Lukas Ruge · CC0

Raqamlarni solishtiring:

Nima Tok
Uno pini, xavfsiz 20 mA
Uno pini, mutlaq chegara 40 mA
TT motor, erkin aylanganda taxminan 100–150 mA
TT motor, robotni yurgizganda taxminan 300 mA
TT motor, toʻsilib qolganda (toʻxtab qolish) taxminan 1000 mA (1 A) gacha

Hatto erkin aylanayotgan motorga ham pin xavfsiz bera oladigan tokdan kamida besh baravar koʻp tok kerak. Gʻildirak toʻsilib qolganda esa ellik baravar koʻp tok kerak boʻladi.

Ikkinchi muammo ham bor. Motor — simdan oʻralgan gʻaltak. Gʻaltakdan oʻtayotgan tok birdan toʻxtasa, gʻaltak qisqa, lekin yuqori kuchlanish sakrashini hosil qiladi. Bu sakrash pinni yoki tranzistorni ishdan chiqarishi mumkin. L298N modulida bunday sakrashlarni ushlab qoladigan diodlar bor. Shuning uchun motorni hech qachon Arduino piniga toʻgʻridan-toʻgʻri ulamang.

H-koʻprik gʻoyasi

Oʻzgarmas tok motorini boshqa tomonga aylantirish uchun undan oʻtadigan tokning yoʻnalishini teskarisiga oʻzgartirasiz. H-koʻprik buni toʻrtta kalit yordamida bajaradi.

H harfini koʻz oldingizga keltiring. Motor — oʻrtadagi koʻndalang chiziq. Ikkala tik chiziqning har birida bitta kalit motordan yuqorida, yana bitta kalit esa undan pastda joylashgan. Yuqori uchlar batareyaning + qutbiga, pastki uchlar esa GND ga ulanadi.

  • Yuqori chap va pastki oʻng kalitlarni yoqing. Tok motor orqali chapdan oʻngga oqadi va motor bir tomonga aylanadi.
  • Yuqori oʻng va pastki chap kalitlarni yoqing. Tok oʻngdan chapga oqadi va motor boshqa tomonga aylanadi.
  • Ikkala pastki kalitni yoqing. Endi motorning ikkala simi oʻzaro tutashadi. Aylanayotgan motor generator boʻlib ishlaydi, bu qisqa tutashuv esa uni tez sekinlashtiradi: motor tormozlanadi.
  • Toʻrttala kalitni ham oʻchiring. Motor uzilib qoladi. U ishqalanish toʻxtatguncha erkin aylanib boradi.

Bir tomondagi, yaʼni bitta tik chiziqdagi ikkala kalitni yoqish batareyaning + qutbini toʻgʻridan-toʻgʻri GND ga ulab qoʻygan boʻlardi. Kirishlarning hech qanday kombinatsiyasi bunga olib kela olmaydi. L298N mikrosxemasi ichida ikkita H-koʻprik bor, shuning uchun bitta modul ikkita motorni boshqaradi. Uning kalitlari tranzistorlardan iborat, shuning uchun ular juda tez yoqilib-oʻchira oladi.

L298N ning klemmalari va pinlari

L298N batareya va ikki motor orasida turadi. Uno unga ENA, IN1–IN4 va ENB orqali buyruq beradi.
Klemma yoki pin Nima uchun kerak Robot-mashinada
+12V Motorlar taʼminoti, 5–35 V (bu nom shunchaki yozuv) Batareyaning + simi (qizil), taxminan 6 V
GND Taʼminot va signallar uchun yer Batareyaning - simi (qora) va Unoning GND pinlaridan biri
+5V Modulning oʻz 5 V stabilizatori chiqishi; stabilizator jumperi (kichik qalpoqcha, koʻpincha 5V-EN deb belgilanadi) oʻrnatilgan boʻlsa ishlaydi Unoning 5V pini, HC-SR04 bor robotlarda esa uning VCC pini ham
OUT1, OUT2 A motori Chap motor
OUT3, OUT4 B motori Oʻng motor, simlari almashtirilgan (quyida qarang)
ENA, ENB Enable (ruxsat): A va B motorlarini yoqish yoki oʻchirish hamda ularning tezligi D5 va D6 (PWM, yaʼni impuls kengligi modulyatsiyasi)
IN1, IN2 A motorining yoʻnalishi D4 va D7
IN3, IN4 B motorining yoʻnalishi D8 va D12

Har bir kanal 2 A gacha, qoʻshimcha sovutishsiz esa taxminan 1 A tok bera oladi. Yurayotgan TT motorga taxminan 0,3 A kerak.

Yangi modulning ENA va ENB pinlarida jumper deb ataladigan kichik qalpoqchalar boʻladi. Jumper pinni 5 V ga ulaydi. Shunda motor doim yoqilgan boʻladi: IN1 va IN2 har xil boʻlsa, u toʻliq tezlikda aylanadi. Tezlikni boshqarish uchun ikkala jumperni olib tashlang va ENA hamda ENB ni Unoning PWM pinlariga ulang. Simulyatorda ENA dan Uno piniga sim ulangan boʻlsa, bu jumper olib tashlangan degani.

Rostlik jadvali

A motori uchun:

ENA IN1 IN2 Motor
HIGH HIGH LOW oldinga aylanadi
HIGH LOW HIGH orqaga aylanadi
HIGH HIGH HIGH tormozlanadi
HIGH LOW LOW tormozlanadi
LOW istalgan istalgan erkin aylanadi (inersiya bilan)

B motori ham ENB, IN3 va IN4 bilan xuddi shunday ishlaydi. Bu yerda «oldinga» deganda OUT1 + va OUT2 - boʻlganda motor aylanadigan yoʻnalish tushuniladi. Robot qaysi tomonga yurishi motor qanday oʻrnatilganiga ham bogʻliq.

PWM bilan tezlikni boshqarish

PWM: analogWrite 64, 128 va 191 pinni vaqtning 25%, 50% va 75% qismida yoqadi, motor esa tezroq aylanadi.

analogWrite(ENA, value) ENA ni soniyasiga taxminan 980 marta yoqib-oʻchiradi. 0 dan 255 gacha boʻlgan qiymat motor quvvat oladigan vaqt ulushini belgilaydi. Motor va gʻildirak bunday tez impulslarga ergasha olmaydi: ular buning uchun juda ogʻir. Ular oʻrtacha qiymatga javob beradi:

analogWrite(ENA, ...) Yoqilgan vaqt ulushi Motordagi oʻrtacha kuchlanish
255 100 % taxminan 4,2 V
200 78 % taxminan 3,3 V
128 50 % taxminan 2,1 V
0 0 % yoʻq: motor erkin aylanadi

Kichik qiymatlarda motor faqat gʻuvillaydi, lekin aylanmaydi. Oʻrtacha kuchlanish reduktordagi ishqalanishni yengishga yetmaydi. Bu chegara qayerda ekani motorga, batareyalarga va polga bogʻliq. Shu sababli Masofa saqlovchi robot sketchi hech qachon 90 dan sekinroq yurmaydi.

Voltlar qayerga ketadi

L298N da kalit vazifasini bipolyar tranzistorlar bajaradi. Motor toki doim ulardan ikkitasi orqali oʻtadi: biri H harfining yuqori qismida, ikkinchisi pastki qismida. Ikkalasi birgalikda taxminan 1,8 V ni oladi. Shuning uchun 6 V li batareyadan motorlarga atigi taxminan 4,2 V yetib boradi. Simulyator ham xuddi shu raqamlardan foydalanadi.

TT motorlar 3–6 V ga moʻljallangan, shuning uchun 4,2 V bilan ham ishlaydi. Lekin bunda robot toʻliq 6 V dagiga qaraganda sekinroq yuradi.

Robot qanchalik tez yuradi? 65 mm li gʻildirak bir marta aylanganda robot π × 65 mm, yaʼni taxminan 20 sm siljiydi. Demak, daqiqasiga 150 marta aylanadigan gʻildirak robotni daqiqasiga taxminan 30 m, yaʼni 0,5 m/s tezlikda yurgizadi.

Unoni L298N dan quvvatlantirish

Robotda bor-yoʻgʻi bitta batareya bor. L298N ning oʻz 5 V stabilizatori Unoni ham quvvatlantiradi: uning +5V klemmasi Unoning 5V piniga ulanadi.

Toʻliq 5 V berishi uchun stabilizatorning kirishiga taxminan 7 V kerak. Toʻrtta AA batareyadan u taxminan 4,4 V beradi. Bu biroz past, lekin Uno ishlashi uchun yetarli.

L298N ning +5V chiqishini VIN ga ham ulamang. VIN Unoning oʻz stabilizatoriga boradi, unga esa 7–12 V kerak. Kirishida taxminan 4,4 V boʻlsa, mikrosxemaga ishlash uchun juda kam kuchlanish yetib boradi. Simulyator ikkala xatoni ham tekshiradi.

Umumiy yer (GND)

Kuchlanish doim ikki nuqta orasida oʻlchanadi. Uno D4 ni HIGH qilganda, D4 Unoning GND piniga nisbatan bir necha volt yuqori boʻladi. L298N buni faqat xuddi shu GND ga nisbatan oʻlchagandagina seza oladi. Shuning uchun L298N ning GND klemmasi Unoning GND pinlaridan biriga ulanadi. Robot-mashinada bu sim Unoning taʼminot tokini ham batareyaga qaytaradi. Bu sim boʻlmasa, simulyator umumiy yer yoʻqligi haqida xabar beradi.

Nega oʻng motorning simlari almashtirilgan

Ikkala motor bir xil, lekin oʻng motor teskari burilgan holda, chap motorning koʻzgudagi aksi kabi oʻrnatilgan. Ulanish bir xil boʻlsa, oʻsha «oldinga» signali oʻng gʻildirakni orqaga aylantirardi va robot joyida aylanib qolardi. Shuning uchun oʻng motorning simlari ataylab almashtirilgan: M+ OUT4 ga, M- esa OUT3 ga ulanadi. Endi bir xil signal berilganda ikkala gʻildirak ham oldinga aylanadi. Tuzatish ulanishda qilingan, shuning uchun kod ikkala motorni bir xilda boshqara oladi.

Ulanish

Mana shu sahifadagi robotning toʻliq ulanishi.

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
Dars uchun detallar

MotorTest sketchi

MotorTest.ino
// Motor test: both motors speed up, slow down, then the same backwards.
// L298N: ENA -> D5, IN1 -> D4, IN2 -> D7 (left), ENB -> D6, IN3 -> D8, IN4 -> D12 (right)

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

// 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);        // IN1 high, IN2 low: forwards
  digitalWrite(inB, speed < 0);        // IN1 low, IN2 high: backwards
  analogWrite(enablePin, abs(speed));  // PWM on ENA: how fast
}

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

void ramp(int direction) {
  for (int s = 0; s <= 255; s += 5) {
    drive(direction * s, direction * s);
    delay(30);
  }
  for (int s = 255; s >= 0; s -= 5) {
    drive(direction * s, direction * s);
    delay(30);
  }
}

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

void loop() {
  ramp(1);       // forwards
  delay(500);
  ramp(-1);      // backwards
  delay(500);
}

ramp(1) ikkala motorning tezligini 0 dan 255 gacha 5 birlik qadam bilan oshiradi, har 30 ms da bitta qadam. Keyin tezlikni yana 0 gacha kamaytiradi. Oshishda ham, kamayishda ham 52 tadan qadam boʻladi: taxminan 1,6 soniya oshish va 1,6 soniya kamayish. Yarim soniyalik tanaffusdan keyin ramp(-1) xuddi shuni orqaga yurishda takrorlaydi. loop() ning bitta toʻliq aylanishi taxminan 7 soniya davom etadi. setup() massiv boʻylab oʻtadigan qisqa for sikli yordamida oltita boshqaruv pinini chiqishga aylantiradi.

setMotor() qatorma-qator

Bu saytdagi motorlarni boshqaradigan har bir sketch bir xil ikkita funksiyadan foydalanadi. Mana birinchisi:

void setMotor(byte enablePin, byte inA, byte inB, int speed) {
  speed = constrain(speed, -255, 255);
  digitalWrite(inA, speed > 0);        // IN1 high, IN2 low: forwards
  digitalWrite(inB, speed < 0);        // IN1 low, IN2 high: backwards
  analogWrite(enablePin, abs(speed));  // PWM on ENA: how fast
}
  • 1-qator. Funksiya bitta motorning uchta pinini va -255 (orqaga toʻliq tezlikda) dan 255 (oldinga toʻliq tezlikda) gacha boʻlgan tezlikni qabul qiladi.
  • 2-qator. constrain() tezlikni shu oraliqda ushlab turadi. 300 tezlik 255 ga aylanadi.
  • 3-qator. speed > 0 — taqqoslash, shuning uchun uning natijasi true yoki false boʻladi. true HIGH, false esa LOW hisoblanadi. Demak, IN1 faqat tezlik musbat boʻlganda HIGH boʻladi.
  • 4-qator. Xuddi shunday, IN2 faqat tezlik manfiy boʻlganda HIGH boʻladi.
  • 5-qator. abs() minus ishorasini olib tashlaydi: -160 soni 160 ga aylanadi. Bu qiymat ENA dagi PWM ga beriladi va motor qanchalik tez aylanishini belgilaydi.

Chap motor uchun uchta misol:

Chaqiruv IN1 IN2 ENA Motor
setMotor(ENA, IN1, IN2, 200) HIGH LOW PWM 200 oldinga, tez
setMotor(ENA, IN1, IN2, -160) LOW HIGH PWM 160 orqaga, sekinroq
setMotor(ENA, IN1, IN2, 0) LOW LOW doim LOW erkin aylanadi

0 tezlikda motor erkin aylanadi, chunki ENA LOW boʻladi. Motor tormozlanmaydi.

Ikkinchi funksiya — drive(left, right). U setMotor() ni ikki marta chaqiradi: chap motor uchun ENA, IN1 va IN2 bilan, oʻng motor uchun esa ENB, IN3 va IN4 bilan. drive(200, 200) robotni toʻgʻri oldinga yurgizadi, drive(-160, -160) orqaga yurgizadi, drive(170, -170) esa uni joyida oʻngga aylantiradi.

Simulyatorda sinab koʻring

Robotni arenada ishga tushiring. U sekin oldinga yuradi, tezlashadi, sekinlashadi va toʻxtaydi. Yarim soniyadan keyin xuddi shuni orqaga qarab takrorlaydi. Motorlarning jonli koʻrsatkichi tezlik oshganda koʻtariladi, kamayganda pasayadi. Har safar tezlik noldan oshishni boshlaganda gʻildiraklar hali aylanmaydi, chunki kuchlanish hali juda past.

Keyingi Birinchi yurish loyihasida xuddi shu drive() funksiyasi robotni kvadrat boʻylab yurgizadi.

Oʻzingizni tekshiring

1Nega Arduino pini TT motorni toʻgʻridan-toʻgʻri aylantira olmaydi?

Pin xavfsiz holatda 20 mA beradi, motorga esa yurganda taxminan 0,3 A, toʻsilib qolganda 1 A gacha tok kerak. Bundan tashqari, oʻchirilgan motor hosil qiladigan kuchlanish sakrashi pinni shikastlashi mumkin.

2ENA HIGH, IN1 va IN2 esa ikkalasi ham LOW. Motor nima qiladi?

Motor tormozlanadi. Uning ikkala simi GND ga ulanadi, shuning uchun motor tez toʻxtaydi.

3Nega 6 V li batareyadan motorlarga atigi taxminan 4,2 V yetib boradi?

L298N ning bipolyar tranzistorlari koʻprik ichida taxminan 1,8 V ni yoʻqotadi.

Topshiriq

Simulyatorda oʻng motorni chap motor bilan bir xil ulang: M+ ni OUT3 ga, M- ni OUT4 ga. MotorTest sketchini arenada ishga tushiring va robot nima qilishini kuzating. Keyin simlarga tegmasdan, sketchning bitta qatorini oʻzgartirib, robotni yana toʻgʻri yuradigan qiling.

Maslahat

Motor qaysi tomonga aylanishi faqat uning ikkita IN pinidan qaysi biri HIGH ekaniga bogʻliq.