Нужна помощь в правке скетча для Ардуино

serguneek
Offline
Зарегистрирован: 24.07.2017

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

как сейчас работают кнопки

1-ая кнопка (которая ближе к носику шприца) Нажали-мотор крутит постоянно,отпустили- мотор не крутит.

2-ая кнопка (дальняя) нажали-отпустили---поршень давит капельку пасты примерно за одну секунду, повторно нажали-отпустили--- мотор не крутит.

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

всё брал тут

Комрады, я знаю ЯП сила, и надеюсь на вашу помощь. Сам я несколько не программист, могу паять,чинить,пилить,чпу станок построить, но вот с программированием не знаком.

Кто может подправить скетч так что-бы на первой кнопки помимо выдавливания был ещё и реверс ? 

примерно по такому алгоритму

1-ая кнопка (которая ближе к носику шприца) Нажали-мотор крутит постоянно и давит пасту,отпустили- мотор делает пару/тройку оборотов назад и останавливается, при повторном нажатии опять давим пасту,ещё раз нажали- отор делает пару/тройку оборотов назад и останавливается. 

сам скетч



#include <Stepper.h>



#define OFF 0

#define STEP 1

#define RUN 2



// Device connections

#define TRIM 7 // Analog A7

#define LED 13 // Digital D13

#define BT2 14 // Digital D14

#define BT1 15 // Digital D15

#define MYLW 16 // Digital D16

#define MORG 17 // Digital D17

#define MPNK 18 // Digital D18

#define MBLU 19 // Digital D19



#define PRESSDELAY 150

#define STEPPERDELAY 1500



const int stepsPerRevolution = 2048;



volatile unsigned char stepperState = OFF;



Stepper stepper(stepsPerRevolution, MBLU, MYLW, MPNK, MORG);



void setup() {

pinMode(LED, OUTPUT);



// Pin change interrupt configuration:

// BT2 = D14/A0 (Pin PC0 = PCINT8)

// BT1 = D15/A1 (Pin PC1 = PCINT9)

PCMSK1 |= (1<<PCINT8) | (1<<PCINT9);

PCICR |= (1<<PCIE1);

sei();



stepper.setSpeed(10);

}



void loop() {

int trimpot = 0;

double revMultiplier = 0.0; 



trimpot = analogRead(TRIM);

revMultiplier = map(trimpot, 1023, 0, 1, 100);

revMultiplier /= 1000.0;



switch (stepperState) {

case STEP:

PCICR &= ~(1<<PCIE1);



stepper.step((int) (revMultiplier * stepsPerRevolution));

while (!(PINC & (1<<PC0)))

stepper.step(64);



PCICR |= (1<<PCIE1);

break;

case RUN:

while (stepperState == RUN) {

stepper.step((int) (revMultiplier * stepsPerRevolution));



delay(STEPPERDELAY);

}

break;

default:

break;

}



stepperState = OFF;

}



ISR(PCINT1_vect)

{

int i = 0;



// Button 2 interrupt

if (!(PINC & (1<<PC0))) {

digitalWrite(LED, HIGH);



for (i = 0; i < PRESSDELAY; i++)

delayMicroseconds(1000);



if (stepperState == OFF)

stepperState = STEP; 



digitalWrite(LED, LOW);





// Button 1 interrupt

else if (!(PINC & (1<<PC1))) {

digitalWrite(LED, HIGH);



for (i = 0; i < PRESSDELAY; i++)

delayMicroseconds(1000);



if (stepperState == OFF)

stepperState = RUN;

else if (stepperState == RUN)

stepperState = OFF;



digitalWrite(LED, LOW);

}

}

 

renoshnik
Offline
Зарегистрирован: 11.04.2013
inspiritus
Offline
Зарегистрирован: 17.12.2012

Для начала научитесь правильно постить код по правилам форума

serguneek
Offline
Зарегистрирован: 24.07.2017
#include <Stepper.h>

#define OFF   0
#define STEP  1
#define RUN   2

// Device connections
#define TRIM  7   // Analog A7
#define LED   13  // Digital D13
#define BT2   14  // Digital D14
#define BT1   15  // Digital D15
#define MYLW  16  // Digital D16
#define MORG  17  // Digital D17
#define MPNK  18  // Digital D18
#define MBLU  19  // Digital D19

#define PRESSDELAY    150
#define STEPPERDELAY  1500

const int stepsPerRevolution = 2048;

volatile unsigned char stepperState = OFF;

Stepper stepper(stepsPerRevolution, MBLU, MYLW, MPNK, MORG);

void setup() {
  pinMode(LED, OUTPUT);

  // Pin change interrupt configuration:
  // BT2 = D14/A0 (Pin PC0 = PCINT8)
  // BT1 = D15/A1 (Pin PC1 = PCINT9)
  PCMSK1 |= (1<<PCINT8) | (1<<PCINT9);
  PCICR |= (1<<PCIE1);
  sei();

  stepper.setSpeed(10);
}

void loop() {
  int trimpot = 0;
  double revMultiplier = 0.0; 
  
  trimpot = analogRead(TRIM);
  revMultiplier = map(trimpot, 1023, 0, 1, 100);
  revMultiplier /= 1000.0;

  switch (stepperState) {
    case STEP:
      PCICR &= ~(1<<PCIE1);

      stepper.step((int) (revMultiplier * stepsPerRevolution));
      while (!(PINC & (1<<PC0)))
        stepper.step(64);
        
      PCICR |= (1<<PCIE1);
      break;
    case RUN:
      while (stepperState == RUN) {
        stepper.step((int) (revMultiplier * stepsPerRevolution));
        
        delay(STEPPERDELAY);
      }
      break;
    default:
      break;
  }

  stepperState = OFF;
}

ISR(PCINT1_vect)
{
  int i = 0;
  
  // Button 2 interrupt
  if (!(PINC & (1<<PC0))) {
    digitalWrite(LED, HIGH);
    
    for (i = 0; i < PRESSDELAY; i++)
      delayMicroseconds(1000);

    if (stepperState == OFF)
      stepperState = STEP;  

    digitalWrite(LED, LOW);
  } 

  // Button 1 interrupt
  else if (!(PINC & (1<<PC1))) {
    digitalWrite(LED, HIGH);
    
    for (i = 0; i < PRESSDELAY; i++)
      delayMicroseconds(1000);

    if (stepperState == OFF)
      stepperState = RUN;
    else if (stepperState == RUN)
      stepperState = OFF;

    digitalWrite(LED, LOW);
  }
}

 

serguneek
Offline
Зарегистрирован: 24.07.2017

спасибо, подправил. я только вникаю.