Satura rādītājs:

Kā izveidot Robo-Bellhop: 3 soļi
Kā izveidot Robo-Bellhop: 3 soļi

Video: Kā izveidot Robo-Bellhop: 3 soļi

Video: Kā izveidot Robo-Bellhop: 3 soļi
Video: Kā izveidot eParaksts mobile ar eID karti 2024, Novembris
Anonim

Sekojiet vairāk autora:

Kā piedalīties mini konkursā iRobot Create Scholarship
Kā piedalīties mini konkursā iRobot Create Scholarship
Kā piedalīties mini konkursā iRobot Create Scholarship
Kā piedalīties mini konkursā iRobot Create Scholarship
Kā izveidot LOLCats, Meme kaķus, kaķu makro vai kaķu attēlus ar smieklīgiem parakstiem
Kā izveidot LOLCats, Meme kaķus, kaķu makro vai kaķu attēlus ar smieklīgiem parakstiem
Kā izveidot LOLCats, Meme kaķus, kaķu makro vai kaķu attēlus ar smieklīgiem parakstiem
Kā izveidot LOLCats, Meme kaķus, kaķu makro vai kaķu attēlus ar smieklīgiem parakstiem

Par: Man patīk izjaukt lietas un izdomāt, kā tās darbojas. Pēc tam es vispār zaudēju interesi. Vairāk par Džefriju »

Šajā pamācībā ir parādīts, kā izmantot iRobot Create, lai izveidotu kustīgu zvanu. Tas tika pilnībā atcelts ar CarolDancer norādījumu atļauju, un es to ievietoju kā paraugu mūsu konkursam. Robo-BellHop var būt jūsu personīgais asistents somu, pārtikas preču, veļas utt. Nēsāšanai, tāpēc jums nav uz. Pamata Create ir augšpusē piestiprināta tvertne, un tā izmanto divus iebūvētus IR detektorus, lai sekotu tā īpašnieka IR raidītājam. Izmantojot ļoti vienkāršu C programmatūras kodu, lietotājs var uzlikt Robo -BellHop smagus pārtikas produktus, lielu veļas kravu vai jūsu naktssomu un likt robotam sekot jums pa ielu, pa tirdzniecības centru, gaiteni vai lidostu - - lai kur lietotājam būtu jādodas. Pamata darbība robots atrodas ļoti tuvu2) nospiediet mīksto mīksto pogu, lai palaistu Robo-BellHop rutīnu3) pievienojiet infrasarkano staru raidītāju potītei un pārliecinieties, vai tas ir ieslēgts. Tad ielieciet grozu un dodieties! 4) Robo-BellHop loģika ir šāda: 4a) Staigājot apkārt, ja tiek uztverts IR signāls, robots brauks ar maksimālo ātrumu4b) Ja IR signāls iziet no diapazonā (pārāk tālu vai pārāk asu leņķi), robots lēnā ātrumā veiks nelielu attālumu, ja signāls tiks atkal uztverts 4c) Ja IR signāls netiek atklāts, robots pagriezīsies pa kreisi un pa labi mēģiniet vēlreiz atrast signālu4d) Ja tiek uztverts IR signāls, bet robots ietriecas šķērslī, robots mēģinās apbraukt šķērsli4e) Ja robots nokļūst ļoti tuvu IR signālam, robots apstāsies, lai izvairītos no sitiena. īpašnieka potītes Hardware1 iRobot virtuālā sienas iekārta - 301 USD IR detektors no RadioShack - 31 USD DB -9 vīriešu savienotājs no Radio Shack - 44 USD 6-32 skrūves no Home Depot - 2,502 USD 3V baterijas, es izmantoju D1 veļas grozu no Target - 51 USD papildu ritenis uz elektriskā lente, vads un lodēt

1. solis: IR sensora pārklāšana

Pievienojiet elektrisko lenti, lai pārklātu visu, izņemot nelielu, IR sensora spraugu Create robota priekšpusē. Demontējiet virtuālo sienas bloku un izņemiet mazo shēmas plati ierīces priekšpusē. Tas ir nedaudz sarežģīti, jo ir daudz slēptu skrūvju un plastmasas stiprinājumu. IR raidītājs atrodas uz shēmas plates. Pārklājiet IS raidītāju ar salvetes papīru, lai izvairītos no IR atstarošanas. Piestipriniet shēmas plati pie siksnas vai elastīgās joslas, kas var aptīt jūsu potīti. Pievienojiet baterijas pie shēmas plates, lai tās varētu novietot ērtā vietā (es to izveidoju tā, lai varētu ievietot baterijas kabatā).

Pievienojiet otro IR detektoru pie DB-9 savienotāja un ievietojiet Cargo Bay ePort tapā 3 (signāls) un tapā 5 (zemējums). Pievienojiet 2. IR detektoru esošā IR sensora augšpusē vietnē Create un pārklājiet to ar pāris salvešpapīra slāņiem, līdz 2. IR detektors neredz izstarotāju tādā attālumā, kādā vēlaties, lai Create robot apstātos. no sitiena tev. To var pārbaudīt pēc tam, kad esat nospiedis pogu Atiestatīt, un noskatīties, kā iedegas LED, lai iedegtos, kad esat apstāšanās attālumā.

2. darbība: pievienojiet grozu

Piestipriniet grozu, izmantojot 6-32 skrūves. Es tikko uzstādīju grozu Create robota augšpusē. Bīdiet arī aizmugurējo riteni, lai jūs novietotu svaru uz izveides robota aizmugures.

Piezīmes: - Robots var pārvadāt diezgan lielu slodzi, vismaz 30 mārciņas. - Mazais izmērs šķita visgrūtākais, lai tas varētu pārvadāt jebkuru bagāžu - IR ir ļoti temperamentīgs. Varbūt attēlveidošana ir labāka, taču tā ir daudz dārgāka

3. darbība: lejupielādējiet avota kodu

Lejupielādējiet avota kodu
Lejupielādējiet avota kodu

Avota kods ir pievienots teksta failā:

/************************************************ ******************** follow.c ** -------- ** darbojas uz Izveidot komandu moduli ** aptver visu, izņemot nelielu atveri priekšpusē no IS sensora ** Izveide sekos virtuālai sienai (vai jebkurai infrasarkanai ierīcei, kas izsūta ** spēka lauka signālu) un cerams izvairīsies no šķēršļiem procesā ***************** ************************************************* **/#include interrupt.h> #include io.h>#include#include "oi.h" #define TRUE 1#define FALSE 0#define FullSpeed 0x7FFF#define SlowSpeed 0x0100#define SearchSpeed 0x0100#define ExtraAngle 10#define SearchLeftAngle 125#define SearchRightAngle (SearchLeftAngle - 1000) #define CoastDistance 150#define TraceDistance 250#define TraceAngle 30#define BackDistance 25#definēt IRDetected (~ PINB & 0x01) // valstis#definēt Gatavs 0#definēt Pēc 1#definēt WasFollowing 2 #define SearchingLeft 3#define SearchingRight 4#define TracingLeft 5#define TracingRight 6#define BackingTraceLeft 7#define BackingTraceRight 8 // Globālie mainīgie v gaistošais uint16_t timer_cnt = 0; gaistošais uint8_t timer_on = 0; gaistošais uint8_t sensors_flag = 0; gaistošais uint8_t sensors_indekss = 0; gaistošais uint8_t sensors_in [Sen6Size]; gaistošais uint8_t sensors [Sen6Size 0t; = gaistošais volatile uint8_t inRange = 0; // Funkcijasvoid byteTx (uint8_t vērtība); void delayMs (uint16_t time_ms); void delayAndCheckIR (uint16_t time_ms); void delayAndUpdateSensors (neparakstīts int time_ms); void void; void; void void; void baud (uint8_t baud_code); void drive (int16_t ātrums, int16_t rādiuss); uint16_t randomAngle (void); void defineSongs (void); int main (void) {// state variableuint8_t state = Gatavs; int atrasts = 0; int gaidīšanas_skaitītājs = 0; // Iestatīt Izveidot un modificēt (); LEDBothOff; powerOnRobot (); baitsTx (CmdStart); baud (Baud28800); baitsTx (CmdControl); baitsTx (CmdFull); // iestatīt i/o otrajam IR sensoramDDRB & = ~ 0x01; // iestatiet kravas nodalījuma ePort tapu 3 par ievadiPORTB | = 0x01; // iestatīt kravas ePort pin3 pullup iespējošanu // programmas cilpa (TRUE) {// Apturēt tikai kā piesardzību brauciet (0, RadStraight); // iestatiet LEDsbyteTx (CmdLeds); byteTx (((sensori [SenVWall])? LEDPlay: 0x00) | (inRange? LEDAdvance: 0x00)); baitsTx (sensori [SenCharge1]); baitsTx (64); IRDetected? LED2On: LED2Off; inRange? LED1On: LED1Off; // meklē lietotāja pogu, pārbaudiet oftendelayAndUpdateSensors (10); delay 10 sensori [SenCliffR])) {byteTx (CmdLeds); byteTx (((sensori [SenVWall])? LEDPlay: 0x00) | (inRange? LEDAdvance: 0x00)); baitsTx (sensori [SenCharge1]); baitsTx (255); IRDetected ? LED2On: LED2Off; inRange? LED1On: LED1Off; slēdzis (stāvoklis) {case Ready: if (sensors [SenVWall]) {// pārbaudīt tuvumu līderim (inRange) {disks (0, RadStraight);} cits {// braukt taisni (SlowSpeed, RadStraight); state = Follow;}} else {// meklēt staru stūri = 0; distance = 0; wait_counter = 0; atrasts = FALSE; disks (SearchSpeed, RadCCW); state = SearchingLeft;} pārtraukums; gadījums Pēc: if (sensori [SenBumpDrop] & BumpRight) {distance = 0; leņķis = 0; disks (-SlowSpeed, RadStraight); state = BackingTraceLeft;} else if (sensori [SenBumpDrop] & BumpLeft) {distance = 0; angle = 0; drive (-SlowSpeed, RadStraight); state = BackingTraceRight;} else if (sensors [SenVWall]) {// pārbaudīt tuvums līderim (inRange) {drive (0, RadStraight); state = Ready;} else {// drive straightdrive (FullSpeed, RadStraight); state = Follow;}} else {// tikko zaudējis signālu, turpiniet lēnām cycledistance = 0; drive (SlowSpeed, RadStraight); state = WasFollowing;} pārtraukums; case WasFollowing: if (sensori [SenBumpDrop] & BumpRight) {distance = 0; leņķis = 0; piedziņa (-SlowSpeed, RadStraight); state = BackingTraceLeft;} else if (sensori [SenBumpDrop] & BumpLeft) {distance = 0; angle = 0; drive (-SlowSpeed, RadStraight); state = BackingTraceRight;} else if (sensors [SenVWall]) {// pārbaudīt tuvumu līderim (inRange) {disks (0, RadStraight); valsts = R eady;} else {// brauc taisni (pilns ātrums, RadStraight); valsts = seko;}} cits if (distance> = CoastDistance) {drive (0, RadStraight); state = Ready;} else {drive (SlowSpeed, RadStraight);} pārtraukums; gadījums SearchingLeft: ja (atrasts) {if (leņķis> = ExtraAngle) {disks (SlowSpeed, RadStraight); state = Follow;} else {drive (SearchSpeed, RadCCW);}} else if (sensori [SenVWall]) {found = TRUE; leņķis = 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 = Seko;} else {drive (SearchSpeed, RadCW);}} else if (sensors [SenVWall]) {found = TRUE; leņķis = 0; if (inRange) {drive (0, RadStraight); state = Ready;} else {disks (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; disks (-SlowSpeed, RadStraight); state = BackingTraceLeft;} else if (sensors [SenBumpDrop] & BumpLeft) {drive (0, RadStraight); state = Ready;} else if (sensors [SenVWall]) {// check priekš tuvuma līderim (inRange) {disks (0, RadStraight); valsts = gatavs;} cits {// brauc taisni (SlowSpeed, RadStraight); state = Follow;}} else if (! (distance> = TraceDistance)) { disks (SlowSpeed, RadStraight);} else if (! (-angle> = TraceAngle)) {drive (SearchSpeed, RadCW);} else {distance = 0; angle = 0; drive (SlowSpeed, RadStraight); state = Ready; } pārtraukums; gadījums TracingRight: ja (sensori [SenBumpDrop] & BumpRight) {disks (0, RadStraight); valsts = Gatavs;} cits, ja (sensori [SenBumpDrop] & BumpLeft) {distance = 0; angle = 0; drive (- SlowSpeed, RadStraight); state = BackingTraceRight;} else if (sensori [SenVWall]) {// pārbaudiet, vai tuvums līderim (inRang e) {drive (0, RadStraight); state = Ready;} else {// brauc taisni (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 (sensori [SenVWall] && inRange) {drive (0, RadStraight); state = Ready;} else if (leņķis> = 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)); stāvoklis = gatavs;} cits, ja (-stūris> = TraceAngle) {distance = 0; leņķis = 0; disks (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);} // konstatēta klints vai lietotāja poga, ļaujiet nosacījumam stabilizēties (piemēram, poga jāatbrīvo) disks (0, RadStraight); delayAndUpdateSensors (2000);}}} // Sērijas saņemšanas pārtraukšana, lai saglabātu sensora vērtības uz laika aizkavi msSIGNAL (SIG_OUTPUT_COMPARE1A) {if (timer_cnt) timer_cnt-; elsetimer_on = 0;} // Pārsūtīt baitu pa seriālo portvoid byteTx (uint8_t vērtība) {while (! (UCSR0A & _BV (UDRE0))) UDR0 = vērtība;} // Kavēšanās norādītajā laikā ms, neatjauninot sensora vērtības; nav kavēšanāsMs (uint16_t time_ms) {timer_on = 1; timer_cnt = time_ms; while (timer_on);} // Kavēšanās norādītajā laikā ms un pārbaudiet sekundi IR detektoram nav kavēšanāsAndCheckIR (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));} // Kavēšanās norādītajā laikā ms un atjaunināt sensora vērtībasvoid 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 ++) sensori [temp] = sensors_in [temp]; // Atjaunināt distances un leņķiskās distances skriešanas kopsummas += (int) ((sensori [SenDist1] 8) | sensori [SenDist0]); leņķis += (int) ((sensori [SenAng1] 8) | sensori [SenAng0]); baitsTx (CmdSensors); baitsTx (6); sensors_indekss = 0; sensors_flag = 1;}}} // Inicializēt prāta kontroli & aposs ATmega168 mikrokontrolleru inicializēšana (anulēts) {cli (); // Iestatīt I/O tapasDDRB = 0x10; PORTB = 0xCF; DDRC = 0x00; PORTC = 0xFF; DDRD = 0xE6; PORTD = 0x7D; // Iestatiet taimeri 1, lai radītu pārtraukumu ik pēc 1 msTCCR1A = 0x00; TCCR1B = (_BV (WGM12) | _BV (CS12)); OCR1A = 71; TIMSK1 = _BV (OCIE1A); // Iestatiet seriālo portu ar rx interruptUBRR0 = 19; UCSR0B = (_BV (RXCIE0) | _BV (TXEN0) | _BV (RXEN0)); UCSR0C = (_BV (UCSZ00) | _BV (UCSZ01)); // Ieslēgt interruptssei ();} void powerOnRobot (void) {// Ja Izveides un atlaišanas barošana ir izslēgta, ieslēdziet to onif (! RobotIsOn) {while (! RobotIsOn) {RobotPwrToggleLow; delayMs (500); // Kavēšanās šajā stāvoklīRobotPwrToggleHigh; // No zemas uz augstu pāreju uz pārslēgšanas powerdelayMs (100); // Kavēšanās šajā stāvoklīRobotPwrToggleLow;} delayMs (3500); // Palaišanas aizkave}} // Ieslēdziet datu pārraides ātrumu gan izveidei, gan modulim nederīgam baudam (uint8_t baud_code) {if (baud_code = 11) {byteTx (CmdBaud); UCSR0A | = _BV (TXC0); baitsTx (baud_code);/ / Pagaidiet, kamēr pārraide ir pabeigta (! (UCSR0A & _BV (TXC0))); cli (); // Pārslēdziet pārraides ātruma reģistru (baud_code == Baud115200) UBRR0 = Ubrr115200; citādi, ja (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; else if (baud_code == BaR14400) if (baud_code == Baud9600) UBRR0 = Ubrr9600; else if (baud_code == Baud4800) UBRR0 = Ubrr4800; else if (baud_code == Baud2400) UBRR0 = Ubrr2400; else if (baud_code == Baud1200) if UBR00; baud_code == Baud600) UBRR0 = Ubrr600; else if (baud_code == Baud300) UBRR0 = Ubrr300; sei (); delayMs (100);}} // Sūtīt Izveidot diska komandas ātruma un rādiusveida diska izteiksmē (int16_t ātrums, int16_t rādiuss) {baitsTx (CmdDrive); baitsTx ((uint 8_t) ((ātrums >> 8) & 0x00FF)); baitsTx ((uint8_t) (ātrums & 0x00FF)); baitsTx ((uint8_t) ((rādiuss >> 8) un 0x00FF)); baitsTx ((uint8_t) (rādiuss & 0x00FF));}

Ieteicams: