Демпфер выхлопного порта корпуса с Arduino/сервоуправлени...
Это воздуховод с сервоприводом, который я использую для вытяжки моего принтера (120-мм вентилятор и 4-дюймовый гибкий воздуховод), который ведет на чердак. Горячий/холодный воздух с чердака время от времени втягивается в мой шкаф и в мой дом из-за перепадов давления воздуха. Этот демпфер помогает пропускать поток через этот воздуховод только во время работы моего принтера и вытяжного вентилятора.
Это было вызвано тем фактом, что обычные гравитационные демпферы не двигались (даже самые легкие) при слабом потоке моего вентилятора на самом низком уровне. Это сервоуправление гарантирует движение клапана по мере необходимости, чтобы перекрыть поток, когда печать не выполняется.
Это контролируется с помощью платы Arduino Pro Micro через контакт GPIO от Raspberry Pi, на котором работает OctoPrint, и плагин PSU Control.
Питание Arduino должно осуществляться от порта USB на Pi, чтобы у вас была общая опорная точка заземления для считывания контакта GPIO.
Я смоделировал это, используя субмикросервопривод Hitec HS81.
Проводка:
Проводные подключения сервопривода к Arduino:
Красный сервопровод к Arduino RAW
Черный сервопровод к Arduino GND
Желтый сервопровод к A1 на Arduino
Подключения Arduino к RPI:
USB на Arduino к порту USB-A на RPi (это обеспечивает как питание для Arduino, так и общую землю для подключения контакта GPIO).
Arduino от GPIO 14 до GPIO 22 на RPi
Использованы (7) винтов M3 диаметром 6 мм для крепления сервопривода, крепления заслонки и крышки.
Код быстрого закрытия:
#include
// Определить объект серводвигателя
Сервопривод;
// Опреде��ить вывод для ввода
const int gpio_input = 14;
// Определить контакт для сервоуправления — A1, отмеченный на плате = контакт 19
const int servo_pin = 19;
// Определить углы для исходного положения и повернутого положения
const int open_flap = 40;
const int close_flap = 132;
// Переменная для хранения текущего состояния gpio_input
int gpio_input_state = 0;
int Last_gpio_input_state = 0;
// Переменная для хранения текущей позиции сервопривода
int currentAngle = close_flap;
недействительная настройка() {
// Прикрепляем сервопривод к servo_pin
servo.attach(servo_pin);
// Устанавливаем начальное по��ожение закрылка для закрытия
servo.write(close_flap);
// ждем, пока сервопривод начнет двигаться (мс), иначе это произойдет «мгновенно» и отсоединится до того, как сервопривод сможет завершить свое движение
задержка(500);
// в этом случае нам не нужно удерживать сервопривод в этом положении, поэтому отсоедините его от штыря сервопривода, чтобы избежать вибрации/подергивания сервопривода
серво.отсоединить();
// Установите gpio_input в качестве входных данных — это то, что мы используем от Raspberry Pi для управления заслонкой из Octoprint (работает на указанном Pi) Plug-in PSU Control. Наш Arduino питается от Pi через USB-порт на Pi, что также дает нам общее заземление, чтобы мы могли прочитать этот вывод. Нам нужна общая основа для этой точки отсчета.
pinMode (gpio_input, INPUT);
}
недействительный цикл() {
// Читаем состояние gpio_input
gpio_input_state = digitalRead(gpio_input);
// Проверяем изменения в состоянии gpio_input_ — если нет изменений, ничего не делаем — если изменения, передвиньте заслонку
if (gpio_input_state != Last_gpio_input_state) {
если (gpio_input_state == НИЗКИЙ) {
// Закрываем клапан
currentAngle = close_flap;
// Прикрепляем сервопривод к servo_pin
servo.attach(servo_pin);
// перемещаем сервопривод, чтобы закрыть заслонку
servo.write(close_flap);
// ждем, пока серво движется (мс)
задержка(500);
// отсоединяем от штифта сервопривода
серво.отсоединить();
} еще {
// Открытая заслонка
currentAngle = open_flap;
// Прикрепляем сервопривод к servo_pin
servo.attach(servo_pin);
// перемещаем сервопривод, чтобы открыть створку
servo.write(open_flap);
// ждем, пока серво движется (мс)
задержка(500);
// отсоединяем от штифта сервопривода
серво.отсоединить();
}
// Обновляем последнее состояние gpio_input_ после обработки изменения, чтобы следующий цикл обрабатывался соответствующим образом с обновленным положением закрылка
Last_gpio_input_state = gpio_input_state;
} еще {
// Если состояние gpio_input_ не изменилось, подождите еще полсекунды
задержка(500);
}
}
Код медленного закрытия: (методом проб и ошибок с motion_increment и motion_delay можно добиться более тихого движения.
#include
// Определить объек�� серводвигателя
Сервопривод;





























