Inhoudsopgave:
Video: Hoe maak je een Robo-Bellhop: 3 stappen
2024 Auteur: John Day | [email protected]. Laatst gewijzigd: 2024-01-30 11:19
Door jeffreyfVolg meer van de auteur:
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
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:
Clockception - Hoe maak je een klok gemaakt van klokken bouwen! 14 stappen (met afbeeldingen) Antwoorden op al uw "Hoe?"
Clockception - Hoe maak je een klok gemaakt van klokken!: Hallo allemaal! Dit is mijn inzending voor de First Time Author Contest 2020! Als je dit project leuk vindt, zou ik je stem zeer op prijs stellen :) Bedankt! Deze instructable leidt je door het proces voor het bouwen van een klok gemaakt van klokken! Ik heb slim genoemd
Hoe maak je een verstelbare helicoïde adapter voor een 85 mm projectorlens, van een polypropyleen buisconnector - Ajarnpa
Hoe maak je een verstelbare helicoïde adapter voor een 85 mm projectorlens, van een polypropyleen buisconnector: Ik heb onlangs een oude diaprojector gekocht voor ongeveer 10 euro. De projector is uitgerust met een 85 mm f/2.8 lens, die eenvoudig van de projector zelf kan worden verwijderd (er hoeven geen onderdelen te worden gedemonteerd). Dus besloot ik om het te transformeren in een 85 mm-lens voor mijn Penta
Hoe maak je een drone met Arduino UNO - Maak een quadcopter met behulp van microcontroller - Ajarnpa
Hoe maak je een drone met Arduino UNO | Maak een quadcopter met behulp van een microcontroller: inleiding Bezoek mijn YouTube-kanaal Een drone is een erg duur gadget (product) om te kopen. In dit bericht ga ik bespreken, hoe ik het goedkoop kan maken? En hoe kun je er zo zelf een maken voor een goedkope prijs … Nou, in India zijn alle materialen (motoren, ESC's
Hoe maak je een stopwatch met Arduino 8 stappen (met afbeeldingen) Antwoorden op al uw "Hoe?"
Hoe maak je een stopwatch met behulp van Arduino: dit is een zeer eenvoudige Arduino 16 * 2 lcd-scherm stopwatch ……….. Als je deze Instructable leuk vindt, abonneer je dan op mijn kanaal https://www.youtube.com /ZenoModiff
Hoe maak je een klapschakelaarcircuit 12 stappen (met afbeeldingen) Antwoorden op al uw "Hoe?"
Hoe maak je een klapschakelaarcircuit: Hallo vriend, vandaag ga ik een circuit maken van een klapschakelaar. Wanneer we zullen klappen, zal de LED gloeien. Dit circuit is geweldig. Om dit circuit te maken, zal ik LM555 IC en C945-transistor gebruiken. begin