Სარჩევი:
- ნაბიჯი 1: აპარატურა
- ნაბიჯი 2: მიჰყევით ხაზს
- ნაბიჯი 3: სანამ ჩვენ ნამდვილად დავიწყებთ…
- ნაბიჯი 4: დასტა
- ნაბიჯი 5: პროგრამული უზრუნველყოფა
- ნაბიჯი 6: მოდით გავაუმჯობესოთ კოდი
ვიდეო: ნაწილი 3: GPIO: ARM ასამბლეა: ხაზის მიმდევარი: TI-RSLK: 6 ნაბიჯი
2024 ავტორი: John Day | [email protected]. ბოლოს შეცვლილი: 2024-01-30 10:17
გამარჯობა ეს არის შემდეგი განვადება, სადაც ჩვენ ვაგრძელებთ ARM ასამბლეის გამოყენებას (უფრო მაღალი დონის ენის ნაცვლად). ამ ინსტრუქციის შთაგონება არის Texas Instruments Robotics System Learning Kit– ის ლაბორატორია 6, ან TI-RSLK.
ჩვენ ვიყენებთ მიკროკონტროლერს ნაკრებიდან, MSP432 LaunchPad განვითარების დაფაზე, მაგრამ ალბათ თქვენ იპოვით რაიმე სასარგებლო ამ ინსტრუქციიდან ამოსვლას მაშინაც კი, თუ თქვენ არ იყენებთ LaunchPad– ს, ან მიჰყევით T. I. სასწავლო გეგმა
ჩვენ დავიწყეთ ARM ასამბლეის ინსტრუქციული დანერგვით, განვითარების გარემო და როგორ შევქმნათ პროექტი.
შემდეგი ინსტრუქცია ARM ასამბლეის შესახებ წარმოადგინა, თუ როგორ უნდა ვიმოქმედოთ შეყვანის/გამომავლის (GPIO) საშუალებით.
შემდეგ ჩვენ გავაფართოვეთ ჩვენი ცოდნა და შემოვიღეთ ფუნქციები, ვაკონტროლებთ LED- ებს და კონცენტრატორებს.
ამ ინსტრუქციის საშუალებით, ჩვენ შეგვიძლია ვისწავლოთ ის რაც ვისწავლეთ უფრო სახალისო და სასარგებლო: ხაზის ამოცნობა.
ეს დაგვეხმარება მოგვიანებით, როდესაც ჩვენ ავაშენებთ ხაზის მიმდევარ რობოტს.
კურიკულუმში პროგრამირების უმეტესობა კეთდება C ან C ++ ენაზე, მაგრამ სასარგებლოა ასამბლეის გაცნობა, სანამ უფრო მაღალი დონის ენებზე და ბიბლიოთეკებზე დავიწყებთ მუშაობას.
ნაბიჯი 1: აპარატურა
არ მინდა ტექნიკის დეტალურად გადახედვა, რადგან უკვე არსებობს წყაროები, მაგრამ საჭიროების შემთხვევაში ჩვენ დავამატებთ განმარტებებს.
ამ ინსტრუქციისთვის, ჩვენ ვიყენებთ ასახვის სენსორის მასივს Pololu– დან, რადგან ის მოდის როგორც TI-RSLK (რობოტის ნაკრები) ნაწილი. ეს არის ის, რაც გამოიყენება კურსში და სასწავლო გეგმის მე –6 ლაბორატორიაში.
თუ ეს არ გაქვთ, შეგიძლიათ გამოიყენოთ ნებისმიერი IR დეტექტორი (ან მათი სერია), რომელიც გამოსცემს ციფრულ სიგნალს, HIGH ან LOW, ყოფნისა და არყოფნისთვის.
მასივის სენსორი საუკეთესოა, რადგან მას შეუძლია გამოავლინოს თუ არა ჩვენ ხაზის ცენტრში, თუ ერთ მხარეს. გარდა ამისა, როგორც მოგვიანებით ვნახავთ, ის დაგვეხმარება რობოტის კუთხის გამოვლენაში ხაზთან მიმართებაში.
ამრეკლ მასივს აქვს დეტექტორები ერთმანეთთან ძალიან ახლოს. ეს ნიშნავს, რომ ჩვენ უნდა მივიღოთ გამოვლენის მრავალი სიგნალი, რა თქმა უნდა, ხაზის სისქეზეა დამოკიდებული.
თუ ასეა, მაშინ თუ რობოტი პირდაპირ ხაზში არ არის, მაშინ მან უნდა დააბრუნოს გამომავალი, რომ ხაზი უფრო ფართოა ვიდრე უნდა იყოს (რადგან ჩვენ კუთხესთან ვართ).
ზემოაღნიშნულის უკეთ ახსნისთვის გადახედეთ Lab 6 დოკუმენტს.
გაყვანილობის / სენსორის დამაკავშირებლად MSP432 LaunchPad განვითარების დაფაზე დახმარებისთვის, აქ არის რამოდენიმე სასარგებლო ინსტრუქცია.
მე ასევე დავამატე იგივე (მსგავსი?) Pdf ინსტრუქციები ამ ნაბიჯს.
თუ ყურადღებით წაიკითხავთ პოლოუს დოკუმენტებს, ისინი განმარტავენ "3.3 ვ შემოვლითი" მიზეზს, რომ თქვენ გსურთ გადახტომა თუ თქვენ იყენებთ 3.3 ვ -ს ნაცვლად 5 ვ.
ვინაიდან ჩვენ ჯერ არ ვაშენებთ რობოტს, არამედ ვსწავლობთ ARM- ის შეკრებაზე და ასევე იმაზე, თუ როგორ უნდა ვიმოქმედოთ რობოტის ნაწილებთან (ქვესისტემებთან), ჩვენ არ გვჭირდება ზემოაღნიშნული მითითებების შესაბამისად.
ჯერჯერობით, ხაზის სენსორული მასივის დაკავშირება უბრალოდ ადუღდება/მცირდება შემდეგამდე:
- დააკავშირეთ 3.3V და GND MSP432 დაფიდან სენსორების მასივთან.
- დააკავშირეთ პორტის პინი (მე ვთავაზობ P5.3) MSP432– დან LED– ს ჩართვის პინზე ხაზის სენსორის მასივში. ის სენსორზე არის 3.3V და GND შორის.
- დააკავშირეთ ერთი პორტის რვა პინი/ბიტი (მე გირჩევთ P7.0– დან P7.7 –მდე) სენსორული მასივის რვა პინთან, რომელსაც ეტიკეტი აქვს „1“- დან „8“–მდე. ეს არის ხაზები, რომლებიც გაივლის მაღლა ან დაბლა, იმისდა მიხედვით, თუ რას გრძნობენ ისინი.
როგორც თქვენ ხედავთ ამ ნაბიჯის სურათებში და ვიდეოში, მე არ დავამატე სენსორი რობოტის შასზე, რადგან მინდოდა პროგრამირების, გამართვის, ტესტირების, სწავლის სიმარტივე.
ასე რომ ყველაფერი დაკავშირებულია, ჩვენ მზად ვართ შევიდეთ პროგრამულ უზრუნველყოფაში.
ნაბიჯი 2: მიჰყევით ხაზს
ამრეკლავი მასივის სენსორი საკმაოდ მიმზიდველია, რადგან მას შეუძლია დაეხმაროს მინიმუმ ორი გზით.
- განსაზღვრეთ არის რობოტი, რომელიც ორიენტირებულია ხაზზე ან გადადის ერთ მხარეს.
- არის თუ არა რობოტი ხაზის მიმართულებით, ან არის კუთხეზე.
მასივის თითოეული დეტექტორი არსებითად გვაწვდის ერთ ინფორმაციას მცირე ან მაღალი.
იდეა არის გაერთიანდეს ყველა ეს ბიტი ერთ რიცხვში ან ერთ ბიტიანი შაბლონი და გამოიყენოს ეს შაბლონი გადაწყვეტილებების მისაღებად (სწორი მოძრაობის მიზნით).
ნაბიჯი 3: სანამ ჩვენ ნამდვილად დავიწყებთ…
.. ჩვენ უნდა ვისწავლოთ რაიმე ახალი ARM ასამბლეის პროგრამირების შესახებ. და მე არ ვგულისხმობ მხოლოდ სხვა ინსტრუქციას. ისინი, როგორც წესი, უმნიშვნელოები არიან.
აქამდე ჩვენ არ გამოვიყენეთ "სტეკი" ჩვენს პროგრამებში.
ჩვენ ვეყრდნობოდით გლობალური პროცესორის ძირითადი რეგისტრატორების უმეტესობის გამოყენებას სხვადასხვა ქვეპროგრამებზე.
ერთადერთი რაც ჩვენ გავაკეთეთ იყო LR (ბმულის რეგისტრაციის) მისამართის შენახვა და აღდგენა ერთი ფუნქციისთვის - ის, რომელმაც რამდენიმე სხვა ფუნქცია გამოიძახა. (აქ მე ვიყენებ "ფუნქციას" და "ქვეგანვითარებას" ურთიერთშემცვლელობით).
ის, რასაც ჩვენ ვაკეთებდით, არ არის კარგი. რა მოხდება, თუ გვსურს სხვა ფუნქციების ჩასმა? რა მოხდება, თუ ბუდეს ერთზე მეტი დონე გვაქვს?
წინა მაგალითებში, ჩვენ ავირჩიეთ გამოვიყენოთ რეგისტრი R6, როგორც საცავი LR ან დასაბრუნებელი მისამართისთვის. მაგრამ თუ ჩვენ გვსურს შემდგომი/უფრო ღრმა ბუდეების გაკეთება, ჩვენ არ შეგვიძლია გავაგრძელოთ R6 მნიშვნელობის შეცვლა. ჩვენ უნდა ავირჩიოთ სხვა რეგისტრაცია. და სხვა. და შემდეგ ხდება დამამძიმებელი, თვალყური ადევნო, რომელი ძირითადი CPU რეგისტრი ფლობს რომელ LR– ს, რომელ ფუნქციას აღადგენს.
ახლა ჩვენ შევხედოთ "დასტის".
ნაბიჯი 4: დასტა
აქ არის რამოდენიმე საკითხავი მასალა, რომელიც განმარტავს სტეკს.
მე რამდენიმე იდეის უფრო დიდი მომხრე ვარ:
- მხოლოდ იმდენი თეორია, რამდენიც საჭიროა, გადადით პრაქტიკულზე სწრაფად
- ისწავლეთ საჭიროებისამებრ, გაამახვილეთ ყურადღება რაღაცის კეთებაზე და არა მხოლოდ უმიზნო ვარჯიშებზე ან მაგალითებზე.
არსებობს უამრავი ARM და MSP432 დოკუმენტაცია ინტერნეტში, რომელიც საუბრობს სტეკზე, ასე რომ არ აპირებთ ამ ყველაფრის გადახედვას. მე ასევე ვაპირებ, რომ სტეკის გამოყენება აქ მინიმუმამდე დავიყვანო - დაბრუნების მისამართის შენახვა (ბმულის რეგისტრაცია).
არსებითად, ჩვენ გვჭირდება მხოლოდ მითითებები:
PUSH {რეგისტრაციის სია}
POP {რეგისტრაციის სია}
ან, ჩვენს შემთხვევაში, კონკრეტულად:
PUSH {LR}
POP {LR}
ასე რომ, ასამბლეის ფუნქცია/ქვეგეგმა ასე გამოიყურება:
funcLabel:.asmfunc
PUSH {LR}; ეს ალბათ უნდა იყოს ერთ -ერთი პირველი ინსტრუქცია შესვლისას.; მეტი კოდი აქ..; ბლა.. ბლა… ბლა…; კარგი, ჩვენ დავასრულეთ ფუნქცია, მზად ვართ დავუბრუნდეთ დარეკვის ფუნქციას POP {LR}; ეს დაუბრუნებს ზარის დაბრუნების სწორ მისამართს; ფუნქცია. BX LR; დაბრუნება.endasmfunc
ვიდეო გადის რამდენიმე ჩადგმული ფუნქციის ცოცხალ მაგალითზე.
ნაბიჯი 5: პროგრამული უზრუნველყოფა
თანდართულ ფაილს, სახელწოდებით "MSP432_Chapter…" აქვს ბევრი კარგი ინფორმაცია MSP432 პორტების შესახებ და ამ დოკუმენტიდან ვიღებთ შემდეგ პორტებს, რეგისტრებს, მისამართებს და ა.შ. თუმცა ცოტა დათარიღებულია. თუმცა, მე ვერ ვნახე დეტალური მისამართები, რომლებიც ჩამოთვლილია პორტის 5 და ზემოთ. (მხოლოდ "ალტერნატიული ფუნქციები"). მაგრამ მაინც სასარგებლოა.
ჩვენ ვიყენებთ ორ პორტს. P5, P7, P1 და P2.
P5.3 (ერთი ბიტიანი) გამომავალი იქნება სენსორზე IR LED ჩართვის კონტროლი. ჩვენ ვიყენებთ P5.3- ს, რადგან ის არის გამოკვეთილი პინი იმავე სათაურში, როგორც სხვა MSP432 კავშირები, რომლებიც მიდიან სენსორულ მასივში.
P7.0 P7.7 იქნება რვა შეყვანა, რომელიც აგროვებს მონაცემებს სენსორიდან; რასაც "ხედავს".
P1.0 არის ერთი წითელი LED და ჩვენ შეგვიძლია გამოვიყენოთ ის, რომ მოგვაწოდოს მონაცემები.
P2.0, P2.1, P2.2 არის RGB LED და ჩვენ ასევე შეგვიძლია გამოვიყენოთ იგი თავისი განსხვავებული ფერის შესაძლებლობებით, რომ მოგვცეს სენსორის მონაცემების მითითება.
თუ თქვენ გაიარეთ წინა ინსტრუქციები ამ ყველაფერთან დაკავშირებით, თქვენ უკვე იცით, თუ როგორ უნდა შექმნათ პროგრამა.
უბრალოდ აქვს დეკლარაციის განყოფილება პორტებსა და ბიტებს და ა.
თქვენ გექნებათ "მთავარი" განყოფილება.
უნდა არსებობდეს მარყუჟი, სადაც ჩვენ განუწყვეტლივ ვკითხულობთ მონაცემებს P7– დან, ვიღებთ გადაწყვეტილებას ამ მონაცემებზე და შესაბამისად ვანათებთ ორ LED– ს.
აქ არის პორტის რეგისტრაციის მისამართები:
- GPIO P1: 0x4000 4C00 + 0 (თუნდაც მისამართები)
- GPIO P2: 0x4000 4C00 + 1 (უცნაური მისამართები)
- GPIO P3: 0x4000 4C00 + 20 (თუნდაც მისამართები)
- GPIO P4: 0x4000 4C00 + 21 (უცნაური მისამართები)
- GPIO P5: 0x4000 4C00 + 40 (თუნდაც მისამართები)
- GPIO P6: 0x4000 4C00 + 41 (უცნაური მისამართები)
- GPIO P7: 0x4000 4C00 + 60 (მისამართებიც კი)
- GPIO P8: 0x4000 4C00 + 61 (უცნაური მისამართები)
- GPIO P9: 0x4000 4C00 + 80 (თუნდაც მისამართები)
- GPIO P10: 0x4000 4C00 + 81 (უცნაური მისამართები)
რაც თამამად არის ის, რასაც ჩვენ ვიყენებთ ამ ინსტრუქციისთვის.
პროგრამის ნაბიჯები IR დეტექტორების წასაკითხად
ქვემოთ მოცემულია psuedo კოდი პროგრამის C- ში დასაწერად, მაგრამ ის მაინც სასარგებლოა და ჩვენ მას საკმაოდ მჭიდროდ მივყვებით პროგრამის ასამბლეის ვერსიაში.
მთავარი პროგრამა 0) // პორტების ინიციალიზაცია სანამ (1) {1) დააყენეთ P5.3 მაღალი (ჩართეთ IR LED) 2) გახადეთ P7.0 გამომავალი და დააყენეთ მაღალი (კონდენსატორის დატენვა) 3) დაელოდეთ 10 ჩვენ, Clock_Delay1us (10); 4) გააკეთეთ P7.0 შეყვანა 5) გაუშვით ეს მარყუჟი 10, 000 ჯერ ა) წაიკითხეთ P7.0 (გარდაქმნის ძაბვას P7.0 –ზე ორობაში) ბ) გამოუშვით ორობითი P1.0– ს (გაძლევთ საშუალებას ნახოთ ორობითი რეალურ დროში) 6) დააყენეთ P5.3 დაბალი (გამორთეთ IR LED, ენერგიის დაზოგვა) 7) დაელოდეთ 10 ms, Clock_Delay1ms (10); } // გამეორება (უკან დაბრუნებამდე ())
ნაბიჯი 6: მოდით გავაუმჯობესოთ კოდი
Pololu IR LED მასივის დანიშნულება ან გამოყენება არის ხაზის გამოვლენა და იმის ცოდნა, რობოტი (მომავალი) პირდაპირ არის ორიენტირებული ხაზზე, თუ ერთ მხარეს. ასევე, ვინაიდან ხაზს აქვს გარკვეული სისქე, თუ სენსორების მასივი პირდაპირ პერპენდიკულარულია ხაზზე, სენსორების N რაოდენობას ექნება განსხვავებული კითხვა სხვა დანარჩენებთან შედარებით, ხოლო თუ IR LED მასივი არის გარკვეული კუთხით (არა პერპენდიკულარული), მაშინ N+1 ან N+2 IR LED/დეტექტორის წყვილებმა უნდა მისცენ განსხვავებული მაჩვენებელი.
ამრიგად, იმისდა მიხედვით, თუ რამდენი სენსორი მიუთითებს ხაზის არსებობაზე, ჩვენ უნდა ვიცოდეთ, ვართ თუ არა ცენტრში ორიენტირებული და დახრილი ვართ თუ არა.
ამ საბოლოო ექსპერიმენტისთვის, მოდით ვნახოთ, შეგვიძლია თუ არა მივიღოთ წითელი LED და RGB LED, რომ მოგვაწოდოს მეტი ინფორმაცია რას გვეუბნება სენსორული მასივი.
ვიდეო შეიცავს ყველა დეტალს. ასევე დართულია საბოლოო კოდი.
ეს ასრულებს GPIO– სთან დაკავშირებული ARM ასამბლეის სერიას. ჩვენ ვიმედოვნებთ, რომ მოგვიანებით დავბრუნდებით მეტი ARM ასამბლეით.
Გმადლობთ.
გირჩევთ:
ხაზის მიმდევარი Tinkercad– ზე: 3 ნაბიჯი
Line Follower on Tinkercad: A-Line Follower Robot, როგორც სახელი გვთავაზობს, არის ავტომატიზირებული მართვადი მანქანა, რომელიც მიჰყვება იატაკზე ან ჭერზე ჩადგმულ ვიზუალურ ხაზს. ჩვეულებრივ, ვიზუალური ხაზი არის გზა, რომლის გავლით მიდის მიმდევარი რობოტი და ეს იქნება შავი ხაზი, როდესაც
PID ხაზის მიმდევარი Atmega328P: 4 ნაბიჯი
PID Line მიმდევარი Atmega328P: შესავალი ეს სასწავლო არის ეფექტური და საიმედო ხაზის მიმდევართა შექმნის შესახებ PID (პროპორციული ინტეგრალურ-წარმოებული) კონტროლით (მათემატიკური) მის ტვინში (Atmega328P). ხაზის მიმდევარი არის ავტონომიური რობოტი, რომელიც მიყვება ან
როგორ გავაკეთოთ ხაზის მიმდევარი რობოტი არდუინოს (მიკროკონტროლერი) გამოყენების გარეშე: 5 ნაბიჯი
როგორ გავაკეთოთ ხაზის მიმდევარი რობოტი Arduino- ს (მიკროკონტროლერის) გამოყენების გარეშე: ამ სასწავლო ინსტრუქციაში მე გასწავლით თუ როგორ უნდა გააკეთოთ რობოტი Arduino– ს გამოყენების გარეშე. მე გამოვიყენებ ძალიან მარტივ ნაბიჯებს. ეს რობოტი გამოიყენებს IR სიახლოვის სენსორს მიჰყევით ხაზს. თქვენ არ დაგჭირდებათ რაიმე სახის პროგრამირების გამოცდილება
მარტივი ხაზის მიმდევარი Arduino– ს გამოყენებით: 5 ნაბიჯი
მარტივი ხაზის მიმდევარი Arduino– ს გამოყენებით: Arduino Line Follower Robot ამ გაკვეთილში ჩვენ განვიხილავთ რობოტის შემდგომი არდუინოს ხაზის მუშაობას, რომელიც მიჰყვება შავ ხაზს თეთრ ფონზე და მიიღებს სწორ შემობრუნებას, როდესაც ის მიაღწევს მოსახვევებს თავის გზაზე. Arduino Line Follower Co
GoPiGo3 ხაზის მიმდევარი: 8 ნაბიჯი
GoPiGo3 Line Follower: ამ გაკვეთილში ჩვენ ვიღებთ ხაზის მიმდევარს და ვიყენებთ მას GoPiGo3– ზე, რათა ის დაიცვას შავი ხაზი