使用Arduino,蓝牙和Android app的开源爬墙机器人

描述:

使用Arduino,蓝牙和Android app的爬墙机器人 - 在本教程中,您将学习如何使用基于Atmega328微控制器的定制控制器板制作轻巧,低成本和高效的爬墙机器人,这与Arduino Uno,HC-05或HC-06蓝牙模块中使用的微控制器相同, L298N电机驱动器,6v迷你直流减速电机和高转速四轴飞行器无刷直流电机。

爬墙机器人的前进,后退,左和右运动使用专门设计的Android手机应用程序进行无线控制。高转速四轴飞行器无刷直流电机用于通过吸入空气来产生真空,因此机器人会粘在墙上。这将是一个非常详细的教程,解释所有内容,以便您可以自己制作一个。您可以观看本文末尾给出的演示视频。

让我们立即开始吧!!!

物料准备:

6v 60RPM Mini Dc Gear Motors

Atmega328 micro controller:

16Mhz crystal:

22pf capacitors:

10k Resistor:

10uf capacitors:

L298N motor driver:

1000KV Brushless Motor, 30A Speed controller, and Propellers

Top Brushless Motors

3s Lipo Batteries

4s Lipo Batteries

Bluetooth Module: Hc-05:

Arduino Uno   领券

其他工具:

Top Arduino Sensors:

Super Starter kit for Beginners

Digital Oscilloscopes

Variable Supply

Digital Multimeter

Soldering iron kits

PCB small portable drill machines

爬墙机器人:

机器人是一种机电机器,使用无线技术进行远程控制,并能够自己完成任务。大多数机器人是半自动的,旨在根据程序员定义的指令执行不同的任务。机器人可用于安全目的,它可以从周围环境捕获视频和音频信息,然后可以通过无线通信发送到远程监控站。该项目的目的是使用真空技术设计和制造爬墙机器人。真空由高转速无刷直流电机产生,该电机用于四轴飞行器。到目前为止,已经研究了四种类型的粘合技术,

  • 用于攀爬铁质表面的磁性装置。
  • 真空抽吸技术,适用于光滑无孔表面。
  • 基于空气动力学原理的吸引力发生器。
  • 生物模仿方法的灵感来自攀爬动物。

一些最着名的攀岩机器人,

  • 城市攀爬者:爬墙机器人
  • 机甲壁虎:爬墙机器人
  • 海伯利安:爬墙机器人
  • 狐猴 - 重量转移攀岩者风格机器人
  • 忍者-2铰接腿爬墙机器人
  • C-机器人爬墙机器人原型
  • 卷尾猴重量转移攀岩机器人"爬墙者"
  • 机器人窗帘
  • 斯坦福粘性机器人
  • RiSE:神奇的昆虫般的攀爬机器人
  • 涡旋RRAM移动机器人平台
  • 柔性手指磁力爬升机器人
  • SRI静态电动爬墙机器人
  • 基于吸盘的独立肢体爬壁器
  • SPIBOT - 独立式电源和真空泵

制作爬墙机器人时需要注意的事项:

您真正需要照顾的最重要的事情之一是机器人的重量。使用轻质部件。而不是使用大型控制器板,如Arduino Uno或Mega2560,制作定制的控制器板。通过这种方式,您可以降低电路板的价格,尺寸和重量。使用非常小的直流减速电机。在做这个项目的时候,我唯一关注的就是机器人的重量。为了获得最佳理解,我使用 SolidWorks 2016 设计了爬墙机器人的基本 3D 模型。

我使用游标卡尺记录了所有电子零件的尺寸,然后在 SolidWorks 中设计了每个零件。我大致从12×12英寸的底架开始。幸运的是,这种尺寸的框架可以容纳所有零件。然后我开始寻找12×12英寸的轻质板材,幸运的是我找到了相同尺寸的PCB铜板。为了克服弯曲问题,我切割了铜板的角边,然后固定了6v 60RPM Mini Dc Geared电机。

我在铜板的底部使用了热冷却器来减少气隙。这只是一个360度的壁环,你可以用热冷却板轻松制作。间隙越小,吸力越大。在高吸力的情况下,您可以使用可变电阻器降低电机速度,我将在电路图中对此进行解释。在我对真空感到满意之后,我几乎安装了所有组件。最后的爬墙机器人,

在我解释电路图和编程之前,首先我想解释一下这个项目中使用的不同电子元件。

微型直流减速电机:

这是一款 6V 60RPM 微型直流减速电机

工作电压为 6 V

转速(额定最大值) 60 ~ 100 RPM

扭矩,有效 1.1 Kg/cm

尺寸:

深度:10毫米

高度:24.3毫米

宽度:12.1 毫米

商品重量: 9.5g

L298N 电机驱动器:

 这就是L298N双通道H桥电机驱动器。该电机驱动器可用于控制电压在5至35伏之间的直流电机,峰值电流高达2安培。由于这是一个双H桥电机驱动器,它可以用来同时控制两个直流电机的速度和方向。

现在,让我们仔细看看L298N模块的引脚排列。

 

该模块有三个端子块。端子块1将用于电机A,并清楚地标有out1和out2,这是我们连接直流电机两根电线的地方。端子块 2 将用于电机 B,并清楚地标有 out3 和 out4。

 而端子块3标有12v,接地和+5v。

12v端子用于为直流电机提供电压,该电压可以从5到35伏。接地端子与外部电源的接地连接,也与控制器板的接地连接,在我的情况下,这是基于atmega328微控制器的Arduino板,而+5v端子将与Arduino的5v连接。

如您所见,此电机驱动器也有一些公头接头,这些针座清楚地标有ENA...IN1...IN2...IN3...IN4 和 ENB.ENA和ENB用于启用两个电机。跳线帽意味着两个电机在默认情况下都处于启用状态,并且电机将以最大速度旋转。如果移除跳线盖,并且ENA和ENB引脚与Arduino的PWM引脚连接,则可以使用脉冲宽度调制来控制电机速度,我将在编程中对此进行解释。然后IN1和IN2引脚用于控制电机A的方向,而IN3和IN4用于控制电机B的方向。

HC05/HC06 蓝牙模块:

 网上内容很多百度下,如何使用HC05或HC06蓝牙模块。

爬墙机器人安卓应用:

 安卓手机应用程序受用户名和密码保护。默认用户名和密码为"admin",稍后您可以将其替换为新的用户名和密码。单击下面给出的"下载"按钮以下载APK文件。

2积分支持支持

码云下载

爬墙机器人电路图:

爬墙机器人的电路图非常简单。电路图的最顶部是基于LM7805稳压器的5v稳压电源。该稳压器的 5 V 用于为 Atmega328 微控制器供电,还与 L298N 电机驱动器的 +5v 引脚连接。LM7805 的 5 伏电压也用于为 HC05 蓝牙模块供电。整个电路使用Lipo电池供电。

蓝牙模块与 Atmega328 TX 和 RX 引脚连接。蓝牙模块的 TX 引脚与 Atmega328 微控制器的 RX 引脚连接,而 HC05 蓝牙模块的 RX 引脚与 Atmega328 微控制器的 TX 引脚连接。将程序上传到 Atmega328 微控制器时,断开 TX 和 RX 引脚的连接。否则,您将无法上传该程序。

如您所知,每个L298N电机驱动器可用于控制2个电机。如您所知,在本项目中使用了4个电机,因此,这意味着我们将需要两个L298N电机驱动器。所有4个电机都与电机驱动器"L298N"的输出相连,这在电路图中可以清楚地看到。L298N 电机驱动器的输入引脚与 Atmega328 微控制器连接。所有引脚都清楚地标记。

无刷电机的 PWM 引脚与 Atmega328 引脚 11 连接,后者是 PWM 引脚。引脚编号11用于控制无刷电机的速度。可变电阻器与Atmega328控制器的模拟引脚连接,该可变电阻器用于控制无刷电机的速度。通过旋转可变电阻器的旋钮,可以调节速度。

Atmega328 微控制器 PCB 板布局:

该PCB采用Cadsoft Eagle设计。Atmega328微控制器的PCB板文件可以通过单击下面给出的链接下载。

爬墙机器人Arduino代码:

​
#include <SoftwareSerial.h>
SoftwareSerial Blue(0, 1);
long int data;
int nob = 0; // variable resistor connected to analog pin A0
int nobdata = 0;
long int password1 = 92;// forward
long int password2 = 91;// reverse
long int password3 = 71; // right 
long int password4 = 79;// left
long int password5 = 89; // stop

char state = 0;

int urmw1 = 2; // up right motor wire 1 
int urmw2 = 3; // up right motor wire2 

int drmw1 = 4; // down right motor wire1
int drmw2 = 5; // down right motor wire2 

int ulmw1 = 6; // up left motor wire1
int ulmw2 = 7; // up left motor wire2

int dlmw1 = 8; // down left motor wire1
int dlmw2 = 9; // down left motor wire2

int bdm = 11; // brushless dc motor
void setup()
{
pinMode(bdm, OUTPUT);
pinMode(nob, INPUT);
pinMode(urmw1, OUTPUT);
pinMode(urmw2, OUTPUT);
pinMode(drmw1, OUTPUT); 
pinMode(drmw2, OUTPUT); 

pinMode(ulmw1, OUTPUT); 
pinMode(ulmw2, OUTPUT); 
pinMode(dlmw1, OUTPUT); 
pinMode(dlmw2, OUTPUT); 

// keep all the motors off by default
digitalWrite(urmw1, LOW);
digitalWrite(urmw2, LOW);
digitalWrite(drmw1, LOW);
digitalWrite(drmw2, LOW);

digitalWrite(ulmw1, LOW);
digitalWrite(ulmw2, LOW);
digitalWrite(dlmw1, LOW);
digitalWrite(dlmw2, LOW);


Serial.begin(9600);
Blue.begin(9600);

delay(1000);

}

void loop()
{

 // while(Blue.available()==0) ;

nobdata = analogRead(nob);
nobdata = map(nobdata, 0, 1024, 0, 255);
analogWrite(bdm,nobdata);
//Serial.println(nobdata);
delay(20);

 if(Blue.available()>0) 
{
data = Blue.parseInt();

delay(200);
} 
//delay(1000);
//Serial.print(data);

if (data == password1)  // forward
{
digitalWrite(urmw1, HIGH);
digitalWrite(urmw2, LOW);
digitalWrite(drmw1, HIGH);
digitalWrite(drmw2, LOW);

digitalWrite(ulmw1, LOW);
digitalWrite(ulmw2, HIGH);
digitalWrite(dlmw1, LOW);
digitalWrite(dlmw2, HIGH);
  
  data = 45; // garbage value to stop repetition
  Serial.println("Forward");


   }
   
   if( data == password2) // reverse
   {

digitalWrite(urmw1, LOW);
digitalWrite(urmw2, HIGH);
digitalWrite(drmw1, LOW);
digitalWrite(drmw2, HIGH);

digitalWrite(ulmw1, HIGH);
digitalWrite(ulmw2, LOW);
digitalWrite(dlmw1, HIGH);
digitalWrite(dlmw2, LOW);
 data = 45; // garbage value to stop repetition
  Serial.println("Reverse");

   } else

   if( data == password3) // right
   {
 digitalWrite(urmw1, LOW);
digitalWrite(urmw2, HIGH);
digitalWrite(drmw1, LOW);
digitalWrite(drmw2, HIGH);

digitalWrite(ulmw1, LOW);
digitalWrite(ulmw2, HIGH);
digitalWrite(dlmw1, LOW);
digitalWrite(dlmw2, HIGH);
    data = 45; // garbage value to stop repetition
     
  Serial.println("right");

   }
else


   if( data == password4) // left
   {

digitalWrite(urmw1, HIGH);
digitalWrite(urmw2, LOW);
digitalWrite(drmw1, HIGH);
digitalWrite(drmw2, LOW);

digitalWrite(ulmw1, HIGH);
digitalWrite(ulmw2, LOW);
digitalWrite(dlmw1, HIGH);
digitalWrite(dlmw2, LOW);
  data = 45; // garbage value to stop repetition
 Serial.println("Left");

   }
   else
      if( data == password5) // stop
   {
 digitalWrite(urmw1, LOW);
digitalWrite(urmw2, LOW);
digitalWrite(drmw1, LOW);
digitalWrite(drmw2, LOW);

digitalWrite(ulmw1, LOW);
digitalWrite(ulmw2, LOW);
digitalWrite(dlmw1, LOW);
digitalWrite(dlmw2, LOW);
  data = 45; // garbage value to stop repetition
Serial.println("stop");

   }
 
 }

完整代码:all-climbing-robot-car   2积分支持

码云下载

爬墙机器人Arduino程序说明:

我从SoftwareSerial Library开始。软件串行库用于创建多个串行端口。如您所知,在Arduino Uno中,我们只有一个序列号,该端口在引脚号0和引脚号1上可用。目前,我正在使用Arduino的默认串行端口。

#include <SoftwareSerial.h>

我在引脚编号 0 和引脚编号 1 上定义了一个串行端口。您可以更改这些引脚,可以使用2和3或任何其他引脚。只需更改数字即可。由于我只使用一个支持串行通信的设备"蓝牙模块",因此我使用的是Arduino的默认串行端口。

SoftwareSerial Blue(0, 1);

定义了一些变量。

long int data;

int nob = 0; // variable resistor connected to analog pin A0

该可变电阻器用于控制四轴飞行器无刷直流电机的速度。设置最适合您要求的速度。

int nobdata = 0;

以下是用于控制爬墙机器人的前进,后退,右和左移动的命令。使用Long int数据类型的目的是您可以使用可以长达6位数的大数字,这将提高安全性。没有人能够找到哪些命令用于控制机器人。因此,每个命令都充当密码。这些命令是从安卓手机应用程序发送的。

long int password1 = 92;// forward

long int password2 = 91;// reverse

long int password3 = 71; // right

long int password4 = 79;// left

long int password5 = 89; // stop

char state = 0;

Then I defined pins for the 4 motors.

int urmw1 = 2; // up right motor wire 1

int urmw2 = 3; // up right motor wire2

int drmw1 = 4; // down right motor wire1

int drmw2 = 5; // down right motor wire2

int ulmw1 = 6; // up left motor wire1

int ulmw2 = 7; // up left motor wire2

int dlmw1 = 8; // down left motor wire1

int dlmw2 = 9; // down left motor wire2

The speed controller is connected with the Arduino’s pin number 11.

int bdm = 11; // brushless dc motor

void Setup() 中,我们执行基本设置,我们告诉控制器哪些是输入引脚,哪些是输出引脚。我们使用 Serial.begin() 激活串行通信。在这个项目中,我使用9600作为波特率。这是通信速度。

void setup()

{

pinMode(bdm, OUTPUT);

pinMode(nob, INPUT);

pinMode(urmw1, OUTPUT);

pinMode(urmw2, OUTPUT);

pinMode(drmw1, OUTPUT);

pinMode(drmw2, OUTPUT);

pinMode(ulmw1, OUTPUT);

pinMode(ulmw2, OUTPUT);

pinMode(dlmw1, OUTPUT);

pinMode(dlmw2, OUTPUT);

// keep all the motors off by default

digitalWrite(urmw1, LOW);

digitalWrite(urmw2, LOW);

digitalWrite(drmw1, LOW);

digitalWrite(drmw2, LOW);

digitalWrite(ulmw1, LOW);

digitalWrite(ulmw2, LOW);

digitalWrite(dlmw1, LOW);

digitalWrite(dlmw2, LOW);

Serial.begin(9600);

Blue.begin(9600);

delay(1000);

}

Void loop() 执行无限次,主代码保存在此函数中。void 表示此函数没有返回类型,空括号表示此函数不采用任何参数作为输入。

void loop()

{

// while(Blue.available()==0) ;

nobdata = analogRead(nob);

上述指令用于读取与Arduino的模拟引脚A0连接的可变电阻器,并将该值存储在变量nobdata中。

nobdata = map(nobdata, 0, 1024, 0, 255);

使用映射函数映射数据。最小值和最大值可以是 0 和 255。这用于控制无刷直流电机的速度。

analogWrite(bdm,nobdata);

//Serial.println(nobdata);

delay(20);

if(Blue.available()>0)  // 如果 Arduino 已从蓝牙模块接收到数据。

{

//将传入值存储在变量数据中。

data = Blue.parseInt();

delay(200);

}

//delay(1000);

//Serial.print(data);

以下条件用于将接收的值与预定义的值进行比较。如果接收值与预定义值相似,则相应地控制电机。

if (data == password1)  // forward

{

digitalWrite(urmw1, HIGH);

digitalWrite(urmw2, LOW);

digitalWrite(drmw1, HIGH);

digitalWrite(drmw2, LOW);

digitalWrite(ulmw1, LOW);

digitalWrite(ulmw2, HIGH);

digitalWrite(dlmw1, LOW);

digitalWrite(dlmw2, HIGH);

}

………………

爬墙机器人测试:

上传程序并安装安卓应用程序后。我使用锂电池为爬墙机器人供电,并调整了无刷直流电机的速度。我的第一个测试是测试无刷直流电机产生的吸力。爬墙机器人粘在墙面上。我能感觉到那种力量。

 我最初的测试取得了巨大的成功。然后,我对木板,墙壁和玻璃进行了一些测试。在墙壁和木板上,攀爬机器人可以毫无问题地移动,但在镜子表面上存在滑动问题。对于极其光滑的表面,可以使用吸盘。

This article is from electroniclinic Engr Fahad translation 。Thanks。

猜你喜欢

转载自blog.csdn.net/u014331212/article/details/123000625