Захисний діод на схемі нам потрібен для того, щоб струмо зворотного напрямку, який почне створювати двигун, обертаючись по інерції, не вивів з ладу транзистор.
Не переплутайте полярність діода, інакше, відкривши транзистор, ви влаштуєте коротке замикання!
Причину відсутності підтягуючих / стягають резисторів в схемі ви зрозумієте, ознайомившись з програмою.
Ми підключили живлення схеми до виходу Vin плати мікроконтролера, тому що, на відміну виходу 5V, звідси можна отримати напругу, підключену до плати, без змін і без обмежень за величиною струму.
Програма управління швидкістю мотору
Коментарі до коду програми#define MOTOR_PIN 9
#define FIRST_BUTTON_PIN 5
#define BUTTON_COUNT 3
// імена можна давати не тільки числам, а й цілим виразами.
// Ми визначаємо з яким кроком (англ. Step) потрібно міняти
// швидкість (англ. Speed) мотора при натисканні черговий кнопки
#define SPEED_STEP (255 / (BUTTON_COUNT - 1))
void setup ( )
{
pinMode ( MOTOR_PIN, OUTPUT ) ;
// насправді, в кожному піне вже є підтягуючий
// резистор. Для його включення необхідно явно налаштувати пін
// як вхід з підтяжкою (англ. Input with pull up)
for ( int i = 0 ; i < BUTTON_COUNT ; ++ i )
pinMode ( i + FIRST_BUTTON_PIN, INPUT_PULLUP ) ;
}
void loop ( )
{
for ( int i = 0 ; i < BUTTON_COUNT ; ++ i ) {
// якщо кнопка відпущена, нам вона не цікава. Пропускаємо
// решту циклу for, продовжуючи (англ. Continue)
// його далі, для наступного значення i
if ( digitalRead ( i + FIRST_BUTTON_PIN ) )
continue ;
// кнопка натиснута - виставляємо відповідну їй швидкість
// мотора. Нульова кнопка зупинить обертання, перша
// змусить крутитися в півсили, друга - на повну
int speed = i * SPEED_STEP ;
// подача ШІМ-сигналу на мотор змусить його крутитися з
// зазначеною швидкістю: 0 - стоп машина, 127 - півсили,
// 255 - повний вперед!
analogWrite ( MOTOR_PIN, speed ) ;
}
}
Ми використовували новий режим роботи портів: INPUT_PULLUP. На цифрових портах Arduino є вбудовані підтягують резистори, які можна включити зазначеним чином одночасно з налаштуванням порту на вхід. Саме тому ми не використали резистори при складанні схеми.
На кожній ітерації циклу ми задаємо мотору швидкість обертання, пропорційну поточному значенню лічильника. Але виконання інструкцій не дійде до призначення нової швидкості, якщо при перевірці натискання кнопки вона виявиться відпущеної. Інструкція continue, яка виконається в цьому випадку, скасує продовження даної ітерації циклу і виконання програми продовжиться з наступною. А мотор буде крутитися зі швидкістю, заданою при останньому натисканні на якусь із кнопок.