1 заметка с тегом

H-bridge

Зоотроп (Zoetrope)

5 мая 2013, 9:34

В этом проекте мы будет делать «движущиеся картинки». Они будут двигаться вперед и назад с помощью Arduino, к которому мы подключим электромотор, H-bridge и ... неподвижные картинки.

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

Конструкция его довольно простая. Это цилиндр, в верхней части цилинда делаются небольшие прямоугольные отвестия-прорези. В нижней части цилиндра (там где прорезей нет) на внутренней его стороне закрепляется полоска с картинками, которые будут «двигаться». Надо смотреть на картинки через прорези. Когда цилиндр начинает вращаться картинки начинают «оживать». Выглядит вот так:

Раньше зоотропы приводились в движение руками или при помощи вращающего механизма. Мы будем вращать цилиндр с помощью моторчика. Чтобы сделать систему более продвинутой, мы добавим выключатель, для того, чтобы контролировать направление вращения, еще один, чтобы включать и выключать двигатель и потенциометр для управления скоростью вращения.

В нашем проекте «Вертушка с моторчиком» мотор вращался только в одном направлении. Если поменять полярность питания, подаваемого на двигатель, то он начнет вращаться в противоположную сторону. Не очень практично каждый раз, когда нам требутся поменять направление вращения двигателя, переключать проводки двигателя. Для автоматизации этой задачи придумали специальный компонент, который называется H-bridge. H-bridge — это интегральная микросхема, схема, которая содержит множество элементов, плотно «упакованных» в  в один комнонент. С помощью интегральных микросхем можно составлять достаточно сложные схемы, состоящие из легко заменяемых компонентов. Например, H-bridge, который мы будем использовать в этом проекте, содержит внутри несколько транзисторов. Чтобы собрать его, может понадобится еще одна макетная плата.
Для доступа к «внутренностям» интегральной схемы используются пины (выходы), расположенные по ее бокам. Разные компоненты имеют разное количество выходов, и не все из них используются в конкретной схеме. Для удобства выходы интегральных схем нумеруются, нумерация выводов ведется против часовой стрелки, начиная от первой ножки, находящейся под ключом, который может иметь вид засечки или углубления.

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

Выходы 1 и 9 предназначены для включения и выключения двигателей, если их подключить к  выходам Arduino с ШИМ, то можно управлять скоростью вращения двигателей. Выходы 2 и 7, и 10 и 15 управляют направлением вращения двигателей, первого и второго соответственно (парами). Если на выход 2 подать HIGH, а на выход 7 LOW, то мотор будет вращаться в одну сторону, наоборот — в другую сторону. Если на эти выходы подать одинаковый сигнал (LOW или HIGH) то мотор вращаться не будет. То же и для второго двигателя. К выходам 3 и 6 подключается один мотор (напряжением на этих выходах управляют 2-й и 7-й), к выходам 10 и 15 — второй мотор. Выход 8 соединяют с положительным полюсом источника питания двигателей. Выход 16 — с положительным полюсом источника питания микросхемы (5В). Выходы 4, 5, 12, 13 подключаются на «землю», они же используются для теплоотвода от схемы (в нашем случае нагрев был небольшой, так как подлючили только один двигатель и не надолго, а вообще греется она хорошо, может понадобиться радиатор).

Схема, которую мы будет собирать с использованием H-Bridge L293D:

В схеме присутствуют два выключателя. Один для включения и выключения моторчика (если мотор включен, то нажатием на кнопку он выключается, если выключен, то нажатием включается). Второй — для изменения направления вращения двигателя. Потенциометр используется для регулировки скорости двигателя.

Собираем схему

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

const int motorenablepin=9;//пин для пуска мотора
const int directionpin1=3;//первый пин для направления мотора
const int directionpin2=2;//второй пин для направления мотора
const int onoffswitchpin=5;//пин с кнопкой для пуска/останова мотора
const int directionswitchpin=4;//пин с кнопкой для смены направления мотора
const int potens=A0;//пин с потенциометром
int potensVal=0;//значение с потенциометра

//переменные для отражения текущего состояния мотора
int onoffswitchSt=0;//текущее состояние кнопки для пуска мотора
int directionswitchSt=0;//текущее состояние кнопки для смены направления мотора
int previosonoffswitchst=0;//предыдущее состояние кнопки запуска мотора (надо для определения смены состояния кнопки
int motorenabled=0;//запущен ли в текущий момент мотор
int motorSp=0;//скорость мотора
int motordirection=1;//направление мотора
int prevdirectionswitchpinst=0;//предыдущее состояние кнопки смены направления 
//мотора (надо для определения смены состояния кнопки

void setup(){
  pinMode (motorenablepin,OUTPUT);//инициализация пинов
  pinMode (directionpin1, OUTPUT);
  pinMode (directionpin2,OUTPUT);
  pinMode (onoffswitchpin,INPUT);
  pinMode (directionswitchpin,INPUT);
  digitalWrite(motorenablepin,LOW);//выключаем мотор на всякий случай
}
void loop (){

  onoffswitchSt=digitalRead(onoffswitchpin);//текущее состояние кнопки запуска мотора
  delay(1);
  directionswitchSt=digitalRead(directionswitchpin );//текущее состояние кнопки смены направления мотора
  potensVal= analogRead(potens);//считываем значение потенциометра
  motorSp=map(potensVal,0,1023,0,254);//преобразуем значение в скорость мотора

  if (onoffswitchSt != previosonoffswitchst){//если состояние кнопки поменялось
    if(onoffswitchSt==HIGH){//и она нажата
      motorenabled=!motorenabled;//меняем состояние мотора на противоположное
    }
    previosonoffswitchst=!previosonoffswitchst;//меняем предыдущее состояние кнопки на противоположное
  }
  if (directionswitchSt != prevdirectionswitchpinst){//аналогично для направления вращения
    if(directionswitchSt==HIGH){
      motordirection=!motordirection;
    }
    prevdirectionswitchpinst=!prevdirectionswitchpinst;
  }
  //в зависимости от значения переменной, определяющей состояние мотора запускаем 
  //мотор с нужной скоростью или останавливаем его
  if(motorenabled==1){
    analogWrite(motorenablepin,motorSp);
  }
  else{
    digitalWrite(motorenablepin,LOW);
  }
  //в зависимости от значения переменной, определяющей направление вращения мотора устанавливаем направление
  if(motordirection==1){
    digitalWrite(directionpin1,HIGH);
    digitalWrite(directionpin2,LOW);
  }
  else{
    digitalWrite(directionpin1, LOW);
    digitalWrite(directionpin2,HIGH);
  }
}

Когда собрана схема и написана программа, можно сделать тестовый пуск моторчика. И так, с помощью первой кнопки мы пускам/останавливаем мотор, потенциометром регулируем скорость вращения, второй кнопкой управляем направлением вращения. мотора.

Теперь осталось собрать непоследственно сам Зоотроп. Используем диск, который мы делали для предыдущего проекта. Приделаем к нему цилиндр с прорезями и картинки.

На этом видео можно попытаться увидеть как работает Зоотроп.