10 марта 2013-го
Использование сервопривода.
Сервопривод — это такие типы двигателей, которые не крутятся все время по кругу, а поворачиваются на определённый угол и останавливаются до тех пор, пока им не поступит другая команда повернуться. Сервопривод обычно поворачиваются только на 180 градусов (половина круга). Если присоединить к такому мотору вырезанную из картона шкалу, можно использовать его в качестве указателя чего-нибудь, например, настроения.
Аналогично тому, как мы использовали ШИМ для управления светодиодами в опыте с «лампой-хамелеоном», сервопривод ожидает поступления определенного количества импульсов, чтобы понять, на какой угол ему надо повернуться. С аналогового выхода Arduino импульсы всегда поступают через один и тот же временной интервал, но продолжительность их меняется от 1000 до 2000 микросекунд. Программу, которая генерирует такие импульсы написать не очень сложно самим, но среда разработки Arduino уже включает в себя специальную библиотеку для управления моторами. Поскольку сообщество разработчиков для Arduino достаточно велико, существует великое множество дополнительных программ и библиотек для разных сенсоров, актуаторов и прочих устройств, которые могут взаимодействовать с Arduino. И мы этим тоже будем пользоваться.
Схема, которую мы будем собирать выглядит так:
Один контакт потенциометр подсоединяем на плюс, второй — на минус, подвижный контакт — к аналоговому входу Arduino. При вращении ручки потенциометр, напряжение между подвижным контактом (входом Arduino) и минусом будет изменяться, это изменение мы будем «читать» и управлять вращением сервопривод.
Сервопривод тоже имеет три контакта: два — питание (плюс и минус), третий для управления, его подсоединяем с выходу Arduino.
Когда сервопривод начинает движение, ток, проходящий через него, значительно больше, чем во время самого движения, из-за этого происходить сильное падение напряжения во всей схеме. Если подключить два конденсатора параллельно сервопривод и потенциометр, можно это сгладить. Такие конденсаторы называют «развязывающие» или разделяющие, так как они отделяют изменения, произведенные какими-либо компонентами, от остальной схемы.
Итак, макет готов:
Теперь пишем программу:
#include<Servo.h> //используем библиотеку для управления сервоприводом Servo motor; //наш мотор int potens=A0; //пин потенциометра int motorpin=9; //пин мотора int potensVal=0; //значение потенциометра int angle; //угол поворота сервопривода void setup(){ motor.attach(motorpin); //подключаем мотор Serial.begin(9600); } void loop(){ potensVal=analogRead(potens);//читаем положение потенциометра Serial.print(«potensVal: „); Serial.print(potensVal); angle=map(potensVal,0,1023,0,179);//преобразуем в градусы Serial.print(“, angle: „); Serial.println(angle); motor.write(angle);//поворачиваем мотор delay(15); }
Небольшой комментарий по преобразованию значения, считанного с потенциометр, в градусы. С аналогового входа Arduino можно считать значение от 0 до 1023, в зависимости от напряжения на нем. В случае с потенциометром мы задействует все эти значения. На аналоговый выход Arduino мы может подать значение от 0 до 254, а в случае с сервоприводом, в команду движения мы вообще можем передавать значения только до 179. То есть нам надо пропорционально преобразовать значения из интервала [0;1023] в интервал [0;179]. У Arduino для этого есть специальная функция map(), в качестве первого параметра мы передаем значение, которое надо преобразовать, в качестве второго и третьего — границы первого интервала, четвертое и пятое — границы второго интервала. В результате функция возвращает преобразованное значение, которое уже можно использовать. После команды поворота добавлена небольшая пауза, чтобы сервопривод успел повернуться. Фу… вроде все.
На консоль мы выводим значение, прочитанное с потециометра и уже преобразованное значение (угол поворота сервопривод).
Теперь мы решили вместо потенциометр поставить в схему термосенсор, и поворачивать сервопривод в зависимости от внешней температуры. Немного изменили программу:
void loop(){ tempVal=analogRead(tempPin); float v=(tempVal/1024.0)*5.0; float t=(v-0.5)*100; Serial.print(» temperature: «); Serial.print(t); angle=map( t, 15, 35,0,179); Serial.print(«, angle: „); Serial.println(angle); motor.write(angle); delay(1000); }
Преобразовываем значение, считанное с термосенсор, в градусы, как мы это уже делали. В функции map() мы указали интервал от 15 до 35, потому что именно в этих пределах будет меняться температура в нашем опыте, и сервопривод будет поворачиваться на все 180 градусов при изменении температуры.
angle