Silnik krokowy + Arduino -- Jak wywołać sekwencję kroków?

Dyskusje o programowaniu mikroprocesorów.

Autor tematu
68mustang
Nowy użytkownik, używaj wyszukiwarki
Nowy użytkownik, używaj wyszukiwarki
Posty w temacie: 3
Posty: 7
Rejestracja: 14 gru 2015, 22:09
Lokalizacja: Kraków

Silnik krokowy + Arduino -- Jak wywołać sekwencję kroków?

#1

Post napisał: 68mustang » 14 gru 2015, 23:00

Witam! Robię urządzenie do mieszania drinków. Na wałkach jeździ wózek, na wózku szklanka. Powyżej zamocowane butelki. Serwo również zamocowane na wózku naciska nalewaki przymocowane do butelek. Próbuję napisać program, który po wybraniu drinka z menu pokieruje silnikiem krokowym aby podjechał w odpowiedniej kolejności pod różne butelki. Nie jestem programistą i chciałbym skorzystać z jakiegoś gotowego rozwiązania i przerobić go na swoje potrzeby. Aby nie rozlewać zawartości szklanki chciałbym skorzystać z biblioteki AccelStepper jednak przy użyciu przykładowych szkicy udaje mi się tylko wywołać ruch z punktu A to B i tyle albo bouncing. Nie wiem jak zaprogramować tam sekwencje kilku punktów.

O to jak robiłem to bez użycia biblioteki AccelStepper z przykładowym przyciskiem, po którego naciśnięciu uruchamiana była sekwencja

Kod: Zaznacz cały

#include <Servo.h>

Servo myservo;

// define the pins
#define IN1  2
#define IN2  3
#define IN3  4
#define IN4  5
#define button1 6

// define how many cycles to a full rotation
#define CYCLES_PER_ROTATION 512


void setup() 
{

  Serial.begin(9600);
  myservo.attach(9);
  myservo.write(40);
  pinMode(IN1, OUTPUT); 
  pinMode(IN2, OUTPUT); 
  pinMode(IN3, OUTPUT); 
  pinMode(IN4, OUTPUT); 
  pinMode(button1, INPUT_PULLUP);


}

void loop() 
{
  while (digitalRead(button1) == LOW) {       // kiedy naciśniemy przycisk 1 uruchamiana jest sekwencja 1
  sequence1 ();
  }
 
}

void sequence1 () {   // przykładowa sekwencja 1
  
  turns(1.5);      // podjedź do punktu
  delay(1000);
 
  myservo.write(100);    // naciśnij nalewak
  delay(3000);
  
  myservo.write(40);     // zwolnij nalewak
  delay(1000);

  turns(-0.5);   // podjedź do innego pkt ... itd..
  delay(1000);
  
  myservo.write(100);
  delay(3000);
  
  myservo.write(40);
  delay(1000);
  
  turns(-0.5);
  delay(1000);
  
  myservo.write(100);
  delay(3000);
 
  myservo.write(40);
  delay(1000);

  turns(-0.5);         // wróć do punktu bazowego
  delay(500);
  
}


void turns(float rotations)
{
  // if the rotation count is -ve then it is CCW
  Serial.println();
  Serial.print("Turning : ");
  Serial.print(rotations);
  Serial.println(" rotations");
  bool clockwise = rotations > 0;
  Serial.print("Clockwise = ");
  Serial.println(clockwise);
  // calculate how many cycles the stepper will have to make
  int cycles = rotations * CYCLES_PER_ROTATION;
  // force the cycle count to be positive
  cycles = abs(cycles);
  Serial.print("That is ");
  Serial.print(cycles);
  Serial.print(" Cycles ");
  // only move if the user specifed an actual movement
  if(rotations != 0)
  {
    if (clockwise)
    {
      Serial.println("Clockwise");
      // for each cycle
      for (int x=0; x<cycles; x++)
      {
        // for each phase
        for(int y=0; y<8; y++)
        {
          // go to phase y
          phaseSelect(y);
          // pause so the stepper has time to react
          delay(1);
        }
      }
    } else {
      Serial.println("Counter Clockwise");
      // for each cycle
      for (int x=0; x<cycles; x++)
      {
        // for each phase (backwards for CCW rotation)
        for(int y=7; y>=0; y--)
        {
          // go to phase y
          phaseSelect(y);
          // pause so the stepper has time to react
          delay(1);
        }
      }
    }
  }
  // go to the default state (all poles off) when finished
  phaseSelect(8);
  Serial.println("Done");
}

void phaseSelect(int phase)
{
  switch(phase){
     case 0:
       digitalWrite(IN1, LOW); 
       digitalWrite(IN2, LOW);
       digitalWrite(IN3, LOW);
       digitalWrite(IN4, HIGH);
       break; 
     case 1:
       digitalWrite(IN1, LOW); 
       digitalWrite(IN2, LOW);
       digitalWrite(IN3, HIGH);
       digitalWrite(IN4, HIGH);
       break; 
     case 2:
       digitalWrite(IN1, LOW); 
       digitalWrite(IN2, LOW);
       digitalWrite(IN3, HIGH);
       digitalWrite(IN4, LOW);
       break; 
     case 3:
       digitalWrite(IN1, LOW); 
       digitalWrite(IN2, HIGH);
       digitalWrite(IN3, HIGH);
       digitalWrite(IN4, LOW);
       break; 
     case 4:
       digitalWrite(IN1, LOW); 
       digitalWrite(IN2, HIGH);
       digitalWrite(IN3, LOW);
       digitalWrite(IN4, LOW);
       break; 
     case 5:
       digitalWrite(IN1, HIGH); 
       digitalWrite(IN2, HIGH);
       digitalWrite(IN3, LOW);
       digitalWrite(IN4, LOW);
       break; 
     case 6:
       digitalWrite(IN1, HIGH); 
       digitalWrite(IN2, LOW);
       digitalWrite(IN3, LOW);
       digitalWrite(IN4, LOW);
       break; 
     case 7:
       digitalWrite(IN1, HIGH); 
       digitalWrite(IN2, LOW);
       digitalWrite(IN3, LOW);
       digitalWrite(IN4, HIGH);
       break; 
     default:
       digitalWrite(IN1, LOW); 
       digitalWrite(IN2, LOW);
       digitalWrite(IN3, LOW);
       digitalWrite(IN4, LOW);
       break; 
  }
}


Wiem, że kod jest paskudny. Ale na chwilę obecną nie jestem w stanie go napisać porządniej.

Chodzi mi o to, aby przerobić go w ten sposób, by silnik krokowy rozpędzał i wyhamowywał wózek.

Będę wdzięczny za każdą pomoc :)

Pozdrawiam!



Tagi:

Awatar użytkownika

adam Fx
Lider FORUM (min. 2000)
Lider FORUM (min. 2000)
Posty w temacie: 2
Posty: 5562
Rejestracja: 04 lip 2004, 16:03
Lokalizacja: Gliwice

#2

Post napisał: adam Fx » 14 gru 2015, 23:49

Tu było trochę o rampie https://www.cnc.info.pl/topics65/rampa- ... t35799.htm ale niewiele z tego rozumie (a cześć filmików linków nie działa)
sorki za wszystkie błędy ... (dyslektyk) :?
Zobacz moje filmy http://www.youtube.com/user/pokachontass/videos

Awatar użytkownika

pitsa
Moderator
Lider FORUM (min. 2000)
Lider FORUM (min. 2000)
Posty w temacie: 1
Posty: 4653
Rejestracja: 13 wrz 2008, 22:40
Lokalizacja: PL,OP

#3

Post napisał: pitsa » 15 gru 2015, 07:36

użyj setAcceleration()

i takich konstrukcji bezwzględnego "adresowania" pozycji jak:

Kod: Zaznacz cały

 silnik.moveTo(100);  while ( silnik.currentPosition() != 100 ) { silnik.run(); }
lub względnego :

Kod: Zaznacz cały

  silnik.moveTo(silnik.currentPosition()+100);
  while ( silnik.distanceToGo()!=0 ) { silnik.run(); }
zachowanie spokoju oznacza zdolności do działania
ᐃ 🜂 ⃤ ꕔ △ 𐊅 ∆ ▵ ߡ


Autor tematu
68mustang
Nowy użytkownik, używaj wyszukiwarki
Nowy użytkownik, używaj wyszukiwarki
Posty w temacie: 3
Posty: 7
Rejestracja: 14 gru 2015, 22:09
Lokalizacja: Kraków

Jakie zębatki i paski?

#4

Post napisał: 68mustang » 15 gru 2015, 13:16

Udało się. Oto aktualny kod:

Kod: Zaznacz cały

#include <AccelStepper.h>
#include <Servo.h>

Servo myservo;
 
#define FULLSTEP 4
#define HALFSTEP 8
#define button1 6

//pozycje
const int base = 0;
const int pump1 = 1024;
const int pump2 = 2048;
const int pump3 = 4096;


//declare variables for the motor pins
int motorPin1 = 2;      // Blue   - 28BYJ48 pin 1
int motorPin2 = 3;      // Pink   - 28BYJ48 pin 2
int motorPin3 = 4;     // Yellow - 28BYJ48 pin 3
int motorPin4 = 5;     // Orange - 28BYJ48 pin 4                       
 
// The sequence 1-3-2-4 required for proper sequencing of 28BYJ48
AccelStepper stepper(FULLSTEP, motorPin1, motorPin3, motorPin2, motorPin4);
 
void setup()
{    
  myservo.attach(9);
  myservo.write(40);
  stepper.setMaxSpeed(1000.0);
  stepper.setAcceleration(500.0);
  stepper.setSpeed(100);
  pinMode(button1, INPUT_PULLUP);
  
}
 
void loop()
{

  while (digitalRead(button1) == LOW) {       // kiedy naciśniemy przycisk 1 uruchamiana jest sekwencja 1
  sequence1 ();
  }
    
}

void sequence1 () {
  
    stepper.moveTo(pump2);
    stepper.runToPosition();
    delay(500);
    pumpRun ();
    stepper.moveTo(pump3);
    stepper.runToPosition();
    delay(500);
    pumpRun ();
    stepper.moveTo(pump1);
    stepper.runToPosition();
    pumpRun ();
    delay(500);
    stepper.moveTo(base);
    stepper.runToPosition();
    delay(1000);
    
}

void pumpRun () {
  
  myservo.write(100);    // naciśnij nalewak
  delay(4000);
  
  myservo.write(40);     // zwolnij nalewak
  delay(1000);

}
To jest na razie wersja testowa na cele nukowe. Jak złożę hardware to będę wtedy pracował nad softem.

I tu mam kolejne pytanie...

Prowadnica będzie na wałkach o długości 1m. Biorąc pod uwagę fakt, że na końcach odejdzie kilka cm na wsporniki końcowe zakres ruchu będzie pewnie koło 94cm. Mam taki silnik Nema 17:
Długość obudowy - 47 [mm]

Oś - 5x21 [mm], ścięta

Moment trzymający - 0.44 [Nm]

Napięcie - 2.8 [V]

Natężenie - 1.7 [A]
Jakie do takiego silnika muszę mieć zębatki i pasek? Bo jedna zębatka będzie na wałku silnika a silnik przymocowany gdzieś do konstrukcji na jednym końcu. Na drugim końcu musi być druga zębatka przymocowana na jakimś łożysku czy czymś. Nie mam pojęcia jak dobrać i gdzie kupić taki zestaw 2 zębatek + pasek (żeby wszystko było kompatybilne).

Awatar użytkownika

adam Fx
Lider FORUM (min. 2000)
Lider FORUM (min. 2000)
Posty w temacie: 2
Posty: 5562
Rejestracja: 04 lip 2004, 16:03
Lokalizacja: Gliwice

#5

Post napisał: adam Fx » 15 gru 2015, 15:34

Kupić możesz u sponsora (na samej górze forum mam baner) jak policzyć - z obwodu koła poznasz drogę im większe koło tym większa drogę pokonasz przy jednym obr. silnika ale i dłuższe ramie wiec przenoszona masa nie może być zbyt duża czyli mnisze kółko przemieści wolniej większą masę
sorki za wszystkie błędy ... (dyslektyk) :?
Zobacz moje filmy http://www.youtube.com/user/pokachontass/videos


Autor tematu
68mustang
Nowy użytkownik, używaj wyszukiwarki
Nowy użytkownik, używaj wyszukiwarki
Posty w temacie: 3
Posty: 7
Rejestracja: 14 gru 2015, 22:09
Lokalizacja: Kraków

#6

Post napisał: 68mustang » 16 gru 2015, 10:01

Kupiłem zębatkę GT2 20 zębów na wał silnika (fi 5mm) oraz pasek GT2 szser. 6mm, podział 2mm. Mam pytanie co zamontować po drugiej stronie. Też by się przydała jakaś zębatka na łożysku, żeby napinać pas. Może nawet być trochę większej średnicy. Jak takie coś znaleźć? Podobno do paska gt2 powinna być też zębatka żeby się zęby paska nie odkształcały. Tylko nie wiem gdzie takiego czegoś szukać. Znalazłem tylko zębatki z mocowaniem na wałek silnika a nie do swobodnego obracania się.


steff.k
Specjalista poziom 2 (min. 300)
Specjalista poziom 2 (min. 300)
Posty w temacie: 1
Posty: 529
Rejestracja: 07 paź 2013, 20:12
Lokalizacja: Kraków/Kraśnik

#7

Post napisał: steff.k » 16 gru 2015, 10:55

To kup koło zębate z otworem, albo zrób w nim otwór pod łożysko malutkie, przykręcasz to śrubą i gitara.

Spory wybór kół zebatych masz na stronie sponsora.
LINK

ODPOWIEDZ Poprzedni tematNastępny temat

Wróć do „Arduino, Raspberry pi i inne systemy mikroprocesorowe”