ENCYCLOPEDIA VỀ ĐIỆN TỬ TRUYỀN THANH VÀ KỸ THUẬT ĐIỆN Người máy đơn giản. Bách khoa toàn thư về điện tử vô tuyến và kỹ thuật điện Bách khoa toàn thư về điện tử vô tuyến và kỹ thuật điện / Thiết bị điều khiển vô tuyến Bài báo này trình bày sơ đồ của một "người máy" đơn giản. Anh ta đi đến chỗ có ánh sáng, và nếu không có nguồn sáng, thì chế độ "Tìm kiếm miễn phí" sẽ được kích hoạt, tức là. rô bốt sẽ lái xe và trong trường hợp va chạm, hãy lái đi và quay lại. Trái tim của robot là vi điều khiển ATMEL: AT90S2313, nhưng bạn có thể sử dụng bất kỳ hãng nào khác của hãng này, vi điều khiển này có bộ nhớ chương trình 2kb, 15 cổng vào/ra, nguồn điện khả dụng - 4-6V. Các động cơ sẽ được điều khiển bởi một "trình điều khiển động cơ" - một vi mạch L293D (tương tự trong nước là KR1128KT4A). Là một cảm biến, người ta đã quyết định sử dụng điện trở quang SF3-1. Robot bao gồm hai động cơ. Đây là cách chúng sẽ hoạt động đối với một số hành động nhất định:
Các phần tử vô tuyến đã sử dụng trong mạch: Vi điều khiển AT90S2313 Vi mạch L293D (tương tự trong nước - KR1128KT4A) 2 điện trở quang SF3-1 Thạch anh ở 4MHz Tụ điện 22-24pF Bộ ổn định 7805 (hoặc KREN5A) Điện trở 100 ohm (Tùy chọn) hai động cơ Nguồn Vbat - 4 pin AA, hoặc 1 núm vặn (9V) Nguồn điện Vm - 1 núm vặn (9V) Sau khi lắp ráp mạch, bạn cần tải chương trình xuống vi điều khiển và robot đã sẵn sàng: / ************************************************* *** *** Loại chip: AT90S2313 Tần số đồng hồ: 4,000000 MHz Mô hình bộ nhớ: Nhỏ Kích thước SRAM bên ngoài: 0 Kích thước ngăn xếp dữ liệu: 32 ************************************************** ***** ** /#include <90.h> #include #bao gồm // gán các định nghĩa để thuận tiện cho việc làm việc với các thiết bị ngoại vi #define RA PORTB #define ĐỘNG CƠ_F 7 #define ĐỘNG CƠ_B 6 #define TURN_R 5 #xác định TURN_L 4 #xác định bằng mã PIND #define ÁNH SÁNG_R 0 #define ÁNH SÁNG_L 1 #define BUMPER_F 2 #define BUMPER_B 3 // Các chế độ lái có thể enum {STOP, F, FR, FL, B, BR, BL}; // ------------------------------------------------ ------------------------------ // Độ trễ t x 10ms // ------------------------------------------------ ------------------------------ void Delay_10ms (unsigned char t) {char tôi; cho (i = 0; i // bảng xác suất để chọn hướng di chuyển // dựa trên hướng di chuyển hiện tại unsigned char p [7] [7] = {14, 43, 57, 71, 86, 93, 100, 7, 43, 71, 100, 100, 100, 100, 7, 50, 93, 100, 100, 100, 100, 7, 50, 57, 100, 100, 100, 100, 29, 29, 29, 29, 57, 79, 100, 36, 36, 36, 36, 71, 93, 100, 36, 36, 36, 36, 71, 79, 100}; // hướng chuyển động hiện tại chưa ký char this_move; // ------------------------------------------------ ------------------------------ // Bật sự kết hợp của các động cơ để chuyển động theo một hướng nhất định // ------------------------------------------------ ------------------------------ void go (hướng ký tự không dấu) { chuyển (hướng) { trường hợp DỪNG: OUT.MOTOR_F = 0; OUT.MOTOR_B = 0; OUT.TURN_R = 0; OUT.TURN_L = 0; phá vỡ; trường hợp F: OUT.MOTOR_F = 1; OUT.MOTOR_B = 0; OUT.TURN_R = 0; OUT.TURN_L = 0; phá vỡ; trường hợp FR: OUT.MOTOR_F = 1; OUT.MOTOR_B = 0; OUT.TURN_R = 1; OUT.TURN_L = 0; phá vỡ; trường hợp FL: OUT.MOTOR_F = 1; OUT.MOTOR_B = 0; OUT.TURN_R = 0; OUT.TURN_L = 1; phá vỡ; trường hợp B: OUT.MOTOR_F = 0; OUT.MOTOR_B = 1; OUT.TURN_R = 0; OUT.TURN_L = 0; phá vỡ; trường hợp BR: OUT.MOTOR_F = 0; OUT.MOTOR_B = 1; OUT.TURN_R = 1; OUT.TURN_L = 0; phá vỡ; trường hợp BL: OUT.MOTOR_F = 0; OUT.MOTOR_B = 1; OUT.TURN_R = 0; OUT.TURN_L = 1; phá vỡ; } } // ------------------------------------------------ ------------------------------ // Chọn hướng chuyển động trong bước tiếp theo theo bảng xác suất // ------------------------------------------------ ------------------------------ unsigned char next_move (void) { charpp không dấu, tôi; pp = rand()/327; // lấy ngẫu nhiên một số 0..99 for (i=0;i<7;i++){ // tìm kiếm sự trùng khớp trong bảng xác suất if (p [this_move] [i]> pp) break; } this_move = i; // ghi hướng mới nhận được như hướng hiện tại return (i); } // ------------------------------------------------ ------------------------------ // Xử lý ngắt bộ đệm phía trước (INT0 = PD2) // ------------------------------------------------ ------------------------------ ngắt [EXT_INT0] void ext_int0_isr (void) { if (this_move == FR) go (BL); if (this_move == FL) go (BR); khác đi (B); Trễ_10ms(250); // khởi hành trong vòng 2.5 x 2 giây Độ trễ 10ms (250); this_move = B; } // ------------------------------------------------ ------------------------------ // Xử lý ngắt cản sau (INT1 = PD3) // ------------------------------------------------ ------------------------------ ngắt [EXT_INT1] void ext_int1_isr (void) { if (this_move == BR) go (FL); if (this_move == BL) go (FR); khác đi (F); Trễ_10ms(250); // khởi hành trong vòng 2.5 x 2 giây Độ trễ 10ms (250); this_move = F; } // ------------------------------------------------ ------------------------------ // "Đi bộ ngẫu nhiên" // ------------------------------------------------ ------------------------------ unsigned char walk (void) { // vòng lặp này tổ chức "chuyển vùng tự do" trong khi // không có tín hiệu từ bất kỳ cảm biến ánh sáng nào trong khi ((IN.LIGHT_R) && (IN.LIGHT_L)) { đi(next_move()); // lấy hướng di chuyển tiếp theo và Trễ_10ms(250); // di chuyển theo hướng này 2.5 giây } // vòng lặp này tổ chức chuyển động tới ánh sáng trong khi // có tín hiệu từ ít nhất một trong các cảm biến ánh sáng while ((IN.LIGHT_R == 0) || (IN.LIGHT_L == 0)) { if ((IN.LIGHT_R == 0) && (IN.LIGHT_L == 0)) go (F); else if (IN.LIGHT_R == 0) go (FR); else if (IN.LIGHT_L == 0) go (FL); } trả về (0); } // ------------------------------------------------ ------------------------------ // Chương trình chính // ------------------------------------------------ ------------------------------ void main (void) { DDRB = 0xff; // gán tất cả các dòng của cổng B để xuất PORTB = 0x00; // và đặt chúng ở mức thấp DDRD = 0x00; // gán tất cả các dòng của cổng D cho đầu vào PORTD = 0xff; // kết nối điện trở tải bên trong // Khởi tạo (các) ngắt bên ngoài // INT0: Bật // Chế độ INT0: Cạnh rơi // INT1: Bật // Chế độ INT1: Cạnh rơi GIMSK = 0xC0; MCUCR = 0x0A; GIFR = 0xC0; // cho phép ngắt #asm ("sei") // bắt đầu vòng lặp chính trong khi (1) walk (); } Tải xuống chương trình, tệp phần sụn và sơ đồ rô bốt ở định dạng sPlan Xuất bản: cxem.net Xem các bài viết khác razdela Thiết bị điều khiển vô tuyến. Đọc và viết hữu ích bình luận về bài viết này. Tin tức khoa học công nghệ, điện tử mới nhất: Tiếng ồn giao thông làm chậm sự phát triển của gà con
06.05.2024 Loa không dây Samsung Music Frame HW-LS60D
06.05.2024 Một cách mới để kiểm soát và điều khiển tín hiệu quang
05.05.2024
Tin tức thú vị khác: Nguồn cấp tin tức khoa học và công nghệ, điện tử mới
Tài liệu thú vị của Thư viện kỹ thuật miễn phí: ▪ phần của trang web Bộ sạc, pin, pin. Lựa chọn bài viết ▪ bài báo Lá chắn trên cổng Tsaregrad. biểu hiện phổ biến ▪ bài viết Kẹo cao su là gì? đáp án chi tiết ▪ Bài báo Bác sĩ-thống kê. Mô tả công việc ▪ bài viết Đèn LED cháy nhanh (tùy chọn 3). Bách khoa toàn thư về điện tử vô tuyến và kỹ thuật điện
Để lại bình luận của bạn về bài viết này: Tất cả các ngôn ngữ của trang này Trang chủ | Thư viện | bài viết | Sơ đồ trang web | Đánh giá trang web www.diagram.com.ua |