Znaleziono 3 wyniki

autor: 68mustang
16 gru 2015, 10:01
Forum: Arduino, Raspberry pi i inne systemy mikroprocesorowe
Temat: Silnik krokowy + Arduino -- Jak wywołać sekwencję kroków?
Odpowiedzi: 6
Odsłony: 7940

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ę.
autor: 68mustang
15 gru 2015, 13:16
Forum: Arduino, Raspberry pi i inne systemy mikroprocesorowe
Temat: Silnik krokowy + Arduino -- Jak wywołać sekwencję kroków?
Odpowiedzi: 6
Odsłony: 7940

Jakie zębatki i paski?

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).
autor: 68mustang
14 gru 2015, 23:00
Forum: Arduino, Raspberry pi i inne systemy mikroprocesorowe
Temat: Silnik krokowy + Arduino -- Jak wywołać sekwencję kroków?
Odpowiedzi: 6
Odsłony: 7940

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

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!

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