Strumenti Utente

Strumenti Sito


riservata:pw3a2025

Project Work 3A 2025

App sul cellulare per giocare a scacchi via WiFi con ESP32 che comunica con controller robot ABB che muove i pezzi su una scacchiera.

La parte del robot

  • parto dal file pack and go con il modello (template) con la stessa configurazione del robot
  • aggiungo il tooldata t_VSG_Servo per dimostrare che non serve aggiungere e togliere uno SmartGripper per avere le coordinate corrette del tool
  • creo un quadrato della scacchiera (come superficie) poi lo duplico per fare una linea che poi duplico per fare le 64 case
  • coloro le caselle bianche e le raggruppo tutte per fare l'oggetto scacchiera
  • creo il work object wobj_scacchiera_a1 poi lo attacco (attach) a scacchiera, in modo che sia legato alla posizione della scacchiera (-600, -160, 0)
  • imposto MoveAbsJ, v500, z10, Servo e insegno una istruzione col robot sollevato, allineato e col gripper orientato correttamente per prendere il pezzo (target sollevato in Jointtargets
  • testo il movimento con Move Along Path sulla procedura main
  • sincronizzo con RAPID poi New Vertical Tab e simulo dopo aver riportato il robot alla Home (Layout|Move To Pose|Jump Home); c'è un Corner Path Failure ma la simulazione termina correttamente; lo stesso warning compare simulando dalla Tab Simulation (NB in questo caso la simulazione non termina e va arrestata)
  • imposto MoveJ, 500, z10, Servo poi con Move and Rotate provo a raggiungere il centro (snap su corpo e centro) delle 64 case della scacchiera per vedere se spostare la scacchiera o cambiare configurazione del robot → mi accorgo che non arriva alla fila più lontana e devo spostare la scacchiera a (-500,160,0)1)
  • rendo invisibile il robot, creo il pezzo con le dimensioni del mattoncino jenga (15-25-75), uso Attach to per collegarlo alla scacchiera; con Position|Place|Two Points lo sposto al centro della casa a1 (snap sui due centri)
  • dalla tab Simulation scelgo Reset|Save Current State e salvo lo stato iniziale partenza mettendo la spunta per includere tutto
  • porto il TCP sul pezzo con Move and Rotate e, controllando di aver selezionato il workobject wobj_scacchiera_a1 e Servo come tool, salvo il target come presa_a1; controllo con View Robot At Target che l'orientamento dell'asse z del target sia giusto
  • sposto il TCP 100mm in alto e salvo un nuovo target come sopra_a1
  • con MoveJ, v500, z10, Servo creo l'istruzione di movimento per andare a sopra_a1 trascinando il target nel main
  • con MoveL, v500, fine, Servo creo l'istruzione di movimento per andare a presa_a1
  • con MoveL, v500, fine, Servo creo l'istruzione di movimento per andare a sopra_a1
  • testo il movimento con Move Along Path poi sincronizzo con RAPID e eseguo il programma
  • dentro MainModule creo le procedure apriPinza() e chiudiPinza() con le istruzioni g_MoveTo(15) e g_GripIn che posso chiamare anche in ambiente grafico dopo aver sincronizzato alla stazione; ricordarsi Apply (e volendo Check Program) per applicare le modifiche al codice
  • creo le variabili tipo num colonna e traversa e la costante tipo num delta
  • creo la procedura preleva con due parametri (c,t) che usa la funzione Offs per portare il TCP nel punto di prelievo in base alle coordinate c e t della notazione algebrica
  • chiamo la funzione (no parentesi!)
  • testo la funzione
  • NB spesso bisogna re-inizializzare il Virtual SmartGripper che ogni tanto impazzisce da Proprietà mettendo ReInizialization_Enabled a 1 e cliccando su ReInitialize_SmartGripper
  • resettare la simulazione dopo ogni esecuzione del programma e riportare il program pointer a main dalla scheda Rapid|Program Pointer

Cose minori

  • non si riesce a rinominare la stazione se non salvando il progetto con un altro nome; anche in quel caso la vista principale mantiene il vecchio nome (modello:Visualizza1) ma si può rinominare la tab
  • non si capisce come funzioni il suggerimento colorato che a volte compare nella barra del titolo sopra la ribbon: non è cliccabile e, il colore non è riconducibile a qualcosa, il nome a volte corrisponde a un pulsante sulla ribbon ma non sempre
  • riguardo i concetti di programmazione da operating manual omnicore (guida completa ma pensata per flexpendant):
    • programmi, moduli, routine (procedure sono sottoprogrammi, funzioni restituiscono un valore, trap gestiscono gli interrupt)
    • variabili: scope (local, global, task) storage (persistent, variable, constant)
  • proseguo con rapid overview:
    • RAPID non è case sensitive
    • placeholder <> consentono di caricare un programma anche se alcune parti non sono ancora definite
    • 1.1.2 sintassi e tipi di dati
    • 1.1.3 struttura del programma, moduli, routine, parametri
    • tipi di dati: atomic, record, alias
    • array (1.2.2); record sono un'altra cosa (1.2.1)
    • 1.3 espressioni, argomenti e parametri
    • 1.4 istruzioni (anche il concetto di label)
    • 1.5 controllo del flusso
    • 1.6 istruzioni varie (generiche?) e dati di base (finalmente!)
    • 2.x movimento, sistemi di riferimento, superamento dei percorsi ad angolo (2.2.3), 2.4 configurazioni del robot e istruzione ConfL\On2)
    • 2.7 singolarità; due in più per i robot a 7 assi, nessun problema con MoveJ

Programma per il robot

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
1)
nel programma del 2024 era -530
2)
dal testo Nel caso in cui la supervisione della configurazione non è attiva, il robot si sposta verso la posizione e l'orientamento specificati secondo la configurazione con valori di giunto più prossimi rispetto al punto iniziale.
Questo sito Web utilizza i cookie. Utilizzando il sito Web, l'utente accetta la memorizzazione dei cookie sul proprio computer. Inoltre riconosci di aver letto e compreso la nostra Informativa sulla privacy. Se non sei d'accordo, lascia il sito.Maggiori informazioni sui cookie
riservata/pw3a2025.txt · Ultima modifica: da admin