Program do obsługi jednego silnika

Rozmowy dotyczące oprogramowania sterującego maszynami CNC i sterowników CNC obrabiarek numerycznych

Autor tematu
grzechu
Sympatyk forum poziom 2 (min. 50)
Sympatyk forum poziom 2 (min. 50)
Posty w temacie: 8
Posty: 67
Rejestracja: 30 paź 2005, 19:44
Lokalizacja: Golubkowo
Kontakt:

Program do obsługi jednego silnika

#1

Post napisał: grzechu » 11 mar 2013, 22:15

Szukam programu do obsługi jednego silnika krokowego, z pewnym "ale". Chciałbym aby działał jako "półautomat"
Już wyjaśniam na czym miałoby to polegać.
Silnik miałby wykonywać cyklicznie określoną liczbę kroków (w moim przypadku obrotów) z zadaną prędkością, ale start cyklu miałby odbywać się nie poprzez kliknięcie myszką na start, ale miałby być wyzwalany wejściem.
Znalazłem jakiś prosty programik w którym ustala się ilość kroków i prędkość ale brakuje mi właśnie tego "półautomatu"
Chcę po prostu uniknąć denerwującego ciągłego klikania w start programu
Może ktoś z Was widział taki programik, lub mógłby coś takiego "popełnić" to będe bardzo zobowiązany :wink:



Tagi:


krzysiekgrab
Specjalista poziom 3 (min. 600)
Specjalista poziom 3 (min. 600)
Posty w temacie: 1
Posty: 741
Rejestracja: 16 lip 2008, 15:07
Lokalizacja: Polska, Augustow

#2

Post napisał: krzysiekgrab » 12 mar 2013, 07:39

Ja bym to zrobił na PLC. można na próbę wykorzystać program mach3 ( na pewno ruszy, ale pozostaje kwestia licencji)
„Jeżeli nie znasz portu do którego płyniesz,
to żadne wiatry nie będą Ci sprzyjać”

Programowanie sterowników PLC Fatek, HMI Weintek, sterowniki maszyn CNC, Mach3;


pukury
Lider FORUM (min. 2000)
Lider FORUM (min. 2000)
Posty w temacie: 1
Posty: 7608
Rejestracja: 23 lis 2004, 22:41
Lokalizacja: kraków

#3

Post napisał: pukury » 12 mar 2013, 08:45

witam.
może zastosuj takie coś - http://www.cnczone.com/forums/open_sour ... dexer.html
pozdrawiam.
Mane Tekel Fares

Awatar użytkownika

Zienek
Lider FORUM (min. 2000)
Lider FORUM (min. 2000)
Posty w temacie: 3
Posty: 3730
Rejestracja: 13 gru 2008, 19:32
Lokalizacja: Szczecin
Kontakt:

#4

Post napisał: Zienek » 12 mar 2013, 09:07

Czy ilość kroków jest zmienna?
Czy zawsze tyle samo.
To musi być zrobione na system operacyjny, czy może być na systemie wbudowanym (Arm / Arduino)?


Autor tematu
grzechu
Sympatyk forum poziom 2 (min. 50)
Sympatyk forum poziom 2 (min. 50)
Posty w temacie: 8
Posty: 67
Rejestracja: 30 paź 2005, 19:44
Lokalizacja: Golubkowo
Kontakt:

#5

Post napisał: grzechu » 12 mar 2013, 09:23

Dzięki za zainteresowanie tematem :wink:

Do testów dobrze by było mieć możliwość regulacji ilości kroków ale docelowo potrzebował będę stała ilość

Generalnie chciałem testować na PC ale z odpowiedzi wnioskuję (i w sumie dla mnie nawet lepiej) że mógłby to być zewnętrzny kontroler tyle że dobrze by było abym mógł programować go z zewnątrz (np do regulacji tych ilości kroków)


Autor tematu
grzechu
Sympatyk forum poziom 2 (min. 50)
Sympatyk forum poziom 2 (min. 50)
Posty w temacie: 8
Posty: 67
Rejestracja: 30 paź 2005, 19:44
Lokalizacja: Golubkowo
Kontakt:

#6

Post napisał: grzechu » 05 kwie 2013, 23:00

Tak jak pisałem już w tym temacie https://www.cnc.info.pl/topics12/sterow ... htm#332190 zdecydowałem się na Arduino
Dzisiaj w końcu znalazłem trochę czasu na podłączenie sterownika i silnika do płytki Arduino
Naskrobałem taki oto prosty kod

Kod: Zaznacz cały

AccelStepper stepper(1, 8, 7);  

void setup() {  
  stepper.setMaxSpeed(1000);    
  stepper.setAcceleration(2000);   
  stepper.moveTo(2000); 
} 

void loop(){ 
  stepper.run();  
}
To moje początki w programowaniu więc bardzo proszę o cierpliwość :wink: i wskazanie mi ewentualnych błędów które bedę popełniał lub może już popełniłem :smile:
A więc wracając do powyższego kodu.
Po uruchomieniu silnik wykonuje zadana liczbę kroków tak jak sobie zaplanowałem.
Teraz chciałbym zapytać kolegów jak wprawiać silnik ponownie w ten sam ruch po przyciśnięciu swicha?

Awatar użytkownika

Zienek
Lider FORUM (min. 2000)
Lider FORUM (min. 2000)
Posty w temacie: 3
Posty: 3730
Rejestracja: 13 gru 2008, 19:32
Lokalizacja: Szczecin
Kontakt:

#7

Post napisał: Zienek » 06 kwie 2013, 14:15

Dodaj obsługę przycisku.

http://arduino.cc/en/tutorial/button

Na kliknięcie przycisku wywołaj funkcję runMyCrazyPony()

która wygląda mniej więcej tak:

Kod: Zaznacz cały

runMyCrazyPony(){ 
  stepper.moveTo(2000); 
  while(stepper.currentPosition() != 2000 ){ 
    stepper.run();  
  } 
  stepper.setCurrentPosition(0); 
} 


Autor tematu
grzechu
Sympatyk forum poziom 2 (min. 50)
Sympatyk forum poziom 2 (min. 50)
Posty w temacie: 8
Posty: 67
Rejestracja: 30 paź 2005, 19:44
Lokalizacja: Golubkowo
Kontakt:

#8

Post napisał: grzechu » 06 kwie 2013, 15:38

Zienek, wielkie dzięki
Przycisk dodałem już sobie rano ale motałem się jeszcze z tą funkcją

Mam jeszcze jedno pytanko

W obecnej chwili przy wciśniętym przycisku silnik robi określoną liczbę kroków zatrzymuje się na chwilę i robi kolejną sekwencję.
A jak zrobić aby silnik czekał na kolejne przyciśnięcie (czyli jedno przyciśnięcie = jedna sekwencja kroków)?

Awatar użytkownika

Zienek
Lider FORUM (min. 2000)
Lider FORUM (min. 2000)
Posty w temacie: 3
Posty: 3730
Rejestracja: 13 gru 2008, 19:32
Lokalizacja: Szczecin
Kontakt:

#9

Post napisał: Zienek » 06 kwie 2013, 19:48

Poszukaj rozwiązań z debouncingiem - kombinuj, jak sprawdzić stan wciśnięcia guzika, bo to może o to chodzić.
Ew. czy robi taką samą sekwencję, czy wraca do zera?
Zamieść kod.


Autor tematu
grzechu
Sympatyk forum poziom 2 (min. 50)
Sympatyk forum poziom 2 (min. 50)
Posty w temacie: 8
Posty: 67
Rejestracja: 30 paź 2005, 19:44
Lokalizacja: Golubkowo
Kontakt:

#10

Post napisał: grzechu » 06 kwie 2013, 19:54

Dzięki za kolejne wskazówki
Sekwencję robi poprawną, nie wraca do zera.

Kod mam taki

Kod: Zaznacz cały

#include <AccelStepper.h> 

AccelStepper stepper(1, 8, 7);  
int pin_przycisk = A5; 
int ilosc_krokow = 500;  

void setup() {  
  stepper.setMaxSpeed(500);    
  stepper.setAcceleration(10000);    
  pinMode(pin_przycisk, INPUT_PULLUP); 
    
} 

void loop(){ 
  int przycisk = digitalRead(pin_przycisk); 
    if(przycisk == LOW){ 
     stepper.moveTo(ilosc_krokow); 
     while(stepper.currentPosition() != ilosc_krokow){ 
        stepper.run(); 
     } 
    } 
    stepper.setCurrentPosition(0); 
  
}


[ Dodano: 2013-04-06, 22:37 ]
Zienek dzięki Twoim wskazówkom w końcu udało mi się uzyskać to co chciałem :grin:
Dzięki wielkie za pomoc
Wklejam kod w celu sprawdzenia bo ja to robiłem trochę na "czuja"

Kod: Zaznacz cały

#include <AccelStepper.h> 

const int buttonPin = A5;     
const int ledPin =  13;      

int buttonState;             
int lastButtonState = LOW;   

long lastDebounceTime = 0;  
long debounceDelay = 50;    

AccelStepper stepper(1, 8, 7);  

int steps = 2000; 

void setup() { 
  stepper.setMaxSpeed(500);    
  stepper.setAcceleration(10000);    
  
  pinMode(buttonPin, INPUT_PULLUP); 
  pinMode(ledPin, OUTPUT); 
    //Serial.begin(9600); 
} 

void loop() { 
  int reading = digitalRead(buttonPin); 
  if (reading != lastButtonState) { 
    lastDebounceTime = millis(); 
      if (buttonState == HIGH) { 
        stepper.moveTo(steps); 
          while(stepper.currentPosition() != steps){ 
          stepper.run(); 
          digitalWrite(ledPin, HIGH); 
          } 
        stepper.setCurrentPosition(0); 
        digitalWrite(ledPin, LOW); 
      } 
  } 

  if ((millis() - lastDebounceTime) > debounceDelay) { 
    buttonState = reading; 
  } 
  lastButtonState = reading; 
} 

ODPOWIEDZ Poprzedni tematNastępny temat

Wróć do „Ogólne Dyskusje na Temat Systemów Sterowania CNC”