Диспенсер для пайки

Предложили мне поучаствовать в разработке диспенсера, для подачи флюса, и др… при пайке.

Задача контроллера состоит в том что-бы генерировать импульсы STEP и DIR для драйвера шагового двигателя.

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

Органы управления следующие: 2-кнопки, это подача вперед и назад, и 3 потенционометра, которыми регулируется длительность подачи вперед, длительность назад (что-бы убрать сопли, появившиеся при подаче вперед), и пауза между подачами вперед.

Диаграмма работы выглядит следующим образом:

Логика работы:

  1. Кнопку вперед можно нажать как кратковременно, так и длительно, но в любом случае, при отпускании кнопки, будет движение назад.
  2. Если нажата кнопка вперед, дольше установленного периода резистором R1, то будет выполнено движение назад в течение времени установленного резистором R2, после этого будет пауза длительностью, установленной резистором R3
  3. Нажатие кнопки назад, выполняет движение пока не будет отпущена кнопка.

Для ознакомления доступна схема работы:

sxema в формате PDF

А вот её основная часть, в виде рисунка:

Вот видео работы:

Так-же в консоль я вывожу отладочную информацию.

 

Порядок настройки следующий:

  1. Все резисторы устанавливаем в крайнее левое положение.
  2. R1 немного увеличиваем, и R3, что-бы добиться движения вперед, пауза,вперед, пауза.
  3. После этого с помощью R1, и R3 добиваемся необходимой длительности работы.
  4. А теперь с помощью R2, настраиваем откат назад.

 

А вот код для ардуины (пока ещё до конца не оформлен):

	
//цифровые входы
#define K1 3 // кнопка КН1 "вперед"
#define K2 4 // кнопка КН2 "назад"

//аналоговые входы
#define P1 0 //резистор 1
#define P2 1 //резистор 2
#define P3 2 //резистор 3

//цифровые выходы
#define S1 9 //сигнал step ШД
#define D1 8  //сигнал dir  ШД

#define btPress 0
#define btNotPress 1

// Значения длительности
int T1, T2, T3, V1;

// Статус состояния кнопки
int sK1, sK2, sT1;

void setup()
{
  /* инициализация портов */
  pinMode(K1, INPUT_PULLUP);
  pinMode(K2, INPUT_PULLUP);

  pinMode(P1, INPUT);
  pinMode(P2, INPUT);
  pinMode(P3, INPUT);

  pinMode(S1, OUTPUT);
  pinMode(D1, OUTPUT);
  digitalWrite(S1, LOW);
  digitalWrite(D1, LOW);

  /* инициализация переменных */

  // длительность в мс.
  T1 = GetValueT(1);
  T2 = GetValueT(2);
  T3 = GetValueT(3);
  V1 = 3; // длительность между импульсами (мс)

  sK1 = btNotPress; //кнопка не нажата
  sK2 = btNotPress; //кнопка не нажата
  sT1 = 0;

  // для получения информации о текущем статусе
  Serial.begin(9600);
}

void loop()
{
  CheckButton1();

  CheckButton2(); 
}

// Вычислитель длительности, указанного потенциометра
int GetValueT(int NumberP)
{
  int sensorValue = 0;

  if (NumberP == 1)  sensorValue = analogRead(P1);

  if (NumberP == 2)  sensorValue = analogRead(P2);

  if (NumberP == 3)  sensorValue = analogRead(P3);

  //TODO: временно
  return sensorValue*3;
}

void CheckButton1()
{
  if (digitalRead(K1) == sK1)
  {
    if (sK1 == btNotPress)
    {
      // кнопка вперед не нажата, дальше выполнять код нет смысла
      return; 
    }
    else
    {
      // продолжается нажатие на кнопку вперед
      SetNewStepForward();
      //проверим не прывысили ли длительность
      CheckTimeForward();
    }
  }
  else
  {
    //изменение статуса нажатия кнопки
    if (sK1 == btNotPress)
    {
      Serial.println("bt1 press-up");
      // кнопку вперед нажали
      sK1 = btPress;
      sT1 = 0;
      SetNewStepForward();
      //проверим не прывысили ли длительность
      CheckTimeForward();
    }
    else
    {
      Serial.println("bt1 press-down");
      // кнопку вперед отпустили
      Otkat();
      sK1 = btNotPress;
    }
  }
}

void CheckButton2()
{
  if (digitalRead(K2) == sK2)
  {
    if (sK2 == btNotPress)
    {
      // кнопка назад не нажата, дальше выполнять код нет смысла
      return;
    }
    else
    {
      // продолжается нажатие на кнопку назад
      SetNewStepBack();
    }
  }
  else
  {
    //изменение статуса нажатия кнопки
    if (sK2 == btNotPress)
    {

      Serial.println("bt2 press-up");      
      // кнопку назад нажали
      sK2 = btPress;
      SetNewStepBack();
    }
    else
    {
      Serial.println("bt2 press-down");
      // кнопку назад отпустили
      sK2 = btNotPress;
    }
  }
}

// процедура отката назад
void Otkat()
{
  Serial.println("otkat");
  //тут зависаем пока не сделаем откат назад
  T2 = GetValueT(2);

  while (T2 > 0)
  {
    //установка направления
    digitalWrite(D1, LOW);
    //инвертирования сигнала
    int val = digitalRead(S1);
    if (val == HIGH)
    {
      digitalWrite(S1, LOW);
    }
    else
    {
      digitalWrite(S1, HIGH);
    }
    //пауза
    delay(V1);
    T2 -= V1;
  }

}

void SetNewStepForward()
{
  //выполним только 1 шаг вперед

  //установка направления
  digitalWrite(D1, HIGH);
  //инвертирования сигнала
  int val = digitalRead(S1);  
  if (val == HIGH)
  {         
    digitalWrite(S1, LOW);  
  }
  else 
  {
    digitalWrite(S1, HIGH);  
  }
  //пауза
  delay(V1);

  sT1 += V1;
}

void SetNewStepBack()
{
  //выполним только 1 шаг назад
  digitalWrite(D1, LOW);
  //инвертирования сигнала
  int val = digitalRead(S1);
  if (val == HIGH)
  {
    digitalWrite(S1, LOW);
  }
  else
  {
    digitalWrite(S1, HIGH);
  }
  //пауза
  delay(V1);
}


void CheckTimeForward()
{
  T1 = GetValueT(1);

  if (sT1 < T1)
  {
    //пока откат не нужен
    return;
  }

  //ну всё... пришло время отката
  sT1 = 0;
  Otkat();

  // и пауза №3
  Serial.println("pause T3");
  T3 = GetValueT(3);
  delay(T3);
}

 

9 комментариев

  • Добрый день, Сергей.
    Подскажите — какие пины можно назначить для использования вашей программы с Ардуино-Нано ?

    • Для управления используется 3 переменных резистора, и 2 кнопки, для резисторов обязательно нужны входы которые могут входящее напряжение измерять, в данном случае это аналоговые входы. А остальные выводы можно назначить как душе угодно.

  • Т.е изменения в программе (согласно распиновке Нано)
    будут выглядеть, например, так :

    //цифровые входы для Нано
    #define K1 5 // кнопка КН1 «вперед» пин № 5 (D2)
    #define K2 6 // кнопка КН2 «назад» пин № 6 (D3)

    //аналоговые входы для Нано
    #define P1 19 //резистор 1 пин № 19 (А0)
    #define P2 20 //резистор 2 пин № 20 (А1)
    #define P3 21 //резистор 3 пин № 21 (А2)

    //цифровые выходы для Нано
    #define S1 8 //сигнал step ШД пин № 8 (D5)
    #define D1 9 //сигнал dir ШД пин № 9 (D6)

    Ничего не перепутал?
    … А кнопки замыкают входы на землю? Надо ли какие нибудь резисторы от помех ?
    Спасибо !

    • По контактам вроде всё нормально, контакты для кнопок, настроены как «INPUT_PULLUP», т.е. подтянуты к +5 вольт, и в данном случае, нужно замыкать действительно на землю. Помех быть не должно, т.к. входы подтянуты к +5 вольтам, единственное что может быть это дребезг контактов…

      • Что-то «крокодил не ловится» — при включении чЮть поворачивается и… тишина. :-((
        Подключил так http://techclub.su/article_arduino07 … Может НанА «по-другому устроена» ? 😀

        • Собрал пока на макетке на УНЕ — всё работает ! Всё регулируется, откатывается и второй кноПкой — обратное вращение. Засада (у меня) была в отсутствии второй кнопки (не было под рукой), и движок лихорадило (наверное от помех).
          Большое СПАСИБО!

  • …контакты для кнопок, настроены как «INPUT_PULLUP», т.е. подтянуты к +5 вольт, и в данном случае, нужно замыкать действительно на землю…

    Сергей, это такой вариант (если от внутреннего источника) ?
    http://coolcode.ru/wp-content/uploads/2016/04/ArduinoButtonPullupResistor2_2_shema.jpg

    • Такой вариант позволяет внутри микроконтроллера через резистор подключать +5 вольт к входу микроконтроллера, благодаря чему если к входу ни чего не подключено, то мы имеем на входе сигнал HIGH, а если вход замыкаем с землей то LOW. Если не включать «подтяжку» т.е. вход будет просто как INPUT то вход микроконтроллера будет аналогичен антенне, ловящей всевозможные магнитные волны, в случае отсутствия подключения к земле, или питанию.

      • на рисунке такая-же реализация, как и в микроконтроллере применяется.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

*

code

Protected with IP Blacklist CloudIP Blacklist Cloud