• 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
Kierowanie silnikiem krokowym - brak reakcji na Arduino
#1
Cześć!

Ostatnio podjąłem szybką budowę tacy obrotowej napędzanej silnikiem krokowym pod zdjęcia produktowe.
Nie jestem całkowicie zielony w konstrukcjach w Arduino, ale jestem zaledwie mini szczebel wyżej - tzn. nie raz wykorzystywałem Arduino, ale zazwyczaj wykorzystując gotowe kody - w skrajnych przypadkach podmieniając jedynie piny w kodzie.

Silnik jakiego użyłem to otrzymany od znajomego STP-42D253. Z tego co widzę to model z odzysku bez dostępnej dokumentacji. Do niego zastosowałem stepsticka A4899 - wszystko sterowane Arduino Nano. 

Po połączeniu na płytce stykowej - silnik zadziałał. A więc postanowiłem ruszyć krok dalej i dodać potencjometr - niestety nic całkowicie nie zmienił. Zacząłem sprawdzać połączenia, mierzyć napięcia - wszystko wyglądało okej. Stwierdziłem więc, że zmienię delay między krokami - to również nic nie zmieniło - ruch silnika bez zmian. Podłączyłem kilka różnych stepsticków, jak i sprawdziłem to na 3 egzemplarzach Arduino - za każdym razem to samo. Poszedłem więc krok dalej i wgrałem do Arduino "blinka" - silnik nadal działał tak samo, a więc całkowicie "nie przejmuje" się tym co robi Arduino.

Zakładając, że połączenia są poprawne - czy to może być problem samego silnika i jego zmiana na coś standardowego z dokumentacją pomoże, czy problem leży gdzieś indziej - skoro zmiany na poziomie Arduino nie mają wpływu na pracę krokowca?

Poniżej wklejam kod (zdefiniowane piny w Nano rozumiem jako D2 i D3):
Kod:
#define DIR 5
#define STP 6
#define MAX 750
//int delayTime = 100;

void setup() {
  // put your setup code here, to run once:
  pinMode(DIR, OUTPUT);
  pinMode(STP, OUTPUT);
  digitalWrite(DIR, HIGH);
}

void loop() {
  // put your main code here, to run repeatedly:
    digitalWrite(STP, HIGH);
    //delay(delayTime);
    digitalWrite(STP, LOW);
    //delay(delayTime);
    //unsigned int speedRotation = map(analogRead(A1), 0, 123, 0, MAX);
    //tone(STP, speedRotation);
}


Dzięki za rady!
 
Odpowiedź
#2
A to nie jest silnik unipolarny?
Jeśli masz problem z kodem lub sprzętem, zadaj pytanie na forum. Nie odpowiadam na PW, jeśli nie dotyczą one spraw forum lub innych tematów prywatnych.

[Obrazek: SsIndaG.jpg]
 
Odpowiedź
#3
Potencjometr nic nie zmieniał zbytnio bo masz spieprzoną funkcję "map" ADC jest zakresu 0-1024 a nie 0-123...

A po drugie sam czysty loop machanie pinem to jest sporo za dużo jak na steptika tam chyba jest max 25kHz co przyjemnie a4988
Arduino zostało wymyślone po to, by robić dobrze jedną prostą rzecz – migać diodą. 
 
Odpowiedź
#4
Zajrzyj do wątku https://forum.arduinopolska.pl/watek-acc...C5%82opoty , użyj tej biblioteki, aktualizuj prędkość tak co 100ms (bez delay).
Miło być decenianym https://buycoffee.to/kaczakat
 
Odpowiedź
#5
@Robson Kerman - jeśli dobrze widzę - tak, to silnik unipolarny. Zmierzyłem rezystancje uzwojeń i podłączyłem go zgodnie z wytycznymi znalezionymi w tutorialach, czyli skrajne uzwojenia - zgaduję, że to błąd całkowitego laika, jeśli jest to niepoprawny sposób podłączenia.

@Jarewa0606 - rozumiem, acz zmiana samego delayTime w kodzie (w przesłanej próbce jest wykomentowany, ale to po prostu efekt moich różnych prób i kombinacji po tym jak błąd już się pojawił) powinna jak rozumiem zaowocować zmianą szybkości obrotu, a to również nie zadziałało  Confused

@kaczakat - dziękuję! Już rzucam okiem - nie wiem jedynie czy wiem jak aktualizować prędkość w danym przedziale czasu bez zastosowania delay'a. Wybaczcie pytania tak totalnego laika! Wiem, że brakuje mi sporo researchu w tym temacie - nie mniej jednocześnie brak wiedzy sprawia, że nie wiem jakie pytania należy zadać by znaleźć odpowiedzi na moje pytania.

PS. Silnik ma 6 wyprowadzeń więc teoretycznie nie powinno być problemu by korzystać z niego jak z bipolarnego - jeśli dobrze rozumiem.
Gdy odepnę między arduino, a sterownikiem piny DIR i STP - nic się nie zmienia - silnik kręci się ze stałą prędkością (jedynie przy dotknięciu DIR - czasem zmienia kierunek obrotu, ale zgaduję, że nawet przypadkowe zetknięcie wprowadza zamęt i zmienia odczytany stan).
 
Odpowiedź
#6
Ostatecznie i tak może coś innego zadziała lepiej, ale ta biblioteka sprawdza się znakomicie. Przejrzyj dostępne funkcje biblioteki, na filmiku w tamtym wątku jest podobny silnik z 6 wyprowadzeniami, wybrałem dwie pary o największej rezystancji i wizualnie działa OK. Można sterować zadaną ilością kroków i prędkością, albo kazać mu się po prostu kręcić w wybraną stronę z jakąś prędkością, dużo łatwiej niż wymyślać koło.
Miło być decenianym https://buycoffee.to/kaczakat
 
Odpowiedź
#7
(14-02-2022, 13:44)kaczakat napisał(a): Ostatecznie i tak może coś innego zadziała lepiej, ale ta biblioteka sprawdza się znakomicie. Przejrzyj dostępne funkcje biblioteki, na filmiku w tamtym wątku jest podobny silnik z 6 wyprowadzeniami, wybrałem dwie pary o największej rezystancji i wizualnie działa OK. Można sterować zadaną ilością kroków i prędkością, albo kazać mu się po prostu kręcić w wybraną stronę z jakąś prędkością, dużo łatwiej niż wymyślać koło.

Rozumiem, przejrzę jeszcze, acz po prostu moje podejrzenia skierowane są na bardziej hardware'owy problem dlatego, że silnik momentalnie rusza po podłączeniu zasilania vmot oraz vcc dla stepsticka, z arduino czy też bez. Co sprawia iż nie wydaje mi się intuicyjnym, że to kod może mieć cokolwiek do powiedzenia - w podlinkowanym wątku błędy w kodzie sprawiały, że silniki nie ruszały. U mnie silnik działa ze stałą prędkością niezależnie od tego jaki jest kod, jak i od tego czy arduino wgl. jest podłączone - i to jest aspekt mnie zastanawiający. Spróbowałem już kod z tego wątku oznaczony jako faktycznie działający - bez zmian, ale pogrzebię w samej bibliotece i zobaczę, czy uda mi się cokolwiek zdziałać.
 
Odpowiedź
#8
Faktycznie dziwne zachowanie silnika krokowego, zmierz rezystancje uzwojeń, najpierw podzieliłem je na dwie grupy o wspólnym uzwojeniu, a potem wybrałem te dwa przewody o największej rezystancji w każdej grupie. Takie pary podłączyłem do sterownika, kręci się w obie strony, przyspiesza i zwalnia zgodnie z programem.
Miło być decenianym https://buycoffee.to/kaczakat
 
Odpowiedź
#9
(14-02-2022, 23:25)kaczakat napisał(a): Faktycznie dziwne zachowanie silnika krokowego, zmierz rezystancje uzwojeń, najpierw podzieliłem je na dwie grupy o wspólnym uzwojeniu, a potem wybrałem te dwa przewody o największej rezystancji w każdej grupie. Takie pary podłączyłem do sterownika, kręci się w obie strony, przyspiesza i zwalnia zgodnie z programem.
Tak też zrobiłem w pierwszym kroku. Pomiędzy uzwojeniami brak połączenia. Jedno z uzwojeń - 4,3 Ohm, drugie 4,4 Ohm'a. Środkowe odczepy uzwojeń miały mniej więcej połowę tych wartości. Odizolowałem je by mieć pewność, że nie dojdzie nigdzie do zwarcia.

Ale jeśli takie zachowanie nijak nie wydaje się być standardowe, by silnik ruszał sam w momencie gdy tylko A4988 dostaje zasilanie dla siebie i silnika - to jest to chyba dla mnie wystarczający argument by zakupić jakąś klasyczną i znaną konstrukcję. W sumie objawy wydają mi się naprowadzać w pierwszej kolejności na problem z samym stepstickiem - skoro silnik rusza - musi mieć jakiś sygnał, ale wątpię bym otrzymał 5 trefnych sztuk.

Tak więc zamawiam i dam znać - być może taka anomalia będzie ciekawostką nawet dla starych wyjadaczy!
Dzięki!
 
Odpowiedź
#10
Okej! Poradziłem sobie! Problem był z samym połączeniem jak i jego realizacji - na płytce stykowej dochodziło do gigantycznych zakłóceń.

Obecnie kod wygląda następująco:

Kod:
// Defines pins numbers
const int stepPin = 3;
const int dirPin = 2;

const int ms1Pin = 4;
const int ms2Pin = 5;
const int ms3Pin = 6;
int customDelay,customDelayMapped; // Defines variables

void setup() {
  // Sets the two pins as Outputs
  pinMode(stepPin,OUTPUT);
  pinMode(dirPin,OUTPUT);
  digitalWrite(ms1Pin, LOW);
  digitalWrite(ms2Pin, HIGH);
  digitalWrite(ms3Pin, LOW);
  digitalWrite(dirPin,HIGH); //Enables the motor to move in a particular direction
}
void loop() {
 
  customDelayMapped = speedUp(); // Gets custom delay values from the custom speedUp function
  // Makes pules with custom delay, depending on the Potentiometer, from which the speed of the motor depends
 
  digitalWrite(stepPin, HIGH);
  delayMicroseconds(customDelayMapped);
  digitalWrite(stepPin, LOW);
  delayMicroseconds(customDelayMapped);
 
}
// Function for reading the Potentiometer
int speedUp() {
  int customDelay = analogRead(A0); // Reads the potentiometer
  int newCustom = map(customDelay, 0, 1023, 6000,14000); // Convrests the read values of the potentiometer from 0 to 1023 into desireded delay values (300 to 4000)
  return newCustom; 
}

Chciałbym dodać 2 funkcjonalności - pierwsza do kontrola kierunku obrotów.
Zdefiniowałem Pin kontrolujący to przyciskiem, usunąłem określenie stanu Pinu kierunku w setupie, a następnie w void loop dodałem zapis:
Kod:
if (digitalRead(buttonPin) == HIGH)
   {
    digitalWrite(dirPin, HIGH); // spin counterclockwise
   }
   else {
    digitalWrite(dirPin, LOW); // spin clockwise button not pushed
   }

Efekt jest następujący: 

Przy stanie wysokim na pinie buttonPin - silnik kręci się odpowiednio.
Przy stanie niskim na pinie buttonPin - silnik staje w miejscu, drgając.

Dodatkowo przez pierwszą sekundę po uruchomieniu silnik zachowuje się tak jakby nie było kontroli nad nim. 
Czyli po podłączeniu zasilania obraca się przez sekundę dosyć szybko, a dopiero po chwili arduino przejmuje nad nim kontrolę i silnik zwalnia pozwalając na kontrolę potencjometrem. 

Zapewne pierwszym rozwiązaniem byłoby najpierw uruchamianie Arduino, a dopiero potem podanie napięcia v-mot do stepsticka. Czy tutaj po stronie Arduino można to rozwiązać, czy zostanie do dyspozycji jedynie zastosowanie np. mosfetu? 

Dzięki wielkie za rady!
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości