WLE | NPC | 创造力: | 帖子: | 发消息 | 串个门 | 加好友 | 打招呼
2021-4-14 15:22:00 [显示全部楼层]
4911浏览
查看: 4911|回复: 1

[项目] 基于180°金属带模拟值反馈舵机的简易机械臂设计

[复制链接]
今天给大家带来一个 180° 金属带模拟值反馈舵机的应用,就是利用该舵机设计一个简易机械臂,该机械臂具有学习功能,当我们给它设定一个动作,设计完成后,它能根据我设计的动作自动进行学习,复刻我设定的动作。


当当,下面是我们使用到的角色~

主角!!
还有其他的小伙伴
DFR0216-2--->>>DFRduino UNO R3
下面我们康康它们长什么样子吧

开箱主角介绍:
基于180°金属带模拟值反馈舵机的简易机械臂设计图1 基于180°金属带模拟值反馈舵机的简易机械臂设计图2
基于180°金属带模拟值反馈舵机的简易机械臂设计图3 基于180°金属带模拟值反馈舵机的简易机械臂设计图4

软件介绍:
接下来我们要进行安装环境得安装,这里我简单给大家介绍一下
我们开发使用的是 DFRduino UNO R3,首先我们要先下载 Arduino 编译环境
下载完成后进行驱动安装,找到下载文件

基于180°金属带模拟值反馈舵机的简易机械臂设计图5

驱动安装完成后我们就可以愉快的在 Arduino IDE 上进行开发啦!
写的不好,不要见怪,小伙伴们也可以参考下面链接详细里了解 arduino 的使用教程。



接下来我们简单直接一点,直接上程序。
  1. #include <Servo.h>
  2. #include <Wire.h> //I2C library
  3. #define DJ1 0
  4. #define DJ2 0x3000
  5. #define DJ3 0x6000
  6. Servo myservo1;
  7. Servo myservo2;
  8. Servo myservo3;
  9. int h1,h2,h3,l1,l2,l3;
  10. //uint8_t Data[1000] = {0};
  11. void setup() {
  12.   Wire.begin(); // initialise the connection
  13.   Serial.begin(9600);
  14.   pinMode(3, INPUT);
  15.   pinMode(13, OUTPUT);
  16.   myservo1.attach(9);
  17.   myservo2.attach(8);
  18.   myservo3.attach(7);
  19.   
  20.   Init();
  21.   while (Botton(3) == 0);
  22. }
  23. void loop() {
  24.   int val = readAngle();
  25.   writingAngle( val);
  26. }
  27. bool Botton(int inPin)
  28. {
  29.   bool ret = 0;
  30.   if (digitalRead(inPin)) {
  31.     delay(100);
  32.     if (digitalRead(inPin)) {
  33.       ret = 1;
  34.       digitalWrite(13, HIGH);
  35.       while (digitalRead(inPin));
  36.       digitalWrite(13, LOW);
  37.       delay(100);
  38.     }
  39.   }
  40.   return ret;
  41. }
  42. int readAngle(void)
  43. {
  44.   int Length = 0;
  45.   byte dat;
  46.   
  47.   myservo1.detach();
  48.   myservo2.detach();
  49.   myservo3.detach();
  50.   while (Botton(3) == 0) {
  51.     dat = map(analogRead(0), l1, h1, 0, 180);
  52.     i2c_eeprom_write_byte( 0x57, Length, dat );
  53.     dat = map(analogRead(1), l2, h2, 0, 180);
  54.     i2c_eeprom_write_byte( 0x57, DJ2 + Length, dat );
  55.     dat = map(analogRead(2), l3, h3, 0, 180);
  56.     i2c_eeprom_write_byte( 0x57, DJ3 + Length, dat );
  57.     Length++;
  58.     if (Length >= 1023) {
  59.       break;
  60.     }
  61.   }
  62.   return Length;
  63. }
  64. void writingAngle( int Length)
  65. {
  66.   int i = 0;
  67.   int flag = 1;
  68.   myservo1.attach(9);
  69.   myservo2.attach(8);
  70.   myservo3.attach(7);
  71.   while (flag) {
  72.     for (int i = 0; i < Length; i++) {
  73.       myservo1.write(i2c_eeprom_read_byte(0x57, i + DJ1));
  74.       myservo2.write(i2c_eeprom_read_byte(0x57, i + DJ2));
  75.       myservo3.write(i2c_eeprom_read_byte(0x57, i + DJ3));
  76.       if (Botton(3)) {
  77.         flag = 0;
  78.         break;
  79.       }
  80.       delay(18);
  81.     }
  82.   }
  83. }
  84. void i2c_eeprom_write_byte( int deviceaddress, unsigned int eeaddress, byte data )
  85. {
  86.   int rdata = data;
  87.   Wire.beginTransmission(deviceaddress);
  88.   Wire.write((int)(eeaddress >> 8)); // MSB
  89.   Wire.write((int)(eeaddress & 0xFF)); // LSB
  90.   Wire.write(rdata);
  91.   Wire.endTransmission();
  92.   delay(6);
  93. }
  94. byte i2c_eeprom_read_byte( int deviceaddress, unsigned int eeaddress )
  95. {
  96.   byte rdata = 0xFF;
  97.   Wire.beginTransmission(deviceaddress);
  98.   Wire.write((int)(eeaddress >> 8)); // MSB
  99.   Wire.write((int)(eeaddress & 0xFF)); // LSB
  100.   Wire.endTransmission();
  101.   Wire.requestFrom(deviceaddress, 1);
  102.   if (Wire.available()) rdata = Wire.read();
  103.   return rdata;
  104. }
  105. void Init()
  106. {
  107.   myservo1.write(0);
  108.   myservo2.write(0);
  109.   myservo3.write(0);
  110.   delay(1000);
  111.   
  112.   l1= analogRead(0);
  113.   l2= analogRead(1);
  114.   l3= analogRead(2);
  115.   myservo1.write(180);
  116.   myservo2.write(180);
  117.   myservo3.write(180);
  118.   delay(1000);
  119.   
  120.   h1= analogRead(0);
  121.   h2= analogRead(1);
  122.   h3= analogRead(2);
  123.   myservo1.write(90);
  124.   myservo2.write(90);
  125.   myservo3.write(90);
  126.   delay(1000);
  127. }
复制代码
我们按下图一端连接开发板,另一端连接到电脑USB口
基于180°金属带模拟值反馈舵机的简易机械臂设计图10
代码写好后,我们编译程序通过发现没有问题后,点击上传程序。
基于180°金属带模拟值反馈舵机的简易机械臂设计图9
好了程序编译上传成功了,接下来我们先测试效果,看看能达到我们的预期效果没。

测试:
完成后我们发现无法同时驱动三个舵机,我们需要在 SERVO_PWR 接入一个 5V 电源,保证能同时驱动 3 个舵机。
电源接入完成后,我们进行测试,测试结果如下。
我们可以看到,舵机可以进行动作的学习了。接下来我们就可以安装简易的机械臂了。

安装步骤:
一切准备就绪后,接下来我们开始安装这个简易机械臂
下面是机械臂材料一览图,这是我们机械臂要用的东西
基于180°金属带模拟值反馈舵机的简易机械臂设计图6
首先是底座,我们找到底座,通过卡槽将舵机装入里面,这样,我们的机械臂底座的安装就完成啦。
基于180°金属带模拟值反馈舵机的简易机械臂设计图11
接着我们安装两个臂,我们通过卡槽,将舵机固定好,到此,我们的简易机械臂就初据模型啦,我们就只差一个夹子啦。
基于180°金属带模拟值反馈舵机的简易机械臂设计图7
我们通过卡槽安装好即可

最后一步我们安装我们的夹子(夹子做的有点 low,大家见谅),夹子我们使用了一根橡皮筋和两个活动的夹子端,通过舵机旋转带动橡皮筋来实现夹取和放下。
至此,我们的简易机械臂就安装完成啦,下面是简易舵机成品图。
基于180°金属带模拟值反馈舵机的简易机械臂设计图8

布线和接线:
接下来我们把三个舵机分别连接到开发板得 9,8,7 号引脚,模拟量接口分别接入模拟口 0,1,2,这里建议 9 号引脚舵机连接0号模拟口,8 号引脚舵机连接1号模拟口,7 号引脚舵机连接 2 号模拟口。安装完成后,我们需要把它的连接线用胶布缠一下,避免看上去很乱。
这样,我们的完整简易机械臂就安装设计完成了,下面我们看看它的实际效果。相信已经迫不及待想要看我们的实际效果了吧。话不多说,我们直接看实际效果吧!

实际效果:
应用实物如下,我们可以看到机械臂可以自动学习我们设置的动作


这样一个简单的机械臂就设计完成了,大家可以利用带反馈值做一些其他有趣的应用。
这样一个反馈舵机,能做很多有趣的应用,喜欢的朋友可以参考链接购买玩起来哟!
感谢大家的阅读,希望能对您有帮助,下面再次附上我们主角的链接。

rzegkly  版主

发表于 2021-4-14 19:07:18

正想准备搭建一个简易机械臂,谢谢
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4

© 2013-2024 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail