PRJ-05Oʻrta90 daqiqa9 ta detalSimulyatorda bor

Chiziq boʻylab yuruvchi robot

Mashina old qismi ostidagi ikkita IQ chiziq datchigi bilan oq poldagi qora chiziq boʻylab yuradi. Datchiklar qorani oqdan qanday ajratishini va toʻrtta vaziyat robotni qanday burishini oʻrganing.

Robot nima qiladi

Robot oq poldagi kengligi taxminan 2 sm boʻlgan qora chiziq boʻylab yuradi va ikkala datchik qorani koʻrgan joyda toʻxtaydi.

VideoYouTubeʼda

Chiziq boʻylab yuruvchi robot oq poldagi qora chiziq boʻylab oʻzi yuradi va burilishlardan ham oʻtadi. Mashina old qismining ostidagi ikkita infraqizil chiziq datchigi polga qaraydi: chiziqning har ikki tomonida bittadan. Chiziq bitta datchik ostiga siljisa, robot oʻsha tomonga buriladi. IQ datchik qorani oqdan qanday ajratishini, uning komparatori qanday qilib aniq HIGH yoki LOW signal hosil qilishini va toʻrtta oddiy vaziyat robotni qanday boshqarishini oʻrganasiz. Bu oʻrta darajadagi loyiha, u taxminan 90 daqiqa vaqt oladi.

Nima kerak

Ushbu loyiha uchun detallar

Bu Birinchi yurish loyihasidagi mashina: HC-SR04 datchigisiz, lekin ikkita IQ chiziq datchigi moduli bilan. Marketdagi «Chiziq boʻylab yurish» qoʻshimchasini koʻring. Trassa uchun oq sirt va kengligi taxminan 2 sm boʻlgan qora lenta kerak, masalan, qora izolyatsiya lentasi. Katta oq karton varagʻi yoki silliq, och rangli pol yaxshi mos keladi. Datchiklarni sozlash uchun kichik otvyortka ham kerak boʻladi.

Qanday ishlaydi

Datchik chiziqni qanday koʻradi

Har bir modulda yonma-yon joylashgan infraqizil (IQ) svetodiod va IQ qabul qilgich bor, ikkalasi ham pastga qaraydi. Svetodiod polga infraqizil nur sochadi. Siz bu nurni koʻra olmaysiz, qabul qilgich esa koʻra oladi. Oq pol nurning koʻp qismini qabul qilgichga qaytaradi. Qora chiziq esa uning koʻp qismini yutadi, shuning uchun kam nur qaytadi.

Qabul qilgich nurni kuchlanishga aylantiradi, bu kuchlanish qancha nur qaytganiga bogʻliq. Moduldagi komparator mikrosxemasi (koʻpincha LM393) bu kuchlanishni chegara qiymat bilan solishtiradi. Bu chegarani moduldagi kichik potensiometr belgilaydi. Natijada OUT pinida aniq raqamli signal hosil boʻladi:

Datchik ostida Qaytgan IQ nur OUT
Oq pol koʻp LOW
Qora chiziq kam HIGH

Potensiometrni burasangiz, OUT oʻzgaradigan nuqta siljiydi. Datchikni polingizga, chizigʻingizga va datchik balandligiga shu tarzda moslaysiz. Koʻpchilik modullarda OUT holatini koʻrsatadigan kichik svetodiod ham bor, shuning uchun ularni kompyutersiz sozlash mumkin.

Datchiklar qayerga oʻrnatiladi

Ikkala datchik mashina old qismining ostida, poldan taxminan 5 mm balandlikda (TCRT5000 polni taxminan 0,2 mm dan 15 mm gacha masofadan koʻradi), chiziqning har ikki tomonida bittadan turadi. Ular orasidagi masofa chiziq kengligidan biroz kattaroq. Shuning uchun robot chiziqning qoq oʻrtasida turganda ikkala datchik ham oqni koʻradi. Chap va oʻng deganda robotning oʻz chapi va oʻngi, yaʼni unga orqa tomondan qaraganingizdagi chap va oʻng tushuniladi. Chap datchikning OUT pini D2 ga, oʻng datchikning OUT pini esa D3 ga ulanadi.

Toʻrtta vaziyat

Chap (D2) Oʻng (D3) Nimani bildiradi Motorlar Robot
LOW: oq LOW: oq chiziq datchiklar orasida drive(170, 170) toʻgʻri yuradi
HIGH: qora LOW: oq chiziq chapga siljigan drive(-70, 170) chapga buriladi
LOW: oq HIGH: qora chiziq oʻngga siljigan drive(170, -70) oʻngga buriladi
HIGH: qora HIGH: qora koʻndalang chiziq yoki trassa oxiri drive(0, 0) toʻxtaydi

Nega qorani koʻrgan datchik tomonga burilish kerak? Chiziq chap datchik ostida boʻlsa, demak, robot chiziqdan oʻngga surilib ketgan yoki chiziq chapga burilgan. Chapga burilish chiziqni yana datchiklar orasiga qaytaradi. Burilishda tashqi gʻildirak 170 tezlik bilan oldinga, ichki gʻildirak esa 70 tezlik bilan sekin orqaga aylanadi. Shuning uchun robot keskin buriladi.

loop() ichida delay() yoʻq. U ikkala datchikni soniyasiga minglab marta oʻqiydi, shuning uchun robot chiziq siljishi bilanoq javob beradi.

Yigʻish

1. Mashinadan boshlang

Oʻyinda boshidanoq bor boʻlgan Obstacle avoider mashinasidan yoki «Birinchi yurish» loyihasidagi mashinangizdan boshlang. «Yigʻish» boʻlimida HC-SR04 ni olib tashlang va ikkita IQ chiziq datchigi modulini qoʻshing; keyingi qadamlar ularni qayerga qoʻyish va qanday ulashni koʻrsatadi. Soʻng LineFollower sketchini «Kod» boʻlimiga qoʻying va «Yuklash» tugmasini bosing. «Chiziq yoʻli A» trassasida robot toʻgʻridan-toʻgʻri chiziq ustidan yoʻlga chiqadi.

Haqiqiy yigʻishda: «Birinchi yurish» loyihasidagi mashinangizdan foydalaning. Bu robotga HC-SR04 kerak emas.

2. Datchiklarni oʻrnating

Ikkala modulni mashina old qismining ostiga, datchiklari pastga qaragan holda, poldan taxminan 5 mm balandlikda mahkamlang.

Haqiqiy yigʻishda: pastki plastina (qavat) poldan taxminan 4 sm balandlikda, shuning uchun modullarni taxminan 5 mm gacha tushirish uchun tirgaklar yoki kichik kronshteyn kerak. Ikki datchik orasidagi masofani chiziq kengligidan biroz kattaroq qiling: 2 sm li chiziq uchun taxminan 3–4 sm. Simulyatordagi mashinada datchiklar orasidagi masofa 3,6 sm: sharli tayanchning har ikki tomonida bittadan. Ular bir-biriga juda yaqin boʻlsa, toʻgʻri qismlarda ikkalasi ham qorani koʻradi. Juda uzoq boʻlsa, datchiklardan biri chiziqni koʻrgunicha robot chiziqdan ancha chetlashib ketadi.

3. Datchiklarni 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
Chap chiziq datchigi VCCL298N +5VDatchik uchun 5 V
Chap chiziq datchigi GNDUno GNDYer (GND)
Chap chiziq datchigi OUTUno D2Oq ustida LOW, qora chiziq ustida HIGH
Oʻng chiziq datchigi VCCUno 3V3+5V klemmasida allaqachon ikkita sim bor; modulga 3,3 V yetarli
Oʻng chiziq datchigi GNDUno GNDYer (GND)
Oʻng chiziq datchigi OUTUno D3Chap datchikdagidek

Har bir modulda uchta pin bor: VCC 5 V ga (yoki 3,3 V ga), GND GND ga, OUT esa Unoga ulanadi. Chap OUT D2 ga, oʻng OUT esa D3 ga ulanadi. Motorlarning ulanishi «Birinchi yurish» loyihasidagidek qoladi.

Haqiqiy yigʻishda: baʼzi modullarda OUT pini DO deb belgilangan. Modulingizda AO pini ham boʻlsa, uni boʻsh qoldiring, chunki bu loyihada faqat raqamli chiqish ishlatiladi. Har bir datchik qaysi 5 V va GND nuqtasiga ulanishini ulanish jadvali koʻrsatadi: L298N ning +5V klemmasida allaqachon ikkita sim bor, shuning uchun oʻng datchik Unoning 3.3V pinidan quvvat oladi. Modul 3,3 V dan 5 V gacha ishlaydi.

4. Trassa yasang

Oq sirtga kengligi taxminan 2 sm boʻlgan qora lenta yopishtiring. Katta ovaldan boshlang, chunki silliq burilishlar keskin burchaklardan osonroq. Lentani tekis qilib bosing: unda burishiq yoki uzilish qolmasin. Robot toʻxtashi kerak boʻlgan joyga qisqa koʻndalang chiziq qoʻshing.

5. Datchiklarni sozlang

Haqiqiy yigʻishda: gʻildiraklar aylanib ketmasligi uchun batareyalarni chiqarib oling. USB kabelni ulang: endi Uno va datchiklar kompyuterdan quvvat oladi. Mashinani trassaga qoʻying va datchiklarni birma-bir sozlang:

  1. Datchikni oq pol ustiga qoʻying va uning svetodiodiga qarang.
  2. Mashinani datchik qora chiziq ustida boʻladigan qilib suring. Svetodiodning holati oʻzgarishi kerak.
  3. Oʻzgarmasa, potensiometrni otvyortka bilan biroz buring va yana sinab koʻring.
  4. Svetodiod har safar oʻzgaradigan boʻlguncha trassaning bir necha joyida sinab koʻring.

6. Yuklang va ishga tushiring

Sketchni yuklang. Keyin USB kabelni uzing, mashinani qoʻlda ushlab turgan holda batareyalarni soling va uni chiziq ikki datchik orasida qoladigan qilib trassaga qoʻying. Robot darhol yura boshlaydi. Birinchi burilishni kuzating. Robot undan chiqmay oʻtsa, keskinroq burilishni sinab koʻring. Chiziqdan chiqib ketsa, quyidagi maslahatlarga qarang.

Kod

LineFollower.ino
// Line follower: two IR sensors look down at the floor, one each side of a black line.
// Each sensor's OUT is LOW over the white floor and HIGH over the black line.
// L298N: ENA -> D5, IN1 -> D4, IN2 -> D7 (left), ENB -> D6, IN3 -> D8, IN4 -> D12 (right)
// IR sensors: left OUT -> D2, right OUT -> D3

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

const int FAST = 170;          // speed on a straight line
const int SLOW = 70;           // the inner wheel in a turn, driven backwards

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);
  pinMode(LEFT_EYE, INPUT);
  pinMode(RIGHT_EYE, INPUT);
}

void loop() {
  bool leftOnLine = digitalRead(LEFT_EYE) == HIGH;
  bool rightOnLine = digitalRead(RIGHT_EYE) == HIGH;

  if (!leftOnLine && !rightOnLine) {
    drive(FAST, FAST);           // the line is between the sensors: straight on
  } else if (leftOnLine && !rightOnLine) {
    drive(-SLOW, FAST);          // the line went left: turn left
  } else if (!leftOnLine && rightOnLine) {
    drive(FAST, -SLOW);          // the line went right: turn right
  } else {
    drive(0, 0);                 // both see black: a cross line or the end, stop
  }
}

Pinlar va tezliklar

const byte LEFT_EYE = 2, RIGHT_EYE = 3;

const int FAST = 170;          // speed on a straight line
const int SLOW = 70;           // the inner wheel in a turn, driven backwards

Sketch datchiklarni «koʻzlar» (eyes) deb ataydi. FAST toʻgʻri chiziqdagi tezlik. SLOW burilishda orqaga aylanadigan ichki gʻildirakning tezligi.

setup()

Har bir mashina sketchidagidek oltita motor pini chiqishga aylanadi. Ikkita datchik pini pinMode(LEFT_EYE, INPUT) va pinMode(RIGHT_EYE, INPUT) bilan kirishga aylanadi. Modullar OUT ni oʻzlari HIGH yoki LOW qiladi, shuning uchun pull-up rezistori kerak emas.

Datchiklarni oʻqish

  bool leftOnLine = digitalRead(LEFT_EYE) == HIGH;
  bool rightOnLine = digitalRead(RIGHT_EYE) == HIGH;

digitalRead() HIGH yoki LOW beradi. Uni HIGH bilan solishtirish bool qiymat beradi: true (rost) yoki false (yolgʻon). Demak, chap datchik qorani koʻrganda leftOnLine true boʻladi. Bunday yaxshi nomlar loop() ning qolgan qismini oʻqishni osonlashtiradi.

Toʻrtta vaziyat

  if (!leftOnLine && !rightOnLine) {
    drive(FAST, FAST);           // the line is between the sensors: straight on
  } else if (leftOnLine && !rightOnLine) {
    drive(-SLOW, FAST);          // the line went left: turn left
  } else if (!leftOnLine && rightOnLine) {
    drive(FAST, -SLOW);          // the line went right: turn right
  } else {
    drive(0, 0);                 // both see black: a cross line or the end, stop
  }

! «emas», && esa «va» degani. Toʻrtta tarmoq yuqoridagi jadvalning toʻrtta qatoriga mos keladi. Oxirgisi, else, qolgan yagona vaziyatni ushlaydi: ikkala datchik ham qora ustida. setMotor() va drive() «Birinchi yurish» loyihasidagi bilan bir xil: musbat tezlik gʻildirakni oldinga, manfiy tezlik esa orqaga aylantiradi.

Agar ishlamasa

  • Robot chiziqni kesib oʻtib, toʻgʻri yurib ketyapti. Datchiklar chiziqni koʻrmayapti. Har bir moduldagi svetodiod oq va qora ustida oʻzgarishini tekshiring va potensiometrni sozlang. Balandlikni (taxminan 5 mm, koʻpi bilan 1 sm) tekshiring, OUT pinlari D2 va D3 ga ulanganini ham tekshiring.
  • Robot chiziq tomonga emas, undan teskari tomonga burilyapti. Chap va oʻng datchiklar almashib qolgan. D2 va D3 dagi ikkita OUT simining oʻrnini almashtiring.
  • Robot tez-tez toʻxtab qolyapti. Ikkala datchik ham «qora» deb javob beryapti. Ular chizigʻingiz uchun bir-biriga juda yaqin yoki poldan juda baland boʻlishi mumkin: juda balanddan juda kam nur qaytadi va bu qoradek koʻrinadi. Yoki chegara shunday sozlanganki, oq ham qora deb oʻqiladi. Potensiometrlarni qaytadan sozlang.
  • Keskin burilishlarda robot chiziqdan chiqib ketyapti. U javob berishga ulgurmaydigan darajada tez. FAST ni kamaytiring yoki keskinroq burilishi uchun SLOW ni oshiring.
  • Toʻgʻri qismlarda robot tinmay ilonizi boʻlib yuryapti. Burilishlar juda keskin. SLOW ni biroz kamaytiring yoki FAST ni kamaytiring.
  • Robot bir xonada ishlaydi, boshqasida ishlamaydi. Quyosh nurida va baʼzi lampalar yorugʻida infraqizil nur bor, u datchiklarni koʻr qilib qoʻyishi mumkin. Toʻgʻridan-toʻgʻri quyosh nuri tushmaydigan joyda sinab koʻring va har bir yangi polda potensiometrlarni qaytadan sozlang.
  • Datchik qora chizigʻingizni koʻrmayapti. Baʼzi qora lentalar va siyohlar bizga qora koʻrinsa ham, infraqizil nurni qaytaradi. Yaltiroq lenta ham nurni toʻgʻri orqaga qaytarishi mumkin. Yaltiramaydigan (mat) qora lentani yoki qogʻozga lazerli printerda chop etilgan chiziqni sinab koʻring.
  • Gʻildirak notoʻgʻri tomonga aylanyapti yoki robot qayta ishga tushib qolyapti. Birinchi yurish loyihasidagi va robotlar nega qayta ishga tushib qolishi haqidagi maqoladagi maslahatlarni koʻring.

Keyingi qadamlar

Robotga ikkinchi vazifa bering: HC-SR04 ni joyiga qaytaring va biror narsa chiziqni toʻsib qoʻysa, robot toʻxtasin. Chiziq datchiklari D2 va D3 ni, HC-SR04 esa D9 va D10 ni ishlatadi, shuning uchun pinlar bir-biriga xalaqit bermaydi. loop() ni toʻxtatmasdan qanday oʻlchash mumkinligini toʻsiqni aylanib oʻtuvchi robot koʻrsatadi. millis() va holatlar darsi bir nechta vazifani bitta sketchda birlashtirishga yordam beradi.

Bu robot faqat «chiziq ustida» yoki «chiziqdan tashqarida» ekanini biladi. analogRead() bilan oʻqiladigan analog chiqishli datchiklar robot chiziqdan qancha uzoqda ekanini ham ayta oladi. Shunda P-rostlagich, xuddi masofa saqlovchi robot loyihasidagi kabi, robotni silliq boshqara oladi.

Yanada yaxshilang

  1. Robot trassangizdan chiqmasdan yura oladigan eng katta FAST qiymatini toping, keyin boshqa SLOW qiymatini sinab koʻring.
  2. Robot har safar burilayotganda Unoning D13 pinidagi L svetodiodi yonsin.
  3. Koʻndalang chiziqqa yetganda robot ikki soniya kutsin, keyin uni kesib oʻtib, yana chiziq boʻylab yursin.