Nema17 stappenmotoren afremmen/stoppen met accelstepper

Arduino specifieke Software
Berichten: 3
Geregistreerd: 27 Jun 2018, 20:22

Nema17 stappenmotoren afremmen/stoppen met accelstepper

Berichtdoor Edje » 27 Jun 2018, 20:41

Hoi,

Ik lees al een tijdje anoniem mee op dit forum en haal daar best nuttige tips uit. Maar nu ben ik al een tijdje aan het stoeien met een proleem waar ik niet uit kom.Ik kan ook geen duidelijk antwoord op het forum vinden dus vandaar dit topic. Mocht er toch al een antwoord op het forum staan,dan volstaat een link naar dat topic natuurlijk ook al wel.

Ik heb 2 stappenmotoren die voor de voortsuwing van een robot moeten gaan zorgen. De robot is voorzien van een Mega voor de meeste functies, waaronder Ultrasone detectie van de omgeving. Voor de motoren wordt een aparten Nano gebruikt die via I2C van de Mega zijn inputs krijgt.
Vanwege de accelaratie heb ik gekozen voor de Accelstepper library. Ik ben zo ver dat ik vooruit kan, en afhankelijk van deomgeving naar links en recht kan bijsturen. Stoppen en achteruit is nog wat problematisch en daar zou ik graag jullie hulp bij willen.
Ik wil op het moment dat er wordt geconstateerd dat we achteruit moeten omdat we anders frontaal ergen tegenaan rijden de robot snel afremmen een stukje achteruit laten gaan (Niet plotseling maar met acceleratie) en iets naar links of rechts draaien. Als dan de weg weer vrij is moet hij weer vooruit accelereren.
Indien hij zich volledig vast rijdt moet hij een noodstop uitvoeren. Dat laatste lukt maar half omdat er steeds maar 1 motor stopt, en als die stil staat de andere pas afremt en stopt. Wat op zich dan wel weer grapig is om te zien,maarniet de bedoeling.

Ik heb tot op dit moment de volgende code weten te verzinnen:

Code: Alles selecteren
#include <Arduino.h>
#include <AccelStepper.h>
#include <Wire.h>

#define SLAVE_ADDRESS 2

AccelStepper LEFT_STEPPER(AccelStepper::DRIVER, 10, 11); // dir,step
AccelStepper RIGHT_STEPPER(AccelStepper::DRIVER, 6, 5); // dir,step

int MESSAGE = 1;
int PREV_MESSAGE = 0;
String MODE;


void setup()
{
  Wire.begin(SLAVE_ADDRESS);                // join i2c bus
  Wire.onReceive(receiveEvent); // register event
  Serial.begin(9600);
  LEFT_STEPPER.setMaxSpeed(2500.0);
  RIGHT_STEPPER.setMaxSpeed(2500.0);
  LEFT_STEPPER.setAcceleration(500.0);
  RIGHT_STEPPER.setAcceleration(500.0);
  LEFT_STEPPER.moveTo(1000000);
  RIGHT_STEPPER.moveTo(1000000);
}

void receiveEvent(int bytes)
{
  MESSAGE = Wire.read();    // read one character from the I2C
}

void go_forward()
{
  // Nothing to do, just a placeholder for something in the future
  LEFT_STEPPER.moveTo(1000000);
  RIGHT_STEPPER.moveTo(1000000);
}

void go_back()
{
  LEFT_STEPPER.setAcceleration(2000.0);
  RIGHT_STEPPER.setAcceleration(2000.0);
  LEFT_STEPPER.moveTo(-5000);
  RIGHT_STEPPER.moveTo(-5000);
  LEFT_STEPPER.setAcceleration(500.0);
  RIGHT_STEPPER.setAcceleration(500.0);
}

void turn_left()
{
  LEFT_STEPPER.setSpeed(2000);
  RIGHT_STEPPER.setSpeed(500);
}

void turn_right()
{
    LEFT_STEPPER.setSpeed(500);
    RIGHT_STEPPER.setSpeed(2000);
}

void full_stop()
{

  LEFT_STEPPER.stop();
  RIGHT_STEPPER.stop();
  LEFT_STEPPER.runToPosition();
  RIGHT_STEPPER.runToPosition();
  delay(5000);

}

void check_message()  // for debugging purposes only
{
  if (PREV_MESSAGE != MESSAGE)
  {
    switch (MESSAGE)
    {
    case 1:
      Serial.print("Ik heb een ");
      Serial.print(MESSAGE);
      Serial.println(" ontvangen.");
      break;
    case 2:
      Serial.print("Ik heb een ");
      Serial.print(MESSAGE);
      Serial.println(" ontvangen.");
      break;
    case 3:
      Serial.print("Ik heb een ");
      Serial.print(MESSAGE);
      Serial.println(" ontvangen.");
      break;
    case 4:
      Serial.print("Ik heb een ");
      Serial.print(MESSAGE);
      Serial.println(" ontvangen.");
      break;
    case 5:
      Serial.print("Ik heb een ");
      Serial.print(MESSAGE);
      Serial.println(" ontvangen.");
      break;
    }
    PREV_MESSAGE = MESSAGE;
  }
}

void run_steppers()
{
  LEFT_STEPPER.run();
  RIGHT_STEPPER.run();
}

void loop()
{
  check_message();
  switch (MESSAGE)
  {
  case 1: // forward
    go_forward();
    break;
  case 2:  // full stop
    full_stop();
    break;
  case 3:  // turn left
    turn_left();
    break;
  case 4:  // turn right
    turn_right();
    break;
  case 5:  // go backwards
    go_back();
    break;
  }
run_steppers();
}



Misschien is er iemand die me de juiste kant op weet te sturen?

Groeten,
Ed.

Advertisement

Berichten: 3
Geregistreerd: 27 Jun 2018, 20:22

Re: Nema17 stappenmotoren afremmen/stoppen met accelstepper

Berichtdoor Edje » 29 Jun 2018, 16:19

Ik heb het probleem inmiddels kunnen oplossen. Ik dacht te complex, de oplossing was vrij eenvoudig. Ik had te veel code in de subroutines staan die niet nodig was.
Starten en gebeurt nu met acceleratie. Her en der moet er nog wat met de waarden getweaked worden, maar in beginsel werkt het nu zoals ik wil. Op naar de volgende uitdaging :D

Zodat anderen er misschien ook nog iets aan hebben, hieronder de werkende code voor een Nano:

Code: Alles selecteren
#include <Arduino.h>
#include <AccelStepper.h>
#include <Wire.h>

#define SLAVE_ADDRESS 2

AccelStepper LEFT_STEPPER(AccelStepper::DRIVER, 10, 11); // dir,step
AccelStepper RIGHT_STEPPER(AccelStepper::DRIVER, 6, 5); // dir,step

int MESSAGE = 1;
int PREV_MESSAGE = 0;
String MODE;


void setup()
{
  Wire.begin(SLAVE_ADDRESS);                // join i2c bus
  Wire.onReceive(receiveEvent); // register event
  Serial.begin(9600);
  LEFT_STEPPER.setMaxSpeed(2500.0);
  RIGHT_STEPPER.setMaxSpeed(2500.0);
  LEFT_STEPPER.setAcceleration(500.0);
  RIGHT_STEPPER.setAcceleration(500.0);
  LEFT_STEPPER.moveTo(1000000);
  RIGHT_STEPPER.moveTo(1000000);
}

void receiveEvent(int bytes)
{
  MESSAGE = Wire.read();    // read one character from the I2C
}

void go_forward()
{
  //LEFT_STEPPER.setSpeed(2000);
  //RIGHT_STEPPER.setSpeed(2000);
  LEFT_STEPPER.moveTo(1000000);
  RIGHT_STEPPER.moveTo(1000000);
}

void go_back()
{
  LEFT_STEPPER.moveTo(-5000);
  RIGHT_STEPPER.moveTo(-5000);
}

void turn_left()
{
  LEFT_STEPPER.setSpeed(2000);
  RIGHT_STEPPER.setSpeed(500);
}

void turn_right()
{
    LEFT_STEPPER.setSpeed(500);
    RIGHT_STEPPER.setSpeed(2000);
}

void full_stop()
{
  LEFT_STEPPER.stop();
  RIGHT_STEPPER.stop();
}

void check_message()  // for debugging purposes only
{
  if (PREV_MESSAGE != MESSAGE)
  {
    switch (MESSAGE)
    {
    case 1:
      Serial.print("Ik heb een ");
      Serial.print(MESSAGE);
      Serial.println(" ontvangen.");
      break;
    case 2:
      Serial.print("Ik heb een ");
      Serial.print(MESSAGE);
      Serial.println(" ontvangen.");
      break;
    case 3:
      Serial.print("Ik heb een ");
      Serial.print(MESSAGE);
      Serial.println(" ontvangen.");
      break;
    case 4:
      Serial.print("Ik heb een ");
      Serial.print(MESSAGE);
      Serial.println(" ontvangen.");
      break;
    case 5:
      Serial.print("Ik heb een ");
      Serial.print(MESSAGE);
      Serial.println(" ontvangen.");
      break;
    }
  }
}

void run_steppers()
{
  LEFT_STEPPER.run();
  RIGHT_STEPPER.run();
}

void loop()
{
  check_message();
  switch (MESSAGE)
  {
  case 1: // forward
    PREV_MESSAGE = MESSAGE;
    go_forward();
    break;
  case 2:  // full stop
    PREV_MESSAGE = MESSAGE;
    full_stop();
    break;
  case 3:  // turn left
    PREV_MESSAGE = MESSAGE;
    turn_left();
    break;
  case 4:  // turn right
    PREV_MESSAGE = MESSAGE;
    turn_right();
    break;
  case 5:  // go backwards
    PREV_MESSAGE = MESSAGE;
    go_back();
    break;
  }
  run_steppers();
}


Gebruikers-avatar
Berichten: 1776
Geregistreerd: 06 Aug 2016, 01:03

Re: Nema17 stappenmotoren afremmen/stoppen met accelstepper

Berichtdoor Koepel » 29 Jun 2018, 19:37

Bedankt voor de update.

Ik had er al wel naar gekeken, maar ik had nog geen goed antwoord.

Terug naar Arduino software

Wie is er online?

Gebruikers in dit forum: Google [Bot] en 5 gasten