Общие сведения
Перистальтический насос позволяет с высокой точностью дозировать жидкости, в том числе пищевые и химически агрессивные. От полярности приложенного напряжения зависит направление подачи раствора.
Ниже мы рассмотрим несколько стандартных примеров, используя которые вы сможете написать необходимый вам код. Для демонстрации мы взяли контроллер Piranha UNO и Trema Shield для удобного подключения модулей. Также можно использовать контроллеры Arduino, например, Arduino UNO.
Подача жидкости в течение заданного времени
В данном примере после нажатия на кнопку начнётся подача жидкости в течение заданного в скетче времени.
Схема
Для управления насосом (если не требуется менять направление подачи жидкости) можно воспользоваться силовым ключом (N-канал, или P-канал). Также мы использовали кнопку.
Силовой ключ мы подключили к 10 пину контроллера, кнопку - к пину 2.
Скетч
#define motorPin 10 // Номер вывода, к которому подключен насос (силовой ключ) #define buttonPin 2 // Номер вывода, к которому подключена кнопка uint32_t timeMotorOn; // Время запуска насоса ///////НАСТРОЙКИ///////// const uint32_t timeWork = 2000; // Время, мс, определяющее время работы насоса //////////////////////// void setup() { pinMode (buttonPin, INPUT); // Кнопка - вход pinMode (motorPin, OUTPUT); // Мотор - выход } void loop(){ if (digitalRead(buttonPin)){ // Если кнопка нажата while(digitalRead(buttonPin)) {;} // Ждём, пока она будет отпущена motorStart(); // Вызываем функцию запуска мотора } if (timeMotorOn + timeWork <= millis()){ // Если с момента запуска прошло время больше установленного в настройках digitalWrite(motorPin, LOW); // Выключаем мотор } } void motorStart(){ // Функция запуска мотора timeMotorOn = millis(); // Запоминаем время включения мотора digitalWrite(motorPin, HIGH); // Включаем мотор }
Подача жидкости заданного объёма
В данном примере насос перекачивает заданный объём жидкости. Схема будет аналогична схеме предыдущего примера.
Скетч
#define motorPin 10 // Номер вывода, к которому подключен насос (силовой ключ) #define buttonPin 2 // Номер вывода, к которому подключена кнопка ///////НАСТРОЙКИ///////// const uint8_t productivity = 40; // Производительность насоса (мл/мин) float valPomp = 1.5; // Объём порции первого насоса, мл //////////////////////// void setup() { pinMode (buttonPin, INPUT); // Кнопка - вход pinMode (motorPin, OUTPUT); // Мотор - выход } void loop(){ if (digitalRead(buttonPin)){ // Если кнопка нажата while(digitalRead(buttonPin)) {;} // Ждём, пока она будет отпущена motorStart(); // Вызываем функцию запуска мотора } } void motorStart(){ // Функция запуска мотора digitalWrite(motorPin,HIGH); // Включаем насос delay((float)productivity/60.0*valPomp*1000.0); // Выполняем задержку, равную времени работы насоса, требуемому для подачи нужного количества жидкости digitalWrite(motorPin,LOW); // Выключаем насос }
Подача жидкости в обе стороны (управление при помощи потенциометра)
Схема
Для смены направления вращения мотора необходимо использовать драйвер мотора, например такой.
В данном случае вывод, отвечающий за направление (D) подключен к 11 выводу контроллера, а вывод, на который подаётся ШИМ, определяющий скорость (S), подключен к 10 пину.
В качестве устройства для установки скорости и направления вращения мы использовали потенциометр. При установке его ручки в среднее положение, насос не перекачивает жидкость. Если повернуть ручку потенциометра, насос начинает плавно увеличивать скорость; от направления поворота ручки зависит направление подачи жидкости.
Скетч
#define dirPin 11 // Номер вывода, определяющий направление подачи раствора #define speedPin 10 // Номер вывода, определяющий скорость мотора #define resPin A0 // Номер вывода, к которому подключен потенциометр void setup() { // Устанавливаем пинам 9 и 10 частоту ШИМ 62.5кГц, чтобы избавиться от писка обмоток мотора при стандартном ШИМ TCCR1A = 0b00000001; TCCR1B = 0b00001001; pinMode (dirPin, OUTPUT); // Оба пина - выход pinMode (speedPin, OUTPUT); } void loop(){ int res = analogRead(resPin); // Считываем значение с потенциометра if (res >= 530){ // Если значение с потенциометра больше 530 analogWrite(speedPin, map(res, 530, 1023, 0, 255)); // Подаём на выход задания скорости значение с потенциометра, переведённое в дипазон 0...255 digitalWrite(dirPin, false); // Задаём направление вращения мотора } else if (res <= 490){ // Если значение с потенциометра меньше 490 analogWrite(speedPin, map(res, 0, 490, 255, 0)); // Подаём на выход задания скорости значение с потенциометра, переведённое в дипазон 255...0 digitalWrite(dirPin, true); // Задаём направление вращения мотора } else { // Иначе - находимся в зоне нечувствительности analogWrite(speedPin, 0); // Выключаем мотор } }
Обсуждение