0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

使用Arduino测量舵机扭矩的过程分享

科技观察员 来源:八色木 作者:八色木 2022-04-08 15:40 次阅读

在日常生活中,我们经常会看到一些产品的技术参数,这些参数与实际使用数据都会存在一些差距,但它也是用户选择产品的重要参考。比如智能手机制造商会宣称他们的电池使用寿命如何长,科技公司会宣称他们的科技产品是最具科技含量,而汽车公司则吹嘘自己汽车的燃油经济性如何好,其实这些数据有相当部分是存在虚标的。

我们经常使用的舵机也不例外,舵机制造商也会对他们生产的舵机给出各种各样的技术参数,其中诸如电机能够产生的扭矩等。如下图,HS-422舵机的技术参数

poYBAGJP5qqAb2PZAABmRUiDSgA195.png

在这个项目中,我们将建立一个测量舵机扭矩范围的工具,目的是验证舵机实际产生的扭矩与技术参数中所标称的扭矩是否相符。整个实验会用到一个测力量的部件,一个Arduino Uno,一个3D打印的舵机框架,和其他一些部件,然后测量舵机实际产生的扭矩。

实验器件清单

Arduino Uno

20kg测压杆

HX711称重传感器模块

面包板电源

面包板

跳线

M4×6mm螺丝

M4嵌入式螺母

如何测量舵机的扭矩

pYYBAGJP5qaAUr-aAAIQ6M-Xdyc501.png

力矩是通过力与距离的乘积来计算得出的。在这个项目中,要获得舵机的力会有些困难,因此,需要使用一个负载单元。在设计和使用测压元件时会涉及到许多复杂的细节,但在本项目中,测压元件是一种传感器,它允许计算机将微小的电压变化转化为力的形式呈现出来。使用测力元件,我们就能够测量舵机的旋转轴和舵机臂之间的精确距离。

poYBAGJP5qCAXo6uAAZ7sC-nBPs897.png

当舵机开始旋转时,它就会对测压元件产生推力,结合测压元件受到的测力以及旋转轴和伺服臂的距离,就可以计算出由测力元件传递的扭矩。

构建测试工具

测试工具的机械结构比较简单,它由两个3D打印零件和几个紧固件组成。你可以下载本文附带的3D打印部件的设计文件(提取码:9t4e)。

poYBAGJP5pyAcUwiAACkB1g0SZc550.png

3D打印件没有特殊的要求,所以使用任何材料打印都可以。

装配测试工具

装配舵机扭矩测量工具的第一步是安装嵌入式螺母,嵌入式螺母可以使安装更安全,不会损坏3D打印框架。安装螺母时,可以轻轻将其按下插入塑料孔后,使用烙铁对其加热,当你移开烙铁后,熔化的塑料会在镶件周围凝固,形成非常牢固的连接,这样就可以完成安装了。

pYYBAGJP5piAOQwiAAQJ-25Ki2E959.png

接下来,安装测压元件,其一侧有一个绿色箭头。将测压元件朝上,箭头指向远离舵机的方向,然后将测压元件插入旁边的正方形中。测压元件应该保持稳固,确保安装过程中没有摇晃的空隙。

pYYBAGJP5pSADlMEAATbd_56GYg344.png

然后,在面包板背面贴一块双面胶,把它粘在3D打印的框架上。

pYYBAGJP5pCAcqZ8AAa9KhA5JIE040.png

完成了框架搭建,余下的就是电路的搭建了,请看下面的电路图。

poYBAGJP5ouAA7QYAAHEzccZcrc499.png

电源连接:

Arduino GND -》 面包板 GND

HX711 GND -》 面包板 GND

舵机 黑线 -》 Arduino GND

Arduino Vin -》 面包板 VCC

HX711 VCC -》 面包板 VCC

舵机 红线 -》 Arduino 5V

信号连接:

舵机 黄线 -》 Arduino D9

HX711 DT针 -》 Arduino D3

HX711 SCK针 -》 Arduino D2

测压元件连接:

测压元件红线 -》 HX711 E+针

测压元件黑线 -》 HX711 E-针

测压元件绿线 -》 HX711 A-针

测压元件白线 -》 HX711 A+针

完成组装的成品图

poYBAGJP5oaAG0pAAActMmFeAMo903.png

/*

Project: Measuring Servo Torque

Author: Toglefritz

This project involves a simple device used to measure the torque output of a hobby-scale servo. The device consists of a 3D printed frame that will hold a servo and a load cell. The servo rotates a horn into the load cell, producing a reading from the load cell. From the known distance between the servo's center of rotation and the load cell, the servo's torque can be calculated from the force on the load cell.

Complete documentation for the project can be found on Maker Pro.

*/

// Include libraries for interfacing with the HX711 and the servo

#include "HX711.h"

#include

// Configuration

#define calibration_factor -7050.0 // This value is obtained using the HX711_Calibration sketch

int trialRuns = 5; // This defines the number of times to measure the servo's force on the

// load cell. These measurments will be averaged to come up with a single reading.

float armLength = 2.75; // This is the distance (in cm) between the servo's center of rotation and the load cell.

// This is based on the mechanical design of the test fixture.

// Define connections between the HX711 and the Arduino

#define DT 3 // The HX711 DT pin connects to D3 on the Arduino

#define SCK 2 // The HX711 SCK pin connects to D2 on the Arduino

// Initialize the HX711

HX711 loadCell(DT, SCK);

// Create a servo object

Servo testServo;

void setup() {

// Begin Serial communication

Serial.begin(9600);

Serial.println(" - Torque Measurement Tool - "); // Print a heading

Serial.println();

// Set the pin used to control the servo

testServo.attach(9);

loadCell.set_scale(calibration_factor); // This value is obtained by using the HX711_Calibration sketch

loadCell.tare(); // Reset the scale to zero to compensate for any existing load

// To begin the test, the servo horn should be attached so that it is making contact with

// the load cell at an angle of 140 degrees on the servo

testServo.write(140); // Move the servo into the load cell

Serial.println("Initialization complete.");

Serial.println("Send 's' to begin testing. Send 'h' for help.");

Serial.println();

}

void loop() {

// If the user sends 's' over Serial, begin testing the torque

if(Serial.read() == 's' || Serial.read() == 'S') {

measureTorque();

}

// If the user sends 'i' over Serial, show some instructions

if(Serial.read() == 'h' || Serial.read() == 'h') {

Serial.println("Right now, the Arduino has moved the servo into its starting position.");

Serial.println("In the servo's current position, install the horn so that it is just touching the load cell.");

Serial.println("When you are ready, send 's' over Serial and the Arduino will begin testing the servo's torque.");

Serial.println("You will see the Arduino move the servo into the load cell five different times.");

Serial.println("Each time the servo hits the load cell, the Arduino will take a reading.");

Serial.println("Those readings will be averaged to calculate the torque delivered by the servo.");

Serial.println("Keep an eye on the Serial monitor to see the results.");

Serial.println();

Serial.println("Send 's' to begin testing.");

Serial.println();

}

}

void measureTorque() {

/*

To test the servo's torque, the Arduino will move the servo arm so that it presses on the load

cell. The resulting force will produce a reading from the load cell. The Arduino will take

five readings to compute an average force value. Because the distance between the servo's

center of rotation and the load cell is known from the frame design, the Arduino

can calculate the torque produced by the servo.

*/

Serial.println("Individual Readings: ");

float individualReadings[trialRuns]; // This array will store the load cell readings for the five tests

for(int i = 0; i < 5; i++) {

testServo.write(180); // Move the servo away from the load cell

delay(1000); // Wait for the servo to move

loadCell.tare(); // Reset the scale to zero to compensate for any existing load

testServo.write(130); // Move the servo into the load cell. A 130 degree angle is actually inside the load

// cell, so the servo will be pushing towards that position, exerting force on

// the load cell.

delay(1000); // Wait for the servo to move

individualReadings[i] = loadCell.get_units(); // Take a measurment from the load cell

Serial.print(individualReadings[i]); // Print the measurment over Serial

Serial.print(" ");

}

// Now that we have five individual readings, average them to get one average load reading

float readingsSum = 0; // Create a variable to store the sum of all readings

// Loop through the array and add together all the readings

for(int y = 0; y < trialRuns; y++) {

readingsSum = readingsSum + individualReadings[y];

}

float averageReading = readingsSum / trialRuns; // Divide by the numer of readings to get the average

Serial.println();

Serial.println();

Serial.println("Average Reading:"); // Print the average reading over Serial

Serial.println(averageReading);

// From the average reading, calculate the torque delivered by the servo

// using the formula T = F * r where T is the torque, F is the load cell

// reading (a force), and r is the radius of rotation (the distance between

// the servo and the load cell).

// The units for the torque will be kg*cm

float servoTorque = averageReading * armLength; // Calculate the torque

Serial.println();

Serial.println("Torque:"); // Print the torque

Serial.print(servoTorque);

Serial.println(" kgcm");

testServo.write(180); // Move the servo away from the load cell after the testing is complete

}

系统启动后,将会打开一个串口监视器,当我们准备开始测量时,系统将提示你通过串口发送“s”开始。

pYYBAGJP5oKAfsmWAAFIfyiW8l0730.png

Arduino将测量这个舵机产生的力,并将它转换成扭矩,最后将结果发送给串口监视器上。

poYBAGJP5n6Ace99AAHBjZ_wiNc808.png

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Arduino
    +关注

    关注

    188

    文章

    6468

    浏览量

    186952
收藏 人收藏

    评论

    相关推荐

    数字舵机扭矩消失时,该怎么操作

    数字舵机扭矩消失时,该怎么操作
    发表于 01-28 20:55

    数字舵机扭矩消失时,该怎么操作

    数字舵机扭矩消失时,该怎么操作
    发表于 01-28 21:03

    数字舵机扭矩消失时,该怎么操作

    数字舵机扭矩消失时,该怎么操作
    发表于 01-28 21:06

    为何电机扭矩测量结果和传感器精度对不上?

    扭矩环),负载电机工作在扭矩环(或速度环),扭矩传感器测量扭矩大小并将扭矩值通过信号传送给
    发表于 07-06 15:12

    扭矩舵机怎么才能让它停下来

    我在店里买了一个360度的大扭矩舵机,给它一个Write(0),它就一直转,怎么才能让它停下来啊
    发表于 05-27 05:55

    Arduino如何利用红外感应控制舵机

    实现功能:当红外感应到人时,控制舵机转动180度参考:基于Arduino的多种方式控制舵机舵机、电位器、蓝牙).硬件连接:舵机连接:Ard
    发表于 06-28 11:17

    机器人舵机调试系统

    控制或者输出较高的扭矩舵机也叫也叫 RC 伺服器,通常用于机器人项目,也可以在遥控汽车,飞机等航模中找到它们。类似舵机这样的伺服系统通常由小型电动机,电位计,嵌入式控制系统和变速箱组成。电机输出轴
    发表于 07-12 08:43

    arduino如何驱动ST90S微型舵机

    舵机来带动拨片拨取货物了,本博客就介绍arduino如何驱动ST90S微型舵机以及分享在驱动过程中所遇到的问题以及解决方法效果展示舵机/拨片
    发表于 09-10 06:39

    Arduino调试舵机的方法步骤

    Arduino调试舵机的方法步骤
    发表于 01-18 07:54

    arduino如何控制舵机

    arduino如何控制舵机
    发表于 01-19 06:04

    扭矩测量

    扭矩测量 扭矩由力和力臂的乘积来定义,单位是Nm。
    发表于 01-07 12:52 3865次阅读
    <b class='flag-5'>扭矩</b><b class='flag-5'>测量</b>

    盘点电机扭矩测量方法有哪些

    能量转换法是指根据能量守恒定律通过测量热能、电能等其它参数来间接测量扭矩,目前银河电气推出的TN4000电子式扭矩仪就是该原理测量电机
    发表于 11-08 16:41 1.3w次阅读
    盘点电机<b class='flag-5'>扭矩</b>的<b class='flag-5'>测量</b>方法有哪些

    arduino如何控制舵机及详细步骤

    本文首先介绍了舵机的控制方法,其次阐述了Arduino控制舵机的两种方法,最后详细阐述了arduino控制舵机的详细步骤。
    的头像 发表于 05-11 14:28 16.5w次阅读
    <b class='flag-5'>arduino</b>如何控制<b class='flag-5'>舵机</b>及详细步骤

    Arduino UNO驱动数字舵机

    Arduino UNO驱动数字舵机舵机数字舵机工作原理数字舵机与模拟舵机区别EMAX ES08M
    发表于 11-30 12:06 15次下载
    <b class='flag-5'>Arduino</b> UNO驱动数字<b class='flag-5'>舵机</b>

    通过Arduino控制舵机

    本文主要介绍通过Arduino控制舵机,步进电机以及循环的使用。对于Arduino控制舵机的方法是通过其输出PWM信号来实现控制的。这里所谓的PWM信号其本质上就是脉冲信号。而对于步进
    发表于 03-23 13:52 1次下载
    通过<b class='flag-5'>Arduino</b>控制<b class='flag-5'>舵机</b>