使用基于Arduino的嵌入式平台构建自主双足机器人。

ChangeCode
转载
发布时间: 2025-06-14 15:12:49 | 阅读数 0收藏数 0评论数 0
封面
所有热爱动画电影的观众们!你们肯定记得WALL-E,对吧?那是一个多么可爱的机器人啊!要是能拥有一个该多好。猜猜怎么着!有一种方法可以实现,但有一个小转折。我们的WALL-E不会用轮子移动,而是用两只脚来移动!是的,你没听错。所以,准备好你的材料,激发你的DIY技能,准备好了吗?开始吧!

准备工作:

材料:

硬件


  1. EVIVE
  2. 金属伺服及其附件
  3. 微型伺服及其附件
  4. 超声波传感器
  5. 超声波支架
  6. 一些 3D 零件
  7. 底板
  8. 螺母和螺栓
  9. Jumper Cable


工具:

工具名称
数量
备注
Arduino IDE
1
1

您需要的东西

硬件

- evive

- 金属伺服电机及其配件

- 微型伺服电机及其配件

- 超声波传感器

- 超声波传感器支架

- 一些3D打印部件

- 底板

- 螺母和螺栓

- 杜邦线

软件

- Arduino IDE

2

脚的组装

我们将从组装双足机器人的脚部开始。

取出一个3D打印的脚部,你会注意到其中有一个小空间。

我们将把金属伺服电机放置在这个空间中。

一旦放置好伺服电机,使用热熔胶将其固定。

在伺服电机的配件中,你会找到一个四边的伺服喇叭。剪掉它的一个边,使其变成三边的喇叭。

将这个改装后的伺服喇叭固定到伺服电机的头部。

对另一条腿重复相同的步骤。

你可以从下方下载.STL文件。

STL
FT62FHJJRBBLXQU.stl
294.32KB
STL
FL71SAVJRBBLXQV.stl
294.32KB
3

组装腿

一旦你完成了脚部的组装,就该组装腿部了。

取出两个3D打印腿部中的一个。

之前固定在脚部伺服电机上的伺服电机现在应该使用自攻螺丝固定到这个腿上。

对另一条腿重复相同的步骤。

你可以从下方下载.STL文件。

STL
FIUJQQ6JRBBLXRM.stl
341.49KB
4

组装底部底板

取出另外两个金属伺服电机,并在伺服电机头部固定一个双面摇臂舵盘。

使用螺丝将这个摇臂舵盘固定到腿上。

取出底板,并将伺服电机插入为伺服电机预留的空间中并固定。

你可以从下方下载底板的文件。

STL
F30KCD1JRBBLXQT.stl
140.12KB
5

组装上底板

取出另一个底板,并使用螺栓将微型伺服电机固定在其上。

将双面摇臂舵盘固定到伺服电机的头部。

将evive放置在这个底板的顶部并固定。

取出超声波传感器支架,并将超声波传感器固定在其中。

6

完成组装

取出带有腿部的底板,并使用长度为15毫米的支撑柱将装有evive的底板固定在其上。

完成之后,使用自攻螺丝将双面摇臂舵盘固定到超声波传感器支架上。

我们已经3D打印了双足机器人的“眼睛”。将其粘贴在超声波传感器的顶部。

这样,你的组装就完成了。

7

连接

按照图示进行连接。

8

代码

将以下 Arduino 代码上传到您的应用程序。



#include <Arduino.h>
#include <Wire.h>
#include <SoftwareSerial.h>

#include "evive.h"
#include "Servo.h"

double angle_rad = PI/180.0;
double angle_deg = 180.0/PI;
void stop();
Servo servo_4;
Servo servo_44;
Servo servo_2;
Servo servo_45;
Servo servo_3;
void back();
double dela;
void reverse();
double DelayTime;
void Forward();
void Left();
void Right();
TFT_ST7735 lcd = TFT_ST7735();
float getDistance(int trig,int echo){
pinMode(trig,OUTPUT);
digitalWrite(trig,LOW);
delayMicroseconds(2);
digitalWrite(trig,HIGH);
delayMicroseconds(10);
digitalWrite(trig,LOW);
pinMode(echo, INPUT);
return pulseIn(echo,HIGH,30000)/58.0;
}


void stop()
{
servo_4.write(90); // write to servo
servo_44.write(90); // write to servo
servo_2.write(90); // write to servo
servo_45.write(90); // write to servo
servo_3.write(90); // write to servo
}

void back()
{
servo_4.write(90); // write to servo
servo_2.write(145); // write to servo
_delay(dela);
servo_3.write(125); // write to servo
_delay(dela);
servo_44.write(110); // write to servo
servo_45.write(110); // write to servo
_delay(dela);
servo_2.write(90); // write to servo
_delay(dela);
servo_3.write(90); // write to servo
_delay(dela);
servo_3.write(35); // write to servo
_delay(dela);
servo_2.write(55); // write to servo
_delay(dela);
servo_44.write(70); // write to servo
servo_45.write(70); // write to servo
_delay(dela);
servo_3.write(90); // write to servo
_delay(dela);
servo_2.write(90); // write to servo
_delay(dela);
}

void reverse()
{
back();
_delay(DelayTime);
Left();
_delay((DelayTime) * (3));
}

void Forward()
{
servo_4.write(90); // write to servo
servo_2.write(145); // write to servo
_delay(0.1);
servo_3.write(125); // write to servo
_delay(dela);
servo_44.write(70); // write to servo
servo_45.write(80); // write to servo
_delay(0.1);
servo_45.write(70); // write to servo
_delay(0.1);
servo_2.write(90); // write to servo
_delay(0.1);
servo_3.write(90); // write to servo
_delay(dela);
servo_3.write(35); // write to servo
_delay(dela);
servo_2.write(55); // write to servo
_delay(dela);
servo_45.write(110); // write to servo
servo_44.write(80); // write to servo
_delay(0.1);
servo_44.write(90); // write to servo
_delay(0.1);
servo_44.write(100); // write to servo
_delay(0.1);
servo_44.write(110); // write to servo
_delay(0.1);
servo_3.write(90); // write to servo
_delay(0.1);
servo_2.write(90); // write to servo
_delay(dela);
}

void Left()
{
servo_4.write(90); // write to servo
servo_2.write(145); // write to servo
_delay(0.1);
servo_3.write(125); // write to servo
_delay(dela);
servo_44.write(70); // write to servo
servo_45.write(80); // write to servo
_delay(0.1);
servo_45.write(70); // write to servo
_delay(0.1);
servo_2.write(90); // write to servo
_delay(0.1);
servo_3.write(90); // write to servo
_delay(dela);
servo_3.write(35); // write to servo
_delay(dela);
servo_2.write(55); // write to servo
_delay(dela);
servo_44.write(130); // write to servo
servo_45.write(90); // write to servo
_delay(0.1);
servo_3.write(90); // write to servo
_delay(0.1);
servo_2.write(90); // write to servo
_delay(dela);
}

void Right()
{
servo_4.write(90); // write to servo
servo_2.write(145); // write to servo
_delay(0.1);
servo_3.write(125); // write to servo
_delay(dela);
servo_44.write(70); // write to servo
servo_45.write(80); // write to servo
_delay(0.1);
servo_45.write(70); // write to servo
_delay(0.1);
servo_2.write(90); // write to servo
_delay(0.1);
servo_3.write(90); // write to servo
_delay(dela);
servo_3.write(35); // write to servo
_delay(dela);
servo_2.write(55); // write to servo
_delay(dela);
servo_45.write(130); // write to servo
servo_44.write(90); // write to servo
_delay(0.1);
servo_3.write(90); // write to servo
_delay(0.1);
servo_2.write(90); // write to servo
_delay(dela);
}


void setup(){
lcd.init(INITR_BLACKTAB);
lcd.setRotation(1);
DelayTime = 0.5;
dela = 0.5;
lcd.fillScreen(0);
servo_4.attach(4); // init pin
servo_44.attach(44); // init pin
servo_2.attach(2); // init pin
servo_45.attach(45); // init pin
servo_3.attach(3); // init pin
pinMode(A0+7,INPUT);
pinMode(40,INPUT);
}

void loop(){
lcd.setCursor(10, 10);
lcd.print((analogRead(A0+7)) / (0.0381));
if(((digitalRead(40))==(1))){
if((getDistance(8,9)) < (15)){
stop();
lcd.setCursor(10, 20);
lcd.print("Obstacle");
servo_4.write(45); // write to servo
_delay(0.5);
if((getDistance(8,9)) > (25)){
Right();
lcd.setCursor(10, 20);
lcd.print("Right ");
_delay(DelayTime);
}else{
servo_4.write(135); // write to servo
lcd.setCursor(10, 20);
lcd.print("Obstacle");
_delay(0.5);
if((getDistance(8,9)) > (25)){
Left();
lcd.setCursor(10, 20);
lcd.print("Left ");
_delay(DelayTime);
}else{
servo_4.write(0); // write to servo
lcd.setCursor(10, 20);
lcd.print("obstacle");
_delay(0.5);
if((getDistance(8,9)) > (25)){
Right();
lcd.setCursor(10, 20);
lcd.print("Right ");
_delay((DelayTime) * (2));
}else{
servo_4.write(180); // write to servo
lcd.setCursor(10, 20);
lcd.print("obstacle");
_delay(0.5);
if((getDistance(8,9)) > (25)){
Left();
lcd.setCursor(10, 20);
lcd.print("Left ");
_delay((DelayTime) * (2));
}else{
reverse();
lcd.setCursor(10, 20);
lcd.print("Reverse ");
}
}
}
}
}
Forward();
lcd.setCursor(10, 20);
lcd.print("forward ");
_delay(0.2);
}else{
stop();
lcd.setCursor(10, 20);
lcd.print("Stop ");
}
_loop();
}

void _delay(float seconds){
long endTime = millis() + seconds * 1000;
while(millis() < endTime)_loop();
}

void _loop(){
}


ZIP
F9L42X2JRBBM02C.zip
198.94KB
9

完成

连接到脚部的伺服电机用于移动双脚,从而使机器人能够转弯。

连接到腿部的伺服电机用于双足机器人的行走动作。

顶部的超声波传感器使机器人具备自主性,因为它可以检测障碍物并据此调整移动方向。

阅读记录0
点赞0
收藏0
禁止 本文未经作者允许授权,禁止转载
猜你喜欢
评论/提问(已发布 0 条)
评论 评论
收藏 收藏
分享 分享
pdf下载 下载