Последовательная связь для управления шаговым двигателем
** Я хотел добавить обновленный код после того, как закончу его, чтобы помочь другим в будущем, если они когда-нибудь будут его искать.
РЕДАКТИРОВАНИЕ В КОНЦЕ ВОПРОСА ПОСЛЕ ОТВЕТА И ОБНОВЛЕНИЯ КОДА. **
В настоящее время у меня есть 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);
//}
}
}
}
@PlasticBlaze, 👍1
Обсуждение1 ответ
Лучший ответ:
У вас есть 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
- Arduino uno + cnc Shield v3 + драйвер шагового двигателя A4988 + AccelStepper?
- Запустить два степпера одновременно
- Могу ли я запретить библиотеке Stepper удерживать двигатель?
- Питание двух шаговых двигателей с драйверами A4988
- Управление функцией включения на драйвере микрошагового устройства
- Шаговый двигатель с датчиком HCSR-04
- Шаговый двигатель не работает с платой A4988
- Nema 17, Arduino Uno и шаговый двигатель ~2H42B
итак, в чем же заключается ваш вопрос? ... у вас есть какая-то проблема, которую вы видите?, @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