Сегодня мы поговорим о транзисторах и подключении нагрузки к Arduino. Сама Ардуино не может выдать напряжение выше 5 вольт и ток больше 40 мА с одного пина. Этого достаточно для датчиков, светодиодов, но если мы хотим подключить устройства более требовательные по току, нам придется использовать транзисторы или реле. В этом уроке мы подключим девяти вольтовый моторчик и сервопривод к ардуино с помощью транзисторов.
В этом уроке используется:
Arduino Uno: | Купить |
Инфракрасный дальномер: | Купить |
Высокоточный лазерный дальномер с I2C: | Купить |
Набор резисторов из 100 штук на все случаи: | Купить |
Небольшой моторчик: | Купить |
Слабенький сервопривод: | Купить |
Мощный сервопривод: | Купить |
Мосфет транзистор для управления переменным током высокого напряжения: | Купить |
Набор npn транзисторов из 100 штук: | Купить |
Подключение мотора к Arduino
Как уже было сказано выше, ардуино не может обеспечить мотор необходимым током и напряжением. В таких случаях используются транзисторы.
Транзистор это радиоэлектронный компонент из полупроводникового материала способный от небольшого входного сигнала управлять значительным током в выходной цепи, что позволяет его использовать для усиления, генерирования, коммутации и преобразования электрических сигналов. Обычно у транзисторов 3 вывода: база, эмиттер и коллектор. Алгоритм действия можно сформулировать так: пропустить ток от коллектора к эмиттеру в зависимости от сигнала на базе. Транзисторы бывают разных типов и номиналов. Об этом можно подробнее почитать на википедии.
Будьте внимательны при выборе транзисторов для своих проектов. Некоторые рассчитаны на пропуск большого напряжения, или большого тока. Так же многие транзисторы не откроются от 5 вольт на базе. Всегда проверяйте характеристики транзисторов перед покупкой в datasheet. Так же обратите внимание, что для управления переменным током используются мосфет транзисторы.
Теперь давайте подключим мотор к ардуино по следующей схеме:
Как всегда ничего сложного. Главное не перепутать выводы транзистора. Обратите внимание на резистор через который ардуино подключена к базе. Это резистор на 1 кОм и нужен он для того что бы обезопасить нашу ардуинку. В видео к схеме добавлены диод и конденсатор, но они не обязательны. Так же можно добавить резистор на 10 — 100 кОм между эмиттером и коллектором для стабильности работы нашей схемы. Так же не забудьте, что земля на всех уровнях напряжения должна быть объединена. И взглянем на наш код:
// Обозначаем пин к которому у нас подключена база транзистора
int motorPin = 9;
void setup () {
// Устанавливаем пин в качестве выхода
pinMode (motorPin, OUTPUT);
}
void loop () {
// Перебор значений от 0 до 255 в цикле
for (int i = 0; i <= 255; ++i) {
analogWrite(motorPin, i);
// небольшая задержка что бы все происходило не слишком быстро
delay(10);
}
delay(500);
for (int i = 0; i >= 0; i--) {
analogWrite(motorPin, i);
delay(10);
}
delay(500);
}
Как видите скетч очень прост. По комментариям в коде вы легко разберетесь, что к чему. Единственная конструкция, которую мы еще не использовали это цикл for.
Подключение сервопривода практически ни чем не отличается от подключения моторчика. Отличие в том что у сервы 3 вывода. Плюс, минус и логический. В видео подробно об этом рассказано.
Добавим в нашу схему инфракрасный дальномер. Просто потому, что мы можем 🙂 Будем задавать положение сервопривода в зависимости от показаний дальномера. Мы уже подключали дальномер, поэтому схему рисовать не буду.
Подключаем его к пину А0. Новый скетч стал еще проще:
// Подключаем библиотеку для управления сервоприводом
#include <Servo.h>
Servo jeremysServo;
// Пин сервопривода
int servoPin = 9;
// Аналоговый пин инфракрасного дальномера
int distPin = 0;
void setup () {
// передаем пин, подключенный к логическому выводу сервопривода
jeremysServo.attach(servoPin);
}
void loop () {
// Считываем показания инфракрасного дальномера
int dist = analogRead(distPin);
// Преобразуем значение в пригодное для ШИМ
int pos = map(dist, 0, 1023, 0, 180);
// Двигаем сервопривод
jeremysServo.write(pos);
}