Vibrant Otto - Craider (Người máy Cua-Nhện linh hoạt)
Khám phá chú robot Vibrant Otto - Craider đầy năng lượng! Dự án này biến nền tảng HP Otto thành một robot thông minh, sử dụng cảm biến siêu âm để phát hiện và di chuyển linh hoạt theo các vật thể xung quanh.
Mô tả
Dự án này biến nền tảng HP Otto thành một hệ thống robot nhỏ gọn, tích hợp cảm biến siêu âm để phát hiện và di chuyển về phía các vật thể gần đó.
Robot liên tục đo khoảng cách, khi phát hiện vật thể trong tầm quét, nó sẽ di chuyển tới đó thông qua các chuyển động servo phối hợp. Robot cũng có khả năng đi tới, đi lùi, rẽ trái hoặc phải, thể hiện những hành vi tự động cơ bản.
Hệ thống được thiết kế sử dụng ESP32 và thư viện ESP32Servo, tương thích với cả servo 9g tiêu chuẩn và servo quay liên tục. Mô hình này được tối ưu hóa để lắp ráp gọn gàng, đi dây bên trong dễ dàng và thuận tiện cho việc in 3D.
Vì mình mới bắt đầu làm quen với lập trình và robot nên dự án này được tạo ra như một trải nghiệm học tập. Code được viết dựa trên sự hiểu biết và các tài liệu tham khảo của mình, nhưng chưa được chạy thử nghiệm thực tế do mình chưa có đủ linh kiện. Bạn có thể cần điều chỉnh lại một chút khi bắt đầu lắp ráp thật.
Dự án này dựa trên thiết kế HP Otto gốc, được cấp phép theo Creative Commons Attribution-NonCommercial-ShareAlike (CC BY-NC-SA). Các sửa đổi đã được thực hiện để mở rộng chức năng. Xin cảm ơn đội ngũ HP Otto. Tác phẩm này được chia sẻ theo cùng giấy phép cho mục đích phi thương mại.
Vì không thể tạo file STEP, mình đã cung cấp các hình ảnh tham khảo. Bạn vui lòng xem qua khi lắp ráp. Các bộ phận hình tròn sẽ khớp vào các lỗ lớn hơn; bạn có thể cố định chúng bằng keo siêu dính.
Các file 'crab bot', 'crab bot 1', 'crab bot 2', 'crab bot 3' là các file in, còn 'crab bot 4' và 'crab bot 5' là các mẫu khác.
Do một số vấn đề kỹ thuật, mình không thể bao gồm file in cuối cùng. Bạn có thể in mô hình với cài đặt mà bạn thấy phù hợp.
Cảm ơn bạn đã thông cảm. Mình rất xin lỗi nếu có bất kỳ sai sót nào. Mình vẫn đang trong quá trình học hỏi và không cố ý gây ra lỗi.
#include <ESP32Servo.h>
// ===== SERVOS =====
Servo FL_hip, FL_knee;
Servo FR_hip, FR_knee;
Servo BL_hip, BL_knee;
Servo BR_hip, BR_knee;
// ===== PINS =====
#define FL_HIP 13
#define FL_KNEE 12
#define FR_HIP 14
#define FR_KNEE 27
#define BL_HIP 26
#define BL_KNEE 25
#define BR_HIP 33
#define BR_KNEE 32
// ===== ULTRASONIC =====
#define TRIG_PIN 5
#define ECHO_PIN 18
// ===== DISTANCE =====
long getDistance() {
digitalWrite(TRIG_PIN, LOW);
delayMicroseconds(2);
digitalWrite(TRIG_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);
long duration = pulseIn(ECHO_PIN, HIGH, 30000);
if (duration == 0) return 999;
return duration * 0.034 / 2;
}
// ===== BASIC POSITIONS =====
void stand() {
FL_hip.write(90); FL_knee.write(90);
FR_hip.write(90); FR_knee.write(90);
BL_hip.write(90); BL_knee.write(90);
BR_hip.write(90); BR_knee.write(90);
}
// ===== MOVE LEG =====
void lift(Servo &knee) { knee.write(60); }
void drop(Servo &knee) { knee.write(90); }
void forwardLeg(Servo &hip) { hip.write(120); }
void backwardLeg(Servo &hip) { hip.write(60); }
// ===== GAIT: FORWARD =====
void walkForward() {
// Diagonal pair 1
lift(FL_knee); lift(BR_knee);
forwardLeg(FL_hip); forwardLeg(BR_hip);
delay(200);
drop(FL_knee); drop(BR_knee);
// Diagonal pair 2
lift(FR_knee); lift(BL_knee);
forwardLeg(FR_hip); forwardLeg(BL_hip);
delay(200);
drop(FR_knee); drop(BL_knee);
}
// ===== BACKWARD =====
void walkBackward() {
lift(FL_knee); lift(BR_knee);
backwardLeg(FL_hip); backwardLeg(BR_hip);
delay(200);
drop(FL_knee); drop(BR_knee);
lift(FR_knee); lift(BL_knee);
backwardLeg(FR_hip); backwardLeg(BL_hip);
delay(200);
drop(FR_knee); drop(BL_knee);
}
// ===== TURN LEFT =====
void turnLeft() {
lift(FR_knee); lift(BR_knee);
forwardLeg(FR_hip); forwardLeg(BR_hip);
delay(200);
drop(FR_knee); drop(BR_knee);
}
// ===== TURN RIGHT =====
void turnRight() {
lift(FL_knee); lift(BL_knee);
forwardLeg(FL_hip); forwardLeg(BL_hip);
delay(200);
drop(FL_knee); drop(BL_knee);
}
// ===== SETUP =====
void setup() {
pinMode(TRIG_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
FL_hip.attach(FL_HIP); FL_knee.attach(FL_KNEE);
FR_hip.attach(FR_HIP); FR_knee.attach(FR_KNEE);
BL_hip.attach(BL_HIP); BL_knee.attach(BL_KNEE);
BR_hip.attach(BR_HIP); BR_knee.attach(BR_KNEE);
stand();
delay(2000);
}
// ===== LOOP =====
void loop() {
long dist = getDistance();
if (dist < 25) {
// Move toward object
walkForward();
} else if (dist > 50) {
// Search for object
turnLeft();
} else {
// Adjust position
walkForward();
}
delay(100);
}
Giấy phép
Tác phẩm này được cấp phép theo
Creative Commons — Attribution — Noncommercial — Share AlikeCC-BY-NC-SA
File mô hình
Chưa có bản in nào được khoe. Hãy là người đầu tiên!
Chưa có bình luận nào. Hãy là người đầu tiên!