Përmbajtje:
Video: Si të bëni një Robo-Bellhop: 3 hapa
2024 Autor: John Day | [email protected]. E modifikuara e fundit: 2024-01-30 12:29
Ndiqni më shumë nga autori:
Rreth: Më pëlqen t’i ndaj gjërat dhe të kuptoj se si funksionojnë. Në përgjithësi, unë humbas interesin pas kësaj. Më shumë rreth Jeffreyf »
Ky udhëzues tregon se si të përdorni iRobot Krijo për të bërë një kambanë lëvizëse. Kjo u hoq plotësisht me lejen nga udhëzimet e carolDancer, dhe unë e vendosa atë si një hyrje shembull për konkursin tonë. Robo-BellHop mund të jetë asistenti juaj personal për të mbajtur çantat, ushqimet, lavanderi, etj., Kështu që ju nuk keni te Krijimi bazë ka një kosh të bashkangjitur në krye dhe përdor dy detektorë IR në bord për të ndjekur transmetuesin IR të pronarit të tij. Me kodin bazë të softuerit C, përdoruesi mund të sigurojë ushqime të rënda, një ngarkesë të madhe lavanderi ose çantën tuaj gjatë natës në Robo -BellHop dhe të kërkojë që roboti t'ju ndjekë në rrugë, nëpër qendrën tregtare, poshtë sallës ose përmes aeroportit - - kudo që përdoruesi duhet të shkojë. Funksionimi bazë 1) Goditni butonin Reset për të ndezur modulin e komandës dhe kontrolloni sensorët që janë të përfshirë1a) LED -i i luajtjes duhet të ndizet kur sheh transmetuesin IR që ju ndjek roboti është në një distancë shumë të afërt2) Shtypni butonin e zi të zi për të ekzekutuar rutinën Robo-BellHop3) Lidhni transmetuesin IR në kyçin e këmbës dhe sigurohuni që është ndezur. Pastaj ngarkoni shportën dhe shkoni! 4) Logjika e Robo-BellHop është si më poshtë: 4a) Ndërsa ecni përreth, nëse sinjali IR është duke u zbuluar, roboti do të ngasë me shpejtësinë maksimale4b) Nëse sinjali IR del jashtë diapazoni (duke qenë një kënd shumë i largët ose shumë i mprehtë), roboti do të përshkojë një distancë të shkurtër me shpejtësi të ngadaltë në rast se sinjali merret përsëri4c) Nëse sinjali IR nuk po zbulohet, roboti do të kthehet majtas dhe djathtas në një 4d) Nëse sinjali IR është duke u zbuluar por roboti godet një pengesë, roboti do të përpiqet të vozisë rreth pengesës4e) Nëse roboti i afrohet shumë sinjalit IR, roboti do të ndalet për të shmangur goditjen e kyçet e këmbës së pronarit Hardware1 njësia mur virtuale iRobot - 301 dollarë detektor IR nga RadioShack - 31 dollarë lidhës mashkull DB -9 nga Radio Shack - 44 dollarë 6-32 dollarë nga Home Depot - 2.502 dollarë bateri 3V, kam përdorur shportën e rrobave D1 nga Target - 51 dollarë rrota shtesë për në pjesa e pasme e shiritit Krijo robotin elektrik, tela dhe lidhës
Hapi 1: Mbulimi i sensorit IR
Bashkangjitni shiritin elektrik për të mbuluar të gjithë, përveç një të çarë të vogël të sensorit IR në pjesën e përparme të robotit Krijo. Çmontoni njësinë virtuale të murit dhe nxirrni tabelën e qarkut të vogël në pjesën e përparme të njësisë. Kjo është pak e ndërlikuar sepse ka shumë vida të fshehura dhe montime plastike. Transmetuesi IR është në tabelën e qarkut. Mbuloni transmetuesin IR me një copë letër indi për të shmangur reflektimet IR. Bashkangjitni bordin e qarkut në një rrip ose brez elastik që mund të mbështillet rreth kyçit të këmbës. Lidhni bateritë në tabelën e qarkut në mënyrë që të keni bateritë në një vend të rehatshëm (e kam bërë atë në mënyrë që të mund t'i fus bateritë në xhep).
Lidhni detektorin e dytë IR në lidhësin DB-9 dhe futeni në kargo Bay ePort pin 3 (sinjal) dhe pin 5 (tokë). Bashkangjitni detektorin e dytë IR në krye të sensorit IR ekzistues në Krijo dhe mbulojeni atë me disa shtresa letre indi derisa detektori i dytë IR nuk e sheh emetuesin në një distancë që dëshironi që roboti Krijo të ndalojë për ta mbajtur nga goditja jote. Ju mund ta provoni këtë pasi të keni shtypur butonin Reset dhe të shihni LED Advance për të vazhduar kur jeni në distancën e ndalimit.
Hapi 2: Bashkojeni Shportën
Bashkangjitni shportën duke përdorur 6-32 vida. Sapo e vendosa shportën në krye të robotit Krijo. Gjithashtu rrëshqisni në timonin e pasmë në mënyrë që të vendosni peshë në anën e pasme të robotit Krijo.
Shënime: - Roboti mund të mbajë mjaft ngarkesë, të paktën 30 kg. - Madhësia e vogël dukej se ishte pjesa më e vështirë në marrjen e saj për të mbajtur ndonjë bagazh - IR është shumë temperament. Ndoshta përdorimi i imazhit është më i mirë, por është shumë më i shtrenjtë
Hapi 3: Shkarkoni Kodin Burimor
Kodi burimor vijon dhe bashkëngjitet në një skedar teksti:
/********************************************* ******************* follow.c ** -------- ** funksionon në Krijo Modulin e Komandës ** mbuloni të gjitha hapjet, përveç të voglave në pjesën e përparme i sensorit IR ** Krijo do të ndjekë një mur virtual (ose ndonjë IR që dërgon sinjalin e fushës së forcës **) dhe shpresojmë të shmangë pengesat në proces ****************** ********************************************** **/#include interrupt.h> #include io.h>#përfshijnë#përfshijnë "oi.h" #përcakto TRUE 1#përcakto FALSE 0#përcakto FullSpeed 0x7FFF#përcakto SlowSpeed 0x0100#përcakto SearchSpeed 0x0100#përcakto ExtraAngle 10#përcakto SearchLeftAngle 125#define SearchRightAngle (SearchLeftAngle - 1000) #define CoastDistance 150#përcakto TraceDistance 250#përcakto TraceAngle 30#përcakto BackDistance 25#përcakto IRDetected (~ PINB & 0x01) // gjendjet#përcakto Gati 0#përcakto në vijim 1#përcakto WasFollowing 2 #define SearchingLeft 3#përcakto SearchingRight 4#përcakto TracingLeft 5#përcakto TracingRight 6#përcakto BackingTraceLeft 7#përcakto BackingTraceRight 8 // Global variablesv ointile uint16_t timer_cnt = 0; uint8_t timer_on i paqëndrueshëm = 0; sensorë_flag = 0; të paqëndrueshëm uint8_t; sensorë_index = 0; të paqëndrueshëm uint8_t sensorë_në [Sen6Size]; të paqëndrueshëm uint8_t sensorë 0 = 16; kënd = 016 i paqëndrueshëm uint8_t inRange = 0; // Funksionet shmang byteTx (vlera uint8_t); void delayMs (uint16_t time_ms); void delayAndCheckIR (uint16_t time_ms); void delayAndUpdateSensors (unsigned int time_ms); void void inoid (power) bar 0; // Konfiguro Krijo dhe modulizo (); LEDBothOff; powerOnRobot (); byteTx (CmdStart); baud (Baud28800); byteTx (CmdControl); byteTx (CmdFull); // vendos i/o për sensorin e dytë IRDDDRB & = X 0x01; // vendosni karrigen ePort pin 3 për të qenë një inputPORTB | = 0x01; // aktivizo tërheqjen e ngarkesës ePort pin3 // program loop while (TRUE) {// Ndalo vetëm si një masë paraprake (0, RadStraight); // vendos LEDsbyteTx (CmdLeds); byteTx ((((sensorët [SenVWall]))? LEDPlay: 0x00) | (inRange? LEDAdvance: 0x00)); byteTx (sensorë [SenCharge1]); byteTx (64); IRDetected? LED2On: LED2Off; inRange? LED1On: LED1Off; // duke kërkuar për butonin e përdoruesit, kontrolloni oftendelayAndUpdateSensorët (10); (10); në qoftë se (UserButtonPressed) {delayAndUpdateSensors (1000); // aktiv loop while (! (UserButtonPressed) && (!! Sensorë [SenCliffL]) && (! Sensorë [SenCliffFL]) && (! Sensorë [SenCliffFR]) && (! sensorë [SenCliffR])) {byteTx (CmdLeds); byteTx (((sensorë [SenVWall])? LEDPlay: 0x00) | (inRange? LEDAdvance: 0x00)); byteTx (sensorë [SenCharge1]); byteTx (255); IRDetected ? LED2On: LED2Off; inRange? LED1On: LED1Off; kaloni (gjendja) {rasti Gati: nëse (sensorë [SenVWall]) {// kontrolloni afërsinë me leaderif (inRange) {drive (0, RadStraight);} tjetër {// drejtoni drejtimin e makinës (SlowSpeed, RadStraight); gjendja = Ndjekja;}} tjetër {/kërko për trarët = 0; distanca = 0; pritja_kont. = 0; u gjet = FALSE; makinë (SearchSpeed, RadCCW); gjendje = SearchingLeft;} pushim; rast pas: nëse (sensorë [SenBumpDrop] & BumpRight) {distanca = 0; këndi = 0; ngasja (-SlowSpeed, RadStraight); gjendja = BackingTraceLeft;} tjetër nëse (sensorë [SenBumpDrop] & BumpLeft) {distanca = 0; këndi = 0; ngasja (-SlowSpeed, RadStraight); gjendja = BackingTraceRight;} tjetër nëse (sensorë [SenVWall]) {{kontrolloni për afërsia me leaderif (inRange) {disku (0, RadStraight); gjendja = Gati;} tjetër {// drive straightdrive (FullSpeed, RadStraight); state = Following;}} tjetër {// sapo humbi sinjalin, vazhdoni ngadalë një çiklistencë = 0; makinë (SlowSpeed, RadStraight); gjendje = WasFollowing;} pushim; rast WasFollowing: if (sensorë [SenBumpDrop] & BumpRight) {distance = 0; angle = 0; makinë (-SlowSpeed, RadStraight); gjendje = BackingTraceLeft;} tjetër nëse (sensorët [SenBumpDrop] & BumpLeft) {distanca = 0; këndi = 0; disku (-SlowSpeed, RadStraight); gjendja = BackingTraceRight;} tjetër nëse (sensorë [SenVWall]) {// kontrolloni afërsinë me leaderif (inRange) {disku (0, RadStraight); gjendja = R eady;} tjetër {// drive straightdrive (FullSpeed, RadStraight); state = Following;}} tjetër nëse (distance> = CoastDistance) {drive (0, RadStraight); state = Ready;} else {drive (SlowSpeed, RadStraight);} pushim; rast SearchingLeft: nëse (gjendet) {if (angle> = ExtraAngle) {drive (SlowSpeed, RadStraight); state = Following;} else {drive (SearchSpeed, RadCCW);}} tjetër nëse (sensorë [SenVWall]) {found = TRUE; angle = 0; if (inRange) {drive (0, RadStraight); state = Ready;} else {drive (SearchSpeed, RadCCW);}} tjetër nëse (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); gjendja = Duke ndjekur;} tjetër {drive (SearchSpeed, RadCW);}} tjetër nëse (sensorë [SenVWall]) {found = TRUE; angle = 0; if (inRange) {drive (0, RadStraight); state = Ready;} tjetër {drive (SearchSpeed, RadCCW);}} tjetër nëse (wait_counter> 0) {wait_counter -= 20; makinë (0, RadStraight);} tjetër nëse (kënd = Kërko RightAngle) {drive (0, RadStraight); wait_counter = 5000; angle = 0;} else {drive (SearchSpeed, RadCW);} pushim; rast TracingLeft: if (sensorë [SenBumpDrop] & BumpRight) {distanca = 0; kënd = 0; makinë (-SlowSpeed, RadStraight); gjendje = BackingTraceLeft;} tjetër nëse (sensorë [SenBumpDrop] & BumpLeft) {makinë (0, RadStraight); gjendje = Gati;} tjetër nëse (sensorë [SenVWall]) {{kontrolloni për afërsinë me leaderif (inRange) {drive (0, RadStraight); state = Ready;} else {// drive straightdrive (SlowSpeed, RadStraight); state = Following;}} tjetër nëse (! (distanca> = TraceDistance)) { makinë (SlowSpeed, RadStraight);} tjetër nëse (! (-angle> = TraceAngle)) {drive (SearchSpeed, RadCW);} tjetër {distance = 0; kënd = 0; makinë (SlowSpeed, RadStraight); gjendje = Gati; } break; case TracingRight: if (sensorë [SenBumpDrop] & BumpRight) {drive (0, RadStraight); state = Ready;} tjetër nëse (sensorë [SenBumpDrop] & BumpLeft) {distance = 0; angle = 0; makinë (- SlowSpeed, RadStraight); gjendja = BackingTraceRight;} tjetër nëse (sensorë [SenVWall]) {// kontrolloni afërsinë me leaderif (inRang e) {drive (0, RadStraight); state = Ready;} else {// drive straightdrive (SlowSpeed, RadStraight); state = Following;}} tjetër nëse (! (distanca> = TraceDistance)) {drive (SlowSpeed, RadStraight);} tjetër nëse (! (këndi> = TraceAngle)) {disku (SearchSpeed, RadCCW);} tjetër {distanca = 0; këndi = 0; disku (SlowSpeed, RadStraight); gjendja = Gati;} pushim; rasti BackingTraceLeft: if (sensorë [SenVWall] && inRange) {makinë (0, RadStraight); gjendja = Gati;} tjetër nëse (këndi> = TraceAngle) {distanca = 0; këndi = 0; ngasja (SlowSpeed, RadStraight); gjendje = TracingLeft; } else if (-distance> = BackDistance) {drive (SearchSpeed, RadCCW);} else {drive (-SlowSpeed, RadStraight);} break; case BackingTraceRight: if (sensorë [SenVWall] && inRange) {disku (0, RadStraight); gjendja = Gati;} tjetër nëse (-angulli> = TraceAngle) {distanca = 0; këndi = 0; ngasja (SlowSpeed, RadStraight); gjendja = TracingRight;} tjetër nëse (-distanca> = BackDistance) {disku (SearchSpeed, RadCW);} else {drive (-SlowSpeed, RadStraight);} pushim; parazgjedhje: // stopdrive (0, RadStraight); gjendja = Re ady; pushim;} delayAndCheckIR (10); delayAndUpdateSensors (10);} // shkëmbi ose butoni i përdoruesit të zbuluar, lejojnë që gjendja të stabilizohet (p.sh., butoni që do të lëshohet) disku (0, RadStraight); delayAndUpdateSensors (2000);}}} // Ndërprerja e marrjes serike për të ruajtur vlerat e sensoritSIGNAL (SIG_USART_RECV) {uint8_t temp; temp = UDR0; if (sensors_flag) {sensors_in [sensors_index ++] = temp; if (sensors_index> = Sen6Size) sensors_flag = 0;}} // Timer 1 ndërprerje deri te vonesat në msSIGNAL (SIG_OUTPUT_COMPARE1A) {if (timer_cnt) timer_cnt-; elsetimer_on = 0;} // Transmetoni një bajt mbi byteTx portvoid serial (vlera uint8_t) {ndërsa (! (UCSR0A & _BV) (UDRE0) UDR0 = vlera;} // Vonesa për kohën e caktuar në ms pa përditësuar vlerat e sensorit shmangni vonesatM (uint16_t time_ms) {timer_on = 1; timer_cnt = time_ms; ndërsa (timer_on);} // Vonesa për kohën e caktuar në ms dhe kontrolloni sekondën Detektor IR shmang vonesënAndCheckIR (uint16_t time_ms) {uint8_t timer_val = 0; inRange = 0; timer_on = 1; timer_cnt = time_ms; ndërsa (timer_on) {if (! (Timer_val == timer_cnt)) {inRange + = IRDetected; timer_val = timer_cnt;}} inRange = (inRange> = (time_ms >> 1));} // Vonesa për kohën e caktuar në ms dhe përditësoni vlerat e sensorit shmangni delayAndUpdateSensorët (uint16_t time_ms) {uint8_t temp; timer_on = 1; timer_cnt = time_ms; ndërsa (timer_on) {if (! sensorë_flag) {për (temp = 0; temp Sen6Size; temp ++) sensorë [temp] = sensorë_në [temp]; // Përditëso totalin e vrapimit të distancës dhe distancës së këndit += (int) ((sensorë [SenDist1] 8) | sensorë [SenDist0]); kënd += (int) ((sensorë [SenAng1] 8) | sensorë [SenAng0]); byteTx (CmdSensors); byteTx (6); sensors_index = 0; sensorë_flag = 1;}}} // Inicialize the Mind Control & aposs ATmega168 microcontrollervoid initialize (pavlefshme) {cli (); // Vendosni kunjat I/ODDRB = 0x10; PORTB = 0xCF; DDRC = 0x00; PORTC = 0xFF; DDRD = 0xE6; PORTD = 0x7D; // Vendosni kohëmatësin 1 për të gjeneruar një ndërprerje çdo 1 msTCCR1A = 0x00; TCCR1B = (_BV (WGM12) | _BV (CS12)); OCR1A = 71; TIMSK1 = _BV (OCIE1A); // Vendosni portin serik me ndërprerje rxUBRR0 = 19; UCSR0B = (_BV (RXCIE0) | _BV (TXEN0) | _BV (RXEN0)); UCSR0C = (_BV (UCSZ00) | _BV (UCSZ01)); // Aktivizo interruptssei ();} void powerOnRobot (e pavlefshme) {// Nëse Krijo & aposs energjia është e fikur, aktivizoje atë (! RobotIsOn) {ndërsa (! RobotIsOn) {RobotPwrToggleLow; delayMs (500); // Vonesa në këtë gjendjeRobotPwrToggleHigh; // Kalim i ulët në i lartë për të ndryshuar powerdelayMs (100); // Vonesa në këtë gjendjeRobotPwrToggleLow;} delayMs (3500); // Vonesa për fillimin}} // Ndërroni normën e baudit si në Krijimin ashtu edhe në modulin shmangni baud (uint8_t baud_code) {if (baud_code = 11) {byteTx (CmdBaud); UCSR0A | = _BV (TXC0); byteTx (baud_code);/ / Prisni derisa transmetimi të përfundojë ndërkohë (! (UCSR0A & _BV (TXC0))); cli (); // Ndërroni regjistrin e normës së baudit (baud_code == Baud115200) UBRR0 = Ubrr115200; përndryshe nëse (baud_code == Baud57600) UBR5000 = Ubrr7; përndryshe nëse (baud_code == Baud38400) UBRR0 = Ubrr38400; përndryshe nëse (baud_code == Baud28800) UBRR0 = Ubrr28800; përndryshe nëse (baud_code == Baud19200) UBRR0 = Ubrr19200; përndryshe nëse (baud_code = UBr1400 = Ubr1400 = UBR1400 = UBR1400 = UBr1400 = UBR1400 = UBr1400 = UBr1400 = UBR1400 = nëse (baud_code == Baud9600) UBRR0 = Ubrr9600; përndryshe nëse (baud_code == Baud4800) UBRR0 = Ubrr4800; përndryshe nëse (baud_code == Baud2400) UBRR0 = Ubrr2400; përndryshe nëse (baud_code == Baud1200) tjetër baud_code == Baud600) UBRR0 = Ubrr600; përndryshe nëse (baud_code == Baud300) UBRR0 = Ubrr300; sei (); delayMs (100);}} // Dërgo Krijo komandat e diskut për sa i përket shpejtësisë dhe radiusvoid drive (int16_t shpejtësia, int16_t rreze) {byteTx (CmdDrive); byteTx ((uint 8_t) ((shpejtësia >> 8) & 0x00FF)); byteTx ((uint8_t) (shpejtësia & 0x00FF)); byteTx ((uint8_t) ((rrezja >> 8) & 0x00FF)); byteTx ((uint8_t) (rreze & 0x00FF));}
Recommended:
Një makinë për frikësimin e Halloween -it duke përdorur një PIR, një kungull të printuar në 3D dhe një Pranker audio të pajtueshme me Troll Arduino/Bordi praktik i Shakasë.: 5 Hapa
Një makinë për frikësimin e Halloween -it duke përdorur një PIR, një kungull të printuar në 3D dhe Tran Arduino Compatible Audio Pranker/Joke Board praktike .: Bordi Troll i krijuar nga Patrick Thomas Mitchell i EngineeringShock Electronics, dhe u financua plotësisht në Kickstarter jo shumë kohë më parë. Unë mora shpërblimin disa javë më parë për të ndihmuar në shkrimin e disa shembujve të përdorimit dhe ndërtimin e një biblioteke Arduino në një përpjekje
Si të bëni një përshtatës helikoid të rregullueshëm për një objektiv projektori 85 mm, nga një lidhës tubi polipropileni: 5 hapa
Si të bëni një përshtatës helikoid të rregullueshëm për një objektiv projektori 85 mm, nga një lidhës tubash polipropileni: Kohët e fundit kam blerë një projektor të vjetër rrëshqitës për rreth 10 euro. Projektori është i pajisur me një lente 85 mm f/2.8, lehtësisht e shkëputshme nga vetë projektori (asnjë pjesë nuk ka nevojë të çmontohet). Kështu që vendosa ta transformoj atë në një lente 85 mm për Penta -n time
Si të bëni një dron duke përdorur Arduino UNO - Bëni një kuadopter duke përdorur mikrokontrollues: 8 hapa (me fotografi)
Si të bëni një dron duke përdorur Arduino UNO | Bëni një Quadcopter Duke përdorur Mikrokontrolluesin: HyrjeVizitoni Kanalin Tim në YoutubeNjë drone është një vegël (produkt) shumë e shtrenjtë për të blerë. Në këtë postim do të diskutoj, si ta bëj me çmim të ulët ?? Dhe si mund ta bëni tuajin si ky me çmim të lirë … Epo në Indi të gjitha materialet (motorët, ESC -të
Si të bëni një kalendar të gjyshërve & Libër dërgesash (edhe nëse nuk dini si të bëni fletore): 8 hapa (me fotografi)
Si të bëni një kalendar të gjyshërve & Scrapbook (edhe nëse nuk dini si të bëni scrapbook): Kjo është një dhuratë festive shumë ekonomike (dhe shumë e vlerësuar!) Për gjyshërit. Bëra 5 kalendarë këtë vit për më pak se 7 dollarë secili. Materialet: 12 fotografi të mrekullueshme të fëmijës tuaj, fëmijëve, mbesave, nipërve, qenve, maceve ose të afërmve të tjerë 12 copë të ndryshme
Si të bëni një GIF të animuar nga një skedar video duke përdorur vetëm një program falas: 4 hapa
Si të bëni një GIF të animuar nga një skedar video duke përdorur vetëm një program falas: për ata prej jush që nuk e dinë një GIF është formati më i zakonshëm i imazhit që mbështet korniza të shumta në një shfaqje të rrëshqitshme ose animacion. me fjalë të tjera ju mund të vendosni video të shkurtra ku normalisht shkojnë vetëm imazhet. Unë kam dashur të bëj një GIF nga videoklipi