Как измерить крутящий момент сервопривода с помощью Arduino

Добавлено 20 августа 2019 в 21:46

Узнайте, как с помощью Arduino измерить крутящий момент серводвигателей, которые вы собираетесь использовать в своих проектах.

В повседневной жизни нам часто от различных производителей предоставляется ряд статистических данных, которые в лучшем случае имеют слабую связь с опытом реальных пользователей.

Производители смартфонов утверждают, что их аккумуляторы служат дольше, чем на самом деле. Технологические компании рекламируют всю свою продукцию как самые компактные версии, а автомобильные компании могут похвастать ложными показателями экономии топлива.

Производители серводвигателей ничем не отличаются. Они предъявляют различные показатели, связанные с величиной крутящего момента, который могут создавать их двигатели.

Рисунок 1 Спецификация на серводвигатель HS-422 с сайта Hitec.
Рисунок 1 – Спецификация на серводвигатель HS-422 с сайта Hitec.

В данном проекте мы создадим инструмент для измерения диапазона крутящего момента, создаваемого сервоприводами стандартного размера.

Таким образом, будет легко проверить, сможет ли конкретный сервопривод создавать крутящий момент, необходимый для какого-либо проекта.

Используя тензодатчик, Arduino Uno, каркас, напечатанный на 3D принтере, и несколько других деталей, вы сможете просто поместить серводвигатель на место тестирования и точно измерить крутящий момент, который он выдает.

Рисунок 2 Тензодатчик, Arduino Uno, каркас, напечатанный на 3D принтере, и несколько других деталей, необходимые для данного проекта.
Рисунок 2 – Тензодатчик, Arduino Uno, каркас, напечатанный на 3D принтере, и несколько других деталей, необходимые для данного проекта.
Рисунок 3 Компоненты, необходимые для проекта (вид сверху).
Рисунок 3 – Компоненты, необходимые для проекта (вид сверху).
Рисунок 4 Компоненты, необходимые для проекта (вид ближе).
Рисунок 4 – Компоненты, необходимые для проекта (вид ближе).

Компоненты

  • Arduino Uno;
  • тензодатчик 20 кг;
  • плата усилителя тензодатчика HX711;
  • блок питания для макетной платы;
  • беспаечная макетная плата;
  • перемычки;
  • 4 вставки M4;
  • 2 винта M4 x 6 мм.

В дополнение к вышеперечисленным материалам для тестирования вам понадобится сервопривод размером для любительских проектов.

Как измерить крутящий момент серводвигателя

Крутящий момент рассчитывается путем умножения силы на расстояние. В данном проекте будет немного сложно получить силу, действующую на сервопривод. Для этого необходимо использовать тензодатчик.

С конструкцией и использованием тензодатчиков обычно связаны сложные детали, но для целей данного проекта тензодатчик представляет собой датчик, который позволяет компьютеру преобразовывать небольшие изменения напряжения в силу.

Рисунок 5 Тензодатчик, рассчитанный на нагрузку 20 кг, подходит для сервоприводов самого высокого уровня.
Рисунок 5 – Тензодатчик, рассчитанный на нагрузку 20 кг, подходит для сервоприводов самого высокого уровня.
Рисунок 6 Белый материал на тензодатчике скрывает измерительный элемент напряжения.
Рисунок 6 – Белый материал на тензодатчике скрывает измерительный элемент напряжения.

Используя тензодатчик, мы можем измерить точно расстояние между осью вращения сервопривода и рычагом на валу сервопривода.

Имейте в виду, что сервопривод будет давить на тензодатчик при попытке его поворота.

Рисунок 7 Деталь рычага сервопривода
Рисунок 7 – Деталь рычага сервопривода

Принимая во внимание измерение силы с тензодатчика, а также вращение и длину рычага сервопривода, мы сможем рассчитать крутящий момент, создаваемый сервоприводом.

Сборка инструмента тестирования

Механическая конструкция инструмента тестирования проста и состоит из двух частей, напечатанных на 3D принтере, и пары крепежных элементов.

Рисунок 8 Фигуры моделей необходимых печатаемых компонентов.
Рисунок 8 – Фигуры моделей необходимых печатаемых компонентов.

Никаких специальных параметров печати не требуется, поэтому для деталей подойдет любой жесткий пластик.

На самом деле, поскольку для данного проекта эстетика не является приоритетом, вы можете использовать большую высоту слоя, чтобы ускорить время печати.

Примечание: для печати использовался принтер Monoprice MP Select Mini с высотой слоя 0,3 мм.

Рисунок 9 Напечатанные компоненты проекта в сборке.
Рисунок 9 – Напечатанные компоненты проекта в сборке.

На видео ниже показан процесс установки крепежных вставок.

Процесс сборки

Первым шагом при сборке инструмента измерения крутящего момента серводвигателя является установка крепежных вставок, которые позволят надежно фиксировать сервоприводы, а затем убирать их, не повреждая напечатанный на 3D принтере каркас.

Чтобы установить вставку, поместите ее на отверстие для крепежа сервопривода. Затем аккуратно вдавите вставку с помощью паяльника, нагретого примерно до 120°C. Не нажимайте на вставку слишком сильно. Пусть тепло сделает всю работу за вас и позволит вставке погрузиться в пластик. При удалении паяльника расплавленный пластик затвердевает вокруг вставки, создавая очень прочное соединение.

Рисунок 10 Крепежные вставки, установленные в напечатанный каркас.
Рисунок 10 – Крепежные вставки, установленные в напечатанный каркас.
Рисунок 11 – Крепежные вставки, установленные в напечатанный каркас.
Рисунок 11 – Крепежные вставки, установленные в напечатанный каркас.

Затем установите тензодатчик в квадратное отверстие, но так, чтобы стрелка на датчике была направлена в сторону от сервопривода.

Тензодатчик должен вставляться плотно и ровно, чтобы избежать ошибок при измерении силы.

Рисунок 12 – Установка тензодатчика
Рисунок 12 – Установка тензодатчика

И наконец, большая плоская поверхность на напечатанном каркасе используется для макетной платы.

У макетной платы есть клейкая подложка. Просто снимите ее покрытие и приклейте плату к напечатанному на 3D принтере каркасу.

Рисунок 13 – Клейкая подложка макетной платы.
Рисунок 13 – Клейкая подложка макетной платы.

Заполнение макетной платы

Как только проектирование механических составляющих проекта завершено, мы можем начать работу над схемой.

Сначала подключите блок питания к макетной плате с противоположной стороны от тензодатчика. Блок питания расположен на макетной плате так, что его выводы подачи питания соединяются с шинами питания макетной платы.

На блоке питания находится переключатель, который контролирует выходное напряжение. Для данного проекта мы будем использовать 5 вольт. Там же есть выключатель питания. Пока выключите питание.

Рисунок 14 – Установка блока питания на макетную плату.
Рисунок 14 – Установка блока питания на макетную плату.

Теперь, перед установкой HX711 на макетную плату, необходимо выполнить подготовительный шаг.

Проблема в том, что плата HX711 почти такая же по ширине, как макетная плата. Если HX711 установить на макетную плату, мы не сможем подключить ее к тензодатчику.

Поэтому мы сначала разместим перемычки.

У HX711 на стороне, ближайшей к серводвигателю, есть четыре соединения. Используйте маленькие кусочки проволоки, чтобы сделать перемычки на макетной плате длиной примерно пять шагов.

Когда мы установим HX711 над установленными перемычками, у нас всё равно будет доступ к ее выводам для возможности подключения других перемычек.

Чтобы сделать этот шаг немного понятнее, ниже приведена фотография.

Рисунок 15 – Перемычки для HX711.
Рисунок 15 – Перемычки для HX711.

Как только перемычки установлены, установите плату HX711 рядом с источником питания. Убедитесь, что выводы платы совпадают с установленными перемычками.

Рисунок 16 – Установка платы HX711.
Рисунок 16 – Установка платы HX711.
Рисунок 17 – Плата HX711 рядом с блоком питания.
Рисунок 17 – Плата HX711 рядом с блоком питания.

Наконец, Arduino Uno будет расположена рядом с инструментом измерения крутящего момента.

Рисунок 18 – Инструмент измерения крутящего момента и Arduino Uno рядом с ним.
Рисунок 18 – Инструмент измерения крутящего момента и Arduino Uno рядом с ним.
Рисунок 19 – Схема соединения инструмента измерения крутящего момента.
Рисунок 19 – Схема соединения инструмента измерения крутящего момента.

Подключения питания:

  • подключите вывод GND платы Arduino к выводу GND на макетной плате;
  • подключите вывод GND платы HX711 к макетной плате;
  • подключите черный провод серводвигателя к выводу GND Arduino;
  • подключите вывод Vin платы Arduino к выводу Vcc на макетной плате;
  • подключите вывод VCC платы HX711 к выводу Vcc на макетной плате;
  • подключите красный провод серводвигателя к выводу 5V на Arduino.

Сигнальные соединения:

  • подключите желтый провод серводвигателя к выводу D9 платы Arduino;
  • подключите вывод DT платы HX711 к выводу D3 платы Arduino;
  • подключите вывод SCK платы HX711 к выводу D2 платы Arduino.

Подключение тензодатчика:

  • подключите красный провод тензодатчика к выводу E+ платы HX711;
  • подключите черный провод тензодатчика к выводу E- платы HX711;
  • подключите зеленый провод тензодатчика к выводу A- платы HX711;
  • подключите белый провод тензодатчика к выводу A+ платы HX711.
Рисунок 20 – Подключение тензодатчика
Рисунок 20 – Подключение тензодатчика
Рисунок 21 – Подача питания на плату HX711
Рисунок 21 – Подача питания на плату HX711
Рисунок 22 – Подключения платы HX711
Рисунок 22 – Подключения платы HX711
Рисунок 23 – Подача питания на плату Arduino Uno
Рисунок 23 – Подача питания на плату Arduino Uno
Рисунок 24 – Подключение серводвигателя
Рисунок 24 – Подключение серводвигателя
Рисунок 25 – Подключения к Arduino Uno
Рисунок 25 – Подключения к Arduino Uno

Программирование Arduinio

Когда механическая и электрическая сборки завершены, последний шаг – загрузить прошивку в Arduino.

/*

  Данный проект включает в себя простое устройство, используемое для 
измерения выходного крутящего момента серводвигателя.
  Устройство состоит из каркаса, напечатанного на 3D принтере, в который
вставляются сервопривод и тензодатчик. Сервопривод вращает вал в тензодатчик,
с которого считываются показания.
  По показаниям силы тензодатчика и с учетом расстояния между центром
серводвигателя и тензодатчиком можно рассчитать крутящий момент.

*/

// Включение библиотек для взаимодействия с HX711 и серводвигателем
#include "HX711.h"
#include <Servo.h>

// Конфигурация
#define calibration_factor -7050.0  // Это значение получено с помощью скетча HX711_Calibration
int trialRuns = 5;    // Это определяет количество измерений силы сервопривода на тензодатчике.
                      // Эти измерения будут усреднены для получения единственного показания.
float armLength = 2.75;   // Это расстояние (в см) между центром вращения сервопривода и тензодатчиком.
                          // Оно зависит от механической конструкции испытательной установки.        

// Определение соединений между HX711 и Arduino
#define DT  3   // Вывод DT на HX711 DT подключен к выводу D3 на Arduino
#define SCK  2  // Вывод SCK на HX711 подключен к выводу D2 на Arduino

// Инициализация HX711
HX711 loadCell(DT, SCK);

// Создание объекта серводвигателя
Servo testServo;

void setup() 
{
  // Запуск последовательного соединения
  Serial.begin(9600);
  Serial.println(" - Torque Measurement Tool - ");  // Печать заголовка
  Serial.println();

  // Установить вывод, используемый для управления серводвигателем
  testServo.attach(9); 

  loadCell.set_scale(calibration_factor); // Это значение получено с помощью скетча HX711_Calibration
  loadCell.tare(); // Сбросить на ноль, чтобы компенсировать любую существующую нагрузку

  // Чтобы начать испытание, вал серводвигателя должен быть прикреплен так,
  // чтобы он соприкасался с тензодатчиком под углом 140 градусов к сервоприводу.
  testServo.write(140); // Переместить сервопривод к тензодатчику

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

void loop() 
{
  // Если пользователь посылает 's' по последовательному порту, начать проверку крутящего момента
  if(Serial.read() == 's' || Serial.read() == 'S') 
  {
    measureTorque();  
  }

  // Если пользователь посылает 'h' по последовательному порту, показать инструкции
  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() 
{
   /*
      Чтобы проверить крутящий момент серводвигателя, Arduino переместит рычаг сервопривода так,
      чтобы он давил на тензодатчик. Полученная сила создаст показания тензодатчика.
      Arduino примет пять показаний, чтобы вычислить среднее значение силы.
      Поскольку расстояние между центром вращения сервопривода и тензодатчиком известно из
      конструкции каркаса, Arduino может рассчитать крутящий момент, создаваемый сервоприводом.
    */
    Serial.println("Individual Readings: ");
  
    float individualReadings[trialRuns];  // Этот массив будет хранить показания тензодатчика для пяти тестов
  
    for(int i = 0; i < 5; i++) 
    {
      testServo.write(180); // Отвести серводвигатель от тензодатчика
      delay(1000);          // Подождать перед движением серводвигателя
      loadCell.tare();      // Сбросить показания на ноль, чтобы компенсировать любую существующую нагрузку
      testServo.write(130); // Переместить серводвигатель к тензодатчику. Угол 130 градусов на самом деле
                            // находится внутри тензодатчика, поэтому сервопривод будет давить в 
                            // направлении этого положения, прикладывая силу к тензодатчику. 
      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("   ");
    }
  
    // Теперь, когда у нас есть 5 отдельных показаний, усредняем их, чтобы получить одно
    // среднее показание
    float readingsSum = 0;  // Создать переменную для хранения суммы всех показаний 
    // Пройтись по массиву и сложить все показания
    for(int y = 0; y < trialRuns; y++) 
    {
      readingsSum = readingsSum + individualReadings[y];  
    }
  
    // Разделить на количество показаний, чтобы получить среднее значение
    float averageReading = readingsSum / trialRuns; 

    Serial.println();
    Serial.println();
    Serial.println("Average Reading:");   // Напечатать среднее значение в последовательный порт
    Serial.println(averageReading);
  
    // Из среднего показания рассчитать крутящий момент, обеспечиваемый серводвигателем
    // с помощью формулы T = F * r , где T - крутящий момент, F - показание тензодатчика (сила),
    // r - радиус вращения (расстояние между серводвигателем и тензодатчиком).
    // Единицы измерения крутящего момента - кг*см
    float servoTorque = averageReading * armLength;   // Calculate the torque

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

    testServo.write(180); // После завершения проверки отвести серводвигатель от тензодатчика
}

Процедура тестирования, используемая Arduino, относительно проста.

Arduino загонит сервопривод в тензодатчик. Полученная сила на тензодатчике создаст показание, которое Arduino получит от HX711.

Arduino будет повторять измерения пять раз, получая пять отдельных показаний от тензодатчика. Эти пять отдельных показаний затем усредняются, чтобы получить значение силы, с которой сервопривод воздействует на тензодатчик.

Расстояние между центром вращения сервопривода и тензодатчиком рассчитывается исходя из конструкции каркаса. Arduino может рассчитать крутящий момент, создаваемый сервоприводом, по среднему показанию и расстоянию между тензодатчиком и сервоприводом.

Запуск теста

После всей работы по сборке инструмента тестирования и программированию Arduino, мы, наконец, можем измерить крутящий момент, создаваемый сервоприводами. Но сначала нам нужно установить тестируемый сервопривод в измерительный инструмент.

Чтобы установить сервопривод, просто вставьте его в корпус.

Сервопривод должен быть расположен так, чтобы вал двигателя находился ближе всего к тензодатчику.

Провода сервопривода выйдут через отверстие за тензодатчиком, откуда их можно подключить к Arduino.

Чтобы закрепить сервопривод на месте, используйте как минимум два винта M4 x 6 мм.

Рисунок 26 – Установка тестируемого сервопривода
Рисунок 26 – Установка тестируемого сервопривода

Данная система может работать полностью от USB порта вашего компьютера.

Если вы используете только питание USB, сервопривод будет работать от 5 В. Поскольку сервоприводы обычно работают от других напряжений, вы также можете использовать панель питания на макетной плате. Это позволит вам обеспечить сервопривод более высоким напряжением, чем 5 В от USB порта.

После включения системы откройте монитор последовательного порта. Вам будет предложено отправить через порт символ 's', когда вы будете готовы начать тест.

Рисунок 27 – Предложение начать тестирование
Рисунок 27 – Предложение начать тестирование

В этот момент Arduino должна начать отводить рычаг сервопривода от тензодатчика, и как только тестирование запустится, он вернется обратно.

Поскольку сервопривод пытается переместиться в положение внутри тензодатчика, он будет оказывать усилие на датчик.

Arduino будет измерять эту силу, преобразовывать ее в крутящий момент и отправлять результаты на монитор последовательного порта.

Рисунок 28 – Результаты измерений
Рисунок 28 – Результаты измерений

Ниже показано видео, демонстрирующее работу инструмента тестирования сервоприводов.

Теги

ArduinoArduino UnoMCUДатчикИзмерениеКрутящий моментМакетная платаМикроконтроллерСерводвигательСервоприводСилаТензодатчик

На сайте работает сервис комментирования DISQUS, который позволяет вам оставлять комментарии на множестве сайтов, имея лишь один аккаунт на Disqus.com.

В случае комментирования в качестве гостя (без регистрации на disqus.com) для публикации комментария требуется время на премодерацию.