• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
Dozownik cieczy
#1
Witajcie,
Od jakiegoś czasu pracuję nad dozownikiem cieczy, na który składa się zawór obrotowy napędzany przez silnik krokowy oraz pompy perystaltycznej napędzanej silnikiem DC. Kontrola silnika krokowego jest realizowana za pośrednictwem modułu Pololu A4988 i biblioteki AccelStepper ( http://www.airspayce.com/mikem/arduino/AccelStepper/ ), natomiast za sterowanie obrotami silnika DC odpowiada moduł Pololu MAX14870. Oczywiście nad wszystkim czuwa Arduino UNO. Zasada działania takiego urzadzenia jest dość prosta: obracajacy się silnik DC napędza pompę, która zasysa jeden z siedmiu roztworów, natomiast o tym, który to jest roztwór decyduje pozycja w jakiej znajduje się silnik krokowy (wiem,że to trochę ciężko sobie wyobrazić bez zdjęcia pogladowego, ale pozwólcie, że takowe zamieszczę gdy już wszystko będzie gotowe, bo sa tam jeszcze dodatkowe elementy jak czujniki temperatury, moduł bluetooth czy wyświetlacz oled, dlatego tym razem skupię sie tylko na sterowaniu mechanika). Wszystko działa bez problemu gdy ręcznie steruje poszczególnymi elementami. Tzn. przez serial wysyłam symbol 'c' i silnik krokowy ustawia się w pozycji 1, wysyłam 'd' i silnik ustawia się w pozycji 2 itd. Problem pojawia się gdy piszę kot, w którym urzdzenie bedzie pracowała w sposób autonomiczny. Tzn. wysyłam symbol 'a' i urzadzenie rozpoczyna pracę. Najpierw silnik krokowy ustawia się w pozycji 1 a po upływie pewnego czasu przechodzi do pozycji 2 itd. Wstępnie jest to zrealizowane za pomoc delay() więc jak już wystartuje, to zatrzymać go można tylko poprzez reset, a chciałbym mieć możliwość przerwania takiego programu np. poprzez wysłanie symbolu 'b'. Rozważałem możliwość użycia jednej spośród sekstyliarda dostepnych bibliotek typu Tiamer, ale możliwość ich użycia w projekcie innym niż miganie dioda nie jest dla mnie do końca zrozumiałe. Może ktoś z was wie jak to zastosować w moim projekcie, ewentualnie zna podobne projekty, o których mógłbym sobie poczytać?
Całość kodu prezentuje się następujaco:


Kod:
#include <AccelStepper.h>

int motorPin = 11;
int dirPin = 12;
int motorDirPin = 7;
int motorStepPin = 6;

AccelStepper stepper(1, motorStepPin, motorDirPin);  


void setup()
{  
  pinMode(motorPin, OUTPUT);
  pinMode(dirPin, OUTPUT);
  stepper.setMaxSpeed(9600.0);
  stepper.setAcceleration(10000.0);
  Serial.begin(9600);
  }

void loop(){


if(Serial.available() > 0){     
     }

if (Serial.read() == 'a') {   
  digitalWrite(dirPin, HIGH);
  analogWrite(motorPin, 244);
  delay(2000);
  stepper.runToNewPosition(0);
  delay(60000);
  analogWrite(motorPin, 0);
  delay(10 * 1000);             //T1

  digitalWrite(dirPin, HIGH);
  analogWrite(motorPin, 244);
  delay(2000);
  stepper.runToNewPosition(256);
  delay(60000);
  analogWrite(motorPin, 0);
  delay(12 * 1000);             //T2

  digitalWrite(dirPin, HIGH);
  analogWrite(motorPin, 244);
  delay(2000);
  stepper.runToNewPosition(512);
  delay(60000);
  analogWrite(motorPin, 0);
  delay(15 * 1000);             //T3

  digitalWrite(dirPin, HIGH);
  analogWrite(motorPin, 244);
  delay(2000);
  stepper.runToNewPosition(768);
  delay(60000);
  analogWrite(motorPin, 0);
  delay(20 * 1000);             //T4

  digitalWrite(dirPin, HIGH);
  analogWrite(motorPin, 244);
  delay(2000);
  stepper.runToNewPosition(1024);
  delay(60000);
  analogWrite(motorPin, 0);
  delay(23 * 1000);             //T5

  digitalWrite(dirPin, HIGH);
  analogWrite(motorPin, 244);
  delay(2000);
  stepper.runToNewPosition(1280);
  delay(60000);
  analogWrite(motorPin, 0);
  delay(25 * 1000);              //T6

  digitalWrite(dirPin, HIGH);
  analogWrite(motorPin, 244);
  delay(2000);
  stepper.runToNewPosition(1536);
  delay(60000);
  analogWrite(motorPin, 0);
  delay(27 * 1000);               //T7

  digitalWrite(dirPin, HIGH);
  analogWrite(motorPin, 244);
  delay(2000);
  stepper.runToNewPosition(0);
  delay(60000);
  analogWrite(motorPin, 0);
   
}
   
if (Serial.read() == 'b') {
  stepper.runToNewPosition(0);
  analogWrite(motorPin, 0);
  }
 
 }


Chodzi mi głównie o wyeliminowanie delay() zaznaczonych komentarzami T1, T2 do T7, bo w ostatecznym projekcie będa liczone w godzinach.

Z góry dziękuję za wasza pomoc i przepraszam za ewentualne błędy z mojej strony, ale kultura i zwyczaje na forum nie sa dla mnie jeszcze dobrze znane.

Pozdrawiam,
 
Odpowiedź
  


Wiadomości w tym wątku
Dozownik cieczy - przez tanderer - 23-02-2017, 14:43
RE: Dozownik cieczy - przez namok - 23-02-2017, 15:31
RE: Dozownik cieczy - przez tanderer - 27-02-2017, 22:18
RE: Dozownik cieczy - przez namok - 27-02-2017, 23:59
RE: Dozownik cieczy - przez tanderer - 28-02-2017, 00:41
RE: Dozownik cieczy - przez Smaczek - 28-02-2017, 08:25
RE: Dozownik cieczy - przez tanderer - 28-02-2017, 20:11
RE: Dozownik cieczy - przez namok - 28-02-2017, 20:38

Skocz do:


Przeglądający: 1 gości