Урок 9. Миксер


В этом эксперименте мы создаем модель миксера с двумя скоростями работы.

Список деталей для эксперимента

Для дополнительного задания

  • еще 1 кнопка
  • еще 2 провода

Принципиальная схема

Урок 8. Миксер. Принципиальная схема

Схема на макетке

Урок 8. Миксер. Схема на макетке

Обратите внимание

  •     Защитный диод нам нужен для того, чтобы ток обратного направления, который начнет создавать двигатель, вращаясь по инерции, не вывел из строя транзистор.
  •     Не перепутайте полярность диода, иначе, открыв транзистор, вы устроите короткое замыкание!
  •     Причину отсутствия подтягивающих/стягивающих резисторов в схеме вы поймете, ознакомившись с программой.
  •     Мы подключили питание схемы к выходу Vin платы микроконтроллера, потому что, в отличие выхода 5V, отсюда можно получить напряжение, подключенное к плате, без изменений и без ограничений по величине тока.

Скетч

  1.     #define MOTOR_PIN        9
  2.     #define FIRST_BUTTON_PIN 5
  3.     #define BUTTON_COUNT     3
  4.     // имена можно давать не только числам, но и целым выражениям.
  5.     // Мы определяем с каким шагом (англ. step) нужно менять
  6.     // скорость (англ. speed) мотора при нажатии очередной кнопки
  7.     #define SPEED_STEP  (255 / (BUTTON_COUNT - 1))
  8.  
  9.     void setup()
  10.     {
  11.       pinMode(MOTOR_PIN, OUTPUT);
  12.       // на самом деле, в каждом пине уже есть подтягивающий
  13.       // резистор. Для его включения необходимо явно настроить пин
  14.       // как вход с подтяжкой (англ. input with pull up)
  15.       for (int i = 0; i < BUTTON_COUNT; ++i)
  16.         pinMode(i + FIRST_BUTTON_PIN, INPUT_PULLUP);
  17.     }
  18.  
  19.     void loop()
  20.     {
  21.       for (int i = 0; i < BUTTON_COUNT; ++i) {
  22.         // если кнопка отпущена, нам она не интересна. Пропускаем
  23.         // оставшуюся часть цикла for, продолжая (англ. continue)
  24.         // его дальше, для следующего значения i
  25.         if (digitalRead(i + FIRST_BUTTON_PIN))
  26.           continue;
  27.  
  28.         // кнопка нажата — выставляем соответствующую ей скорость
  29.         // мотора. Нулевая кнопка остановит вращение, первая
  30.         // заставит крутиться в полсилы, вторая — на полную
  31.         int speed = i * SPEED_STEP;
  32.  
  33.         // подача ШИМ-сигнала на мотор заставит его крутиться с
  34.         // указанной скоростью: 0 — стоп машина, 127 — полсилы,
  35.         // 255 — полный вперёд!
  36.         analogWrite(MOTOR_PIN, speed);
  37.       }
  38.     }

Пояснения к коду

  • Мы использовали новый режим работы портов: INPUT_PULLUP. На цифровых портах Arduino есть встроенные подтягивающие резисторы, которые можно включить указанным образом одновременно с настройкой порта на вход. Именно поэтому мы не использовали резисторы при сборке схемы.
  • На каждой итерации цикла мы задаем мотору скорость вращения, пропорциональную текущему значению счетчика. Но выполнение инструкций не дойдет до назначения новой скорости, если при проверке нажатия кнопки она окажется отпущенной. Инструкция continue, которая выполнится в этом случае, отменит продолжение данной итерации цикла и выполнение программы продолжится со следующей. А мотор будет крутиться со скоростью, заданной при последнем нажатии на какую-то из кнопок.

Вопросы для проверки себя

  •     Зачем в схеме использован диод?
  •     Почему мы использовали полевой MOSFET-транзистор, а не биполярный?
  •     Почему мы не использовали резистор между портом Arduino и затвором транзистора?
  •     Как работает инструкция continue, использованная в цикле for?

Задания для самостоятельного решения

  •     Внесите единственное изменение в программу, после которого максимальной скоростью вращения мотора составит половину от возможной.
  •     Перепишите программу без использования инструкции continue.
  •     Добавьте в схему еще одну кнопку, чтобы у миксера стало три режима. Понадобилось ли изменять что-либо в программе?
Источник: 

wiki.amperka.ru