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

Подключение датчика силы (усилия) к Arduino

В этом проекте мы рассмотрим «фановую» схему подключения датчика силы (Force sensor) к плате Arduino Uno. Устройство будет генерировать звук в зависимости от степени приложения усилия к датчику. Для реализации этой функции мы задействуем 8-битный АЦП (аналогово-цифровой преобразователь), присутствующий в Arduino.

Датчик силы или чувствительный к усилию резистор

Датчик силы представляет собой преобразователь (датчик), который изменяет свое сопротивление под действием приложенного к его поверхности давления. Датчики силы (усилия) выпускаются различных форм и размеров. Мы будем использовать одну из самых дешевых версий поскольку в нашем проекте нам не нужна особая точность. Для нашего проекта мы выбрали датчик FSR400 – один из самых дешевых датчиков подобного типа, присутствующих на рынке. Его внешний вид показан на рисунке ниже. Подобные датчики еще называют чувствительными к усилию резисторами. Величина сопротивления этих резисторов (датчиков) обратно пропорциональна силе, приложенной к его поверхности. То есть чем больше давление на датчик (приложенная сила), тем меньше его сопротивление. Когда к датчику не приложено никакого усилия, его сопротивление составляет весьма значительную величину.

Необходимо отметить, что усилие в датчике FSR 400 необходимо прикладывать к лабиринту, нарисованного в его «глазе», как показано на рисунке, иначе вы можете необратимо повредить этот датчик.

Также данный датчик имеет ограничение на величину приложенного усилия в 10 Ньютон – это эквивалентно 1 кг приложенного веса. Если приложенный вес более 1 кг, то это может вызвать некоторые отклонения в работе датчика. Если вес более 3 кг, то это может необратимо повредить датчик.

На приведенном ниже рисунке показан график изменения сопротивления датчика FSR 400 в зависимости от приложенного к нему усилия (веса).

Как показано на рисунке сопротивление между двумя контактами датчика уменьшается с увеличением приложенного веса, то есть его проводимость при этом увеличивается. Сопротивление проводника (чистого) рассчитывается по следующей формуле:

где p – удельное сопротивление проводника
l – длина проводника
A – площадь проводника.

Теперь предположим что у нас есть проводник с сопротивлением “R”. Если к верхней части проводника при этом некоторое давление (усилие), площадь проводника уменьшается, а длина проводника увеличивается в результате этого давления. То есть по приведенной формуле сопротивление проводника при этом увеличится. Другими словами, сопротивление проводника прямо пропорционально его длине и обратно пропорционально его площади (то есть площади его поперечного сечения).

То есть под воздействием приложенной силы сопротивление проводника увеличивается. Но эти изменения сопротивления очень малы по сравнению с общим сопротивлением проводника. Для получения желаемого эффекта вместе соединяют большое число проводников – см. на рисунке внешний вид датчика FSR 400. На нем можно увидеть много линий внутри датчика. Каждая из этих линий представляет собой проводник. Чувствительность датчика заключается в числе проводников, присутствующих в нем.

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

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

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

Как проверить датчик силы

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

Применения датчика силы

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

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

Плата Arduino Uno
Источник питания с напряжением 5 В
Конденсатор 1000 мкФ
Конденсатор 100 нФ (3 шт.)
Резистор 100 кОм
Резистор 220 Ом
Буззер (звонок)
Датчик силы FSR400

Работа схемы

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

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

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

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

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

Прежде чем приступить к написанию программы для нашего устройства, вспомним немного основы работы с АЦП в 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 В.

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

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

Далее представлен полный текст программы.

int sensorvalue =0; // переменная типа Interger для хранения результата с выхода АЦП
void setup()
{
pinMode(A0,INPUT); // контакт A0 конфигурируем на ввод данных (вход АЦП)
pinMode(3,OUTPUT); // контакт 3 конфигурируем на вывод данных – на нем будет формироваться ШИМ сигнал
}
void loop()
{
sensorvalue = analogRead(A0); // считываем значение с выхода АЦП и сохраняем его в переменной целого типа
analogWrite(3,sensorvalue/4); // формируем на контакте 3 ШИМ сигнал с нужным нам коэффициентом заполнения
}

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

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

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