Рубрики
Схемы на Arduino

Управление сервомотором с помощью датчика силы и Arduino

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

Общие принципы работы устройства

Сервомотор состоит из двигателя постоянного тока, коробки передач и системой управления положением оси двигателя. Управление углом поворота оси сервомотора будет осуществляться с помощью сигнала ШИМ (широтно-импульсной модуляции), подаваемого на контакт SIGNAL сервомотора.

Частота управляющего ШИМ сигнала может отличаться в зависимости от типа сервомотора. Угол поворота оси сервомотора будет определяться коэффициентом заполнения ШИМ.

Как показано на рисунке ниже, чтобы повернуть ось сервомотора на 9 часов, коэффициент заполнения ШИМ должен быть 1/18, то есть 1 миллисекунду сигнал включен, а 17 миллисекунд сигнал выключен.

Чтобы повернуть ось сервомотора на 12 часов, сигнал должен быть включен 1.5 мс и выключен 16.5 мс в течение интервала 18 мс. Этот коэффициент заполнения ШИМ декодируется системой управления сервомотора и она поворачивает его ось на необходимый угол. ШИМ сигнал в нашей схеме будет формироваться с помощью платы Arduino Uno. То есть изменяя коэффициент заполнения ШИМ мы будем управлять углом поворота оси сервомотора.

В качестве датчика силы (усилия) будем использовать датчик FSR400 – один из самых дешевых датчиков подобного типа. Принцип работы этого датчика состоит в том, что при нажатии на него его сопротивление уменьшается. Это уменьшение сопротивление мы через делитель напряжения будем преобразовывать в изменение напряжения, которое будем подавать на один из каналов АЦП платы Arduino Uno. Более подробно о принципах работы с данным датчиком можно прочитать в уже упомянутой статье про подключение датчика усилия к Arduino Uno.

Необходимые компоненты

  1. Плата Arduino Uno (купить на AliExpress).
  2. Датчик силы FSR400 (купить на AliExpress).
  3. Сервомотор SG 90 (купить на AliExpress).
  4. Конденсатор 1000 мкФ (купить на AliExpress).
  5. Конденсатор 100 нФ (3 шт.) (купить на AliExpress).
  6. Резистор 100 кОм (купить на AliExpress).
  7. Резистор 220 Ом (купить на AliExpress).
  8. Источник питания с напряжением 5 В.

Работа схемы

Схема устройства представлена на следующем рисунке.

Напряжение с выхода делителя напряжения будет подвержено действию шумов – для минимизации этого эффекта параллельно резисторам делителя напряжения (роль одного из которых выполняет датчик силы) включены конденсаторы.

Принцип работы схемы заключается в том, что мы напряжение с выхода делителя напряжения будем подавать на вход канала АЦП платы Arduino Uno. После АЦП получившееся цифровое значение, которое фактически представляет собой относительный вес, приложенный к датчику силы, мы преобразуем в ШИМ сигнал, который подаем на сервомотор для поворота его оси.

То есть при приложении веса (давления) к датчику силы мы получаем цифровое значение на выходе АЦП, которое преобразуется затем в коэффициент заполнения (отношение длительности импульса к периоду повторения) ШИМ.

В соответствии с приведенным в начале статьи рисунком если коэффициент заполнения будет маленький, то ось сервомотора будет поворачиваться влево, а если большой – то вправо. Таким образом, в нашей конструкции позиция оси сервомотора будет управляться весом (силой), приложенным к датчику силы.

Исходный код программы

Плата Arduino имеет шесть каналов АЦП. Мы можем использовать любой из них. Разрешение АЦП Arduino составляет 10 бит – то есть мы сможем работать с диапазоном целых чисел (0-(2^10) 1023)). Это означает что данный АЦП преобразует входное напряжение от 0 до 5 Вольт в целое число от 0 до 1023. То есть имеем точность АЦП 5/1024= 4.9 мВ. То есть один шаг приращения целого числа на выходе АЦП равен изменению в 4.9 мВ на его входе.

В нашей схеме для АЦП мы будем использовать канал A0. Для осуществления функций АЦП мы должны в программе сделать следующие вещи:

1. analogRead(pin);
2. analogReference();
3. analogReadResolution(bits);

Все каналы АЦП платы Arduino Uno имеют опорное напряжение 5В – то есть это максимальное значение входного напряжения, которое способны обрабатывать данные каналы. Поскольку, к примеру, некоторые датчики обеспечивают на своем выходе диапазон напряжений 0-2.5В, то использование опорного напряжения 5В в данном случае приведет к уменьшению точности измерений. Поэтому в подобных случаях для изменения опорного напряжения целесообразно использовать функцию “analogReference();”. Мы в рассматриваемом случае оставим значение опорного напряжения без изменений.

По умолчанию разрешающая способность каналов АЦП платы Arduino Uno составляет 10 бит. Однако в некоторых случаях (например, для увеличения скорости преобразования) можно уменьшить эту разрешающую способность с помощью команды “analogReadResolution(bits);”. Мы в нашем примере не будем изменять разрешающую способность каналов АЦП.

Если все необходимые настройки канала АЦП сделаны (или оставлены по умолчанию), то для чтения значения с выхода АЦП можно воспользоваться функцией “analogRead(pin);”, где pin обозначает контакт платы Arduino, который мы будем использовать для аналого-цифрового преобразования, в нашем случае это будет контакт “A0”. Для того чтобы сразу сохранить значение с выхода АЦП в переменной целого типа можно использовать команду вида ”int SENSORVALUE = analogRead(A0);”, в результате этой команды значение с выхода АЦП будет сохранено в переменной “SENSORVALUE”.

Контакты платы Arduino Uno, на которых возможно формирование ШИМ сигнала, обозначены символом “~”. Всего таких каналов на плате Arduino Uno шесть. Мы в рассматриваемом примере для формирования ШИМ сигнала будем использовать контакт PIN3.

Как использовать ШИМ сигнал в Arduino? Это можно сделать, к примеру, с помощью функции analogWrite(3,VALUE) – эта функция на 3-м контакте сформирует ШИМ сигнала со значением (коэффициентом заполнения), определяемым параметром VALUE. Параметр VALUE может изменяться в диапазоне от 0 до 255. 0 соответствует самому низшему значению, а 255 – самому высшему. При VALUE=255 в результате приведенной команды мы получим 5В на контакте PIN3. Если VALUE=125, то на PIN3 мы получим среднее значение напряжения равное 2,5 В.

В специальных функциях Arduino имеется функция, который позволяет управлять позицией оси сервомотора путем указания значения градусов. То есть мы можем просто указать в программе для Arduino значение 30 градусов, а функции управления сервомотором сами пересчитают это значение в нужное значение коэффициента заполнения ШИМ.

У нас ось сервомотора sg90 может поворачиваться на угол 0-180 градусов, а на выходе АЦП значение может изменяться в диапазоне 0-1023. То есть значение на выходе АЦП примерно в 6 раз превышает значение угла поворота оси сервомотора. То есть если мы просто разделим значение с выхода АЦП на 6, мы получим примерно угол поворота оси сервомотора. То есть мы имеем ШИМ сигнал, коэффициент заполнения которого изменяется линейно в зависимости от приложенного усилия (веса) к датчику силы.

#include <Servo.h> // подключаем библиотеку для работы с сервомотором
Servo servo; // присваиваем имя нашему сервомотору
int sensorvalue =0;
void setup()
{
pinMode(A0,INPUT); // канал АЦП, на который подается сигнал от датчика силы
pinMode(3,OUTPUT); // выход ШИМ сигнала, который подается на сервомотор
servo.attach(3); // сообщаем контакт, к которому подключен сервомотор (он должен иметь функцию ШИМ)
}

void loop()
{
sensorvalue = analogRead(A0); // считываем значение с выхода датчика силы и преобразуем его в цифровое значение
servo.write(sensorvalue/6); // поворачиваем ось сервомотора на угол, зависящий от значения на выходе АЦП
}

Видео, демонстрирующее работу схемы

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *