Прошу помощи в подключении оптического прерывателя
- Войдите на сайт для отправки комментариев
Добрый день, форумчане!
Прошу помощи у спецов программирования. Сам не могу справиться- не хватает знаний программирования Ардуино. Есть самодельная система перемещения монитора в машине со следующими компонентами и алгоритмом работы: Servo motor1- серва непрерывного вращения, Servo motor2- серва с поворотом на 180 градусов, кнопка включения и выключения системы, которая управляет включением оптопары и соответственно АСС.
Алгоритм работы: подаем напряжение на АСС-включается Servo motor1(каретка движется вперед) до срабатывания концевика (просто рубит "-" питания сервы), включается Servo motor2 на подъем монитора на угол 90 градусов. Сохраняем положение. При пропадании АСС происходит обратный процесс.
Сам вопрос о помощи заключается в следующем: как добавить в скетч еще две кнопки, которые будут регулировать угол открытого монитора в пределах +20 градусов с сохранением положения монитора в память? И еще вместо механических концевиков хочу использовать два оптических щелевых прерывателя-как их подключить и что нужно добавить в скетч?
Приведенный код успешно работает, но необходима модернизация системы. Заранее благодарю.
#include <EEPROM.h> #include <Servo.h> int ACC = 11;// ААС подключен к 11 пину Servo motor1;// Создаём объект для контроля сервы непрерывного вращения int pos = 0; // Переменная для хранения позиции сервы Servo motor2;// Создаём объект для контроля сервы int inPin = 2; // контакт, к которому подключена кнопка int outPin = 3; // контакт, к которому подключен управляющий блок линии АСС int state = LOW; // Текущее состояние выходного контакта, как "Выкл." int reading; // the current reading from the input pin int previous = HIGH; // Начальное состояние контакта long time = 0; // the last time the output pin was toggled long debounce = 200; // Время дребезга контакта кнопки void setup() { pinMode(inPin, INPUT_PULLUP);// Устанавливаем контакт, как "Вход" и подключаем к контакту внутренний резистор pinMode(outPin, OUTPUT); // Устанавливаем контакт,как "Выход" pinMode(13, OUTPUT); // Устанавливаем контакт, как "Выход" pinMode(ACC, INPUT); // Устанавливаем контакт, как "Вход" motor1.attach(10); // Контакт на котором находится Сервопривод непрерывного вращения motor1.write(91); // Устанавливаем и удерживаем серву в положении "Стоп" motor2.attach(9); // Контакт на котором находится Сервопривод наклона монитора motor2.write(0); // Устанавливаем и удерживаем вал сервопривода в крайнем положении } void loop() { int value = EEPROM.read(0); // Прочитать положение монитора до задержки delay(2000);// Задержка 2 секунды до выполнения команды "Открыть монитор" или "Закрыть монитор" по линии АСС if ((value==0) && (EEPROM.read(0)==0) && (digitalRead(ACC)==HIGH)) //Если АСС выключен и положение "монитор открыт", то "закрыть монитор" { /////////////////////////////// // Закрытие монитора digitalWrite(13, LOW); // Выключаемаем светодиод motor2.write(0); //Движение монитора вниз delay(800); // Ждем пока отработает сервопривод motor1.write(0); // Движение каретки монитора назад delay(5000); // Ждем пока отработает сервопривод motor1.write(91); // Останавливаем и удерживаем сервопривод motor1.detach(); // Отключаем Сервопривод motor2.detach(); // Отключаем Сервопривод EEPROM.write(0, 255); // Сохраняем положение "Монитор закрыт" } if ((value==255) && (EEPROM.read(0)==255) && (digitalRead(ACC)==LOW)) // Если ACC включен и положение "монитор закрыт", то "открыть монитор" { /////////////////////////////// // Открытие монитора digitalWrite(13, HIGH); // Включаем светодиод motor1.attach(10);// Вновь подключаем контакт на котором находится Сервопривод motor2.attach(9); // Вновь подключаем контакт на котором находится Сервопривод motor1.write(180); // Движение каретки монитора вперед delay(5000); // Ждем пока отработает сервопривод motor1.write(91); // Останавливаем и удерживаем сервопривод motor2.write(90); // Движение монитора вверх на угол 90 градусов EEPROM.write(0, 0); // Сохраняем положение "монитор открыт" } reading = digitalRead(inPin); if (reading == LOW && previous == HIGH && millis() - time > debounce) { if (state == LOW) state = HIGH; else state = LOW; time = millis(); } digitalWrite(outPin, state); previous = reading; }
>> как добавить в скетч еще две кнопки
http://arduino.ru/forum/programmirovanie/rabota-s-knopkami-v-pomoshch-novichku
Вы бы хоть схемотично обрисовали механику подъема вашего монитора. И какой серво за что отвечает. Иначе как определить 20град. Какой серво куда крутить ? Да и схемка не помешалаб.
В "шапке" в алгоритме работы механизма указаны обе сервы. Это схема
Еще есть ролик . В этом варианте используются шаговый двигатель и серва, но механика должна быть понятна.http://youtu.be/fXcL3LoE_kE
Сам вопрос о помощи заключается в следующем: как добавить в скетч еще две кнопки
if value <= 110 value += 5; //тут образно показана проверка величины +20град от 90
- т.е. 110
motor2.write(value);
Сперва опробуйте их отдельно - выясните, какой лог. уровень соответствует затемнённому датчику, а что освещённому. Ну и цепляете к цифровым пинам и где требуется смотрите их состояние, перед тем, как управлять сервами в требуемую сторону.
И ещё. Красивше и удобнее будет не пихать весь алгоритм в одну процедуру, а разнести по "кускам" - закрытие монитора, открытие монитора, чтение-запись переменных в память, обслуживание кнопок и.т.д.
Благодарю за ответ. Буду пробовать.