Мазмұны:
Бейне: Робо-беллопты қалай жасауға болады: 3 қадам
2024 Автор: John Day | [email protected]. Соңғы өзгертілген: 2024-01-30 10:27
Авторы: jeffreyfFollow Толығырақ:
Мен туралы: Мен заттарды бөліп алуды және олардың қалай жұмыс істейтінін білуді ұнатамын. Жалпы осыдан кейін қызығушылығым жоғалады. Джефрейф туралы толығырақ »
Бұл нұсқаулық iRobot Create -ті қозғалмалы қоңырау соғу үшін қалай қолдануға болатынын көрсетеді. Бұл CarolDancer нұсқауларының рұқсатымен толығымен алынып тасталды, мен оны байқауға үлгі ретінде енгіздім. Robo-BellHop сіздің сөмкелеріңізді, азық-түліктеріңізді, кірлеріңізді және т. дейін. Негізгі Create жоғарғы жағында қоқыс жәшігі бар және оның иесінің инфрақызыл таратқышын қадағалау үшін борттық екі IR детекторын қолданады. C бағдарламалық жасақтамасының қарапайым кодымен пайдаланушы Robo -BellHop -та ауыр азық -түліктерді, үлкен кірді немесе түнгі сөмкені сақтай алады және робот сізді көшеде, сауда орталығында, дәлізде немесе әуежай арқылы қадағалай алады - - пайдаланушы қайда бару керек болса да. Негізгі операция 1) Командалық модульді қосу үшін «Қалпына келтіру» түймесін басыңыз және сенсорлардың қосылып тұрғанын тексеріңіз 1а) Ойнату диодты инфрақызыл таратқыш сіздің артыңыздан келе жатқанын көргенде жанады. робот өте жақын қашықтықта2) Robo-BellHop процедурасын орындау үшін қара жұмсақ түймені басыңыз 3) ИҚ таратқышты тобыққа бекітіңіз және оның қосылғанына көз жеткізіңіз. Кәрзеңкені жүктеп, барыңыз! диапазон (тым алыс немесе өте өткір бұрышпен), робот сигналды қайта алған жағдайда баяу жылдамдықпен қысқа қашықтықты жүріп өтеді4c) Егер IR сигналы анықталмаса, робот солға және оңға бұрылады. сигналды қайта табуға тырысыңыз4d) Егер IR сигналы анықталса, бірақ робот кедергіге тап болса, робот кедергіні айналып өтуге тырысады4e) Егер робот IR сигналына өте жақындаса, робот тоқтамайды. иесінің табандарыHardware1 iRobot виртуалды қабырға қондырғысы - $ 301 RadioShack IR детекторы - $ 31 DB -9 Radio Shack еркек қосқышы - $ 44 Home Depot -тен 6-32 бұрандалар - $ 2.502 3В батареялар, мен D1 кір себетін Target - $ 51 қосымша дөңгелекті қолдандым Create robot артқы жағы Электрлік таспа, сым және дәнекер
1 -қадам: IR сенсорын жабу
Create роботының алдыңғы жағындағы инфрақызыл сенсордың кішкене тесігін қоспағанда, барлығын жабу үшін электрлік таспаны бекітіңіз. Виртуалды қабырға қондырғысын бөлшектеңіз және құрылғының алдыңғы жағындағы шағын тақтаны шығарыңыз. Бұл өте қиын, себебі жасырын бұрандалар мен пластикалық бекітпелер көп. IR таратқышы схемада орналасқан. Инфрақызыл сәулеленуді болдырмау үшін инфрақызыл таратқышты қағазбен жабыңыз. Электрондық тақтаны табанға орап алатын белдікке немесе серпімді жолаққа бекітіңіз. Батареяларды ыңғайлы жерге орналастыру үшін батареяларды схемаға қосыңыз (мен батареяларды қалтаға салу үшін жасадым).
2-ші инфрақызыл детекторды DB-9 коннекторына жалғап, Cargo Bay ePort түйреуішінің 3 (сигнал) және 5-ші түйреуішке (жерге) салыңыз. 2 -ші инфрақызыл детекторды Жасау бөліміндегі қолданыстағы ИҚ сенсорының жоғарғы жағына бекітіңіз және оны 2 -ші инфрақызыл детектор эмитентті сіз қалаған қашықтықта қалмайтындай қашықтықта көрмейінше, оны бірнеше қабатты қағазбен жабыңыз. саған тигеннен. Сіз мұны «Қалпына келтіру» түймесін басқаннан кейін тексере аласыз және тоқтау қашықтығында болғаныңызда Advance светодиодының жануын көре аласыз.
2 -қадам: Себетті бекітіңіз
Себетті 6-32 бұрандалармен бекітіңіз. Мен себетті Create роботының жоғарғы жағына орнаттым. Сондай -ақ, артқы доңғалақта сырғытыңыз, осылайша сіз салмақ жасаңыз роботтың артына.
Ескертулер: - Робот шамалы жүкті көтере алады, кем дегенде 30 фунт. - Шағын өлшем кез келген багажды алып жүрудің ең қиын бөлігі болып көрінді - IR өте темпераментті. Мүмкін, кескінді қолдану жақсы, бірақ ол әлдеқайда қымбат
3 -қадам: бастапқы кодты жүктеңіз
Бастапқы код мәтіндік файлға қосылады:
/*********************************************** ******************** follow.c ** -------- ** команда жасау модулінде жұмыс істейді ** алдыңғы жағынан кішкене тесіктерді қоспағанда ИҚ сенсоры ** Жасау виртуалды қабырғаға қарай жүреді (немесе кез келген ИҚ ** күш өрісінің сигналын жібереді) және процестегі кедергілерді болдырмайды деп үміттенеміз ***************** ************************************************ **/#interrupt.h қосу SearchLeftAngle 125#SearchRightAngle анықтау (SearchLeftAngle - 1000)#CoastDistance 150 анықтау TraceDistance 250#айқындау TraceAngle 30#артқа қашықтықты анықтау 25#IRDetected анықтау (~ PINB & 0x01) // күйлер#дайын Дайын 0#анықтау келесі 1#анықтау WasFollowing 2 #іздеудің сол жағын 3 анықтаңыз#іздеудің құқығын анықтаңыз 4#іздеудің сол жағын анықтаңыз 5#қадағалауды анықтаңыз 6#BackingTraceLeft -ті анықтаңыз 7#BackingTraceRight 8 -ді анықтаңыз // жаһандық айнымалылар olatile uint16_t timer_cnt = 0; ұшпайтын uint8_t timer_on = 0; ұшпайтын uint8_t сенсорлар_флаг = 0; ұшпалы uint8_t сенсорлар_дегс = 0; ұшпалы uint8_t сенсорлардағы_ Sen6Size; ұшпалы uint8_t сенсорлы_16 сенсорлық_сен6 тұрақсыз uint8_t inRange = 0; // Functionsvoid byteTx (uint8_t мәні); void delayMs (uint16_t time_ms); void delayAndCheckIR (uint16_t time_ms); void delayAndUpdateSensors (unsigned int time_ms); void voidoid (void) baud (uint8_t baud_code); бос диск (int16_t жылдамдық, int16_t радиусы); uint16_t кездейсоқ бұрыш (void); void defineSongs (void); int main (void) {// күй айнымалы8_t state = Дайын; int found = 0; int wait_counter = 0; // Create and moduleinitialize (); LEDBothOff; powerOnRobot (); byteTx (CmdStart); baud (Baud28800); byteTx (CmdControl); byteTx (CmdFull); // екінші IR сенсоры үшін кіру/шығуды орнатуDDRB & = ~ 0x01; // ePort пин 3 жүкті шығанағы енгізуPORTB | = 0x01; // жүктің ePort pin3 тартылуын қосады // бағдарламаның циклы (TRUE) {// сақтық шарасы ретінде тоқтату (0, RadStraight); // LEDsbyteTx (CmdLeds) орнату; byteTx (((сенсорлар [SenVWall])? LEDPlay: 0x00) | (inRange? LEDAdvance: 0x00)); byteTx (сенсорлар [SenCharge1]); byteTx (64); IRDetected? LED2On: LED2Off; inRange? LED1On: LED1Off; // пайдаланушы түймесін іздеу, oftendelayAndUpdateAndors (10); (10); if (UserButtonPressed) {delayAndUpdateSensors (1000); // белсенді цикл кезінде (! (UserButtonPressed) && (! Сенсорлар [SenCliffL]) && (! Сенсорлар [SenCliffFL]) && (! Сенсорлар [SenCliffFR]) && (! датчиктер [SenCliffR])) {byteTx (CmdLeds); byteTx (((сенсорлар [SenVWall])? LEDPlay: 0x00) | (inRange? LEDAdvance: 0x00)); byteTx (датчиктер [SenCharge1]); byteTx (255); IRDetected ? LED2On: LED2Off; inRange? LED1On: LED1Off; switch (state) {case Ready: if (sensors [SenVWall]) {// Leader (inRange) {drive (0, RadStraight);} else {// drivedrive (SlowSpeed, RadStraight); state = Follow;}} else {// beamangle = 0 іздеңіз; қашықтық = 0; күту_санағы = 0; табылды = ЖАЛҒАН; диск (SearchSpeed, RadCCW); күй = SearchingLeft;} үзіліс; келесі жағдай: егер (сенсорлар [SenBumpDrop] & BumpRight) {қашықтық = 0; бұрыш = 0; жетек (-SlowSpeed, RadStraight); state = BackingTraceLeft;} else if (сенсорлар [SenBumpDrop] & BumpLeft) {қашықтық = 0; бұрыш = 0; диск (-SlowSpeed, RadStraight); state = BackingTraceRight;} басқа болса (сенсорлар [SenVWall]) {// тексеріңіз лидерге жақындық (inRange) {drive (0, RadStraight); state = Ready;} else {// drive straightdrive (FullSpeed, RadStraight); state = Follow;}} басқа {// сигналды жоғалтып алдыңыз, баяу жүре беріңіз циклдық қашықтық = 0; диск (SlowSpeed, RadStraight); күй = WasFollowing;} үзіліс; case WasFollowing: if (сенсорлар [SenBumpDrop] & BumpRight) {қашықтық = 0; бұрыш = 0; жетек (-SlowSpeed, RadStraight); күй = BackingTraceLeft;} if if (сенсорлар [SenBumpDrop] & BumpLeft) {қашықтық = 0; бұрыш = 0; қозғалыс (-SlowSpeed, RadStraight); state = BackingTraceRight;} if if (сенсорлар [SenVWall]) {// лидердің жақындығын тексеріңіз (inRange) {drive (0, RadStraight); күй = R eady;} else {// drivedrive (FullSpeed, RadStraight); state = Follow;}} else if (distance> = CoastDistance) {drive (0, RadStraight); state = Ready;} else {drive (SlowSpeed, RadStraight);} break; case SearchingLeft: егер (табылса) {if (бұрышы> = ExtraAngle) {диск (SlowSpeed, RadStraight); күй = Келесі;} else {drive (SearchSpeed, RadCCW);}} if if (сенсорлар [SenVWall]) {табылған = РАС; бұрыш = 0; егер (inRange) {диск (0, RadStraight); күй = Дайын;} else {drive (SearchSpeed, RadCCW);}} else if (бұрыш> = SearchLeftAngle) {диск (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);}} else if (сенсорлар [SenVWall]) {табылды = РАС; бұрыш = 0; егер (inRange) {диск (0, RadStraight); күй = Дайын;} басқа {drive (SearchSpeed, RadCCW);}} else if (wait_counter> 0) {wait_counter -= 20; drive (0, RadStraight);} if if (angle = Search RightAngle) {drive (0, RadStraight); wait_counter = 5000; angle = 0;} else {drive (SearchSpeed, RadCW);} break; case TracingLeft: if (сенсорлар [SenBumpDrop] & BumpRight) {қашықтық = 0; бұрыш = 0; drive (-SlowSpeed, RadStraight); state = BackingTraceLeft;} if if (sensors [SenBumpDrop] & BumpLeft) {drive (0, RadStraight); state = Ready;} if if (sensors [SenVWall]) {// check лидерге жақын болу үшін (inRange) {drive (0, RadStraight); state = Ready;} else {// drivedrive (SlowSpeed, RadStraight); state = Follow;}} else if (! (қашықтық> = TraceDistance)) { drive (SlowSpeed, RadStraight);} if if (! (-angle> = TraceAngle)) {drive (SearchSpeed, RadCW);} else {distance = 0; angle = 0; drive (SlowSpeed, RadStraight); state = Ready; } break; case TracingRight: if (сенсорлар [SenBumpDrop] & BumpRight) {drive (0, RadStraight); state = Ready;} else if (сенсорлар [SenBumpDrop] & BumpLeft) {қашықтық = 0; бұрыш = 0; жетек (- SlowSpeed, RadStraight); state = BackingTraceRight;} else if (сенсорлар [SenVWall]) {// Leader (inRang) жақындығын тексеріңіз e) {drive (0, RadStraight); state = Ready;} else {// drive straightdrive (SlowSpeed, RadStraight); state = Follow;}} else if (! (қашықтық> = TraceDistance)) {drive (SlowSpeed, RadStraight));} if if (! (бұрыш> = TraceAngle)) {диск (SearchSpeed, RadCCW);} else {қашықтық = 0; бұрыш = 0; диск (SlowSpeed, RadStraight); күй = Дайын;} үзіліс; Case BackingTraceLeft: if (сенсорлар [SenVWall] && inRange) {drive (0, RadStraight); state = Ready;} if if (бұрыш> = TraceAngle) {қашықтық = 0; бұрыш = 0; жетек (SlowSpeed, RadStraight); күй = TracingLeft; } else if (-distance> = BackDistance) {drive (SearchSpeed, RadCCW);} else {drive (-SlowSpeed, RadStraight);} break; case BackingTraceRight: if (сенсорлар [SenVWall] && inRange) {диск (0, RadStraight); күй = Дайын;} else if (-angle> = TraceAngle) {қашықтық = 0; бұрыш = 0; диск (SlowSpeed, RadStraight); күй = TracingRight;} басқа егер (-distance> = BackDistance) {drive (SearchSpeed), RadCW);} else {drive (-SlowSpeed, RadStraight);} break; default: // stopdrive (0, RadStraight); state = Re ady; break;} delayAndCheckIR (10); delayAndUpdateSensors (10);} // қия немесе пайдаланушы түймесі анықталды, жағдайды тұрақтандыруға мүмкіндік береді (мысалы, түймені босату керек) (0, RadStraight); delayAndUpdateSensors (2000);}}} // Сенсорлық мәндерді сақтауға арналған сериялық қабылдау үзілісі msSIGNAL (SIG_OUTPUT_COMPARE1A) кешіктірілуіне {if (timer_cnt) timer_cnt-; elsetimer_on = 0;} // байтты сериялық портвоид byteTx (uint8_t мәні) арқылы жіберу {while (! (UCSR0A & _BV) (UDRE0) UDR0 = мән;} // Сенсорлық мәндерді жаңартпай, мс -те көрсетілген уақытқа кешігу 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));} // Көрсетілген уақыттың кешігуі мс және жаңарту сенсорының мәндері delayAndUpdateSensors (uint16_t time_ms) {uint8_t temp; timer_on = 1; timer_cnt = time_ms; while (timer_on) {if (! sensors_flag) {for (temp = 0; температура Sen6Size; temp ++) датчиктер [temp] = sensors_in [temp]; // Қашықтық пен бұрыштық қашықтықтардың қосындыларын жаңарту += (int) ((сенсорлар [SenDist1] 8) | датчиктер [SenDist0]); бұрыш += (int) ((сенсорлар) [SenAng1] 8) | сенсорлар [SenAng0]); byteTx (CmdSensors); byteTx (6); sensors_index = 0; sensors_flag = 1;}}} // Mind Control & aposs ATmega168 микроконтроллерін инициализациялау (жарамсыз) {cli (); // I/O түйреуіштерін орнатыңызDDRB = 0x10; PORTB = 0xCF; DDRC = 0x00; PORTC = 0xFF; DDRD = 0xE6; PORTD = 0x7D; // Әр 1 мс үзіліс жасау үшін таймер 1 орнатыңызTCCR1A = 0x00; TCCR1B = (_BV (WGM12) | _BV (CS12)); OCR1A = 71; TIMSK1 = _BV (OCIE1A); // rx interruptUBRR0 = 19 сериялық портты орнатыңыз; UCSR0B = (_BV (RXCIE0) | _BV (TXEN0) | _BV (RXEN0)));; ! RobotIsOn) {RobotPwrToggleLow; delayMs (500); // Бұл күйдегі кідірісRobotPwrToggleHigh; // powerdelayMs (100) ауыстыруға төменнен жоғарыға ауысу; // Бұл күйдегі кідірісRobotPwrToggleLow;} delayMs (3500); // Іске қосудың кешігуі}} // Жүктеу жылдамдығының екеуін де жасаңыз (uint8_t baud_code) {if (baud_code = 11) {byteTx (CmdBaud); UCSR0A | = _BV (TXC0); byteTx (baud_code);/ / Жіберу аяқталғанша күтіңіз (! (UCSR0A & _BV (TXC0))))); cli (); // Бауд жылдамдығының регистрін ауыстырыңыз (baud_code == Baud115200) UBRR0 = Ubrr115200; if if (baud_code == Baud57600) UBRRR0 = Ubr; if if (baud_code == Baud38400) UBRR0 = Ubrr38400; else if (baud_code == Baud28800) UBRR0 = Ubrr28800; else if (baud_code == Baud19200) UBRR0 = Ubrr19200; else if (baudRR400 == BaudRC4 == if (baud_code == Baud9600) UBRR0 = Ubrr9600; else if (baud_code == Baud4800) UBRR0 = Ubrr4800; else if (baud_code == Baud2400) UBRR0 = Ubrr2400; else if (baud_code = URR120000) baud_code == Baud600) UBRR0 = Ubrr600; әйтпесе (baud_code == Baud300) UBRR0 = Ubrr300; sei (); delayMs (100);}} // Жіберу жылдамдық пен радиустық жетегі (int16_t жылдамдығы, int16_t) бойынша диск пәрмендерін құру. радиусы) {byteTx (CmdDrive); byteTx ((uint 8_t) ((жылдамдық >> 8) & 0x00FF)); byteTx ((uint8_t) (жылдамдық & 0x00FF)); byteTx ((uint8_t) ((радиусы >> 8) & 0x00FF)); byteTx ((uint8_t) (радиусы) & 0x00FF));}
Ұсынылған:
DIY қалай керемет көрінетін сағатты жасауға болады - StickC - Оңай жасауға болады: 8 қадам
DIY қалай керемет көрінетін сағатты жасауға болады - StickC - Оңай жасауға болады: Бұл оқулықта біз ESP32 M5Stack StickC -ті Arduino IDE және Visuino көмегімен СКД -де уақытты көрсету үшін қалай бағдарламалауды, сонымен қатар StickC түймелерінің көмегімен уақытты орнатуды үйренеміз
Linux жүктеу дискісін қалай құруға болады (және оны қалай қолдануға болады): 10 қадам
Linux жүктеу дискісін қалай құруға болады (және оны қалай қолдануға болады): Бұл Linux -тен қалай бастау керектігі туралы қарапайым кіріспе, атап айтқанда Ubuntu
ARDUINO NANO/MINI ҚАЛАЙ ЖАСАУҒА БОЛАДЫ - Жүктеушіні қалай жағуға болады: 5 қадам
ARDUINO NANO/MINI ҚАЛАЙ ЖАСАУҒА БОЛАДЫ | Bootloader қалай жазылады: Бұл нұсқаулықта мен сізге Scratch -тен Arduino MINI -ді қалай жасау керектігін көрсетемін. Бұл нұсқаулықта жазылған процедураны жобаның жеке талаптарына сәйкес кез келген arduino тақталарын жасау үшін қолдануға болады. Жақсы түсіну үшін бейнені қараңыз
Ата мен әженің күнтізбесін қалай жасауға болады & Скрапбук (егер сіз скрапбоны қалай жасау керектігін білмесеңіз де): 8 қадам (суреттермен)
Ата мен әженің күнтізбесін қалай жасауға болады & Скрапбук (егер сіз скрапбоны қалай жасау керектігін білмесеңіз де): Бұл әжелер мен әжелер үшін өте үнемді (және өте бағалы!) Мерекелік сыйлық. Мен осы жылы әрқайсысы 7 доллардан төмен 5 күнтізбе жасадым. Материалдар: сіздің балаңыздың, балаларыңыздың, жиендеріңіздің, жиендеріңіздің, иттердің, мысықтардың немесе басқа туыстарыңыздың 12 керемет суреті12 түрлі бөліктер
Гитара динамигінің қорабын қалай құруға болады немесе стереоға арналған екеуін қалай құруға болады: 17 қадам (суреттермен)
Гитара динамигінің қорабын қалай құруға болады немесе стереоға арналған екеуін қалай құруға болады?: Мен жаңа гитара колонкасын өзім құрып жатқан түтік күшейткішпен бірге алғысы келді. Динамик менің дүкенімде қалады, сондықтан оған ерекше нәрсе қажет емес. Толекс жабындысы өте оңай зақымдалып кетуі мүмкін, сондықтан мен жеңіл құмнан кейін сыртқа қара шаштым