Arduino: Коммутация высокого напряжения с помощью транзистора
Зачем нужны транзисторы
Arduino работает при напряжении 5В или 3.3В с ограниченной токовой нагрузкой. Для управления устройствами с более высоким напряжением и током необходимы промежуточные коммутационные компоненты. Варианты включают: реле, твердотельные реле, транзисторы, полевые транзисторы (MOSFET), транзисторы Дарлингтона, тиристоры (SCR), IGBT, диаки и триаки.
Основы транзисторов
Биполярные транзисторы (BJT)
Биполярные транзисторы (BJT) имеют три вывода:
База (управляющий сигнал)
Коллектор (подключение нагрузки)
Эмиттер (подключение к земле для NPN в нижней коммутации)
Существуют два основных типа: NPN (лучше для нижней коммутации) и PNP (лучше для верхней коммутации).
Области работы транзистора
Транзисторы работают в четырёх состояниях:
Отсечка (Cutoff): Нет тока базы; транзистор выключен
Активная/Линейная область (Active/Linear): Ток базы увеличивается, позволяя пропорциональный ток коллектора
Насыщение (Saturation): Максимальный ток коллектора; транзистор полностью включён
Пробой (Breakdown): Чрезмерное напряжение приводит к отказу
Для коммутационных приложений используются только области отсечки и насыщения.
Практический пример: 12В соленоидный клапан
Характеристики:
Напряжение: 12В
Мощность: 4.6 Вт
Требуемый ток: 4.6 Вт / 12В = 0.385А (385 мА)
Выбор транзистора 2N2222A
Сравнение характеристик:
Параметр |
2N2222 |
2N2222A |
PN2222 |
PN2222A |
|---|---|---|---|---|
Макс. напряжение коллектор-эмиттер |
30В |
40В |
30В |
40В |
Макс. ток коллектора |
800 мА |
600 мА |
600 мА |
1000 мА |
Макс. коэффициент усиления (hFe) |
300 |
300 |
300 |
300 |
2N2222A выдерживает 40В и 600 мА, что подходит для данного применения с запасом.
Коэффициент усиления по току (hFe)
Коэффициент усиления представляет усиление: ток коллектора = ток базы x усиление.
Из даташита 2N2222A при 10В и 25°C:
При 385 мА: усиление примерно 180 (граница активной области и насыщения)
При 500 мА: усиление примерно 40 (минимум, глубоко в насыщении)
Три варианта усиления:
180: Граница между областями (не идеально)
100: Стандартное эмпирическое правило (безопасно)
40: Глубоко в насыщении (очень безопасно, но менее эффективно)
Расчёт базового резистора
Используя закон Ома: R = V / I
При усилении 100:
Требуемый ток базы: 0.385А / 100 = 0.00385А
Доступное напряжение: 5В - 0.7В (падение на переходе база-эмиттер) = 4.3В
Необходимое сопротивление: 4.3В / 0.00385А = 1116 Ом
Используем резистор 1 кОм (ближайший стандартный номинал)
Проверка: 4.3В / 1000 Ом = 0.0043А (в пределах ограничения пина Arduino 20 мА)
При усилении 40:
Требуемый ток базы: 0.385А / 40 = 0.009625А
Необходимое сопротивление: 4.3В / 0.009625А = 446 Ом
Используем резистор 330 Ом (обеспечивает 0.0130А)
Рекомендация: Используйте резистор 1 кОм с усилением 100 – это обеспечивает насыщение при меньшем потреблении тока от Arduino.
Защита схемы
Обратный диод (Flyback Diode)
Также называется: демпферный диод, коммутирующий диод, диод свободного хода, подавляющий диод, ограничительный диод.
Назначение: Когда питание соленоида отключается, коллапсирующее магнитное поле генерирует опасный обратный ток. Обратный диод безопасно рассеивает эту энергию в одном направлении, защищая Arduino.
Расположение: Подключается параллельно соленоиду (катод к плюсу, анод к минусу).
Пример 1: Blink с соленоидным клапаном
Схема
R1: 1 кОм (базовый резистор)
Транзистор 2N2222A коммутирует 12В соленоид
Светодиод-индикатор на пине D10
Пин D4 Arduino управляет транзистором
Скетч
// Sketch: Switching high voltages with an Arduino using a transistor 01
// www.martyncurrey.com
const byte LED_PIN = 10;
byte const TRANSISTOR_PIN = 4;
void setup()
{
pinMode(LED_PIN, OUTPUT);
pinMode(TRANSISTOR_PIN, OUTPUT);
}
void loop()
{
digitalWrite(LED_PIN, HIGH);
digitalWrite(TRANSISTOR_PIN, HIGH);
delay(1000);
digitalWrite(LED_PIN, LOW);
digitalWrite(TRANSISTOR_PIN, LOW);
delay(1000);
}
Работа: Соленоид и светодиод включаются на 1 секунду, затем выключаются на 1 секунду, и так далее.
Пример 2: Управление переключателем (Toggle)
Схема
Та же схема, что и в Примере 1, плюс кнопка на пине D2. Переключение: нажатие один раз активирует, повторное нажатие деактивирует.
Скетч
// Sketch: Switching High Voltages With An Arduino - Use a toggle switch to turn a solenoid valve on and off
// www.martyncurrey.com
//
// An example of using a button switch as a toggle switch to turn a solenoid valve on or off
//
// Pins
// D10 to resistor and LED
// D4 to resistor and transistor
// D2 to push button switch
// Define the pins being used
const int PIN_LED = 10;
const int PIN_TRANSISTOR = 4;
const int PIN_SWITCH = 2;
// variables to hold the new and old switch states
boolean oldSwitchState = LOW;
boolean newSwitchState1 = LOW;
boolean newSwitchState2 = LOW;
boolean newSwitchState3 = LOW;
boolean valveStatus = LOW;
void setup()
{
Serial.begin(9600);
Serial.print("Sketch: "); Serial.println(__FILE__);
Serial.print("Uploaded: "); Serial.println(__DATE__);
Serial.println(" ");
pinMode(PIN_LED, OUTPUT); digitalWrite(PIN_LED,LOW);
pinMode(PIN_TRANSISTOR, OUTPUT); digitalWrite(PIN_TRANSISTOR,LOW);
pinMode(PIN_SWITCH, INPUT);
}
void loop()
{
newSwitchState1 = digitalRead(PIN_SWITCH); delay(1);
newSwitchState2 = digitalRead(PIN_SWITCH); delay(1);
newSwitchState3 = digitalRead(PIN_SWITCH);
// if all 3 values are the same we can continue
if ( (newSwitchState1==newSwitchState2) && (newSwitchState1==newSwitchState3) )
{
if ( newSwitchState1 != oldSwitchState )
{
oldSwitchState = newSwitchState1;
if ( newSwitchState1 == HIGH )
{
if ( valveStatus == LOW ) { turnON(); }
else { turnOFF(); }
}
}
}
}
void turnON()
{
digitalWrite(PIN_LED, HIGH);
digitalWrite(PIN_TRANSISTOR, HIGH);
valveStatus = HIGH;
}
void turnOFF()
{
digitalWrite(PIN_LED, LOW);
digitalWrite(PIN_TRANSISTOR, LOW);
valveStatus = LOW;
}
Ключевая логика:
Считывает состояние кнопки три раза для дебаунса
Определяет изменение состояния с LOW на HIGH
Переключает клапан: если ВЫКЛ – включает; если ВКЛ – выключает
Обновляет переменную
valveStatusдля отслеживания состояния
Рекомендации по проектированию
Безопасность на макетной плате: Не подключайте Arduino напрямую к 12В. Используйте отдельные шины питания для 5В (Arduino) и 12В (соленоид), соединяя только линии земли.
Эффективность vs безопасность: Более высокие значения сопротивления (меньший ток базы) экономят заряд батареи, но требуют тщательных расчётов усиления. Меньшие значения сопротивления гарантируют насыщение, но потребляют больше тока от Arduino.
Специфика применения: 2N2222A хорошо работает для данного соленоида. Для других требований по току обратитесь к даташитам транзисторов для оптимизации усиления и значений базового резистора.