Სარჩევი:

როგორ გააკეთოთ რობო-ბელჰოპი: 3 ნაბიჯი
როგორ გააკეთოთ რობო-ბელჰოპი: 3 ნაბიჯი

ვიდეო: როგორ გააკეთოთ რობო-ბელჰოპი: 3 ნაბიჯი

ვიდეო: როგორ გააკეთოთ რობო-ბელჰოპი: 3 ნაბიჯი
ვიდეო: როგორ გავაკეთოთ ქაღალდის იარაღი / How to do a paper gun 2024, ნოემბერი
Anonim

ავტორი ჯეფრიფ

როგორ მივიღოთ iRobot შექმნა სტიპენდიის მინი კონკურსი
როგორ მივიღოთ iRobot შექმნა სტიპენდიის მინი კონკურსი
როგორ მივიღოთ iRobot შექმნა სტიპენდიის მინი კონკურსი
როგორ მივიღოთ iRobot შექმნა სტიპენდიის მინი კონკურსი
როგორ გააკეთოთ LOLCats, Meme cats, Cat macros ან კატის სურათები სასაცილო წარწერებით
როგორ გააკეთოთ LOLCats, Meme cats, Cat macros ან კატის სურათები სასაცილო წარწერებით
როგორ გააკეთოთ LOLCats, Meme cats, Cat macros ან კატის სურათები სასაცილო წარწერებით
როგორ გააკეთოთ LOLCats, Meme cats, Cat macros ან კატის სურათები სასაცილო წარწერებით

შესახებ: მე მომწონს ნივთების დაშლა და იმის გარკვევა, თუ როგორ მუშაობს ისინი. ამის შემდეგ საერთოდ ვკარგავ ინტერესს. მეტი ჯეფრიფის შესახებ »

ეს ინსტრუქცია გვიჩვენებს, თუ როგორ გამოიყენოთ iRobot შექმნა მოძრავი ზარის გასაკეთებლად. ეს მთლიანად მოიხსნა carolDancer– ის მითითებების ნებართვით და მე გამოვაქვეყნე როგორც ჩვენი კონკურსის ნიმუშის ჩანაწერი. Robo-BellHop შეიძლება იყოს თქვენი პირადი თანაშემწე თქვენი ჩანთების, სასურსათო ნივთების, სამრეცხაოს და ა.შ. ტარების მიზნით, ასე რომ თქვენ არ გაქვთ რათა ძირითად შექმნას აქვს ყუთი მიმაგრებული თავზე და იყენებს ორ ბორტ IR დეტექტორს, რათა დაიცვას მისი მფლობელის IR გადამცემი. ძალიან ძირითადი C პროგრამული კოდით, მომხმარებელს შეუძლია უზრუნველყოს მძიმე სასურსათო ნივთები, სამრეცხაოს დიდი დატვირთვა ან თქვენი ღამის ჩანთა Robo -BellHop– ზე და მოგთხოვოთ რობოტი ქუჩაში, სავაჭრო ცენტრის გავლით, დარბაზის ქვემოთ ან აეროპორტის გავლით - - სადაც მომხმარებელი უნდა წავიდეს. ძირითადი ოპერაცია 1) დააჭირეთ გადატვირთვის ღილაკს ბრძანების მოდულის ჩასართავად და სენსორები ჩართულია რობოტი არის ძალიან ახლოს შემდეგ ატვირთეთ კალათა და წადით! 4) Robo-BellHop– ის ლოგიკა ასეთია: 4 ა) როდესაც თქვენ დადიხართ გარშემო, თუ IR სიგნალი გამოვლენილია, რობოტი იმოძრავებს მაქსიმალური სიჩქარით 4 ბ) თუ IR სიგნალი გადის დიაპაზონი (ძალიან შორს ან ძალიან მკვეთრი კუთხით), რობოტი მცირე მანძილს გაივლის ნელი სიჩქარით იმ შემთხვევაში, თუ სიგნალი კვლავ ამოიღება 4 გ) თუ IR სიგნალი არ არის გამოვლენილი, რობოტი მარცხნივ და მარჯვნივ გადაუხვევს სცადეთ სიგნალის ხელახლა პოვნა 4d) თუ IR სიგნალი გამოვლენილია, მაგრამ რობოტი შეაფერხებს, რობოტი შეეცდება იმოძრაოს დაბრკოლების ირგვლივ 4e) თუ რობოტი ძალიან მიუახლოვდება IR სიგნალს, რობოტი გაჩერდება, რომ არ დაარტყას მფლობელის ტერფები Hardware1 iRobot ვირტუალური კედლის ერთეული - 301 $ IR დეტექტორი RadioShack– დან - 31 $ DB -9 მამრობითი კონექტორი რადიო Shack– დან - $ 44 6-32 ხრახნები Home Depot– დან - $ 2.502 3V ბატარეები, მე გამოვიყენე D1 სამრეცხაო კალათა Target– დან - $ 51 დამატებითი ბორბალი უკან შექმნა robotElectrical ფირზე, მავთული და solder

ნაბიჯი 1: IR სენსორის დაფარვა

მიამაგრეთ ელექტრული ლენტი, რომ დაფაროს IR სენსორის ყველა მცირე ნაჭერი, გარდა რობოტის წინა მხარეს. დაიშალეთ ვირტუალური კედლის ერთეული და ამოიღეთ პატარა მიკროსქემის დაფა განყოფილების წინა ნაწილში. ეს ცოტა სახიფათოა, რადგან არსებობს უამრავი ფარული ხრახნი და პლასტმასის სამაგრები. IR გადამცემი არის მიკროსქემის დაფაზე. დაფარეთ IR გადამცემი ქსოვილის ქაღალდით, რათა თავიდან აიცილოთ IR ასახვა. მიამაგრეთ მიკროსქემის სამაჯური სამაგრზე ან ელასტიურ ზოლზე, რომელსაც შეუძლია ტერფის შემოხვევა. შეაერთეთ ბატარეები მიკროსქემის დაფაზე ისე, რომ თქვენ გქონდეთ ბატარეები კომფორტულ ადგილას (მე ეს გავაკეთე ისე, რომ მე შემიძლია ბატარეები ჩავდე ჯიბეში).

შეაერთეთ მე -2 IR დეტექტორი DB-9 კონექტორზე და ჩადეთ Cargo Bay ePort pin 3 (სიგნალი) და pin 5 (ადგილზე). მიამაგრეთ მე -2 IR დეტექტორი არსებული IR სენსორის თავზე შექმნაზე და დაფარეთ იგი ქსოვილის ქაღალდის რამდენიმე ფენით, სანამ მე -2 IR დეტექტორი არ დაინახავს ემისტერს იმ მანძილზე, რომლის შექმნასაც რობოტის შეწყვეტა სურს. შენი დარტყმისგან. თქვენ შეგიძლიათ შეამოწმოთ ეს მას შემდეგ რაც დააჭირეთ გადატვირთვის ღილაკს და უყურეთ Advance LED- ს რომ გააგრძელოს გაჩერების მანძილზე.

ნაბიჯი 2: მიამაგრეთ კალათა

მიამაგრეთ კალათა 6-32 ხრახნის გამოყენებით. მე მხოლოდ კალათა დავაყენე შექმნა რობოტის თავზე. ასევე გადაისრიალეთ უკანა ბორბალზე, რათა წონა დადეთ რობოტის შექმნის უკანა მხარეს.

შენიშვნები: - რობოტს შეუძლია საკმაოდ დიდი ტვირთის გადატანა, სულ მცირე 30 კილოგრამი. - მცირე ზომის იყო, როგორც ჩანს, ყველაზე რთული ნაწილი ნებისმიერი ბარგის ტარებისას - IR არის ძალიან ტემპერამენტული. ალბათ გამოსახულების გამოყენება უკეთესია, მაგრამ ეს ბევრად უფრო ძვირია

ნაბიჯი 3: ჩამოტვირთეთ წყაროს კოდი

ჩამოტვირთეთ წყაროს კოდი
ჩამოტვირთეთ წყაროს კოდი

წყაროს კოდი შემდეგნაირად არის და თან ერთვის ტექსტურ ფაილს:

/********************************************** ******************** follow.c ** -------- ** გადის ბრძანების მოდულის შექმნა ** მოიცავს ყველა გარდა მცირე გახსნის წინ IR სენსორის ** შექმნა მიჰყვება ვირტუალურ კედელს (ან ნებისმიერი IR გაგზავნის ** ძალის ველის სიგნალს) და იმედია თავიდან აიცილებს ამ პროცესში დაბრკოლებებს ****************** *********************************************** **/#include interrupt.h> #include io.h>#include#include "oi.h"#განსაზღვრეთ ჭეშმარიტი 1#განსაზღვრეთ FALSE 0#განსაზღვრეთ FullSpeed 0x7FFF#განსაზღვრეთ SlowSpeed 0x0100#განსაზღვრეთ SearchSpeed 0x0100#განსაზღვრეთ ExtraAngle 10#განსაზღვრეთ SearchLeftAngle 125#განსაზღვრეთ SearchRightAngle (SearchLeftAngle - 1000)#განსაზღვრეთ სანაპირო მანძილი 150#განსაზღვრეთ TraceDistance 250#განსაზღვრეთ TraceAngle 30#განსაზღვრეთ BackDistance 25#განსაზღვრეთ IRDetected (~ PINB & 0x01) // შტატები#განსაზღვრეთ მზა 0#განსაზღვრეთ შემდეგი 1#განსაზღვრეთ WasFolling 2 #განსაზღვრეთ SearchingLeft 3#განსაზღვრეთ SearchingRight 4#განსაზღვრეთ TracingLeft 5#განსაზღვრეთ TracingRight 6#განსაზღვრეთ BackingTraceLeft 7#განსაზღვრეთ BackingTraceRight 8 // გლობალური ცვლადი არასტაბილური uint16_t timer_cnt = 0; არასტაბილური uint8_t ქრონომეტრი = 0; არასტაბილური uint8_t sensors_flag = 0; არასტაბილური uint8_t sensors_index = 0; არასტაბილური uint8_t სენსორები_ [Sen6Size]; არასტაბილური uint8_t სენსორები [მანძილი = 0 = 16 = მანძილი = 0 = 16 = მანძილი = 0 = 16 = მანძილი არასტაბილური uint8_t inRange = 0; // ფუნქციებიvoid byteTx (uint8_t მნიშვნელობა); void delayMs (uint16_t time_ms); void delayAndCheckIR (uint16_t time_ms); void delayAndUpdateSensors (unsigned int time_ms); void void start (void baud (uint8_t baud_code); void drive (int16_t სიჩქარე, int16_t რადიუსი); uint16_t randomAngle (void); void defineSongs (void); int main (void) {// state variableuint8_t state = Ready; int found = 0; int ლოდირებული = 0; // შექმენით შექმნა და მოდულის ინიციალიზაცია (); LEDBothOff; powerOnRobot (); byteTx (CmdStart); baud (Baud28800); byteTx (CmdControl); byteTx (CmdFull); // // i/o მეორე IR სენსორისთვის & = X 0x01; // დააყენეთ ტვირთის ყურე ePort pin 3, როგორც შესასვლელი PORTB | = 0x01; // დააყენეთ ტვირთის ePort pin3 გაყვანა ჩართულია // პროგრამა loop while (TRUE) {// შეჩერდით როგორც სიფრთხილის მართვა (0, RadStraight); // დააყენეთ LEDsbyteTx (CmdLeds); byteTx ((((სენსორები [SenVWall]))? LEDPlay: 0x00) | (inRange? LEDAdvance: 0x00)); byteTx (სენსორები [SenCharge1]); byteTx (64); IRDetected? LED2On: LED2Off; inRange? LED1On: LED1Off; // ეძებს მომხმარებლის ღილაკს, შეამოწმეთ oftendelayAndUpdateSensors (10); (10); if (UserButtonPressed) {delayAndUpdateSensors (1000); // აქტიური loopitely (! (UserButtonPressed) && (!! სენსორები [SenCliffL]) && (! სენსორები [SenCliffFL]) && (! სენსორები [SenCliffFR]) && (! სენსორები [SenCliffR])) {byteTx (CmdLeds); byteTx (((სენსორები [SenVWall])? LEDPlay: 0x00) | (inRange? LEDAdvance: 0x00)); byteTx (სენსორები [SenCharge1]); byteTx (255); IRDetected ? LED2On: LED2Off; inRange? LED1On: LED1Off; გადართვა (მდგომარეობა) {შემთხვევა მზად არის: if (სენსორები [SenVWall]) {// შეამოწმეთ Leaderif (inRange) {დისკზე (0, RadStraight);} სხვა {/ წამყვანი straightdrive (SlowSpeed, RadStraight); state = Following;}} else {// მოძებნეთ სხივი = 0; მანძილი = 0; wait_counter = 0; ნაპოვნია = FALSE; დისკი (SearchSpeed, RadCCW); მდგომარეობა = SearchingLeft;} შესვენება; შემთხვევა შემდეგ: თუ (სენსორები [SenBumpDrop] & BumpRight) {მანძილი = 0; კუთხე = 0; დისკი (-SlowSpeed, RadStraight); მდგომარეობა = BackingTraceLeft;} სხვა შემთხვევაში თუ (სენსორები [SenBumpDrop] & BumpLeft) {მანძილი = 0; კუთხე = 0; დისკი (-SlowSpeed, RadStraight); მდგომარეობა = BackingTraceRight;} სხვა შემთხვევაში თუ (სენსორები [SenVWall]) {{შეამოწმეთ ლიდერი სიახლოვე (inRange) {დისკი (0, RadStraight); მდგომარეობა = მზადაა;} სხვა { cycledistance = 0; დისკი (SlowSpeed, RadStraight); მდგომარეობა = WasFollowing;} შესვენება; შემთხვევა WasFollowing: if (სენსორები [SenBumpDrop] & BumpRight) {მანძილი = 0; კუთხე = 0; დისკი (-SlowSpeed, RadStraight); მდგომარეობა = BackingTraceLeft;} სხვა შემთხვევაში (სენსორები [SenBumpDrop] & BumpLeft) {მანძილი = 0; კუთხე = 0; დისკი (-SlowSpeed, RadStraight); მდგომარეობა = BackingTraceRight;} სხვა შემთხვევაში თუ (სენსორები [SenVWall]) {{// შეამოწმეთ ლიდერთან სიახლოვე (inRange) {დისკი (0, RadStraight); მდგომარეობა = R eady;} else {// drive straightdrive (FullSpeed, RadStraight); state = Following;}} else if (distance> = CoastDistance) {drive (0, RadStraight); state = Ready;} else {drive (SlowSpeed, RadStraight);} შესვენება; შემთხვევა SearchingLeft: if (found) {if (angle> = ExtraAngle) {drive (SlowSpeed, RadStraight); state = Following;} else {drive (SearchSpeed, RadCCW);}} else if (სენსორები [SenVWall]) {found = TRUE; angle = 0; if (inRange) {drive (0, RadStraight); state = Ready;} else {drive (SearchSpeed, RadCCW);}} else if (angle> = SearchLeftAngle) {drive (SearchSpeed, RadCW); wait_counter = 0; state = SearchingRight;} else {drive (SearchSpeed, RadCCW);} break; case SearchingRight: if (found) {if (-angle> = ExtraAngle) {drive (SlowSpeed, RadStraight); state = შემდეგ;} სხვა {დისკი (SearchSpeed, RadCW);}} სხვა შემთხვევაში თუ (სენსორები [SenVWall]) {found = TRUE; angle = 0; if (inRange) {drive (0, RadStraight); state = Ready;} სხვა {drive (SearchSpeed, RadCCW);}} სხვა შემთხვევაში (wait_counter> 0) {wait_counter -= 20; drive (0, RadStraight);} სხვა შემთხვევაში (კუთხე = ძებნა RightAngle) {დისკი (0, RadStraight); wait_counter = 5000; angle = 0;} else {drive (SearchSpeed, RadCW);} შესვენება; case TracingLeft: if (სენსორები [SenBumpDrop] & BumpRight) {მანძილი = 0; კუთხე = 0; წამყვანი (-SlowSpeed, RadStraight); მდგომარეობა = BackingTraceLeft;} სხვა შემთხვევაში თუ (სენსორები [SenBumpDrop] & BumpLeft) {დისკი (0, RadStraight); მდგომარეობა = მზად არის}} სხვა შემთხვევაში ლიდერთან სიახლოვისთვის (inRange) {დისკი (0, RadStraight); მდგომარეობა = მზადაა;} სხვა {// დისკზე straightdrive (SlowSpeed, RadStraight); მდგომარეობა = შემდეგ;}} სხვა შემთხვევაში თუ (! (მანძილი> = TraceDistance)) { დისკი (SlowSpeed, RadStraight);} სხვა შემთხვევაში (! (-კუთხე> = TraceAngle)) {დისკი (SearchSpeed, RadCW);} სხვაგან {მანძილი = 0; კუთხე = 0; დისკი (SlowSpeed, RadStraight); მდგომარეობა = მზადაა; } break; case TracingRight: if (სენსორები [SenBumpDrop] & BumpRight) {drive (0, RadStraight); state = Ready;} else if (sensors [SenBumpDrop] & BumpLeft) {distance = 0; angle = 0; drive (- SlowSpeed, RadStraight); state = BackingTraceRight;} სხვა შემთხვევაში თუ (სენსორები [SenVWall]) {// შეამოწმეთ ლიდერი სიახლოვე (inRang ე) {დისკი (0, RadStraight); მდგომარეობა = მზადაა}} სხვა {// დისკზე straightdrive (SlowSpeed, RadStraight); მდგომარეობა = შემდეგ;}} სხვა შემთხვევაში თუ (! (მანძილი> = TraceDistance)) {დისკი (SlowSpeed, RadStraight);} სხვა შემთხვევაში (! (კუთხე> = TraceAngle)) {დისკი (SearchSpeed, RadCCW);} სხვა {მანძილი = 0; კუთხე = 0; დისკი (SlowSpeed, RadStraight); მდგომარეობა = მზად არის;} შესვენება; საქმე BackingTraceLeft: if (სენსორები [SenVWall] && inRange) {დისკი (0, RadStraight); მდგომარეობა = მზად;} სხვა შემთხვევაში თუ (კუთხე> = TraceAngle) {მანძილი = 0; კუთხე = 0; დისკი (SlowSpeed, RadStraight); მდგომარეობა = TracingLeft; } else if (-მანძილი> = BackDistance) {დისკი (SearchSpeed, RadCCW);} სხვა {drive (-SlowSpeed, RadStraight);} შესვენება; საქმე BackingTraceRight: if (სენსორები [SenVWall] && inRange) {დისკი (0, RadStraight); state = Ready;} სხვა შემთხვევაში, RadCW);} else {drive (-SlowSpeed, RadStraight);} შესვენება; ნაგულისხმევი: // stopdrive (0, RadStraight); მდგომარეობა = Re ady; შესვენება;} delayAndCheckIR (10); delayAndUpdateSensors (10);} // გამოვლენილია კლდე ან მომხმარებლის ღილაკი, იძლევა მდგომარეობის სტაბილიზაციის საშუალებას (მაგ., ღილაკის გამოშვება) დისკი (0, RadStraight); delayAndUpdateSensors (2000);}}} // სერიული მიღების შეწყვეტა სენსორული მნიშვნელობების შესანახად დროულად შეფერხებები msSIGNAL (SIG_OUTPUT_COMPARE1A) {if (timer_cnt) timer_cnt-; elsetimer_on = 0;} // გადასცეს ბაიტი სერიულ პორტვუიდ ბაიტქსზე (uint8_t მნიშვნელობა) {ხოლო (! (UCSR0A & _BV) (UDRE0) UDR0 = მნიშვნელობა;} // დაყოვნებულია განსაზღვრული დრო ms- ში სენსორის მნიშვნელობების განახლების გარეშე მოერიდეთ დაგვიანებას Ms (uint16_t time_ms) {timer_on = 1; timer_cnt = time_ms; while (timer_on);} // გადადგით განსაზღვრული დრო ms- ში და შეამოწმეთ მეორე IR დეტექტორი აცილებს დაგვიანებითAndCheckIR (uint16_t time_ms) {uint8_t timer_val = 0; inRange = 0; timer_on = 1; timer_cnt = time_ms; while (timer_on) {if (! (Timer_val == timer_cnt)) {inRange + = IRDetected; timer_val = timer_cnt;}} inRange = (inRange> = (time_ms >> 1); timer_cnt = time_ms; while (timer_on) {if (! sensors_flag) {for (temp = 0; temp Sen6Size; temp ++) სენსორები [temp] = sensors_in [temp]; // განახლებულია მანძილის და კუთხის დისტანციის მთლიანი ჯამი += (int) ((სენსორები [SenDist1] 8) | სენსორები [SenDist0]); კუთხე += (int) ((სენსორები [SenAng1] 8) | სენსორები [SenAng0]); byteTx (CmdSensors); byteTx (6); sensors_index = 0; sensors_flag = 1;}}} // ინიციალიზება გონების კონტროლის & ამოიღეთ ATmega168 მიკროკონტროლერის ინიციალიზაცია (ბათილია) {cli (); // I/O ქინძისთავების დაყენება (WGM12) | _BV (CS12)); OCR1A = 71; TIMSK1 = _BV (OCIE1A); // სერიული პორტის დაყენება rx შეწყვეტით UBRR0 = 19; UCSR0B = (_BV (RXCIE0) | _BV (TXEN0) | _BV (RXEN0 () ! RobotIsOn) {RobotPwrToggleLow; delayMs (500); // გადადება ამ stateRobotPwrToggleHigh; // დაბალიდან მაღალი გადასვლა powerdelayMs- ის გადართვაზე (100); // ამ სახელმწიფოში გადადებაRobotPwrToggleLow;} delayMs (3500); // დაგვიანების ჩატვირთვისას}} // გადართეთ baud განაკვეთი როგორც შექმნაზე, ასევე მოდულის ამოღებაზე baud (uint8_t baud_code) {if (baud_code = 11) {byteTx (CmdBaud); UCSR0A | = _BV (TXC0); byteTx (baud_code);/ / დაელოდეთ სანამ გადაცემა დასრულდება (! (UCSR0A & _BV (TXC0))); cli (); // გადართეთ baud განაკვეთის რეგისტრი (baud_code == Baud115200) UBRR0 = Ubrr115200; სხვა შემთხვევაში; სხვა შემთხვევაში თუ (baud_code == Baud9600) UBRR0 = Ubrr9600; სხვა შემთხვევაში თუ (baud_code == Baud4800) UBRR0 = Ubrr4800; სხვა თუ (baud_code == Baud2400) UBRR0 = Ubrr2400; სხვა თუ baud_code == Baud600) UBRR0 = Ubrr600; წინააღმდეგ შემთხვევაში, თუ (baud_code == Baud300) UBRR0 = Ubrr300; sei (); რადიუსი) {byteTx (CmdDrive); byteTx ((uint 8_t) ((სიჩქარე >> 8) & 0x00FF)); byteTx ((uint8_t) (სიჩქარე & 0x00FF)); byteTx ((uint8_t) ((რადიუსი >> 8) & 0x00FF)); byteTx ((uint8_t) (რადიუსი & 0x00FF));}

გირჩევთ: