Strona 1 z 2
Program do obsługi jednego silnika
: 11 mar 2013, 22:15
autor: grzechu
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

: 12 mar 2013, 07:39
autor: krzysiekgrab
Ja bym to zrobił na PLC. można na próbę wykorzystać program mach3 ( na pewno ruszy, ale pozostaje kwestia licencji)
: 12 mar 2013, 08:45
autor: pukury
: 12 mar 2013, 09:07
autor: Zienek
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)?
: 12 mar 2013, 09:23
autor: grzechu
Dzięki za zainteresowanie tematem
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)
: 05 kwie 2013, 23:00
autor: grzechu
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ść

i wskazanie mi ewentualnych błędów które bedę popełniał lub może już popełniłem
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?
: 06 kwie 2013, 14:15
autor: Zienek
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);
}
: 06 kwie 2013, 15:38
autor: grzechu
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)?
: 06 kwie 2013, 19:48
autor: Zienek
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.
: 06 kwie 2013, 19:54
autor: grzechu
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

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;
}