/** #include <SD.h>
#include <SPI.h>
File myFile;
#define An 9
#define Ap 8
#define Bp 7
#define Bn 6
#define sd 2
enum MotorDirection { CW, CCW };
MotorDirection direction = CW;
enum MotorType { GEARED, NON_GEARED };
MotorType type = GEARED;
enum MotorUse { DEG, RAD, LEAD_SCREW, BELT_GEAR };
MotorUse mode = DEG;
int k;
int choice;
int *m;
int size;
int starts;
int motorsteps;
float number;
float angleDifference;
float angle = 0;
float desiredangle;
float radian;
float pitch;
float lead;
float distance;
float circularpitch;
float radius;
float theta;
float stepangle;
float stepresolution;
float gearratio;
bool sdInitialized = false;
bool fileOpened = false;
int iterations = 1;
int currentIteration = 0;
void setup() {
Serial.begin(9600);
pinMode(An, OUTPUT);
pinMode(Ap, OUTPUT);
pinMode(Bp, OUTPUT);
pinMode(Bn, OUTPUT);
pinMode(sd, OUTPUT);
initializeSDCard();
}
void loop() {
if (sdInitialized && !fileOpened && currentIteration < iterations) {
openFile();
} else if (fileOpened) {
if (!readNumbers()) {
closeFile();
direction = CW;
fileOpened = false;
currentIteration++;
}
} else {
Serial.println("All iterations completed.");
while (true) {
// Do nothing, loop indefinitely
}
}
}
void initializeSDCard() {
if (!SD.begin(sd)) {
Serial.println("SD Card initialization failed!");
} else {
Serial.println("SD Card initialized successfully!");
sdInitialized = true;
}
}
void openFile() {
if (sdInitialized) {
if (SD.exists("numbers.txt")) {
myFile = SD.open("numbers.txt");
if (myFile) {
Serial.println("Reading numbers.txt:");
fileOpened = true;
} else {
Serial.println("Error opening numbers.txt");
}
} else {
Serial.println("numbers.txt does not exist.");
}
} else {
Serial.println("SD card not initialized.");
}
}
bool readNumbers() {
if (fileOpened && myFile.available()) {
String line = myFile.readStringUntil('\n');
line.trim();
number = line.toFloat();
Serial.println(number);
angleDifference = number - angle;
angle = number;
if ((direction == CW && angleDifference > 0) || (direction == CCW && angleDifference < 0)) {
direction = CW;
Serial.println("CW");
} else {
direction = CCW;
Serial.println("CCW");
}
motorRotate();
return true;
} else {
Serial.println("End of file reached.");
return false;
}
}
void setmicrostep(int choice, int *&m, int &size) {
switch (choice) {
case 1:
size = 16;
m = new int[size] {255, 0, 0, 0, 0, 255, 0, 0, 0, 0, 255, 0, 0, 0, 0, 255};
break;
case 2:
size = 32;
m = new int[size] {255, 0, 0, 0, 127, 127, 0, 0, 0, 255, 0, 0, 0, 127, 127, 0, 0, 255, 0, 0, 0, 0, 255, 0, 0, 127, 0, 0, 0, 0, 255};
break;
case 4:
size = 64;
m = new int[size] {255, 0, 0, 0, 64, 64, 0, 0, 127, 127, 0, 0, 191, 191, 0, 0, 0, 255, 0, 0, 0, 64, 64, 0, 0, 127, 127, 0, 0, 191, 191, 0, 0, 0, 255, 0, 0, 0, 64, 64, 0, 0, 127, 127, 0, 0, 191, 191, 0, 0, 0, 255, 0, 0, 64, 64, 0, 0, 127, 127, 0, 0, 191, 191, 0, 0};
break;
default:
break;
}
}
void motorRotate() {
steps();
Serial.println(motorsteps);
setmicrostep(choice, m, size);
switch (direction) {
case CW:
for (int j = 0; j < motorsteps; j++) {
for (int i = 0; i < size; i += 4) {
analogWrite(Ap, m[i]);
analogWrite(Bp, m[i+1]);
analogWrite(An, m[i+2]);
analogWrite(Bn, m[i+3]);
delay(100);
k++;
Serial.print(k);
Serial.print(" a - ");
Serial.print(m[i]);
Serial.print(" b - ");
Serial.print(m[i+1]);
Serial.print(" c - ");
Serial.print(m[i+2]);
Serial.print(" d - ");
Serial.println(m[i+3]);
if (k == motorsteps) {
k = 0;
delete[] m;
return;
}
}
}
break;
case CCW:
for (int j = 0; j < motorsteps; j++) {
for (int i = size - 4; i >= 0; i -= 4) {
analogWrite(Bn, m[i]);
analogWrite(An, m[i + 1]);
analogWrite(Bp, m[i + 2]);
analogWrite(Ap, m[i + 3]);
delay(100);
k++;
Serial.print(k);
Serial.print(" a - ");
Serial.print(m[i+3]);
Serial.print(" b - ");
Serial.print(m[i+2]);
Serial.print(" c - ");
Serial.print(m[i+1]);
Serial.print(" d - ");
Serial.println(m[i]);
if (k == motorsteps) {
k = 0;
delete[] m;
return;
}
}
}
break;
default:
break;
}
}
float step(MotorUse mode) {
switch (mode) {
case DEG:
desiredangle = number;
return desiredangle;
case RAD:
radian = number;
desiredangle = radian * (180.0 / PI);
return desiredangle;
case LEAD_SCREW:
pitch = 2.0;
starts = 4;
lead = starts * pitch;
distance = number;
desiredangle = (distance * 360.0) / lead;
return desiredangle;
case BELT_GEAR:
circularpitch = 16.0;
radius = circularpitch / 2.0;
distance = number;
theta = distance / radius;
desiredangle = theta * (180.0 / PI);
return desiredangle;
default:
return 0;
}
}
int steps() {
float step(MotorUse mode);
choice = 1;
stepangle = 1.8;
stepresolution = stepangle / choice;
switch (type) {
case GEARED:
gearratio = 2.0;
motorsteps = (step(mode) * 1.0 / stepresolution) / gearratio;
return motorsteps;
case NON_GEARED:
motorsteps = (step(mode) * 1.0) / stepresolution;
return motorsteps;
default:
break;
}
}
void closeFile() {
myFile.close();
Serial.println("File closed.");
} **/
//i made some changes and i works as expected. now can you recheck it. below is full code:
#include <SD.h>
#include <SPI.h>
File myFile;
#define An 9
#define Ap 8
#define Bp 7
#define Bn 6
#define sd 2
enum MotorDirection { CW, CCW };
MotorDirection direction = CW;
MotorDirection pins = direction;
MotorDirection dir = pins;
enum MotorType { GEARED, NON_GEARED };
MotorType type = GEARED;
enum MotorUse { DEG, RAD, LEAD_SCREW, BELT_GEAR };
MotorUse mode = DEG;
int i = 0;
int j;
int choice;
int *m;
int size;
int starts;
int motorsteps;
float number;
float num;
float angleDifference;
float angle = 0;
float desiredangle;
float radian;
float pitch;
float lead;
float distance;
float circularpitch;
float radius;
float theta;
float stepangle;
float stepresolution;
float gearratio;
bool sdInitialized = false;
bool fileOpened = false;
int iterations = 1;
int currentIteration = 0;
void setup() {
Serial.begin(9600);
pinMode(An, OUTPUT);
pinMode(Ap, OUTPUT);
pinMode(Bp, OUTPUT);
pinMode(Bn, OUTPUT);
pinMode(sd, OUTPUT);
initializeSDCard();
}
void loop() {
if (sdInitialized && !fileOpened && currentIteration < iterations) {
openFile();
delay(1000);
} else if (fileOpened) {
if (!readNumbers()) {
closeFile();
direction = pins;
fileOpened = false;
currentIteration++;
}
delay(2000);
} else {
Serial.println("All iterations completed.");
while (true) {
// Do nothing, loop indefinitely
}
}
}
void initializeSDCard() {
if (!SD.begin(sd)) {
Serial.println("SD Card initialization failed!");
} else {
Serial.println("SD Card initialized successfully!");
sdInitialized = true;
}
}
void openFile() {
if (sdInitialized) {
if (SD.exists("numbers.txt")) {
myFile = SD.open("numbers.txt");
if (myFile) {
Serial.println("Reading numbers.txt:");
fileOpened = true;
} else {
Serial.println("Error opening numbers.txt");
}
} else {
Serial.println("numbers.txt does not exist.");
}
} else {
Serial.println("SD card not initialized.");
}
}
bool readNumbers() {
if (fileOpened && myFile.available()) {
String line = myFile.readStringUntil('\n');
line.trim();
number = line.toFloat();
Serial.println(number);
angleDifference = number - angle;
angle = number;
if ((pins == CW && angleDifference > 0) || (pins == CCW && angleDifference < 0)) {
pins = CW;
Serial.println("CW");
} else {
pins = CCW;
Serial.println("CCW");
}
motorRotate();
//delay(500);
return true;
} else {
Serial.println("End of file reached.");
return false;
}
}
void setmicrostep(int choice, int *&m, int &size) {
switch (choice) {
case 1:
size = 16;
m = new int[size] {255, 0, 0, 0, 0, 255, 0, 0, 0, 0, 255, 0, 0, 0, 0, 255};
break;
case 2:
size = 32;
m = new int[size] {255, 0, 0, 0, 127, 127, 0, 0, 0, 255, 0, 0, 0, 127, 127, 0, 0, 255, 0, 0, 0, 0, 255, 0, 0, 127, 0, 0, 0, 0, 255};
break;
case 4:
size = 64;
m = new int[size] {255, 0, 0, 0, 64, 64, 0, 0, 127, 127, 0, 0, 191, 191, 0, 0, 0, 255, 0, 0, 0, 64, 64, 0, 0, 127, 127, 0, 0, 191, 191, 0, 0, 0, 255, 0, 0, 0, 64, 64, 0, 0, 127, 127, 0, 0, 191, 191, 0, 0, 0, 255, 0, 0, 64, 64, 0, 0, 127, 127, 0, 0, 191, 191, 0, 0};
break;
default:
break;
}
}
void motorRotate() {
steps();
Serial.println(motorsteps);
setmicrostep(choice, m, size);
// Correcting direction issue
if (pins == CW) {
if (dir == CCW) {
i = (i + 8 + size) % size;
}
//Serial.println(dir);
for (j = 0; j < motorsteps; j++) {
analogWrite(Ap, m[i]);
analogWrite(Bp, m[(i + 1 + size) % size]);
analogWrite(An, m[(i + 2 + size) % size]);
analogWrite(Bn, m[(i + 3 + size) % size]);
delay(100);
Serial.print(j);
Serial.print(" a - "); Serial.print(m[i]);
Serial.print(" b - "); Serial.print(m[(i + 1 + size) % size]);
Serial.print(" c - "); Serial.print(m[(i + 2 + size) % size]);
Serial.print(" d - "); Serial.println(m[(i + 3 + size) % size]);
//Serial.println(i);
i = (i + 4 + size) % size;
}if (i == (size - 1)){
i = 0;
}if (j <= motorsteps){
j = 0;
dir = pins;
pins = direction;
delete[] m;
} /**
for (int i = 0; i < size; i += 4) {
analogWrite(Ap, m[i]);
analogWrite(Bp, m[i+1]);
analogWrite(An, m[i+2]);
analogWrite(Bn, m[i+3]);
delay(100);
k++;
Serial.print(k);
Serial.print(" a - ");
Serial.print(m[i]);
Serial.print(" b - ");
Serial.print(m[i+1]);
Serial.print(" c - ");
Serial.print(m[i+2]);
Serial.print(" d - ");
Serial.println(m[i+3]);
if (k == motorsteps) {
k = 0;
pins = direction;
delete[] m;
return;
}
}
} **/
} else {
if (dir == CW) {
i = (i - 8 + size) % size;
}
//Serial.println(dir);
for (int j = 0; j < motorsteps; j++) {
analogWrite(Ap, m[i]);
analogWrite(Bp, m[(i + 1 + size) % size]);
analogWrite(An, m[(i + 2 + size) % size]);
analogWrite(Bn , m[(i + 3 + size) % size]);
Serial.print(j);
Serial.print(" a - "); Serial.print(m[i]);
Serial.print(" b - "); Serial.print(m[(i + 1 + size) % size]);
Serial.print(" c - "); Serial.print(m[(i + 2 + size) % size]);
Serial.print(" d - "); Serial.println(m[(i + 3 + size) % size]);
//Serial.println(i);
i = (i - 4 + size) % size;
} if (i == (size - 1)){
i = 0;
} if (j <= motorsteps){
j = 0;
dir = pins;
pins = direction;
delete[] m;
}
/**
for (int i = 0; i < size; i += 4) {
analogWrite(Bn, m[i]);
analogWrite(An, m[i + 1]);
analogWrite(Bp, m[i + 2]);
analogWrite(Ap, m[i + 3]);
delay(100);
k++;
Serial.print(k);
Serial.print(" a - ");
Serial.print(m[i+3]);
Serial.print(" b - ");
Serial.print(m[i+2]);
Serial.print(" c - ");
Serial.print(m[i+1]);
Serial.print(" d - ");
Serial.println(m[i]);
if (k == motorsteps) {
k = 0;
pins = direction;
delete[] m;
return;
}
} **/
}
}
/** void motorRotate() {
steps();
Serial.println(motorsteps);
setmicrostep(choice, m, size);
// Apply the motor steps based on the direction
if (direction == CW) {
Serial.println("CW");
for (int i = 0; i < motorsteps * size; i += 4) {
analogWrite(Ap, m[i % size]);
analogWrite(Bp, m[(i + 1) % size]);
analogWrite(An, m[(i + 2) % size]);
analogWrite(Bn, m[(i + 3) % size]);
delay(100);
}
} else {
Serial.println("CCW");
for (int i = motorsteps * size - 4; i >= 0; i -= 4) {
analogWrite(Bn, m[(i + 3) % size]);
analogWrite(An, m[(i + 2) % size]);
analogWrite(Bp, m[(i + 1) % size]);
analogWrite(Ap, m[i % size]);
delay(100);
}
}
delete[] m;
} **/
float step(MotorUse mode) {
num = abs(angleDifference);
switch (mode) {
case DEG:
desiredangle = num;
return desiredangle;
case RAD:
radian = num;
desiredangle = radian * (180.0 / PI);
return desiredangle;
case LEAD_SCREW:
pitch = 2.0;
starts = 4;
lead = starts * pitch;
distance = num;
desiredangle = (distance * 360.0) / lead;
return desiredangle;
case BELT_GEAR:
circularpitch = 16.0;
radius = circularpitch / 2.0;
distance = num;
theta = distance / radius;
desiredangle = theta * (180.0 / PI);
return desiredangle;
default:
return 0;
}
}
int steps() {
float step(MotorUse mode);
choice = 1;
stepangle = 1.8;
stepresolution = stepangle / choice;
switch (type) {
case GEARED:
gearratio = 2.0;
motorsteps = (step(mode) * 1.0 / stepresolution) / gearratio;
return motorsteps;
case NON_GEARED:
motorsteps = (step(mode) * 1.0) / stepresolution;
return motorsteps;
default:
break;
}
}
void closeFile() {
myFile.close();
Serial.println("File closed.");
}