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
Arduino Uno R3Simulyatorda bor× 1Narxni doʻkonda koʻring
L298N motor drayveri moduliSimulyatorda bor× 1Narxni doʻkonda koʻring
TT reduktorli motor 1:48, 65 mm gʻildirak bilanSimulyatorda bor× 2Narxni doʻkonda koʻring
4 × AA batareya qutisiSimulyatorda bor× 1Narxni doʻkonda koʻringSharli tayanch 20 mmSimulyatorda bor× 1Narxni doʻkonda koʻring
IQ chiziq datchigi moduliSimulyatorda bor× 2Narxni doʻkonda koʻring
Ulash simlari toʻplami× 1Narxni doʻkonda koʻring
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
| Qayerdan | Qayerga | Nima uchun |
|---|---|---|
| Batareya + | L298N +12V | Motorlar quvvati: toʻrtta AA batareyadan taxminan 6 V |
| Batareya - | L298N GND | Batareya minusi |
| L298N +5V | Uno 5V | Drayver stabilizatori Unoni quvvatlaydi: taxminan 4,4 V |
| L298N GND | Uno GND | Umumiy yer: signallarga bir xil 0 V kerak |
| Uno D5 | L298N ENA | Chap motor tezligi (PWM); ENA jumperi olib qoʻyilgan |
| Uno D4 | L298N IN1 | Chap motor yoʻnalishi |
| Uno D7 | L298N IN2 | Chap motor yoʻnalishi |
| Uno D8 | L298N IN3 | Oʻng motor yoʻnalishi |
| Uno D12 | L298N IN4 | Oʻng motor yoʻnalishi |
| Uno D6 | L298N ENB | Oʻng motor tezligi (PWM); ENB jumperi olib qoʻyilgan |
| Chap motor M+ | L298N OUT1 | |
| Chap motor M- | L298N OUT2 | |
| Oʻng motor M+ | L298N OUT4 | Ataylab almashtirilgan: bu motor koʻzgudagidek oʻrnatilgan |
| Oʻng motor M- | L298N OUT3 | Ataylab almashtirilgan: bu motor koʻzgudagidek oʻrnatilgan |
| Chap chiziq datchigi VCC | L298N +5V | Datchik uchun 5 V |
| Chap chiziq datchigi GND | Uno GND | Yer (GND) |
| Chap chiziq datchigi OUT | Uno D2 | Oq ustida LOW, qora chiziq ustida HIGH |
| Oʻng chiziq datchigi VCC | Uno 3V3 | +5V klemmasida allaqachon ikkita sim bor; modulga 3,3 V yetarli |
| Oʻng chiziq datchigi GND | Uno GND | Yer (GND) |
| Oʻng chiziq datchigi OUT | Uno D3 | Chap 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:
- Datchikni oq pol ustiga qoʻying va uning svetodiodiga qarang.
- Mashinani datchik qora chiziq ustida boʻladigan qilib suring. Svetodiodning holati oʻzgarishi kerak.
- Oʻzgarmasa, potensiometrni otvyortka bilan biroz buring va yana sinab koʻring.
- 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
// 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 backwardsSketch 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
- Robot trassangizdan chiqmasdan yura oladigan eng katta FAST qiymatini toping, keyin boshqa SLOW qiymatini sinab koʻring.
- Robot har safar burilayotganda Unoning D13 pinidagi L svetodiodi yonsin.
- Koʻndalang chiziqqa yetganda robot ikki soniya kutsin, keyin uni kesib oʻtib, yana chiziq boʻylab yursin.
