App sul cellulare per giocare a scacchi via WiFi con ESP32 che comunica con controller robot ABB che muove i pezzi su una scacchiera.
MODULE MainModule
PERS tooldata Servo:=[TRUE,[[0,0,114.2],[1,0,0,0]],[0.24,[8.2,12.5,48.1],[1,0,0,0],0.00022,0.00024,0.00009]];
PERS tooldata VaccumOne:=[TRUE,[[63.5,18.5,37.5],[0.707107,0,0.707107,0]],[0.24,[8.2,12.5,48.1],[1,0,0,0],0.00022,0.00024,9E-5]];
PERS tooldata Camera:=[TRUE,[[-7.3,28.3,35.1],[0.5,-0.5,0.5,0.5]],[0.24,[8.2,12.5,48.1],[1,0,0,0],0.00022,0.00024,0.00009]];
TASK PERS wobjdata wobj_scacchiera_a1:=[FALSE,TRUE,"",[[-500,-160,0],[1,0,0,0]],[[0,0,0],[1,0,0,0]]];
CONST jointtarget sollevato:=[[8.27479467,-55.149085208,-30.437467621,-39.964939475,80.81227792,-129.284033591],[-129.406526204,9E+09,9E+09,9E+09,9E+09,9E+09]];
CONST robtarget sopra_a1:=[[20.000045174,19.999986455,174.999892058],[0.000000042,-0.000000014,1,0.000000086],[0,0,-2,4],[40.568814509,9E+09,9E+09,9E+09,9E+09,9E+09]];
CONST robtarget presa_a1:=[[20.0000107,20.000045104,74.999976278],[0.000000003,0.000000011,1,0.000000087],[0,-1,-2,4],[40.568807487,9E+09,9E+09,9E+09,9E+09,9E+09]];
! definizioni sulla scacchiera https://it.wikipedia.org/wiki/Notazione_algebrica
! distanza tra una casa e l'altra (lato della casella)
CONST num delta:=40;
! stringa di testo con le coordinate di prelievo e deposito del pezzo inviata dal PC
VAR string sFrom:="11";
VAR string sTo:="53";
! valore numerico corrispondente alle due stringhe
VAR num numFrom;
VAR num numTo;
! coordinate x e y dei punti di prelievo e deposito (x = colonna, y = traversa)
VAR num x1;
VAR num y1;
VAR num x2;
VAR num y2;
PROC main()
! NB bisogna calibrare la pinza da Impostazioni|SmartGripper|modulo servoassistito
! cliccare su grip+ poi grip- e infine Calibrate
!sollevo il robot
MoveAbsJ sollevato,v500,z10,Servo\WObj:=wobj_scacchiera_a1;
! converte la stringa in un valore numerico e segnala eventuali errori di conversione
IF StrToVal(sFrom,numFrom)=FALSE THEN
TPWrite "Conversion Failed!";
Stop;
ENDIF
IF StrToVal(sTo,numTo)=FALSE THEN
TPWrite "Conversion Failed!";
Stop;
ENDIF
! ricava le coordinate dal valore numerico (yx -> x, y)
x1:=numFrom MOD 10;
! cifra meno significativa
y1:=numFrom DIV 10;
! cifra più significativa
x2:=numTo MOD 10;
! cifra meno significativa
y2:=numTo DIV 10;
! cifra più significativa
! sposto il pezzo da x1,y1 a x2,y2
preleva x1,y1;
deposita x2,y2;
! sollevo il robot
MoveAbsJ sollevato,v500,z10,Servo\WObj:=wobj_scacchiera_a1;
ENDPROC
PROC preleva(num c,num t)
! sposta il braccio sopra il punto di prelievo
apriPinza;
MoveJ Offs(sopra_a1,delta*(c-1),delta*(t-1),0),v500,z10,Servo\wobj:=wobj_scacchiera_a1;
MoveL Offs(presa_a1,delta*(c-1),delta*(t-1),0),v500,fine,Servo\wobj:=wobj_scacchiera_a1;
chiudiPinza;
MoveL Offs(sopra_a1,delta*(c-1),delta*(t-1),0),v500,z10,Servo\wobj:=wobj_scacchiera_a1;
ENDPROC
PROC deposita(num c,num t)
! sposta il braccio sopra il punto di prelievo
MoveJ Offs(sopra_a1,delta*(c-1),delta*(t-1),0),v500,z10,Servo\wobj:=wobj_scacchiera_a1;
MoveL Offs(presa_a1,delta*(c-1),delta*(t-1),0),v500,fine,Servo\wobj:=wobj_scacchiera_a1;
apriPinza;
MoveL Offs(sopra_a1,delta*(c-1),delta*(t-1),0),v500,z10,Servo\wobj:=wobj_scacchiera_a1;
ENDPROC
! per aprire e chiudere la pinza anche dall'ambiente grafico
PROC apriPinza()
g_MoveTo(15);
ENDPROC
PROC chiudiPinza()
g_GripIn;
ENDPROC
ENDMODULE