10 марта 2013-го

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31

Использование сервопривода.

10 марта 2013, 14:24

Сервопривод  — это такие типы двигателей, которые не крутятся все время по кругу, а поворачиваются на определённый угол и останавливаются до тех пор, пока им не поступит другая команда повернуться. Сервопривод обычно поворачиваются только на 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

6 марта 2013   · · ·
Ctrl
· · ·   18 марта 2013