Skip to content Skip to footer

Arduino 机械爪 (适合初学者-舵机-蓝牙-触点开关-小喇叭)

一张总括图

(寒假入坑Arduino一个月 想着做一个小东西练练手 便想出了这个小创意)

首先:介绍下本项目的实现内容:

Arduino控制舵机转动角度 ---> 舵机的角度转为机械爪的抓取角度 ---> 实现物品的抓取 ---> 抓取后喇叭发出声音,示意抓取完成 ---(手机利用蓝牙控制转动角度)

1. 机械爪的舵机驱动

首先了解舵机的三根线分别代表什么:

地线(GND)--->棕色或黑色

电源线(VCC)--->红色

信号线(IN)---->橙色或白色-->接9号io口

ps:电源线一定要用外接电源,arduino本身能力不足以驱动舵机

程序思路

1,我们需要引入舵机的库,#include

2,通过 Servo myservo 创建舵机对象

3,使用 myservo.attach(9); 定义引脚9为舵机

4,通过 myservo.write(angle) 函数控制舵机的角度

通过以下的代码可以实现串口控制舵机的转动角度

//机械爪的串口控制代码,下载到arduino后,打开串口监视器,输入想要的角度

//此代码只是简单串口控制,并未用到蓝牙控制

#include //引入舵机库 下载ide时自带的,不用再次下载

Servo myservo; // 创建一个伺服电机对象

char inByte = 0; //串口接收的数据

int angle = 0; //角度值

String temp = "";//临时字符变量

void setup()

{

myservo.attach(9); //定义舵机的引脚为9

Serial.begin(9600); //设置波特率

}

void loop()

{

while (Serial.available() > 0) //判断串口是否有数据

{

inByte = Serial.read();//读取数据,串口一次只能读1个字符

temp += inByte;//把读到的字符存进临时变量里面缓存,

//再继续判断串口还有没有数据,知道把所有数据都读取出来

}

if(temp != "") //判断临时变量是否为空

{

angle = temp.toInt(); //把变量字符串类型转成整型

Serial.println(angle); //输出数据到串口上,以便观察

}

temp = "";//请看临时变量

myservo.write(angle); //控制舵机转动相应的角度。

delay(100);//延时100毫秒

}

2.蓝牙控制转动角度

HC系列蓝牙与Arduino的连接

进入 AT 模式进行蓝牙基本参数设置

利用 Andorid 蓝牙串口小程序测试功能

手机小程序 控制舵机转动

博🐖买的是HC-08 -BLE4.0(HC系列蓝牙容易上手)

2.蓝牙连接方式,RXD接Arduino的TX,TXD-->DX,GND->GND,VCC-->3.3V

一定要注意RXD,TXD不要接反,接反后可能会导致蓝牙永久性损坏,别问我为哈知道啊

3.进入AT模式进行参数设置

我们连接好蓝牙以后,在Arduino中下载以下代码,让我们可以通过 Arduino IDE 提供的串口监视器来设置蓝牙模块的参数。

详细代码如下:

char val;

void setup() {

Serial.begin(9600);

Serial.println("BT is ready!");

// HC-08默认,9600

BT.begin(9600);

}

void loop() {

if (Serial.available()) {

val = Serial.read();

BT.print(val);

}

if (BT.available()) { val = BT.read();

Serial.print(val);

}

}

蓝牙的AT模式:指示灯以2s的间隔亮灭,表示已经进入AT模式,这个时候我们打开串口监视器,波特率设置为9600,可以看到串口监视器输出:BT is ready!

然后,输入 AT ,如果一切正常,串口显示器会显示 OK。

ps:串口监视器软件可以问厂商要,因为有的产品需要他们厂商的软件才能进行调试,ide自带的有时候不能连接(博主的血泪史)

接下来我们在串口监视器中输入AT命令,常用 AT 命令如下:

ps:再次申明博🐖跳入的又一个大坑:这个AT指令集,hc-08与hc-06系列的不一样,需要向厂商要(恶心死我了)

4.微信小程序找到蓝牙调试助手,连接蓝牙

博主实验了基本所有的蓝牙串口微信小程序,测评到第一个很 NICE !

进入到小程序后,点击选择你的蓝牙(在指令集可以随意更改名字),蓝牙连接成功后,蓝牙指示灯会常亮,表示咱的蓝牙已经连接成功,不要激动,最后把博🐖的蓝牙代码下载到arduino中,就可以控制舵机转动了。

5.蓝牙代码实现舵机转动

将以下代码载到arduino中

蓝牙按照上面的步骤再次与arduino电路连接

ps:因为我们的Arduino只有一个串口,所以要蓝牙连接的同时是不能去下载程序的。(可以了解下软串口,是利用代码将一些io口转为串口,很实用)

代码详解:

你是不是发现和上面的串口控制舵机,只多了一行代码“Serial.println("BT is ready!");//蓝牙已经准备完成”,但是这句好像也是毫无作用,其实要明白蓝牙的作用:蓝牙替代了串口,手机发送角度值通过蓝牙向arduino传输。

#include //引入舵机库

Servo myservo; // 创建一个伺服电机对象

char inByte = 0; //串口接收的数据

int angle = 0; //角度值

String temp = "";//临时字符变量,又或者说是缓存用的吧

int m=1;//抓取次数的标志位

void setup()

{

myservo.attach(9); //定义舵机的引脚为9

Serial.begin(9600); //设置波特率

Serial.println("BT is ready!");//蓝牙已经准备完成

}

void loop()

{

while (Serial.available() > 0) //判断串口是否有数据

{

inByte = Serial.read();//读取数据,串口一次只能读1个字符

temp += inByte;//把读到的字符存进临时变量里面缓存,

//再继续判断串口还有没有数据,知道把所有数据都读取出来

}

if(temp != "") //判断临时变量是否为空

{

angle = temp.toInt(); //把变量字符串类型转成整型

Serial.println(angle); //输出数据到串口上,以便观察

}

temp = "";//请看临时变量

myservo.write(angle); //控制舵机转动相应的角度。

delay(100);//延时100毫秒``

到这里,基本功能已经实现了,但是博主还是有点小小的设想,手里有一个触点开关,咱可是社会主义接班人,不能浪费啊,所以就想到:抓取完成后,喇叭的示警。

3.触点开关的使用

基本原理:

触点开关跟我们普通的按键开关相差不大,红色的是一个小按钮,当外面的小铁片受到外力挤压<=>夹住物体,铁片按压到红按钮-->开关导通-->电路就会导通。

你会发现开关有三个管脚,像这样的三脚开关,博主通常都是中间引出一个,两边随便引出一个就完成了(百试百灵)

代码思路

我们可以利用检测这段电路的导通情况,来判断是否夹住物体。所以这里用到了ADC检测电压,若io口检测到存在电压值,说明物体已经被夹住。

关于adc检测电压值,可以参考arduino中文社区或者极客工坊的教程:

附上链接:

Arduino做0-5V量程的电压表

在这里,我们检测电压值的代码如下:

int i; //定义电压高低

void setup()

{

Serial.begin(9600); //设置波特率

}

void loop()

{

i=analogRead(5);//读取模拟5口电压值 这个是ANALOG IN 5管脚 别搞错了

Serial.println(i); 这里可以在串口输出检测的电压值

delay(1000);

}

重点来了:博🐖的血泪史//这个需要搭一个小电路,因为我们用adc检测电压的时候,手接近开关时,就会发现采集的电压值波动很大。这个是因为没有下拉电阻,使得外界干扰影响了判断。

这个时候就需要“下拉电阻”。

下拉电阻:

在A5的接口与GND之间接一个1K-10K Ω的电阻。其作用是当外界有干扰源的时候,在断开状态下,干扰源在通向GND的过程中,会被电阻消耗掉。

下面这张图就是我们开关的连接图了(按键开关的两脚替换成我们的开关)

这里建议: 在开关的两个引脚直接焊上杜邦线,连接到面包板,这样会增大机械爪的活动范围

4.喇叭的使用

- 代码思路

触点开关-->电压采集--->采集值大于某一值-->触发喇叭(难点:喇叭声音只响一次)

- 难点分析:

这里在夹住物体后,电路是一直处于导通状态,不做处理,喇叭会一直响。

所以我们要用标志位: 让不满足标志位时,蜂鸣器不再发声

我们先在代码开头定义(这是全局变量) :

int m=1;//抓取次数的标志位,

如果抓取成功,喇叭的标志位是加1的(注意我这里进入喇叭发声函数是需要标志位小于2)

if(i>1000&&m<2)////如果电压值小于0.4v,喇叭无声,且标志位为1

{

喇叭发声(便于理解,这段代码省去了)

m+=1;

}

这个时候出来的时候m是不为1的,再次发声,是进不去这个函数的

如果抓取失败后,将喇叭的标志位归1,以便下一次抓取再次发声;(这里是相当于物体释放后,再次抓到物体时,m=1,喇叭可以再次发声)

if(i<100)//如果电压值小于0.4v,喇叭无声

{

喇叭无声(便于理解,这段代码省去了)

m =1; //将蜂鸣器的标志位m再次归1,下次抓取再次发声

}

喇叭的原理和蜂鸣器一模一样,这里就不做讲解了,喇叭也不区分正负极,博主这里是 pwm-4管脚和GND。

教程:蜂鸣器模拟警报器

ps:下图是博主自己拆的老式耳机里的,废物利用嘛!uploading-image-654105.png

5.代码汇总

到这里所有的拆解讲解已经结束了,最后就是代码的汇总:放个蓝奏云链接,我的代码都在里面。

机械爪总代码

密码:4cyy

三联足够多的话,可以考虑做个b站视频哦

博主今年大二,有兴趣交流可以QQ:825355364

ps:机械爪是用舵机驱动的,是参加智能车大赛剩下的,就想着用了。