arduino 四足机器人和舵轮小车

这是一个很简单的四足兼四轮机器人,机器人的身体由一个方形的塑料瓶构成,四足使用四个sg90舵机,既可以使用180舵机做腿,也可以使用和360舵机做轮子,如果希望他能有个可以摇头晃脑,还需要一个二维的舵机支架,基础配置四个舵机,带头需要两个额外的180舵机,主控是一块arduino的芯片。如果主板或者电池不行,可以使用舵机控制板把主控和舵机分开供电。

如下:即可以使用360度轮子,也可以使用180度舵臂,有电池成本4个sg90舵机和一块arduino控制板。

大部分的机器人都需要驱动大量的舵机驱动,对主板和电池要求比较高,我经常遇到由于电量波动导致的主板不稳定问题,最简单最便宜的方案是主控和舵机两路供电。有钱的可以购买更好的电源,不过也要对硬件比较精通的人才好,否则可能高价买的也并不怎么好用,全缴了智商税。对于研究来说,两路是个经济又快捷的方式。我这里使用子舵机板两路供电。

代码如下:

#include <SoftwareSerial.h>
#include <Servo.h>
SoftwareSerial ESP01(14, 15);  //A0,A1,rx,tx

// Define the servos
Servo LF;    //左前腿
Servo RF;    //右前腿
Servo LB;    //左后腿
Servo RB;    //右后腿
Servo NECK;  //脖子
Servo HEAD;  //头


// Define the ultrasonic sensor pins
const int LF_PIN = 2;
const int RF_PIN = 3;
const int LB_PIN = 4;
const int RB_PIN = 5;
const int NECK_PIN = 6;
const int HEAD_PIN = 7;


char dataIn = 0;
int motor_speed = 100;  //250;

//mode 0:dog, 1:wheel
int mode = 1;

void setup() {
  Serial.begin(9600);
  //ESP01.begin(115200);
  ESP01.begin(9600);

  initPin();
  delay(5000);
  while (ESP01.available()) {
    ESP01.read();
    Serial.println("ESP01 read---------");
    stop();
  }
}
void initPin() {
  LF.attach(LF_PIN);
  RF.attach(RF_PIN);
  LB.attach(LB_PIN);
  RB.attach(RB_PIN);
  NECK.attach(NECK_PIN);
  HEAD.attach(HEAD_PIN);
}
void deinitPin() {
  LF.detach();
  RF.detach();
  LB.detach();
  RB.detach();
  NECK.detach();
  HEAD.detach();
}
void Home() {
  LF.write(90);
  RF.write(90);
  LB.write(90);
  RB.write(90);
  NECK.write(90);
  HEAD.write(90);
  delay(100);
}
void forward() {
  Home();
  LF.write(90);
  RF.write(120);
  LB.write(60);
  RB.write(90);
  NECK.write(90);
  HEAD.write(60);
  delay(100);
  LF.write(120);
  RF.write(120);
  LB.write(60);
  RB.write(60);
  NECK.write(90);
  HEAD.write(120);
  delay(100);
  LF.write(120);
  RF.write(90);
  LB.write(90);
  RB.write(60);
  NECK.write(90);
  HEAD.write(60);
  delay(100);
  Home();
  LF.write(60);
  RF.write(90);
  LB.write(90);
  RB.write(120);
  NECK.write(90);
  HEAD.write(120);
  delay(100);
  LF.write(60);
  RF.write(60);
  LB.write(120);
  RB.write(120);
  NECK.write(90);
  HEAD.write(60);
  delay(100);
  LF.write(90);
  RF.write(60);
  LB.write(120);
  RB.write(90);
  NECK.write(90);
  HEAD.write(120);
  delay(100);
  Home();
}
void backward() {
  Home();
  LF.write(90);
  RF.write(60);
  LB.write(120);
  RB.write(90);
  NECK.write(90);
  HEAD.write(120);
  delay(100);
  LF.write(60);
  RF.write(60);
  LB.write(120);
  RB.write(120);
  NECK.write(90);
  HEAD.write(60);
  delay(100);
  LF.write(60);
  RF.write(90);
  LB.write(90);
  RB.write(120);
  NECK.write(90);
  HEAD.write(120);
  delay(100);
  Home();
  LF.write(120);
  RF.write(90);
  LB.write(90);
  RB.write(60);
  NECK.write(90);
  HEAD.write(60);
  delay(100);
  LF.write(120);
  RF.write(120);
  LB.write(60);
  RB.write(60);
  NECK.write(90);
  HEAD.write(120);
  delay(100);
  LF.write(90);
  RF.write(120);
  LB.write(60);
  RB.write(90);
  NECK.write(90);
  HEAD.write(60);
  delay(100);
  Home();
}
void left() {
  Home();
  LF.write(120);
  RF.write(90);
  LB.write(90);
  RB.write(120);
  NECK.write(60);
  HEAD.write(90);
  delay(100);
  LF.write(120);
  RF.write(60);
  LB.write(60);
  RB.write(120);
  NECK.write(120);
  HEAD.write(90);
  delay(100);
  LF.write(90);
  RF.write(60);
  LB.write(60);
  RB.write(90);
  NECK.write(60);
  HEAD.write(90);
  delay(100);
  Home();
}
void right() {
  Home();
  LF.write(90);
  RF.write(60);
  LB.write(60);
  RB.write(90);
  NECK.write(120);
  HEAD.write(90);
  delay(100);
  LF.write(120);
  RF.write(60);
  LB.write(60);
  RB.write(120);
  NECK.write(60);
  HEAD.write(90);
  delay(100);
  LF.write(120);
  RF.write(90);
  LB.write(90);
  RB.write(120);
  NECK.write(120);
  HEAD.write(90);
  delay(100);
  Home();
}
void hand() {
  Home();
  RF.write(180);
  delay(100);
  RF.write(150);
  delay(100);
  RF.write(180);
  delay(100);
  RF.write(150);
  delay(100);
  RF.write(180);
  delay(100);
  RF.write(150);
  delay(100);
  Home();
}

void shake() {
  Home();
  LF.write(60);
  RF.write(120);
  LB.write(60);
  RB.write(120);
  NECK.write(60);
  HEAD.write(60);
  delay(100);
  Home();
  delay(100);
  LF.write(120);
  RF.write(60);
  LB.write(120);
  RB.write(60);
  NECK.write(120);
  HEAD.write(120);
  delay(100);
  Home();
  delay(100);
}
void head() {
  Home();
  HEAD.write(60);
  delay(100);
  HEAD.write(120);
  delay(100);
  HEAD.write(60);
  delay(100);
  HEAD.write(120);
  delay(100);
  HEAD.write(60);
  delay(100);
  HEAD.write(120);
  delay(100);
  Home();
}
void neck() {
  Home();
  NECK.write(60);
  delay(100);
  NECK.write(120);
  delay(100);
  NECK.write(60);
  delay(100);
  NECK.write(120);
  delay(100);
  NECK.write(60);
  delay(100);
  NECK.write(120);
  delay(100);
  Home();
}
void stand() {
  Home();
}
void sit() {
  //Home();
  LF.write(90);
  RF.write(90);
  LB.write(0);
  RB.write(180);
  NECK.write(120);
  delay(100);
}
void sleep() {
  //Home();
  LF.write(0);
  RF.write(180);
  LB.write(0);
  RB.write(180);
  NECK.write(120);
  HEAD.write(60);
  delay(100);
}
void paxia() {
  //Home();
  LF.write(0);
  RF.write(180);
  LB.write(90);
  RB.write(90);
  NECK.write(120);
  HEAD.write(60);
  delay(100);
}
void angry() {
  Home();
  LF.write(0);
  RF.write(180);
  NECK.write(120);
  HEAD.write(60);
  delay(100);
}

void stop() {
  Home();
}
//car
void car_forward() {
  LF.write(60);
  RF.write(120);
  LB.write(60);
  RB.write(120);
  NECK.write(90);
  HEAD.write(90);
  delay(100);
}
void car_backward() {
  LF.write(120);
  RF.write(60);
  LB.write(120);
  RB.write(60);
  NECK.write(90);
  HEAD.write(90);
  delay(100);
}
void car_sforward() {
  LF.write(0);
  RF.write(180);
  LB.write(0);
  RB.write(180);
  NECK.write(90);
  HEAD.write(90);
  delay(100);
}
void car_sbackward() {
  LF.write(180);
  RF.write(0);
  LB.write(180);
  RB.write(0);
  NECK.write(90);
  HEAD.write(90);
  delay(100);
}
void car_left() {
  LF.write(60);
  RF.write(60);
  LB.write(60);
  RB.write(60);
  NECK.write(90);
  HEAD.write(90);
  delay(100);
}
void car_right() {
  LF.write(120);
  RF.write(120);
  LB.write(120);
  RB.write(120);
  NECK.write(90);
  HEAD.write(90);
  delay(100);
}
void car_stop() {
  Home();
}

void loop() {
  if (ESP01.available() > 0)
  //if (Serial.available() > 0)
  {
    dataIn = (char)ESP01.read();
    //dataIn = (char)Serial.read();
    Serial.println("ESP01 read---------dataIn;");
    Serial.println(dataIn);
  }
  switch (dataIn) {
    case '1':
      if (mode == 0) {
        forward();
      } else {
        car_forward();
      }
      break;
    case '2':
      if (mode == 0) {
        backward();
      } else {
        car_backward();
      }
      break;
    case '3':
      if (mode == 0) {
        left();
      } else {
        car_left();
      }

      break;
    case '4':
      if (mode == 0) {
        right();
      } else {
        car_right();
      }
      break;
    case '5':
      if (mode == 0) {
        hand();
      } else {
        car_sforward();
      }
      break;
    case '6':
      if (mode == 0) {
        shake();
      } else {
        car_sbackward();
      }
      break;
    case '7':
      head();
      break;
    case '8':
      neck();
      break;
    case '9':
      //neck();
      angry();
      break;
    case 'a':
      stand();
      break;
    case 'b':
      sit();
      break;
    case 'c':
      sleep();
      break;
    case 'd':
      paxia();
      break;
    case 'e':
      mode = 0;
      break;
    case 'f':
      mode = 1;
      break;
    case '0':
      stop();
      break;
defalt:
      stop();
      break;
  }
}

使用蓝牙控制。

演示:

可以看我的B站:

【arduino做的小车小狗,180舵机可以做小狗,360可以做小车-哔哩哔哩】 https://b23.tv/YS4zkNW

硬件部件: Arduino Nano R3 × 1个 超声波传感器-HC-SR04(通用) × 1个 双极-射频功率晶体管,250 MHz × 1个 Maker Essentials-迷你面包板跳线 × 1个 直流电源插座2.1MM桶式PCB安装 × 1个 TT DC 1:120减速电机× 1个 软件应用程序在线服务: Arduino IDE 手动工具制造机: 3D打印机(通用) 烙铁(通用) 腿式机器人一直是机器人行业中最有趣的创造之一,因为它们可以帮助我们探索神秘的月球洞穴其他太空探索任务。实际上,有腿机器人是具有铰接式腿机构的移动机器人,可在粗糙的火车上提供运动。与轮式机器人相比,尽管速度较慢,但它们可以在不同的地形上移动。 腿式机器人的制造控制通常很复杂,因为它需要精确控制每条腿以保持其平衡。在这个项目中,我们的目标是制造一个有趣且易于构建的具有Lego兼容功能Arduino板的机器人(图A)。 为此,我们利用了有趣的机械机制,只需一个直流减速电机即可模拟真实动物的行走模式。结果非常有趣。 图A—机器人 在本教程中,我们将使用与Lego兼容的零件制作机器人的身体腿部机械装置。然后,将现成的直流齿轮电动机连接到支腿机构以移动支腿。 下一步,我们将需要在机器人中增加大脑来控制其运动。因此,我们将Arduino Nano用作智能大脑(图B)。Arduino使我们能够利用各种市售的电动机传感器来扩展Quadruped的可能性。 图B-Arduino Nano板 为了提高机器人的性能,我们使用超声波传感器作为机器人的眼睛(图C)。通过使用超声波传感器,机器人可以避免障碍物。得益于Arduino开发板的开源特性,它可以进行此类开发。 图C-作为机器人眼睛的超声波传感器 演示视频:
<think>嗯,用户想制作一个AI小狗,具备语音交互、运动控制表情显示功能,后期还要加情感识别。作为新手,可能需要详细的步骤材料清单。首先,我需要确认他提到的硬件是否齐全,有没有遗漏的关键部件,比如电源、连接线、电阻电容之类的。 他列出的材料有树莓派4B、Arduino、ReSpeaker 2-Mic、小米小爱音响单元、PCA9685舵机控制板、SG90舵机、杜邦线面包板。树莓派作为主控,Arduino可能用于控制舵机,ReSpeaker处理语音输入,小爱音响单元可能用于语音输出?需要确认这些组件之间的兼容性,比如树莓派Arduino如何通讯,是否需要USB转TTL或者I2C之类的模块。 舵机控制板PCA9685是用来驱动多个舵机的,SG90是常用的小型舵机,但数量可能需要确认,比如肢、头部可能需要多个舵机,用户是否买够了?比如可能需要至少12个舵机,但可能用户刚开始只用几个做简单动作。 电源方面,树莓派需要5V3A的电源,舵机可能需要单独供电,尤其是多个舵机同时工作时电流较大,可能需要电池组或稳压模块,比如LM2596。用户有没有考虑到这点?材料清单里没有提到电池或电源模块,这可能是个遗漏。 连接线方面,40pin杜邦线可能够用,但可能需要不同长度的,比如公对公、母对母,或者公对母,用户是否准备了各种类型?还有面包板是否够大,830孔应该没问题,但可能需要确认。 传感器方面,ReSpeaker 2-Mic处理语音输入,但情感识别可能需要摄像头或麦克风阵列,用户后期可能需要添加摄像头模块,比如树莓派摄像头,但当前清单里没有,可能需要提醒。 软件方面,树莓派需要安装系统,比如Raspbian,然后配置Python环境,使用库如OpenCV、TensorFlow Lite做情感识别,语音交互可能需要Snowboy或百度语音识别API。运动控制方面,Arduino通过PCA9685控制舵机,可能需要Adafruit_PWMServoDriver库。用户是否熟悉这些软件配置?可能需要指导安装步骤。 结构方面,可能需要3D打印或机械部件来组装小狗的身体,用户是否有考虑?材料清单里没有提到结构材料,可能需要建议使用纸板、亚克力板或者3D打印服务。 另外,散热问题,树莓派4B在高负载下会发热,是否需要散热片或风扇?用户可能已经考虑到,但材料里没写,需要提醒。 最后,可能遗漏的还有电阻、电容、按钮开关等电子元件,用于电路保护或调试。虽然作为新手可能暂时不需要,但如果有突发情况可能需要这些。 总结一下,需要补充电源模块、电池、稳压模块、结构材料、摄像头(后期)、散热配件、可能的各种杜邦线类型,以及软件配置指南。同时检查各个模块之间的兼容性连接方式,确保用户可以顺利组装编程。</think>我将为您梳理完整的制作方案,包含硬件清单优化、分步骤实施流程关键注意事项: **一、硬件清单优化(补充红色标记关键配件)** 1. **主控系统** - 树莓派4B 4GB(建议加装散热风扇+金属外壳) - Arduino UNO R3(需配USB Type-B数据线) 2. **语音模块** - ReSpeaker 2-Mic(兼容树莓派40pin接口) - 小米小爱音响单元(需配3.5mm音频转接线) 3. **运动系统** - PCA9685舵机控制板(必须配I2C转接板) - 辉盛SG90舵机×12(肢各3个+头部1个+尾巴1个) - 金属舵机支架套装(建议9g规格) 4. **供电系统** - 树莓派专用电源5V/3A(带开关) - 18650锂电池组(7.4V 5000mAh)+ LM2596稳压模块 - 电源分配板(带XT60接口) 5. **连接组件** - 杜邦线套装(公-公/公-母/母-母各30条) - 40pin彩虹排线×2 - 洞洞板(建议10×15cm) 6. **扩展配件** - USB摄像头(后期情感识别用) - 0.96寸OLED屏幕(表情显示) - 激光切割亚克力框架套件 **二、分阶段实施流程** **第一阶段:基础架构搭建(1-2周)** 1. 硬件组装: $$树莓派4B \xrightarrow[GPIO]{I2C} PCA9685 \xrightarrow{PWM} 舵机阵列$$ $$ReSpeaker \xrightarrow{3.5mm音频} 小爱音响单元$$ 2. 系统配置: - 树莓派安装Raspbian系统 - 配置Arduino IDE开发环境 - 安装语音驱动:`sudo pip install seeed-python-reedspeech` **第二阶段:运动控制开发(2-3周)** 1. 舵机标定: ```python pwm = Adafruit_PCA9685.PCA9685() pwm.set_pwm_freq(50) # 50Hz更新频率 ``` 2. 步态算法: - 使用三角函数实现步态: $$θ_i(t) = A\sin(ωt + φ_i) + θ_{offset}$$ 其中$A$为振幅,$ω$为步频,$φ_i$为相位差 **第三阶段:语音交互实现(1-2周)** 1. 语音唤醒: - 使用Snowboy训练自定义唤醒词 - 设置音频路由: ```bash arecord -D plughw:1 | sox -t raw -r 16000 -b 16 -e signed-integer - -t wav - | python demo.py ``` **第阶段:系统集成(关键阶段)** 1. 电源管理方案: $$7.4V \xrightarrow{LM2596} 5V/3A \rightarrow 树莓派$$ $$7.4V \xrightarrow{直接供电} 舵机阵列$$ 2. 多线程控制架构: ```python import threading speech_thread = threading.Thread(target=voice_processing) motion_thread = threading.Thread(target=gait_control) ``` **三、关键注意事项** 1. **电气安全**: - 舵机供电必须与树莓派隔离 - 每个舵机并联104电容消除抖动 - 总电流不超过电池组最大放电C数 2. **机械设计**: - 重心高度应满: $$H_{cg} < \frac{L_{stance}}{2μ}$$ 其中$L_{stance}$为支撑跨度,$μ$为摩擦系数 3. **软件开发**: - 使用RTIMULib处理IMU数据 - OpenCV DNN模块加载情感识别模型: ```python net = cv2.dnn.readNetFromTensorflow('emotion.pb') ``` **、推荐采购清单补充** | 类别 | 型号 | 数量 | 单价范围 | |------------|-----------------------|------|----------| | 电压监测 | INA219模块 | 1 | ¥12 | | 安全防护 | 自恢复保险丝(2A) | 5 | ¥1.5 | | 连接加固 | 热缩管套装(Φ2-10mm) | 1 | ¥15 | | 调试工具 | 逻辑分析仪(24MHz) | 1 | ¥80 | 建议分阶段购买配件,先完成基础运动功能验证,再逐步添加语音视觉模块。开发过程中务必使用万用表实时监测关键节点电压,避免烧毁核心部件。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值