我喜欢直接安装在手臂上的 PCA9685,因为我认为它可以减少接线并避免延长任何伺服电机电缆 。而且我还打算在我的手臂上安装其他 I2C 设备,因此为所有这些设备设置一个 I2C 连接是有意义的 。
我们接线图的“Arduino 部分”有 Nano 和 5 个电位器 。控制器一侧接地,另一侧从 Arduino Nano 获得 5 伏电压 。
每个电位计的输出连接到 Arduino Nano 上的模拟输入,如下所示:
底座Base – A0肘部Elbow – A1手腕WristA2关节Grip PivotA3夹爪Grip JawsA6
请注意,A4 和 A5 用于 I2C 连接 。
现在让我们转到连接的 PCA9685 一侧 。
I2C 连接到 PCA9685 末端的一个连接器,任一连接器都可以工作 。
然后,您需要将 5 个(或 6 个)伺服电机连接到该模块 。确保以正确的方式连接 。
最后,您将需要一个具有足够电流来驱动五个伺服电机的电源 。6 伏 2 安电源将是理想的选择 。电源直接连接到 PCA9685 模块上的连接器 。
一旦你把它全部连接起来,就该编写一些代码了!
Arduino代码
此处提供了简单机械臂控制器的代码 。
该草图使用了 Adafruit PWM 库,您需要将其安装到 Arduino IDE 中 。只需在库管理器中搜索“Adafruit PWM”,它应该是第一个结果 。
如果您需要安装库的帮助或想了解有关此库和 PCA9685 的更多信息,请查看我关于使用伺服电机的文章 。
/*Basic Robot Arm Controllerrobot-arm-control-basic.inoControls 5 DOF Robot Arm, uses Arduino Nano and PCA9685 PWM ControllerUses Adafruit PWM libraryUses 5 potentiometers for input (can be modified for 6)
DroneBot Workshop 2018
Welcome to the Workshop!
*/
// Include Wire Library for I2C Communications#include
// Include Adafruit PWM Library#include
#define MIN_PULSE_WIDTH 650#define MAX_PULSE_WIDTH 2350#define FREQUENCY 50
Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver();
// Define Potentiometer Inputs
int controlBase = A0;int controlElbow = A1;int controlWrist = A2;int controlPivot = A3;int controlJaws = A6;
// Define Motor Outputs on PCA9685 board
int motorBase = 0;int motorElbow = 1;int motorWrist = 2;int motorPivot = 3;int motorJaws = 4;
// Define Motor position variablesint mtrDegreeBase;int mtrDegreeElbow;int mtrDegreeWrist;int mtrDegreePivot;int mtrDegreeJaws;
void setup(){// Setup PWM Controller objectpwm.begin();pwm.setPWMFreq(FREQUENCY);}
// Function to move motor to specific positionvoid moveMotorDeg(int moveDegree, int motorOut){int pulse_wide, pulse_width;
// Convert to pulse widthpulse_wide = map(moveDegree, 0, 180, MIN_PULSE_WIDTH, MAX_PULSE_WIDTH);pulse_width = int(float(pulse_wide) / 1000000 * FREQUENCY * 4096);
//Control Motorpwm.setPWM(motorOut, 0, pulse_width);}
// Function to convert potentiometer position into servo angleint getDegree(int controlIn){int potVal,srvDegree;
// Read values from potentiometerpotVal = analogRead(controlIn);
// Calculate angle in degreessrvDegree = map(potVal, 0, 1023, 0, 180);
// Return angle in degreesreturn srvDegree;
}
void loop() {
//Control Base Motor
// Get desired positionmtrDegreeBase = getDegree(controlBase);// Move motormoveMotorDeg(mtrDegreeBase,motorBase);
//Control Elbow Motor
// Get desired positionmtrDegreeElbow = getDegree(controlElbow);// Move motormoveMotorDeg(mtrDegreeElbow,motorElbow);
//Control Wrist Motor
// Get desired positionmtrDegreeWrist = getDegree(controlWrist);// Move motormoveMotorDeg(mtrDegreeWrist,motorWrist);
//Control Pivot Motor
// Get desired positionmtrDegreePivot = getDegree(controlPivot);// Move motormoveMotorDeg(mtrDegreePivot,motorPivot);
//Control Jaws Motor
// Get desired positionmtrDegreeJaws = getDegree(controlJaws);// Move motormoveMotorDeg(mtrDegreeJaws,motorJaws);
// Add short delaydelay(20);
}
该代码包括 Adafruit PWM 库和 Wire 库,这对于通过 I2C 总线进行通信至关重要 。
为 PWM 控制器定义了一些常数,PWM 信号的最小和最大脉冲宽度以及信号的频率 。代码中的值将适用于 DF Robot 5 DOF 机器人手臂套件随附的电机 。
接下来定义了许多变量:
“control”变量,代表电位计所连接的模拟端口 。“motor” 变量代表 PCA9685 板上 PWM 输出 。“ mtrDegree ”变量表示您希望电机轴定位到的角度(从 0 到 180) 。
在设置中,我们只初始化 PWM 对象并将 PWM 振荡器的频率设置为 50 Hz,这是模拟伺服电机的标准 。
然后我们定义两个函数:
moveMotorDeg此函数将电机名称和位置(以度为单位)作为输入 。然后它将请求的电机移动到该位置 。getDegree此函数将电位计名称作为输入并以度数输出位置 。
由于我们定义了两个函数,循环非常简单 。这确实是相同的程序重复五次,每个电机一次 。
- 人力资源六大模块比较重要的三个,人力资源管理六大模块的主要内容
- 无线蓝牙耳机aukey评测 aukey蓝牙耳机怎么样
- 罗技哪款蓝牙键盘好用 罗技k380和k580无线键盘比较
- 人力资源六大模块是什么,人力资源六大模块包含了什么
- 什么牌子的无线蓝牙耳机好 无线蓝牙耳机国内哪个品牌好
- 蓝牙耳机正确佩戴方式 耳塞式蓝牙耳机正确戴法图解
- 讲解蓝牙耳机使用双耳模式 魔音耳机怎么连接蓝牙教程
- 什么是火灾自动报警系统中的模块,起到什么作用?
- 锅炉哪些牌子比较好 模块锅炉十大品牌有哪些?
- 点火模块坏了有哪些故障