Съдържание:
Видео: Как да си направим Robo-Bellhop: 3 стъпки
2024 Автор: John Day | [email protected]. Последно модифициран: 2024-01-30 07:55
От jeffreyf Следвайте още от автора:
Относно: Обичам да разглобявам нещата и да разбера как работят. Като цяло губя интерес след това. Повече за Джефриф »
Тази инструкция показва как да използвате iRobot Create, за да направите подвижен звънец. Това беше премахнато изцяло с разрешение от инструкциите на carolDancer и го поставих като примерна заявка за нашия конкурс. Robo-BellHop може да бъде ваш личен асистент, който да носи вашите чанти, хранителни стоки, пране и т.н., така че нямате да се. Основното създаване има кошче, прикрепено отгоре и използва два вградени IR детектора, за да следи IR предавателя на собственика си. С много основен софтуерен код C потребителят може да осигури тежки хранителни стоки, голям товар пране или чантата ви за една нощ на Robo -BellHop и да накара робота да ви следва по улицата, през търговския център, по коридора или през летището - - навсякъде, където потребителят трябва да отиде. Основни операции 1) Натиснете бутона за нулиране, за да включите командния модул и проверете дали сензорите са включени роботът е на много близко разстояние 2) Натиснете черен мек бутон, за да стартирате програмата Robo-BellHop 3) Прикрепете IR предавателя към глезена и се уверете, че е включен. След това заредете кошницата и тръгнете! 4) Логиката на Robo-BellHop е следната: 4а) Докато се разхождате, ако се открие инфрачервеният сигнал, роботът ще кара с максимална скорост 4b) Ако инфрачервеният сигнал излезе от обхват (като е твърде далеч или твърде остър ъгъл), роботът ще премине на кратко разстояние с бавна скорост, в случай че сигналът се вземе отново 4d) Ако се открие IR сигнал, но роботът удари препятствие, роботът ще се опита да заобиколи препятствието 4e) Ако роботът се доближи много до IR сигнала, роботът ще спре, за да избегне удара глезените на собственика Хардуер 1 iRobot виртуален стенен модул - $ 301 IR детектор от RadioShack - $ 31 DB -9 мъжки конектор от Radio Shack - $ 44 6-32 винтове от Home Depot - $ 2.502 3V батерии, използвах кошница за пране D1 от Target - 51 долара допълнително колело към задната част на Създайте робота Електрическа лента, тел и спойка
Стъпка 1: Покриване на IR сензора
Прикрепете електрическа лента, за да покриете всички, освен малък процеп на инфрачервения сензор в предната част на робота Create. Демонтирайте виртуалната стена и извадете малката платка в предната част на устройството. Това е малко сложно, защото има много скрити винтове и пластмасови стойки. Инфрачервеният предавател е на платката. Покрийте IR предавателя с парче хартия, за да избегнете IR отражения. Прикрепете платката към каишка или еластична лента, която може да увие около глезена ви. Свържете батериите към платката, така че батериите да са на удобно място (направих го така, че да мога да сложа батериите в джоба си).
Свържете 2-рия IR детектор към конектора DB-9 и го поставете в ePort пин 3 на Cargo Bay (сигнал) и щифт 5 (заземяване). Прикрепете 2 -рия IR детектор към горната част на съществуващия IR сензор в Create и го покрийте с няколко слоя салфетка, докато 2 -рият IR детектор не види излъчвателя на разстояние, което искате да спре роботът Create от това да те ударя. Можете да тествате това, след като натиснете бутона за нулиране и да наблюдавате индикатора за напредване, за да продължи, когато сте на разстоянието за спиране.
Стъпка 2: Прикрепете кошницата
Прикрепете кошницата с помощта на винтовете 6-32. Току -що монтирах кошницата в горната част на робота Create. Също така плъзнете в задното колело, за да поставите тежест на гърба на създаването на робота.
Забележки: - Роботът може да понесе доста натоварване, поне 30 кг. - Малкият размер изглежда беше най -трудната част от това да го накараш да носи какъвто и да е багаж - IR е много темпераментен. Може би използването на изображения е по -добро, но е много по -скъпо
Стъпка 3: Изтеглете изходния код
Изходният код следва и е прикачен в текстов файл:
/************************************************* ******************** follow.c ** -------- ** работи на Създаване на команден модул ** покрива всички освен малки отвори отпред на IR сензора ** Create ще следва виртуална стена (или всеки IR, изпращащ ** сигнала на силовото поле) и се надяваме да избегне пречките в процеса ***************** ************************************************** **/#включва прекъсване.h> #включва io.h>#включва#включва "oi.h"#дефинира ИСТИНА 1#дефинира FALSE 0#дефинира FullSpeed 0x7FFF#дефинира SlowSpeed 0x0100#дефинира SearchSpeed 0x0100#дефинира ExtraAngle 10#определя SearchLeftAngle 125#дефинирайте SearchRightAngle (SearchLeftAngle - 1000)#дефинирайте CoastDistance 150#дефинирайте TraceDistance 250#дефинирайте TraceAngle 30#дефинирайте BackDistance 25#дефинирайте IRDetected (~ PINB & 0x01) // състояния#дефинирайте Ready 0#дефинирайте След 1#определете WasFollowing 2 #define SearchingLeft 3#дефинира SearchingRight 4#дефинира TracingLeft 5#дефинира TracingRight 6#дефинира BackingTraceLeft 7#дефинира BackingTraceRight 8 // Глобални променливи v olatile uint16_t timer_cnt = 0; летливи uint8_t timer_on = 0; летливи uint8_t сензори_flag = 0; летливи uint8_t сензори_index = 0; летливи uint8_t сензори_в [Sen6Size]; летливи uint8_t сензори16; volatile uint8_t сензори16 volatile 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); baud (uint8_t baud_code); void drive (int16_t velocity, int16_t radius); uint16_t randomAngle (void); void defineSongs (void); int main (void) {// променлива на състояниетоuint8_t state = Ready; int found = 0; int wait_counter = 0; // Настройте Create and moduleinitialize (); LEDBothOff; powerOnRobot (); byteTx (CmdStart); baud (Baud28800); byteTx (CmdControl); byteTx (CmdFull); ~ 0x01; // настройте ePort щифт 3 на товарния отсек като входен портB | = 0x01; // задаване на издърпване на товарния ePort pin3 // активиран програмен цикъл (TRUE) {// Спиране само като предпазна мярка (0, RadStraight); // задаване на LEDsbyteTx (CmdLeds); byteTx (((сензори [SenVWall])? LEDPlay: 0x00) | (inRange? LEDAdvance: 0x00)); byteTx (сензори [SenCharge1]); byteTx (64); IRDetected? LED2On: LED2Off; inRange? (10); if (UserButtonPressed) {delayAndUpdateSensors (1000); // активен цикъл (! (UserButtonPressed) && (! Сензори [SenCliffL]) && (! Сензори [SenCliffFL]) && (! Сензори [SenCliffFR]) && (! сензори [SenCliffR])) {byteTx (CmdLeds); byteTx (((сензори [SenVWall])? LEDPlay: 0x00) | (inRange? LEDAdvance: 0x00)); byteTx (сензори [SenCharge1]); byteTx (255); ? LED2On: LED2Off; inRange? LED1On: LED1Off; switch (state) {case Ready: if (sensors [SenVWall]) {// проверете за близост до leaderif (inRange) {drive (0, RadStraight);} else {// шофиране директно (SlowSpeed, RadStraight); state = Follow;}} else {// търсене на beamangle = 0; distance = 0; wait_counter = 0; намерено = FALSE; диск (SearchSpeed, RadCCW); състояние = SearchingLeft;} прекъсване; регистър Следващ: if (сензори [SenBumpDrop] & BumpRight) {разстояние = 0; ъгъл = 0; задвижване (-SlowSpeed, RadStraight); state = BackingTraceLeft;} else if (sensors [SenBumpDrop] & BumpLeft) {distance = 0; angle = 0; drive (-SlowSpeed, RadStraight); state = BackingTraceRight;} else if (sensors [SenVWall]) {// проверете за близост до leaderif (inRange) {drive (0, RadStraight); state = Ready;} else {// шофиране директно (FullSpeed, RadStraight); state = Follow;}} else {// току -що загуби сигнала, продължете бавно cycledistance = 0; drive (SlowSpeed, RadStraight); state = WasFollowing;} break; case WasFollowing: if (сензори [SenBumpDrop] & BumpRight) {разстояние = 0; ъгъл = 0; задвижване (-SlowSpeed, RadStraight); state = BackingTraceLeft;} else if (sensors [SenBumpDrop] & BumpLeft) {distance = 0; angle = 0; drive (-SlowSpeed, RadStraight); state = BackingTraceRight;} else if (sensors [SenVWall]) {// проверете за близост до leaderif (inRange) {диск (0, RadStraight); състояние = R eady;} else {// шофиране директно (FullSpeed, RadStraight); state = Follow;}} else if (distance> = CoastDistance) {drive (0, RadStraight); state = Ready;} else {drive (SlowSpeed, RadStraight);} break; регистър SearchingLeft: if (намерен) {if (ъгъл> = ExtraAngle) {диск (SlowSpeed, RadStraight); state = Follow;} else {диск (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 = Следване;} else {drive (SearchSpeed, RadCW);}} else if (датчици [SenVWall]) {found = TRUE; ъгъл = 0; if (inRange) {drive (0, RadStraight); state = Ready;} else {drive (SearchSpeed, RadCCW);}} else if (wait_counter> 0) {wait_counter -= 20; drive (0, RadStraight);} else if (angle = Search RightAngle) {drive (0, RadStraight); wait_counter = 5000; angle = 0;} else {drive (SearchSpeed, RadCW);} break; case TracingLeft: if (sensors [SenBumpDrop] & BumpRight) {distance = 0; angle = 0; drive (-SlowSpeed, RadStraight); state = BackingTraceLeft;} else if (sensors [SenBumpDrop] & BumpLeft) {drive (0, RadStraight); state = Ready;} else if (sensors [SenVWall]) {// проверете за близост до leaderif (inRange) {drive (0, RadStraight); state = Ready;} else {// шофиране директно (SlowSpeed, RadStraight); state = Follow;}} else if (! (distance> = TraceDistance)) { drive (SlowSpeed, RadStraight);} else if (! (-angle> = TraceAngle)) {drive (SearchSpeed, RadCW);} else {distance = 0; ъгъл = 0; drive (SlowSpeed, RadStraight); state = Ready; } break; case TracingRight: if (sensors [SenBumpDrop] & BumpRight) {drive (0, RadStraight); state = Ready;} else if (sensors [SenBumpDrop] & BumpLeft) {distance = 0; ъгъл = 0; drive (- SlowSpeed, RadStraight); state = BackingTraceRight;} иначе ако (сензори [SenVWall]) {// проверете за близост до leaderif (inRang д) {drive (0, RadStraight); state = Ready;} else {// шофиране директно (SlowSpeed, RadStraight); state = Follow;}} else if (! (distance> = TraceDistance)) {drive (SlowSpeed, RadStraight);} else if (! (angle> = TraceAngle)) {drive (SearchSpeed, RadCCW);} else {distance = 0; angle = 0; drive (SlowSpeed, RadStraight); state = Ready;} break; case BackingTraceLeft: if (сензори [SenVWall] && inRange) {задвижване (0, RadStraight); състояние = Готово;} иначе ако (ъгъл> = TraceAngle) {разстояние = 0; ъгъл = 0; задвижване (SlowSpeed, RadStraight); state = TracingLeft; } else if (-distance> = BackDistance) {drive (SearchSpeed, RadCCW);} else {drive (-SlowSpeed, RadStraight);} break; case BackingTraceRight: if (sensors [SenVWall] && inRange) {drive (0, RadStraight); state = Ready;} else if (-angle> = TraceAngle) {distance = 0; angle = 0; drive (SlowSpeed, RadStraight); state = TracingRight;} else if (-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);}}} // Серийно приемане на прекъсване за съхраняване на стойностите на сензора SIGNAL (SIG_USART_RECV) {uint8_t temp; temp = UDR0; if (sensors_flag) {sensors_in [sensors_index ++] = temp; if (sensors_index> = Sen6Size) sensors_flag = 0;}} // Таймер 1 прекъсване към времеви закъснения в msSIGNAL (SIG_OUTPUT_COMPARE1A) {if (timer_cnt) timer_cnt-; elsetimer_on = 0;} // Предава байт през серийния портvoid byteTx (uint8_t стойност) {while (! (UCSR0A & _BV (UDRE0)); UDR0 = стойност;} // Забавяне за посоченото време в ms без актуализиране на стойностите на сензора void delayMs (uint16_t time_ms) {timer_on = 1; timer_cnt = time_ms; while (timer_on);} // Забавяне за посоченото време в ms и проверка на секундата IR детектор void delayAndCheckIR (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));} // Забавяне за посоченото време в ms и актуализиране на стойностите на сензора void delayAndUpdateSensors (uint16_t time_ms) {uint8_t temp; timer_on = 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;}}} // Инициализиране на контрола на ума & aposs ATmega168 микроконтролерvoid инициализира (void) {cli (); // Задайте I/O пинове DDRB = 0x10; PORTB = 0xCF; DDRC = 0x00; PORTC = 0xFF; DDRD = 0xE6; PORTD = 0x7D; // Настройте таймер 1, за да генерирате прекъсване на всеки 1 msTCCR1A = 0x00; TCCR1B = (_BV (WGM12) | _BV (CS12)); OCR1A = 71; TIMSK1 = _BV (OCIE1A); // Настройте серийния порт с прекъсване RXUBRR0 = 19; UCSR0B = (_BV (RXCIE0) | _BV (TXEN0) | _BV (RXEN0]); ! RobotIsOn) {RobotPwrToggleLow; delayMs (500); // Забавяне в това състояниеRobotPwrToggleHigh; // Нисък към висок преход за превключване powerdelayMs (100); // Забавяне в това състояниеRobotPwrToggleLow;} delayMs (3500); // Забавяне за стартиране}} // Превключване на скоростта на предаване на данни както на Създаване, така и на модул </b> void boud (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; иначе ако (baud_code == Baud57600) UBRR0 = Ubrr57600; else if (baud_code == Baud38400) UBRR0 = Ubrr38400; else if (baud_code == Baud28800) UBRR0 = Ubrr28800; else if (baud_code == Baud19200) UBRR0 = Ubrr19200; иначе if (baud_code == Baud14400) if (baud_code == Baud9600) UBRR0 = Ubrr9600; else if (baud_code == Baud4800) UBRR0 = Ubrr4800; иначе if (baud_code == Baud2400) UBRR0 = Ubrr2400; baud_code == Baud600) UBRR0 = Ubrr600; иначе if (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));}
Препоръчано:
Как да си направим безжичен телефон с консерва! (Уоки токи Arduino): 7 стъпки (със снимки)
Как да си направим безжичен телефон с консерва! (Ардуино уоки токи): Точно онзи ден бях в средата на много важно телефонно обаждане, когато банановият ми телефон спря да работи! Бях толкова разочарован. Това е последният път, когато пропускам обаждане заради този глупав телефон! (Като се върна назад, може би малко се ядосах
Как да си направим линеен задвижващ механизъм: 3 стъпки
Как да си направим линеен задвижващ механизъм: Линейните задвижващи механизми са машини, които преобразуват въртенето или всяко движение в движение с натиск или издърпване
КАК ДА НАПРАВИМ ARDUINO NANO/MINI - Как да запишете Bootloader: 5 стъпки
КАК ДА НАПРАВИМ ARDUINO NANO/MINI | Как да запиша Bootloader: В тази инструкция ще ви покажа как да направите Arduino MINI от нулата. Процедурата, написана в тази инструкция, може да се използва за направата на всякакви дъски arduino за вашите изисквания по проект. Моля, гледайте видеото за по -добро разбиране на
Музикална реактивна светлина -- Как да направим супер проста музикална реактивна светлина, за да направим работния плот привлекателен .: 5 стъпки (със снимки)
Музикална реактивна светлина || Как да направим супер проста музикална реактивна светлина за създаване на страхотен работен плот. Хей какво става, момчета, днес ще изградим много интересен проект. Днес ще изградим реактивна музикална светлина. Светодиодът ще промени яркостта си според басът, който всъщност е нискочестотен аудио сигнал. Изграждането му е много просто. Ние ще
Как да си направим календар на баба и дядо & Записник (дори ако не знаете как да записвате): 8 стъпки (със снимки)
Как да си направим календар на баба и дядо & Записник (дори и да не знаете как да записвате): Това е много икономичен (и много ценен!) Празничен подарък за баби и дядовци. Направих 5 календара тази година за по -малко от $ 7 всеки. Материали: 12 страхотни снимки на вашето дете, деца, племенници, племенници, кучета, котки или други роднини12 различни парчета