Как подключить оптический прерыватель - ФОРУМ ДВ Робот dvrobot.ru
Четверг, 16.05.2024, 20:39
Главная Мой профиль Регистрация Выход
  • НАШ МАГАЗИН
  • Вы вошли как Гость | Группа "Гости"Приветствую Вас, Гость
    [ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
    • Страница 1 из 1
    • 1
    Модератор форума: Serg, GRACH  
    ФОРУМ ДВ Робот dvrobot.ru » DV ROBOT » Arduino - вопросы и ответы. » Как подключить оптический прерыватель
    Как подключить оптический прерыватель
    SkanchДата: Воскресенье, 11.01.2015, 00:36 | Сообщение # 1
    1.5 Вольт
    Группа: Пользователи
    Сообщений: 1
    Репутация: 0
    Статус: Offline
    Добрый день, форумчане!
    Прошу помощи у спецов программирования. Сам не могу справиться- не хватает знаний программирования Ардуино. Есть самодельная система перемещения монитора в машине со следующими компонентами и алгоритмом работы: 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;
    }
     
    SergДата: Понедельник, 12.01.2015, 19:45 | Сообщение # 2
    Ампер
    Группа: Модераторы
    Сообщений: 510
    Репутация: 28
    Статус: Offline
    Добавить
    Код

    int inPinХ = х; // контакт, к которому подключена кнопка вверх
    int inPinУ = у; // контакт, к которому подключена кнопка вниз
    int val=100; // ПеременнаЯ хранит положение монитора от 0 до 255. Пишем и читаем с/в Eeprom

    обработка нажатий дополнительных кнопок
    Код

    if (inPinХ.read()==0) //читаем , если изменился, то

    {
    val++; // увеличиваем переменную на 1 - количество нажатий на кнопку
    if(val>255) //  при превышении значения...
    {
    val=0; //возвращаем значение к 1 - режимы будут ходить по кругу
    }
    if (inPinУ.read()==0) //читаем, если изменился

    {
    val--; // уменьшаем переменную на 1 - количество нажатий на кнопку
    if(val<0) //  при превышении значения...
    {
    val=0; //возвращаем значение к 0

    не забываем Val писать в Eeprom
    Это лишь набросок, думаю смысл понятен, если вышеуказанный код вы сами написали
     
    ФОРУМ ДВ Робот dvrobot.ru » DV ROBOT » Arduino - вопросы и ответы. » Как подключить оптический прерыватель
    • Страница 1 из 1
    • 1
    Поиск:

    ДВ Робот - Чат