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 <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 蓝牙串口小程序测试功能
  • 手机小程序 控制舵机转动

请添加图片描述

  1. 博🐖买的是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

生成海报
点赞 0

啊!你好,生活!

我还没有学会写个人说明!

暂无评论

发表评论

相关推荐

基于Arduino的显示测量环境数据设计

题目: 基于Arduino的显示测量环境数据设计 目录 基于Arduino的显示测量环境数据设计... 3 第一章 课题任务... 4 1.1课题任务... 4 1.2任务分工... 4 1.3设计条件... 4 第