目录

  • 简介
  • 接线图
  • Arduino代码
  • 总结

原文链接:https://www.yourcee.com/newsinfo/2928597.html

简介

机械臂由Arduino,舵机和MeArm硬件组成,Arduino通过程序驱动舵机,控制机械臂,简单地实现机械臂的功能。舵机 有两种一种是模拟舵机,一种是数字舵机。数字舵机(Digital Servo)和模拟舵机(Analog Servo)在基本的机械结构方面是完全一样的,主要由马达、减速齿轮、控制电路等组成,而数字舵机和模拟舵机的最大区别则体现在控制电路上,数字舵机的控制电路比模拟舵机的多了微处理器和晶振。数字舵机反应速度更快,无反应区范围小,定位精度高,抗干扰能力强逐渐取代模拟电机在机器人、航模中的应用。

接线图

Arduino代码

*/
#include <Servo.h>                //使用servo库
Servo base, fArm, rArm, claw ;    //创建4个servo对象//存储电机极限值(const指定该数值为常量,常量数值在程序运行中不能改变)
const int baseMin = 0;
const int baseMax = 180;
const int rArmMin = 45;
const int rArmMax = 180;
const int fArmMin = 35;
const int fArmMax = 120;
const int clawMin = 25;
const int clawMax = 100;int DSD = 15; //Default Servo Delay (默认电机运动延迟时间)//此变量用于控制电机运行速度.增大此变量数值将//降低电机运行速度从而控制机械臂动作速度。
bool mode;  //mode = 1: 指令模式,  mode = 0: 手柄模式
int moveStep = 3;  // 每一次按下手柄按键,舵机移动量(仅适用于手柄模式)
void setup(){base.attach(11);     // base 伺服舵机连接引脚11 舵机代号'b'delay(200);          // 稳定性等待rArm.attach(10);     // rArm 伺服舵机连接引脚10 舵机代号'r'delay(200);          // 稳定性等待fArm.attach(9);      // fArm 伺服舵机连接引脚9  舵机代号'f'delay(200);          // 稳定性等待claw.attach(6);      // claw 伺服舵机连接引脚6  舵机代号'c'delay(200);          // 稳定性等待base.write(90); delay(10);fArm.write(90); delay(10);rArm.write(90); delay(10);claw.write(90);  delay(10); Serial.begin(9600); Serial.println("Welcome to Taichi-Maker Robot Arm Tutorial");
}void loop(){if (Serial.available()>0) {  char serialCmd = Serial.read();if( mode == 1 ){armDataCmd(serialCmd); //指令模式} else {armJoyCmd(serialCmd); //手柄模式}}
}void armDataCmd(char serialCmd){ //Arduino根据串行指令执行相应操作//指令示例:b45 底盘转到45度角度位置//          o 输出机械臂舵机状态信息//判断人类是否因搞错模式而输入错误的指令信息(指令模式下输入手柄按键信息)if (   serialCmd == 'w' || serialCmd == 's' || serialCmd == 'a' || serialCmd == 'd' || serialCmd == '5' || serialCmd == '4' || serialCmd == '6' || serialCmd == '8' ){Serial.println("+Warning: Robot in Instruction Mode..."); delay(100);while(Serial.available()>0) char wrongCommand = Serial.read();  //清除串口缓存的错误指令return;} if (serialCmd == 'b' || serialCmd == 'c' || serialCmd == 'f' || serialCmd == 'r'){int servoData = Serial.parseInt();servoCmd(serialCmd, servoData, DSD);  // 机械臂舵机运行函数(参数:舵机名,目标角度,延迟/速度)} else {switch(serialCmd){   case 'm' :   //切换至手柄模式 mode = 0; Serial.println("Command: Switch to Joy-Stick Mode.");break;case 'o':  // 输出舵机状态信息reportStatus();break;case 'i':armIniPos();  break;default:  //未知指令反馈Serial.println("Unknown Command.");}}
}void armJoyCmd(char serialCmd){ //Arduino根据手柄按键执行相应操作//判断人类是否因搞错模式而输入错误的指令信息(手柄模式下输入舵机指令)if (serialCmd == 'b' || serialCmd == 'c' || serialCmd == 'f' || serialCmd == 'r'){Serial.println("+Warning: Robot in Joy-Stick Mode...");delay(100);while(Serial.available()>0) char wrongCommand = Serial.read();  //清除串口缓存的错误指令return;} int baseJoyPos;int rArmJoyPos;int fArmJoyPos;int clawJoyPos;switch(serialCmd){case 'a':  // Base向左Serial.println("Received Command: Base Turn Left");                baseJoyPos = base.read() - moveStep;servoCmd('b', baseJoyPos, DSD);break;  case 'd':  // Base向右Serial.println("Received Command: Base Turn Right");                baseJoyPos = base.read() + moveStep;servoCmd('b', baseJoyPos, DSD);break;        case 's':  // rArm向下Serial.println("Received Command: Rear Arm Down");                rArmJoyPos = rArm.read() + moveStep;servoCmd('r', rArmJoyPos, DSD);break;  case 'w':  // rArm向上Serial.println("Received Command: Rear Arm Up");     rArmJoyPos = rArm.read() - moveStep;servoCmd('r', rArmJoyPos, DSD);break;  case '8':  // fArm向上Serial.println("Received Command: Front Arm Up");        fArmJoyPos = fArm.read() + moveStep;servoCmd('f', fArmJoyPos, DSD);break;  case '5':  // fArm向下Serial.println("Received Command: Front Arm Down");        fArmJoyPos = fArm.read() - moveStep;servoCmd('f', fArmJoyPos, DSD);break;  case '4':  // Claw关闭Serial.println("Received Command: Claw Close Down");        clawJoyPos = claw.read() + moveStep;servoCmd('c', clawJoyPos, DSD);break;  case '6':  // Claw打开Serial.println("Received Command: Claw Open Up");     clawJoyPos = claw.read() - moveStep;servoCmd('c', clawJoyPos, DSD);break;  case 'm' :   //切换至指令模式 mode = 1; Serial.println("Command: Switch to Instruction Mode.");break;case 'o':  reportStatus();break;case 'i':  armIniPos();break;default:Serial.println("Unknown Command.");return;}
}
void servoCmd(char servoName, int toPos, int servoDelay){  Servo servo2go;  //创建servo对象//串口监视器输出接收指令信息Serial.println("");Serial.print("+Command: Servo ");Serial.print(servoName);Serial.print(" to ");Serial.print(toPos);Serial.print(" at servoDelay value ");Serial.print(servoDelay);Serial.println(".");Serial.println("");int fromPos; //建立变量,存储电机起始运动角度值switch(servoName){case 'b':if(toPos >= baseMin && toPos <= baseMax){servo2go = base;fromPos = base.read();  // 获取当前电机角度值用于“电机运动起始角度值”break;} else {Serial.println("+Warning: Base Servo Value Out Of Limit!");return;}case 'c':if(toPos >= clawMin && toPos <= clawMax){    servo2go = claw;fromPos = claw.read();  // 获取当前电机角度值用于“电机运动起始角度值”break;} else {Serial.println("+Warning: Claw Servo Value Out Of Limit!");return;        }case 'f':if(toPos >= fArmMin && toPos <= fArmMax){servo2go = fArm;fromPos = fArm.read();  // 获取当前电机角度值用于“电机运动起始角度值”break;} else {Serial.println("+Warning: fArm Servo Value Out Of Limit!");return;}case 'r':if(toPos >= rArmMin && toPos <= rArmMax){servo2go = rArm;fromPos = rArm.read();  // 获取当前电机角度值用于“电机运动起始角度值”break;} else {Serial.println("+Warning: rArm Servo Value Out Of Limit!");return;}      }//指挥电机运行if (fromPos <= toPos){  //如果“起始角度值”小于“目标角度值”for (int i=fromPos; i<=toPos; i++){servo2go.write(i);delay (servoDelay);}}  else { //否则“起始角度值”大于“目标角度值”for (int i=fromPos; i>=toPos; i--){servo2go.write(i);delay (servoDelay);}}
}void reportStatus(){  //舵机状态信息Serial.println("");Serial.println("");Serial.println("+ Robot-Arm Status Report +");Serial.print("Claw Position: "); Serial.println(claw.read());Serial.print("Base Position: "); Serial.println(base.read());Serial.print("Rear  Arm Position:"); Serial.println(rArm.read());Serial.print("Front Arm Position:"); Serial.println(fArm.read());Serial.println("++++++++++++++++++++++++++");Serial.println("");
}void armIniPos(){Serial.println("+Command: Restore Initial Position.");int robotIniPosArray[4][3] = {{'b', 90, DSD},{'r', 90, DSD},{'f', 90, DSD},{'c', 90, DSD} };for (int i = 0; i < 4; i++){servoCmd(robotIniPosArray[i][0], robotIniPosArray[i][1], robotIniPosArray[i][2]);}
}

总结

Arduino通过程序驱动四个舵机,控制机械臂,简单地实现机械臂的功能。

Arduino开发板DIY简易机械臂相关推荐

  1. x86 构架的 Arduino 开发板Intel Galileo

    RobotPeak 是上海的一家硬件创业团队,团队致力于民用机器人平台系统.机器人操作系统(ROS)以及相关设备的设计研发,并尝试将日新月异的机器人技术融入人们的日常生活与娱乐当中.同时,RobotP ...

  2. arduino温湿度计库文件_用ARDUINO开发板自制温湿度计(含WEMOS D1开发板环境安装)...

    ARDUINO从入门到创客带师第四弹 自制温湿度计(翻车) 咱想起以前实验室的墙上挂着的介绍说过法拉第之所谓伟大的原因是他不止把成功的经历写在科学日记里,也把翻车失败的经历写进去,因此咱对于咱翻车的经 ...

  3. 如何制作自己的Arduino开发板

    如何制作自己的Arduino开发板 原文地址 如何制作自己的Arduino开发板 – 八色木 你想过用简单的元件来制作Arduino板吗?或者想过根据自己的需要做一个定制开发板吗?这个项目就是向大家展 ...

  4. arduino 网页服务器,如何将Arduino开发板用作Web服务器

    通过使用以太网扩展板(Ethernet shield),您可以将Arduino开发板用作一个Web服务器. 通过向Arduino开发板配备一个以太网扩展板,您可以将其变成简易的Web服务器,并通过在与 ...

  5. c语言模拟32u4单片机,一种基于Atmega32u4的教学型Arduino开发板的制作方法

    本实用新型涉及一种教学型Arduino开发板,具体是基于Atmega32u4芯片的教学型Arduino开发板. 背景技术: 近些年来,互联网和物联网高速发展,在推动社会生产力快速发展的同时,也对我们的 ...

  6. DIY桌面机械臂__FOC电机驱动

    ### DIY桌面机械臂__FOC电机驱动器(#002) 目录 前言 一.硬件框架与模型 1. 硬件原理图 2. 模型与安装 二.电路制作与测试 1. 电路制作与修改 2. 程序设计与pid角度控制 ...

  7. arduino串口监视器显示nan_使用Arduino开发板制作摩尔斯电码生成器

    摩尔斯电码是一种通信系统,用于在两个不同持续时间的信号中编码任何字符,称为点和虚线.摩尔斯电码由Samuel F.B开发.并进一步用于电报传输秘密信息.它在第二次世界大战时最常用.摩尔斯电码可以通过点 ...

  8. Arduino开发板制作

    Arduino UNO 介绍 ,Arduino开发板制作 教程: Arduino制作 Arduino UNO 图 Arduino是什么 Arduino是一款便捷灵活.方便上手的开源电子原型平台.包含硬 ...

  9. 四针角oled屏连接arduino_使用Arduino开发板连接OLED显示屏制作一款智能手表

    我们大多数人都比较熟悉1602点阵液晶显示屏,它在许多项目中用于向用户显示一些信息.但是这些LCD显示器在他们能做的事情上有很多限制.在本篇文章中,我们将使用OLED显示Android智能手机的一些基 ...

最新文章

  1. python成绩统计_python学习-统计学生成绩-统计学生成绩
  2. 正确导入svn拉取的工程
  3. dailykt爬取tushare 数据存入本地mysql
  4. 勤哲cad服务器支持ug,勤哲CAD服务器
  5. pandas(四) -- 数值计算
  6. Kaggle实战:点击率预估
  7. 初二物理模型有哪些_初二是成绩下滑的高危期,做好这5点成绩涨涨涨!(附全学科提升技巧,家长转给孩子!)...
  8. Query UI DateRangePicker自定义面板个数
  9. [轉]function, new function, new Function
  10. mongodb 如何更改端口号_Centos7配置MongoDB以及端口修改
  11. WAPI网络认证原理
  12. 通过mtd读写flash_linuxmtd读写flash
  13. Ms08067 de 阿青姐姐告诉你为什么要学Python内网开发,不看是你的损失!
  14. Simplygon软件初探之软件安装
  15. 苹果x为什么总黑屏_苹果X手机为什么突然黑屏了
  16. 盛世传承“富三代”品牌让你的家族基业长青
  17. picview是哪里的图片_pic是图片还是照片
  18. 还原codeblocks 的Logs others
  19. IIS Nginx Apache Tomcat 中间件漏洞
  20. 利用鸿蒙系统硬件实现音乐播放功能之优秀

热门文章

  1. android+xposed插件,初探Xposed 插件开发
  2. 八边形类 Octagon
  3. 头像照片汇聚logo视频片头ae竖屏模板
  4. 【Python+Appium】开展自动化测试(七)截图方法
  5. 首位文博虚拟宣推官“文夭夭”上岗
  6. 【央联众商】进行家庭投资理财选择的必要性
  7. 【vscode】ssh通过跳板机连接内网服务器
  8. (python)下载喜马拉雅电台的音频
  9. 交叉编译lrzsz(用于串口传输文件)
  10. 女人要男人真心还是现金?