Выдвижной экран(планшет в авто), подскажите или помогите..

Вопросы программирования в системе Ардуино
Аватара пользователя
z-level
Сообщения: 7
Зарегистрирован: 24 май 2018, 07:52

Выдвижной экран(планшет в авто), подскажите или помогите..

Сообщение z-level » 24 май 2018, 08:15

День добрый.

В проектах ардуино и программировании я новичок, но так как работаю в IT сфере думаю несложно будет вникнуть..

Планирую сделать выдвижной экран (планшет).
В наличии есть полуживая автомагнитола с выдвижным экраном на одном моторчике, arduino Mini Pro atmega328 5V 16M, драйвер Easydriver 4.4, шаговик из мфу (принтера).

Пока есть недоработанная схема работы будущего девайса:
выезд экрана по кнопке, две кнопки на доводку угла наклона, возврат до конца по кнопке (в начале концевик или включение драйвера двигателя по пину enable со счетом шагов, в конце концевик)

Подскажите по доработке компонентов кнопки, концевики, программная часть..


Возможно кто-то сможет помочь проверить на ошибки скеч или доработать/оптимизировать ?
► Показать


Когда всё будет работать создам тему в проектах и более подробно опишу +фото.
С уважением Михаил.


Эдуард
Администратор
Сообщения: 484
Зарегистрирован: 30 окт 2016, 20:53

Re: Выдвижной экран(планшет в авто), подскажите или помогите..

Сообщение Эдуард » 24 май 2018, 19:10

Здравствуйте!
Задачу надо реализовывать по этапам. Правильно я понял, что первый этап это:
    Есть двигатель выезда экрана, два концевика, две кнопкми управления.
    По кнопке открыть двигатель вращается в определенном направлении, пока не достигнет соответствующего концевика.
    По кнопке закрыть двигатель вращается в противоположном направлении до срабатывания другого концевика.

Аватара пользователя
z-level
Сообщения: 7
Зарегистрирован: 24 май 2018, 07:52

Re: Выдвижной экран(планшет в авто), подскажите или помогите..

Сообщение z-level » 24 май 2018, 19:24

Получается 2 кнопки на выезд/заезд, 2 кнопки для регулировки угла наклона, два концевика.
1. Кнопка выдвижения (мотор работает в одном направлении до срабатывания концевика, остановка)
2. Кнопки регулировки угла наклона ( движение мотора в одном или другом направлении на небольшое количество шагов(оборотов), остановка с удержанием)
3. Кнопка заезда (возврата), (мотор работает в обратном направлении до срабатывания 2ого концевика, остановка)

1 и 3 кнопки необходимы для управления при прирывании электропитания.

Завтра выложу фото выезжающего механизма (будет понятнее.

Заранее спасибо :)
С уважением Михаил.

Эдуард
Администратор
Сообщения: 484
Зарегистрирован: 30 окт 2016, 20:53

Re: Выдвижной экран(планшет в авто), подскажите или помогите..

Сообщение Эдуард » 24 май 2018, 19:34

Я бы сделал это как-то так. Проверять не на чем, поэтому в программе могут быть ошибки. Но сам принцип должен быть понятен. Все делается параллельно, цикл loop() не зависает, в программу можно добавлять новые блоки.

Код: Выделить всё

#include <TimerOne.h>
#include <Button.h>
#include <StepDirDriver.h>

Button button1(2, 40); // остановить двигатель, задний концевик
Button button2(3, 40); // остановить двигатель, передний концевик
Button button3(4, 40); // выдвижение экрана
Button button4(5, 40); // закрытие экрана

StepDirDriver myMotor(10, 11, 12);  // создаем объект типа StepMotor, задаем выводы для фаз

byte  mode=0; // режим: 0 - стоп, 1 - открывает, 2 - закрывает

void setup() {
  Timer1.initialize(250);  // инициализация таймера 1, период 250 мкс
  Timer1.attachInterrupt(timerInterrupt, 250);  // задаем обработчик прерываний
  myMotor.setDivider(20);     // делитель частоты 20   
  myMotor.setMode(1, true);  // полу  шаговый режим, с фиксацией ротора при остановке
  delay(50);
  button3.flagClick= false; 
  button4.flagClick= false; 
}

void loop() {

  if( mode == 0 ) {
    //------------------------------------------- стоп
    myMotor.step(0);
    if( button3.flagClick == true ) mode= 1;   
    if( button4.flagClick == true ) mode= 2;           
  }
  else if ( mode == 1 ) {
    //------------------------------------------- открывает
    myMotor.step(-32000);  // выдвижение экрана
    if( button2.flagPress == true ) {
      // открылся
      button3.flagClick= false; 
      button4.flagClick= false; 
      mode= 0;
    }   
  }
  else if ( mode == 2 ) {
    //-------------------------------------------  закрывет
    myMotor.step(32000);  // закрытие экрана
    if( button1.flagPress == true ) {
      // закрылся
      button3.flagClick= false; 
      button4.flagClick= false; 
      mode= 0;
    }   
   
  }
  else mode=0;

}

//-------------------------------------- обработчик прерывания 0,25 мс
void  timerInterrupt() {
  myMotor.control(); // управвление двигателем
  button1.filterAvarage();  // вызов метода фильтрации кнопки
  button2.filterAvarage();  // вызов метода фильтрации кнопки
  button3.filterAvarage();  // вызов метода фильтрации кнопки
  button4.filterAvarage();  // вызов метода фильтрации кнопки   
}

Аватара пользователя
z-level
Сообщения: 7
Зарегистрирован: 24 май 2018, 07:52

Re: Выдвижной экран(планшет в авто), подскажите или помогите..

Сообщение z-level » 24 май 2018, 19:39

Спасибо, завтра или в выходные погоняю..
С уважением Михаил.

Аватара пользователя
z-level
Сообщения: 7
Зарегистрирован: 24 май 2018, 07:52

Re: Выдвижной экран(планшет в авто), подскажите или помогите..

Сообщение z-level » 24 май 2018, 19:44

Эдуард

Кнопки и концевики подключать через аналоговые контакты с резистором 30-100кОм на землю ?
С уважением Михаил.

Эдуард
Администратор
Сообщения: 484
Зарегистрирован: 30 окт 2016, 20:53

Re: Выдвижной экран(планшет в авто), подскажите или помогите..

Сообщение Эдуард » 26 май 2018, 19:07

Почему? Через цифровые. Библиотека Button включает подтягивающие резисторы на 5 В. В рабочей схеме лучше добавить внешние подтягивающие резисторы 5 - 10 кОм.

Аватара пользователя
z-level
Сообщения: 7
Зарегистрирован: 24 май 2018, 07:52

Re: Выдвижной экран(планшет в авто), подскажите или помогите..

Сообщение z-level » 01 июн 2018, 12:41

фото
Вложения
3.png
2.png
1.png
С уважением Михаил.

Аватара пользователя
z-level
Сообщения: 7
Зарегистрирован: 24 май 2018, 07:52

Re: Выдвижной экран(планшет в авто), подскажите или помогите..

Сообщение z-level » 27 июн 2018, 08:50

Эдуард писал(а):Я бы сделал это как-то так. Проверять не на чем, поэтому в программе могут быть ошибки. Но сам принцип должен быть понятен. Все делается параллельно, цикл loop() не зависает, в программу можно добавлять новые блоки.

Код: Выделить всё

#include <TimerOne.h>
#include <Button.h>
#include <StepDirDriver.h>

Button button1(2, 40); // остановить двигатель, задний концевик
Button button2(3, 40); // остановить двигатель, передний концевик
Button button3(4, 40); // выдвижение экрана
Button button4(5, 40); // закрытие экрана

StepDirDriver myMotor(10, 11, 12);  // создаем объект типа StepMotor, задаем выводы для фаз

byte  mode=0; // режим: 0 - стоп, 1 - открывает, 2 - закрывает

void setup() {
  Timer1.initialize(250);  // инициализация таймера 1, период 250 мкс
  Timer1.attachInterrupt(timerInterrupt, 250);  // задаем обработчик прерываний
  myMotor.setDivider(20);     // делитель частоты 20   
  myMotor.setMode(1, true);  // полу  шаговый режим, с фиксацией ротора при остановке
  delay(50);
  button3.flagClick= false; 
  button4.flagClick= false; 
}

void loop() {

  if( mode == 0 ) {
    //------------------------------------------- стоп
    myMotor.step(0);
    if( button3.flagClick == true ) mode= 1;   
    if( button4.flagClick == true ) mode= 2;           
  }
  else if ( mode == 1 ) {
    //------------------------------------------- открывает
    myMotor.step(-32000);  // выдвижение экрана
    if( button2.flagPress == true ) {
      // открылся
      button3.flagClick= false; 
      button4.flagClick= false; 
      mode= 0;
    }   
  }
  else if ( mode == 2 ) {
    //-------------------------------------------  закрывет
    myMotor.step(32000);  // закрытие экрана
    if( button1.flagPress == true ) {
      // закрылся
      button3.flagClick= false; 
      button4.flagClick= false; 
      mode= 0;
    }   
   
  }
  else mode=0;

}

//-------------------------------------- обработчик прерывания 0,25 мс
void  timerInterrupt() {
  myMotor.control(); // управвление двигателем
  button1.filterAvarage();  // вызов метода фильтрации кнопки
  button2.filterAvarage();  // вызов метода фильтрации кнопки
  button3.filterAvarage();  // вызов метода фильтрации кнопки
  button4.filterAvarage();  // вызов метода фильтрации кнопки   
}




День добрый.

Продолжил заниматься данным проектом..

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

Хотел убрать передний концевик (для тестов кнопка) и добавить две кнопки регулировки угла наклона.
Концевик button2(3 убрать не получилось, кнопки корректировки работают, но насколько корректно хз.

Помогите откорректировать только выдвижение экрана на заданное кол-во шагов и возможно поправить ошибки с кнопками регулировки наклона экрана.

Или может проще добавить фотоэлемент вместо переднего концевика (концевик негде ставить) ?

Код: Выделить всё

#include <TimerOne.h>
#include <Button.h>
#include <StepDirDriver.h>

Button button1(2, 40); // остановить двигатель, задний концевик
Button button2(3, 40); // остановить двигатель, передний концевик
Button button3(4, 40); // выдвижение экрана
Button button4(5, 40); // закрытие экрана
Button button5(6, 40); // кнопка сделать +100 шагов
Button button6(7, 40); // кнопка сделать -100 шагов

StepDirDriver myMotor(11, 10, 12);  // создаем объект типа StepMotor, задаем выводы для фаз


byte  mode=0; // режим: 0 - стоп, 1 - открывает, 2 - закрывает, 3 - +100 шагов, 4 - -100 шагов

void setup() {
  Timer1.initialize(250);  // инициализация таймера 1, период 250 мкс
  Timer1.attachInterrupt(timerInterrupt, 250);  // задаем обработчик прерываний
  myMotor.setDivider(1);     // делитель частоты 20   
  //myMotor.setMode(0, true);  // полу  шаговый режим, с фиксацией ротора при остановке
  myMotor.setMode(0, false);  // шаговый режим, без фиксации при остановке
  delay(50);
  button3.flagClick= false;
  button4.flagClick= false;
}

void loop() {

  if( mode == 0 ) {
    //------------------------------------------- стоп
    myMotor.step(0);
    if( button3.flagClick == true ) mode= 1;   
    if( button4.flagClick == true ) mode= 2; 
    if( button5.flagClick == true ) mode= 3;   
    if( button6.flagClick == true ) mode= 4; 
  }
  else if ( mode == 1 ) {
    //------------------------------------------- открывает
    myMotor.step(-4100);  // выдвижение экрана
    if( button2.flagPress == true ) {
   //   // открылся
      button3.flagClick= false;
      button4.flagClick= false;
      mode= 0;
   }   
  }
  else if ( mode == 2 ) {
    //-------------------------------------------  закрывет
    myMotor.step(5000);  // закрытие экрана
    if( button1.flagPress == true ) {
      // закрылся
      button3.flagClick= false;
      button4.flagClick= false;
      mode= 0;
    }   
  }
  else if ( mode == 3 ) {
    //------------------------------------------- 100 шагов
    myMotor.step(-100);  // сделать +100 шагов
    delay(100);
    myMotor.step(0);
    button5.flagClick= false;
    mode= 0;
  }
  else if ( mode == 4 ) {
    //------------------------------------------- -100 шагов
    myMotor.step(300);  // сделать -100 шагов
    delay(100);
    myMotor.step(0);
    button6.flagClick= false;
    mode= 0;
  }
 
  else mode= 0;

}

//-------------------------------------- обработчик прерывания 0,25 мс
void  timerInterrupt() {
  myMotor.control(); // управвление двигателем
  button1.filterAvarage();  // вызов метода фильтрации кнопки
  button2.filterAvarage();  // вызов метода фильтрации кнопки
  button3.filterAvarage();  // вызов метода фильтрации кнопки
  button4.filterAvarage();  // вызов метода фильтрации кнопки   
  button5.filterAvarage();  // вызов метода фильтрации кнопки
  button6.filterAvarage();  // вызов метода фильтрации кнопки
}
С уважением Михаил.

Аватара пользователя
z-level
Сообщения: 7
Зарегистрирован: 24 май 2018, 07:52

Re: Выдвижной экран(планшет в авто), подскажите или помогите..

Сообщение z-level » 29 июн 2018, 14:17

Разобрался с программной частью..

Если кто-то укажет на ошибки или оптимизацию кода, буду рад

Далее планирую навести "красоту".. (фиксация плат, шлейфов, проводов, кнопок и т.д.)

Когда закончу сделаю прибранный пост в "Проектах" с фото и описанием проделанного...

Код: Выделить всё

#include <TimerOne.h>
#include <Button.h>
#include <StepDirDriver.h>

Button button1(2, 40); // остановить двигатель, задний концевик
Button button3(4, 40); // выдвижение экрана
Button button4(5, 40); // закрытие экрана
Button button5(6, 40); // кнопка сделать +100 шагов
Button button6(7, 40); // кнопка сделать -300 шагов

StepDirDriver myMotor(11, 10, 12);  // создаем объект типа StepMotor, задаем выводы для фаз


byte  mode=0; // режим: 0 - стоп, 1 - открывает, 2 - закрывает, 3 - +100 шагов, 4 - -100 шагов

void setup() {
  Timer1.initialize(250);  // инициализация таймера 1, период 250 мкс
  Timer1.attachInterrupt(timerInterrupt, 250);  // задаем обработчик прерываний
  myMotor.setDivider(1);     // делитель частоты 20   
  //myMotor.setMode(0, true);  // полу  шаговый режим, с фиксацией ротора при остановке
  myMotor.setMode(0, false);  // шаговый режим, без фиксации при остановке
  delay(50);
  button3.flagClick= false;
  button4.flagClick= false;
  pinMode(3, INPUT_PULLUP); // оптрон щелевой (передний концевик)
}

void loop() {
  int sensorVal = digitalRead(3);

  if( mode == 0 ) {
    //------------------------------------------- стоп
    myMotor.step(0);
    if( button3.flagClick == true ) mode= 1;   
    if( button4.flagClick == true ) mode= 2; 
    if( button5.flagClick == true ) mode= 3;   
    if( button6.flagClick == true ) mode= 4; 
  }
  else if ( mode == 1 ) {
    //------------------------------------------- открывает
    myMotor.step(-4100);  // выдвижение экрана
    if (sensorVal == HIGH) {
      // открылся
      button3.flagClick= false;
      button4.flagClick= false;
      mode= 0;
   }   
  }
  else if ( mode == 2 ) {
    //-------------------------------------------  закрывет
    myMotor.step(5000);  // закрытие экрана
    if( button1.flagPress == true ) {
      // закрылся
      button3.flagClick= false;
      button4.flagClick= false;
      mode= 0;
    }   
  }
  else if ( mode == 3 ) {
    //------------------------------------------- 100 шагов
    myMotor.step(-100);  // сделать +100 шагов
    delay(100);
    myMotor.step(0);
    button5.flagClick= false;
    mode= 0;
  }
  else if ( mode == 4 ) {
    //------------------------------------------- -300 шагов
    myMotor.step(300);  // сделать -300 шагов
    delay(100);
    myMotor.step(0);
    button6.flagClick= false;
    mode= 0;
  }
 
  else mode= 0;

}

//-------------------------------------- обработчик прерывания 0,25 мс
void  timerInterrupt() {
  myMotor.control(); // управвление двигателем
  button1.filterAvarage();  // вызов метода фильтрации кнопки
  button3.filterAvarage();  // вызов метода фильтрации кнопки
  button4.filterAvarage();  // вызов метода фильтрации кнопки   
  button5.filterAvarage();  // вызов метода фильтрации кнопки
  button6.filterAvarage();  // вызов метода фильтрации кнопки
}
С уважением Михаил.


Вернуться в «Программирование Ардуино»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 6 гостей