- Reikalingos medžiagos:
- Kliūčių vengimo roboto samprata:
- Grandinės schema ir paaiškinimas:
- PIC mikrovaldiklio programavimas:
- Veiksmo kliūtis apeinantis robotas:
„Obstacle Avoider Robot“ yra dar vienas garsus robotas, pagardinantis įterptus projektus. Tiems, kurie yra nauji „Obstacle avoider robot“ robotai, tai tik įprastas ratinis robotas, kuris galėtų naršyti savo kelią nepataikydamas į jokias kliūtis. Projekte, kurį ketiname naudoti vieną ultragarso jutiklį (priekį) ir du IR jutiklį (kairėje / dešinėje), galite sukurti daugybę būdų, kaip sukurti „Obstacle avoider“ robotą, kad mūsų robotas turėtų akis visomis trimis kryptimis. Tokiu būdu galite padaryti jį daug protingesnį ir greitesnį, aptikdami objektus iš visų trijų pusių ir atitinkamai manevruodami. Čia mes ieškome PIC mikrovaldiklio PIC16F877A dėl šios kliūties, leidžiančios išvengti roboto.
Kliūčių išvengiančio roboto veikimą galima stebėti iš realaus laiko produkto, vadinamo „namų valymo robotais“. Nors jose naudojama technologija ir jutikliai yra labai sudėtingi, koncepcija išlieka ta pati. Pažiūrėkime, kiek galime nuveikti naudodami įprastus jutiklius ir PIC mikrovaldiklius.
Taip pat patikrinkite kitus mūsų robotus, kurie vengia kliūčių:
- Aviečių Pi pagrindu sukurta kliūtis išvengiant roboto
- Pasidaryk pats išmanusis dulkių valymo robotas, naudojant „Arduino“
Reikalingos medžiagos:
- PIC16F877A
- IR jutiklis (2Nos)
- Ultragarsinis jutiklis (1Nos)
- DC pavaros variklis (2Nos)
- L293D variklio tvarkyklė
- Cheeses (Jūs taip pat galite sukurti savo, naudodamiesi kartonais)
- Maitinimo bankas (bet koks galimas maitinimo šaltinis)
Kliūčių vengimo roboto samprata:
Kliūčių vengimo roboto sąvoka yra labai paprasta. Mes naudojame jutiklius objektų buvimui aplink robotą aptikti ir naudojame šiuos duomenis, kad robotas nesusitrenktų virš tų objektų. Norėdami aptikti objektą, galime naudoti bet kokius naudojimo jutiklius, tokius kaip IR jutiklis ir Ultragarsinis jutiklis.
Savo robote mes naudojome JAV jutiklį kaip priekinį jutiklį ir du IR jutiklius kairėje ir dešinėje. Robotas judės į priekį, kai prieš jį nebus jokio objekto. Taigi robotas judės į priekį, kol ultragarso (JAV) jutiklis aptiks bet kokį objektą.
Kai JAV jutiklis aptinka objektą, laikas pakeisti roboto kryptį. Mes galime pasukti į kairę arba į dešinę, norėdami nuspręsti posūkio kryptį, mes naudojame IR jutiklio pagalbą, kad patikrintume, ar šalia kairės ar dešinės roboto pusės nėra objektų.
Jei priekyje ir dešinėje roboto pusėje aptinkamas prieštaravimas, robotas grįš atgal ir pasuks į kairę. Mes priverčiame robotą tam tikrą atstumą važiuoti atgal, kad sukdamasis jis nesusidurtų su objektu.
Jei priekyje ir kairėje roboto pusėje aptinkamas prieštaravimas, robotas grįš atgal ir pasuks į dešinę.
Jei robotas pasieks kambario kampą, jis pajus visų keturių objektą. Tokiu atveju mes turime vairuoti robotą atgal, kol kuri nors pusė taps laisva.
Kitas galimas atvejis yra tai, kad priekyje bus objektas, tačiau nei kairėje, nei dešinėje pusėje jo gali nebūti, šiuo atveju mes turime atsitiktinai pasukti bet kuria kryptimi.
Tikimės, kad tai būtų apytiksliai supratę, kaip veikia kliūčių vengėjas, dabar eikime su grandinės schema, kad sukurtume šį robotą ir mėgaukimės juo.
Grandinės schema ir paaiškinimas:
Visa šio PIC pagrįsto kliūčių vengiančio roboto grandinės schema parodyta aukščiau pateiktame paveikslėlyje. Kaip matote, mes naudojome du IR jutiklius, kad aptiktume roboto kairėje ir dešinėje esančius objektus, o ultragarso jutiklį - objekto, esančio priešais robotą, atstumui išmatuoti. Mes taip pat naudojome L293D variklio tvarkyklės modulį, kad galėtume valdyti du šiame projekte esančius variklius. Tai tik įprasti ratų nuolatinės srovės varikliai, todėl juos galima lengvai gauti. Ši lentelė padės jums prisijungti.
S.No |
Prisijungta iš |
Prisijungęs prie |
1 |
IR jutiklis Paliktas kaištis |
RD2 (kaištis 21) |
2 |
IR jutiklis |
RD3 (22 kaištis) |
4 |
1 variklio kanalas A kaištis |
RC4 (23 kaištis) |
5 |
1 variklio B kanalo kaištis |
RC5 (kaištis 25) |
6 |
2 variklio kanalo A kaištis |
RC6 (kaištis 26) |
7 |
2 variklio B kanalo kaištis |
RC7 (kaištis 27) |
8 |
JAV trigerio kaištis |
RB1 (34 kaištis) |
9 |
JAV aido kaištis |
RB2 (35 kaištis) |
Variklio vairuotojo modulis, pvz., L293D, yra privalomas, nes PIC mikrovaldiklio įvesties / išvesties kaištis negali gauti srovės, reikalingos nuolatinės pavaros varikliui paleisti. Jutiklius ir modulį maitina + 5 V maitinimas, kurį reguliuoja 7805. Variklio vairuotojo modulis gali būti maitinamas net naudojant + 12 V, tačiau šiam projektui aš ką tik prilipau prie turimo + 5 V.
Mano atveju visą robotą maitina „ Power Bank “. Taip pat galite naudoti bet kokį įprastą maitinimo banką ir praleidę reguliatoriaus skyrių arba naudodami aukščiau pateiktą grandinę ir naudodami bet kokią 9V arba 12V bateriją robotui, kaip parodyta aukščiau esančioje schemoje. Kai jūsų ryšiai bus užmegzti, tai atrodys maždaug taip žemiau
PIC mikrovaldiklio programavimas:
Užprogramuoti savo PIC dirbti „Obstacle avoider“ yra tikrai lengva. Mes tiesiog turime perskaityti šių trijų jutiklių vertę ir atitinkamai vairuoti variklius. Šiame projekte mes naudojame ultragarso jutiklį. Mes jau sužinojome, kaip susieti ultragarsą su PIC mikrovaldikliu, jei čia esate naujas, maloniai grįžkite į šią pamoką, kad suprastumėte, kaip JAV jutiklis veikia su PIC, nes čia praleisiu išsamią informaciją apie tai, kad išvengčiau pasikartojimo.
Visa programa arba šis robotas pateikiami šio puslapio pabaigoje. Toliau paaiškinau svarbius programos gabalus.
Kaip žinome, visos programos prasideda įvesties ir išvesties kaiščių deklaracijomis. Čia keturi variklio vairuotojo modulio kaiščiai ir paleidimo kaiščiai yra išvesties kaiščiai, o įvesties bus aido kaištis ir du IR išvesties kaiščiai. Turėtume inicializuoti „Timer 1“ modulį, kad galėtume jį naudoti su ultragarso jutikliu.
TRISD = 0x00; // PORTD deklaruota kaip sąsajos LCD TRISB1 išvestis = 0; // JAV jutiklio trigerio kaištis siunčiamas kaip išvesties kaištis TRISB2 = 1; // JAV jutiklio aido kaištis nustatytas kaip įvesties kaištis TRISB3 = 0; RB3 yra šviesos diodo TRISD2 išvesties kaištis = 1; TRISD3 = 1; // Abu IR jutiklio kaiščiai deklaruojami kaip įvestis TRISC4 = 0; TRISC5 = 0; // 1 variklio kaiščiai deklaruoti kaip galia TRISC6 = 0; TRISC7 = 0; // 2 variklio kaiščiai, deklaruoti kaip galia T1CON = 0x20;
Šioje programoje mes turėtume gana dažnai tikrinti atstumą tarp jutiklio ir objekto, todėl sukūrėme funkciją pavadinti apskaičiuoti atstumą (), kurios viduje išmatuosime atstumą pagal metodą, aptartą JAV jutiklių sąsajos pamokoje. Kodas parodytas žemiau
void apskaičiuoti atstumą () // funkcija apskaičiuoti atstumą US {TMR1H = 0; TMR1L = 0; // išvalyti laikmačio bitus Trigger = 1; __delay_us (10); Paleidiklis = 0; o (Aidas == 0); TMR1ON = 1; o (Aidas == 1); TMR1ON = 0; paimtas laikas = (TMR1L - (TMR1H << 8)); atstumas = (0,0272 * užimtas laikas) / 2; }
Kitas žingsnis būtų palyginti ultragarso jutiklio ir IR jutiklio reikšmes ir atitinkamai pajudinti robotą. Čia šioje programoje aš naudoju cm reikšmę kaip kritinį atstumą, žemiau kurio robotas turėtų pradėti keisti kryptį. Galite naudoti pageidaujamas vertes. Jei nėra objekto, robotas tiesiog juda į priekį
jei (atstumas> 5) {RC4 = 0; RC5 = 1; // 1 variklis priekyje RC6 = 1; RC7 = 0; // 2 variklis pirmyn}
Jei aptinkamas objektas, atstumas bus mažesnis nei cm. Šiuo atveju atsižvelgsime į kairiojo ir dešiniojo ultragarso jutiklio reikšmes. Pagal šią vertę nusprendžiame pasukti į kairę arba pasukti į dešinę. Naudojamas ms uždelsimas, kad būtų matoma krypties pokytis.
if (RD2 == 0 && RD3 == 1 && atstumas <= 5) // Kairysis jutiklis užblokuotas {back_off (); RC4 = 1; RC5 = 1; // 1 variklio sustabdymas RC6 = 1; RC7 = 0; // 2 variklis į priekį __delay_ms (500); } apskaičiuoti atstumą (); if (RD2 == 1 && RD3 == 0 && atstumas <= 5) // Dešinysis jutiklis užblokuotas {back_off (); RC4 = 0; RC5 = 1; // 1 variklis priekyje RC6 = 1; RC7 = 1; // 2 variklio sustabdymas __delay_ms (500); }
Kartais ultragarso jutiklis aptikdavo objektą, tačiau IR jutiklių neaptikdavo jokio objekto. Tokiu atveju robotas pagal numatytuosius nustatymus pasuka kairėn. Taip pat galite priversti jį pasukti į dešinę arba atsitiktine kryptimi, atsižvelgdami į savo pageidavimus. Jei iš abiejų pusių yra objektų, mes priverčiame jį eiti atgal. Tą patį darantis kodas parodytas žemiau.
apskaičiuoti atstumą (); if (RD2 == 0 && RD3 == 0 && atstumas <= 5) // Abu jutikliai yra atidaryti {back_off (); RC4 = 0; RC5 = 1; // 1 variklis priekyje RC6 = 1; RC7 = 1; // 2 variklio sustabdymas __delay_ms (500); } apskaičiuoti atstumą (); if (RD2 == 1 && RD3 == 1 && atstumas <= 5) // Abu jutikliai užblokuoti {back_off (); RC4 = 1; RC5 = 0; 1 variklis atvirkštinis RC6 = 1; RC7 = 1; // 2 variklio sustabdymas __delay_ms (1000); }
Veiksmo kliūtis apeinantis robotas:
Projekto darbas yra labai įdomus ir įdomus. Kai baigsite savo grandinę ir kodą, tiesiog įjunkite savo „Bot“ ir palikite jį ant žemės. Ji turėtų sugebėti nustatyti kliūtis ir protingai jų išvengti. Bet čia yra įdomi dalis. Galite modifikuoti kodą ir priversti jį atlikti daugiau dalykų, pavyzdžiui, kad išvengtumėte laiptų, paversite jį protingesniu laikydami brangius posūkius, o kas ne?
Šis robotas padės suprasti pagrindinius programavimo būdus ir sužinoti, kaip tikroji aparatūra reaguos į jūsų kodą. Visada smagu programuoti šį robotą ir stebėti, kaip jis elgiasi pagal kodą realiame pasaulyje.
Čia mes naudojome tą pačią PIC perf plokštę, kurią mes padarėme mirksinčiam šviesos diodui naudojant PIC mikrovaldiklį, ir naudojome šią plokštę kituose PIC Tutorial serijos projektuose.
Jūsų robotas turėtų atrodyti panašiai kaip parodyta aukščiau esančiame paveikslėlyje. Visas šio projekto darbas parodytas toliau pateiktame vaizdo įraše.
Tikiuosi, kad supratote projektą ir patiko jį kurti. Jei turite kokių nors abejonių ar užstrigote, galite paskelbti klausimus naudodamiesi komentarų skiltimi. Aš pasistengsiu atsakyti į juos kuo geriau.