Inhoudsopgave:

Hoe maak je een Robo-Bellhop: 3 stappen
Hoe maak je een Robo-Bellhop: 3 stappen

Video: Hoe maak je een Robo-Bellhop: 3 stappen

Video: Hoe maak je een Robo-Bellhop: 3 stappen
Video: Stap 3 - De hoeken van laag 1 oplossen - Rubik's kubus oplossen voor beginners 2024, November
Anonim

Door jeffreyfVolg meer van de auteur:

Hoe deel te nemen aan de mini-wedstrijd iRobot Create Scholarship
Hoe deel te nemen aan de mini-wedstrijd iRobot Create Scholarship
Hoe deel te nemen aan de mini-wedstrijd iRobot Create Scholarship
Hoe deel te nemen aan de mini-wedstrijd iRobot Create Scholarship
Hoe maak je LOLCats, Meme-katten, Cat-macro's of kattenfoto's met grappige bijschriften
Hoe maak je LOLCats, Meme-katten, Cat-macro's of kattenfoto's met grappige bijschriften
Hoe maak je LOLCats, Meme-katten, Cat-macro's of kattenfoto's met grappige bijschriften
Hoe maak je LOLCats, Meme-katten, Cat-macro's of kattenfoto's met grappige bijschriften

Over: Ik vind het leuk om dingen uit elkaar te halen en uit te zoeken hoe ze werken. Daarna verlies ik over het algemeen de interesse. Meer over jeffreyf »

Deze Instructable laat zien hoe je de iRobot Create kunt gebruiken om een bewegende piccolo te maken. Dit is volledig opgeheven met toestemming van carolDancer's instructies, en ik heb het als voorbeeldinzending voor onze wedstrijd geplaatst. Robo-BellHop kan je eigen persoonlijke assistent zijn om je tassen, boodschappen, wasgoed, enz. tot. De basis Create heeft een bak aan de bovenkant en gebruikt twee ingebouwde IR-detectoren om de IR-zender van de eigenaar te volgen. Met de zeer eenvoudige C-softwarecode kan de gebruiker zware boodschappen, een grote lading wasgoed of je weekendtas op Robo-BellHop bevestigen en de robot je laten volgen door de straat, door het winkelcentrum, door de hal of door de luchthaven - - waar de gebruiker ook heen moet. Basisbediening1) Druk op de Reset-knop om de commandomodule in te schakelen en controleer of de sensoren actief zijn1a) de Play-LED moet gaan branden wanneer hij ziet dat de IR-zender u volgt1b) de Advance-LED moet gaan branden wanneer de robot is heel dichtbij 2) Druk op de zwarte zachte knop om de Robo-BellHop-routine uit te voeren 3) Bevestig de IR-zender aan de enkel en zorg ervoor dat deze is ingeschakeld. Laad dan de mand in en ga! 4) De logica van Robo-BellHop is als volgt:4a) Als u rondloopt en het IR-signaal wordt gedetecteerd, zal de robot met maximale snelheid rijden4b) Als het IR-signaal uit bereik (door een te grote of te scherpe hoek te zijn), zal de robot een korte afstand met lage snelheid afleggen voor het geval het signaal opnieuw wordt opgevangen4c) Als het IR-signaal niet wordt gedetecteerd, zal de robot in een probeer het signaal opnieuw te vinden4d) Als het IR-signaal wordt gedetecteerd maar de robot een obstakel raakt, zal de robot proberen om het obstakel heen te rijden4e) Als de robot heel dicht bij het IR-signaal komt, stopt de robot om te voorkomen dat hij de eigenaar enkelsHardware1 iRobot virtuele wandeenheid - $ 301 IR-detector van RadioShack - $ 31 DB-9 mannelijke connector van Radio Shack - $ 44 6-32 schroeven van Home Depot - $ 2.502 3V-batterijen, ik gebruikte D1-wasmand van Target - $ 51 extra wiel om op de achterkant van de Create robotElektrische tape, draad en soldeer

Stap 1: De IR-sensor afdekken

Bevestig elektrische tape om alles behalve een kleine spleet van de IR-sensor aan de voorkant van de Create-robot te bedekken. Demonteer de virtual wall unit en verwijder de kleine printplaat aan de voorkant van de unit. Dit is een beetje lastig omdat er veel verborgen schroeven en plastic bevestigingen zijn. De IR-zender bevindt zich op de printplaat. Bedek de IR-zender met een stuk tissuepapier om IR-reflecties te voorkomen. Bevestig de printplaat aan een riem of elastische band die om uw enkel kan worden gewikkeld. Sluit de batterijen aan op de printplaat zodat u de batterijen op een comfortabele plaats kunt bewaren (ik heb het zo gemaakt dat ik de batterijen in mijn zak kon stoppen).

Sluit de 2e IR-detector aan op de DB-9-connector en steek deze in de Cargo Bay ePort-pin 3 (signaal) en pin 5 (aarde). Bevestig de 2e IR-detector aan de bovenkant van de bestaande IR-sensor op Create en bedek deze met een paar lagen tissuepapier totdat de 2e IR-detector de zender niet ziet op een afstand waarvan u wilt dat de Create-robot stopt om te houden van je te raken. Je kunt dit testen nadat je op de Reset-knop hebt gedrukt en de Advance-led ziet branden wanneer je op de stopafstand bent.

Stap 2: Bevestig de mand

Bevestig de mand met behulp van de 6-32 schroeven. Ik heb zojuist de mand op de bovenkant van de Create-robot gemonteerd. Schuif ook het achterwiel in zodat je gewicht op de achterkant van de Create robot plaatst.

Opmerkingen: - De robot kan behoorlijk wat last dragen, minstens 30 lbs. - Het kleine formaat leek het moeilijkste om bagage mee te nemen - IR is erg temperamentvol. Misschien is het beter om beeldvorming te gebruiken, maar het is veel duurder

Stap 3: Download de broncode

Download de broncode
Download de broncode

De broncode volgt, en is bijgevoegd in een tekstbestand:

/************************************************** ******************** follow.c ** -------- ** draait op Create Command Module ** bedek alles behalve kleine opening aan de voorkant van de IR-sensor ** Create volgt een virtuele muur (of een IR die het ** krachtveldsignaal uitzendt) en vermijdt hopelijk obstakels in het 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#define IRDetected (~PINB & 0x01)//states#define Ready 0#define volgende 1#define WasFollowing 2 #define SearchingLeft 3#define SearchingRight 4#define TracingLeft 5#define TracingRight 6#define BackingTraceLeft 7#define BackingTraceRight 8// Globale variabelenv olatile uint16_t timer_cnt = 0;vluchtige uint8_t timer_on = 0;vluchtige uint8_t sensors_flag = 0;vluchtige uint8_t sensors_index = 0;vluchtige uint8_t sensors_in[Sen6Size];vluchtige uint8_t sensors[Sen6Size]_vluchtige = inttile 016_vluchtige afstand vluchtige uint8_t inRange = 0;// Functionsvoid byteTx(uint8_t value);void delayMs(uint16_t time_ms);void delayAndCheckIR(uint16_t time_ms);void delayAndUpdateSensors(unsigned int time_ms);voidvoid initialize(void);(void powerOnRobot); baud(uint8_t baud_code);void drive(int16_t snelheid, 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;// Creëren en module initialiseren();LEDBothOff;powerOnRobot();byteTx(CmdStart);baud(Baud28800);byteTx(CmdControl);byteTx(CmdFull);// stel i/o in voor tweede IR-sensorDDRB &= ~0x01; // stel ePort-pin 3 voor laadruimte in als een inputPORTB |= 0x01; //set cargo ePort pin3 pullup ingeschakeld// programma loopwhile(TRUE){// Stop gewoon uit voorzorgdrive(0, RadStraight);// set LEDsbyteTx(CmdLeds);byteTx(((sensors[SenVWall])?LEDPlay:0x00) | (inRange?LEDAdvance:0x00));byteTx(sensors[SenCharge1]);byteTx(64);IRDetected?LED2On:LED2Off;inRange?LED1On:LED1Off;// zoek naar gebruikersknop, controleer vaakdelayAndUpdateSensors(10);delayAndCheckIR (10);if(UserButtonPressed) {delayAndUpdateSensors(1000);//active loopwhile(!(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;switch(state) {case Ready:if(sensors[SenVWall]) {//check voor nabijheid tot leaderif(inRange) {drive(0, RadStraight);} else {// drive straightdrive(SlowSpeed, RadStraight);state = volgen;}} else {//search for the beamangle = 0;distance = 0;wait_counter = 0;found = FALSE;drive(SearchSpeed, RadCCW);state = SearchingLeft;}break;case Volgend:if(sensors[SenBumpDrop] & BumpRight) {distance = 0;angle = 0;drive(-SlowSpeed, RadStraight); state=BackingTraceLeft;} else if(sensors[SenBumpDrop] & BumpLeft) {distance = 0;angle = 0;drive(-SlowSpeed, RadStraight);state=BackingTraceRight;} else if(sensors[SenVWall]) {//controleer op nabijheid tot leaderif(inRange) {drive(0, RadStraight);state = Ready;} else {//drive straightdrive(FullSpeed, RadStraight);state = volgen;}} else {// verloor het signaal, blijf langzaam één cycledistance = 0;drive(SlowSpeed, RadStraight);state = WasFollowing;}break;case WasFollowing:if(sensors[SenBumpDrop] & BumpRight) {distance = 0;angle = 0;drive(-SlowSpeed, RadStraight);state=BackingTraceLeft;} else if(sensors[SenBumpDrop] & BumpLeft) {distance = 0;angle = 0;drive(-SlowSpeed, RadStraight);state=BackingTraceRight;} else if (sensors[SenVWall]) {//check voor nabijheid tot leaderif (inRange) {drive(0, RadStraight);state = R eady;} else {//drive straightdrive(FullSpeed, RadStraight);state = volgen;}} else if (distance >= 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 (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 = volgen;} else {drive(SearchSpeed, RadCW);}} else if (sensors[SenVWall]) {found = TRUE;angle = 0;if (inRange) {drive(0, RadStraight);state = Ready;} else {drive(SearchSpeed, RadCCW);}} else if(wait_counter > 0) {wait_counter -= 20;drive(0, RadStraight);} else if (hoek = Zoeken 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;} else if(sensors[SenBumpDrop] & BumpLeft) {drive(0, RadStraight);state=Ready;} else if (sensors[SenVWall]) {//check voor nabijheid van leaderif(inRange) {drive(0, RadStraight);state = Ready;} else {//drive straightdrive(SlowSpeed, RadStraight);state = volgen;}} else if (!(distance >= TraceDistance)) { drive(SlowSpeed, RadStraight);} else 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;} else if(sensors[SenBumpDrop] & BumpLeft) {distance = 0;angle = 0;drive(- SlowSpeed, RadStraight);state=BackingTraceRight;} else if (sensors[SenVWall]) {//check voor nabijheid tot leaderif(inRang e) {drive(0, RadStraight);state = Ready;} else {//drive straightdrive(SlowSpeed, RadStraight);state = volgen;}} else if (!(distance >= TraceDistance)) {drive(SlowSpeed, RadStraight);} else if (!(hoek >= TraceAngle)) {drive(SearchSpeed, RadCCW);} else {distance = 0;angle = 0;drive(SlowSpeed, RadStraight);state = Ready;}break;case BackingTraceLeft: if (sensoren[SenVWall] && inRange) {drive(0, RadStraight);state = Ready;} else if (hoek >=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);state = Gereed;} 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 of gebruikersknop gedetecteerd, sta toe dat de toestand zich stabiliseert (bijv. knop wordt losgelaten)drive(0, RadStraight);delayAndUpdateSensors(2000);}}} // Seriële ontvangstonderbreking om sensorwaarden op te slaanSIGNAL(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 naar tijdvertragingen in msSIGNAL(SIG_OUTPUT_COMPARE1A){if(timer_cnt)timer_cnt--;elsetimer_on = 0;}// Zend een byte over de seriële poortvoid byteTx(uint8_t value){while(!(UCSR0A & _BV(UDRE0))); UDR0 = waarde;}// Vertraging voor de opgegeven tijd in ms zonder sensorwaarden bij te werkenvoid delayMs(uint16_t time_ms){timer_on = 1;timer_cnt = time_ms;while(timer_on);}// Vertraging voor de opgegeven tijd in ms en vink tweede aan 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 voor de opgegeven tijd in ms en update sensorwaardenvoid 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++)sensors[temp] = sensors_in[temp];// Update lopende totalen van afstand en hoekafstand += (int)((sensors[SenDist1] 8) | sensors[SenDist0]);angle += (int)((sensors [SenAng1] 8) | sensors[SenAng0]);byteTx(CmdSensors);byteTx(6);sensors_index = 0;sensors_flag = 1;}}}// Initialiseer de Mind Control's ATmega168 microcontrollervoid initialize(void){cli(); // Stel I/O-pinnen inDDRB = 0x10;PORTB = 0xCF;DDRC = 0x00;PORTC = 0xFF;DDRD = 0xE6;PORTD = 0x7D;// Stel timer 1 in om elke 1 ms een interrupt te genererenTCCR1A = 0x00;TCCR1B = (_BV (WGM12) | _BV(CS12));OCR1A = 71;TIMSK1 = _BV(OCIE1A);// Stel de seriële poort in met rx interruptUBRR0 = 19;UCSR0B = (_BV(RXCIE0) | _BV(TXEN0) | _BV(RXEN0));UCSR0C = (_BV(UCSZ00) | _BV(UCSZ01));// Zet interruptssei();}void powerOnRobot(void){// Als Create&aposs is uitgeschakeld, zet hem dan aanif(!RobotIsOn){while(!RobotIsOn){RobotPwrToggleLow;delayMs(500); // Vertraging in deze staatRobotPwrToggleHigh; // Overgang van laag naar hoog om powerdelayMs (100) in te schakelen; // Vertraging in deze staatRobotPwrToggleLow;}delayMs (3500); // Vertraging voor opstarten}}// Schakel de baudrate op zowel Create als modulevoid baud(uint8_t baud_code){if(baud_code = 11){byteTx(CmdBaud);UCSR0A |= _BV(TXC0);byteTx(baud_code);/ / Wacht tot het verzenden is voltooid terwijl(!(UCSR0A & _BV(TXC0)));cli();// Verander het baudrate registerif(baud_code == Baud115200)UBRR0 = Ubrr115200;else if(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 == Baud14400)UBRR0 =U 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 = Ubr1200;else baud_code == Baud600)UBRR0 = Ubrr600;else if(baud_code == Baud300)UBRR0 = Ubrr300;sei();delayMs(100);}}// Verzenden Maak drive-commando's in termen van snelheid en radiusvoid drive(int16_t velocity, int16_t straal){byteTx(CmdDrive);byteTx((uint 8_t)((snelheid >> 8) & 0x00FF));byteTx((uint8_t)(snelheid & 0x00FF));byteTx((uint8_t)((straal >> 8) & 0x00FF));byteTx((uint8_t)(straal & 0x00FF));}

Aanbevolen: