Inhaltsverzeichnis:
- Schritt 1: Bedecken des IR-Sensors
- Schritt 2: Befestigen Sie den Korb
- Schritt 3: Laden Sie den Quellcode herunter
Video: So erstellen Sie einen Robo-Bellhop – wikiHow
2024 Autor: John Day | [email protected]. Zuletzt bearbeitet: 2024-01-30 07:21
Von jeffreyfFolgen Sie mehr vom Autor:
Über: Ich mag es, Dinge auseinander zu nehmen und herauszufinden, wie sie funktionieren. Danach verliere ich generell das Interesse. Mehr über Jeffreyf »
Dieses Instructable zeigt, wie man den iRobot Create verwendet, um einen beweglichen Pagen zu machen. Dies wurde vollständig mit Erlaubnis von carolDancers Anweisungen aufgehoben und ich habe es als Beispieleintrag für unseren Wettbewerb gestellt. Robo-BellHop kann Ihr eigener persönlicher Assistent sein, um Ihre Taschen, Lebensmittel, Wäsche usw zu. Der grundlegende Create hat einen oben angebrachten Behälter und verwendet zwei integrierte IR-Detektoren, um dem IR-Sender seines Besitzers zu folgen. Mit sehr einfachem C-Softwarecode kann der Benutzer schwere Lebensmittel, eine große Ladung Wäsche oder Ihre Reisetasche auf Robo-BellHop sichern und sich vom Roboter durch die Straße, durch das Einkaufszentrum, die Halle oder durch den Flughafen folgen lassen - - wohin der Benutzer gehen muss. Grundlegender Betrieb1) Drücken Sie die Reset-Taste, um das Befehlsmodul einzuschalten und zu überprüfen, ob die Sensoren aktiv sind1a) Die Play-LED sollte aufleuchten, wenn der IR-Sender Ihnen folgt1b) Die Advance-LED sollte aufleuchten, wenn die Roboter ist in sehr kurzer Entfernung2) Drücken Sie die schwarze Softtaste, um die Robo-BellHop-Routine auszuführen3) Befestigen Sie den IR-Sender am Fußgelenk und stellen Sie sicher, dass er eingeschaltet ist. Dann den Korb beladen und losfahren!4) Die Logik von Robo-BellHop ist wie folgt:4a) Wenn Sie herumlaufen und das IR-Signal erkannt wird, fährt der Roboter mit maximaler Geschwindigkeit4b) Wenn das IR-Signal ausfällt Reichweite (durch einen zu großen oder zu spitzen Winkel), fährt der Roboter eine kurze Strecke mit langsamer Geschwindigkeit zurück, falls das Signal wieder aufgenommen wird4c) Wenn das IR-Signal nicht erkannt wird, dreht der Roboter nach links und rechts versuchen, das Signal erneut zu finden4d) Wenn das IR-Signal erkannt wird, aber der Roboter auf ein Hindernis stößt, versucht der Roboter, das Hindernis zu umfahren4e) Wenn der Roboter dem IR-Signal sehr nahe kommt, stoppt der Roboter, um das Auftreffen des Knöchel des BesitzersHardware1 virtuelle iRobot-Wandeinheit - 301 US-Dollar IR-Detektor von RadioShack - 31 US-Dollar DB-9-Stecker von Radio Shack - 44 US-Dollar 6-32 Schrauben von Home Depot - 2.502 US-Dollar 3V-Batterien, ich habe D1-Wäschekorb von Target verwendet - 51 US-Dollar zusätzliches Rad zum Aufsetzen Rückseite des Create-RobotersElektrisches Klebeband, Draht und Lötzinn
Schritt 1: Bedecken des IR-Sensors
Bringen Sie Isolierband an, um den IR-Sensor an der Vorderseite des Create-Roboters bis auf einen kleinen Schlitz abzudecken. Demontieren Sie die virtuelle Wandeinheit und ziehen Sie die kleine Platine an der Vorderseite der Einheit heraus. Dies ist etwas knifflig, da es viele versteckte Schrauben und Kunststoffhalterungen gibt. Der IR-Sender befindet sich auf der Platine. Decken Sie den IR-Sender mit einem Stück Seidenpapier ab, um IR-Reflexionen zu vermeiden. Befestigen Sie die Platine an einem Riemen oder Gummiband, das sich um Ihren Knöchel wickeln kann. Verdrahten Sie die Batterien mit der Platine, damit Sie die Batterien an einem bequemen Ort haben (ich habe es so gemacht, dass ich die Batterien in meine Tasche stecken kann).
Verdrahten Sie den 2. IR-Detektor mit dem DB-9-Anschluss und stecken Sie ihn in den Cargo Bay ePort Pin 3 (Signal) und Pin 5 (Masse). Bringen Sie den zweiten IR-Detektor an der Oberseite des vorhandenen IR-Sensors von Create an und bedecken Sie ihn mit ein paar Lagen Seidenpapier, bis der zweite IR-Detektor den Sender nicht in einer Entfernung sieht, die der Create-Roboter halten soll davon, dich zu schlagen. Sie können dies testen, nachdem Sie die Reset-Taste gedrückt haben und beobachten, wie die Advance-LED aufleuchtet, wenn Sie sich in der Stoppdistanz befinden.
Schritt 2: Befestigen Sie den Korb
Befestigen Sie den Korb mit den 6-32 Schrauben. Ich habe den Korb gerade oben auf den Create-Roboter montiert. Schieben Sie auch das Hinterrad ein, damit Sie das Gewicht auf die Rückseite des Create-Roboters legen.
Hinweise: - Der Roboter kann eine Menge Last tragen, mindestens 30 lbs. - Die geringe Größe schien der schwierigste Teil zu sein, um es mit Gepäck zu befördern - IR ist sehr temperamentvoll. Vielleicht ist es besser, Bildgebung zu verwenden, aber es ist viel teurer
Schritt 3: Laden Sie den Quellcode herunter
Der Quellcode folgt und ist in einer Textdatei angehängt:
/************************************************ ******************** follow.c ** -------- ** läuft auf Create Command Module ** deckt alle bis auf eine kleine Öffnung auf der Vorderseite ab des IR-Sensors ** Create folgt einer virtuellen Wand (oder einem beliebigen IR, der das ** Kraftfeldsignal aussendet) und vermeidet hoffentlich Hindernisse dabei ***************** ************************************************* **/#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 Bereit 0#define Folge 1#define WasFollowing 2 #define SearchingLeft 3#define SearchingRight 4#define TracingLeft 5#define TracingRight 6#define BackingTraceLeft 7#define BackingTraceRight 8// Globale Variablenv flüchtige uint16_t timer_cnt = 0;flüchtige uint8_t timer_on = 0;flüchtige uint8_t Sensoren_flag = 0;flüchtige uint8_t Sensoren_index = 0;flüchtige uint8_t Sensoren_in[Sen6Size];flüchtige uint8_t Sensoren[Sen6Size];flüchtige uint8_t Sensoren[Sen6Size];flüchtige uint8_t Sensoren[Sen6Size]; volatile 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);void initialize(void);void powerOnRobot.(void powerOnRobot.(void baud(uint8_t baud_code);void drive(int16_t speed, 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;// Einrichtung erstellen und moduleinitialize();LEDBothOff;powerOnRobot();byteTx(CmdStart);baud(Baud28800);byteTx(CmdControl);byteTx(CmdFull);// I/O für zweiten IR-Sensor setzenDDRB &= ~0x01; // Laderaum-ePort-Pin 3 als inputPORTB festlegen |= 0x01; // Cargo ePort Pin3 Pullup aktiviert einstellen // Programmschleife während (TRUE) {// Stopp nur als Vorsichtsmaßnahmedrive (0, RadStraight); // set LEDsbyteTx (CmdLeds); byteTx (((Sensoren [SenVWall])? LEDPlay: 0x00) | (inRange?LEDAdvance:0x00));byteTx(sensors[SenCharge1]);byteTx(64);IRDetected?LED2On:LED2Off;inRange?LED1On:LED1Off;//Suche nach Benutzertaste, prüfe oftdelayAndUpdateSensors(10);delayAndCheckIR (10);if(UserButtonPressed) {delayAndUpdateSensors(1000);//active loopwhile(!(UserButtonPressed)&&(!sensors[SenCliffL])&&(!sensors[SenCliffFL])&&(!sensors[SenCliffFR])&&(! Sensoren[SenCliffR])) {byteTx(CmdLeds);byteTx(((sensoren[SenVWall])?LEDPlay:0x00) | (inRange?LEDAdvance:0x00));byteTx(sensoren[SenCharge1]);byteTx(255);IRDetected ?LED2On:LED2Off;inRange?LED1On:LED1Off;switch(state) {case Ready:if(sensors[SenVWall]) {// auf Nähe zum Leader prüfenif(inRange) {drive(0, RadStraight);} else {// Drive Straightdrive (SlowSpeed, RadStraight);State = Folge;}} else {//Suche nach dem Strahlwinkel = 0;Abstand = 0;wait_counter = 0;gefunden = FALSE;drive(SearchSpeed, RadCCW);state = SearchingLeft;}break;case Following:if(sensors[SenBumpDrop] & BumpRight) {Abstand = 0;Winkel = 0;Antrieb(-SlowSpeed, RadStraight); state=BackingTraceLeft;} else if(sensors[SenBumpDrop] & BumpLeft) {Abstand = 0;Winkel = 0;drive(-SlowSpeed, RadStraight);state=BackingTraceRight;} else if(sensors[SenVWall]) {//check for Nähe zu Leaderif(inRange) {drive(0, RadStraight);state = Ready;} else {//drive straightdrive(FullSpeed, RadStraight);state = Following;}} else {//nur Signal verloren, langsam weiterfahren 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) {Abstand = 0;Winkel = 0;drive(-SlowSpeed, RadStraight);state=BackingTraceRight;} else if (sensors[SenVWall]) {//Auf Nähe zum Leader prüfenif (inRange) {drive(0, RadStraight);Zustand = R eady;} else {//drive straightdrive(FullSpeed, RadStraight);state = Following;}} 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 = Folge;} 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 (angle = Search RightAngle) {drive(0, RadStraight);wait_counter = 5000;angle = 0;} else {drive(SearchSpeed, RadCW);}break;case TracingLeft:if(sensors[SenBumpDrop] & BumpRight) {Abstand = 0;Winkel = 0;drive(-SlowSpeed, RadStraight);state=BackingTraceLeft;} else if(sensors[SenBumpDrop] & BumpLeft) {drive(0, RadStraight);state=Ready;} else if (sensors[SenVWall]) {//check für die Nähe zum Leaderif(inRange) {drive(0, RadStraight);state = Ready;} else {//drive straightdrive(SlowSpeed, RadStraight);state = Following;}} 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) {Abstand = 0;Winkel = 0;Antrieb(- SlowSpeed, RadStraight);state=BackingTraceRight;} else if (sensors[SenVWall]) {// auf Nähe zum Leader prüfenif(inRang e) {drive(0, RadStraight);state = Ready;} else {//drive straightdrive(SlowSpeed, RadStraight);state = Following;}} else if (!(distanz >= TraceDistance)) {drive(SlowSpeed, RadStraight);} else if (!(angle >= TraceAngle)) {drive(SearchSpeed, RadCCW);} else {distance = 0;angle = 0;drive(SlowSpeed, RadStraight);state = Ready;}break;case BackingTraceLeft: if (sensors[SenVWall] && inRange) {drive(0, RadStraight);state = Ready;} else if (angle >=TraceAngle) {distanz = 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 = 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 oder Userbutton erkannt, Zustand stabilisieren lassen (z. B. Taste loslassen)drive(0, RadStraight);delayAndUpdateSensors(2000);}}} // Serieller Empfangsinterrupt zum Speichern von SensorwertenSIGNAL(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 Zeitverzögerungen in msSIGNAL(SIG_OUTPUT_COMPARE1A){if(timer_cnt)timer_cnt--;elsetimer_on = 0;} // Übertrage ein Byte über den seriellen Portvoid byteTx(uint8_t value){while(!(UCSR0A & _BV(UDRE0))); UDR0 = value;} // Verzögerung für die angegebene Zeit in ms ohne Aktualisierung der Sensorwertevoid delayMs(uint16_t time_ms){timer_on = 1;timer_cnt = time_ms;while(timer_on);} // Verzögerung für die angegebene Zeit in ms und check second 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 + = IRDetected;timer_val = timer_cnt;}}inRange = (inRange>=(time_ms>>1));}// Verzögerung für die angegebene Zeit in ms und Aktualisierung der Sensorwertevoid 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] = Sensoren_in[temp]; // Laufende Summen von Distanz und Winkel aktualisieren += (int)((sensors[SenDist1] 8) | sensors[SenDist0]);angle += (int)((sensoren [SenAng1] 8) |sensoren[SenAng0]);byteTx(CmdSensors);byteTx(6);sensors_index = 0;sensors_flag = 1;}}} // Initialisieren des Mind Control&aposs ATmega168 Mikrocontrollervoid initialize(void){cli(); // E/A-Pins setzenDDRB = 0x10;PORTB = 0xCF;DDRC = 0x00;PORTC = 0xFF;DDRD = 0xE6;PORTD = 0x7D; // Timer 1 so einrichten, dass alle 1 ms ein Interrupt generiert wirdTCCR1A = 0x00;TCCR1B = (_BV (WGM12) | _BV(CS12));OCR1A = 71;TIMSK1 = _BV(OCIE1A); // Einrichten der seriellen Schnittstelle mit rx-InterruptUBRR0 = 19;UCSR0B = (_BV(RXCIE0) | _BV(TXEN0) | _BV(RXEN0));UCSR0C = (_BV(UCSZ00) | _BV(UCSZ01));// Interruptssei() einschalten;}void powerOnRobot(void){// Wenn Create&aposs power ausgeschaltet ist, schalten Sie es einif(!RobotIsOn){while(!RobotIsOn){RobotPwrToggleLow;delayMs(500); // Verzögerung in diesem ZustandRobotPwrToggleHigh; // Übergang von niedrig nach hoch, um powerdelayMs (100) umzuschalten; // Verzögerung in diesem ZustandRobotPwrToggleLow;}delayMs(3500); // Startverzögerung}}// Baudrate auf Create und modulevoid umschalten baud(uint8_t baud_code){if(baud_code = 11){byteTx(CmdBaud);UCSR0A |= _BV(TXC0);byteTx(baud_code);/ / Warten bis die Übertragung abgeschlossen istwhile(!(UCSR0A & _BV(TXC0)));cli();// Baudratenregister umschaltenif(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)UBRR4000 = 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 = Ubrr1200;else if(baud_code == Baud600)UBRR0 = Ubrr600;else if(baud_code == Baud300)UBRR0 = Ubrr300;sei();delayMs(100);}} // Senden Fahrbefehle bezüglich Geschwindigkeit und Radius erstellenvoid drive(int16_t speed, int16_t Radius){byteTx(CmdDrive);byteTx((uint 8_t)((Geschwindigkeit >> 8) & 0x00FF));byteTx((uint8_t)(Geschwindigkeit & 0x00FF));byteTx((uint8_t)((radius >> 8) & 0x00FF));byteTx((uint8_t)(radius & 0x00FF));}
Empfohlen:
So erstellen Sie einen gestengesteuerten Rover – wikiHow
So bauen Sie einen gestengesteuerten Rover: Hier sind die Anweisungen zum Bau eines gestengesteuerten Rovers (telebetriebener Rover). Es besteht aus einer Rover-Einheit, die einen Kollisionsvermeidungssensor an Bord hat. Der Sender ist keine klobige Fernbedienung, sondern ein cooler Handschuh, der o
So erstellen Sie einen einfachen Rechner in Java – wikiHow
So erstellen Sie einen einfachen Rechner in Java: Dies ist eine einfache Einführung in die Java-Programmiersprache, die für Personen mit geringen bis keinen Programmierkenntnissen gedacht ist. Materialien: Computer oder Laptop (mit installiertem Eclipse) Kann Eclipse unter https://www. eclipse.org/downloads
So erstellen Sie einen USB-Shutdown-Hack – wikiHow
So erstellen Sie einen USB-Shutdown-Hack: In diesem Tutorial zeige ich Ihnen, wie Sie einen versteckten Ordner auf einem USB-Stick erstellen, der den Computer des Benutzers herunterfährt
Erstellen Sie einen WLAN-Zugangspunkt und stellen Sie einen Webserver auf NodeMCU V3 bereit - Gunook
Erstellen Sie einen WLAN-Zugangspunkt und stellen Sie einen Webserver auf NodeMCU V3 bereit: Im vorherigen Artikel habe ich bereits über die Verwendung von NodeMCU ESP8266 gesprochen. In dem Artikel erkläre ich, wie man NodeMCU ESP8266 zu Arduini IDE hinzufügt. Es gibt mehrere Möglichkeiten, mit NodeMCU ESP8266 über das Internet zu kommunizieren. NodeMCU als
So erhalten Sie Musik von fast jeder (Haha) Website (solange Sie sie hören können, können Sie sie bekommen Okay, wenn sie in Flash eingebettet ist, können Sie es möglicherweise nicht) BEARBEITET!!!!! Hinzugefügte Informationen: 4 Schritte
So erhalten Sie Musik von fast jeder (Haha) Website (solange Sie sie hören können, können Sie sie bekommen … Okay, wenn sie in Flash eingebettet ist, können Sie es möglicherweise nicht) BEARBEITET!!!!! Zusätzliche Informationen: Wenn Sie jemals auf eine Website gehen und ein Lied abspielen, das Sie mögen und es wollen, dann ist hier das anweisbare für Sie, nicht meine Schuld, wenn Sie etwas durcheinander bringen (nur so wird es passieren, wenn Sie ohne Grund anfangen, Dinge zu löschen) ) Ich konnte Musik für