. Здравствуйте,мне нужно написать код на Arduino IDE. Вот моя схема, у меня есть
Плата микроконтроллера Arduino Uno
Плата управления на драйвере DRV8825
Модуль питания, имеющий 3,3 5 и 12 Вольт напряжения
4.Модуль энкодера KY-035
5.Дисплей на базе драйвера TM1637
6.Тумблер
7.Блок питания 9В и 1А.
8.Шаговый двигатель Nema 17 42BYGHM609
Шаговый двигатель подключен к плате управления на драйвере DRV8825, с этой платы управления выводятся Step на 2 пин ардуино, Direction на 3 пин ардуино и Eneble на 4 пин ардуино, тумблер подключен к 5 и 6 пину ардуино,модуль энкодера на 7(SW) 8(DT) и 9(Clk) пин.
Дисплей подключен к Analog In к А5(CLK) ПИНУ И А4(Dio) . Мне нужно чтобы Шаговый двигатель поворачивался на заданный угол поворота(от 0 до 360 градусов) и останавливался при достижении этого угла, это надо сделать так, чтобы изначально на дисплее было значение 0, и дальше при повороте ручки энкодера это числовое значение на дисплее увеличивалось(если я кручу ручку вправо) и после выставления этого значения на дисплее я должен нажать на кнопку энкодера и двигатель должен повернуться на этот угол и остановиться при достижении этого угла, далее я могу опять изменить угол на дисплее путем вращении ручки энкодера, или оставить такой как есть. Основная проблема в том, что с
двигателем 28BYJ-48, все работает, а с Nema 17 даже не поворачивается, пробовал менять скорость, тоже ничего, помогите пожалуйста
#include <TM1637Display.h>
#include <AccelStepper.h>
#include <Encoder.h>
#define CLK A5
#define DIO A4
#define STEP_PIN 2
#define DIR_PIN 3
#define MS1_PIN 4
#define MS2_PIN 5
#define MS3_PIN 6
#define BUTTON_PIN 7
#define HALL_PIN A2 // Пин, к которому подключен датчик Холла KY-035
TM1637Display display(CLK, DIO);
Encoder myEnc(8, 9);
AccelStepper stepper(AccelStepper::DRIVER, STEP_PIN, DIR_PIN);
int angle = 0;
int targetAngle = 0;
int direction = 1;
int stepMode = 1;
bool buttonPressed = false;
bool motorRunning = false;
bool encoderTouched = false;
void save_parameters() {
// Здесь ваш код для сохранения параметров
// Например, сохранение в EEPROM или в другое хранилище
}
void setup() {
pinMode(MS1_PIN, OUTPUT);
pinMode(MS2_PIN, OUTPUT);
pinMode(MS3_PIN, OUTPUT);
pinMode(BUTTON_PIN, INPUT_PULLUP);
display.setBrightness(0x0f);
stepper.setMaxSpeed(10000);
stepper.setAcceleration(10000);
motorRunning = false;
pinMode(HALL_PIN, INPUT);
Serial.begin(9600); // Инициализация монитора порта
}
void loop() {
int newPosition = myEnc.read();
angle = newPosition;
display.showNumberDec(angle);
// Измерение напряжения с датчика Холла KY-035
int hallSensorValue = analogRead(HALL_PIN); // Чтение значения с аналогового пина
float voltage = hallSensorValue * (5.0 / 1023.0); // Преобразование значения в диапазон напряжений
Serial.print("Hall Voltage: ");
Serial.println(voltage, 2); // Вывод значения напряжения с двумя десятичными знаками
if (digitalRead(BUTTON_PIN) == LOW && !buttonPressed && !motorRunning) {
targetAngle = angle;
buttonPressed = true;
motorRunning = true;
int steps = calculateSteps(targetAngle);
stepper.move(steps);
stepper.setSpeed(direction * 1000); // Увеличение скорости вращения двигателя
}
if (digitalRead(BUTTON_PIN) == HIGH) {
buttonPressed = false;
}
if (motorRunning) {
if (stepper.distanceToGo() == 0 && motorRunning) {
motorRunning = false;
display.showNumberDec(targetAngle);
save_parameters(); // Сохранение параметров после остановки двигателя
Serial.println("Motor stopped");
}
stepper.run();
}
if (digitalRead(5) == LOW) {
direction = -1;
} else {
direction = 1;
}
switch (stepMode) {
case 1:
digitalWrite(MS1_PIN, LOW);
digitalWrite(MS2_PIN, LOW);
digitalWrite(MS3_PIN, LOW);
break;
case 2:
digitalWrite(MS1_PIN, HIGH);
digitalWrite(MS2_PIN, LOW);
digitalWrite(MS3_PIN, LOW);
break;
case 3:
digitalWrite(MS1_PIN, LOW);
digitalWrite(MS2_PIN, HIGH);
digitalWrite(MS3_PIN, LOW);
break;
case 4:
digitalWrite(MS1_PIN, HIGH);
digitalWrite(MS2_PIN, HIGH);
digitalWrite(MS3_PIN, LOW);
break;
case 5:
digitalWrite(MS1_PIN, HIGH);
digitalWrite(MS2_PIN, HIGH);
digitalWrite(MS3_PIN, HIGH);
break;
}
}
int calculateSteps(int targetAngle) {
Serial.print("Target angle: ");
Serial.println(targetAngle);
int stepsPerRevolution = 0;
switch (stepMode) {
case 1:
stepsPerRevolution = 200; // полношаговый режим
break;
case 2:
stepsPerRevolution = 400; // полушаговый режим
break;
case 3:
stepsPerRevolution = 800; // 1/4 шага
break;
case 4:
stepsPerRevolution = 2048 * 8; // 1/8 шага
break;
case 5:
stepsPerRevolution = 2048 * 16; // 1/16 шага
break;
}
float stepResolution = 1; // Разрешение шага (по умолчанию 1)
float steps = (float)targetAngle / 360.0 * (float)(stepsPerRevolution * stepResolution);
return round(steps);
}