В этом проекте мы рассмотрим схему с сервомотором, датчиком силы и платой Arduino Uno. В рассматриваемом устройстве угол поворота оси сервомотора будет зависеть от усилия (веса), приложенного к датчику силы. Для лучшего понимания материала этой статьи целесообразно изучить следующие материалы на нашем сайте:
Общие принципы работы устройства
Сервомотор состоит из двигателя постоянного тока, коробки передач и системой управления положением оси двигателя. Управление углом поворота оси сервомотора будет осуществляться с помощью сигнала ШИМ (широтно-импульсной модуляции), подаваемого на контакт SIGNAL сервомотора.
Частота управляющего ШИМ сигнала может отличаться в зависимости от типа сервомотора. Угол поворота оси сервомотора будет определяться коэффициентом заполнения ШИМ.
Как показано на рисунке ниже, чтобы повернуть ось сервомотора на 9 часов, коэффициент заполнения ШИМ должен быть 1/18, то есть 1 миллисекунду сигнал включен, а 17 миллисекунд сигнал выключен.
Чтобы повернуть ось сервомотора на 12 часов, сигнал должен быть включен 1.5 мс и выключен 16.5 мс в течение интервала 18 мс. Этот коэффициент заполнения ШИМ декодируется системой управления сервомотора и она поворачивает его ось на необходимый угол. ШИМ сигнал в нашей схеме будет формироваться с помощью платы Arduino Uno. То есть изменяя коэффициент заполнения ШИМ мы будем управлять углом поворота оси сервомотора.
В качестве датчика силы (усилия) будем использовать датчик FSR400 – один из самых дешевых датчиков подобного типа. Принцип работы этого датчика состоит в том, что при нажатии на него его сопротивление уменьшается. Это уменьшение сопротивление мы через делитель напряжения будем преобразовывать в изменение напряжения, которое будем подавать на один из каналов АЦП платы Arduino Uno. Более подробно о принципах работы с данным датчиком можно прочитать в уже упомянутой статье про подключение датчика усилия к Arduino Uno.
Необходимые компоненты
- Плата Arduino Uno (купить на AliExpress).
- Датчик силы FSR400 (купить на AliExpress).
- Сервомотор SG 90 (купить на AliExpress).
- Конденсатор 1000 мкФ (купить на AliExpress).
- Конденсатор 100 нФ (3 шт.) (купить на AliExpress).
- Резистор 100 кОм (купить на AliExpress).
- Резистор 220 Ом (купить на AliExpress).
- Источник питания с напряжением 5 В.
Реклама: ООО «АЛИБАБА.КОМ (РУ)» ИНН: 7703380158
Работа схемы
Схема устройства представлена на следующем рисунке.
Принцип работы схемы заключается в том, что мы напряжение с выхода делителя напряжения будем подавать на вход канала АЦП платы 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); // поворачиваем ось сервомотора на угол, зависящий от значения на выходе АЦП
}