Collaboration Between Arduino Robot Arm
Collaboration Between Arduino Robot Arm
utm_source=feedburner&utm_medium=email&utm_campaign=Feed:+PLC-Learning-Ladder+(PLC,
+SCADA,+Automation,+PLC+Programming,+PLC+eBook,+Free+PLC+Training)
for Arduino robot arm movement by the PLC with movement data from PLC memory.
Communication between Arduino Robot Arm with PLC using Modbus communication.
for Robot Arm using MeArm, and MeArm is Robot Arm with 4 DOF Robot Arm.
Video demonstration:
Arduino Robot Arm (MeArm) - Modbus - PLC
Hardware Required for Arduino Robot Arm
1. MeArm
4. Arduino UNO
2. MeArm Left Side Servo movement from Modbus 40002 / VW2 of S7-200
3. MeArm Right Side Servo movement from Modbus 40003 / VW4 of S7-200
#define MODBUSSlaveAddress 1
#define MODBUSbaud 9600
#define MODBUSformat SERIAL_8E1
#define MODBUStimeout 1000
#define MODBUSpolling 1
#define MODBUSretry_count 0
#define MODBUSTxEnablePin 13
enum
{
MODBUSPACKET1,
MODBUSPACKET2,
MODBUSTOTAL_NO_OF_PACKETS
};
Packet MODBUSpackets[MODBUSTOTAL_NO_OF_PACKETS];
void setup() {
//Rotary Servo
PIN[0] = 10;
MIN[0] = 0;
MAX[0] = 180;
INITANGLE[0] = 90;
//Left Side
PIN[1] = 5;
MIN[1] = 20;
MAX[1] = 150;
INITANGLE[1] = 90;
//Right Side
PIN[2] = 6;
MIN[2] = 0;
MAX[2] = 110;
INITANGLE[2] = 10;
//Claw Servo
PIN[3] = 9;
MIN[3] = 0;
MAX[3] = 130;
INITANGLE[3] = 25;
MeArmServo[1].attach(PIN[1]);
MeArmServo[1].write(INITANGLE[1]);
delay(1000);
MeArmServo[2].attach(PIN[2]);
MeArmServo[2].write(INITANGLE[2]);
delay(1000);
MeArmServo[3].attach(PIN[3]);
MeArmServo[3].write(INITANGLE[3]);
MeArmServo[0].attach(PIN[0]);
MeArmServo[0].write(INITANGLE[0]);
MODBUSwriteRegs[0] = INITANGLE[0];
MODBUSwriteRegs[1] = INITANGLE[1];
MODBUSwriteRegs[2] = INITANGLE[2];
MODBUSwriteRegs[3] = INITANGLE[3];
yield();
}
void loop() {
modbus_update();
POSAngle[0] = MODBUSreadRegs[0];
POSAngle[1] = MODBUSreadRegs[1];
POSAngle[2] = MODBUSreadRegs[2];
POSAngle[3] = MODBUSreadRegs[3];
FEED_RATE = MODBUSreadRegs[4];
Move_Pos(POSAngle[0] ,POSAngle[1], POSAngle[2], POSAngle[3], FEED_RATE);
MODBUSwriteRegs[4] = FEED_RATE;
}
void Move_Pos(uint16_t Rotary, uint16_t Left, uint16_t Right, uint16_t
Claw,uint16_t deg_per_100ms) {
if(deg_per_100ms==0)return;
if(Rotary<MIN[0])Rotary=MIN[0];
if(Rotary>MAX[0])Rotary=MAX[0];
if(Left<MIN[1])Left=MIN[1];
if(Left>MAX[1])Left=MAX[1];
if(Right<MIN[2])Right=MIN[2];
if(Right>MAX[2])Right=MAX[2];
if(Claw<MIN[3])Claw=MIN[3];
if(Claw>MAX[3])Claw=MAX[3];
uint8_t time_factor = 1;
uint16_t Rotary_time = (int) (buff_Rotary_time*time_factor);
uint16_t Left_time = (int) (buff_Left_time*time_factor);
uint16_t Right_time = (int) (buff_Right_time*time_factor);
uint16_t Claw_time = (int) (buff_Claw_time*time_factor);
if(MeArmServo[0].read()!=Rotary){
if(MeArmServo[0].read()>Rotary){
if(currentMillis>=Rotary_Millis){
Rotary_target-=1;
Rotary_Millis = millis()+Rotary_time;
}
if(MeArmServo[0].read()==Rotary)Rotary_target=Rotary;
if (!MeArmServo[0].attached()){
MeArmServo[0].attach(PIN[0]);
}
MeArmServo[0].write(Rotary_target);
}
if(MeArmServo[0].read()<Rotary){
if(currentMillis>=Rotary_Millis){
Rotary_target+=1;
Rotary_Millis = millis()+Rotary_time;
}
if(MeArmServo[0].read()==Rotary)Rotary_target=Rotary;
if (!MeArmServo[0].attached()){
MeArmServo[0].attach(PIN[0]);
}
MeArmServo[0].write(Rotary_target);
}
}else{
Pos_Rotary = true;
}
if(MeArmServo[1].read()!=Left){
if(MeArmServo[1].read()>Left){
if(currentMillis>=Left_Millis){
Left_target-=1;
Left_Millis = millis()+Left_time;
}
if(MeArmServo[1].read()==Left)Left_target=Left;
if (!MeArmServo[1].attached()){
MeArmServo[1].attach(PIN[1]);
}
MeArmServo[1].write(Left_target);
}
if(MeArmServo[1].read()<Left){
if(currentMillis>=Left_Millis){
Left_target+=1;
Left_Millis = millis()+Left_time;
}
if(MeArmServo[1].read()==Left)Left_target=Left;
if (!MeArmServo[1].attached()){
MeArmServo[1].attach(PIN[1]);
}
MeArmServo[1].write(Left_target);
}
}else{
Pos_Left =true;
}
if(MeArmServo[2].read()!=Right){
if(MeArmServo[2].read()>Right){
if(currentMillis>=Right_Millis){
Right_target-=1;
Right_Millis = millis()+Right_time;
}
if(MeArmServo[2].read()==Right)Right_target=Right;
if (!MeArmServo[2].attached()){
MeArmServo[2].attach(PIN[2]);
}
MeArmServo[2].write(Right_target);
if(MeArmServo[2].read()<Right){
if(currentMillis>=Right_Millis){
Right_target+=1;
Right_Millis = millis()+Right_time;
}
if(MeArmServo[2].read()==Right)Right_target=Right;
if (!MeArmServo[2].attached()){
MeArmServo[2].attach(PIN[2]);
}
MeArmServo[2].write(Right_target);
}
}else{
Pos_Right =true;
}
if(MeArmServo[3].read()!=Claw){
if(MeArmServo[3].read()>Claw){
if(currentMillis>=Claw_Millis){
Claw_target-=1;
Claw_Millis = millis()+Claw_time;
}
if(MeArmServo[3].read()==Claw)Claw_target=Claw;
if (!MeArmServo[3].attached()){
MeArmServo[3].attach(PIN[3]);
}
MeArmServo[3].write(Claw_target);
if(MeArmServo[3].read()<Claw){
if(currentMillis>=Claw_Millis){
Claw_target+=1;
Claw_Millis = millis()+Claw_time;
}
if(MeArmServo[3].read()==Claw)Claw_target=Claw;
if (!MeArmServo[3].attached()){
MeArmServo[3].attach(PIN[3]);
}
MeArmServo[3].write(Claw_target);
}
}else{
Pos_Claw =true;
}
}