Прошу помощи в подключении оптического прерывателя

Skanch
Offline
Зарегистрирован: 10.01.2015

Добрый день, форумчане!

Прошу помощи у спецов программирования. Сам не могу справиться- не хватает знаний программирования Ардуино. Есть самодельная система перемещения монитора в машине со следующими компонентами и алгоритмом работы: 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;
 }

 

toc
Offline
Зарегистрирован: 09.02.2013

>> как добавить в скетч еще две кнопки

http://arduino.ru/forum/programmirovanie/rabota-s-knopkami-v-pomoshch-novichku

 

 

sva1509
Offline
Зарегистрирован: 07.12.2012

Вы бы хоть схемотично обрисовали механику подъема вашего монитора. И какой серво за что отвечает. Иначе как определить 20град. Какой серво куда крутить ? Да и схемка не помешалаб.

Skanch
Offline
Зарегистрирован: 10.01.2015

В "шапке" в алгоритме работы механизма указаны обе сервы. Это схема 

Еще есть ролик . В этом варианте  используются шаговый двигатель и серва, но механика должна быть понятна.http://youtu.be/fXcL3LoE_kE

OlegK
OlegK аватар
Offline
Зарегистрирован: 26.11.2014

Skanch пишет:


Сам вопрос о помощи заключается в следующем: как добавить в скетч еще две кнопки
Ссылку на кнопки вам уже дали.

Цитата:
которые будут регулировать угол открытого монитора в пределах +20 градусов
Отлавливаете нажатие кнопки, смотрите какое текущее значение положения монитора (потребуется некая переменная), по нажатию добавляете к этому значению величину шага, к примеру 5 градусов и крутите -

 

if value <= 110 value += 5; //тут образно показана проверка величины +20град от 90 - т.е. 110

motor2.write(value);

Цитата:
с сохранением положения монитора  в память?
Сохранение в память в вашем скетче уже есть, трудностей, наверное, не возникнет.

Цитата:
И еще вместо механических концевиков хочу использовать два оптических щелевых прерывателя-как их подключить и что нужно добавить в скетч?

Сперва опробуйте их отдельно - выясните, какой лог. уровень соответствует затемнённому датчику, а что освещённому. Ну и цепляете к цифровым пинам и где требуется смотрите их состояние, перед тем, как управлять сервами в требуемую сторону.

И ещё. Красивше и удобнее будет не пихать весь алгоритм в одну процедуру, а разнести по "кускам" - закрытие монитора, открытие монитора, чтение-запись переменных в память, обслуживание кнопок и.т.д.

 

 

Skanch
Offline
Зарегистрирован: 10.01.2015

Благодарю за ответ. Буду пробовать.