Pos Table
Pos Table
###################################################################################
#######################
// AUTHOR: HUỲNH QUỐC TOÀN
// PROJECT: 6-DOF ARM ROBOT USE RS-485 & TCP/IP PROTOCOL
// MCU: ESP32-32U
// DESCRIPTION:
// * Hardware:
// - Use Ezi-Servo Plus-R Series of FASTECH
// - Use 6 Driver (4 Driver EzS-NDR-60L and 2 Drivers EzS-NDR-60M)
// - Use 6 Servo (4 Servo EzM-60L-A-D and 2 Servo EzM-60M-A-D)
// - Use 2 Brake 24V for Servo Joint 2 and Joint 3
// * Software:
// - Communicate with 6-Drivers via RS-485 Protocol
// - Communicate with PLC and etc... via TCP/IP Protocol
// - Use PlatformIO on VSCode
//
###################################################################################
#######################
//
===================================================================================
========================
// LAST UPDATE: 09 - 11 - 2023
// EMAIL: [email protected]
//---------------------------------------------------------------------------------
--------------------------
// DEPENDENCY GRAPH: | NOTE:
//------------------------------
+----------------------------------------------------------------------------
// |-- ... | Build files, libdeps and settings env
// |-- lib |
// |-- FS @ 2.0.0 | [HIDE] Libraies for framework-arduinoespressif32
// |-- SD @ 2.0.0 | [HIDE] Libraies for framework-arduinoespressif32
// |-- SPI @ 2.0.0 | [HIDE] Libraies for framework-arduinoespressif32
// |-- ENCODER | Header and lib source files for Read Encoder and
Interrupts
// |-- FORWARD_KINEMATIC | Header and lib source files for Kinematics of
Robot
// |-- MATH | Header and lib source files for Matrix Calculate
// |-- MULTIPLE_SPI | Lib source files for SPI Communication with SD
and Ethernet module
// |-- SERVO | Header and lib source files for communicate with
Servo via RS-485 Protocol
// |-- src |
// |-- main.cpp | <--[THIS FILE]
// |-- ... | Platformio config and etc ...
//
===================================================================================
========================
//===========================================================================
// INCLUDE LIBRARIES
//===========================================================================
#include "FS.h"
#include "SD.h"
#include "SPI.h"
#include <math.h>
#include <Arduino.h>
#include <../MATH/ArduinoEigenDense.h>
#include <../SERVO/Communication_Interface.h>
#include <../FORWARD_KINEMATIC/Convert_Function.h>
#include <../ENCODER/Encoder.h>
#include <../MULTIPLE_SPI/Multiple_SPI.cpp>
//===========================================================================
// DEFINE PINS
//===========================================================================
// UART FOR RS485 CONVERTER
#define RXD2 16
#define TXD2 17
// HOME SENSOR
#define HOME_SENSOR_J1 21 // 39
#define HOME_SENSOR_J2 22 // 36
#define HOME_SENSOR_J3 34 // 35
#define HOME_SENSOR_J4 35 // 34
#define HOME_SENSOR_J5 36 // 22
#define HOME_SENSOR_J6 39 // 21
// BUZZER
#define BUZZER 5
// RELAY
#define RELAY_5 32
#define RELAY_6 33
// NO USE
// #define RELAY_1 13
// #define RELAY_2 18
// #define RELAY_3 19
// #define RELAY_4 23
// #define SW_ENCODER
//===========================================================================
// DEFINE SERVO ID
//===========================================================================
#define ID_1 1
#define ID_2 2
#define ID_3 3
#define ID_4 4
#define ID_5 5
#define ID_6 6
//===========================================================================
// DEFINE STATE
//===========================================================================
#define ON_SERVO 1
#define OFF_SERVO 0
#define DELAY_TICK_ENABLE_SERVO 100
#define DELAY_TICK_DISABLE_SERVO 100
#define ACCELERATION_TIME_PARAMETER 3
#define DECELERATION_TIME_PARAMETER 4
#define NULL_POS -1
#define RETURN_OK 0
#define CW 1
#define CCW 0
//===========================================================================
// DEFINE HARDWARE_SERIAL
//===========================================================================
HardwareSerial HMI(1);
//===========================================================================
// DEFINE VARIABLES
//===========================================================================
struct StructRow
{
unsigned int Mark_Array[101] = {};
unsigned int rowNo;
String posName;
float EEx_Value;
float EEy_Value;
float EEz_Value;
String EE_Orientation;
unsigned int moveTimeValue;
unsigned int waitTimeValue;
String out1State;
String out2State;
struct EEC_R06
{
float r11, r12, r13;
float r21, r22, r23;
float r31, r32, r33;
} EEC_R06_Matrix;
};
StructRow Row_Data_T1;
StructRow Row_Data_T2;
StructRow Row_Data_T3;
struct Struct_Fixed_Modes
{
struct Home_Mode
{
// HOME THETA
const int Theta1 = 0, Theta2 = 155, Theta3 = -65, Theta4 = 0, Theta5 = -60,
Theta6 = 0;
} Home;
struct Wakeup_Mode
{
// WAKE UP THETA
const int Theta1 = 0, Theta2 = 90, Theta3 = 0, Theta4 = 0, Theta5 = -90, Theta6
= 0;
} Wakeup;
struct Sleep_Mode
{
// SLEEP THETA
const int Theta1 = 0, Theta2 = 123, Theta3 = -33, Theta4 = 0, Theta5 = -90,
Theta6 = 0;
} Sleep;
} Fixed_Modes;
// FOR KINEMATICS
float d0 = 228,
L1 = 55, L2 = 330, L3 = 62, d1 = 330, d2 = 201;
float POS = 90, NEG = -90;
float theta1 = 0, theta2 = 0, theta3 = 0, theta4 = 0, theta5 = 0, theta6 = 0;
float theta1_old = 0, theta2_old = 0, theta3_old = 0, theta4_old = 0, theta5_old =
0, theta6_old = 0;
float theta1_FK = 0, theta2_FK = 0, theta3_FK = 0, theta4_FK = 0, theta5_FK = 0,
theta6_FK = 0;
float theta1_IK = 0, theta2_IK = 0, theta3_IK = 0, theta4_IK = 0, theta5_IK = 0,
theta6_IK = 0;
float theta1_IK_T = 0, theta2_IK_1 = 0, theta2_IK_2 = 0, theta3_IK_1 = 0,
theta3_IK_2 = 0, theta5_IK_1 = 0, theta5_IK_2 = 0;
float tolerance = 2;
int Number_Of_Solutions = 0;
int i = 0;
// TEMPLATE MATRIX
template <int rows, int cols>
using MatrixSize = Eigen::Matrix<float, rows, cols>;
// OUT RELAY STATUS [Out1 5V - Out2 24V] [false: OFF | true: ON]
bool OUT1_STATUS = false;
bool OUT2_STATUS = false;
// UART FOR HMI
// const int BUFFER_SIZE = 100; // Độ dài tối đa của chuỗi
// char HMI_BUFFER[BUFFER_SIZE];
// int bufferIndex = 0;
bool newDataReceived = false;
String HMI_BUFFER_DATA = "";
String CURRENT_PAGE = "HP";
// OTHER
String Theta_Selection = "";
String Axis_Selection = "";
String EE_Selection = "";
MatrixSize<4, 4> FK_Jog;
MatrixSize<3, 3> R_0_6_Temp;
MatrixSize<3, 1> EE_Target_Matrix;
float THETA2_OFFSET = 90;
float theta1_Init = 0, theta2_Init = 0, theta3_Init = 0, theta4_Init = 0,
theta5_Init = 0, theta6_Init = 0;
float slider1_target = 0, slider2_target = 0, slider3_target = 0, slider4_target =
0, slider5_target = 0, slider6_target = 0;
bool EN_READY = false;
bool DONE_ALM = false;
bool FIND_NEAREST_SOLUTION = false;
float Theta1_IK_READY = 0, Theta2_IK_READY = 0, Theta3_IK_READY = 0,
Theta4_IK_READY = 0, Theta5_IK_READY = 0, Theta6_IK_READY = 0;
unsigned int Run_Time_Target = 10;
String IK_Result = "";
float EEx_Target = 0;
float EEy_Target = 0;
float EEz_Target = 0;
unsigned int row_begin = 1;
unsigned int Table_No = 1;
unsigned int Max_Table_No = 10;
String Table_Name = "";
//===========================================================================
// DEFINE FUNCTIONS
//===========================================================================
void Check_Change_Page_Fcns();
String splitString(String str, String delim, uint16_t pos)
{
String tmp = str;
for (int i = 0; i < pos; i++)
{
tmp = tmp.substring(tmp.indexOf(delim) + 1);
if (tmp.indexOf(delim) == -1 && i != pos - 1)
return "";
}
return tmp.substring(0, tmp.indexOf(delim));
}
String roundFloatToString(float value, unsigned int decimalPlaces)
{
String stringValue = String(value); // Chuyển float thành string
// Tìm vị trí của dấu "."
int dotPosition = stringValue.indexOf('.');
// Nếu tìm thấy dấu ".", thực hiện xóa các ký tự sau nó
if (dotPosition >= 0)
{
// Tính vị trí cuối cùng của số thập phân
int lastDecimalPosition = dotPosition + decimalPlaces + 1;
// Xóa các ký tự sau vị trí cuối cùng của số thập phân
if (lastDecimalPosition < stringValue.length())
stringValue = stringValue.substring(0, lastDecimalPosition);
// Làm tròn: Nếu cần hiển thị 1 số 0 sau dấu chấm thập phân thì rán "0.0"
if (stringValue == "-0.0")
stringValue = "0.0";
// Làm tròn: Nếu cần hiển thị 2 số 0 sau dấu chấm thập phân thì rán "0.00"
if (stringValue == "-0.00")
stringValue = "0.00";
}
return stringValue;
}
float roundToNearestHalfDeg(float degree_target)
{
float rounded = round(degree_target * 2.0) / 2.0;
return rounded;
}
void ENABLE_BUZZER(unsigned int time)
{
digitalWrite(BUZZER, HIGH);
delay(time);
digitalWrite(BUZZER, LOW);
}
void Read_HMI() // void IRAM_ATTR HANDLE_UART_INTERRUPT()
{
while (HMI.available())
{
HMI_BUFFER_DATA = HMI.readStringUntil('\n');
// char receivedChar = HMI.read();
// HMI_BUFFER[bufferIndex] = receivedChar;
// bufferIndex++;
// if (receivedChar == '\r')
// { // Ký tự kết thúc từ Nextion
// HMI_BUFFER[bufferIndex] = '\0'; // Kết thúc chuỗi
// bufferIndex = 0;
// }
// Serial.printf("Received Data: %s\n", HMI_BUFFER_DATA);
newDataReceived = true;
// for (int i = 0; i <= HMI_BUFFER_DATA.length(); i++)
// Serial.printf("Received Data Hex: %x\n", HMI_BUFFER_DATA[i]);
if (HMI_BUFFER_DATA.indexOf(0x1A) != NULL_POS ||
HMI_BUFFER_DATA.indexOf(0x1B) != NULL_POS || HMI_BUFFER_DATA.indexOf(0x24) !=
NULL_POS)
return;
else
ENABLE_BUZZER(10);
// for (int i=0; i <= HMI_BUFFER_DATA.length(); i++)
// Serial.printf("Received Data Hex: %x\n", HMI_BUFFER_DATA[i]);
Serial.printf("Received Data: %s\n", HMI_BUFFER_DATA.c_str());
Check_Change_Page_Fcns();
}
}
void Write_End_Byte_HMI()
{
HMI.write(0xff);
HMI.write(0xff);
HMI.write(0xff);
}
void Write_HMI(String page, String object, String para, String content)
{
HMI.print(page + "." + object + "." + para + "=" + String('"') + content +
String('"'));
Write_End_Byte_HMI();
}
void Write_HMI(String page, String object, String para, unsigned int value)
{
HMI.print(page + "." + object + "." + para + "=" + String(value));
Write_End_Byte_HMI();
}
void Write_HMI(String object, String para, String content)
{
HMI.print(object + "." + para + "=" + String('"') + content + String('"'));
Write_End_Byte_HMI();
}
void Write_HMI(String object, String para, unsigned int value)
{
HMI.print(object + "." + para + "=" + String(value));
Write_End_Byte_HMI();
}
void Write_HMI_Val(String object, String para, float value)
{
HMI.print(object + "." + para + "=" + String(value));
Write_End_Byte_HMI();
}
void Alarm_HMI(String alarm_Content)
{
Write_HMI("alarm", "pco", 65504);
Write_HMI("alarm", "txt", alarm_Content);
delay(1000);
Write_HMI("alarm", "pco", 2016);
Write_HMI("alarm", "txt", "No alarm!");
}
void ENABLE_ALL_SERVO()
{
int onNo = 0;
// BẬT SERVO: TỪ SERVO 1 ĐẾN SERVO 6
ENABLE_BUZZER(DELAY_TICK_ENABLE_SERVO);
delay(50);
while (SERVO_ServoEnable(ID_1, ON_SERVO) != RETURN_OK)
{
Serial.println("ENABLE SERVO ID 1 - JOINT 1 ENABLE AGAIN");
delay(200);
onNo++;
if (onNo >= 10)
{
Alarm_HMI("ENABLE SERVO ID 1 FAILED!");
onNo = 0;
break;
}
}
onNo = 0;
ENABLE_BUZZER(DELAY_TICK_ENABLE_SERVO);
delay(50);
while (SERVO_ServoEnable(ID_2, ON_SERVO) != RETURN_OK)
{
Serial.println("ENABLE SERVO ID 2 - JOINT 2 ENABLE AGAIN");
delay(200);
onNo++;
if (onNo >= 10)
{
Alarm_HMI("ENABLE SERVO ID 2 FAILED!");
onNo = 0;
break;
}
}
onNo = 0;
ENABLE_BUZZER(DELAY_TICK_ENABLE_SERVO);
delay(50);
while (SERVO_ServoEnable(ID_3, ON_SERVO) != RETURN_OK)
{
Serial.println("ENABLE SERVO ID 3 - JOINT 3 ENABLE AGAIN");
delay(200);
onNo++;
if (onNo >= 10)
{
Alarm_HMI("ENABLE SERVO ID 3 FAILED!");
onNo = 0;
break;
}
}
onNo = 0;
ENABLE_BUZZER(DELAY_TICK_ENABLE_SERVO);
delay(50);
while (SERVO_ServoEnable(ID_4, ON_SERVO) != RETURN_OK)
{
Serial.println("ENABLE SERVO ID 4 - JOINT 4 ENABLE AGAIN");
delay(200);
onNo++;
if (onNo >= 10)
{
Alarm_HMI("ENABLE SERVO ID 4 FAILED!");
onNo = 0;
break;
}
}
onNo = 0;
ENABLE_BUZZER(DELAY_TICK_ENABLE_SERVO);
delay(50);
while (SERVO_ServoEnable(ID_5, ON_SERVO) != RETURN_OK)
{
Serial.println("ENABLE SERVO ID 5 - JOINT 5 ENABLE AGAIN");
delay(200);
onNo++;
if (onNo >= 10)
{
Alarm_HMI("ENABLE SERVO ID 5 FAILED!");
onNo = 0;
break;
}
}
onNo = 0;
ENABLE_BUZZER(DELAY_TICK_ENABLE_SERVO);
delay(50);
while (SERVO_ServoEnable(ID_6, ON_SERVO) != RETURN_OK)
{
Serial.println("ENABLE SERVO ID 6 - JOINT 6 ENABLE AGAIN");
delay(200);
onNo++;
if (onNo >= 10)
{
Alarm_HMI("ENABLE SERVO ID 6 FAILED!");
onNo = 0;
break;
}
}
}
void DISABLE_ALL_SERVO()
{
int offNo = 0;
// TẮT SERVO: TỪ SERVO 6 ĐẾN SERVO 1
ENABLE_BUZZER(DELAY_TICK_DISABLE_SERVO);
delay(50);
while (SERVO_ServoEnable(ID_6, OFF_SERVO) != RETURN_OK)
{
Serial.println("DISABLE SERVO ID 6 - JOINT 6 DISABLE AGAIN");
delay(200);
offNo++;
if (offNo >= 10)
{
Alarm_HMI("DISABLE SERVO ID 6 FAILED!");
offNo = 0;
break;
}
}
offNo = 0;
ENABLE_BUZZER(DELAY_TICK_DISABLE_SERVO);
delay(50);
while (SERVO_ServoEnable(ID_5, OFF_SERVO) != RETURN_OK)
{
Serial.println("DISABLE SERVO ID 5 - JOINT 5 DISABLE AGAIN");
delay(200);
offNo++;
if (offNo >= 10)
{
Alarm_HMI("DISABLE SERVO ID 5 FAILED!");
offNo = 0;
break;
}
}
offNo = 0;
ENABLE_BUZZER(DELAY_TICK_DISABLE_SERVO);
delay(50);
while (SERVO_ServoEnable(ID_4, OFF_SERVO) != RETURN_OK)
{
Serial.println("DISABLE SERVO ID 4 - JOINT 4 DISABLE AGAIN");
delay(200);
offNo++;
if (offNo >= 10)
{
Alarm_HMI("DISABLE SERVO ID 4 FAILED!");
offNo = 0;
break;
}
}
offNo = 0;
ENABLE_BUZZER(DELAY_TICK_DISABLE_SERVO);
delay(50);
while (SERVO_ServoEnable(ID_3, OFF_SERVO) != RETURN_OK)
{
Serial.println("DISABLE SERVO ID 3 - JOINT 3 DISABLE AGAIN");
delay(200);
if (offNo >= 10)
{
Alarm_HMI("DISABLE SERVO ID 3 FAILED!");
offNo = 0;
break;
}
}
offNo = 0;
ENABLE_BUZZER(DELAY_TICK_DISABLE_SERVO);
delay(50);
while (SERVO_ServoEnable(ID_2, OFF_SERVO) != RETURN_OK)
{
Serial.println("DISABLE SERVO ID 2 - JOINT 2 DISABLE AGAIN");
delay(200);
if (offNo >= 10)
{
Alarm_HMI("DISABLE SERVO ID 2 FAILED!");
offNo = 0;
break;
}
}
offNo = 0;
ENABLE_BUZZER(DELAY_TICK_DISABLE_SERVO);
delay(50);
while (SERVO_ServoEnable(ID_1, OFF_SERVO) != RETURN_OK)
{
Serial.println("DISABLE SERVO ID 1 - JOINT 1 DISABLE AGAIN");
delay(200);
if (offNo >= 10)
{
Alarm_HMI("DISABLE SERVO ID 1 FAILED!");
offNo = 0;
break;
}
}
}
void CLEAR_ALL_POSITION()
{
SERVO_ClearPosition(ID_1);
delay(10);
SERVO_ClearPosition(ID_2);
delay(10);
SERVO_ClearPosition(ID_3);
delay(10);
SERVO_ClearPosition(ID_4);
delay(10);
SERVO_ClearPosition(ID_5);
delay(10);
SERVO_ClearPosition(ID_6);
delay(10);
}
long DEG_TO_POS_1_CONV(float degree_target)
{
long pulse = (degree_target * Pulse_Per_Revolution_PPR * Gearbox_1_Ratio) / 360;
return pulse;
}
long DEG_TO_POS_2_CONV(float degree_target)
{
long pulse = (degree_target * Pulse_Per_Revolution_PPR * Gearbox_2_Ratio) / 360;
return pulse;
}
long DEG_TO_POS_3_CONV(float degree_target)
{
long pulse = (degree_target * Pulse_Per_Revolution_PPR * Gearbox_3_Ratio) / 360;
return pulse;
}
long DEG_TO_POS_4_CONV(float degree_target)
{
long pulse = (degree_target * Pulse_Per_Revolution_PPR * Gearbox_4_Ratio) / 360;
return pulse;
}
long DEG_TO_POS_5_CONV(float degree_target)
{
long pulse = (degree_target * Pulse_Per_Revolution_PPR * Gearbox_5_Ratio) / 360;
return pulse;
}
long DEG_TO_POS_6_CONV(float degree_target)
{
long pulse = (degree_target * Pulse_Per_Revolution_PPR * Gearbox_6_Ratio) / 360;
return pulse;
}
float GET_THETA_1()
{
SERVO_GetActualPos(ID_1, &POS_SERVO_1);
float theta_Servo = (float)(POS_SERVO_1 * 360) / (Pulse_Per_Revolution_PPR *
Gearbox_1_Ratio);
return theta_Servo;
}
float GET_THETA_2()
{
SERVO_GetActualPos(ID_2, &POS_SERVO_2);
float theta_Servo = (float)(POS_SERVO_2 * 360) / (Pulse_Per_Revolution_PPR *
Gearbox_2_Ratio);
return theta_Servo;
}
float GET_THETA_3()
{
SERVO_GetActualPos(ID_3, &POS_SERVO_3);
float theta_Servo = (float)(POS_SERVO_3 * 360) / (Pulse_Per_Revolution_PPR *
Gearbox_3_Ratio);
return theta_Servo;
}
float GET_THETA_4()
{
SERVO_GetActualPos(ID_4, &POS_SERVO_4);
float theta_Servo = (float)(POS_SERVO_4 * 360) / (Pulse_Per_Revolution_PPR *
Gearbox_4_Ratio);
return theta_Servo;
}
float GET_THETA_5()
{
SERVO_GetActualPos(ID_5, &POS_SERVO_5);
float theta_Servo = (float)(POS_SERVO_5 * 360) / (Pulse_Per_Revolution_PPR *
Gearbox_5_Ratio);
return theta_Servo;
}
float GET_THETA_6()
{
SERVO_GetActualPos(ID_6, &POS_SERVO_6);
float theta_Servo = (float)(POS_SERVO_6 * 360) / (Pulse_Per_Revolution_PPR *
Gearbox_6_Ratio);
return theta_Servo;
}
float GET_SPEED_1()
{
SERVO_GetActualVel(ID_1, &VEL_SERVO_1);
// pps
float angular_Velocity = (float)(VEL_SERVO_1 * 360) / (Pulse_Per_Revolution_PPR *
Gearbox_1_Ratio); // dps = (pps*360)/PPR_Total
return angular_Velocity;
}
float GET_SPEED_2()
{
SERVO_GetActualVel(ID_2, &VEL_SERVO_2);
// pps
float angular_Velocity = (float)(VEL_SERVO_2 * 360) / (Pulse_Per_Revolution_PPR *
Gearbox_2_Ratio); // dps = (pps*360)/PPR_Total
return angular_Velocity;
}
float GET_SPEED_3()
{
SERVO_GetActualVel(ID_3, &VEL_SERVO_3);
// pps
float angular_Velocity = (float)(VEL_SERVO_3 * 360) / (Pulse_Per_Revolution_PPR *
Gearbox_3_Ratio); // dps = (pps*360)/PPR_Total
return angular_Velocity;
}
float GET_SPEED_4()
{
SERVO_GetActualVel(ID_4, &VEL_SERVO_4);
// pps
float angular_Velocity = (float)(VEL_SERVO_4 * 360) / (Pulse_Per_Revolution_PPR *
Gearbox_4_Ratio); // dps = (pps*360)/PPR_Total
return angular_Velocity;
}
float GET_SPEED_5()
{
SERVO_GetActualVel(ID_5, &VEL_SERVO_5);
// pps
float angular_Velocity = (float)(VEL_SERVO_5 * 360) / (Pulse_Per_Revolution_PPR *
Gearbox_5_Ratio); // dps = (pps*360)/PPR_Total
return angular_Velocity;
}
float GET_SPEED_6()
{
SERVO_GetActualVel(ID_6, &VEL_SERVO_6);
// pps
float angular_Velocity = (float)(VEL_SERVO_6 * 360) / (Pulse_Per_Revolution_PPR *
Gearbox_6_Ratio); // dps = (pps*360)/PPR_Total
return angular_Velocity;
}
unsigned int SPEED_SERVO_1(float degree_target, float degree_target_old, unsigned
int time_target)
{
Serial.printf("Function 1 Received: degree_target = %0.2f, degree_target_old =
%0.2f, time_target = %2d\n",
degree_target, degree_target_old, time_target);
long pulse_Difference = abs(DEG_TO_POS_1_CONV(degree_target) -
DEG_TO_POS_1_CONV(degree_target_old));
Serial.printf("Function 1 Received: pulse_Difference = %8ld, time = %2u\n",
pulse_Difference, time_target);
unsigned int speed = pulse_Difference / time_target;
Serial.printf("Speed_1 = %ld\n\n", speed);
return speed;
}
unsigned int SPEED_SERVO_2(float degree_target, float degree_target_old, unsigned
int time_target)
{
Serial.printf("Function 2 Received: degree_target = %0.2f, degree_target_old =
%0.2f, time_target = %2d\n",
degree_target, degree_target_old, time_target);
long pulse_Difference = abs(DEG_TO_POS_2_CONV(degree_target) -
DEG_TO_POS_2_CONV(degree_target_old));
Serial.printf("Function 2 Received: pulse_Difference = %8ld, time = %2u\n",
pulse_Difference, time_target);
unsigned int speed = pulse_Difference / time_target;
Serial.printf("Speed_2 = %ld\n\n", speed);
return speed;
}
unsigned int SPEED_SERVO_3(float degree_target, float degree_target_old, unsigned
int time_target)
{
Serial.printf("Function 3 Received: degree_target = %0.2f, degree_target_old =
%0.2f, time_target = %2d\n",
degree_target, degree_target_old, time_target);
long pulse_Difference = abs(DEG_TO_POS_3_CONV(degree_target) -
DEG_TO_POS_3_CONV(degree_target_old));
Serial.printf("Function 3 Received: pulse_Difference = %8ld, time = %2u\n",
pulse_Difference, time_target);
unsigned int speed = pulse_Difference / time_target;
Serial.printf("Speed_3 = %ld\n\n", speed);
return speed;
}
unsigned int SPEED_SERVO_4(float degree_target, float degree_target_old, unsigned
int time_target)
{
Serial.printf("Function 4 Received: degree_target = %0.2f, degree_target_old =
%0.2f, time_target = %2d\n",
degree_target, degree_target_old, time_target);
long pulse_Difference = abs(DEG_TO_POS_4_CONV(degree_target) -
DEG_TO_POS_4_CONV(degree_target_old));
Serial.printf("Function 4 Received: pulse_Difference = %8ld, time = %2u\n",
pulse_Difference, time_target);
unsigned int speed = pulse_Difference / time_target;
Serial.printf("Speed_4 = %ld\n\n", speed);
return speed;
}
unsigned int SPEED_SERVO_5(float degree_target, float degree_target_old, unsigned
int time_target)
{
Serial.printf("Function 5 Received: degree_target = %0.2f, degree_target_old =
%0.2f, time_target = %2d\n",
degree_target, degree_target_old, time_target);
long pulse_Difference = abs(DEG_TO_POS_5_CONV(degree_target) -
DEG_TO_POS_5_CONV(degree_target_old));
Serial.printf("Function 5 Received: pulse_Difference = %8ld, time = %2u\n",
pulse_Difference, time_target);
unsigned int speed = pulse_Difference / time_target;
Serial.printf("Speed_5 = %ld\n\n", speed);
return speed;
}
unsigned int SPEED_SERVO_6(float degree_target, float degree_target_old, unsigned
int time_target)
{
Serial.printf("Function 6 Received: degree_target = %0.2f, degree_target_old =
%0.2f, time_target = %2d\n",
degree_target, degree_target_old, time_target);
long pulse_Difference = abs(DEG_TO_POS_6_CONV(degree_target) -
DEG_TO_POS_6_CONV(degree_target_old));
Serial.printf("Function 6 Received: pulse_Difference = %8ld, time = %2u\n",
pulse_Difference, time_target);
unsigned int speed = pulse_Difference / time_target;
Serial.printf("Speed_6 = %ld\n\n", speed);
return speed;
}
void SET_ALL_ACCELERATION_TIME(unsigned int accel_time)
{
SERVO_SetParameter(ID_1, ACCELERATION_TIME_PARAMETER, accel_time);
SERVO_SetParameter(ID_2, ACCELERATION_TIME_PARAMETER, accel_time);
SERVO_SetParameter(ID_3, ACCELERATION_TIME_PARAMETER, accel_time);
SERVO_SetParameter(ID_4, ACCELERATION_TIME_PARAMETER, accel_time);
SERVO_SetParameter(ID_5, ACCELERATION_TIME_PARAMETER, accel_time);
SERVO_SetParameter(ID_6, ACCELERATION_TIME_PARAMETER, accel_time);
}
void SET_ALL_DECELERATION_TIME(unsigned int decel_time)
{
SERVO_SetParameter(ID_1, DECELERATION_TIME_PARAMETER, decel_time);
SERVO_SetParameter(ID_2, DECELERATION_TIME_PARAMETER, decel_time);
SERVO_SetParameter(ID_3, DECELERATION_TIME_PARAMETER, decel_time);
SERVO_SetParameter(ID_4, DECELERATION_TIME_PARAMETER, decel_time);
SERVO_SetParameter(ID_5, DECELERATION_TIME_PARAMETER, decel_time);
SERVO_SetParameter(ID_6, DECELERATION_TIME_PARAMETER, decel_time);
}
void RESET_ALL_ALARM()
{
SERVO_ServoAlarmReset(ID_1);
SERVO_ServoAlarmReset(ID_2);
SERVO_ServoAlarmReset(ID_3);
SERVO_ServoAlarmReset(ID_4);
SERVO_ServoAlarmReset(ID_5);
SERVO_ServoAlarmReset(ID_6);
}
void SAVE_ALL_PARAMETER()
{
SERVO_SaveAllParameter(ID_1);
SERVO_SaveAllParameter(ID_2);
SERVO_SaveAllParameter(ID_3);
SERVO_SaveAllParameter(ID_4);
SERVO_SaveAllParameter(ID_5);
SERVO_SaveAllParameter(ID_6);
}
template <int rows, int cols>
void printMatrix(const MatrixSize<rows, cols> &matrix)
{
for (int i = 0; i < rows; ++i)
{
for (int j = 0; j < cols; ++j)
{
Serial.print(matrix(i, j), 2);
Serial.print('\t'); // Để tạo khoảng cách giữa các phần tử
}
Serial.println(); // Xuống dòng khi đã hoàn thành một hàng
}
Serial.println();
}
MatrixSize<4, 4> T_0_1(float a1, float alpha1, float d1, float theta1)
{
MatrixSize<4, 4> transformationMatrix;
// Thực hiện tính toán ma trận chuyển đổi và gán giá trị cho transformationMatrix
transformationMatrix << cosd(theta1), 0, sind(theta1), a1 * cosd(theta1),
sind(theta1), 0, -cosd(theta1), a1 * sind(theta1),
0, 1, 0, d1,
0, 0, 0, 1;
return transformationMatrix;
}
MatrixSize<4, 4> T_1_2(float a2, float alpha2, float d2, float theta2)
{
MatrixSize<4, 4> transformationMatrix;
// Thực hiện tính toán ma trận chuyển đổi và gán giá trị cho transformationMatrix
transformationMatrix << cosd(theta2), -sind(theta2), 0, a2 * cosd(theta2),
sind(theta2), cosd(theta2), 0, a2 * sind(theta2),
0, 0, 1, 0,
0, 0, 0, 1;
return transformationMatrix;
}
MatrixSize<4, 4> T_2_3(float a3, float alpha3, float d3, float theta3)
{
MatrixSize<4, 4> transformationMatrix;
// Thực hiện tính toán ma trận chuyển đổi và gán giá trị cho transformationMatrix
transformationMatrix << cosd(theta3), 0, sind(theta3), a3 * cosd(theta3),
sind(theta3), 0, -cosd(theta3), a3 * sind(theta3),
0, 1, 0, 0,
0, 0, 0, 1;
return transformationMatrix;
}
MatrixSize<4, 4> T_3_4(float a4, float alpha4, float d4, float theta4)
{
MatrixSize<4, 4> transformationMatrix;
// Thực hiện tính toán ma trận chuyển đổi và gán giá trị cho transformationMatrix
transformationMatrix << cosd(theta4), 0, -sind(theta4), 0,
sind(theta4), 0, cosd(theta4), 0,
0, -1, 0, d4,
0, 0, 0, 1;
return transformationMatrix;
}
MatrixSize<4, 4> T_4_5(float a5, float alpha5, float d5, float theta5)
{
MatrixSize<4, 4> transformationMatrix;
// Thực hiện tính toán ma trận chuyển đổi và gán giá trị cho transformationMatrix
transformationMatrix << cosd(theta5), 0, sind(theta5), 0,
sind(theta5), 0, -cosd(theta5), 0,
0, 1, 0, 0,
0, 0, 0, 1;
return transformationMatrix;
}
MatrixSize<4, 4> T_5_6(float a6, float alpha6, float d6, float theta6)
{
MatrixSize<4, 4> transformationMatrix;
// Thực hiện tính toán ma trận chuyển đổi và gán giá trị cho transformationMatrix
transformationMatrix << cosd(theta6), -sind(theta6), 0, 0,
sind(theta6), cosd(theta6), 0, 0,
0, 0, 1, d6,
0, 0, 0, 1;
return transformationMatrix;
}
MatrixSize<4, 4> Forward_Kinematics(float theta1_FK, float theta2_FK, float
theta3_FK, float theta4_FK, float theta5_FK, float theta6_FK)
{
MatrixSize<4, 4> transformationMatrix;
MatrixSize<4, 4> T_0_1_Matrix = T_0_1(L1, POS, d0, theta1_FK);
MatrixSize<4, 4> T_1_2_Matrix = T_1_2(L2, 0, 0, theta2_FK);
MatrixSize<4, 4> T_2_3_Matrix = T_2_3(L3, POS, d0, theta3_FK);
MatrixSize<4, 4> T_3_4_Matrix = T_3_4(0, NEG, d1, theta4_FK);
MatrixSize<4, 4> T_4_5_Matrix = T_4_5(0, POS, 0, theta5_FK);
MatrixSize<4, 4> T_5_6_Matrix = T_5_6(0, 0, d2, theta6_FK);
transformationMatrix =
T_0_1_Matrix * T_1_2_Matrix * T_2_3_Matrix * T_3_4_Matrix * T_4_5_Matrix *
T_5_6_Matrix;
return transformationMatrix;
}
bool Check_T_0_3(float theta1, float theta2, float theta3, float Wx, float Wy,
float Wz)
{
// Serial.printf("Check the: theta1 = %0.2f, theta2 = %0.2f, theta3 = %0.2f\n",
theta1, theta2, theta3);
MatrixSize<4, 4> T_0_3_Matrix = T_0_1(L1, POS, d0, theta1) * T_1_2(L2, 0, 0,
theta2) * T_2_3(L3, POS, d0, theta3) * T_3_4(0, NEG, d1, 0);
printMatrix(T_0_3_Matrix);
if ((T_0_3_Matrix.block<1, 1>(0, 3).value() - tolerance) <= Wx &&
(T_0_3_Matrix.block<1, 1>(0, 3).value() + tolerance) >= Wx)
{
if ((T_0_3_Matrix.block<1, 1>(1, 3).value() - tolerance) <= Wy &&
(T_0_3_Matrix.block<1, 1>(1, 3).value() + tolerance) >= Wy)
{
if ((T_0_3_Matrix.block<1, 1>(2, 3).value() - tolerance) <= Wz &&
(T_0_3_Matrix.block<1, 1>(2, 3).value() + tolerance) >= Wz)
{
// Serial.printf("W Position is OK: Wx_IK = %0.2f, Wy_IK = %0.2f, Wz_IK =
%0.2f\n",
// T_0_3_Matrix.block<1, 1>(0, 3).value(),
T_0_3_Matrix.block<1, 1>(1, 3).value(), T_0_3_Matrix.block<1, 1>(2, 3).value());
return true;
}
else
return false;
}
else
return false;
}
else
return false;
}
bool Check_T_0_6(float theta1, float theta2, float theta3, float theta4, float
theta5, float theta6, float EEx, float EEy, float EEz)
{
// Serial.printf("Check the: theta1 = %0.2f, theta2 = %0.2f, theta3 = %0.2f,
theta4 = %0.2f, theta5 = %0.2f, theta6 = %0.2f\n",
// theta1, theta2, theta3, theta4, theta5, theta6);
MatrixSize<4, 4> T_0_6_Matrix = Forward_Kinematics(theta1, theta2, theta3,
theta4, theta5, theta6);
printMatrix(T_0_6_Matrix);
if ((T_0_6_Matrix.block<1, 1>(0, 3).value() - tolerance) <= EEx &&
(T_0_6_Matrix.block<1, 1>(0, 3).value() + tolerance) >= EEx)
{
if ((T_0_6_Matrix.block<1, 1>(1, 3).value() - tolerance) <= EEy &&
(T_0_6_Matrix.block<1, 1>(1, 3).value() + tolerance) >= EEy)
{
if ((T_0_6_Matrix.block<1, 1>(2, 3).value() - tolerance) <= EEz &&
(T_0_6_Matrix.block<1, 1>(2, 3).value() + tolerance) >= EEz)
{
// Serial.printf("EE Position is OK: EEx_IK = %0.2f, EEy_IK = %0.2f, EEz_IK
= %0.2f\n",
// T_0_6_Matrix.block<1, 1>(0, 3).value(),
T_0_6_Matrix.block<1, 1>(1, 3).value(), T_0_6_Matrix.block<1, 1>(2, 3).value());
return true;
}
else
return false;
}
else
return false;
}
else
return false;
}
// // Hàm tính vị trí điểm cổ tay Wrist, truyền vào vị trí điểm EE (3x1) và ma trận
R_0_6 (3x3);
// MatrixSize<3, 1> Calc_W_Pos_Matrix(const MatrixSize<3, 1> &EE_Pos_Matrix, const
MatrixSize<3, 3> &R_0_6_Matrix)
// {
// MatrixSize<3, 1> W_Pos_Matrix;
// // W = EE - d2*RZ_0_6 (Trong đó RZ_0_6 là cột thứ 3 của ma trận R_0_6)
// W_Pos_Matrix = EE_Pos_Matrix - d2 * R_0_6_Matrix.block<3, 1>(0, 2);
// return W_Pos_Matrix;
// }
// Hàm tính động học nghịch, truyền vào vị trí điểm EE (3x1) và ma trận R_0_6 (3x3)
String Inverse_Kinematics(const MatrixSize<3, 1> &EE_Pos_Matrix, const
MatrixSize<3, 3> &R_0_6_Matrix)
{
Number_Of_Solutions = 0;
float EEx = EE_Pos_Matrix.block<1, 1>(0, 0).value();
float EEy = EE_Pos_Matrix.block<1, 1>(1, 0).value();
float EEz = EE_Pos_Matrix.block<1, 1>(2, 0).value();
bool Out_Of_Workspace_TH1 = EEx <= 0 && EEy >= 0; // Góc phần tư thứ 2
bool Out_Of_Workspace_TH2 = EEx <= 0 && EEy <= 0; // Góc phần tư thứ 3
bool Out_Of_Workspace_TH3 = EEz <= 0; // Tọa độ Z âm
// Bộ lọc nghiệm đầu tiên: Lọc theo góc giới hạn tối đa (Góc lý tưởng chưa xét
đến kết cấu cơ khí)
if (round(theta1_IK_T) >= -180 && round(theta1_IK_T) <= 180)
{
if (round(theta2_IK_1) >= -10 && round(theta2_IK_1) <= 165)
{
if (round(theta3_IK_1) >= -90 && round(theta3_IK_1) <= 90)
{
theta1_IK = theta1_IK_T;
theta2_IK = theta2_IK_1;
theta3_IK = theta3_IK_1;
if (Check_T_0_3(theta1_IK, theta2_IK, theta3_IK, Wx, Wy, Wz) == true)
{
Serial.printf("FINAL - Solution 1 Found: theta1 = %0.2f, theta2 = %0.2f,
theta3 = %0.2f\n\n",
theta1_IK, theta2_IK, theta3_IK);
Number_Of_Solutions++;
}
else
Serial.println("Solution 1 is not match!");
}
else
Serial.println("Solution 1 is wrong!");
if (round(theta3_IK_2) >= -90 && round(theta3_IK_2) <= 90)
{
theta1_IK = theta1_IK_T;
theta2_IK = theta2_IK_1;
theta3_IK = theta3_IK_2;
if (Check_T_0_3(theta1_IK, theta2_IK, theta3_IK, Wx, Wy, Wz) == true)
{
Serial.printf("FINAL - Solution 2 Found: theta1 = %0.2f, theta2 = %0.2f,
theta3 = %0.2f\n\n",
theta1_IK, theta2_IK, theta3_IK);
Number_Of_Solutions++;
}
else
Serial.println("Solution 2 is not match!");
}
else
Serial.println("Solution 2 is wrong!");
}
else
Serial.println("Solution 1 and 2 is wrong!");
if (round(theta2_IK_2) >= -10 && round(theta2_IK_2) <= 165)
{
if (round(theta3_IK_1) >= -90 && round(theta3_IK_1) <= 90)
{
theta1_IK = theta1_IK_T;
theta2_IK = theta2_IK_2;
theta3_IK = theta3_IK_1;
if (Check_T_0_3(theta1_IK, theta2_IK, theta3_IK, Wx, Wy, Wz) == true)
{
Serial.printf("FINAL - Solution 3 Found: theta1 = %0.2f, theta2 = %0.2f,
theta3 = %0.2f\n\n",
theta1_IK, theta2_IK, theta3_IK);
Number_Of_Solutions++;
}
else
Serial.println("Solution 3 is not match!");
}
else
Serial.println("Solution 3 is wrong!");
if (round(theta3_IK_2) >= -90 && round(theta3_IK_2) <= 90)
{
theta1_IK = theta1_IK_T;
theta2_IK = theta2_IK_2;
theta3_IK = theta3_IK_2;
if (Check_T_0_3(theta1_IK, theta2_IK, theta3_IK, Wx, Wy, Wz) == true)
{
Serial.printf("FINAL - Solution 4 Found: theta1 = %0.2f, theta2 = %0.2f,
theta3 = %0.2f\n\n",
theta1_IK, theta2_IK, theta3_IK);
Number_Of_Solutions++;
}
else
Serial.println("Solution 4 is not match!");
}
else
Serial.println("Solution 4 is wrong!");
}
else
Serial.println("Solution 3 and 4 is wrong!");
}
else
Serial.println("No Solution Found!");
if (FIND_NEAREST_SOLUTION == true)
{
Serial.println("FIND_NEAREST_SOLUTION !");
if (theta4_IK > 0)
theta4_IK = theta4_IK - 180;
else if (theta4_IK < 0)
theta4_IK = theta4_IK + 180;
else if (theta4_IK == 180 || theta4_IK == -180 || theta4_IK == 0)
theta4_IK = 0;
FIND_NEAREST_SOLUTION = false;
}
else
{
if (theta4_IK >= 90)
theta4_IK = theta4_IK - 180;
else if (theta4_IK <= -90)
theta4_IK = theta4_IK + 180;
}
// Bộ lọc nghiệm đầu tiên: Lọc theo góc giới hạn tối đa (Góc lý tưởng chưa xét
đến kết cấu cơ khí)
if (round(theta1_IK_T) >= -180 && round(theta1_IK_T) <= 180)
{
if (round(theta2_IK_1) >= -10 && round(theta2_IK_1) <= 165)
{
if (round(theta3_IK_1) >= -90 && round(theta3_IK_1) <= 90)
{
theta1_IK = theta1_IK_T;
theta2_IK = theta2_IK_1;
theta3_IK = theta3_IK_1;
if (Check_T_0_3(theta1_IK, theta2_IK, theta3_IK, Wx, Wy, Wz) == true)
{
// Serial.printf("FINAL - Solution 1 Found: theta1 = %0.2f, theta2 =
%0.2f, theta3 = %0.2f\n\n",
// theta1_IK, theta2_IK, theta3_IK);
Number_Of_Solutions++;
}
else
{
}
// Serial.println("Solution 1 is not match!");
}
else
{
}
// Serial.println("Solution 1 is wrong!");
if (round(theta3_IK_2) >= -90 && round(theta3_IK_2) <= 90)
{
theta1_IK = theta1_IK_T;
theta2_IK = theta2_IK_1;
theta3_IK = theta3_IK_2;
if (Check_T_0_3(theta1_IK, theta2_IK, theta3_IK, Wx, Wy, Wz) == true)
{
// Serial.printf("FINAL - Solution 2 Found: theta1 = %0.2f, theta2 =
%0.2f, theta3 = %0.2f\n\n",
// theta1_IK, theta2_IK, theta3_IK);
Number_Of_Solutions++;
}
else
{
}
// Serial.println("Solution 2 is not match!");
}
else
{
}
// Serial.println("Solution 2 is wrong!");
}
else
{
}
// Serial.println("Solution 1 and 2 is wrong!");
if (round(theta2_IK_2) >= -10 && round(theta2_IK_2) <= 165)
{
if (round(theta3_IK_1) >= -90 && round(theta3_IK_1) <= 90)
{
theta1_IK = theta1_IK_T;
theta2_IK = theta2_IK_2;
theta3_IK = theta3_IK_1;
if (Check_T_0_3(theta1_IK, theta2_IK, theta3_IK, Wx, Wy, Wz) == true)
{
// Serial.printf("FINAL - Solution 3 Found: theta1 = %0.2f, theta2 =
%0.2f, theta3 = %0.2f\n\n",
// theta1_IK, theta2_IK, theta3_IK);
Number_Of_Solutions++;
}
else
{
}
// Serial.println("Solution 3 is not match!");
}
else
{
}
// Serial.println("Solution 3 is wrong!");
if (round(theta3_IK_2) >= -90 && round(theta3_IK_2) <= 90)
{
theta1_IK = theta1_IK_T;
theta2_IK = theta2_IK_2;
theta3_IK = theta3_IK_2;
if (Check_T_0_3(theta1_IK, theta2_IK, theta3_IK, Wx, Wy, Wz) == true)
{
// Serial.printf("FINAL - Solution 4 Found: theta1 = %0.2f, theta2 =
%0.2f, theta3 = %0.2f\n\n",
// theta1_IK, theta2_IK, theta3_IK);
Number_Of_Solutions++;
}
else
{
}
// Serial.println("Solution 4 is not match!");
}
else
{
}
// Serial.println("Solution 4 is wrong!");
}
else
{
}
// Serial.println("Solution 3 and 4 is wrong!");
}
else
{
}
// Serial.println("No Solution Found!");
// Note:
if (theta4_IK >= 90)
theta4_IK = theta4_IK - 180;
else if (theta4_IK <= -90)
theta4_IK = theta4_IK + 180;
// else if (theta4_IK > -90 && theta4_IK < 90)
// {
// if ()
// }
void clearBufferData()
{
// memset(HMI_BUFFER, 0, sizeof(HMI_BUFFER));
HMI_BUFFER_DATA = "";
}
void Update_System_Status()
{
if (SYSTEM_STATUS == true)
{
Write_HMI("status", "pco", 2016);
Write_HMI("status", "txt", "ON");
}
else
{
Write_HMI("status", "pco", 63488);
Write_HMI("status", "txt", "OFF");
}
}
void Update_Out_Relay_Status()
{
Read_HMI();
if (HMI_BUFFER_DATA.indexOf("OUT1") != NULL_POS)
{
OUT1_STATUS = !OUT1_STATUS;
digitalWrite(RELAY_5, OUT1_STATUS);
ENABLE_BUZZER(150);
if (OUT1_STATUS == true)
{
Write_HMI("out1", "pco", 2016);
Write_HMI("out1", "txt", "ON");
}
else
{
Write_HMI("out1", "pco", 63488);
Write_HMI("out1", "txt", "OFF");
}
clearBufferData();
}
else
{
if (OUT1_STATUS == true)
{
Write_HMI("out1", "pco", 2016);
Write_HMI("out1", "txt", "ON");
}
else
{
Write_HMI("out1", "pco", 63488);
Write_HMI("out1", "txt", "OFF");
}
}
if (HMI_BUFFER_DATA.indexOf("OUT2") != NULL_POS)
{
OUT2_STATUS = !OUT2_STATUS;
digitalWrite(RELAY_6, OUT2_STATUS);
ENABLE_BUZZER(150);
if (OUT2_STATUS == true)
{
Write_HMI("out2", "pco", 2016);
Write_HMI("out2", "txt", "ON");
}
else
{
Write_HMI("out2", "pco", 63488);
Write_HMI("out2", "txt", "OFF");
}
clearBufferData();
}
else
{
if (OUT2_STATUS == true)
{
Write_HMI("out2", "pco", 2016);
Write_HMI("out2", "txt", "ON");
}
else
{
Write_HMI("out2", "pco", 63488);
Write_HMI("out2", "txt", "OFF");
}
}
}
void Update_Data_Table(unsigned int row_begin, unsigned int row_end);
void Check_Change_Page_Fcns()
{
if (HMI_BUFFER_DATA.indexOf("HP") != NULL_POS)
{
CURRENT_PAGE = "HP";
Update_System_Status();
Update_Out_Relay_Status();
clearBufferData();
}
else if (HMI_BUFFER_DATA.indexOf("KI_SLI") != NULL_POS)
{
CURRENT_PAGE = "KI_SLI";
Write_HMI("st1", "maxval", 180); // 90
Write_HMI("st1", "minval", 0); //-90
Write_HMI("st2", "maxval", 135); // 135
Write_HMI("st2", "minval", 0); // 0
Write_HMI("st3", "maxval", 90); // 45
Write_HMI("st3", "minval", 0); //-45
Write_HMI("st4", "maxval", 180); // 90
Write_HMI("st4", "minval", 0); //-90
Write_HMI("st5", "maxval", 250); // 125
Write_HMI("st5", "minval", 0); //-125
Write_HMI("st6", "maxval", 360); // 180
Write_HMI("st6", "minval", 0); //-180
do
{
SERVO_MoveVelocity(ID_1, Speed_Find_Origin, CCW);
} while (digitalRead(HOME_SENSOR_J1) == false);
Write_HMI("j1h", "bco", (digitalRead(HOME_SENSOR_J1) ? 2016 : 8518));
do
{
SERVO_MoveVelocity(ID_1, Speed_Find_Origin, CCW);
} while (digitalRead(HOME_SENSOR_J1) == true);
SERVO_MoveStop(ID_1);
Write_HMI("j1h", "bco", (digitalRead(HOME_SENSOR_J1) ? 2016 : 8518));
long CCW_Pos = 0;
SERVO_GetActualPos(ID_1, &CCW_Pos);
// Serial.printf("Diff Pos: %ld\n", abs(CW_Pos - CCW_Pos));
delay(200);
SERVO_MoveSingleAxisIncPos(ID_1, (long)round(abs(CW_Pos - CCW_Pos) / 2),
Speed_Move_Origin);
while (GET_SPEED_1() != 0)
{
}
delay(100);
SERVO_ClearPosition(ID_1);
Write_HMI("t1", "pco", 2016);
Write_HMI("t1", "txt", "DONE");
Write_HMI("j1h", "bco", (digitalRead(HOME_SENSOR_J1) ? 2016 : 8518));
ENABLE_BUZZER(200);
delay(200);
ENABLE_BUZZER(200);
}
void MOVE_ORIGIN_SERVO_2()
{
do
{
SERVO_MoveVelocity(ID_2, Speed_Find_Origin * 2, CW);
} while (digitalRead(HOME_SENSOR_J2) == true);
SERVO_MoveStop(ID_2);
Write_HMI("j2h", "bco", (digitalRead(HOME_SENSOR_J2) ? 2016 : 8518));
long CW_Pos = 0;
SERVO_GetActualPos(ID_2, &CW_Pos);
do
{
SERVO_MoveVelocity(ID_2, Speed_Find_Origin * 2, CCW);
} while (digitalRead(HOME_SENSOR_J2) == false);
Write_HMI("j2h", "bco", (digitalRead(HOME_SENSOR_J2) ? 2016 : 8518));
do
{
SERVO_MoveVelocity(ID_2, Speed_Find_Origin * 2, CCW);
} while (digitalRead(HOME_SENSOR_J2) == true);
SERVO_MoveStop(ID_2);
Write_HMI("j2h", "bco", (digitalRead(HOME_SENSOR_J2) ? 2016 : 8518));
long CCW_Pos = 0;
SERVO_GetActualPos(ID_2, &CCW_Pos);
Serial.printf("Diff Pos: %ld\n", abs(CW_Pos - CCW_Pos));
delay(200);
SERVO_MoveSingleAxisIncPos(ID_2, (long)round(abs(CW_Pos - CCW_Pos) / 2),
(unsigned long)Speed_Move_Origin * 2);
Serial.println("Move to origin");
while (GET_SPEED_2() != 0)
{
}
delay(100);
SERVO_ClearPosition(ID_2);
Write_HMI("t2", "pco", 2016);
Write_HMI("t2", "txt", "DONE");
Write_HMI("j2h", "bco", (digitalRead(HOME_SENSOR_J2) ? 2016 : 8518));
ENABLE_BUZZER(200);
delay(200);
ENABLE_BUZZER(200);
}
void MOVE_ORIGIN_SERVO_3()
{
do
{
SERVO_MoveVelocity(ID_3, Speed_Find_Origin, CW);
} while (digitalRead(HOME_SENSOR_J3) == true);
SERVO_MoveStop(ID_3);
Write_HMI("j3h", "bco", (digitalRead(HOME_SENSOR_J3) ? 2016 : 8518));
long CW_Pos = 0;
SERVO_GetActualPos(ID_3, &CW_Pos);
do
{
SERVO_MoveVelocity(ID_3, Speed_Find_Origin, CCW);
} while (digitalRead(HOME_SENSOR_J3) == false);
Write_HMI("j3h", "bco", (digitalRead(HOME_SENSOR_J3) ? 2016 : 8518));
do
{
SERVO_MoveVelocity(ID_3, Speed_Find_Origin, CCW);
} while (digitalRead(HOME_SENSOR_J3) == true);
SERVO_MoveStop(ID_3);
Write_HMI("j3h", "bco", (digitalRead(HOME_SENSOR_J3) ? 2016 : 8518));
long CCW_Pos = 0;
SERVO_GetActualPos(ID_3, &CCW_Pos);
Serial.printf("Diff Pos: %ld\n", abs(CW_Pos - CCW_Pos));
delay(200);
SERVO_MoveSingleAxisIncPos(ID_3, (long)round(abs(CW_Pos - CCW_Pos) / 2),
(unsigned long)Speed_Move_Origin);
Serial.println("Move to origin");
while (GET_SPEED_3() != 0)
{
}
delay(100);
SERVO_ClearPosition(ID_3);
Write_HMI("t3", "pco", 2016);
Write_HMI("t3", "txt", "DONE");
Write_HMI("j3h", "bco", (digitalRead(HOME_SENSOR_J3) ? 2016 : 8518));
ENABLE_BUZZER(200);
delay(200);
ENABLE_BUZZER(200);
}
void MOVE_ORIGIN_SERVO_4()
{
do
{
SERVO_MoveVelocity(ID_4, Speed_Find_Origin * 2, CW);
} while (digitalRead(HOME_SENSOR_J4) == true);
SERVO_MoveStop(ID_4);
Write_HMI("j4h", "bco", (digitalRead(HOME_SENSOR_J4) ? 2016 : 8518));
long CW_Pos = 0;
SERVO_GetActualPos(ID_4, &CW_Pos);
do
{
SERVO_MoveVelocity(ID_4, Speed_Find_Origin * 2, CCW);
} while (digitalRead(HOME_SENSOR_J4) == false);
Write_HMI("j4h", "bco", (digitalRead(HOME_SENSOR_J4) ? 2016 : 8518));
do
{
SERVO_MoveVelocity(ID_4, Speed_Find_Origin * 2, CCW);
} while (digitalRead(HOME_SENSOR_J4) == true);
SERVO_MoveStop(ID_4);
Write_HMI("j4h", "bco", (digitalRead(HOME_SENSOR_J4) ? 2016 : 8518));
long CCW_Pos = 0;
SERVO_GetActualPos(ID_4, &CCW_Pos);
Serial.printf("Diff Pos: %ld\n", abs(CW_Pos - CCW_Pos));
delay(200);
SERVO_MoveSingleAxisIncPos(ID_4, (long)round(abs(CW_Pos - CCW_Pos) / 2),
(unsigned long)Speed_Move_Origin * 2);
Serial.println("Move to origin");
while (GET_SPEED_4() != 0)
{
}
delay(100);
SERVO_ClearPosition(ID_4);
Write_HMI("t4", "pco", 2016);
Write_HMI("t4", "txt", "DONE");
Write_HMI("j4h", "bco", (digitalRead(HOME_SENSOR_J4) ? 2016 : 8518));
ENABLE_BUZZER(200);
delay(200);
ENABLE_BUZZER(200);
}
void MOVE_ORIGIN_SERVO_5()
{
do
{
SERVO_MoveVelocity(ID_5, Speed_Find_Origin * 2, CW);
} while (digitalRead(HOME_SENSOR_J5) == true);
SERVO_MoveStop(ID_5);
Write_HMI("j5h", "bco", (digitalRead(HOME_SENSOR_J5) ? 2016 : 8518));
long CW_Pos = 0;
SERVO_GetActualPos(ID_5, &CW_Pos);
do
{
SERVO_MoveVelocity(ID_5, Speed_Find_Origin * 2, CCW);
} while (digitalRead(HOME_SENSOR_J5) == false);
Write_HMI("j5h", "bco", (digitalRead(HOME_SENSOR_J5) ? 2016 : 8518));
do
{
SERVO_MoveVelocity(ID_5, Speed_Find_Origin * 2, CCW);
} while (digitalRead(HOME_SENSOR_J5) == true);
SERVO_MoveStop(ID_5);
Write_HMI("j5h", "bco", (digitalRead(HOME_SENSOR_J5) ? 2016 : 8518));
long CCW_Pos = 0;
SERVO_GetActualPos(ID_5, &CCW_Pos);
Serial.printf("Diff Pos: %ld\n", abs(CW_Pos - CCW_Pos));
delay(200);
SERVO_MoveSingleAxisIncPos(ID_5, (long)round(abs(CW_Pos - CCW_Pos) / 2),
(unsigned long)Speed_Move_Origin * 2);
Serial.println("Move to origin");
while (GET_SPEED_5() != 0)
{
Write_HMI("j5h", "bco", (digitalRead(HOME_SENSOR_J5) ? 2016 : 8518));
}
delay(50);
SERVO_ClearPosition(ID_5);
delay(50);
long CW_Pos = 0;
SERVO_GetActualPos(ID_6, &CW_Pos);
do
{
SERVO_MoveVelocity(ID_6, Speed_Find_Origin, CCW);
} while (digitalRead(HOME_SENSOR_J6) == false);
Write_HMI("j6h", "bco", (digitalRead(HOME_SENSOR_J6) ? 2016 : 8518));
do
{
SERVO_MoveVelocity(ID_6, Speed_Find_Origin, CCW);
} while (digitalRead(HOME_SENSOR_J6) == true);
SERVO_MoveStop(ID_6);
Write_HMI("j6h", "bco", (digitalRead(HOME_SENSOR_J6) ? 2016 : 8518));
long CCW_Pos = 0;
SERVO_GetActualPos(ID_6, &CCW_Pos);
// Serial.printf("Diff Pos: %ld\n", abs(CW_Pos - CCW_Pos));
delay(200);
SERVO_MoveSingleAxisIncPos(ID_6, (long)round(abs(CW_Pos - CCW_Pos) / 2),
Speed_Move_Origin);
while (GET_SPEED_6() != 0)
{
}
delay(100);
SERVO_ClearPosition(ID_6);
Write_HMI("t6", "pco", 2016);
Write_HMI("t6", "txt", "DONE");
Write_HMI("j6h", "bco", (digitalRead(HOME_SENSOR_J6) ? 2016 : 8518));
ENABLE_BUZZER(200);
delay(200);
ENABLE_BUZZER(200);
}
void Joint_1_Calibration()
{
Write_HMI("t1", "pco", 63488);
Write_HMI("t1", "txt", "Calib..");
if (digitalRead(HOME_SENSOR_J1) == true)
{
MOVE_ORIGIN_SERVO_1();
}
else
{
long Act_Pos = 0;
float Theta_Start_Move = 0;
float Theta_Moving = 0;
SERVO_GetActualPos(ID_1, &Act_Pos);
Serial.printf("Act Pos: %ld\n", Act_Pos);
Theta_Start_Move = GET_THETA_1();
if (Act_Pos <= 0)
{
// do
// {
// SERVO_MoveSingleAxisAbsPos(ID_1, 0, Speed_Find_Home);
// } while (digitalRead(HOME_SENSOR_J1) == false);
// SERVO_MoveStop(ID_1);
do
{
SERVO_MoveVelocity(ID_1, Speed_Find_Home, CW);
if (Theta_Moving <= 75)
Theta_Moving = abs(Theta_Start_Move - GET_THETA_1());
else
{
SERVO_MoveStop(ID_1);
do
{
SERVO_MoveVelocity(ID_1, Speed_Return_Origin, CCW);
} while (digitalRead(HOME_SENSOR_J1) == false);
}
} while (digitalRead(HOME_SENSOR_J1) == false);
// do
// {
// SERVO_MoveVelocity(ID_1, Speed_Find_Home, CW);
// if (Theta_Moving <= 30)
// Theta_Moving = abs(Theta_Start_Move - GET_THETA_1());
// else
// {
// SERVO_MoveStop(ID_1);
// do
// {
// SERVO_MoveVelocity(ID_1, Speed_Return_Origin, CCW);
// } while (digitalRead(HOME_SENSOR_J1) == false);
// }
// } while (digitalRead(HOME_SENSOR_J1) == false);
SERVO_MoveStop(ID_1);
MOVE_ORIGIN_SERVO_1();
Theta_Moving = 0;
}
else
{
// do
// {
// SERVO_MoveSingleAxisAbsPos(ID_1, 0, Speed_Find_Home);
// } while (digitalRead(HOME_SENSOR_J1) == false);
// SERVO_MoveStop(ID_1);
do
{
SERVO_MoveVelocity(ID_1, Speed_Find_Home, CCW);
if (Theta_Moving <= 75)
Theta_Moving = abs(Theta_Start_Move - GET_THETA_1());
else
{
SERVO_MoveStop(ID_1);
do
{
SERVO_MoveVelocity(ID_1, Speed_Return_Origin, CW);
} while (digitalRead(HOME_SENSOR_J1) == false);
}
} while (digitalRead(HOME_SENSOR_J1) == false);
SERVO_MoveStop(ID_1);
MOVE_ORIGIN_SERVO_1();
Theta_Moving = 0;
}
}
}
void Joint_2_Calibration()
{
Write_HMI("t2", "pco", 63488);
Write_HMI("t2", "txt", "Calib..");
if (digitalRead(HOME_SENSOR_J2) == true)
{
MOVE_ORIGIN_SERVO_2();
}
else
{
long Act_Pos = 0;
float Theta_Start_Move = 0;
float Theta_Moving = 0;
SERVO_GetActualPos(ID_2, &Act_Pos);
Serial.printf("Act Pos: %ld\n", Act_Pos);
Theta_Start_Move = GET_THETA_2();
if (Act_Pos <= 0)
{
do
{
SERVO_MoveVelocity(ID_2, Speed_Find_Home * 2, CW);
// if (Theta_Moving <= 30)
// Theta_Moving = abs(Theta_Start_Move - GET_THETA_2());
// else
// {
// SERVO_MoveStop(ID_2);
// do
// {
// SERVO_MoveVelocity(ID_2, Speed_Return_Origin * 2, CCW);
// } while (digitalRead(HOME_SENSOR_J2) == false);
// }
} while (digitalRead(HOME_SENSOR_J2) == false);
SERVO_MoveStop(ID_2);
MOVE_ORIGIN_SERVO_2();
Theta_Moving = 0;
}
else
{
do
{
SERVO_MoveVelocity(ID_2, Speed_Find_Home * 2, CCW);
// if (Theta_Moving <= 30)
// Theta_Moving = abs(Theta_Start_Move - GET_THETA_2());
// else
// {
// SERVO_MoveStop(ID_2);
// do
// {
// SERVO_MoveVelocity(ID_2, Speed_Return_Origin * 2, CW);
// } while (digitalRead(HOME_SENSOR_J2) == false);
// }
} while (digitalRead(HOME_SENSOR_J2) == false);
SERVO_MoveStop(ID_2);
MOVE_ORIGIN_SERVO_2();
Theta_Moving = 0;
}
}
}
void Joint_3_Calibration()
{
Write_HMI("t3", "pco", 63488);
Write_HMI("t3", "txt", "Calib..");
if (digitalRead(HOME_SENSOR_J3) == true)
{
MOVE_ORIGIN_SERVO_3();
}
else
{
long Act_Pos = 0;
float Theta_Start_Move = 0;
float Theta_Moving = 0;
SERVO_GetActualPos(ID_3, &Act_Pos);
Serial.printf("Act Pos: %ld\n", Act_Pos);
Theta_Start_Move = GET_THETA_3();
if (Act_Pos <= 0)
{
do
{
SERVO_MoveVelocity(ID_3, Speed_Find_Home, CW);
// if (Theta_Moving <= 15)
// Theta_Moving = abs(Theta_Start_Move - GET_THETA_3());
// else
// {
// SERVO_MoveStop(ID_3);
// do
// {
// SERVO_MoveVelocity(ID_3, Speed_Return_Origin, CCW);
// } while (digitalRead(HOME_SENSOR_J3) == false);
// }
} while (digitalRead(HOME_SENSOR_J3) == false);
SERVO_MoveStop(ID_3);
MOVE_ORIGIN_SERVO_3();
Theta_Moving = 0;
}
else
{
do
{
SERVO_MoveVelocity(ID_3, Speed_Find_Home, CCW);
// if (Theta_Moving <= 15)
// Theta_Moving = abs(Theta_Start_Move - GET_THETA_3());
// else
// {
// SERVO_MoveStop(ID_3);
// do
// {
// SERVO_MoveVelocity(ID_3, Speed_Return_Origin, CW);
// } while (digitalRead(HOME_SENSOR_J3) == false);
// }
} while (digitalRead(HOME_SENSOR_J3) == false);
SERVO_MoveStop(ID_3);
MOVE_ORIGIN_SERVO_3();
Theta_Moving = 0;
}
}
}
void Joint_4_Calibration()
{
Write_HMI("t4", "pco", 63488);
Write_HMI("t4", "txt", "Calib..");
if (digitalRead(HOME_SENSOR_J4) == true)
{
MOVE_ORIGIN_SERVO_4();
}
else
{
long Act_Pos = 0;
float Theta_Start_Move = 0;
float Theta_Moving = 0;
SERVO_GetActualPos(ID_4, &Act_Pos);
Serial.printf("Act Pos: %ld\n", Act_Pos);
Theta_Start_Move = GET_THETA_4();
if (Act_Pos <= 0)
{
do
{
SERVO_MoveVelocity(ID_4, Speed_Find_Home * 2, CW);
// if (Theta_Moving <= 30)
// Theta_Moving = abs(Theta_Start_Move - GET_THETA_4());
// else
// {
// SERVO_MoveStop(ID_4);
// do
// {
// SERVO_MoveVelocity(ID_4, Speed_Return_Origin * 2, CCW);
// } while (digitalRead(HOME_SENSOR_J4) == false);
// }
} while (digitalRead(HOME_SENSOR_J4) == false);
SERVO_MoveStop(ID_4);
MOVE_ORIGIN_SERVO_4();
Theta_Moving = 0;
}
else
{
do
{
SERVO_MoveVelocity(ID_4, Speed_Find_Home * 2, CCW);
// if (Theta_Moving <= 30)
// Theta_Moving = abs(Theta_Start_Move - GET_THETA_4());
// else
// {
// SERVO_MoveStop(ID_4);
// do
// {
// SERVO_MoveVelocity(ID_4, Speed_Return_Origin * 2, CW);
// } while (digitalRead(HOME_SENSOR_J4) == false);
// }
} while (digitalRead(HOME_SENSOR_J4) == false);
SERVO_MoveStop(ID_4);
MOVE_ORIGIN_SERVO_4();
Theta_Moving = 0;
}
}
}
void Joint_5_Calibration()
{
Write_HMI("t5", "pco", 63488);
Write_HMI("t5", "txt", "Calib..");
if (digitalRead(HOME_SENSOR_J5) == true)
{
MOVE_ORIGIN_SERVO_5();
}
else
{
long Act_Pos = 0;
float Theta_Start_Move = 0;
float Theta_Moving = 0;
SERVO_GetActualPos(ID_5, &Act_Pos);
Serial.printf("Act Pos: %ld\n", Act_Pos);
Theta_Start_Move = GET_THETA_5();
if (Act_Pos <= 0)
{
// do
// {
// SERVO_MoveSingleAxisAbsPos(ID_5, DEG_TO_POS_5_CONV(-90),
Speed_Find_Home);
// } while (digitalRead(HOME_SENSOR_J5) == false);
// SERVO_MoveStop(ID_5);
do
{
SERVO_MoveVelocity(ID_5, Speed_Find_Home * 2, CW);
// if (Theta_Moving <= 30)
// Theta_Moving = abs(Theta_Start_Move - GET_THETA_5());
// else
// {
// SERVO_MoveStop(ID_5);
// do
// {
// SERVO_MoveVelocity(ID_5, Speed_Return_Origin * 2, CCW);
// } while (digitalRead(HOME_SENSOR_J5) == false);
// }
} while (digitalRead(HOME_SENSOR_J5) == false);
SERVO_MoveStop(ID_5);
MOVE_ORIGIN_SERVO_5();
Theta_Moving = 0;
}
else
{
// do
// {
// SERVO_MoveSingleAxisAbsPos(ID_5, DEG_TO_POS_5_CONV(-90),
Speed_Find_Home);
// } while (digitalRead(HOME_SENSOR_J5) == false);
// SERVO_MoveStop(ID_5);
do
{
SERVO_MoveVelocity(ID_5, Speed_Find_Home * 2, CCW);
// if (Theta_Moving <= 30)
// Theta_Moving = abs(Theta_Start_Move - GET_THETA_5());
// else
// {
// SERVO_MoveStop(ID_5);
// do
// {
// SERVO_MoveVelocity(ID_5, Speed_Return_Origin * 2, CW);
// } while (digitalRead(HOME_SENSOR_J5) == false);
// }
} while (digitalRead(HOME_SENSOR_J5) == false);
SERVO_MoveStop(ID_5);
MOVE_ORIGIN_SERVO_5();
Theta_Moving = 0;
}
}
}
void Joint_6_Calibration()
{
Write_HMI("t6", "pco", 63488);
Write_HMI("t6", "txt", "Calib..");
if (digitalRead(HOME_SENSOR_J6) == true)
{
MOVE_ORIGIN_SERVO_6();
}
else
{
long Act_Pos = 0;
float Theta_Start_Move = 0;
float Theta_Moving = 0;
SERVO_GetActualPos(ID_6, &Act_Pos);
Serial.printf("Act Pos: %ld\n", Act_Pos);
Theta_Start_Move = GET_THETA_6();
if (Act_Pos <= 0)
{
do
{
SERVO_MoveVelocity(ID_6, Speed_Find_Home, CW);
// if (Theta_Moving <= 30)
// Theta_Moving = abs(Theta_Start_Move - GET_THETA_6());
// else
// {
// SERVO_MoveStop(ID_6);
// do
// {
// SERVO_MoveVelocity(ID_6, Speed_Return_Origin, CCW);
// } while (digitalRead(HOME_SENSOR_J6) == false);
// }
} while (digitalRead(HOME_SENSOR_J6) == false);
SERVO_MoveStop(ID_6);
MOVE_ORIGIN_SERVO_6();
Theta_Moving = 0;
}
else
{
do
{
SERVO_MoveVelocity(ID_6, Speed_Find_Home, CCW);
// if (Theta_Moving <= 30)
// Theta_Moving = abs(Theta_Start_Move - GET_THETA_6());
// else
// {
// SERVO_MoveStop(ID_6);
// do
// {
// SERVO_MoveVelocity(ID_6, Speed_Return_Origin, CW);
// } while (digitalRead(HOME_SENSOR_J6) == false);
// }
} while (digitalRead(HOME_SENSOR_J6) == false);
SERVO_MoveStop(ID_6);
MOVE_ORIGIN_SERVO_6();
Theta_Moving = 0;
}
}
}
// ////////////////////////////////////////////////////////////////
// do
// {
// SERVO_MoveVelocity(ID_5, Speed_Find_Home * 2, CCW);
// } while (digitalRead(HOME_SENSOR_J5) == true);
// SERVO_MoveStop(ID_5);
// Serial.println("AAAAAAAAAA");
// do
// {
// SERVO_MoveVelocity(ID_5, Speed_Find_Home * 2, CCW);
// if (Theta_Moving <= 30)
// {
// Theta_Moving = abs(Theta_Start_Move - GET_THETA_5());
// if (digitalRead(HOME_SENSOR_J5) == true)
// {
// SERVO_MoveStop(ID_5);
// Serial.println("BBBBB");
// break;
// }
// }
// else
// {
// SERVO_MoveStop(ID_5);
// do
// {
// SERVO_MoveVelocity(ID_5, Speed_Return_Origin * 2, CW);
// } while (digitalRead(HOME_SENSOR_J5) == false);
// }
// } while (digitalRead(HOME_SENSOR_J5) == false);
// Serial.println("CCCCCC");
// ////////////////////////////////////////////////////////////////
void Robot_Calibration()
{
Joint_1_Calibration();
Joint_2_Calibration();
Joint_3_Calibration();
Joint_4_Calibration();
Joint_5_Calibration();
Joint_6_Calibration();
Update_Home_Sensor_State();
long acc_value = 0;
long dec_value = 0;
SERVO_GetParameter(ID_4, ACCELERATION_TIME_PARAMETER, &acc_value);
SERVO_GetParameter(ID_4, DECELERATION_TIME_PARAMETER, &dec_value);
Write_HMI("acc", "txt", String(acc_value));
Write_HMI("dec", "txt", String(dec_value));
}
void Update_Encoder_State()
{
newPosition = Teach_Pendant_Encoder.getCount();
Encoder_Position_Diff = newPosition - lastPosition;
switch (Speed_Selection_Mode)
{
case 1:
Encoder_Pulse_Resolution = Encoder_Position_Diff * 0.5;
Axis_Resolution = Encoder_Position_Diff * 1;
break;
case 2:
Encoder_Pulse_Resolution = Encoder_Position_Diff * 1;
Axis_Resolution = Encoder_Position_Diff * 10;
break;
case 3:
Encoder_Pulse_Resolution = Encoder_Position_Diff * 5;
Axis_Resolution = Encoder_Position_Diff * 50;
break;
default:
Encoder_Pulse_Resolution = Encoder_Position_Diff * 0.5;
Axis_Resolution = Encoder_Position_Diff * 5;
break;
}
// Serial.print("LastPosition : ");
// Serial.print(newPosition);
// Serial.print(" , lastPosition : ");
// Serial.print(lastPosition);
// Serial.print(" , Diff: ");
// Serial.print(Encoder_Position_Diff);
// Serial.print(" , Encoder_Pulse_Resolution: ");
// Serial.println(Encoder_Pulse_Resolution);
}
void Update_Speed_Selection()
{
Read_HMI();
if (HMI_BUFFER_DATA.indexOf("SX1\r") != NULL_POS)
{
Speed_Selection_Mode = 1;
Alarm_HMI("Speed x1 is set!");
clearBufferData();
}
else if (HMI_BUFFER_DATA.indexOf("SX10\r") != NULL_POS)
{
Speed_Selection_Mode = 2;
Alarm_HMI("Speed x10 is set!");
clearBufferData();
}
else if (HMI_BUFFER_DATA.indexOf("SX100\r") != NULL_POS)
{
Speed_Selection_Mode = 3;
Alarm_HMI("Speed x100 is set!");
clearBufferData();
}
}
void Update_Slider_State()
{
unsigned int Move_Speed;
Update_Speed_Selection();
switch (Speed_Selection_Mode)
{
case 1:
Move_Speed = 5000;
break;
case 2:
Move_Speed = 10000;
break;
case 3:
Move_Speed = 20000;
break;
default:
Move_Speed = 5000;
break;
}
Read_HMI();
if (HMI_BUFFER_DATA.indexOf("SL1") != NULL_POS)
{
slider1_target = (float)map(splitString(HMI_BUFFER_DATA, ";", 1).toFloat(), 0,
180, -90, 90);
Serial.printf("Slider1 target: %f\n", slider1_target);
Write_HMI("t1", "txt", roundFloatToString(slider1_target, 1));
clearBufferData();
}
if (HMI_BUFFER_DATA.indexOf("SL2") != NULL_POS)
{
slider2_target = (float)map(splitString(HMI_BUFFER_DATA, ";", 1).toFloat(), 0,
135, 0, 135);
Serial.printf("Slider2 target: %f\n", slider2_target);
Write_HMI("t2", "txt", roundFloatToString(slider2_target, 1));
clearBufferData();
}
if (HMI_BUFFER_DATA.indexOf("SL3") != NULL_POS)
{
slider3_target = (float)map(splitString(HMI_BUFFER_DATA, ";", 1).toFloat(), 0,
90, -45, 45);
Serial.printf("Slider3 target: %f\n", slider3_target);
Write_HMI("t3", "txt", roundFloatToString(slider3_target, 1));
clearBufferData();
}
if (HMI_BUFFER_DATA.indexOf("SL4") != NULL_POS)
{
slider4_target = (float)map(splitString(HMI_BUFFER_DATA, ";", 1).toFloat(), 0,
180, -90, 90);
Serial.printf("Slider4 target: %f\n", slider4_target);
Write_HMI("t4", "txt", roundFloatToString(slider4_target, 1));
clearBufferData();
}
if (HMI_BUFFER_DATA.indexOf("SL5") != NULL_POS)
{
slider5_target = (float)map(splitString(HMI_BUFFER_DATA, ";", 1).toFloat(), 0,
250, -125, 125);
Serial.printf("Slider5 target: %f\n", slider5_target);
Write_HMI("t5", "txt", roundFloatToString(slider5_target, 1));
clearBufferData();
}
if (HMI_BUFFER_DATA.indexOf("SL6") != NULL_POS)
{
slider6_target = (float)map(splitString(HMI_BUFFER_DATA, ";", 1).toFloat(), 0,
360, -180, 180);
Serial.printf("Slider6 target: %f\n", slider6_target);
Write_HMI("t6", "txt", roundFloatToString(slider6_target, 1));
clearBufferData();
}
Read_HMI();
if (HMI_BUFFER_DATA.indexOf("SLS1") != NULL_POS)
{
float slider1_target_temp = splitString(HMI_BUFFER_DATA, ";", 1).toFloat();
if (slider1_target_temp >= -90 && slider1_target_temp <= 90)
{
slider1_target = slider1_target_temp;
Serial.printf("Slider1 target: %f\n", slider1_target);
Write_HMI("t1", "txt", roundFloatToString(slider1_target, 1));
Write_HMI("st1", "val", (unsigned int)map(slider1_target, -90, 90, 0, 180));
SERVO_MoveSingleAxisAbsPos(ID_1,
DEG_TO_POS_1_CONV(roundToNearestHalfDeg(slider1_target)), Move_Speed);
}
else
{
Write_HMI("t1", "txt", "OOR");
delay(500);
Write_HMI("t1", "txt", roundFloatToString(GET_THETA_1(), 1));
}
clearBufferData();
}
if (HMI_BUFFER_DATA.indexOf("SLS2") != NULL_POS)
{
float slider2_target_temp = splitString(HMI_BUFFER_DATA, ";", 1).toFloat();
if (slider2_target_temp >= 0 && slider2_target_temp <= 135)
{
slider2_target = slider2_target_temp;
Serial.printf("Slider2 target: %f\n", slider2_target);
Write_HMI("t2", "txt", roundFloatToString(slider2_target, 1));
SERVO_MoveSingleAxisAbsPos(ID_2,
DEG_TO_POS_2_CONV(roundToNearestHalfDeg(slider2_target - THETA2_OFFSET)),
Move_Speed);
}
else
{
Write_HMI("t2", "txt", "OOR");
delay(500);
Write_HMI("t2", "txt", roundFloatToString(GET_THETA_2() + THETA2_OFFSET, 1));
}
clearBufferData();
}
if (HMI_BUFFER_DATA.indexOf("SLS3") != NULL_POS)
{
float slider3_target_temp = splitString(HMI_BUFFER_DATA, ";", 1).toFloat();
if (slider3_target_temp >= -45 && slider3_target_temp <= 45)
{
slider3_target = slider3_target_temp;
Serial.printf("Slider3 target: %f\n", slider3_target);
Write_HMI("t3", "txt", roundFloatToString(slider3_target, 1));
SERVO_MoveSingleAxisAbsPos(ID_3,
DEG_TO_POS_3_CONV(roundToNearestHalfDeg(slider3_target)), Move_Speed);
}
else
{
Write_HMI("t3", "txt", "OOR");
delay(500);
Write_HMI("t3", "txt", roundFloatToString(GET_THETA_3(), 1));
}
clearBufferData();
}
if (HMI_BUFFER_DATA.indexOf("SLS4") != NULL_POS)
{
float slider4_target_temp = splitString(HMI_BUFFER_DATA, ";", 1).toFloat();
if (slider4_target_temp >= -90 && slider4_target_temp <= 90)
{
slider4_target = slider4_target_temp;
Serial.printf("Slider4 target: %f\n", slider4_target);
Write_HMI("t4", "txt", roundFloatToString(slider4_target, 1));
SERVO_MoveSingleAxisAbsPos(ID_4,
DEG_TO_POS_4_CONV(roundToNearestHalfDeg(slider4_target)), Move_Speed);
}
else
{
Write_HMI("t4", "txt", "OOR");
delay(500);
Write_HMI("t4", "txt", roundFloatToString(GET_THETA_4(), 1));
}
clearBufferData();
}
if (HMI_BUFFER_DATA.indexOf("SLS5") != NULL_POS)
{
float slider5_target_temp = splitString(HMI_BUFFER_DATA, ";", 1).toFloat();
if (slider5_target_temp >= -125 && slider5_target_temp <= 125)
{
slider5_target = slider5_target_temp;
Serial.printf("Slider5 target: %f\n", slider5_target);
Write_HMI("t5", "txt", roundFloatToString(slider5_target, 1));
SERVO_MoveSingleAxisAbsPos(ID_5,
DEG_TO_POS_5_CONV(roundToNearestHalfDeg(slider5_target)), Move_Speed * 5);
}
else
{
Write_HMI("t5", "txt", "OOR");
delay(500);
Write_HMI("t5", "txt", roundFloatToString(GET_THETA_5(), 1));
}
clearBufferData();
}
if (HMI_BUFFER_DATA.indexOf("SLS6") != NULL_POS)
{
float slider6_target_temp = splitString(HMI_BUFFER_DATA, ";", 1).toFloat();
if (slider6_target_temp >= -180 && slider6_target_temp <= 180)
{
slider6_target = slider6_target_temp;
Serial.printf("Slider6 target: %f\n", slider6_target);
Write_HMI("t6", "txt", roundFloatToString(slider6_target, 1));
SERVO_MoveSingleAxisAbsPos(ID_6,
DEG_TO_POS_6_CONV(roundToNearestHalfDeg(slider6_target)), Move_Speed);
}
else
{
Write_HMI("t6", "txt", "OOR");
delay(500);
Write_HMI("t6", "txt", roundFloatToString(GET_THETA_6(), 1));
}
clearBufferData();
}
SERVO_MoveSingleAxisAbsPos(ID_1,
DEG_TO_POS_1_CONV(roundToNearestHalfDeg(slider1_target)), Move_Speed);
SERVO_MoveSingleAxisAbsPos(ID_2,
DEG_TO_POS_2_CONV(roundToNearestHalfDeg(slider2_target - THETA2_OFFSET)),
Move_Speed);
SERVO_MoveSingleAxisAbsPos(ID_3,
DEG_TO_POS_3_CONV(roundToNearestHalfDeg(slider3_target)), Move_Speed);
SERVO_MoveSingleAxisAbsPos(ID_4,
DEG_TO_POS_4_CONV(roundToNearestHalfDeg(slider4_target)), Move_Speed);
SERVO_MoveSingleAxisAbsPos(ID_5,
DEG_TO_POS_5_CONV(roundToNearestHalfDeg(slider5_target)), Move_Speed * 5);
SERVO_MoveSingleAxisAbsPos(ID_6,
DEG_TO_POS_6_CONV(roundToNearestHalfDeg(slider6_target)), Move_Speed);
// Write_HMI("st2", "val", (unsigned int)map(GET_THETA_2() + THETA2_OFFSET, 0,
135, 0, 135));
// Write_HMI("st3", "val", (unsigned int)map(GET_THETA_3(), -45, 45, 0, 90));
// Write_HMI("st4", "val", (unsigned int)map(GET_THETA_4(), -90, 90, 0, 180));
// Write_HMI("st5", "val", (unsigned int)map(GET_THETA_5(), -125, 125, 0, 250));
// Write_HMI("st6", "val", (unsigned int)map(GET_THETA_6(), -180, 180, 0, 360));
theta1_old = GET_THETA_1();
theta2_old = GET_THETA_2() + THETA2_OFFSET;
theta3_old = GET_THETA_3();
theta4_old = GET_THETA_4();
theta5_old = GET_THETA_5();
theta6_old = GET_THETA_6();
EN_READY = true;
}
clearBufferData();
}
Read_HMI();
if ((HMI_BUFFER_DATA.indexOf("RUN") != NULL_POS || digitalRead(GREEN_BUTTON) ==
0) && EN_READY == true)
{
SERVO_MoveSingleAxisAbsPos(ID_1, DEG_TO_POS_1_CONV(Theta1_IK_READY), Speed_1);
delayMicroseconds(1500);
SERVO_MoveSingleAxisAbsPos(ID_2, DEG_TO_POS_2_CONV(Theta2_IK_READY - 90),
Speed_2);
delayMicroseconds(1500);
SERVO_MoveSingleAxisAbsPos(ID_3, DEG_TO_POS_3_CONV(Theta3_IK_READY), Speed_3);
delayMicroseconds(1500);
SERVO_MoveSingleAxisAbsPos(ID_4, DEG_TO_POS_4_CONV(Theta4_IK_READY), Speed_4);
delayMicroseconds(1500);
SERVO_MoveSingleAxisAbsPos(ID_5, DEG_TO_POS_5_CONV(Theta5_IK_READY), Speed_5);
delayMicroseconds(1500);
SERVO_MoveSingleAxisAbsPos(ID_6, DEG_TO_POS_6_CONV(Theta6_IK_READY), Speed_6);
delayMicroseconds(1500);
Serial.println("DONE TASK!");
Serial.printf("THETA UPDATE: T1: %f, T2: %f, T3: %f, T4: %f, T5: %f, T6: %f\n",
GET_THETA_1(), GET_THETA_2() + THETA2_OFFSET, GET_THETA_3(),
GET_THETA_4(), GET_THETA_5(), GET_THETA_6());
EN_READY = false;
DONE_ALM = true;
}
if ((HMI_BUFFER_DATA.indexOf("STOP") != NULL_POS || digitalRead(RED_BUTTON) ==
0))
{
SERVO_AllMoveStop();
Serial.println("STOP TASK!");
EN_READY = true;
}
}
void Check_And_Run_Robot_IK_SLI()
{
Read_HMI();
if (HMI_BUFFER_DATA.indexOf("SIK") != NULL_POS)
{
EEx_Target = splitString(HMI_BUFFER_DATA, ";", 1).toFloat();
EEy_Target = splitString(HMI_BUFFER_DATA, ";", 2).toFloat();
EEz_Target = splitString(HMI_BUFFER_DATA, ";", 3).toFloat();
if (splitString(HMI_BUFFER_DATA, ";", 4) == "EE1")
{
R_0_6_Temp << 1, 0, 0,
0, -1, 0,
0, 0, -1;
}
else if (splitString(HMI_BUFFER_DATA, ";", 4) == "EE2")
{
R_0_6_Temp << 0, 0, 1,
0, -1, 0,
1, 0, 0;
}
else if (splitString(HMI_BUFFER_DATA, ";", 4) == "EE3")
{
R_0_6_Temp << 1, 0, 0,
0, 0, 1,
0, -1, 0;
}
else if (splitString(HMI_BUFFER_DATA, ";", 4) == "EE4")
{
R_0_6_Temp << -1, 0, 0,
0, 0, -1,
0, -1, 0;
}
else if (splitString(HMI_BUFFER_DATA, ";", 4) == "EEC")
{
}
Run_Time_Target = splitString(HMI_BUFFER_DATA, ";", 5).toInt();
Serial.printf("EEx_Target: %f, EEy_Target: %f, EEz_Target: %f, EE Selected: %s,
Time Target: %d\n",
EEx_Target, EEy_Target, EEz_Target, splitString(HMI_BUFFER_DATA,
";", 4), Run_Time_Target);
EE_Target_Matrix << EEx_Target, EEy_Target, EEz_Target;
long newtime = 0;
long lastime = 0;
newtime = millis();
IK_Result = Inverse_Kinematics_No_Debug(EE_Target_Matrix, R_0_6_Temp);
lastime = millis() - newtime;
Serial.printf("Time for solve IK: %ld\n", lastime);
Serial.printf("IK_Result: %s\n", IK_Result.c_str());
if (IK_Result.indexOf("OK") != NULL_POS)
{
Theta1_IK_READY = splitString(IK_Result, ";", 1).toFloat();
Theta2_IK_READY = splitString(IK_Result, ";", 2).toFloat();
Theta3_IK_READY = splitString(IK_Result, ";", 3).toFloat();
Theta4_IK_READY = splitString(IK_Result, ";", 4).toFloat();
Theta5_IK_READY = splitString(IK_Result, ";", 5).toFloat();
Theta6_IK_READY = splitString(IK_Result, ";", 6).toFloat();
theta1_old = GET_THETA_1();
theta2_old = GET_THETA_2() + THETA2_OFFSET;
theta3_old = GET_THETA_3();
theta4_old = GET_THETA_4();
theta5_old = GET_THETA_5();
theta6_old = GET_THETA_6();
Serial.printf("THETA READY: T1: %f, T2: %f, T3: %f, T4: %f, T5: %f, T6: %f\
n",
Theta1_IK_READY, Theta2_IK_READY, Theta3_IK_READY,
Theta4_IK_READY, Theta5_IK_READY, Theta6_IK_READY);
Serial.printf("SPEED READY: S1: %d, S2: %d, S3: %d, S4: %d, S5: %d, S6: %d\
n",
Speed_1, Speed_2, Speed_3, Speed_4, Speed_5, Speed_6);
Serial.printf("TIME READY: %d\n", Run_Time_Target);
EN_READY = true;
bool EXIT1 = false, EXIT2 = false, EXIT3 = false;
do
{
Read_HMI();
if ((HMI_BUFFER_DATA.indexOf("RUN") != NULL_POS ||
digitalRead(GREEN_BUTTON) == 0) && EN_READY == true)
{
SERVO_MoveSingleAxisAbsPos(ID_1, DEG_TO_POS_1_CONV(Theta1_IK_READY),
Speed_1);
delayMicroseconds(1500);
SERVO_MoveSingleAxisAbsPos(ID_2, DEG_TO_POS_2_CONV(Theta2_IK_READY - 90),
Speed_2);
delayMicroseconds(1500);
SERVO_MoveSingleAxisAbsPos(ID_3, DEG_TO_POS_3_CONV(Theta3_IK_READY),
Speed_3);
delayMicroseconds(1500);
SERVO_MoveSingleAxisAbsPos(ID_4, DEG_TO_POS_4_CONV(Theta4_IK_READY),
Speed_4);
delayMicroseconds(1500);
SERVO_MoveSingleAxisAbsPos(ID_5, DEG_TO_POS_5_CONV(Theta5_IK_READY),
Speed_5);
delayMicroseconds(1500);
SERVO_MoveSingleAxisAbsPos(ID_6, DEG_TO_POS_6_CONV(Theta6_IK_READY),
Speed_6);
delayMicroseconds(1500);
Serial.println("DONE TASK!");
Serial.printf("THETA UPDATE: T1: %f, T2: %f, T3: %f, T4: %f, T5: %f, T6:
%f\n",
GET_THETA_1(), GET_THETA_2() + THETA2_OFFSET,
GET_THETA_3(), GET_THETA_4(), GET_THETA_5(), GET_THETA_6());
EN_READY = false;
DONE_ALM = true;
}
if ((HMI_BUFFER_DATA.indexOf("STOP") != NULL_POS || digitalRead(RED_BUTTON)
== 0))
{
SERVO_AllMoveStop();
Serial.println("STOP TASK!");
EN_READY = true;
}
Write_HMI("t1", "txt", roundFloatToString(GET_THETA_1(), 1));
Write_HMI("t2", "txt", roundFloatToString(GET_THETA_2() + THETA2_OFFSET,
1));
Write_HMI("t3", "txt", roundFloatToString(GET_THETA_3(), 1));
Write_HMI("t4", "txt", roundFloatToString(GET_THETA_4(), 1));
Write_HMI("t5", "txt", roundFloatToString(GET_THETA_5(), 1));
Write_HMI("t6", "txt", roundFloatToString(GET_THETA_6(), 1));
FK_Jog = Forward_Kinematics(GET_THETA_1(), GET_THETA_2() + THETA2_OFFSET,
GET_THETA_3(), GET_THETA_4(), GET_THETA_5(), GET_THETA_6());
Write_HMI("xfk", "txt", roundFloatToString(round(FK_Jog.block<1, 1>(0,
3).value() * 10) / 10, 1));
Write_HMI("yfk", "txt", roundFloatToString(round(FK_Jog.block<1, 1>(1,
3).value() * 10) / 10, 1));
Write_HMI("zfk", "txt", roundFloatToString(round(FK_Jog.block<1, 1>(2,
3).value() * 10) / 10, 1));
if (HMI_BUFFER_DATA.indexOf("ST1") != NULL_POS)
Theta_Selection = "ST1";
else if (HMI_BUFFER_DATA.indexOf("ST2") != NULL_POS)
Theta_Selection = "ST2";
else if (HMI_BUFFER_DATA.indexOf("ST3") != NULL_POS)
Theta_Selection = "ST3";
else if (HMI_BUFFER_DATA.indexOf("ST4") != NULL_POS)
Theta_Selection = "ST4";
else if (HMI_BUFFER_DATA.indexOf("ST5") != NULL_POS)
Theta_Selection = "ST5";
else if (HMI_BUFFER_DATA.indexOf("ST6") != NULL_POS)
Theta_Selection = "ST6";
clearBufferData();
Update_Encoder_State();
Read_HMI();
if (Encoder_Pulse_Resolution != 0)
{
if (Theta_Selection == "ST1")
{
SERVO_MoveSingleAxisAbsPos(ID_1,
DEG_TO_POS_1_CONV(roundToNearestHalfDeg(GET_THETA_1() + Encoder_Pulse_Resolution)),
50000);
lastPosition = Teach_Pendant_Encoder.getCount();
// Write_HMI("t1", "txt", roundFloatToString(GET_THETA_1()));
}
else if (Theta_Selection == "ST2")
{
SERVO_MoveSingleAxisAbsPos(ID_2,
DEG_TO_POS_2_CONV(roundToNearestHalfDeg(GET_THETA_2() + Encoder_Pulse_Resolution)),
50000);
lastPosition = Teach_Pendant_Encoder.getCount();
// Write_HMI("t2", "txt", roundFloatToString(GET_THETA_2()));
}
else if (Theta_Selection == "ST3")
{
SERVO_MoveSingleAxisAbsPos(ID_3,
DEG_TO_POS_3_CONV(roundToNearestHalfDeg(GET_THETA_3() + Encoder_Pulse_Resolution)),
50000);
lastPosition = Teach_Pendant_Encoder.getCount();
// Write_HMI("t3", "txt", roundFloatToString(GET_THETA_3()));
}
else if (Theta_Selection == "ST4")
{
SERVO_MoveSingleAxisAbsPos(ID_4,
DEG_TO_POS_4_CONV(roundToNearestHalfDeg(GET_THETA_4() + Encoder_Pulse_Resolution)),
100000);
lastPosition = Teach_Pendant_Encoder.getCount();
// Write_HMI("t4", "txt", roundFloatToString(GET_THETA_4()));
}
else if (Theta_Selection == "ST5")
{
SERVO_MoveSingleAxisAbsPos(ID_5,
DEG_TO_POS_5_CONV(roundToNearestHalfDeg(GET_THETA_5() + Encoder_Pulse_Resolution)),
100000);
lastPosition = Teach_Pendant_Encoder.getCount();
// Write_HMI("t5", "txt", roundFloatToString(GET_THETA_5()));
}
else if (Theta_Selection == "ST6")
{
SERVO_MoveSingleAxisAbsPos(ID_6,
DEG_TO_POS_6_CONV(roundToNearestHalfDeg(GET_THETA_6() + Encoder_Pulse_Resolution)),
50000);
lastPosition = Teach_Pendant_Encoder.getCount();
// Write_HMI("t6", "txt", roundFloatToString(GET_THETA_6()));
}
else
lastPosition = Teach_Pendant_Encoder.getCount();
}
Update_Encoder_State();
Write_HMI("t1", "txt", roundFloatToString(GET_THETA_1(), 1));
Write_HMI("t2", "txt", roundFloatToString(GET_THETA_2() + THETA2_OFFSET, 1));
Write_HMI("t3", "txt", roundFloatToString(GET_THETA_3(), 1));
Write_HMI("t4", "txt", roundFloatToString(GET_THETA_4(), 1));
Write_HMI("t5", "txt", roundFloatToString(GET_THETA_5(), 1));
Write_HMI("t6", "txt", roundFloatToString(GET_THETA_6(), 1));
FK_Jog = Forward_Kinematics(GET_THETA_1(), GET_THETA_2() + THETA2_OFFSET,
GET_THETA_3(), GET_THETA_4(), GET_THETA_5(), GET_THETA_6());
Write_HMI("xfk", "txt", roundFloatToString(round(FK_Jog.block<1, 1>(0, 3).value()
* 10) / 10, 1));
Write_HMI("yfk", "txt", roundFloatToString(round(FK_Jog.block<1, 1>(1, 3).value()
* 10) / 10, 1));
Write_HMI("zfk", "txt", roundFloatToString(round(FK_Jog.block<1, 1>(2, 3).value()
* 10) / 10, 1));
Update_Encoder_State();
Check_And_Run_Robot_IK_ENC();
Update_Home_Sensor_State();
}
void Select_EE_Orientation_Page()
{
Read_HMI();
Update_Encoder_State();
if (HMI_BUFFER_DATA.indexOf("EET4") != NULL_POS)
Theta_Selection = "EET4";
else if (HMI_BUFFER_DATA.indexOf("EET5") != NULL_POS)
Theta_Selection = "EET5";
else if (HMI_BUFFER_DATA.indexOf("EET6") != NULL_POS)
Theta_Selection = "EET6";
clearBufferData();
Update_Encoder_State();
if (Encoder_Pulse_Resolution != 0)
{
if (Theta_Selection == "EET4")
{
SERVO_MoveSingleAxisAbsPos(ID_4,
DEG_TO_POS_4_CONV(roundToNearestHalfDeg(GET_THETA_4() + Encoder_Pulse_Resolution)),
100000);
lastPosition = Teach_Pendant_Encoder.getCount();
// Write_HMI("t4", "txt", roundFloatToString(GET_THETA_4()));
}
else if (Theta_Selection == "EET5")
{
SERVO_MoveSingleAxisAbsPos(ID_5,
DEG_TO_POS_5_CONV(roundToNearestHalfDeg(GET_THETA_5() + Encoder_Pulse_Resolution)),
100000);
lastPosition = Teach_Pendant_Encoder.getCount();
// Write_HMI("t5", "txt", roundFloatToString(GET_THETA_5()));
}
else if (Theta_Selection == "EET6")
{
SERVO_MoveSingleAxisAbsPos(ID_6,
DEG_TO_POS_6_CONV(roundToNearestHalfDeg(GET_THETA_6() + Encoder_Pulse_Resolution)),
50000);
lastPosition = Teach_Pendant_Encoder.getCount();
// Write_HMI("t6", "txt", roundFloatToString(GET_THETA_6()));
}
else
lastPosition = Teach_Pendant_Encoder.getCount();
}
Update_Encoder_State();
Read_HMI();
if (HMI_BUFFER_DATA.indexOf("CRTEE") != NULL_POS)
{
R_0_6_Temp << FK_Jog.block<1, 1>(0, 0).value(), FK_Jog.block<1, 1>(0,
1).value(), FK_Jog.block<1, 1>(0, 2),
FK_Jog.block<1, 1>(1, 0).value(), FK_Jog.block<1, 1>(1, 1).value(),
FK_Jog.block<1, 1>(1, 2).value(),
FK_Jog.block<1, 1>(2, 0), FK_Jog.block<1, 1>(2, 1), FK_Jog.block<1, 1>(2,
2).value();
Write_HMI("almEEC", "txt", "EEC Created!");
}
}
void Run_Robot_To_Target_Base_Mode(String move_Mode)
{
unsigned int Time_Move_Change = 10;
if (EE_Selection == "EE3" || EE_Selection == "EE4")
FIND_NEAREST_SOLUTION = true;
else
FIND_NEAREST_SOLUTION = false;
IK_Result = Inverse_Kinematics(EE_Target_Matrix, R_0_6_Temp);
Serial.printf("IK_Result: %s\n", IK_Result.c_str());
if (IK_Result.indexOf("OK") != NULL_POS)
{
Theta1_IK_READY = splitString(IK_Result, ";", 1).toFloat();
Theta2_IK_READY = splitString(IK_Result, ";", 2).toFloat();
Theta3_IK_READY = splitString(IK_Result, ";", 3).toFloat();
Theta4_IK_READY = splitString(IK_Result, ";", 4).toFloat();
Theta5_IK_READY = splitString(IK_Result, ";", 5).toFloat();
Theta6_IK_READY = splitString(IK_Result, ";", 6).toFloat();
theta1_old = GET_THETA_1();
theta2_old = GET_THETA_2() + THETA2_OFFSET;
theta3_old = GET_THETA_3();
theta4_old = GET_THETA_4();
theta5_old = GET_THETA_5();
theta6_old = GET_THETA_6();
if (move_Mode == "EEMOVE")
{
switch (Speed_Selection_Mode)
{
case 1:
Time_Move_Change = 15;
break;
case 2:
Time_Move_Change = 10;
break;
case 3:
Time_Move_Change = 5;
break;
default:
Time_Move_Change = 15;
break;
}
}
else if (move_Mode == "AXISMOVE")
{
switch (Speed_Selection_Mode)
{
case 1:
Time_Move_Change = 1;
break;
case 2:
Time_Move_Change = 1;
break;
case 3:
Time_Move_Change = 1;
break;
default:
Time_Move_Change = 1;
break;
}
}
else if (move_Mode == "ROWMOVE")
Time_Move_Change = Row_Data_T1.moveTimeValue;
else
Time_Move_Change = 10;
Serial.printf("THETA READY: T1: %f, T2: %f, T3: %f, T4: %f, T5: %f, T6: %f\n",
Theta1_IK_READY, Theta2_IK_READY, Theta3_IK_READY,
Theta4_IK_READY, Theta5_IK_READY, Theta6_IK_READY);
Serial.printf("SPEED READY: S1: %d, S2: %d, S3: %d, S4: %d, S5: %d, S6: %d\n",
Speed_1, Speed_2, Speed_3, Speed_4, Speed_5, Speed_6);
Serial.printf("TIME READY: %d\n", Run_Time_Target);
Serial.println("DONE TASK!");
Serial.printf("THETA UPDATE: T1: %f, T2: %f, T3: %f, T4: %f, T5: %f, T6: %f\n",
GET_THETA_1(), GET_THETA_2() + THETA2_OFFSET, GET_THETA_3(),
GET_THETA_4(), GET_THETA_5(), GET_THETA_6());
}
}
void Move_Change_EE_Orientatation_Base_Mode_Page()
{
Serial.println("Move_Change_EE_Orientatation_Base_Mode_Page");
FK_Jog = Forward_Kinematics(GET_THETA_1(), GET_THETA_2() + THETA2_OFFSET,
GET_THETA_3(), GET_THETA_4(), GET_THETA_5(), GET_THETA_6());
EE_Target_Matrix << round(FK_Jog.block<1, 1>(0, 3).value()),
round(FK_Jog.block<1, 1>(1, 3).value()),
round(FK_Jog.block<1, 1>(2, 3).value());
Run_Robot_To_Target_Base_Mode("EEMOVE");
}
void Check_Move_Change_EE_Orientation_Base_Mode()
{
Read_HMI();
if (HMI_BUFFER_DATA.indexOf("EE1") != NULL_POS)
{
bool EN_MOVE = (GET_SPEED_1() == 0 && GET_SPEED_2() == 0 && GET_SPEED_3() == 0
&& GET_SPEED_4() == 0 && GET_SPEED_5() == 0 && GET_SPEED_6() == 0);
if (EN_MOVE)
{
R_0_6_Temp << 1, 0, 0,
0, -1, 0,
0, 0, -1;
Serial.println("EE1 Selected!");
EE_Selection = "EE1";
Move_Change_EE_Orientatation_Base_Mode_Page();
}
clearBufferData();
}
else if (HMI_BUFFER_DATA.indexOf("EE2") != NULL_POS)
{
bool EN_MOVE = (GET_SPEED_1() == 0 && GET_SPEED_2() == 0 && GET_SPEED_3() == 0
&& GET_SPEED_4() == 0 && GET_SPEED_5() == 0 && GET_SPEED_6() == 0);
if (EN_MOVE)
{
R_0_6_Temp << 0, 0, 1,
0, -1, 0,
1, 0, 0;
Serial.println("EE2 Selected!");
EE_Selection = "EE2";
Move_Change_EE_Orientatation_Base_Mode_Page();
}
clearBufferData();
}
else if (HMI_BUFFER_DATA.indexOf("EE3") != NULL_POS)
{
bool EN_MOVE = (GET_SPEED_1() == 0 && GET_SPEED_2() == 0 && GET_SPEED_3() == 0
&& GET_SPEED_4() == 0 && GET_SPEED_5() == 0 && GET_SPEED_6() == 0);
if (EN_MOVE)
{
R_0_6_Temp << 1, 0, 0,
0, 0, 1,
0, -1, 0;
Serial.println("EE3 Selected!");
EE_Selection = "EE3";
FIND_NEAREST_SOLUTION = true;
Move_Change_EE_Orientatation_Base_Mode_Page();
}
clearBufferData();
}
else if (HMI_BUFFER_DATA.indexOf("EE4") != NULL_POS)
{
bool EN_MOVE = (GET_SPEED_1() == 0 && GET_SPEED_2() == 0 && GET_SPEED_3() == 0
&& GET_SPEED_4() == 0 && GET_SPEED_5() == 0 && GET_SPEED_6() == 0);
if (EN_MOVE)
{
R_0_6_Temp << -1, 0, 0,
0, 0, -1,
0, -1, 0;
Serial.println("EE4 Selected!");
EE_Selection = "EE4";
FIND_NEAREST_SOLUTION = true;
Move_Change_EE_Orientatation_Base_Mode_Page();
}
clearBufferData();
}
else if (HMI_BUFFER_DATA.indexOf("EEC") != NULL_POS)
{
do
{
Read_HMI();
if (HMI_BUFFER_DATA.indexOf("EET4") != NULL_POS)
Theta_Selection = "EET4";
else if (HMI_BUFFER_DATA.indexOf("EET5") != NULL_POS)
Theta_Selection = "EET5";
else if (HMI_BUFFER_DATA.indexOf("EET6") != NULL_POS)
Theta_Selection = "EET6";
Update_Encoder_State();
if (Encoder_Pulse_Resolution != 0)
{
if (Theta_Selection == "EET4")
{
SERVO_MoveSingleAxisAbsPos(ID_4,
DEG_TO_POS_4_CONV(roundToNearestHalfDeg(GET_THETA_4() + Encoder_Pulse_Resolution)),
100000);
lastPosition = Teach_Pendant_Encoder.getCount();
// Write_HMI("t4", "txt", roundFloatToString(GET_THETA_4()));
}
else if (Theta_Selection == "EET5")
{
SERVO_MoveSingleAxisAbsPos(ID_5,
DEG_TO_POS_5_CONV(roundToNearestHalfDeg(GET_THETA_5() + Encoder_Pulse_Resolution)),
100000);
lastPosition = Teach_Pendant_Encoder.getCount();
// Write_HMI("t5", "txt", roundFloatToString(GET_THETA_5()));
}
else if (Theta_Selection == "EET6")
{
SERVO_MoveSingleAxisAbsPos(ID_6,
DEG_TO_POS_6_CONV(roundToNearestHalfDeg(GET_THETA_6() + Encoder_Pulse_Resolution)),
50000);
lastPosition = Teach_Pendant_Encoder.getCount();
// Write_HMI("t6", "txt", roundFloatToString(GET_THETA_6()));
}
else
lastPosition = Teach_Pendant_Encoder.getCount();
}
Update_Speed_Selection();
Write_HMI("t4", "txt", roundFloatToString(GET_THETA_4(), 1));
Write_HMI("t5", "txt", roundFloatToString(GET_THETA_5(), 1));
Write_HMI("t6", "txt", roundFloatToString(GET_THETA_6(), 1));
Read_HMI();
} while (HMI_BUFFER_DATA.indexOf("CRTEE") == NULL_POS);
Update_Speed_Selection();
Check_Move_Change_EE_Orientation_Base_Mode();
Read_HMI();
if (HMI_BUFFER_DATA.indexOf("XAXIS") != NULL_POS)
Axis_Selection = "XAXIS";
else if (HMI_BUFFER_DATA.indexOf("YAXIS") != NULL_POS)
Axis_Selection = "YAXIS";
else if (HMI_BUFFER_DATA.indexOf("ZAXIS") != NULL_POS)
Axis_Selection = "ZAXIS";
clearBufferData();
Update_Speed_Selection();
Check_Move_Change_EE_Orientation_Base_Mode();
Update_Encoder_State();
// Serial.printf("Axis_Resolution: %f\n", Axis_Resolution);
if (Axis_Resolution >= -50 && Axis_Resolution != 0 && Axis_Resolution <= 50)
{
bool EN_MOVE = (GET_SPEED_1() == 0 && GET_SPEED_2() == 0 && GET_SPEED_3() == 0
&& GET_SPEED_4() == 0 && GET_SPEED_5() == 0 && GET_SPEED_6() == 0);
if (EN_MOVE)
{
if (Axis_Selection == "XAXIS")
{
FK_Jog = Forward_Kinematics(GET_THETA_1(), GET_THETA_2() + THETA2_OFFSET,
GET_THETA_3(), GET_THETA_4(), GET_THETA_5(), GET_THETA_6());
EE_Target_Matrix << round(FK_Jog.block<1, 1>(0, 3).value() +
Axis_Resolution),
round(FK_Jog.block<1, 1>(1, 3).value()),
round(FK_Jog.block<1, 1>(2, 3).value());
Run_Robot_To_Target_Base_Mode("AXISMOVE");
lastPosition = Teach_Pendant_Encoder.getCount();
}
else if (Axis_Selection == "YAXIS")
{
FK_Jog = Forward_Kinematics(GET_THETA_1(), GET_THETA_2() + THETA2_OFFSET,
GET_THETA_3(), GET_THETA_4(), GET_THETA_5(), GET_THETA_6());
EE_Target_Matrix << round(FK_Jog.block<1, 1>(0, 3).value()),
round(FK_Jog.block<1, 1>(1, 3).value() + Axis_Resolution),
round(FK_Jog.block<1, 1>(2, 3).value());
Run_Robot_To_Target_Base_Mode("AXISMOVE");
lastPosition = Teach_Pendant_Encoder.getCount();
}
else if (Axis_Selection == "ZAXIS")
{
FK_Jog = Forward_Kinematics(GET_THETA_1(), GET_THETA_2() + THETA2_OFFSET,
GET_THETA_3(), GET_THETA_4(), GET_THETA_5(), GET_THETA_6());
EE_Target_Matrix << round(FK_Jog.block<1, 1>(0, 3).value()),
round(FK_Jog.block<1, 1>(1, 3).value()),
round(FK_Jog.block<1, 1>(2, 3).value() + Axis_Resolution);
Run_Robot_To_Target_Base_Mode("AXISMOVE");
lastPosition = Teach_Pendant_Encoder.getCount();
}
else
lastPosition = Teach_Pendant_Encoder.getCount();
}
else
lastPosition = Teach_Pendant_Encoder.getCount();
}
else
lastPosition = Teach_Pendant_Encoder.getCount();
Update_Speed_Selection();
Check_Move_Change_EE_Orientation_Base_Mode();
FK_Jog = Forward_Kinematics(GET_THETA_1(), GET_THETA_2() + THETA2_OFFSET,
GET_THETA_3(), GET_THETA_4(), GET_THETA_5(), GET_THETA_6());
Write_HMI("x", "txt", roundFloatToString(round(FK_Jog.block<1, 1>(0, 3).value() *
10) / 10, 1));
Write_HMI("y", "txt", roundFloatToString(round(FK_Jog.block<1, 1>(1, 3).value() *
10) / 10, 1));
Write_HMI("z", "txt", roundFloatToString(round(FK_Jog.block<1, 1>(2, 3).value() *
10) / 10, 1));
Write_HMI("t4", "txt", roundFloatToString(GET_THETA_4(), 1));
Write_HMI("t5", "txt", roundFloatToString(GET_THETA_5(), 1));
Write_HMI("t6", "txt", roundFloatToString(GET_THETA_6(), 1));
}
void Add_Row_Data_To_File(unsigned int rowNo)
{
String pathFile = "/P" + String(rowNo) + "T1" + ".txt";
String markAndRowInfo = "1;" + String(Row_Data_T1.rowNo) + ";" +
Row_Data_T1.posName + ";";
String positionInfo = String(Row_Data_T1.EEx_Value) + ";" +
String(Row_Data_T1.EEy_Value) + ";" + String(Row_Data_T1.EEz_Value) + ";" +
Row_Data_T1.EE_Orientation + ";";
String timeAndRelayState = String(Row_Data_T1.moveTimeValue) + ";" +
String(Row_Data_T1.waitTimeValue) + ";" + Row_Data_T1.out1State + ";" +
Row_Data_T1.out2State + ";";
String R_0_6_EEC = "";
String content = markAndRowInfo + positionInfo + timeAndRelayState + R_0_6_EEC;
Serial.printf("PathFile: %s\n", pathFile.c_str());
Serial.printf("Content: %s\n", content.c_str());
bool writeFileStatus = writeFile(SD, pathFile.c_str(), content.c_str());
if (writeFileStatus == true)
Alarm_HMI("Saved Successfully!");
else
Alarm_HMI("Save Failed!");
}
void Add_HMI_Data_To_Struct()
{
Row_Data_T1.posName = splitString(HMI_BUFFER_DATA, ";", 1);
Row_Data_T1.EEx_Value = splitString(HMI_BUFFER_DATA, ";", 2).toFloat();
Row_Data_T1.EEy_Value = splitString(HMI_BUFFER_DATA, ";", 3).toFloat();
Row_Data_T1.EEz_Value = splitString(HMI_BUFFER_DATA, ";", 4).toFloat();
Row_Data_T1.EE_Orientation = splitString(HMI_BUFFER_DATA, ";", 5);
Row_Data_T1.moveTimeValue = splitString(HMI_BUFFER_DATA, ";", 6).toInt();
Row_Data_T1.waitTimeValue = splitString(HMI_BUFFER_DATA, ";", 7).toInt();
Row_Data_T1.out1State = splitString(HMI_BUFFER_DATA, ";", 8);
Row_Data_T1.out2State = splitString(HMI_BUFFER_DATA, ";", 9);
}
void Add_SD_Data_To_Struct(String rowData)
{
Row_Data_T1.rowNo = splitString(rowData, ";", 1).toInt();
Row_Data_T1.posName = splitString(rowData, ";", 2);
Row_Data_T1.EEx_Value = splitString(rowData, ";", 3).toFloat();
Row_Data_T1.EEy_Value = splitString(rowData, ";", 4).toFloat();
Row_Data_T1.EEz_Value = splitString(rowData, ";", 5).toFloat();
Row_Data_T1.EE_Orientation = splitString(rowData, ";", 6);
Row_Data_T1.moveTimeValue = splitString(rowData, ";", 7).toInt();
Row_Data_T1.waitTimeValue = splitString(rowData, ";", 8).toInt();
Row_Data_T1.out1State = splitString(rowData, ";", 9);
Row_Data_T1.out2State = splitString(rowData, ";", 10);
}
void Edit_Data_To_Struct()
{
Row_Data_T1.rowNo = splitString(HMI_BUFFER_DATA, ";", 1).toInt();
Row_Data_T1.posName = splitString(HMI_BUFFER_DATA, ";", 2);
Row_Data_T1.EEx_Value = splitString(HMI_BUFFER_DATA, ";", 3).toFloat();
Row_Data_T1.EEy_Value = splitString(HMI_BUFFER_DATA, ";", 4).toFloat();
Row_Data_T1.EEz_Value = splitString(HMI_BUFFER_DATA, ";", 5).toFloat();
Row_Data_T1.EE_Orientation = splitString(HMI_BUFFER_DATA, ";", 6);
Row_Data_T1.moveTimeValue = splitString(HMI_BUFFER_DATA, ";", 7).toInt();
Row_Data_T1.waitTimeValue = splitString(HMI_BUFFER_DATA, ";", 8).toInt();
Row_Data_T1.out1State = splitString(HMI_BUFFER_DATA, ";", 9);
Row_Data_T1.out2State = splitString(HMI_BUFFER_DATA, ";", 10);
}
void Update_Row_Data_HMI(unsigned int row_update, unsigned int row_end)
{
unsigned int rowNo = (unsigned int)(row_update - (row_end / 10 - 1) * 10);
Serial.printf("Update Data Row: %d - [Row_Update: %d]\n", rowNo, row_update);
Write_HMI("n" + String(rowNo), "txt", String(row_update));
Write_HMI("p" + String(rowNo), "txt", Row_Data_T1.posName);
Write_HMI("x" + String(rowNo), "txt", roundFloatToString(Row_Data_T1.EEx_Value,
1));
Write_HMI("y" + String(rowNo), "txt", roundFloatToString(Row_Data_T1.EEy_Value,
1));
Write_HMI("z" + String(rowNo), "txt", roundFloatToString(Row_Data_T1.EEz_Value,
1));
Write_HMI("e" + String(rowNo), "txt", Row_Data_T1.EE_Orientation);
Write_HMI("m" + String(rowNo), "txt", String(Row_Data_T1.moveTimeValue));
Write_HMI("w" + String(rowNo), "txt", String(Row_Data_T1.waitTimeValue));
Write_HMI("o1" + String(rowNo), "pco", Row_Data_T1.out1State == "ON" ? 2016 :
63488);
Write_HMI("o1" + String(rowNo), "txt", Row_Data_T1.out1State);
Write_HMI("o2" + String(rowNo), "pco", Row_Data_T1.out2State == "ON" ? 2016 :
63488);
Write_HMI("o2" + String(rowNo), "txt", Row_Data_T1.out2State);
}
void Update_Row_Null_HMI(unsigned int row_update, unsigned int row_end)
{
unsigned int rowNo = (unsigned int)(row_update - (row_end / 10 - 1) * 10);
Serial.printf("Update Null Row: %d - [Row_Update: %d]\n", rowNo, row_update);
Write_HMI("n" + String(rowNo), "txt", "");
Write_HMI("p" + String(rowNo), "txt", "");
Write_HMI("x" + String(rowNo), "txt", "");
Write_HMI("y" + String(rowNo), "txt", "");
Write_HMI("z" + String(rowNo), "txt", "");
Write_HMI("e" + String(rowNo), "txt", "");
Write_HMI("m" + String(rowNo), "txt", "");
Write_HMI("w" + String(rowNo), "txt", "");
Write_HMI("o1" + String(rowNo), "txt", "");
Write_HMI("o2" + String(rowNo), "txt", "");
}
void Update_Data_Table(unsigned int row_begin, unsigned int row_end)
{
for (unsigned int row = row_begin; row <= row_end; row++)
{
String pathFile = "/P" + String(row) + "T1" + ".txt";
String contentReturn = readFile(SD, pathFile.c_str());
if (Row_Data_T1.EE_Orientation == "EE1")
{
R_0_6_Temp << 1, 0, 0,
0, -1, 0,
0, 0, -1;
}
else if (Row_Data_T1.EE_Orientation == "EE2")
{
R_0_6_Temp << 0, 0, 1,
0, -1, 0,
1, 0, 0;
}
else if (Row_Data_T1.EE_Orientation == "EE3")
{
R_0_6_Temp << 1, 0, 0,
0, 0, 1,
0, -1, 0;
}
else if (Row_Data_T1.EE_Orientation == "EE4")
{
R_0_6_Temp << -1, 0, 0,
0, 0, -1,
0, -1, 0;
}
else if (Row_Data_T1.EE_Orientation == "EEC")
{
}
Run_Robot_To_Target_Base_Mode("ROWMOVE");
bool EXIT1 = false, EXIT2 = false, EXIT3 = false;
do
{
FK_Jog = Forward_Kinematics(GET_THETA_1(), GET_THETA_2() + THETA2_OFFSET,
GET_THETA_3(), GET_THETA_4(), GET_THETA_5(), GET_THETA_6());
Write_HMI("x", "txt", roundFloatToString(round(FK_Jog.block<1, 1>(0,
3).value() * 10) / 10, 1));
Write_HMI("y", "txt", roundFloatToString(round(FK_Jog.block<1, 1>(1,
3).value() * 10) / 10, 1));
Write_HMI("z", "txt", roundFloatToString(round(FK_Jog.block<1, 1>(2,
3).value() * 10) / 10, 1));
if (New_Row_Data == true)
{
Update_Data_Table(row_begin, row_begin + 9);
New_Row_Data = false;
clearBufferData();
}
Read_HMI();
Check_Change_Page_Fcns();
}
while (CURRENT_PAGE == "KI_SLI")
{
// Update_System_Status();
// Serial.println("This is the KI_SLI Page !");
Kinematic_Slider_Mode_Page();
Read_HMI();
Check_Change_Page_Fcns();
}
while (CURRENT_PAGE == "KI_ENC")
{
// Serial.println("This is the KI_ENC Page !");
Kinematic_Encoder_Mode_Page();
// Serial.printf("H1: %d, H2: %d, H3: %d, H4: %d, H5: %d, H6: %d\n",
// digitalRead(HOME_SENSOR_J1), digitalRead(HOME_SENSOR_J2),
digitalRead(HOME_SENSOR_J3), digitalRead(HOME_SENSOR_J4),
digitalRead(HOME_SENSOR_J5), digitalRead(HOME_SENSOR_J6));
Read_HMI();
Check_Change_Page_Fcns();
}
while (CURRENT_PAGE == "EEOP")
{
// Serial.println("This is the Select EE Ori Page !");
Select_EE_Orientation_Page();
Read_HMI();
Check_Change_Page_Fcns();
}
while (CURRENT_PAGE == "BP")
{
// Update_System_Status();
// Serial.println("This is the Base Mode Page !");
Base_Mode_Page();
Read_HMI();
Check_Change_Page_Fcns();
}
while (CURRENT_PAGE == "PP")
{
// Serial.println("This is the Position Table Page !");
Position_Table_Page();
Read_HMI();
Check_Change_Page_Fcns();
}
while (CURRENT_PAGE == "AP")
{
// Serial.println("This is the About Page !");
Read_HMI();
Check_Change_Page_Fcns();
}
while (CURRENT_PAGE == "DEBUG")
{
// Serial.println("This is the Debug Page !");
Debug_Page();
Read_HMI();
Check_Change_Page_Fcns();
}
}
void SET_ALL_POS_INIT(float theta1_init, float theta2_init, float theta3_init,
float theta4_init, float theta5_init, float theta6_init)
{
SERVO_SetActualPos(ID_1, DEG_TO_POS_1_CONV(theta1_init));
SERVO_SetActualPos(ID_2, DEG_TO_POS_2_CONV(theta2_init));
SERVO_SetActualPos(ID_3, DEG_TO_POS_3_CONV(theta3_init));
SERVO_SetActualPos(ID_4, DEG_TO_POS_4_CONV(theta4_init));
SERVO_SetActualPos(ID_5, DEG_TO_POS_5_CONV(theta5_init));
SERVO_SetActualPos(ID_6, DEG_TO_POS_6_CONV(theta6_init));
}
void Initialization_Fcns()
{
// digitalWrite(RELAY_5, HIGH);
// digitalWrite(RELAY_6, LOW);
// delay(500);
// digitalWrite(RELAY_5, LOW);
// digitalWrite(RELAY_6, HIGH);
// delay(500);
// digitalWrite(RELAY_5, LOW);
// digitalWrite(RELAY_6, LOW);
// delay(500);
// digitalWrite(RELAY_5, HIGH);
// digitalWrite(RELAY_6, HIGH);
// delay(500);
// digitalWrite(RELAY_5, LOW);
// digitalWrite(RELAY_6, LOW);
// delay(500);
// digitalWrite(BUZZER, HIGH);
// delay(300);
// digitalWrite(BUZZER, LOW);
// delay(300);
// digitalWrite(BUZZER, HIGH);
// delay(300);
// digitalWrite(BUZZER, LOW);
// delay(300);
digitalWrite(RELAY_5, LOW);
digitalWrite(RELAY_6, LOW);
FK_Jog << 0, 0, 0, 0,
0, 0, 0, 0,
0, 0, 0, 0,
0, 0, 0, 0;
R_0_6_Temp << 0, 0, 0,
0, 0, 0,
0, 0, 0;
EE_Target_Matrix << 0, 0, 0;
String Theta_Init = readFile(SD, "/LAST_THETA.txt");
Serial.printf("LAST_THETA: %s\n", Theta_Init.c_str());
theta1_Init = splitString(Theta_Init, ";", 1).toFloat();
theta2_Init = splitString(Theta_Init, ";", 2).toFloat();
theta3_Init = splitString(Theta_Init, ";", 3).toFloat();
theta4_Init = splitString(Theta_Init, ";", 4).toFloat();
theta5_Init = splitString(Theta_Init, ";", 5).toFloat();
theta6_Init = splitString(Theta_Init, ";", 6).toFloat();
SET_ALL_POS_INIT(theta1_Init, theta2_Init, theta3_Init, theta4_Init, theta5_Init,
theta6_Init);
}
void setup()
{
/*========== SETUP PINMODE ==========*/
pinMode(BUZZER, OUTPUT);
pinMode(RELAY_5, OUTPUT);
pinMode(RELAY_6, OUTPUT);
pinMode(BUZZER, OUTPUT);
pinMode(cs, OUTPUT);
pinMode(cs_ethernet, OUTPUT);
pinMode(RED_BUTTON, INPUT);
pinMode(GREEN_BUTTON, INPUT);
pinMode(HOME_SENSOR_J1, INPUT);
pinMode(HOME_SENSOR_J2, INPUT);
pinMode(HOME_SENSOR_J3, INPUT);
pinMode(HOME_SENSOR_J4, INPUT);
pinMode(HOME_SENSOR_J5, INPUT);
pinMode(HOME_SENSOR_J6, INPUT);
// digitalWrite(BUZZER, HIGH);
// delay(100);
// digitalWrite(BUZZER, LOW);
// delay(100);
Check_Change_Page_Fcns();
Update_Current_Page_Fcns();
}