Innehållsförteckning:
Video: Hur man gör en Robo-Bellhop: 3 steg
2024 Författare: John Day | [email protected]. Senast ändrad: 2024-01-30 12:47
Av jeffreyfFölj mer av författaren:
Om: Jag gillar att ta isär saker och ta reda på hur de fungerar. Jag tappar i allmänhet intresset efter det. Mer om jeffreyf »
Denna instruktion visar hur du använder iRobot Create för att skapa en rörlig bellhop. Detta upphävdes helt med tillstånd från carolDancer instruktioner, och jag lade upp det som ett prov för vår tävling. Robo-BellHop kan vara din egen personliga assistent för att bära dina väskor, matvaror, tvätt, etc., så att du inte har till. Grundläggande Create har ett fack fäst på toppen och använder två inbyggda IR-detektorer för att följa ägarens IR-sändare. Med mycket grundläggande C -programvarukod kan användaren säkra tunga livsmedel, en stor mängd tvätt eller din övernattningsväska på Robo -BellHop och få roboten att följa dig ner på gatan, genom köpcentret, ner i korridoren eller genom flygplatsen - - varhelst användaren behöver gå. Grundläggande användning 1) Tryck på Reset -knappen för att slå på kommandomodulen och kontrollera att sensorerna kopplas in 1a) Play -lysdioden ska tändas när den ser IR -sändaren följa dig1b) Advance -lysdioden ska tändas när roboten är mycket nära 2) Tryck på den svarta mjuka knappen för att köra Robo-BellHop-rutinen3) Fäst IR-sändaren på fotleden och se till att den är påslagen. Ladda sedan upp korgen och kör! 4) Logiken för Robo-BellHop är följande: 4a) Om du går runt, om IR-signalen detekteras, kommer roboten att köra med maxhastighet4b) Om IR-signalen går ur räckvidd (genom att vara för långt eller för vinkel), kommer roboten att korsa en kort sträcka med långsam hastighet om signalen tas upp igen4c) Om IR -signalen inte detekteras kommer roboten att svänga åt vänster och höger i en försök att hitta signalen igen4d) Om IR -signalen detekteras men roboten träffar ett hinder försöker roboten köra runt hindret4e) Om roboten kommer mycket nära IR -signalen kommer roboten att stanna för att undvika att träffa ägarens anklarHardware1 iRobot virtuell väggaggregat - $ 301 IR -detektor från RadioShack - $ 31 DB -9 hankontakt från Radio Shack - $ 44 6-32 skruvar från Home Depot - $ 2.502 3V batterier, jag använde D1 tvättkorg från Target - $ 51 extra hjul till på baksidan av Skapa robotElektrisk tejp, tråd och löd
Steg 1: Täcker IR -sensorn
Fäst eltejp för att täcka alla utom en liten slits på IR -sensorn på framsidan av Create -roboten. Demontera den virtuella väggenheten och dra ut det lilla kretskortet på enhetens framsida. Det här är lite knepigt eftersom det finns massor av dolda skruvar och plastfästen. IR -sändaren sitter på kretskortet. Täck IR -sändaren med en bit silkespapper för att undvika IR -reflektioner. Fäst kretskortet på ett band eller elastiskt band som kan linda runt fotleden. Anslut batterierna till kretskortet så att du kan ha batterierna på ett bekvämt ställe (jag gjorde det så att jag kunde lägga batterierna i fickan).
Anslut den andra IR-detektorn till DB-9-kontakten och sätt in den i Cargo Bay ePort-stift 3 (signal) och stift 5 (jordad). Fäst den andra IR -detektorn på toppen av den befintliga IR -sensorn på Create och täck den med ett par lager silkespapper tills den andra IR -detektorn inte ser sändaren på ett avstånd som du vill att Create -roboten ska stoppa för att behålla från att slå dig. Du kan testa detta efter att du har tryckt på Reset -knappen och titta på Advance LED för att tändas när du är på stoppavståndet.
Steg 2: Fäst korgen
Fäst korgen med 6-32 skruvarna. Jag har precis monterat korgen på toppen av Create -roboten. Skjut också in bakhjulet så att du lägger vikt på baksidan av Create -roboten.
Anmärkningar: - Roboten kan bära ganska mycket last, minst 30 kg. - Den lilla storleken verkade vara den svåraste delen med att få den att bära något bagage - IR är väldigt temperamentsfullt. Kanske är det bättre att använda bildbehandling men det är mycket dyrare
Steg 3: Ladda ner källkoden
Källkoden följer och bifogas i en textfil:
/************************************************* ******************** follow.c ** -------- ** körs på Create Command Module ** täcker alla utom liten öppning på framsidan av IR-sensorn ** Skapa kommer att följa en virtuell vägg (eller någon IR som skickar ut ** kraftfältssignalen) och förhoppningsvis undvika hinder i processen ***************** ************************************************** **/#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#definiera SearchRightAngle (SearchLeftAngle - 1000) #define CoastDistance 150#definiera TraceDistance 250#definiera TraceAngle 30#definiera BackDistance 25#definiera IRDetekterad (~ PINB & 0x01) // tillstånd#definiera Klar 0#definiera Följande 1#definiera WasFollowing 2 #define SearchingLeft 3#definiera SearchingRight 4#definiera TracingLeft 5#definiera TracingRight 6#definiera BackingTraceLeft 7#definiera BackingTraceRight 8 // Globala variablerv olatile uint16_t timer_cnt = 0; volatile uint8_t timer_on = 0; volatile uint8_t sensors_flag = 0; volatile uint8_t sensors_index = 0; volatile uint8_t sensors_in [Sen6Size]; volatile uint8_t sensors [Sen6Size]; volatile int16_t distance = 0; flyktiga uint8_t inRange = 0; // Functionsvoid byteTx (uint8_t värde); void delayMs (uint16_t time_ms); void delayAndCheckIR (uint16_t time_ms); void delayAndUpdateSensors (unsigned int time_ms); void initialize (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; // Konfigurera Skapa och modulinitialisera (); LEDBothOff; powerOnRobot (); byteTx (CmdStart); baud (Baud28800); byteTx (CmdControl); byteTx (CmdFull); // set i/o för andra IR -sensorDDRB & = = ~ 0x01; // ställ in carport bay ePort pin 3 att vara en inputPORTB | = 0x01; // set cargo ePort pin3 pullup enabled // program loop while (TRUE) {// Stop just as a precautiondrive (0, RadStraight); // set LEDsbyteTx (CmdLeds); byteTx (((sensorer [SenVWall])? LEDPlay: 0x00) | (inRange? LEDAdvance: 0x00)); byteTx (sensorer [SenCharge1]); byteTx (64); IRDetected? LED2On: LED2Off; inRange? LED1On: LED1Off; // letar efter användarknapp, kolla oftaendayAndUpdateSensors (10); delayAndCheck (10); if (UserButtonPressed) {delayAndUpdateSensors (1000); // active loop while (! (UserButtonPressed) && (! Sensors [SenCliffL]) && (! Sensors [SenCliffFL]) && (! Sensors [SenCliffFR]) && (! sensorer [SenCliffR])) {byteTx (CmdLeds); byteTx (((sensorer [SenVWall])? LEDPlay: 0x00) | (inRange? LEDAdvance: 0x00)); byteTx (sensorer [SenCharge1]); byteTx (255); IRDetected ? LED2On: LED2Off; inRange? LED1On: LED1Off; switch (state) {case Ready: if (sensorer [SenVWall]) {// kontrollera om det finns närheten till leaderif (inRange) {drive (0, RadStraight);} annars {// kör straightdrive (SlowSpeed, RadStraight); state = Följer;}} annat {// sök efter strålen = 0; distans = 0; wait_counter = 0; hittat = FALSKT; enhet (SearchSpeed, RadCCW); state = SearchingLeft;} break; fall Följande: if (sensorer [SenBumpDrop] & BumpRight) {distance = 0; vinkel = 0; drive (-SlowSpeed, RadStraight); state = BackingTraceLeft;} annars if (sensorer [SenBumpDrop] & BumpLeft) {distance = 0; angle = 0; drive (-SlowSpeed, RadStraight); state = BackingTraceRight;} annars om (sensorer [SenVWall]) {// kolla efter närhet till leaderif (inRange) {drive (0, RadStraight); state = Ready;} else {// drive straightdrive (FullSpeed, RadStraight); state = Följer;}} annars {// har precis tappat signalen, fortsätt långsamt en cycledistance = 0; drive (SlowSpeed, RadStraight); state = WasFollowing;} break; case WasFollowing: if (sensors [SenBumpDrop] & BumpRight) {distance = 0; angle = 0; drive (-SlowSpeed, RadStraight); state = BackingTraceLeft;} annars om (sensorer [SenBumpDrop] & BumpLeft) {distance = 0; angle = 0; drive (-SlowSpeed, RadStraight); state = BackingTraceRight;} annars om (sensorer [SenVWall]) {// kolla om det finns närheten till leaderif (inRange) {enhet (0, RadStraight); tillstånd = R eady;} else {// drive straightdrive (FullSpeed, RadStraight); state = Följande;}} else if (distans> = 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 (sensorer [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 = Följer;} else {drive (SearchSpeed, RadCW);}} else if (sensorer [SenVWall]) {found = TRUE; angle = 0; if (inRange) {drive (0, RadStraight); state = Ready;} else {drive (SearchSpeed, RadCCW);}} annars ifall (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 (sensorer [SenBumpDrop] & BumpRight) {distance = 0; angle = 0; drive (-SlowSpeed, RadStraight); state = BackingTraceLeft;} annars if (sensorer [SenBumpDrop] & BumpLeft) {drive (0, RadStraight); state = Ready;} annars om (sensorer [SenVWall]) {// kolla för närhet till leaderif (inRange) {drive (0, RadStraight); state = Ready;} else {// drive straightdrive (SlowSpeed, RadStraight); state = Following;}} else if (! (distance> = TraceDistance)) { drive (SlowSpeed, RadStraight);} annars if (! (-vinkel> = TraceAngle)) {drive (SearchSpeed, RadCW);} else {distance = 0; vinkel = 0; drive (SlowSpeed, RadStraight); state = Ready; } break; case TracingRight: if (sensorer [SenBumpDrop] & BumpRight) {drive (0, RadStraight); state = Ready;} annars om (sensorer [SenBumpDrop] & BumpLeft) {distance = 0; vinkel = 0; kör (- SlowSpeed, RadStraight); state = BackingTraceRight;} annars om (sensorer [SenVWall]) {// kontrollera om det finns närheten till leaderif (inRang e) {drive (0, RadStraight); state = Ready;} else {// drive straightdrive (SlowSpeed, RadStraight); state = Following;}} else if (! (distance> = TraceDistance)) {drive (SlowSpeed, RadStraight));} annars om (! (vinkel> = TraceAngle)) {enhet (SearchSpeed, RadCCW);} else {distans = 0; vinkel = 0; enhet (SlowSpeed, RadStraight); state = Ready;} break; fall BackingTraceLeft: if (sensorer [SenVWall] && inRange) {drive (0, RadStraight); state = Ready;} annars if (vinkel> = TraceAngle) {distance = 0; vinkel = 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)); 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);} // cliff- eller användarknapp upptäckt, låt tillståndet stabilisera (t.ex. att knappen släpps) drive (0, RadStraight); delayAndUpdateSensors (2000);}}}} // Seriellt mottagningsavbrott för att lagra sensorvärdenSIGNAL (SIG_USART_RECV) {uint8_t temp; temp = UDR0; if (sensors_flagg) {sensors_in [sensors_index ++] = temp; if (sensors_index> = Sen6Size) sensors_flag = 0;}} // Timer 1 avbrott till tidsfördröjningar i msSIGNAL (SIG_OUTPUT_COMPARE1A) {if (timer_cnt) timer_cnt-; elsetimer_on = 0;} // Överför en byte över den seriella portvoid byteTx (uint8_t värde) {while (! (UCSR0A & _BV (UDRE0)))); UDR0 = värde;} // Fördröjning för angiven tid i ms utan att uppdatera sensorvärden ogiltig fördröjningMs (uint16_t time_ms) {timer_on = 1; timer_cnt = time_ms; while (timer_on);} // Delay för angiven tid i ms och kontrollera andra IR -detektorvoid 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 + = IRDetekterad; timer_val = timer_cnt;}} inRange = (inRange> = (time_ms >> 1));} // Delay för den angivna tiden i ms och uppdatera sensorvärdenvoid 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. [SenAng1] 8) | sensorer [SenAng0]); byteTx (CmdSensors); byteTx (6); sensors_index = 0; sensors_flag = 1;}}} // Initialize Mind Control & aposs ATmega168 microcontrollervoid initialize (void) {cli (); // Ställ in I/O -pinsDDRB = 0x10; PORTB = 0xCF; DDRC = 0x00; PORTC = 0xFF; DDRD = 0xE6; PORTD = 0x7D; // Ställ in timer 1 för att generera ett avbrott var 1 msTCCR1A = 0x00; TCCR1B = (_BV (WGM12) | _BV (CS12)); OCR1A = 71; TIMSK1 = _BV (OCIE1A); // Konfigurera serieporten med rx interruptUBRR0 = 19; UCSR0B = (_BV (RXCIE0) | _BV (TXEN0) | _BV (RXEN0)); UCSR0C = (_BV (UCSZ00) | _BV (UCSZ01)); // Slå på interruptssei ();} void powerOnRobot (void) {// Om Create & aposs -ström är avstängd, slå på den om (! RobotIsOn) {medan (! RobotIsOn) {RobotPwrToggleLow; delayMs (500); // Fördröjning i detta tillståndRobotPwrToggleHigh; // Låg till hög övergång till växling mellan powerdelayMs (100); // Delay in this stateRobotPwrToggleLow;} delayMs (3500); // Fördröjning för start}} // Växla baudhastigheten på både Create och modulevoid baud (uint8_t baud_code) {if (baud_code = 11) {byteTx (CmdBaud); UCSR0A | = _BV (TXC0); byteTx (baud_code);/ / Vänta tills överföringen är klar medan (! (UCSR0A & _BV (TXC0))); cli (); // Växla överföringshastighetsregistret (baud_code == Baud115200) UBRR0 = Ubrr115200; annars om (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; annars om (baud_code == Baud14400) UBRR0 = Ubr 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) UBRR0 = Ubrr00 baud_code == Baud600) UBRR0 = Ubrr600; annars om (baud_code == Baud300) UBRR0 = Ubrr300; sei (); delayMs (100);}} // Skicka Skapa enhetskommandon när det gäller hastighet och radiusvoid enhet (int16_t hastighet, int16_t radie) {byteTx (CmdDrive); byteTx ((uint 8_t) ((hastighet >> 8) & 0x00FF)); byteTx ((uint8_t) (hastighet & 0x00FF)); byteTx ((uint8_t) ((radie >> 8) & 0x00FF)); byteTx ((uint8_t) (radie & 0x00FF));}
Rekommenderad:
Hur man skapar en Linux -boot -enhet (och hur man använder den): 10 steg
Hur man skapar en Linux Boot Drive (och hur man använder den): Detta är en enkel introduktion om hur man kommer igång med Linux, särskilt Ubuntu
Hur man gör en drönare med Arduino UNO - Gör en quadcopter med mikrokontroller: 8 steg (med bilder)
Hur man gör en drönare med Arduino UNO | Gör en Quadcopter Med Microcontroller: Introduktion Besök min Youtube -kanal En Drone är en mycket dyr gadget (produkt) att köpa. I det här inlägget ska jag diskutera, hur gör jag det billigt ?? Och hur kan du göra din egen så här till billigt pris … Tja i Indien alla material (motorer, ESC
Hur man gör världens minsta radföljarrobot (robo Rizeh): 7 steg (med bilder)
Hur man gör världens minsta linjeföljare -robot (robo Rizeh): Hur man gör världens minsta linjeföljare -robot (vibrobot) " roboRizeh " vikt: 5gr storlek: 19x16x10 mm av: Naghi Sotoudeh Ordet " Rizeh " är ett persiskt ord som betyder "liten". Rizeh är en vibrationsbaserad mycket liten
HUR MAN GÖR ARDUINO NANO/MINI - Hur man bränner bootloader: 5 steg
HUR MAN GÖR ARDUINO NANO/MINI | Hur man bränner bootloader: I denna instruktionsbok kommer jag att visa dig hur man gör en Arduino MINI från Scratch.Förfarandet som skrivs i denna instruktion kan användas för att göra alla arduino -brädor för dina anpassade projektkrav.Se videon för bättre förståelse
Hur man gör en morföräldrars kalender & Klippbok (även om du inte vet hur du ska klippbok): 8 steg (med bilder)
Hur man gör en morföräldrars kalender & Klippbok (även om du inte vet hur du ska klippbok): Detta är en mycket ekonomisk (och mycket uppskattad!) Semestergåva till morföräldrar. Jag gjorde 5 kalendrar i år för mindre än $ 7 styck. Material: 12 fina bilder på ditt barn, barn, syskonbarn, brorson, hundar, katter eller andra släktingar 12 olika bitar