Мазмуну:

Робо-беллопту кантип жасоо керек: 3 кадам
Робо-беллопту кантип жасоо керек: 3 кадам

Video: Робо-беллопту кантип жасоо керек: 3 кадам

Video: Робо-беллопту кантип жасоо керек: 3 кадам
Video: Голубая стрела (1958) фильм 2024, Ноябрь
Anonim

By jeffreyfFollow Автордун дагы:

IRobot Create Scholarship чакан сынагына кантип кирсе болот
IRobot Create Scholarship чакан сынагына кантип кирсе болот
IRobot Create Scholarship чакан сынагына кантип кирсе болот
IRobot Create Scholarship чакан сынагына кантип кирсе болот
LOLCats, Meme мышыктары, Мышык макростары же мышыктын сүрөттөрүн күлкүлүү жазуулар менен кантип жасаса болот
LOLCats, Meme мышыктары, Мышык макростары же мышыктын сүрөттөрүн күлкүлүү жазуулар менен кантип жасаса болот
LOLCats, Meme мышыктары, Мышык макростары же мышыктын сүрөттөрү күлкүлүү коштомо жазуулар менен кантип жасалат
LOLCats, Meme мышыктары, Мышык макростары же мышыктын сүрөттөрү күлкүлүү коштомо жазуулар менен кантип жасалат

Жөнүндө: Мен нерселерди бөлүп алып, кантип иштээрин билүүнү жакшы көрөм. Мен андан кийин жалпысынан кызыгуумду жоготом. Джеффрейф жөнүндө көбүрөөк маалымат »

Бул Нускамада iRobot Createти кантип кыймылдуу коңгуроо кылуу үчүн колдонуу керектиги көрсөтүлгөн. Бул толугу менен carolDancerдин көрсөтмөсүнүн уруксаты менен алынып салынды, жана мен аны биздин конкурска үлгү катары киргиздим. чейин Негизги Түзүүчүнүн үстүнө бин салынган жана анын ээсинин IR өткөргүчүн ээрчүү үчүн борттогу эки IR детекторун колдонот. Программалык камсыздоонун эң жөнөкөй коду менен, колдонуучу оор азык -түлүктөрдү, чоң жүктөрдү же түнкү сумкаңызды Robo -BellHopко салып, роботтун көчөдө, соода борборунда, коридордо же аэропортто ээрчип кетүүсүн камсыздай алат - - Колдонуучу кайда барбасын. Негизги операция 1) Комуз модулун күйгүзүү үчүн Reset баскычын басып, сенсорлордун иштешин текшериңиз 1а) Play LED сизди ээрчиген IR өткөргүчтү көргөндө күйүшү керек1b) Advance LED робот абдан жакын аралыкта 2) Robo-BellHop тартибин иштетүү үчүн кара жумшак баскычка басыңыз Анан себетти жүктөңүз жана кетиңиз! диапазону (өтө алыс же өтө курч бурч менен), робот сигналды кайра алган учурда кыска ылдамдыкта кыска аралыкты басып өтөт4c) Эгерде IR сигналы аныкталбаса, робот оңго жана солго бурулат сигналды кайра табууга аракет кылыңыз4d) Эгерде IR сигналы аныкталып жатса, бирок робот тоскоолдукка урунса, робот тоскоолдукту айланып өтүүгө аракет кылат4e) Эгерде робот IR сигналына өтө жакын болсо, робот токтоп калат. Hardware1 iRobot виртуалдык дубал бирдиги - RadioShackтан $ 301 IR детектору - Radio Shackтан $ 31 DB -9 эркек туташтыргычы - Home Depotтон $ 44 6-32 бурамалар - $ 2.502 3V батареялары, мен D1 кир жуучу себетин колдондум - $ 51 кошумча дөңгөлөк артында робот түзүүЭлектр тасмасы, зым жана ширетүүчү

1 -кадам: IR сенсорун жабуу

Create роботунун маңдайындагы IR сенсорунун кичинекей тешигинен башкасын жабуу үчүн электр лентасын бекит. Виртуалдык дубал бирдигин ажыратып, блоктун маңдайындагы кичинекей схеманы алыңыз. Бул бир аз татаал, анткени жашыруун бурамалар жана пластикалык орнотмолор көп. IR өткөргүч схемада. IR чагылышын болтурбоо үчүн IR өткөргүчүн кагаз кагаз менен жабыңыз. Электрондук тактаны томугуңузду ороп ала турган боого же ийкемдүү боого бекиңиз. Батареяларды ыңгайлуу жерге жайгаштыруу үчүн, батареяларды схемага өткөрүңүз (мен батареяларды чөнтөгүмө салып коюш үчүн жасадым).

2-IR IR детекторун DB-9 туташтыргычына туташтырыңыз жана Cargo Bay ePort pin 3 (сигнал) жана пин 5 (жерге) салыңыз. Экинчи IR детекторун Түзүү боюнча учурдагы IR сенсорунун үстүнө тиркеп, 2 -чи IR детектору эмитентти сиз каалаган аралыкта көрбөй калгыча, аны бир нече кат кагаз кагазы менен жаап коюңуз. сени ургандан. Сиз муну Reset баскычын баскандан кийин текшере аласыз жана токтоочу аралыкта болгондо Advance LEDинин күйүп турганын көрө аласыз.

2 -кадам: Себетти тиркөө

Себетти 6-32 бурамалар менен бекиткиле. Мен жөн эле себетти Create роботунун үстүнө орноттум. Ошондой эле арткы дөңгөлөктү жылдырыңыз, ошондо сиз Create роботунун артына салмагын саласыз.

Эскертүүлөр: - Робот бир аз жүктү көтөрө алат, жок дегенде 30 фунт. - Кичинекей өлчөмү кандайдыр бир багажды алып жүрүүнүн эң кыйын бөлүгү болуп көрүндү - IR абдан темпераменттүү. Балким, сүрөт тартууну колдонуу жакшыраак, бирок алда канча кымбат

3 -кадам: Булак кодун жүктөп алыңыз

Булак кодун жүктөп алыңыз
Булак кодун жүктөп алыңыз

Булак коду төмөнкүдөй жана текст файлына тиркелет:

/************************************************* ******************** follow.c ** -------- ** Command Module түзүү ** боюнча иштейт IR сенсорунун ** Түзүү виртуалдык дубалды ээрчип (же кандайдыр бир ИК ** күч талаасынын сигналын жөнөтөт) жана процесстеги тоскоолдуктардан качат деп үмүттөнөбүз ***************** ************************************************ **/#interrupt.h>#include io.h>#include#include "oi.h"#анык TRUE 1#аныктоо ЖАЛГАН 0#аныктоо FullSpeed 0x7FFF#аныктоо SlowSpeed 0x0100#аныктоо SearchSpeed 0x0100#аныктоо ExtraAngle 10#аныктоо SearchLeftAngle 125#аныктоо SearchRightAngle (SearchLeftAngle - 1000)#CoastDistance 150ны аныктоо#TraceDistance 250#аныктоо TraceAngle 30#арткы аралыкты аныктоо 25#IRDetected аныктоо (~ PINB & 0x01) // мамлекеттер#даяр 0#аныктоо кийинки 1#аныктоо WasFollowing 2 #аныктоо SearchingLeft 3#аныктоо SearchingRight 4#аныктоо TracingLeft 5#аныктоо TracingRight 6#аныктоо BackingTraceLeft 7#аныктоо BackingTraceRight 8 // Global variablesv olatile uint16_t timer_cnt = 0; учуучу uint8_t timer_on = 0; учуучу uint8_t sensors_flag = 0; учуучу uint8_t sensors_index = 0; учуучу uint8_t sensors_in [Sen6Size]; учуучу 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 void (void) void void (void) baud (uint8_t baud_code); боштук диск (int16_t ылдамдыгы, int16_t радиусу); uint16_t randomAngle (боштук); void defineSongs (боштук); int main (боштук) {// абал өзгөрмөсү8_t абалы = Даяр; int found = 0; int wait_counter = 0; // Create жана moduleinitialize (); LEDBothOff; powerOnRobot (); byteTx (CmdStart); baud (Baud28800); byteTx (CmdControl); byteTx (CmdFull); // экинчи IR сенсоруна i/o орнотууDDRB & = ~ 0x01; // ePort жүк ташуучу пин 3тү inputPORTB кылып коюңуз | = 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);} башка {// drivedrive (SlowSpeed, RadStraight); state = Follow;}} else {// beamangle = 0; distance = 0; wait_counter = 0; табылды = ЖАЛГАН; диск (SearchSpeed, RadCCW); state = SearchingLeft;} тыныгуу; кийинки окуя: эгерде (сенсорлор [SenBumpDrop] & BumpRight) {аралык = 0; бурч = 0; диск (-SlowSpeed, RadStraight); state = BackingTraceLeft;} else if (сенсорлор [SenBumpDrop] & BumpLeft) {расстояние = 0; бурч = 0; драйв (-SlowSpeed, RadStraight); state = BackingTraceRight;} башка if (сенсорлор [SenVWall]) {// текшерүү лидерге жакындык (inRange) {drive (0, RadStraight); state = Ready;} else {// drive straightdrive (FullSpeed, RadStraight); state = Follow;}} башка {// жөн эле сигналды жоготуп койдук, жай бара бер cycledistance = 0; drive (SlowSpeed, RadStraight); state = WasFollowing;} break; case WasFollowing: if (сенсорлор [SenBumpDrop] & BumpRight) {расстояние = 0; бурч = 0; диск (-SlowSpeed, RadStraight); мамлекет = BackingTraceLeft;} if if (сенсорлор [SenBumpDrop] & BumpLeft) {расстояние = 0; бурч = 0; драйв (-SlowSpeed, RadStraight); state = BackingTraceRight;} else if (сенсорлор [SenVWall]) {// Leaderifтин жакындыгын текшерүү (inRange) {drive (0, RadStraight); state = R eady;} else {// drivedrive (FullSpeed, RadStraight); state = Follow;}} if if (distance> = CoastDistance) {drive (0, RadStraight); state = Ready;} else {drive (SlowSpeed, RadStraight);} break; case SearchingLeft: if (found) {if (angle> = ExtraAngle) {drive (SlowSpeed, RadStraight); state = Follow;} else {drive (SearchSpeed, RadCCW);}} if if (sensors [SenVWall]) {табылган = ЧЫН; бурч = 0; эгерде (inRange) {диск (0, RadStraight); абал = Даяр;} башка {диск (SearchSpeed, RadCCW);}} башка if (бурч> = SearchLeftAngle) {диск (SearchSpeed, RadCW); wait_counter = 0; state = SearchingRight;} башка {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);} else 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 lidif (inRange) жакындыгы үчүн {drive (0, RadStraight); state = Ready;} else {// drive straightdrive (SlowSpeed, RadStraight); state = Follow;}} else if (! (distance> = 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 (sensors [SenBumpDrop] & BumpRight) {drive (0, RadStraight); state = Ready;} if if (sensors [SenBumpDrop] & BumpLeft) {distance = 0; angle = 0; drive (- SlowSpeed, RadStraight); state = BackingTraceRight;} else if (сенсорлор [SenVWall]) {// Leaderifке жакындыгын текшерүү (inRang e) {drive (0, RadStraight); state = Ready;} else {// drive straightdrive (SlowSpeed, RadStraight); state = Follow;}} if if (! (distance> = TraceDistance)) {drive (SlowSpeed, RadStraight);} башка if (! (бурч> = TraceAngle)) {диск (SearchSpeed, RadCCW);} башка {аралык = 0; бурч = 0; диск (SlowSpeed, RadStraight); абал = Даяр;} тыныгуу; Case BackingTraceLeft: if (сенсорлор [SenVWall] && inRange) {drive (0, RadStraight); state = Ready;} if if (angle> = TraceAngle) {distance = 0; angle = 0; drive (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); абал = Даяр;} башка if (-angle> = TraceAngle) {расстояние = 0; бурч = 0; диск (SlowSpeed, RadStraight); state = TracingRight;} башка 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;} // byteTx сериялык портвоид byteTx (uint8_t мааниси) {while (! (UCSR0A & _BV) (UDRE0) аркылуу өткөрүп берүү UDR0 = маани;} // Белгиленген убакытка мс боюнча кечигүү сенсордук баалуулуктарды жаңыртпастан delayMs (uint16_t time_ms) {timer_on = 1; timer_cnt = time_ms; while (timer_on);} // Белгиленген убакытты мс менен кармоо жана секундасын текшерүү IR detectorvoid 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));} // Белгиленген убакыттын кечиктирилиши мс жана жаңыртуу сенсорунун маанилери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;}}} // Mind Controlту баштоо & aposs ATmega168 микроконтроллерин баштоо (жараксыз) {cli (); // I/O пиндерин коюуDDRB = 0x10; PORTB = 0xCF; DDRC = 0x00; PORTC = 0xFF; DDRD = 0xE6; PORTD = 0x7D; // 1 таймерди ар бир 1 msTCCR1A = 0x00 түзүү үчүн орнотуңуз; (WGM12) | _BV (CS12)); OCR1A = 71; TIMSK1 = _BV (OCIE1A); // rx interruptUBRR0 = 19 менен сериялык портту орнотуу; UCSR0B = (_BV (RXCIE0) | _BV (TXEN0) | _BV (RXEN0))); UCSR0C = (_BV (UCSZ00) | _BV (UCSZ01));; ! 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 rate registerifти которуу (baud_code == Baud115200) UBRR0 = Ubrr115200; else if (baud_code == Baud57600) UBRR0 = Ubr; else if (baud_code == Baud38400) UBRR0 = Ubrr38400; else if (baud_code == Baud28800) UBRR0 = Ubrr28800; else if (baud_code == Baud19200) UBRR0 = Ubrr19200; else if (baud_r44 == Baud_c000 == if (baud_code == Baud9600) UBRR0 = Ubrr9600; else if (baud_code == Baud4800) UBRR0 = Ubrr4800; else if (baud_code == Baud2400) UBRR0 = Ubrr2400; else if (baud_code = URRR0000) baud_code == Baud600) UBRR0 = Ubrr600; башка болсо (baud_code == Baud300) UBRR0 = Ubrr300; sei (); delayMs (100);}} // Send Drive командаларын ылдамдык жана радиустук диск (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));}

Сунушталууда: