Последовательная связь для управления шаговым двигателем

** Я хотел добавить обновленный код после того, как закончу его, чтобы помочь другим в будущем, если они когда-нибудь будут его искать.

РЕДАКТИРОВАНИЕ В КОНЦЕ ВОПРОСА ПОСЛЕ ОТВЕТА И ОБНОВЛЕНИЯ КОДА. **

В настоящее время у меня есть Uno со шляпой CNCBoard.

Я запускаю программу на своем RPi и отправляю значение через serial на Arduino. Я получаю то, что считаю строкой, преобразуя ее в int с помощью toInt() (я где-то нашел это решение). Затем я хочу записать это значение в степпер, который я подключил.

Я знаю, что степпер работает, потому что если я запущу простую тестовую программу, такую как эта:

const int stepX = 2;
const int dirX  = 5;

const int stepY = 3;
const int dirY  = 6;

const int stepZ = 4;
const int dirZ  = 7;

const int enPin = 8;

void setup() {
  // Устанавливает два контакта в качестве выходов
  pinMode(stepX, OUTPUT);
  pinMode(dirX, OUTPUT);
  pinMode(enPin, OUTPUT);

  digitalWrite(enPin, LOW);
  digitalWrite(dirX, HIGH);
  digitalWrite(dirY, LOW);
  digitalWrite(dirZ, HIGH);
}

void loop() {
  // Позволяет двигателю двигаться в определенном направлении
  // Делает 200 импульсов для выполнения одного полного цикла вращения
  for (int x = 0; x < 200; x++) {
    digitalWrite(stepX,HIGH);
    delayMicroseconds(1000);
    digitalWrite(stepX, LOW);
    delayMicroseconds(1000);
  }
   delay(1000); // Задержка в одну секунду
}

Шаговый двигатель вращается в соответствии с описанием программы. Где 200 - количество импульсов.

Программа, которую я сейчас пытаюсь использовать, такова:

// определяет номера контактов
//Переднее левое колесо
const int stepX = 2;
const int dirX  = 5;

//Переднее правое колесо
const int stepY = 3;
const int dirY  = 6;

//Заднее левое колесо
const int stepZ = 4;
const int dirZ  = 7;

//Заднее правое колесо
const int stepA = 12;
const int dirA  = 13;

const int enPin = 8;

void setup() {
  Serial.begin(9600);

  // Устанавливает два контакта в качестве выходов
  pinMode(stepX, OUTPUT);
  pinMode(dirX, OUTPUT);

  pinMode(stepY, OUTPUT);
  pinMode(dirY, OUTPUT);

  pinMode(stepZ, OUTPUT);
  pinMode(dirZ, OUTPUT);

  pinMode(enPin, OUTPUT);

  digitalWrite(enPin, LOW);
  digitalWrite(dirX, HIGH);
  digitalWrite(dirY, LOW);
  digitalWrite(dirZ, HIGH);
  digitalWrite(dirA, HIGH);
}

void loop() {
  String YpulseEncode;
  if (Serial.available() > 0) {          
    YpulseEncode = Serial.readStringUntil('\n');
    int yMove1 = YpulseEncode.toInt();
    //XpulseCalc = Serial.read();

    //Serial.print("YpulseCalc: ");
    Serial.println(yMove1 * (-1));
    //Serial.print("YpulseCalc +: ");
    //Serial.println(YpulseCalc
    //Serial.print("XpulseCalc: ");
    //Serial.println(XpulseCalc);
    delay(5000);
    Serial.end();
    if (yMove1 != 0) {
      // Позволяет двигателю двигаться в определенном направлении
      // Делает 200 импульсов для выполнения одного полного цикла вращения
      for (int x = 0; x < (yMove1); x++) {
        digitalWrite(stepX, HIGH);
        delayMicroseconds(1000);
        digitalWrite(stepX, LOW);
      }
    }
  }
}

Число, которое я получаю от RPi, -267. Поэтому, когда последовательный монитор показывает его, это 267. Я хочу послать число 267 импульсов на шаговый двигатель.

ОТРЕДАКТИРОВАНО - ОБНОВЛЕННЫЙ КОД


AccelStepper yStepper(AccelStepper::DRIVER, 2, 5);

// определяет номера контактов
//Переднее левое колесо
const int stepX = 2;
const int dirX  = 5;

//Переднее правое колесо
const int stepY = 3;
const int dirY  = 6;

//Заднее левое колесо
const int stepZ = 4;
const int dirZ  = 7;

//Заднее правое колесо
const int stepA = 12;
const int dirA  = 13;

const int enPin = 8;

void setup() {
  yStepper.setMaxSpeed(800);
  yStepper.setAcceleration(400);
  
  
  Serial.begin(9600);

  // Устанавливает контакты в качестве выходов
  pinMode(stepX, OUTPUT);
  pinMode(dirX, OUTPUT);

  pinMode(stepY, OUTPUT);
  pinMode(dirY, OUTPUT);

  pinMode(stepZ, OUTPUT);
  pinMode(dirZ, OUTPUT);

  pinMode(enPin, OUTPUT);

  digitalWrite(enPin, LOW);
  digitalWrite(dirX, HIGH);
  digitalWrite(dirY, LOW);
  digitalWrite(dirZ, HIGH);
  digitalWrite(dirA, HIGH);
}

void loop() {

  String YpulseEncode;
  if (Serial.available() > 0) {          
    YpulseEncode = Serial.readStringUntil('\n');
    int yMove1 = YpulseEncode.toInt();
    
if (yMove1 < 0) {
    int yMoveNew = yMove1 * (-1);

    //XpulseCalc = Serial.read();
    //Serial.print("YpulseCalc: ");
    Serial.println(yMove1 * (-1));
    //Serial.print("YpulseCalc +: ");
    //Serial.println(YpulseCalc
    //Serial.print("XpulseCalc: ");
    //Serial.println(XpulseCalc);
    delay(2000);

      // Позволяет двигателю двигаться в определенном направлении
      // Делает 200 импульсов для выполнения одного полного цикла вращения
      //for (int x = 0; x < yMoveNew; x++) {
      yStepper.move(yMoveNew);
      yStepper.runToPosition();
        //digitalWrite (stepX, HIGH);
        delayMicroseconds(1000);
        //digitalWrite (stepX, LOW);
      //}
    }
  }
}

, 👍1

Обсуждение

итак, в чем же заключается ваш вопрос? ... у вас есть какая-то проблема, которую вы видите?, @jsotola

Ну, я предполагаю, что я ввожу в "for(int x = 0; x < (yMove1); x ++)" for yMove1 на самом деле не является int, потому что он не перемещает степпер., @PlasticBlaze

Основываясь на моем коде, кажется ли вам, что он отправляет int?, @PlasticBlaze

Предполагая, что у вас есть Arduino IDE на RPi, Что вы отправляете номер (какой?) С его последовательного монитора и видите вывод Serial.print(yMove1 * (-1)); как "267" в последовательном мониторе, ваш скетч получает "-267- как ты думаешь. -- Но цикл for пытается сосчитать ** вверх ** от 0 до -267, давая вам ** много шагов **, пока x не переполнится от максимального целого числа до минимального, что делает условие x < yMove1 верно. (Скобки вам не нужны.) Это твоя проблема?, @the busybee

О, и почему вы вызываете "Serial.end()" в "loop()"?, @the busybee


1 ответ


Лучший ответ:

2

У вас есть 2 проблемы, о которых уже говорилось в комментариях:

  • Вы вызываете Serial.end() после того, как получили одну строку. Это остановит последовательное оборудование. Таким образом, код будет получать только одну строку, а затем игнорировать любые данные из Serial. Я не думаю, что ты этого хочешь. Так что просто удалите Serial.end().

  • yMove1 отрицателен, в то время как ваш цикл for имеет условие int x = 0; x < (yMove1); x++. Но ноль всегда выше отрицательного числа. Таким образом, for вообще не выполняется (условие x < yMove1 равно false, когда yMove1 отрицательно). Я не совсем понимаю, почему вы хотите указать отрицательное число. У вас нет никакого кода для изменения направления движения. В текущем состоянии я бы предложил просто не посылать отрицательное число. Большего я сказать не могу, потому что непонятно, чего именно вы здесь хотите.


Примечание:

  • Скобки вокруг yMove1 внутри условия цикла for не нужны.
  • Оператор if if (yMove1 != 0) не нужен. Если yMove1 равно нулю, цикл for просто не запустится, потому что он начинается с нуля.
,

Я уверен, что есть и другие способы сделать это, и то, что я делаю, вероятно, неправильно, но я просто тестировал эту часть кода и хотел, чтобы он отправил только 1 значение. Из-за того, как у меня написан код RPi, он будет продолжать отправлять номер / arduino будет продолжать получать номер, поэтому у меня был serial.end() . И теперь я вижу, что мой yMove1 будет отрицательным. В настоящее время я нахожусь на работе, но позже проверю его с помощью нового кода и попытаюсь исправить. Спасибо за помощь!, @PlasticBlaze

Еще раз спасибо! На самом деле сегодня вечером я внес довольно много изменений, так как, как только я разобрался с приемом и запуском степпера, я тоже хотел контролировать скорость степпера., @PlasticBlaze