תוכן עניינים:
וִידֵאוֹ: איך להכין רובו-בלופ: 3 שלבים
2024 מְחַבֵּר: John Day | [email protected]. שונה לאחרונה: 2024-01-30 09:17
עקוב אחר מאת המחבר:
בערך: אני אוהב לפרק דברים ולברר איך הם עובדים. אני בדרך כלל מאבד עניין אחרי זה. עוד על jeffreyf »
מדריך זה מראה כיצד להשתמש ב- iRobot Create כדי ליצור בלופ מרגש. זה בוטל כולו באישור מהוראות carolDancer, והעליתי אותו כערך לדוגמא לתחרות שלנו. רובו-בלהופ יכול להיות העוזר האישי שלך לשאת את התיקים, המצרכים, הכביסה וכו ', כך שאין לך ל. ל- Create הבסיסי יש סל מחובר לחלק העליון ומשתמש בשני גלאי IR משולבים כדי לעקוב אחר משדר ה- IR של בעליו. עם קוד תוכנת C בסיסי מאוד, המשתמש יכול לאבטח מצרכים כבדים, המון כביסה או תיק לילה שלך על רובו -בלהופ ולגרום לרובוט לעקוב אחריך ברחוב, דרך הקניון, במסדרון או דרך שדה התעופה - - לאן שהמשתמש צריך ללכת. פעולה בסיסית 1) לחץ על כפתור האיפוס כדי להפעיל את מודול הפקודה ולבדוק שחיישנים מרתקים 1 א) נורית ה- Play צריכה להידלק כאשר היא רואה שמשדר ה- IR עוקב אחריך 1b) נורית ה- Advance צריכה להידלק כאשר הרובוט נמצא בטווח קרוב מאוד 2) לחץ על כפתור רך שחור להפעלת שגרת Robo-BellHop 3) חבר את משדר ה- IR לקרסול וודא שהוא מופעל. לאחר מכן העמיס את הסל ולך! טווח (על ידי זווית רחוקה מדי או חדה מדי), הרובוט יעבור מרחק קצר במהירות איטית במקרה שהאות יתקבל שוב 4c) אם אות ה- IR לא מזוהה, הרובוט יפנה שמאלה וימינה בתוך ניסיון למצוא את האות שוב הקרסוליים של הבעלים חומרה 1 יחידת קיר וירטואלית iRobot - גלאי IR 301 $ מ- RadioShack - מחבר זכר DB -9 מ- Radio Shack - 44 $ 6-32 ברגים מהום דיפו - 2.502 $ סוללות 3V, השתמשתי בסל כביסה D1 מבית Target - גלגל נוסף 51 $ על חלקו האחורי של הרובוט צור סרט קלטת, חוט והלחמה
שלב 1: כיסוי חיישן ה- IR
צרף סרט חשמלי כדי לכסות את כל החריץ הקטן למעט חריץ של חיישן ה- IR בחזית הרובוט Create. לפרק את יחידת הקיר הווירטואלית וחלץ את הלוח הקטן בחזית היחידה. זה קצת מסובך כי יש הרבה ברגים נסתרים ותושבי פלסטיק. משדר ה- IR נמצא בלוח המעגלים. מכסים את משדר ה- IR בפיסת נייר טישו כדי להימנע מהשתקפויות IR. חבר את לוח המעגלים לרצועה או לגומייה שיכולה להתעטף בקרסולך. חבר את הסוללות ללוח המעגלים כך שתוכל להחזיק את הסוללות במקום נוח (עשיתי את זה כדי שאוכל להכניס את הסוללות לכיס).
חבר את גלאי ה- IR השני למחבר DB-9 והכנס לפין 3 (אות אות Cargo Bay) וסיכה 5 (קרקע). חבר את גלאי ה- IR השני לחלקו העליון של חיישן ה- IR הקיים ב- Create וכסה אותו בכמה שכבות של נייר טישו עד שגלאי ה- IR השני אינו רואה את הפולט במרחק שאתה רוצה שהרובוט Create יעצור כדי לשמור מלפגוע בך. תוכל לבדוק זאת לאחר לחיצה על כפתור האיפוס ולצפות בנורית ה- Advance שתדלק כאשר אתה נמצא במרחק עצירה.
שלב 2: צרף את הסל
חבר את הסל בעזרת הברגים 6-32. הרגע הרמתי את הסל לראש הרובוט Create. החלק גם את הגלגל האחורי כך שתניח משקל על גב הרובוט Create.
הערות: - הרובוט יכול לשאת לא מעט עומס, לפחות 30 ק ג. - הגודל הקטן נראה היה החלק הקשה ביותר בהובלתו לשאת כל מטען - IR הוא מאוד מזג. אולי השימוש בהדמיה עדיף אבל זה הרבה יותר יקר
שלב 3: הורד את קוד המקור
קוד המקור הבא, והוא מצורף בקובץ טקסט:
/********************************************* ******************** follow.c ** -------- ** פועל על Create Module Command ** מכסה את כל הפתח מלבד הקטן בחזית של חיישן ה- IR ** Create יעקוב אחר קיר וירטואלי (או כל IR שישלח את ** אות שדה הכוח) ובתקווה להימנע ממכשולים בתהליך ***************** ********************************************** **/#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#הגדר SearchRightAngle (SearchLeftAngle - 1000) #define CoastDistance 150#הגדר TraceDistance 250#הגדר TraceAngle 30#הגדר BackDistance 25#הגדר IRDetected (~ PINB & 0x01) // מצבים#הגדר מוכן 0#הגדר בעקבות 1#הגדר WasFollowing 2 #define SearchingLeft 3#להגדיר SearchingRight 4#להגדיר TracingLeft 5#להגדיר TracingRight 6#להגדיר BackingTraceLeft 7#להגדיר BackingTraceRight 8 // משתנים גלובליים v uint16_t timer_cnt = 0; uint8_t timer_on = 0; uint8_t sensors_flag = 0; uint8_t sensors_index = 0; חיישנים נדיפים uint8_t_in [Sen6Size]; חיישנים נדיפים uint8_t [Sen6Size]; זווית int16_table = 0; uint8_t inRange = 0; // Functionsvoid byteTx (uint8_t value); void delayMs (uint16_t time_ms); void delayAndCheckIR (uint16_t time_ms); void delayAndUpdateSensors (united int time_ms); 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; // הגדר Create ו- moduleinitialize (); LEDBothOff; powerOnRobot (); byteTx (CmdStart); baud (Baud28800); byteTx (CmdControl); byteTx (CmdFull); // set i/o עבור חיישן IR שני DDRB & = ~ 0x01; // הגדר את סיכת ePort cargo bay 3 כ- inputPORTB | = 0x01; // הגדרת מטען ePort pin3 pullup מופעלת // תכנית לולאה בזמן (TRUE) {// עצור רק כאמצעי זהירות (0, RadStraight); // הגדר LEDsbyteTx (CmdLeds); byteTx (((חיישנים [SenVWall])? LEDPlay: 0x00) | (inRange? LEDAdvance: 0x00)); byteTx (חיישנים [SenCharge1]); byteTx (64); IRDetected? LED2On: LED2Off; inRange? LED1On: LED1Of; (10); אם (UserButtonPressed) {delayAndUpdateSensors (1000); // לולאה פעילה בזמן (! (UserButtonPressed) && (! חיישנים [SenCliffL]) && (! חיישנים [SenCliffFL]) && (! חיישנים [SenCliffFR]) && (! חיישנים [SenCliffR])) {byteTx (CmdLeds); byteTx (((חיישנים [SenVWall])? LEDPlay: 0x00) | (inRange? LEDAdvance: 0x00)); byteTx (חיישנים [SenCharge1]); byteTx (255); ? LED2On: LED2Off; inRange? LED1On: LED1Off; מתג (מצב) {מקרה מוכן: אם (חיישנים [SenVWall]) {// בדוק אם הוא נמצא בקרבת leaderif (inRange) {drive (0, RadStraight);} אחר {// drive straightdrive (SlowSpeed, RadStraight); state = עוקב;}} אחר {// חפש את beamangle = 0; distance = 0; wait_counter = 0; found = FALSE; drive (SearchSpeed, RadCCW); state = SearchingLeft;} break; מקרה הבא: if (חיישנים [SenBumpDrop] & BumpRight) {distance = 0; angle = 0; drive (-SlowSpeed, RadStraight); state = BackingTraceLeft;} else if (חיישנים [SenBumpDrop] & BumpLeft) {distance = 0; angle = 0; drive (-SlowSpeed, RadStraight); state = BackingTraceRight;} אחר אם (חיישנים [SenVWall]) {// בדוק אם קרבה ל- leaderif (inRange) {drive (0, RadStraight); state = Ready;} else {// drive straightdrive (FullSpeed, RadStraight); state = בעקבות;}} אחרת {// רק איבדת את האות, המשך לאט אחד cycledistance = 0; drive (SlowSpeed, RadStraight); state = WasFollowing;} break; case WasFollowing: if (חיישנים [SenBumpDrop] & BumpRight) {distance = 0; angle = 0; drive (-SlowSpeed, RadStraight); state = BackingTraceLeft;} אחרת אם (חיישנים [SenBumpDrop] & BumpLeft) {distance = 0; angle = 0; drive (-SlowSpeed, RadStraight); state = BackingTraceRight;} אחרת אם (חיישנים [SenVWall]) {// בדוק אם יש קרבה ל- leaderif (inRange) {drive (0, RadStraight); מצב = 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);}}} אחר אם (חיישנים [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); מצב = עוקבים;} אחר {כונן (SearchSpeed, RadCW);}} עוד אם (חיישנים [SenVWall]) {נמצא = TRUE; זווית = 0; אם (inRange) {drive (0, RadStraight); state = Ready;} אחר {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 (חיישנים [SenBumpDrop] & BumpRight) {distance = 0; angle = 0; drive (-SlowSpeed, RadStraight); state = BackingTraceLeft;} else if (חיישנים [SenBumpDrop] & BumpLeft) {drive (0, RadStraight); state = Ready;} אחרת אם (חיישנים [SenVWall]) {// לבדוק עבור קרבה ל- 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 (חיישנים [SenBumpDrop] & BumpRight) {drive (0, RadStraight); state = Ready;} אחרת אם (חיישנים [SenBumpDrop] & BumpLeft) {distance = 0; angle = 0; drive (- SlowSpeed, RadStraight); state = BackingTraceRight;} אחרת אם (חיישנים [SenVWall]) {// בדוק אם יש קרבה ל- leaderif (inRang ה) {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, RadCCW);} else {distance = 0; angle = 0; drive (SlowSpeed, RadStraight); state = Ready;} break; case BackingTraceLeft: if (חיישנים [SenVWall] && inRange) {drive (0, RadStraight); state = Ready;} אחרת אם (זווית> = TraceAngle) {distance = 0; זווית = 0; drive (SlowSpeed, RadStraight); state = TracingLeft; } else if (-distance> = BackDistance) {drive (SearchSpeed, RadCCW);} else {drive (-SlowSpeed, RadStraight);} break; case BackingTraceRight: if (חיישנים [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; ברירת מחדל: // stopdrive (0, RadStraight); state = Re ady; break;} delayAndCheckIR (10); delayAndUpdateSensors (10);} // מצוק או כפתור משתמש זוהה, אפשר למצב להתייצב (למשל, כפתור לשחרור) כונן (0, RadStraight); delayAndUpdateSensors (2000);}}}} // הפסקת קבלה סדרתית לאחסן ערכי חיישן SIGNAL (SIG_USART_RECV) {uint8_t temp; temp = UDR0; if (sensors_flag) {sensors_in [sensors_index ++] = temp; if (sensors_index> = Sen6Size) sensors_flag = 0;}} // טיימר 1 הפרעה לעיכובים בזמן ב- msSIGNAL (SIG_OUTPUT_COMPARE1A) {if (timer_cnt) timer_cnt-; elsetimer_on = 0;} // העברת בתים מעל ה- byteTx הטורי (ערך uint8_t) {while (! (UCSR0A & _BV (UDRE0)))); UDR0 = value;} // עיכוב עבור הזמן שצוין ב- ms מבלי לעדכן את ערכי החיישנים.עיכוב זמן Ms (uint16_t time_ms) {timer_on = 1; timer_cnt = time_ms; while (timer_on);} // עיכוב עבור הזמן שצוין ב- ms ובדוק שנייה גלאי IR voidAndCheckIR (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));} // עיכוב עבור הזמן שצוין ב- ms ועדכן את ערכי החיישן void delayAndUpdateSensors (uint16_t time_ms) {uint8_t temp; timer_on = 1; timer_cnt = time_ms; while (timer_on) {if (! sensors_flag) {for (temp = 0; טמפרטורה Sen6Size; temp ++) חיישנים [temp] = sensors_in [temp]; // עדכון סכומי ריצה של מרחק וזווית += (int) ((חיישנים [SenDist1] 8) | חיישנים [SenDist0]); זווית += (int) ((חיישנים [SenAng1] 8) | חיישנים [SenAng0]); // הגדר סיכות I/O DDRB = 0x10; PORTB = 0xCF; DDRC = 0x00; PORTC = 0xFF; DDRD = 0xE6; PORTD = 0x7D; // הגדר טיימר 1 ליצירת הפסקה כל 1 msTCCR1A = 0x00; TCCR1B = (_BV (WGM12) | _BV (CS12)); OCR1A = 71; TIMSK1 = _BV (OCIE1A); // הגדר את היציאה הטורית עם rx interruptUBRR0 = 19; UCSR0B = (_BV (RXCIE0) | _BV (TXEN0) | _BV (RXEN0))); UCSR0C = (_BV (UCSZ00) | _BV (UCSZ01)); // הפעל את interruptssei ();} void powerOnRobot (void) {// אם הכח יצירה והפעלה כבוי, הפעל אותו אם (! RobotIsOn) {בעוד (! RobotIsOn) {RobotPwrToggleLow; delayMs (500); // עיכוב במצב זהRobotPwrToggleHigh; // מעבר נמוך לגבוה להחלפת powerdelayMs (100); // עיכוב במצב stateRobotPwrToggleLow;} delayMs (3500); // עיכוב להפעלה}} // החלף את קצב השידור הן ב- Create והן ב- modulevoid baud (uint8_t baud_code) {if (baud_code = 11) {byteTx (CmdBaud); UCSR0A | = _BV (TXC0); byteTx (baud_code);/ / המתן עד שהשידור יושלם בעוד (! (UCSR0A & _BV (TXC0))); cli (); // החלף את רישום קצב השידור (baud_code == Baud115200) UBRR0 = Ubrr115200; אחרת אם (baud_code == Baud57600) UBRR0 = Ubrr57600; אחרת אם (baud_code == Baud38400) UBRR0 = Ubrr38400; אחרת אם (baud_code == Baud28800) UBRR0 = Ubrr28800; אחרת אם (baud_code == Baud19200) UBRR0 = Ubrr19200; אחר אם (baud_code == Baud14400) UBRR0 = אחרת אם (baud_code == Baud9600) UBRR0 = Ubrr9600; אחרת אם (baud_code == Baud4800) UBRR0 = Ubrr4800; אחרת אם (baud_code == Baud2400) UBRR0 = Ubrr2400; אחרת אם (baud_code == Baud1200) UBRR0 = אבר 12 baud_code == Baud600) UBRR0 = Ubrr600; אחרת אם (baud_code == Baud300) UBRR0 = Ubrr300; sei (); delayMs (100);}} // שלח צור פקודות כונן במונחים של מהירות ורדיוס חלל (int16_t מהירות, int16_t רדיוס) {byteTx (CmdDrive); byteTx ((uint 8_t) ((מהירות >> 8) & 0x00FF)); byteTx ((uint8_t) (מהירות & 0x00FF)); byteTx ((uint8_t) ((רדיוס >> 8) & 0x00FF)); byteTx ((uint8_t) (רדיוס & 0x00FF));}
מוּמלָץ:
איך להכין טלפון פח אלחוטי! (מכשיר קשר ארדואינו): 7 שלבים (עם תמונות)
איך להכין טלפון פח אלחוטי! (ארקינו ווקי טוקי): ממש לפני כמה ימים, הייתי באמצע שיחת טלפון חשובה מאוד כשטלפון הבננות שלי הפסיק לעבוד! הייתי כל כך מתוסכל. זו הפעם האחרונה שאני מפספסת שיחה בגלל הטלפון המטופש הזה! (בדיעבד, אולי קצת יותר מדי כעסתי על
איך להכין מכס במיינקראפט: 8 שלבים
איך עושים מכס במיינקראפט: שלום לכולם !! שמי מתיו ווייט ובמהלך ההדרכה הזו אראה לך תהליך שלב אחר שלב כיצד להכין מכס עץ במהדורת ג'אווה Minecraft
זרוע רובו רובו מיקרו סרוו: 10 שלבים
זרוע רובוט כפולה של מיקרו סרוו: בהדרכה זו תכין זרוע רובו סרוו כפולה הנשלטת על ידי אגודל
כיצד להכין דחליל פרה מדהימה של רובו: 16 שלבים (עם תמונות)
איך להכין דחליל פרה מדהימה של רובו: יצרתי לאחרונה את מו-בוט, דחליל פרה רובוטית שקופץ מעל הירח, לתחרות דחלילים מקומית. ההשראה שלי הייתה מבני ששר " היי סתירה, החתול והכינור. .. " הפרויקט היה מאוד כיף לעבוד עליו עם
כיצד להכין רובוט עוקב אחר הקו הקטן בעולם (רובו ריזה): 7 שלבים (עם תמונות)
כיצד להכין רובוט עוקב אחר הקווים הקטנים בעולם (רובו ריזה): כיצד להפוך רובוט עוקב אחר הקווים הקטן בעולם (vibrobot) " roboRizeh " משקל: 5 גרם גודל: 19x16x10 מ"מ מאת: Naghi Sotoudeh המילה " Rizeh " היא מילה פרסית שפירושה " זעיר ". Rizeh הוא רטט קטן מאוד המבוסס על רטט