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

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

Задача контроллера состоит в том что-бы генерировать импульсы 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);
}

 

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

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

*

code

Protected with IP Blacklist CloudIP Blacklist Cloud