Arduino - 通过网络控制手臂机器人
组件和用品
| × | 1 | ||||
| × | 1 | ||||
| × | 1 |
关于这个项目
如果您是初学者,我建议您阅读以下教程:
- Arduino - 电机
- Arduino - 伺服电机
- Arduino - 无线网络
1.演示
2. 用户界面
机械臂有6个电机。
- A区:控制电机2、3、4(控制三个手关节)
- B 区:控制电机 1(控制底座)
- C 区:控制电机 5(控制夹具旋转)
- D 区:控制电机 6(控制夹具)
3. 系统架构
4. 工作流程
客户端 (网络用户界面 - 用 JavaScript + HTML + CSS 编写)
当用户触摸或扫动手指(或点击或移动鼠标)时,我们可以获得坐标(x,y)。工作流程如下:
在A区的情况下,要计算电机2、3、4的角度,我们需要做一些几何计算 .您可以在本页末尾参考。
服务器端 (Arduino 代码):
收到客户的一组角度后,六个电机逐渐从当前角度移动到新角度。六个电机应同时移动并达到新的角度。在详细介绍如何控制所有电机之前,让我们先看看如何控制单个电机。假设我们要将电机从当前角度(angle)移动到新角度(new_angle)。由于电机速度很高,我们应该放慢速度。 为此,重复以下两个步骤,直到电机达到新的角度:
- 小步移动电机。
- 暂停一小段时间,然后再移动一步。
下图说明了当新角度大于当前角度时的上述方案:
Wherestep_num 是电机必须走的步数。 步骤和时间
是预定义的值。后两个决定速度和流畅度。 以上仅针对一台机器人。为了让机器人同时开始移动和到达目的地,我们可以这样做:六个电机走相同的step_num , 但是 step
每个电机的不同。所以我们必须选择step_num 在这个项目中是最大的。
一般来说,Arduino的工作流程如下:
5. 几何计算
让我们将机械臂计算成如下几何问题:
众所周知
- C 是固定的
- 一个已知点 - D 是来自用户的输入
- 一个已知点——CB、BA、AD(分别用b、a、d表示)
- 每个臂节的长度求: 角度 C、B、A 解决方案:
- 假设角度 B 和 A 相同
- 添加一些额外的点和线段
计算
- 我们知道点 C 和 D => 我们可以计算出 DC 的长度(用 c 表示)
- 我们也可以计算δ
- 看看三角形 ABE,我们可以推断出 AE =BE 和 ∠E =π - 2α。
- 所以:
- 三角形 CDE 中的余弦定律:
- 将(1)和(2)改为(3),我们有:
简化
- 简化上述内容:
- 既然知道了a、b、c、d,求解上面的二次方程,就可以计算出α的值了。 - 并且 β =π - α - 直到现在我们找到了 β,让我们找到 γ - BDC 和 BDA 三角形中的余弦定律:
- 求解这组方程,我们可以计算出γ。
- 因此,它们所需的角度为:(δ+γ)、β 和 β。这些分别是电机 2、3 和 4 的角度。
6. 源代码
源代码包含两个文件:
- RobotArmWeb.ino :Arduino 代码
- Remote_arm.php :Web 应用程序代码,上传到 PHPoC WiFi Shield 或 PHPoC Shield。 (请参阅本文中的说明。)
您还需要将图像文件 flywheel.png 上传到 PHPoC Shield。
适合初学者的最佳 Arduino 入门套件
如果您正在寻找 Arduino 套件,请参阅适合初学者的最佳 Arduino 套件
函数参考
- Arduino - 伺服库
- Servo.attach()
- Servo.write()
- Servo.writeMicroseconds()
- Servo.read()
- Servo.attached()
- Servo.detach()
- Serial.begin()
- Serial.println()
代码
- RobotArmWeb
- remote_arm.php
RobotArmWebArduino
这是 Arduino 代码#include#include int angle_init[] ={90, 101, 165, 153, 90, 120}; // 当电机直立时。 web中,电机直立时的角度为{0, 90, 130, 180, 0, 0};int angle_offset[] ={0, 11, -15, -27, 0, 137}; // 真实伺服电机和 webint cur_angles[] ={90, 101, 165, 153, 90, 120} 上的角度之间的偏移; // 六个电机的当前角度(度) int dest_angles[] ={0, 0, 0, 0, 0, 0}; // 目标角度int angle_max[] ={180, 180, 160, 120, 180, 137};int angle_min[] ={ 0, 0, 0, 20, 0, 75};int direction[] ={1, 1 , 1, 1, 1 ,-1};int angleSteps[] ={3, 2, 2, 2, 4 ,4}; //每个电机的移动步数(度)Servoservo1;Servoservo2;Servoservo3;Servoservo4;Servoservo5;Servoservo6;Servoservo[6]={servo1,servo2,servo3,servo4,servo5,servo6};PhpocServer服务器(80);PhpocClient 客户端;int stepNum =0;void setup(){ Serial.begin(9600); Phpoc.begin(PF_LOG_SPI | PF_LOG_NET); server.beginWebSocket("remote_arm");伺服1.附加(2); // 将引脚 2 上的伺服器连接到伺服器对象servo2.attach(3); // 将引脚 3 上的伺服器连接到伺服器对象servo3.attach(4); // 将引脚 4 上的伺服器连接到伺服器对象servo4.attach(5); // 将引脚 5 上的伺服器连接到伺服器对象servo5.attach(6); // 将引脚 6 上的伺服器连接到伺服器对象servo6.attach(7); // 将引脚 7 上的伺服连接到伺服对象 for(int i =0; i <6; i++)servo[i].write(angle_init[i]);}void loop() { PhpocClient client =server.available (); if(client) { StringangleStr =client.readLine(); if(angleStr) { Serial.println(angleStr); int 逗号Pos1 =-1; int 逗号Pos2; for(int i =0; i <5; i++) {commaPos2 =angleStr.indexOf(',',commaPos1 + 1); intangle =angleStr.substring(commaPos1 + 1,commaPos2).toInt(); dest_angles[i] =角度 * 方向[i] + 角度偏移[i];逗号位置 1 =逗号位置 2; } int angle5 =angleStr.substring(commaPos1 + 1).toInt(); dest_angles[5] =角度5 * 方向[5] + 角度偏移[5];步数 =0; // 分多个小步移动电机,使电机运动平稳,避免电机突然移动。下面是(int i =0; i <6; i++) { int dif =abs(cur_angles[i] - dest_angles[i]); int step =dif / angleSteps[i]; if(stepNum 0) { for(int i =0; i <6; i++) { int angleStepMove =(dest_angles[i] - cur_angles[i]) / stepNum; cur_angles[i] +=angleStepMove; if(cur_angles[i]> angle_max[i]) cur_angles[i] =angle_max[i];否则 if(cur_angles[i] remote_arm.phpPHP
此代码是网络应用程序。Arduino - Arm Robot - Web Arduino - 通过网络控制手臂机器人
WebSocket :null
示意图
需要为6台电机提供外部电源制造工艺