Controllo braccio robotico con Bascom-avr

Sezione dedicata al sistema di sviluppo BASCOM-AVR per i micro AVR
At90s, Attiny, Atmega e Xmega

Controllo braccio robotico con Bascom-avr

Postby zillo89 » 05 Sep 2012, 13:21

salve a tutti,
facendo riferimento al topic:
viewtopic.php?f=3&t=209

ecco la foto:
download/file.php?id=33

in cui si sta discutendo di un braccio robotico ho preferito riaprire un topic in questa sezione poichè ho intenzione di controllare il mio sistema con un micro atmega programmato con il bascom-avr.

Quindi chiedo aiuto per :

gestione dei servo rc
gestione e controllo di motori in cc con encoder ottici

ciao e grazie ancora
zillo89
 
Posts: 23
Joined: 18 Feb 2012, 10:18

Re: Controllo braccio robotico con Bascom-avr

Postby deluca » 05 Sep 2012, 20:45

in allegato un semplice esempio di come configurare 2 servo rc con il bascom
è possibile gestirne fino a 10 basta dichiararli: servo1, servo2, servon.
verrà creata una matrice servo(i) a cui verrà passata il valore della posizione.

Code: Select all
'-----------------------------------------------------------------------------------------
'nome                     : servos_m328p
'autore                   : Giovanni De Luca
'scopo                    : dimostrazione uso SERVO option
'micro                    : atmega328p
'-----------------------------------------------------------------------------------------
$regfile = "m328pdef.dat"                                   ' specify the used micro
$crystal = 16000000                                         ' used crystal frequency
$baud = 57600                                               ' use baud rate
$hwstack = 64                                               ' default use 32 for the hardware stack
$swstack = 64                                               ' default use 10 for the SW stack
$framesize = 64                                             ' default use 40 for the frame space

'NB è possibile gestire fino a 10 servo
Config Servos = 2 , Servo1 = Portb.0 , Servo2 = Portb.1 , Reload = 10 , Timer = Timer1
Config Portb = Output
Enable Interrupts

Servo(1) = 50                                               '50 times 50 = 500 uS on
Servo(2) = 50                                               '50 times 50 = 500 uS on

Dim I As Byte
'-------------------------------------------------------------------------------
Do
   For I = 50 To 250 Step 10
      Servo(1) = I
      Servo(2) = I
      Waitms 500
   Next

   For I = 250 To 50 Step -10
      Servo(1) = I
      Servo(2) = I
      Waitms 500
  Next
Loop
'-------------------------------------------------------------------------------
End
Ciao
Il mio sito: http://www.delucagiovanni.com ......e la chat: chat/
User avatar
deluca
Site Admin
 
Posts: 1104
Joined: 19 Jun 2011, 10:44
Location: 95123 - Catania (Italy)

Re: Controllo braccio robotico con Bascom-avr

Postby flz47655 » 05 Sep 2012, 22:34

Per il controllore da implementare (per i motori DC) per iniziare ti consiglio un PID a giunti indipendenti
I servo già hanno un loro sistema in retroazione per ruotare all'angolo desiderato.

Ciao
flz47655
 
Posts: 639
Joined: 19 Jan 2012, 21:16

Re: Controllo braccio robotico con Bascom-avr

Postby deluca » 07 Sep 2012, 19:53

In un apparato meccanico mosso da motori elettrici in CC, quale potrebbe essere un braccio robotico, il solo PID non basta per controllarne la posizione.

Il controllo PID applicato in closed-loop ad un motore permette il solo controllo della velocità di rotazione anche se questa è zero.
Noi impostiamo una velocità e il sistema cerca di mantenerla costante anche al variare del carico o della tensione di alimentazione.
Se lo applicassimo per controllarne la posizione avremmo movimenti veloci, bruschi senza smoothing.... e questo può andare bene nei servo rc perchè devono essere veloci nella risposta e i movimenti devono essere privi di oscillazioni.

Invece, quando si controlla il movimento di un robot o di qualsiasi apparato meccanico, anche implementando l'algo PID, abbiamo bisogno di un controllore molto più sofisticato.
Per far muovere e posizionare un joint/link di un braccio robotico o di un asse cartesiano, impiegando ad es motori DC, abbiamo la necessità di modificare profili di accelerazione, di velocità, di decelerazione .... e tanti altri parametri. Inoltre bisogna calcolare tutto questo prima ancora che il motore si metta in movimento una volta stabilita la posizione che il joint dovrà raggiungere.

Con molta facilità si dice: usiamo un controllo PID ed il gioco è fatto..... purtroppo non è cosi o quantomeno non è così semplice nel caso dei robotic arm.

QUI:
http://mcselec.com/index.php?option=com ... &Itemid=57 una sempice application note AN#150 "PID Motion Control" scritta in Bascom-avr per ATmega32 per il controllo dei parametri di cui vi ho parlato prima.

ecco i parametri che è in grado di gestire il sistema:
Code: Select all
' Skp [mot] [kp Value]  SET PROPORZIONAL PID 0-1000 MAX
' Ski [mot] [ki Value] SET INTEGRAL PID 0-100 MAX
' Skd [mot] [kd Value] SET DERIVATIVE PID 0-1000 MAX
' Vmax [mot] [vmax Value] SET MAX VELOCITY IN PROPORZIONAL VELOCITY PROFILE 0-255
' Svm [mot] [svm Value] SET MAX VELOCITY IN TRAPEZOIDAL MODE 0-255
' Spid [mot] [kp] [ki] [kd] SET PID MOTOR KP KI KD
' Stime[stime Value] SET PID EXECUTION TIME 0-10
' Smode[mot] [mode] SET SINGLE MODE FOR ONE MOTOR
' Svel [mot] [svel Value] SET MOTOR_ON WITH INTEGRAL VELOCITY PROFILE AND MOVE 0-255
' Velo [vel 1] [vel 2] SET TWO INDIPENDENT SPEED FOR MOTORS 0-255 0-255
' Spwm [mot] [spwm Value] SET MAX PWM OUT FOR TORQUE LIMIT 0-255
' Sacc [mot] [acc Value] SET ACCELERATION DEGREE 1-89 DEGREES
' Sang [mot] [angular Factor] SET ANGULAR FACTOR FOR VELOCITY PROFILE 1-100
' Go [mot] [position Value] GO TO POSITION IN POSITION MODE CONTROL +- 23 BITS
' Pos [mot] [position Value] [speed] SET POSITION IN TRAPEZOIDAL PROFILE 0-255
' Move [position 1] [position 2] MOVE MOTORS TO POS 1 POS 2 +-23 BITS TRAPEZOIDAL MODE
' Velp [position 1] [position 2] MOVE CONTINUOS POSITION WITH VARIBLE PROPORZIONAL VELOCITY
' Start START MOVE IF START_MOVE = FALSE
' Stop STOP MOVE AND MOTORS POWER DOWN
' Gmax [mot] GET MAX VELOCITY IN VELOCITY PROFILE MODE
' Gvm [mot] GET MAX VELOCITY IN TRAPEZOIDAL MODE
' Gve [mot] GET ABSOLUTE SPEED FROM ENCODER
' Enc [mot] READ ABSOLUTE ENCODER POSITION
' Gpid [mot] GET PID MOTOR VALUES
' Gtime  GET PID EXECUTION TIME
' Szp [mot] SET ZERO POSITION
' Idle [mot] POWER OFF MOTOR
' Gsm [mot] GET MOTOR STATE 0=STOP 1=MOVE
' Mode [mode] SET MODE PROFILE FOR 2 MOTOR 0,1,2,3,4
' Gmode GET PROFILE MODE SETTING
' Gpwm [mot] GET MAX PWM OUT
' Rpwm [mot]  READ REAL PWM OUT TO CONTROL MAX CURRENT
' Gacc [mot] GET ACCELERATION PROFILE IN DEGREE 1-89
' Gang [mot] GET ANGULAR FACTOR
' Rst [mot] RESET ENCODER


Ciao
Ciao
Il mio sito: http://www.delucagiovanni.com ......e la chat: chat/
User avatar
deluca
Site Admin
 
Posts: 1104
Joined: 19 Jun 2011, 10:44
Location: 95123 - Catania (Italy)

Re: Controllo braccio robotico con Bascom-avr

Postby flz47655 » 07 Sep 2012, 20:14

Ok, concordo al 100%. Era diciamo solamente per dare uno spunto per un inizio a zillo89. Non volevo spaventarlo diciamo.
Naturalmente poi bisognerà andare avanti, ad esempio provando ad implementare le traiettorie punto-punto (nello spazio dei giunti) tramite polinomi del quinto ordine e imponendo come condizioni di contorno velocità ed accelerazione iniziali e finali nulle per poi passare a traiettorie multipunto, controllori più sofisticati (magari passando per compensazione in avanti per poi arrivare ad un controllo centralizzato e con iterazione), etc...

Domanda che mi è sorta: quindi in sostanza i servo non sono il massimo per dei giunti? In alcuni video ho visto bracci robotici commerciali con dei servo, deduco che siano quindi dei modelli di fascia alta programmabili col controllo desiderato, sbaglio?

Ciao

@Giovanni: nell'AN il profilo trapezoidale è sulla velocità o sulla accelerazione?
flz47655
 
Posts: 639
Joined: 19 Jan 2012, 21:16

Re: Controllo braccio robotico con Bascom-avr

Postby deluca » 08 Sep 2012, 09:52

Il profilo trapezoidale è sulla velocità.... ma tiene conto dell'accelerazione.
Una volta impostata la nuova posizione finale il controller deve preimpostare il profilo trapezoidale che dipende dalla pendenza delle rampe di accelerazione e decelerazione, e dalla velocità massima.
Ma tutto questo se il braccio deve muoversi in modo programmato seguendo delle traiettorie precise nello spazio 3d che lo circonda.
Il PID dovrà garantire che lungo il percorso la velocità, che verrà via via modificata dall'inviluppo del profilo, rimanga costante al variare del carico, visto che i parametri della "leva" cambieranno in continuazione.

ciao
Ciao
Il mio sito: http://www.delucagiovanni.com ......e la chat: chat/
User avatar
deluca
Site Admin
 
Posts: 1104
Joined: 19 Jun 2011, 10:44
Location: 95123 - Catania (Italy)

Re: Controllo braccio robotico con Bascom-avr

Postby zillo89 » 08 Sep 2012, 12:54

@deluca
ho provato a far muovere i 2 servo con il codice che hai postato, funziona.
ora però vorrei comandarli attraverso la seriale con un protocollo di questo tipo:

numero servo, nuova posizione, velocità posizionamento.
es: s1, p150, v10

accetterei un consiglio su come configurare la seriale per leggere questi valori da passare ai servo.
grazie sempre.

PS. Ho visto il tuo codice a proposito del controllore per i motori ma mi sembra non essere alla mia portata poichè io vorrei pure capirlo e di sicuro ancora non sono in grado, vedrò dopo.
inoltre a proposito del PID di sicuro ho avuto sempre in testa una gran confusione anche perchè in altri forum ho letto: utilizza il pid per controllare la posizione del motore o del robot.
allora come la mettiamo? il pid mi serve o no... o sono io che non ci sto capendo una mazza.
certo prima dovrei capire anche come funziona sto benedetto pid. :)

scusa e ciao.
zillo89
 
Posts: 23
Joined: 18 Feb 2012, 10:18

Re: Controllo braccio robotico con Bascom-avr

Postby flz47655 » 08 Sep 2012, 13:52

@Giovanni: Ok, grazie.
@zillo89:Partire dal codice non è il massimo, prima devi avere delle basi teoriche, senza le quali magari farai anche fatica a seguire la discussione. Prova a leggere queste slide che spiegano in modo semplice: http://www.delucagiovanni.com/files/09_ ... %20PID.pdf
Il PID ti serve, per iniziare puoi provare ad implementarlo in maniera semplicistica per poi migliorarlo (come ad es. nel codice di Giovanni) per avere dei "movimenti" dei motori "più dolci" che comportano meno usura meccanica, meno vibrazioni, etc..

Ciao
flz47655
 
Posts: 639
Joined: 19 Jan 2012, 21:16


Return to BASCOM-AVR

Who is online

Users browsing this forum: No registered users and 1 guest