INHOUDSOPGAWE:

Hoe om 'n Robo-Bellhop te maak: 3 stappe
Hoe om 'n Robo-Bellhop te maak: 3 stappe

Video: Hoe om 'n Robo-Bellhop te maak: 3 stappe

Video: Hoe om 'n Robo-Bellhop te maak: 3 stappe
Video: ISABELLA IS GEBETEN DOOR EEN HOND🐕 - TOPDOKS 2024, November
Anonim

Volg meer deur die skrywer:

Hoe om deel te neem aan die iRobot Create Scholarship-mini-wedstryd
Hoe om deel te neem aan die iRobot Create Scholarship-mini-wedstryd
Hoe om deel te neem aan die iRobot Create Scholarship-mini-wedstryd
Hoe om deel te neem aan die iRobot Create Scholarship-mini-wedstryd
Hoe om LOLCats, Meme -katte, Cat -makros of katfoto's met snaakse onderskrifte te maak
Hoe om LOLCats, Meme -katte, Cat -makros of katfoto's met snaakse onderskrifte te maak
Hoe om LOLCats, Meme -katte, Cat -makros of katfoto's met snaakse onderskrifte te maak
Hoe om LOLCats, Meme -katte, Cat -makros of katfoto's met snaakse onderskrifte te maak

Oor: Ek hou daarvan om dinge uitmekaar te haal en uit te vind hoe dit werk. Ek verloor gewoonlik die belangstelling daarna. Meer oor jeffreyf »

Hierdie instruksies wys hoe u die iRobot Create kan gebruik om 'n bewegende klokhuis te maak. Dit is heeltemal opgehef met toestemming van die instruksies van CarolDancer, en ek het dit as 'n voorbeeldinskrywing vir ons wedstryd opgestel. Robo-BellHop kan u eie persoonlike assistent wees om u tasse, kruideniersware, wasgoed, ens. Te dra, sodat u nie aan. Die basiese Create het 'n bak aan die bokant en gebruik twee ingeboude IR-detektors om die IR-sender van die eienaar te volg. Met 'n baie basiese C -sagtewarekode kan die gebruiker swaar kruideniersware, 'n groot hoeveelheid wasgoed of u sak op Robo -BellHop beveilig en die robot u in die straat, deur die winkelsentrum, in die gang of deur die lughawe laat volg - - waarheen die gebruiker ook al moet gaan. Basiese werking 1) Druk op die Reset -knoppie om die opdragmodule aan te skakel en te kyk of sensors inskakel 1a) die Play -LED moet aangaan as die IR -sender u volg om te sien1b) die Advance LED moet aanskakel wanneer die robot is baie naby 2) Druk op die swart sagte knoppie om Robo-BellHop-roetine uit te voer3) Koppel die IR-sender aan die enkel en maak seker dat dit aangeskakel is. Laai dan die mandjie op en gaan! 4) Die logika van Robo-BellHop is soos volg: 4a) As u rondloop, as die IR-sein opgespoor word, ry die robot teen maksimum spoed4b) As die IR-sein uitkom bereik (deur te ver of te skerp 'n hoek te wees), sal die robot 'n kort afstand oor 'n stadige spoed loop as die sein weer opgetel word4c) As die IR -sein nie opgespoor word nie, draai die robot links en regs in 'n probeer om die sein weer te vind4d) As die IR -sein opgespoor word, maar die robot 'n hindernis raak, sal die robot probeer om om die hindernis te ry eienaar se enkels Hardware1 iRobot virtuele muureenheid - $ 301 IR -detektor van RadioShack - $ 31 DB -9 manlike aansluiting van Radio Shack - $ 44 6-32 skroewe van Home Depot - $ 2.502 3V batterye, ek het D1 wasmandjie van Target gebruik - $ 51 ekstra wiel op die agterkant van die Create robotElectrical tape, wire and soldeer

Stap 1: Bedek die IR -sensor

Bevestig elektriese band om al die klein spleet van die IR -sensor aan die voorkant van die Create -robot te bedek. Demonteer die virtuele muureenheid en trek die klein printplaat aan die voorkant van die eenheid uit. Dit is 'n bietjie lastig, want daar is baie verborge skroewe en plastiekhouers. Die IR -sender is op die printplaat. Bedek die IR -sender met 'n stuk sneespapier om IR -weerkaatsing te vermy. Bevestig die printplaat aan 'n band of elastiese band wat om u enkel kan draai. Draai die batterye na die printplaat sodat u die batterye op 'n gemaklike plek kan hê (ek het dit gemaak sodat ek die batterye in my sak kon steek).

Draai die 2de IR-detektor na die DB-9-aansluiting en steek dit in Cargo Bay ePort pen 3 (sein) en pen 5 (grond). Koppel die 2de IR -detektor aan die bokant van die bestaande IR -sensor op Create en bedek dit met 'n paar lae weefselpapier totdat die 2de IR -detector nie die emitter op 'n afstand sien wat u wil hê dat die Create -robot moet stop om te hou nie om jou te slaan. U kan dit toets nadat u op die Reset -knoppie gedruk het en na die vooraf -LED kyk om aan te gaan as u op die afstand is.

Stap 2: Maak die mandjie vas

Bevestig die mandjie met die 6-32 skroewe. Ek het pas die mandjie bo -op die Create robot aangebring. Skuif ook in die agterwiel sodat u gewig agterop die Create -robot plaas.

Opmerkings: - Die robot kan heelwat vrag dra, ten minste 30 pond. - Die klein grootte was blykbaar die moeilikste om bagasie mee te neem - IR is baie temperamenteel. Miskien is dit beter om beeldvorming te gebruik, maar dit is baie duurder

Stap 3: Laai die bronkode af

Laai die bronkode af
Laai die bronkode af

Die bronkode volg en word in 'n tekslêer aangeheg:

/************************************************ ********************* follow.c ** -------- ** loop op Create Command Module ** bedek alles behalwe klein opening aan die voorkant van die IR-sensor ** Create sal 'n virtuele muur volg (of enige IR wat die ** kragveldsein stuur) en hopelik hindernisse in die proses vermy ***************** ************************************************* **/#sluit interrupt.h> #include io.h>#include#include "oi.h" in#definieer WAAR 1#definieer ONWAAR 0#definieer FullSpeed 0x7FFF#definieer SlowSpeed 0x0100#definieer SearchSpeed 0x0100#definieer ExtraAngle 10#definieer SearchLeftAngle 125#definieer SearchRightAngle (SearchLeftAngle - 1000) #define CoastDistance 150#definieer TraceDistance 250#definieer TraceAngle 30#definieer BackDistance 25#definieer IRDetected (~ PINB & 0x01) // state#definieer Gereed 0#definieer Volg 1#definieer WasVolgend 2 #define SearchingLeft 3#definieer SearchingRight 4#definieer TracingLeft 5#definieer TracingRight 6#definieer BackingTraceLeft 7#definieer BackingTraceRight 8 // Globale veranderlikesv vlugtige uint16_t timer_cnt = 0; vlugtige uint8_t timer_on = 0; vlugtige uint8_t sensors_flag = 0; vlugtige uint8_t sensors_index = 0; vlugtige uint8_t sensors_in [Sen6Size]; vlugtige uint8_t sensors [Sen6Size]; vlugtige int16_t afstand = 0; vlugtige int16_t afstand = 0; onbestendige uint8_t inRange = 0; // Funksiesvoid byteTx (waarde uint8_t); void delayMs (uint16_t time_ms); void delayAndCheckIR (uint16_t time_ms); void delayAndUpdateSensors (ongetekende int time_ms); leegte initialiseer (voidn; baud (uint8_t baud_code); void drive (int16_t velocity, int16_t radius); uint16_t randomAngle (void); void defineSongs (void); int main (void) {// state variableuint8_t state = Ready; int found = 0; int wait_counter = 0; // Stel Skep op en moduleer dit (); LEDBothOff; powerOnRobot (); byteTx (CmdStart); baud (Baud28800); byteTx (CmdControl); byteTx (CmdFull); // stel i/o vir tweede IR -sensorDDRB & = ~ 0x01; // stel die vragboom ePort -pen 3 in as 'n invoerPORTB | = 0x01; // stel vrag ePort pin3 pullup aangeskakel // program loop terwyl (TRUE) {// Stop net as 'n voorsorgmaatreël (0, RadStraight); // stel LEDsbyteTx (CmdLeds); byteTx (((sensors [SenVWall])? LEDPlay: 0x00 in) | (inRange? LEDAdvance: 0x00)); byteTx (sensors [SenCharge1]); byteTx (64); IRDetected? LED2On: LED2Off; inRange? LED1On: LED1Off; // op soek na gebruikersknoppie, kyk gereeld na vertoningAndUpdateSensors (10); delayAndCheck (10); as (UserButtonPressed) {delayAndUpdateSensors (1000); // aktief loop terwyl (! (UserButtonPressed) && (! Sensors [SenCliffL]) && (! Sensors [SenCliffFL]) && (! Sensors [SenCliffFR]) && (! sensors [SenCliffR])) {byteTx (CmdLeds); byteTx (((sensors [SenVWall])? LEDPlay: 0x00) | (inRange? LEDAdvance: 0x00)); byteTx (sensors [SenCharge1]); byteTx (255); IRDetected ? LED2On: LED2Off; inRange? LED1On: LED1Off; skakelaar (toestand) {geval Gereed: if (sensors [SenVWall]) {// kyk of dit naby leier is (inRange) {drive (0, RadStraight);} anders {// ry straightdrive (SlowSpeed, RadStraight); state = Volgende;}} anders {// soek na die straalhoek = 0; afstand = 0; wag_teller = 0; gevind = ONWAAR; drive (SearchSpeed, RadCCW); state = SearchingLeft;} break; case Following: if (sensors [SenBumpDrop] & BumpRight) {distance = 0; angle = 0; drive (-SlowSpeed, RadStraight); state = BackingTraceLeft;} anders if (sensors [SenBumpDrop] & BumpLeft) {distance = 0; angle = 0; drive (-SlowSpeed, RadStraight); state = BackingTraceRight;} anders as (sensors [SenVWall]) {// kyk vir naby aan leaderif (inRange) {drive (0, RadStraight); state = Ready;} else {// drive straightdrive (FullSpeed, RadStraight); state = Volgende;}} anders {// het net die sein verloor, hou stadig aan een fietsafstand = 0; ry (SlowSpeed, RadStraight); toestand = WasFollowing;} break; case WasFollowing: as (sensors [SenBumpDrop] & BumpRight) {distance = 0; angle = 0; drive (-SlowSpeed, RadStraight); state = BackingTraceLeft;} anders as (sensors [SenBumpDrop] & BumpLeft) {distance = 0; angle = 0; drive (-SlowSpeed, RadStraight); state = BackingTraceRight;} anders as (sensors [SenVWall]) {// kyk of daar naby aan leader is (inRange) {drive (0, RadStraight); toestand = R eady;} else {// drive straightdrive (FullSpeed, RadStraight); state = Volgend;}} anders if (afstand> = CoastDistance) {drive (0, RadStraight); state = Ready;} else {drive (SlowSpeed, RadStraight);} break; case SearchingLeft: if (found) {if (angle> = ExtraAngle) {drive (SlowSpeed, RadStraight); state = Following;} else {drive (SearchSpeed, RadCCW);}} else if (sensors [SenVWall]) {found = TRUE; angle = 0; if (inRange) {drive (0, RadStraight); state = Ready;} else {drive (SearchSpeed, RadCCW);}} else if (hoek> = 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 = Volg;} else {drive (SearchSpeed, RadCW);}} else if (sensors [SenVWall]) {found = TRUE; angle = 0; if (inRange) {drive (0, RadStraight); state = Ready;} else {drive (SearchSpeed, RadCCW);}} anders as (wait_counter> 0) {wait_counter -= 20; drive (0, RadStraight);} anders if (hoek = Soek 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;} anders as (sensors [SenBumpDrop] & BumpLeft) {drive (0, RadStraight); state = Ready;} anders as (sensors [SenVWall]) {// kyk vir nabyheid aan leaderif (inRange) {drive (0, RadStraight); state = Ready;} else {// drive straightdrive (SlowSpeed, RadStraight); state = Volgende;}} anders as (! (afstand> = TraceDistance)) { drive (SlowSpeed, RadStraight);} anders as (! (-hoek> = TraceAngle)) {drive (SearchSpeed, RadCW);} else {distance = 0; angle = 0; drive (SlowSpeed, RadStraight); state = Gereed; } break; case TracingRight: if (sensors [SenBumpDrop] & BumpRight) {drive (0, RadStraight); state = Ready;} anders as (sensors [SenBumpDrop] & BumpLeft) {distance = 0; angle = 0; drive (- SlowSpeed, RadStraight); state = BackingTraceRight;} anders as (sensors [SenVWall]) {// kyk na die nabyheid van leaderif (inRang e) {drive (0, RadStraight); state = Ready;} else {// drive straightdrive (SlowSpeed, RadStraight); state = Following;}} else if (! (distance> = TraceDistance)) {drive (SlowSpeed, RadStraight);} anders as (! (hoek> = TraceAngle)) {drive (SearchSpeed, RadCCW);} else {distance = 0; hoek = 0; drive (SlowSpeed, RadStraight); state = Ready;} break; case BackingTraceLeft: if (sensors [SenVWall] && inRange) {drive (0, RadStraight); state = Ready;} anders if (hoek> = TraceAngle) {distance = 0; angle = 0; drive (SlowSpeed, RadStraight); state = TracingLeft; } anders if (-distance> = BackDistance) {drive (SearchSpeed, RadCCW);} else {drive (-SlowSpeed, RadStraight);} break; case BackingTraceRight: if (sensors [SenVWall] && inRange) {drive (0, RadStraight)); state = Gereed;} anders as (-hoek> = TraceAngle) {afstand = 0; hoek = 0; ry (SlowSpeed, RadStraight); toestand = TracingRight;} anders as (-afstand> = Terugafstand) {drive (SearchSpeed), RadCW);} else {drive (-SlowSpeed, RadStraight);} break; default: // stopdrive (0, RadStraight); state = Re ady; break;} delayAndCheckIR (10); delayAndUpdateSensors (10);} // krans- of gebruikersknoppie opgespoor, laat die toestand toe om te stabiliseer (bv. knoppie wat vrygestel word) drive (0, RadStraight); delayAndUpdateSensors (2000);}}} // Seriële ontvangsonderbreking om sensorwaardes op te slaan SIGNAL (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 interrupt na vertragings in msSIGNAL (SIG_OUTPUT_COMPARE1A) {if (timer_cnt) timer_cnt-; elsetimer_on = 0;} // Stuur 'n greep oor die seriële portvoid byteTx (waarde uint8_t) {terwyl (! (UCSR0A & _BV (UDRE0)))); UDR0 = waarde;} // Vertraging vir die gespesifiseerde tyd in ms sonder om sensorwaardes by te werkvoid delayMs (uint16_t time_ms) {timer_on = 1; timer_cnt = time_ms; while (timer_on);} // Vertraag vir die gespesifiseerde tyd in ms en kyk tweede 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));} // Vertraging vir die gespesifiseerde tyd in ms en werk sensorwaardes op vir delayAndUpdateSensors (uint16_t time_ms) {uint8_t temp; timer_on = 1; timer_cnt = time_ms; terwyl (timer_on) {if (! sensors_flag) {vir (temp = 0; temp Sen6Size; temp ++) sensors [temp] = sensors_in [temp]; // Werk lopende totale afstand en hoekafstand +op (int) ((sensors [SenDist1] 8) | sensors [SenDist0]); hoek += (int) ((sensors [SenAng1] 8) | sensors [SenAng0]); byteTx (CmdSensors); byteTx (6); sensors_index = 0; sensors_flag = 1;}}} // Initialize the Mind Control & aposs ATmega168 microcontrollervoid initialize (void) {cli (); // Stel I/O -pinsDDRB = 0x10; PORTB = 0xCF; DDRC = 0x00; PORTC = 0xFF; DDRD = 0xE6; PORTD = 0x7D; // Stel timer 1 in om elke 1 msTCCR1A = 0x00 'n onderbreking te genereer; (_BV (WGM12) | _BV (CS12)); OCR1A = 71; TIMSK1 = _BV (OCIE1A); // Stel die seriële poort op met rx interruptUBRR0 = 19; UCSR0B = (_BV (RXCIE0) | _BV (TXEN0) | _BV (RXEN0)); UCSR0C = (_BV (UCSZ00) | _BV (UCSZ01)); // Skakel interruptssei () aan;} void powerOnRobot (void) {// As Create and aposs power uit is, skakel dit aan as (! RobotIsOn) {terwyl (! RobotIsOn) {RobotPwrToggleLow; delayMs (500); // Vertraag in hierdie toestandRobotPwrToggleHigh; // Lae na hoë oorgang na wissel -kragvertraging (100); // Vertraag in hierdie stateRobotPwrToggleLow;} delayMs (3500); // Vertraging vir die opstart}} // Skakel die baud -tempo op beide Create en modulevoid baud (uint8_t baud_code) {if (baud_code = 11) {byteTx (CmdBaud); UCSR0A | = _BV (TXC0); byteTx (baud_code);/ / Wag totdat die uitsending voltooi is (! (UCSR0A & _BV (TXC0))); cli (); // Verander die baud -koersregister (baud_code == Baud115200) UBRR0 = Ubrr115200; anders as (baud_code == Baud57600) UBRR0 = Ubrr57600; anders as (baud_code == Baud38400) UBRR0 = Ubrr38400; anders as (baud_code == Baud28800) UBRR0 = Ubrr28800; anders as (baud_code == Baud19200) UBRR0 = Ubrr19200; anders as (baud_code == Baud14400) UBRR0 = Ubr if (baud_code == Baud9600) UBRR0 = Ubrr9600; anders if (baud_code == Baud4800) UBRR0 = Ubrr4800; anders if (baud_code == Baud2400) UBRR0 = Ubrr2400; anders as (baud_code == Baud1200) UBRR0 = Ubrr00 baud_code == Baud600) UBRR0 = Ubrr600; anders as (baud_code == Baud300) UBRR0 = Ubrr300; sei (); delayMs (100);}} // Stuur Skep dryfopdragte in terme van snelheid en radiusvoid -aandrywing (int16_t snelheid, int16_t radius) {byteTx (CmdDrive); byteTx ((uint 8_t) ((snelheid >> 8) & 0x00FF)); byteTx ((uint8_t) (snelheid & 0x00FF)); byteTx ((uint8_t) ((radius >> 8) & 0x00FF)); byteTx ((uint8_t) (radius & 0x00FF));}

Aanbeveel: