Testbed-Arduino.md
April 13, 2022 ยท View on GitHub
// Motor Setting
byte M_LED = 2;
byte M1_dirPin = 11;
byte M2_dirPin = 10;
byte M3_dirPin = 9;
byte M1_stepPin = 6;
byte M2_stepPin = 5;
byte M3_stepPin = 3;
byte Motor_ENB = 13;
// Switch Sensor Setting
int S1 = A0;
int S2 = A1;
int S3 = A2;
int S4 = A3;
int S5 = A4;
int S6 = A5;
int S[6] = {0, 0, 0, 0, 0, 0};
float s[6] = {0, 0, 0, 0, 0, 0};
// Action Requirement
float A[4] = {0.0, 0.0, 0.0, 0.0};
// Position
int P[3] = {0, 0, 0};
int Pu[3] = {0, 0, 0};
// Distance Counting
float Step_Rotation = 10000.0;
int M1_Steps = 0;
int M2_Steps = 0;
int M3_Steps = 0;
// Overshoot Flag
int Flag = 0;
void SensorValue(int S[])
{
S[0] = analogRead(S1);
S[1] = analogRead(S2);
S[2] = analogRead(S3);
S[3] = analogRead(S4);
S[4] = analogRead(S5);
S[5] = analogRead(S6);
}
void sensorvalue(float s[])
{
SensorValue(S);
float a = 0.3;
s[0] = a*s[0] + (1-a)*S[0];
s[1] = a*s[1] + (1-a)*S[1];
s[2] = a*s[2] + (1-a)*S[2];
s[3] = a*s[3] + (1-a)*S[3];
s[4] = a*s[4] + (1-a)*S[4];
s[5] = a*s[5] + (1-a)*S[5];
}
void CurrentPosition(int P[])
{
P[0] = M1_Steps;
P[1] = M2_Steps;
P[2] = M3_Steps;
}
void ActionValue(float A[])
{
while(!Serial.available()) {}
String readString,str[4];
int count=0;
while (Serial.available())
{
if (Serial.available() >0)
{
char c = Serial.read();
readString += c;
str[count] +=c;
if(c==','){count+=1;}
if(c=='\n'){}
}
}
A[0] = str[0].toFloat();
A[1] = str[1].toFloat();
A[2] = str[2].toFloat();
A[3] = str[3].toFloat();
}
void UpdatePosition(int Pu[],int Flag)
{
CurrentPosition(P);
if(A[1]>300.0 or A[2]>480.0 or A[3]>80.0){Flag=1;} else {Flag=0;}
int m1_step = int(A[1]/110.0*Step_Rotation);
int m2_step = int(A[2]/110.0*Step_Rotation);
int m3_step = int(A[3]/110.0*Step_Rotation);
Pu[0] = m1_step-P[0];
Pu[1] = m2_step-P[1];
Pu[2] = m3_step-P[2];
}
void GotoPosition()
{
UpdatePosition(Pu,Flag);
if(Flag==0){
int M1_sign,M2_sign,M3_sign;
if(Pu[0]<0){digitalWrite(M1_dirPin, HIGH);M1_sign =-1;} else {digitalWrite(M1_dirPin, LOW);M1_sign=1;}
if(Pu[1]<0){digitalWrite(M2_dirPin, LOW);M2_sign=-1;} else {digitalWrite(M2_dirPin, HIGH);M2_sign=1;}
if(Pu[2]<0){digitalWrite(M3_dirPin, HIGH);M3_sign=-1;} else {digitalWrite(M3_dirPin, LOW);M3_sign=1;}
int P_max = max(max(abs(Pu[0]),abs(Pu[1])),abs(Pu[2]));
digitalWrite(M_LED, HIGH);
for(int n=0;n<(P_max);n++)
{
SensorValue(S);
if(n<abs(Pu[0])){digitalWrite(M1_stepPin, HIGH);digitalWrite(M1_stepPin, LOW);M1_Steps += M1_sign; delay(0.000002);}
if(n<abs(Pu[1])){digitalWrite(M2_stepPin, HIGH);digitalWrite(M2_stepPin, LOW);M2_Steps += M2_sign; delay(0.000002);}
if(n<abs(Pu[2])){digitalWrite(M3_stepPin, HIGH);digitalWrite(M3_stepPin, LOW);M3_Steps += M3_sign; delay(0.000002);}
}
digitalWrite(M_LED, LOW);
}
}
void SendPosition()
{
float x_p,y_p,z_p;
CurrentPosition(P);
x_p = P[0]*110.0/Step_Rotation;
y_p = P[1]*110.0/Step_Rotation;
z_p = P[2]*110.0/Step_Rotation;
Serial.print(3.0);
Serial.print(" ");
Serial.print(x_p);
Serial.print(" ");
Serial.print(y_p);
Serial.print(" ");
Serial.print(z_p);
Serial.println(" ");
}
void action_in_arduino()
{
ActionValue(A);
if (A[0]==0.0){initialization();}
if (A[0]==1.0){GotoPosition();}
if (A[0]==2.0){SendPosition();}
}
void initialization()
{
digitalWrite(M1_dirPin, HIGH);
digitalWrite(M2_dirPin, LOW);
digitalWrite(M3_dirPin, HIGH);
digitalWrite(M_LED,HIGH);
while(1)
{
sensorvalue(s);
if(s[0]<400){digitalWrite(M1_stepPin, HIGH);digitalWrite(M1_stepPin, LOW);}
if(s[2]<400){digitalWrite(M2_stepPin, HIGH);digitalWrite(M2_stepPin, LOW);}
if(s[4]<400){digitalWrite(M3_stepPin, HIGH);digitalWrite(M3_stepPin, LOW);}
if(s[0]>400 && s[2]>400 && s[4]>400){break;}
delay(0.00001);
}
digitalWrite(M_LED,LOW);
delay(1);
digitalWrite(M1_dirPin, LOW);
digitalWrite(M2_dirPin, HIGH);
digitalWrite(M3_dirPin, LOW);
digitalWrite(M_LED,HIGH);
while(1)
{
sensorvalue(s);
if(s[0]>400){digitalWrite(M1_stepPin, HIGH);digitalWrite(M1_stepPin, LOW);}
if(s[2]>400){digitalWrite(M2_stepPin, HIGH);digitalWrite(M2_stepPin, LOW);}
if(s[4]>400){digitalWrite(M3_stepPin, HIGH);digitalWrite(M3_stepPin, LOW);}
if(s[0]<400 && s[2]<400 && s[4]<400){break;}
delay(0.00001);
}
digitalWrite(M_LED,LOW);
delay(1);
digitalWrite(M1_dirPin, HIGH);
digitalWrite(M2_dirPin, LOW);
digitalWrite(M3_dirPin, HIGH);
digitalWrite(M_LED,HIGH);
while(1)
{ sensorvalue(s);
if(s[0]<400){digitalWrite(M1_stepPin, HIGH);digitalWrite(M1_stepPin, LOW);}
if(s[2]<400){digitalWrite(M2_stepPin, HIGH);digitalWrite(M2_stepPin, LOW);}
if(s[4]<400){digitalWrite(M3_stepPin, HIGH);digitalWrite(M3_stepPin, LOW);}
if(s[0]>400 && s[2]>400 && s[4]>400){break;}
delay(0.000001);
}
digitalWrite(M_LED,LOW);
M1_Steps = 0;
M2_Steps = 0;
M3_Steps = 0;
delay(1);
}
void setup() {
Serial.begin(115200);
pinMode(M_LED,OUTPUT);
pinMode(M1_dirPin, OUTPUT);
pinMode(M2_dirPin, OUTPUT);
pinMode(M3_dirPin, OUTPUT);
pinMode(M1_stepPin, OUTPUT);
pinMode(M2_stepPin, OUTPUT);
pinMode(M3_stepPin, OUTPUT);
pinMode(Motor_ENB,OUTPUT);
digitalWrite(Motor_ENB, LOW);
delay(10);
}
void loop() {
action_in_arduino();
}