Зачем в схеме использован диод?
Защитный диод нам нужен для того, чтобы ток обратного направления, который начнет создавать двигатель, вращаясь по инерции, не вывел из строя транзистор.
Почему мы использовали полевой MOSFET-транзистор, а не биполярный?
Потому что биполярный и полевой транзисторы абсолютно разные по принципу действия. Выходной сигнал биполярного транзистора управляется током, а нам нужно управление напряжением.
Почему мы не использовали резистор между портом Arduino и затвором транзистора?
В каждом пине уже есть подтягивающий резистор.
Как работает инструкция continue, использованная в цикле for?
Инструкция continue, которая выполнится в этом случае, отменит продолжение данной итерации цикла и выполнение программы продолжится со следующей.
Задания для самостоятельного решения
Внесите единственное изменение в программу, после которого максимальной скоростью вращения мотора составит половину от возможной.
#define MOTOR_PIN 9
#define FIRST_BUTTON_PIN 5
#define BUTTON_COUNT 3
#define SPEED_STEP (128 / (BUTTON_COUNT - 1))
void setup()
{
pinMode(13, OUTPUT);
pinMode(MOTOR_PIN, OUTPUT);
for (int i = 0; i < BUTTON_COUNT; ++i)
pinMode(i + FIRST_BUTTON_PIN, INPUT_PULLUP);
}
void loop()
{
digitalWrite(13, HIGH);
for (int i = 0; i < BUTTON_COUNT; ++i) {
if (digitalRead(i + FIRST_BUTTON_PIN))
continue;
int speed = i * SPEED_STEP;
analogWrite(MOTOR_PIN, speed);
}
}
Перепишите программу без использования инструкции continue.
#define MOTOR_PIN 9
#define FIRST_BUTTON_PIN 5
#define BUTTON_COUNT 3
#define SPEED_STEP (255 / (BUTTON_COUNT - 1))
void setup()
{
pinMode(13, OUTPUT);
pinMode(MOTOR_PIN, OUTPUT);
for (int i = 0; i < BUTTON_COUNT; ++i)
pinMode(i + FIRST_BUTTON_PIN, INPUT_PULLUP);
}
void loop()
{
digitalWrite(13, HIGH);
for (int i = 0; i < BUTTON_COUNT; ++i) {
if (!digitalRead(i + FIRST_BUTTON_PIN))
{
int speed = i * SPEED_STEP;
analogWrite(MOTOR_PIN, speed);
}
}
}
Добавьте в схему еще одну кнопку, чтобы у миксера стало три режима. Понадобилось ли изменять что-либо в программе?
#define MOTOR_PIN 9
#define FIRST_BUTTON_PIN 4
#define BUTTON_COUNT 4
#define SPEED_STEP (255 / (BUTTON_COUNT - 1))
void setup()
{
pinMode(13, OUTPUT);
pinMode(MOTOR_PIN, OUTPUT);
for (int i = 0; i < BUTTON_COUNT; ++i)
pinMode(i + FIRST_BUTTON_PIN, INPUT_PULLUP);
}
void loop()
{
digitalWrite(13, HIGH);
for (int i = 0; i < BUTTON_COUNT; ++i) {
if (digitalRead(i + FIRST_BUTTON_PIN))
continue;
int speed = i * SPEED_STEP;
analogWrite(MOTOR_PIN, speed);
}
}
Эксперимент 10. Кнопочный переключатель
В этом эксперименте мы делаем из тактовой кнопки триггер, борясь с «дребезгом».
Схема
Код
#define BUTTON_PIN 3
#define LED_PIN 13
boolean buttonWasUp = true;
boolean ledEnabled = false;
void setup()
{
pinMode(LED_PIN, OUTPUT);
pinMode(BUTTON_PIN, INPUT_PULLUP);
}
void loop()
{
boolean buttonIsUp = digitalRead(BUTTON_PIN);
if (buttonWasUp && !buttonIsUp) {
delay(10);
buttonIsUp = digitalRead(BUTTON_PIN);
if (!buttonIsUp)
{
ledEnabled = !ledEnabled;
digitalWrite(LED_PIN, ledEnabled);
}
}
buttonWasUp = buttonIsUp;
}
Вопросы для проверки себя
1.В каком случае оператор && возвращает значение «истина»?
Логический оператор && («и») возвращает значение «истина» только в случае истинности обоих его операндов.
Что такое «дребезг»?
Это многократные неконтролируемые замыкания и размыкания контактов за счет упругости материалов и деталей контактной системы — некоторое время контакты «подпрыгивают» при соударениях, размыкая и замыкая электрическую цепь.