#include <SD.h>
#include <Stepper.h> //подключение библиотеки
const int CSPin = 10;
File root;
struct MotorControlData {
int steps = 1;
int direction = 0;
int wait_ms = 100;
};
MotorControlData motor_control;
const int steps_per_revolution = 200; //количество шагов на оборот
Stepper stepper(steps_per_revolution, 4, 5, 6, 7); //управление выводами 4 - 7
int motor_speed = 100;
bool is_work = false;
File f_stepper_programm;
char filename[] = "stepper.txt";
char data[8];
int pos = 0;
int step_count = 0;
void setup() {
stepper.setSpeed(motor_speed);
Serial.begin(115200);
Serial.print("Initializing SD card... ");
if (!SD.begin(CSPin)) //Если ошибка инициализации, то блокирование работы
{
Serial.println("Card initialization failed!");
while (1);
}
Serial.println("initialization done.");
Serial.println("Files in the card:"); //считывание имен всех файлов на карте
root = SD.open("/");
printDirectory(root); //вывод всех имен файлов в директории
Serial.println("");
f_stepper_programm = SD.open(filename);
}
void MotorOperation() {
if (is_work && motor_speed != 0) {
if (!static_cast<bool>(motor_control.direction)) {
stepper.step(motor_control.steps);
} else {
stepper.step(-motor_control.steps);
}
delay(motor_control.wait_ms);
}
}
void ReadData() {
if (!f_stepper_programm) {
f_stepper_programm = SD.open(filename);
}
is_work = f_stepper_programm.available();
if (!is_work) {
return;
}
++step_count;
motor_control.steps = GetValue();
motor_control.direction = GetValue();
motor_control.wait_ms = GetValue();
PrintLog();
}
void PrintLog() {
Serial.print(step_count);
Serial.print(": ");
Serial.print(motor_control.steps);
Serial.print(' ');
Serial.print(motor_control.direction);
Serial.print(' ');
Serial.print(motor_control.wait_ms);
Serial.println();
}
int GetValue() {
pos = 0;
char c;
if (f_stepper_programm.available()) {
c = f_stepper_programm.read();
while (f_stepper_programm.available() && (c == ' ' || c == '\n')) {
c = f_stepper_programm.read();
}
while (f_stepper_programm.available() && (c != ' ' && c != '\n')) {
data[pos] = c;
++pos;
c = f_stepper_programm.read();
}
if (c != ' ' && c != '\n') {
data[pos] = c;
++pos;
}
} else {
return -1;
}
data[pos] = '\0';
return atoi(data);
}
void loop() {
ReadData();
MotorOperation();
}
//функция чтения имен файлов
void printDirectory(File dir) {
while (1)
{
File entry = dir.openNextFile(); //переход к следующему файлу
if (! entry) //выход, если больше нет файлов
{
break;
}
Serial.print(entry.name()); //вывод имени
if (entry.isDirectory()) //если это директория, то ее размера нет
{
Serial.println("/");
} else
{
Serial.print("\t\t");
Serial.println(entry.size(), DEC);
}
entry.close();
}
}