• 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
#11
Ale nie pokazujesz kodu, który nie działa, w setup powinno być pinMode( buttonPin,INPUT_PULLUP) gdy przycisk zwiera do GND, albo zrobić rezystorem 10k do VCC przy przycisku, albo rezystorem do GND gdy przycisk zwiera do VCC. No i użyj biblioteki do przycisku, np. OneButton, to Twoje zadziała tylko jak przycisk będzie trzymany, a drgania styków spowodują dziesiątki zmian decyzji przy każdym wciśnięciu.
Z biblioteką do silnika widzę się poddałeś?
Miło być decenianym https://buycoffee.to/kaczakat
 
Odpowiedź
#12
Okej! Teraz wszystko działa!

Póki co nie zagłębiałem się w bibliotekę - ona wiele zapewne ułatwi, ale najpierw chciałem zrozumieć co dokładnie robię nie tak w obecnym rozwiązaniu, skoro ono również powinno działać. Bez tej wiedzy, przeniósłbym moje błędy logiczne do etapu w którym korzystałbym z biblioteki i nadal do niczego bym nie doszedł. Teraz wszystko jest jasne i powoli zacznę zagłębiać się w Accelstepper! Ogromne dzięki!

Jeśli chodzi o start silnika - tutaj zastosowałem pin reset. Byłbym wdzięczny za sprostowanie, czy taka metoda faktycznie została przeze mnie sensownie zastosowana, czy w przyszłości się na mnie zemści. Rozłączyłem sleep z reset. Reset podłączyłem do Arduino i stan wysoki na reset rusza dopiero gdy Arduino wystartuje - do tego czasu silnik stoi przez co nie mam już problemu z niekontrolowanym obrotem w okresie pomiędzy podaniem zasilania, a startem Arduino.

Kod wygląda następująco:
Kod:
// Defines pins numbers
const int stepPin = 3;
const int dirPin = 2;
const int buttonPin = 8;
const int resetPin = 7;
const int ms1Pin = 4;
const int ms2Pin = 5;
const int ms3Pin = 6;
int customDelay,customDelayMapped; // Defines variables
int buttonState = 0;

void setup() {
  // Sets the two pins as Outputs
  pinMode(stepPin,OUTPUT);
  pinMode(dirPin,OUTPUT);
  pinMode( buttonPin,INPUT_PULLUP);
  digitalWrite(resetPin, HIGH);
  digitalWrite(ms1Pin, LOW);
  digitalWrite(ms2Pin, HIGH);
  digitalWrite(ms3Pin, LOW);
 

  //digitalWrite(dirPin,LOW); //Enables the motor to move in a particular direction
}
void loop() {
 
 
  if (digitalRead(buttonPin) == HIGH) {
   digitalWrite(dirPin, HIGH); // spin counterclockwise
   }
   else {
    digitalWrite(dirPin, LOW); // spin clockwise button not pushed
   }
  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; 
}
 
Odpowiedź
#13
Jest jakiś krótki okres czasu, gdy stan pinów jest nieustalony, może wystarczy dodać w setup na początku delay(10). Może to kwestia całego układu na stykówkach. Ja do zabawy użyłem shielda RAMP i nie zaobserwowałem takiego zachowania.
A jak wyprowadzili pin RST to by go używać. Ja akurat startowałem silnik w kodzie wcześniej wykorzystując pin ENABLE. bez tego nie działało, na płytce był podciągnięty rezystorem do VCC, dzięki temu tylko świadome podłączenie tego pinu do uC z pinem ustawionym na wyjście i wpisanym 0 uruchamiało silnik. Można też najpierw wpisać do pinu 1, a dopiero po tym ustawić go na wyjście, potem w wybranej chwili wystawić 0.
Miło być decenianym https://buycoffee.to/kaczakat
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości