Экран для проектора.

Dimark
Offline
Зарегистрирован: 04.10.2015

Здравствуйте. Когда я делал себе эти шкафчики, то сразу сделал выдвижную полочку под экран. Выдвигал и опускал экран вручную, но не долго. Сейчас сделал электропривод. Актуатор 100мм заказал на Ебай, мотор подъема экрана - старый редуктор от шуруповерта Макита, заклееный на первую скорость, с двигателем от принтера Эпсон. Он 1 в 1 как макитовский, толко на 24В, но и от 12в подымает экран быстро. Экран разобрал, перемотал наоборот, чтобы меньше вдвигать. Сбоку вывел вал привода сквозь родной подшипник. Сразу скажу, что купить экран на Камчатке не так просто. Проехав по всем магазинам и обнаружив полное отсутствие их присутствия. Посмотрев на Авито, я купил единственный продававшийся в П-К б.у. экран, к моей радости нужной мне ширины. Вот поэтому пришлось городить такие городушки. Вобщем вот видео работы экрана https://youtu.be/pTrlgPAwkbQ

и фото.


​#include <RCSwitch.h>

  int GOR1 = 3; // выдвинуть экран
  int GOR2 = 4; // задвинуть экран
  int VER3 = 5; // опустить экран
  int VER4 = 6; // поднять экран
  const int gor_level_pin = 8; // пин датчика задвинутого экрана
  const int ver_level_pin = 9;  // пин дадчика поднятого экрана
  int gor_level_state = 0; 
  int ver_level_state = 0;
  
RCSwitch mySwitch = RCSwitch();

void setup() {
  Serial.begin(9600);
  pinMode(GOR1, OUTPUT);
  pinMode(GOR2, OUTPUT);
  pinMode(VER3, OUTPUT);
  pinMode(VER4, OUTPUT);
  digitalWrite(GOR1,HIGH);
  digitalWrite(GOR2,HIGH);
  digitalWrite(VER3,HIGH);
  digitalWrite(VER4,HIGH);
  pinMode(gor_level_pin, INPUT);
  pinMode(ver_level_pin, INPUT);
      
  mySwitch.enableReceive(0);}  // Receiver on inerrupt 0 => that is pin #2

  void loop() {
   ver_level_state = digitalRead(ver_level_pin);
   gor_level_state = digitalRead(gor_level_pin);  
   
   if (mySwitch.available())
  {
   int value = mySwitch.getReceivedValue();
    
    switch (value)
   
   {
    case 1047868:
    if (gor_level_state == LOW)                // Если экран задвинут
//    if (digitalRead(gor_level_pin) == LOW)   // Если экран задвинут
   {digitalWrite(GOR1, LOW);                   // Старт двигателя Вперед
    digitalWrite(GOR2, HIGH);
    delay(9000);                               // влючаем на 9 сек.
    digitalWrite(GOR1, HIGH);                  // Стоп двигателя Вперед
    delay(500);
 //   if (digitalRead(gor_level_pin) == HIGH&&digitalRead(ver_level_pin) == LOW)    // Если экран выдвинут и поднят, то можно опускать
   digitalWrite(VER3, LOW);          // Старт двигателя Вниз
    digitalWrite(VER4, HIGH);
    delay(25000);                    // Опускаем 25 сек.
    digitalWrite(VER3, HIGH);}       // Стоп двигателя Вниз
   
    else {break;}
    break;
    
    {
    case 1047859:
    if (gor_level_state == HIGH)     // Если экран выдвинут
 //   if (digitalRead(gor_level_pin) == HIGH&&digitalRead(ver_level_pin) == HIGH)  // Если экран выдвинут и опущен, то можно поднимать
   {digitalWrite(VER3, HIGH);        // Старт двигателя Вверх
    digitalWrite(VER4, LOW);
    delay(22000);                    // Поднимаем 21 сек.
    digitalWrite(VER4, HIGH);        // Стоп двигателя Вверх
    delay(500);
 //   if (digitalRead(ver_level_pin) == LOW&&digitalRead(gor_level_pin) == HIGH)  // Если экран поднят и выдвинут, то можно задвигать
   digitalWrite(GOR1, HIGH);         // Старт двигателя Назад
    digitalWrite(GOR2, LOW);
    delay(9000);                     // включаем на 9 сек.
    digitalWrite(GOR2, HIGH);}       // Стоп двигателя Назад   
    
    else {break;}

   }
    break;
  }
     mySwitch.resetAvailable();
  }
  }

 

Сейчас управление две кнопки. Нажал одну-выдвинулся-опустился. Нажал другую-поднялся-задвинулся. В актуаторе свои конечники, он отрабатывает за 8 сек., а вот опускание-подъем осуществляется только по времени, потому, что вставить в код остановку подъема при замыкании контакта на pin 9 у меня пока не получается. Про Ардуино узнал совсем недавно, и руки видать у меня работают лучше чем варит котелок. Буду очень благодарен сообществу, за помощь в оптимизации кода.

Dimark
Offline
Зарегистрирован: 04.10.2015

Ну вот, за два месяца эксплуатации, первый раз он начал задвигаться не поднявшись до конца. Все-таки нужен end-stop на подъем. Ни как не получается сделать его на пин9, как не вписываю, не останавливается при замыкании...

Help Me!!! 

Gippopotam
Gippopotam аватар
Offline
Зарегистрирован: 12.09.2014

Я не смог полностью осознать ваш код, но ставить проерку на срабатывание концевика вам следует вместо delay, в 63 строке.

Araris
Offline
Зарегистрирован: 09.11.2012

А если строку 63 изменить на while (!digitalRead(ver_level_pin)) {} // Ждём, пока экран поднимется и сработает концевик. ?

UPD: Ну тогда уже и строку 45 изменить на while (!digitalRead(gor_level_pin)) {} // Ждём, пока экран выдвинется и сработает концевик.

Dimark
Offline
Зарегистрирован: 04.10.2015

Araris, большое спасибо Вам за помощь!!! Все теперь работает как часы. Писал я в эту строку похожие команды только while там не было, не знал как написать правильно, писал IF. 45 строку менять смысла нет, актуатор заводской с концевиками,два провода, механически все сделано на полный выход механизма.

Для тех кто писал про зачем на arduino и RF. Домашний кинотеатр включается нажатием одной кнопки на планшете. Управление осушествляется через устройтво Broadlink RM Pro. При этом выполняется макрос "включаем медиа плеер, ключаем проектор, опускаем экран, включаем ресивер Yamaha, выбираем на проекторе вход HDMI1". Вот как-то так.

armlive
Offline
Зарегистрирован: 07.12.2015

В проекторе есть выход тригера, его использовать удобнее, проектор включил - опустился, выключил - поднялся!!!

Я себе по мимо управления с телефона и управление с тригера сделал. Единственно без проводное управление.

Включился проектор и активировался радиопередатчик. Радиопередатчик передает код с инервалом 1 секунда. 

Ардуино принимает код и опускает экран и выключает свет ,если он был поднят ранее, до концевика. Далее  счетчик начинает считать заданное время, если приемник не получил этот "секретный" код, счетчик сбрасывается в нуль.

Выключили проектор, код приемник перестал принимать, счетчик считает заданное время и по достижении этого времени поднимаем экран до концевика( я присваиваю переменные при сработке концевиков, а то у меня экран также самоделкин и он бывает чуть опускается, слабый редуктор)

 И жем кода. 

При любом сбое питания, всегда тянем экран к верхниму концевику

 

armlive
Offline
Зарегистрирован: 07.12.2015

Dimark пишет:

Для тех кто писал про зачем на arduino и RF. Домашний кинотеатр включается нажатием одной кнопки на планшете. Управление осушествляется через устройтво Broadlink RM Pro. При этом выполняется макрос "включаем медиа плеер, ключаем проектор, опускаем экран, включаем ресивер Yamaha, выбираем на проекторе вход HDMI1". Вот как-то так.

Ну это уже не бюджетно....  Но тоже ничего.

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

 

aker2
Offline
Зарегистрирован: 29.07.2018

Добрый день! не могли бы выложить схему проекта. очень заинтересовала его ваша реализация. программированием только начал заниматься, а проект очень интересен