Përmbajtje:
2025 Autor: John Day | [email protected]. E modifikuara e fundit: 2025-01-13 06:58
Ky projekt është një robot lundrues në mënyrë autonome që përpiqet të arrijë pozicionin e tij të synuar duke shmangur pengesat në rrugën e tij. Roboti do të jetë i pajisur me një sensor LiDAR që do të përdoret për të zbuluar objektet në rrethinën e tij. Ndërsa objektet zbulohen dhe roboti lëviz, një hartë në kohë reale do të përditësohet. Harta do të përdoret për të ruajtur vendet e pengesave që janë identifikuar. Në këtë mënyrë, roboti nuk do të riprovojë një rrugë të dështuar drejt pozicionit të synimit. Në vend të kësaj do të përpiqet për shtigje që ose nuk kanë pengesa ose shtigje që ende nuk janë kontrolluar për pengesa.
Roboti do të lëvizë nga dy rrota me motor DC dhe dy rrota rrotulluese. Motorët do të ngjiten në pjesën e poshtme të një platforme rrethore. Motorët do të kontrollohen nga dy drejtues motorësh. Drejtuesit e motorëve do të marrin komanda PWM nga Procesori Zynq. Koduesit në secilin motor të gjithë përdoren për të mbajtur gjurmët e pozicionit dhe orientimit të automjeteve. I gjithë sistemi do të mundësohet nga një bateri LiPo.
Hapi 1: Montimi i automjetit
Roboti fuqizohet nga dy motorë të lidhur në rrotat anësore dhe më pas mbështetet shtesë nga dy rrota rrotulluese, një në pjesën e përparme dhe një në pjesën e pasme. Platforma dhe montimet e motorit janë bërë prej fletë metalike prej alumini. Një qendër motorike u ble për të bashkuar rrotat në motor. Sidoqoftë, duhej bërë një bashkues i ndërmjetëm me porosi sepse modeli i vrimës së shpërndarësit ishte i ndryshëm nga modeli i vrimës së rrotës.
Motori i zgjedhur ishte një motor Port Escap 12V DC me kodues të integruar. Ky motor mund të blihet në ebay për një çmim shumë të arsyeshëm (shiko Faturën e Materialeve). Kërkoni fjalë kyçe “12V Escap 16 Motor DC me ingranazhe me bërthamë me kodues” në ebay për të gjetur motorin. Zakonisht ka një sasi të drejtë shitësish për të zgjedhur. Karakteristikat dhe përcaktimet e motorëve tregohen në diagramet më poshtë.
Montimi i robotit filloi me një modelim CAD të shasisë. Modeli më poshtë tregon pamjen e sipërme të profilit të formës 2D të krijuar për shasinë.
Sugjerohet që shasia të projektohet si një 2Dprofile në mënyrë që të mund të prodhohet lehtë. Ne kemi prerë një fletë alumini 12 "X12" në formën e shasisë duke përdorur një prestar të ujit. Platforma e shasisë gjithashtu mund të pritet me një sharrë brezi.
Hapi 2: Montimi i motorëve
Hapi tjetër është të bëni montimet e motorit. Sugjerohet që montuesit e motorit të jenë prej alumini prej fletë metalike 90 gradë. Duke përdorur këtë pjesë, motori mund të fiksohet në një faqe të fletës metalike duke përdorur të dyja
Vrimat M2 të motorit dhe fytyrës tjetër mund të fiksohen në platformë. Vrimat duhet të shpohen në bazën e motorit në mënyrë që vidat të mund të përdoren për të fiksuar motorin në bazën e motorit dhe motorin mbi platformën. Montimi i motorit mund të shihet në figurën e mësipërme.
Tjetra, Qendra Motor Pololu (shiko Faturën e Materialeve) vendoset në boshtin e motorit dhe shtrëngohet me vidën e vendosur të siguruar dhe çelësin Allen. Modeli i vrimave të shpërndarësit të motorit Pololu nuk përputhet me modelin e vrimës së rrotës VEX, kështu që duhet të bëhet një bashkues i ndërmjetëm me porosi. Sugjerohet që alumini i mbeturinave të përdorura për të bërë platformën e shasisë të përdoret për të bërë bashkuesin. Modeli i vrimës dhe dimensionet e këtij çifti janë treguar në figurën më poshtë. Diametri dhe forma e jashtme (nuk ka nevojë të jetë një rreth) e bashkuesit të zakonshëm të aluminit nuk ka rëndësi për aq kohë sa të gjitha vrimat përshtaten në pjesë.
Hapi 3: Krijimi i Vivado Block Design
- Filloni duke krijuar një projekt të ri Vivado dhe zgjidhni Zybo Zynq 7000 Z010 si pajisjen e synuar.
- Tjetra klikoni mbi krijimin e dizajnit të ri të bllokut dhe shtoni IP Zynq. Klikoni dy herë në IP Zynq dhe importoni cilësimet e ofruara XPS për Zynq. Pastaj aktivizoni UART0 me MIO 10..11 nën skedën e konfigurimeve të MIO, dhe gjithashtu sigurohuni që Kohëmatësi 0 dhe kohëmatësi Watchdog të jenë aktivizuar.
- Shtoni dy AXI GPIOS në dizajnin e bllokut. Për GPIO 0 aktivizoni kanal të dyfishtë dhe vendosni të dy në të gjitha daljet. Vendosni gjerësinë GPIO për kanalin 1 deri në 4 bit dhe për kanalin 2 deri në 12 bit, këto kanale do të përdoren për të vendosur drejtimin e motorit dhe për të dërguar sasinë e rriqrave të masave të koduesit në procesor. Për GPIO 1 vendosni vetëm një kanal në të gjitha hyrjet me një gjerësi kanali 4 bit. Kjo do të përdoret për të marrë të dhëna nga koduesit. Bëni të gjitha portet GPIO të jashtme.
- Tjetra Shtoni dy kohëmatës AXI. Bëni portat pwm0 në të dy kohëmatësit të jashtëm. Këto do të jenë pwms që kontrollojnë shpejtësinë me të cilën rrotullohen motorët.
- Së fundi Drejtoni automatizimin e bllokut dhe automatizimin e lidhjes. Verifikoni që dizajni i bllokut që keni përputhet me atë të dhënë.
Hapi 4: Komunikimi me LiDAR
Ky LiDAR përdor një protokoll SCIP 2.0 për të komunikuar përmes UART, skedari i bashkangjitur përshkruan të gjithë protokollin.
Për të komunikuar me LiDAR do të përdorim UART0. LiDAR kthen 682 pika të dhënash secila që përfaqëson distancën nga një objekt në atë kënd. LiDAR skanon në drejtim të akrepave të orës nga -30 gradë në 210 gradë me një hap prej 0.351 gradë.
- I gjithë komunikimi me LiDAR bëhet me karaktere ASCI, referojuni protokollit SCIP për formatin e përdorur. Fillojmë duke dërguar komandën QT për të aktivizuar LiDAR. Ne pastaj dërgojmë komandën GS disa herë duke kërkuar 18 pika të dhënash njëherësh në ft në UARTS 64 byte FIFO. Të dhënat e kthyera nga LiDAR analizohen dhe ruhen në grupin global SCANdata.
- Çdo pikë e të dhënave e ruajtur është 2 bajt të dhëna të koduara. Kalimi i këtyre të dhënave në dekodues do të kthejë një distancë në milimetra.
Në skedarin main_av.c do të gjeni funksionet e mëposhtme për të komunikuar me LiDAR
sendLIDARcmd (komanda)
- Kjo do të dërgojë vargun hyrës në LiDAR përmes UART0
recvLIDARdata ()
- Kjo do të marrë të dhëna pasi një komandë të jetë dërguar në LiDAR dhe të ruajë të dhënat në RECBuffer
requestDistanceData ()
- Ky funksion do të dërgojë një seri komandash për të tërhequr të gjitha 682 pikat e të dhënave. Pasi të merret secili grup prej 18 pikash të dhënash, parseLIDARinput () thirret për të analizuar të dhënat dhe për të ruajtur gradualisht pikat e të dhënave në SCANdata.
Hapi 5: Popullimi i Rrjetit me Pengesa
GRID që ruhet është një grup 2D me secilën vlerë të indeksit që përfaqëson një vendndodhje. Të dhënat e ruajtura në secilin indeks janë ose 0 ose 1, Asnjë pengesë dhe pengesë respektivisht. Distanca katrore në milimetra që përfaqëson secili indeks mund të ndryshohet me përkufizimin GRID_SCALE në skedarin automjet.h. Madhësia e grupit 2D gjithashtu mund të ndryshojë për të lejuar që automjeti të skanojë një zonë më të madhe duke modifikuar përkufizimin GRID_SIZE.
Pasi skanohet një grup i ri i të dhënave në distancë nga LiDAR quhet updateGrid (). Kjo do të përsëritet përmes çdo pike të dhënash të ruajtur në grupin SCANdata për të përcaktuar se cilët indekse në rrjet kanë pengesa. Duke përdorur orientimin aktual të automjetit, ne mund të përcaktojmë këndin që korrespondon me secilën pikë të të dhënave. Për të përcaktuar se ku është një pengesë, atëherë thjesht shumëzoni distancën përkatëse me cos/sin të këndit. Shtimi i këtyre dy vlerave në pozicionin aktual x dhe y të automjeteve do të kthejë indeksin në rrjetin e pengesës. Ndarja e distancës së kthyer nga ky operacion nga GRID_SCALE do të na lejojë të ndryshojmë sa e madhe është distanca katrore e çdo indeksi.
Fotografitë e mësipërme tregojnë mjedisin aktual të automjeteve dhe Rrjetin që rezulton.
Hapi 6: Komunikimi me Motorët
Për të komunikuar me motorët fillojmë duke inicializuar GPIO -të për të kontrolluar drejtimin e motorit që rrotullohet. Pastaj shkrimi direkt në adresën bazë të PWM -ve në Kohëmatësin AXI na lejon të vendosim gjëra të tilla si periudha dhe cikli i punës që kontrollojnë drejtpërdrejt shpejtësia me të cilën rrotullohet motori.
Hapi 7: Planifikimi i rrugës
Të zbatohet në të ardhmen e afërt.
Duke përdorur rrjetin dhe funksionalitetin motorik të përshkruar më parë, është shumë e lehtë të zbatohen algoritme të tilla si A*. Ndërsa automjeti lëviz, ai do të vazhdojë të skanojë zonën përreth dhe të përcaktojë nëse rruga në të cilën është ende e vlefshme