一张总括图
(寒假入坑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 <Servo.h> //引入舵机库 下载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.h> //引入舵机库
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:下图是博主自己拆的老式耳机里的,废物利用嘛
5.代码汇总
到这里所有的拆解讲解已经结束了,最后就是代码的汇总:放个蓝奏云链接,我的代码都在里面。
机械爪总代码
密码:4cyy
三联足够多的话,可以考虑做个b站视频哦
博主今年大二,有兴趣交流可以QQ:825355364
因为我在队伍主要是负责硬件,这里推荐我们组软件牛×大佬:谢方块cube
ps:机械爪是用舵机驱动的,是参加智能车大赛剩下的,就想着用了。
版权声明:本文为CSDN博主「啊!你好,生活!」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_19499703/article/details/122866371
暂无评论