Прошу помощи в подключении оптического прерывателя
- Войдите на сайт для отправки комментариев
Добрый день, форумчане!
Прошу помощи у спецов программирования. Сам не могу справиться- не хватает знаний программирования Ардуино. Есть самодельная система перемещения монитора в машине со следующими компонентами и алгоритмом работы: 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- т.е. 110motor2.write(value);Сперва опробуйте их отдельно - выясните, какой лог. уровень соответствует затемнённому датчику, а что освещённому. Ну и цепляете к цифровым пинам и где требуется смотрите их состояние, перед тем, как управлять сервами в требуемую сторону.
И ещё. Красивше и удобнее будет не пихать весь алгоритм в одну процедуру, а разнести по "кускам" - закрытие монитора, открытие монитора, чтение-запись переменных в память, обслуживание кнопок и.т.д.
Благодарю за ответ. Буду пробовать.