Mục lục:

Cách tạo Robo-Bellhop: 3 bước
Cách tạo Robo-Bellhop: 3 bước

Video: Cách tạo Robo-Bellhop: 3 bước

Video: Cách tạo Robo-Bellhop: 3 bước
Video: Tony | Chế Tạo Người Máy Biết Đi 🤖 𝐑𝐨𝐛𝐨𝐭 𝐖𝐢𝐭𝐡 𝟑𝐃 𝐏𝐞𝐧 2024, Tháng mười một
Anonim

Bởi jeffreyf

Cách tham gia cuộc thi nhỏ iRobot Create Scholarship
Cách tham gia cuộc thi nhỏ iRobot Create Scholarship
Cách tham gia cuộc thi nhỏ iRobot Create Scholarship
Cách tham gia cuộc thi nhỏ iRobot Create Scholarship
Cách tạo Mèo LOLCats, Mèo Meme, Macro mèo hoặc hình ảnh mèo với chú thích hài hước
Cách tạo Mèo LOLCats, Mèo Meme, Macro mèo hoặc hình ảnh mèo với chú thích hài hước
Cách tạo Mèo LOLCats, Mèo Meme, Macro mèo hoặc hình ảnh mèo với chú thích hài hước
Cách tạo Mèo LOLCats, Mèo Meme, Macro mèo hoặc hình ảnh mèo với chú thích hài hước
Cách tham gia Cuộc thi may vá hữu ích của Etsy và Guiductables
Cách tham gia Cuộc thi may vá hữu ích của Etsy và Guiductables
Cách tham gia Cuộc thi may vá hữu ích của Etsy và Guiductables
Cách tham gia Cuộc thi may vá hữu ích của Etsy và Guiductables

Về: Tôi thích tách mọi thứ ra và tìm hiểu cách chúng hoạt động. Tôi thường mất hứng thú sau đó. Thông tin thêm về jeffreyf »

Có thể hướng dẫn này hướng dẫn cách sử dụng iRobot Create để tạo một cửa hàng chuông chuyển động. Điều này đã được dỡ bỏ hoàn toàn với sự cho phép từ hướng dẫn của carolDancer và tôi đã đưa nó lên làm mục nhập mẫu cho cuộc thi của chúng tôi. Robo-BellHop có thể là trợ lý cá nhân của riêng bạn để mang theo túi xách, hàng tạp hóa, giặt là, v.v. của bạn, vì vậy bạn không cần phải đến. Create cơ bản có một thùng được gắn ở phía trên và sử dụng hai bộ dò IR trên bo mạch để theo dõi bộ phát IR của chủ sở hữu nó. Với mã phần mềm C rất cơ bản, người dùng có thể bảo mật hàng tạp hóa nặng, khối lượng lớn đồ giặt hoặc túi qua đêm của bạn vào Robo-BellHop và để robot theo bạn trên đường phố, qua trung tâm mua sắm, hành lang hoặc qua sân bay - - bất cứ nơi nào người dùng cần đến. Hoạt động cơ bản1) Nhấn nút Đặt lại để bật mô-đun lệnh và kiểm tra các cảm biến đang hoạt động rô bốt đang ở cự ly rất gần2) Nhấn nút mềm màu đen để chạy quy trình Robo-BellHop3) Gắn bộ phát IR vào mắt cá chân và đảm bảo rằng nó đã được bật. Sau đó, chất lên giỏ và đi! 4) Logic của Robo-BellHop như sau: 4a) Khi bạn đi bộ xung quanh, nếu tín hiệu IR được phát hiện, robot sẽ lái xe ở tốc độ tối đa 4b) Nếu tín hiệu IR tắt phạm vi (do góc quá xa hoặc quá nhọn), rô bốt sẽ đi qua một khoảng cách ngắn với tốc độ chậm trong trường hợp tín hiệu được thu lại4c) Nếu tín hiệu IR không được phát hiện, rô bốt sẽ rẽ trái và phải trong một cố tìm lại tín hiệu Mắt cá chân của chủ sở hữuHardware1 Thiết bị tường ảo iRobot - Bộ dò hồng ngoại $ 301 từ RadioShack - Đầu nối nam DB-9 $ 31 từ Radio Shack - $ 44 6-32 vít từ Home Depot - $ 2,502 pin 3V, tôi đã sử dụng giỏ giặt D1 từ Target - thêm $ 51 bánh xe để lên mặt sau của Tạo robot Băng, dây điện và vật hàn

Bước 1: Che cảm biến hồng ngoại

Đính kèm băng dính điện để che tất cả trừ một khe nhỏ của cảm biến IR ở mặt trước của robot Tạo. Tháo thiết bị tường ảo và trích xuất bảng mạch nhỏ ở phía trước thiết bị. Điều này hơi phức tạp vì có rất nhiều ốc vít và ngàm nhựa ẩn. Bộ phát IR trên bảng mạch. Che bộ phát IR bằng một mảnh giấy ăn để tránh phản xạ IR. Gắn bảng mạch vào dây đeo hoặc dây thun có thể quấn quanh mắt cá chân của bạn. Nối dây pin vào bảng mạch để bạn có thể đặt pin ở một nơi thoải mái (tôi làm nó để tôi có thể bỏ pin vào túi của mình).

Nối dây đầu dò IR thứ 2 vào đầu nối DB-9 và lắp vào chân 3 (tín hiệu) và chân 5 (nối đất) của Cargo Bay ePort. Gắn đầu dò hồng ngoại thứ 2 vào đầu cảm biến hồng ngoại hiện có trên Tạo và che nó bằng một vài lớp giấy lụa cho đến khi bộ phát hiện hồng ngoại thứ 2 không nhìn thấy bộ phát ở khoảng cách mà bạn muốn robot Tạo dừng lại để giữ khỏi đánh bạn. Bạn có thể kiểm tra điều này sau khi nhấn nút Đặt lại và xem Đèn LED báo trước bật sáng khi bạn ở khoảng cách dừng.

Bước 2: Gắn giỏ

Gắn giỏ bằng vít 6-32. Tôi vừa gắn cái giỏ lên đầu robot Tạo. Cũng trượt ở bánh sau để bạn đặt trọng lượng lên phía sau của Robot tạo.

Lưu ý: - Robot có thể mang khá nhiều tải, ít nhất là 30 lbs. - Kích thước nhỏ dường như là phần khó khăn nhất để mang nó theo bất kỳ hành lý nào - IR rất thất thường. Có lẽ sử dụng hình ảnh tốt hơn nhưng nó đắt hơn nhiều

Bước 3: Tải xuống Mã nguồn

Tải xuống mã nguồn
Tải xuống mã nguồn

Mã nguồn sau và được đính kèm trong một tệp văn bản:

/ ************************************************* ******************** follow.c ** -------- ** chạy trên Tạo mô-đun lệnh ** che tất cả trừ phần mở nhỏ ở mặt trước của cảm biến IR ** Tạo sẽ đi theo một bức tường ảo (hoặc bất kỳ IR nào gửi ra ** tín hiệu trường lực) và hy vọng tránh được các chướng ngại vật trong quá trình ***************** ************************************************** ** / # bao gồm ngắt.h> #include io.h> # bao gồm # bao gồm "oi.h" #define TRUE 1 # xác định FALSE 0 # xác định FullSpeed 0x7FFF # xác định Tốc độ chậm 0x0100 # xác định Tốc độ tìm kiếm 0x0100 # xác định ExtraAngle 10 # xác định SearchLeftAngle 125 # xác định SearchRightAngle (Tìm kiếmLeftAngle - 1000) #define CoastDistance 150 # xác định TraceDistance 250 # xác định TraceAngle 30 # định nghĩa Trở lại 25 # xác định IRDetected (~ PINB & 0x01) // các trạng thái # xác định Sẵn sàng 0 # xác định Sau 1 # xác định WasFollowing 2 #define SearchingLeft 3 # xác định SearchingRight 4 # xác định TracingLeft 5 # xác định TracingRight 6 # xác định BackingTraceLeft 7 # xác định BackingTraceRight 8 // Các biến toàn cụcv olatile uint16_t timer_cnt = 0; dễ bay hơi uint8_t timer_on = 0; dễ bay hơi uint8_t cảm biến_flag = 0; dễ bay hơi uint8_t cảm biến_index = 0; dễ bay hơi uint8_t cảm biến_in [Sen6Size]; cảm biến uint8_t dễ bay hơi [Sen6Size]; biến khoảng cách int16_t = 0; biến đổi int 016; dễ bay hơi 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 khởi tạo (void); void powerOn 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; // Thiết lập Create và moduleinitialize (); LEDBothOff; powerOnRobot (); byteTx (CmdStart); baud (Baud28800); byteTx (CmdControl); byteTx (CmdFull); // thiết lập i / o cho cảm biến IR thứ haiDDRB & = ~ 0x01; // đặt chân 3 của ePort khoang chở hàng thành inputPORTB | = 0x01; // thiết lập kích hoạt pullup ePort pin3 // chương trình vòng lặp trong khi (TRUE) {// Dừng chỉ như một ổ đĩa đề phòng (0, RadStraight); // thiết lập LEDbyteTx (CmdLeds); byteTx (((cảm biến [SenVWall])? LEDPlay: 0x00) | (inRange? LEDAdvance: 0x00)); byteTx (cảm biến [SenCharge1]); byteTx (64); IRDetected? LED2On: LED2Off; inRange? LED1On: LED1Off; // tìm kiếm nút người dùng, kiểm tra oftendelayAndUpdateSensors (10); delayAndCheckIR (10); if (UserButtonPressed) {delayAndUpdateSensors (1000); // hoạt động vòng lặp trong khi (! (UserButtonPressed) && (! Sensor [SenCliffL]) && (! Sensor [SenCliffFL]) && (! Sensor [SenCliffFR]) && (! Sensor [SenCliffFR]) && (! cảm biến [SenCliffR])) {byteTx (CmdLeds); byteTx (((cảm biến [SenVWall])? LEDPlay: 0x00) | (inRange? LEDAdvance: 0x00)); byteTx (cảm biến [SenCharge1]); byteTx (255); IRDetected ? LED2On: LED2Off; inRange? LED1On: LED1Off; switch (trạng thái) {case Ready: if (sensor [SenVWall]) {// kiểm tra độ gần với leaderif (inRange) {drive (0, RadStraight);} else {// ổ đĩa thẳng (SlowSpeed, RadStraight); trạng thái = Đang theo dõi;}} else {// tìm kiếm chùm tia = 0; khoảng cách = 0; wait_counter = 0; found = FALSE; drive (SearchSpeed, RadCCW); state = SearchingLeft;} break; case Sau đây: if (sensor [SenBumpDrop] & BumpRight) {distance = 0; angle = 0; drive (-SlowSpeed, RadStraight); state = BackingTraceLeft;} else if (sensor [SenBumpDrop] & BumpLeft) {distance = 0; angle = 0; drive (-SlowSpeed, RadStraight); state = BackingTraceRight;} else if (sensor [SenVWall]) {// kiểm tra proximity to leaderif (inRange) {drive (0, RadStraight); state = Ready;} else {// drive directdrive (FullSpeed, RadStraight); state = Đang theo dõi;}} else {// vừa mất tín hiệu, tiếp tục đi chậm một chút cycledistance = 0; drive (SlowSpeed, RadStraight); state = WasFollowing;} break; case WasFollowing: if (sensor [SenBumpDrop] & BumpRight) {distance = 0; angle = 0; drive (-SlowSpeed, RadStraight); state = BackingTraceLeft;} else if (sensor [SenBumpDrop] & BumpLeft) {distance = 0; angle = 0; drive (-SlowSpeed, RadStraight); state = BackingTraceRight;} else if (sensor [SenVWall]) {// kiểm tra độ gần với chân không (inRange) {drive (0, RadStraight); state = R eady;} else {// drive directdrive (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 (cảm biến [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 = Đang theo dõi;} else {drive (SearchSpeed, RadCW);}} else if (sensor [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 = Tìm kiếm RightAngle) {drive (0, RadStraight); wait_counter = 5000; angle = 0;} else {drive (SearchSpeed, RadCW);} break; case TracingLeft: if (sensor [SenBumpDrop] & BumpRight) {distance = 0; angle = 0; drive (-SlowSpeed, RadStraight); state = BackingTraceLeft;} else if (sensor [SenBumpDrop] & BumpLeft) {drive (0, RadStraight); state = Ready;} else if (sensor [SenVWall]) {// kiểm tra for proximity to leaderif (inRange) {drive (0, RadStraight); state = Ready;} else {// drive directdrive (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 (sensor [SenBumpDrop] & BumpRight) {drive (0, RadStraight); state = Ready;} else if (sensor [SenBumpDrop] & BumpLeft) {distance = 0; angle = 0; drive (- SlowSpeed, RadStraight); state = BackingTraceRight;} else if (sensor [SenVWall]) {// kiểm tra độ gần của leaderif (inRang e) {drive (0, RadStraight); state = Ready;} else {// drive directdrive (SlowSpeed, RadStraight); state = Đang theo dõi;}} 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 (sensor [SenVWall] && inRange) {drive (0, RadStraight); state = Ready;} else if (angle> = 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 (sensor [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);} // phát hiện thấy vách đá hoặc nút người dùng, cho phép điều kiện ổn định (ví dụ: nút được giải phóng) drive (0, RadStraight); delayAndUpdateSensors (2000);}}} // Ngắt nhận nối tiếp để lưu trữ giá trị cảm biếnSIGNAL (SIG_USART_RECV) {uint8_t temp; temp = UDR0; if (sensor_flag) {sensor_in [sensor_index ++] = temp; if (sensor_index> = Sen6Size) sensor_flag = 0;}} // Bộ hẹn giờ 1 ngắt đến độ trễ thời gian tính bằng msSIGNAL (SIG_OUTPUT_COMPARE1A) {if (timer_cnt) timer_cnt -; elsetimer_on = 0;} // Truyền một byte qua cổng nối tiếp byteTx (giá trị uint8_t) {while (! (UCSR0A & _BV (UDRE0))); UDR0 = value;} // Độ trễ trong thời gian được chỉ định tính bằng mili giây mà không cập nhật giá trị cảm biến, tránh delayMs (uint16_t time_ms) {timer_on = 1; timer_cnt = time_ms; while (timer_on);} // Độ trễ trong thời gian được chỉ định tính bằng mili giây và kiểm tra giây 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));} // Trì hoãn trong thời gian cụ thể tính bằng ms và cập nhật các giá trị cảm biến để tránh delayAndUpdateSensors (uint16_t time_ms) {uint8_t temp; timer_on = 1; timer_cnt = time_ms; while (timer_on) {if (! sensor_flag) {for (temp = 0; nhiệt độ Sen6Size; temp ++) sensor [temp] = sensor_in [temp]; // Cập nhật tổng khoảng cách và góc nghiêng đang chạy + = (int) ((sensor [SenDist1] 8) | sensor [SenDist0]); angle + = (int) ((sensor [SenAng1] 8) | sensor [SenAng0]); byteTx (CmdSensors); byteTx (6); sensor_index = 0; sensor_flag = 1;}}} // Khởi tạo vi điều khiển Mind Control & aposs ATmega168 khởi tạo (void) {cli (); // Đặt các chân I / ODDRB = 0x10; PORTB = 0xCF; DDRC = 0x00; PORTC = 0xFF; DDRD = 0xE6; PORTD = 0x7D; // Thiết lập bộ định thời 1 để tạo ngắt sau mỗi 1 msTCCR1A = 0x00; TCCR1B = (_BV (WGM12) | _BV (CS12)); OCR1A = 71; TIMSK1 = _BV (OCIE1A); // Thiết lập cổng nối tiếp với rx ngắtUBRR0 = 19; UCSR0B = (_BV (RXCIE0) | _BV (TXEN0) | _BV (RXEN0))); UCSR0C = (_BV (UCSZ00) | _BV (UCSZ01)); // Bật ngắtssei ();} void powerOnRobot (void) {// Nếu nguồn Create & aposs bị tắt, hãy tắt nó onif (! RobotIsOn) {while (! RobotIsOn) {RobotPwrToggleLow; delayMs (500); // Độ trễ ở trạng thái nàyRobotPwrToggleHigh; // Chuyển từ thấp đến cao để chuyển đổi powerdelayMs (100); // Độ trễ trong trạng thái nàyRobotPwrToggleLow;} delayMs (3500); // Độ trễ khi khởi động}} // Chuyển tốc độ truyền trên cả Tạo và mô-đun tránh baud (uint8_t baud_code) {if (baud_code = 11) {byteTx (CmdBaud); UCSR0A | = _BV (TXC0); byteTx (baud_code); / / Chờ cho đến khi quá trình truyền hoàn tất (! (UCSR0A & _BV (TXC0))); cli (); // Chuyển đổi đăng ký tốc độ baud (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) UBR4000 = else Ubrr 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 = else Ubrr1200; baud_code == Baud600) UBRR0 = Ubrr600; else if (baud_code == Baud300) UBRR0 = Ubrr300; sei (); delayMs (100);}} // Gửi lệnh Tạo ổ đĩa về vận tốc và ổ đĩa bán kính (vận tốc int16_t, int16_t bán kính) {byteTx (CmdDrive); byteTx ((gợi ý 8_t) ((vận tốc >> 8) & 0x00FF)); byteTx ((uint8_t) (vận tốc & 0x00FF)); byteTx ((uint8_t) ((bán kính >> 8) & 0x00FF)); byteTx ((uint8_t) (bán kính & 0x00FF));}

Đề xuất: