Arduino i obsługa silnika krokowego

Czyli co i jak podłączyć żeby działało
Awatar użytkownika
marek91
Administrator
Postów w temacie: 8
Posty: 2563
Rejestracja: 15 kwie 2016, 21:22
Lokalizacja: Gostyń
x 1208
Kontakt:

Arduino i obsługa silnika krokowego

Post autor: marek91 »

Słowem wstępu - jak chodzi o jakiekolwiek programowanie (niezależnie od języka) to jestem noobem na całej linii. :DD

Potrzebuję uruchomić silnik krokowy na arduino nano, przejrzałem przykładowe programy, niestety, nie każdy z nich ma budowę którą bym rozumiał :| Jeśli w programie jest rozpiska każdego kroku z osobna to spoko - rozumiem, jednak zanim w ten sposób zaprogramuje ardiuno to braknie mi pamięci :rotfl:

Na sam początek potrzebuję prostą sekwencję
-1.6 obrotu w lewo
-czekaj 1s
-1.4 obrotu w prawo
-czekaj 30s

całość w pętli :)
Proste? Proste! Ale nie dla mnie :rotfl2:

W internecie znalazłem taki program; przez chwilę myślę sobie... będzie dobrze, coś rozumiem więc dam radę sobie to zmodyfikować, wgrałem oryginalny program - niestety silnik nie ruszył :blush:

Kod: Zaznacz cały

#define IN1  8
#define IN2  9
#define IN3  10
#define IN4  11
#define STEPS_PER_ROTATION 4096

void setup()
{
  pinMode(IN1, OUTPUT);
  pinMode(IN2, OUTPUT);
  pinMode(IN3, OUTPUT);
  pinMode(IN4, OUTPUT);
  delay(100);
}

void loop()
{
  rotate(1.5);
  delay(2000);
  rotate(-1.5);
  delay(2000);
}

void rotate(float rotations) {
  rotate_steps(rotations * STEPS_PER_ROTATION);
}

int phase = 0;
byte phases[] = { 1, 3, 2, 6, 4, 12, 8, 9 };

void rotate_steps(int steps)
{
  int dir = (steps > 0) - (steps < 0);
  steps *= dir;
  long laststep;
  for (int i = 0; i < steps;) {
    long now = micros();
    if (now - laststep < 1000) continue;
    laststep = now;
    stepper_writepins(phases[phase]);
    phase = (8 + phase + dir) % 8;
    i++;
  }
  stepper_writepins(0);
}

void stepper_writepins(int bitmap) {
    digitalWrite(IN1, bitmap & 8 ? HIGH : LOW);
    digitalWrite(IN2, bitmap & 4 ? HIGH : LOW);
    digitalWrite(IN3, bitmap & 2 ? HIGH : LOW);
    digitalWrite(IN4, bitmap & 1 ? HIGH : LOW);
}
Awatar użytkownika
FlameRunner
Zasłużony
Postów w temacie: 1
Posty: 6568
Rejestracja: 15 kwie 2016, 21:26
x 2056

Re: Arduino i obsługa silnika krokowego

Post autor: FlameRunner »

Może po prostu weź normalną drukarkową elektronikę? Oczywiście będzie to overkill, ale w pięć minut ogarniesz.
Awatar użytkownika
marek91
Administrator
Postów w temacie: 8
Posty: 2563
Rejestracja: 15 kwie 2016, 21:22
Lokalizacja: Gostyń
x 1208
Kontakt:

Re: Arduino i obsługa silnika krokowego

Post autor: marek91 »

Akurat w przypadku tego projektu będzie to overkill totalny i w dodatku nie rozwiąże problemu :)
Awatar użytkownika
dragonn
Zasłużony
Postów w temacie: 3
Posty: 6384
Rejestracja: 12 gru 2016, 21:50
Lokalizacja: Opole
Drukarka: LUME
x 1455

Re: Arduino i obsługa silnika krokowego

Post autor: dragonn »

Używasz do tego stepsticka czy coś innego?
Awatar użytkownika
marek91
Administrator
Postów w temacie: 8
Posty: 2563
Rejestracja: 15 kwie 2016, 21:22
Lokalizacja: Gostyń
x 1208
Kontakt:

Re: Arduino i obsługa silnika krokowego

Post autor: marek91 »

Najprostszy silnik krokowy ze sterownikiem.
sss.jpg
sss.jpg (27.48 KiB) Przejrzano 5647 razy
Awatar użytkownika
dragonn
Zasłużony
Postów w temacie: 3
Posty: 6384
Rejestracja: 12 gru 2016, 21:50
Lokalizacja: Opole
Drukarka: LUME
x 1455

Re: Arduino i obsługa silnika krokowego

Post autor: dragonn »

Ja zarzucę na początek tymi dwoma linkami:
https://www.arduino.cc/en/Reference/Stepper
http://playground.arduino.cc/Main/CustomStepper

Próbowałeś tych biblotek?
Awatar użytkownika
marek91
Administrator
Postów w temacie: 8
Posty: 2563
Rejestracja: 15 kwie 2016, 21:22
Lokalizacja: Gostyń
x 1208
Kontakt:

Re: Arduino i obsługa silnika krokowego

Post autor: marek91 »

Te linki i wiele innych już widziałem, co do bibliotek, jedyne co o nich wiem to wiem że są, to by było na tyle.
Chyba zrobię tak że sekwencje kroków lewo/prawo wpiszę w pętlę for z wykonaniem X razy.
Awatar użytkownika
dragonn
Zasłużony
Postów w temacie: 3
Posty: 6384
Rejestracja: 12 gru 2016, 21:50
Lokalizacja: Opole
Drukarka: LUME
x 1455

Re: Arduino i obsługa silnika krokowego

Post autor: dragonn »

Też można, tzw. droga na piechotę, ale ja preferuję użycie bibloteki. https://www.arduino.cc/en/Guide/Libraries tutaj masz jak dodawać sobie bibloteki do Arduino, jest to bardzo wygodne i zazwyczaj te bibloteki działają bardzo dobrze.

EDIT

Bibloteka Stepper jest już nawet zainstalowana domyślnie z tego co widzę.
Awatar użytkownika
samezrp
Postów w temacie: 4
Posty: 1023
Rejestracja: 29 paź 2016, 15:57
x 66

Re: Arduino i obsługa silnika krokowego

Post autor: samezrp »

Na 100% mam w domu na ten zestaw proste oprogramowanie w C na AVR. Arduino to AVR na C podobnym IDE, więc nie powinno być kłopotu z przepisaniem. Jeśli do 18 nie będziesz miał rozwiązania, to sprawdzę. Rozumiem, że 1,6 obrotu to 320 kroków, 1,4 to 280 kroków. Szybkość nie ma znaczenia?

Na szybko znalazłem w C ten kod w pracy. Przyciski do sterowania, robisz pętle i delay'e w razie co. Silnik podłączony do portu D, wystarczy w C dopisać ile kroków ma wykonywać i delayem w ms wpisać opóźnienia:

Kod: Zaznacz cały

int main(void)
{
  sbi(DDRB,1);
  cbi(PORTB,1);
  delayms(100);

   // PD.1 - PD.4 jako wyjścia
   DDRD = 0x0f;
   // PORTC jako wejścia
   DDRC = 0x00;
   // Przycisk do 1 i 2 pinu PORTC
   PORTC = 0x0f;

   // numer kroku
   uint8_t krok = 0;
   // tablica kroków 
   static const uint8_t krok_map[8] = { 0b1000, 0b1100, 0b0100, 0b0110, 0b0010, 0b0011, 0b0001, 0b1001 }; //ok
      
   while(1)
   {
      if(!(PINC & 0x01))
		if(PINC & 0x04)
			krok++;
      
	  if(!(PINC & 0x02))
		if(PINC & 0x08)
			krok--;

      PORTD = krok_map[krok & 7];

  _delay_ms(1);

   }
Awatar użytkownika
marek91
Administrator
Postów w temacie: 8
Posty: 2563
Rejestracja: 15 kwie 2016, 21:22
Lokalizacja: Gostyń
x 1208
Kontakt:

Re: Arduino i obsługa silnika krokowego

Post autor: marek91 »

samezrp, tak jak z arduino rozumiem 1% tak tutaj rozumiem 0,0001% xD

Chyba powoli zaczynam to wszystko kumać, zrobiłem coś takiego; jeśli niczego niepokićkałem to program zrobi 100x krok który opisłam a później odczeka 10s i zacznie od początku... Wieczorem przetestuję, jeśli to zatrybi to będę w domu :D

Kod: Zaznacz cały

int motorPin1 = 8;
int motorPin2 = 9;
int motorPin3 = 10;
int motorPin4 = 11;
int delayTime = 500;

void setup() {
  pinMode(motorPin1, OUTPUT);
  pinMode(motorPin2, OUTPUT);
  pinMode(motorPin3, OUTPUT);
  pinMode(motorPin4, OUTPUT);
}

void loop()
{
  
 for (int x = 0; x < 100; x++) { 
  
  digitalWrite(motorPin1, HIGH);
  digitalWrite(motorPin2, LOW);
  digitalWrite(motorPin3, LOW);
  digitalWrite(motorPin4, LOW);
  delay(1);
  digitalWrite(motorPin1, HIGH);
  digitalWrite(motorPin2, HIGH);
  digitalWrite(motorPin3, LOW);
  digitalWrite(motorPin4, LOW);
  delay(1);
  digitalWrite(motorPin1, LOW);
  digitalWrite(motorPin2, HIGH);
  digitalWrite(motorPin3, LOW);
  digitalWrite(motorPin4, LOW);
  delay(1);
  digitalWrite(motorPin1, LOW);
  digitalWrite(motorPin2, HIGH);
  digitalWrite(motorPin3, HIGH);
  digitalWrite(motorPin4, LOW);
  delay(1);
  digitalWrite(motorPin1, LOW);
  digitalWrite(motorPin2, LOW);
  digitalWrite(motorPin3, HIGH);
  digitalWrite(motorPin4, LOW);
  delay(1);
  digitalWrite(motorPin1, LOW);
  digitalWrite(motorPin2, LOW);
  digitalWrite(motorPin3, HIGH);
  digitalWrite(motorPin4, HIGH);
  delay(1);
  digitalWrite(motorPin1, LOW);
  digitalWrite(motorPin2, LOW);
  digitalWrite(motorPin3, LOW);
  digitalWrite(motorPin4, HIGH);
  delay(1);
  digitalWrite(motorPin1, HIGH);
  digitalWrite(motorPin2, LOW);
  digitalWrite(motorPin3, LOW);
  digitalWrite(motorPin4, HIGH);
  delay(1);
}

delay(10000);
}
Z pamiętnika elektronika "Panie, jak ja byłem młody to musiałem sobie płytkę wytrawić na sam pierw i AVRa w basicu zaprogramować przez LPT w kompie a tera to tylko te ardrutino..."
ODPOWIEDZ

Wróć do „Elektronika sterująca, wyświetlacze”