Asist. Dr. Ing. Florin Cătălin Brăescu Gherasim Cosmin -Adrian [616693]

UNIVERSITATEA TEHNICĂ “GH. ASACHI” IAȘI
FACULTATEA DE AUTOMATICĂ ȘI CALCULATOARE

CONTROLUL LA DISTAN ȚĂ AL
UNUI BRAȚ MANIPULATOR CU
PATRU GRADE DE LIBERTATE

Coordonator : Student: [anonimizat]. Florin Cătălin Brăescu Gherasim Cosmin -Adrian

Iulie 2014

CUPRINS

Capitolul 1. Introducere ………………………….. ………………………….. …………………………. 3
Capitolul 2. Noțiuni generale ………………………….. ………………………….. ………………….. 5
2.1. Placa de dezvoltare Arduino Uno ………………………….. ………………………….. .. 5
2.2. Procesorul Numeric de Semnal dsPIC33FJ128MC708 ………………………….. 8
2.3. Transceiverul nRF24L01 ………………………….. ………………………….. …………. 12
2.4. Magistrala Serială Universală ………………………….. ………………………….. ….. 14
2.5. Interfața serială SPI ………………………….. ………………………….. ………………… 16
2.6. Sistemul de operare FreeRTOS ………………………….. ………………………….. … 18
2.7. Limbajul de programare Visual Basic ………………………….. ……………………. 20
Capitolul 3. Implementarea proiectului ………………………….. ………………………….. ….. 22
3.1. Interfața cu ut ilizatorul ………………………….. ………………………….. ……………. 22
3.1.1. Inițializarea ………………………….. ………………………….. ………………………… 22
3.1.2. Preluarea informațiilor de la Joystick ………………………….. …………………. 24
3.1.3. Comenzi manuale ………………………….. ………………………….. ……………….. 27
3.1.3.1 Poziție manuală ………………………….. ………………………….. ……………… 27
3.1.3.2 Unghiuri manuale ………………………….. ………………………….. ………….. 28
3.1.4. Manușa ………………………….. ………………………….. ………………………….. ….. 30
3.1.5. Trimiterea mesajului către placa de dezvoltare Arduino Uno …………….. 30
3.2. Placa de dezv oltare Arduino Uno ………………………….. ………………………….. 32
3.2.1. Inițializare și Recepția mesajelor ………………………….. ……………………….. 32
3.2.2. Impachetarea și trimiterea mesajelor ………………………….. ………………….. 36
3.3. Procesorul Numeric de Semnal dsPIC33FJ128MC708 ………………………… 39
3.3.1. Configurare PLL ………………………….. ………………………….. …………………. 39
3.3.2. Conectare nRF24L01 ………………………….. ………………………….. …………… 40
3.3.3. Taskuri folosite ………………………….. ………………………….. …………………… 41
Capitolul 4. Concluzii ………………………….. ………………………….. ………………………….. 44
Capitolul 5. Bibliografie ………………………….. ………………………….. ………………………. 46

CONTROLUL LA DISTANȚĂ AL UNUI BRAȚ MANIPULATOR CU PATRU GRADE DE LIBERTATE
3 Capitolul 1. Introducere

Prin realizarea acestui proiect se propune cont rolarea unui braț manipulator de mici
dimensiuni cu patru grade de libertate, în care articulațiile sunt controlate de servomotoare
MG996R. Acesta mai dispune și de un apucător a cărui deschidere este controlată tot de un
servomotor MG996R. Servomotoarele sunt comandate de procesorul numeric de semnal
dsPIC33FJ128MC708 cu ajutorul pulsurilor modulate în durată și pe care rulează sistemul de
operare de timp real FreeRTOS.

Brațul manipulator poate fi controlat în mai multe moduri. Un prim mod de control
este cu ajutorul unui joystick în care poziția și orientarea efectorului este aleasă cu ajutorul
controalelor analogice iar nivelul de deschidere al efectorului este setat cu ajutorul butoanelor
de pe joystick. Un al doilea mod de control este setarea pozi ției, orientării și nivelului de
deschidere al apucătorului introducând valori manuale în limitele în care efectorul poate
ajunge în acea poziție. Al treilea mod de control al brațului manipulator este reprezentat de
setarea unghiurilor individual pentru f iecare articulație în parte, inclusiv pentru nivelul de
deschidere al apucătorului. Ultimul mod de control este controlul poziției efectorului cu
ajutorul unei mănuși dotate cu un accelerometru și giroscop, și controlul nivelului de
deschidere al apucătoru lui cu ajutorul unui senzor de flexibilitate.

Aceste moduri de control sunt alese din interfața cu utilizatorul realizată în Visual
Basic ce rulează pe un calculator. Această interfață comunică cu placa de dezvoltare Arduino,
trimițând mesajele ce con țin coordonate și alte informații folosind magistrala serială
universală. Comunicația cu această placă de dezvoltare se face la viteza de 115200 baud.
Această interfață cu utilizatorul are patru taburi, un tab de inițializare și trei taburi pentru
modalită țile de control :
 Joystick – este tabul în care se preiau și se prelucrează informațiile primite de
la joystick ;
 Manual – este tabul în care se întroduc valorile pentru unghiuri sau poziție
manuală ;
 Mănușa – este tabul în care se acordă permisiunea pentru c ontrolul brațului
manipulator de către mănușă .

Un aspect foarte important al acestui braț manipulator este faptul că poate fi comandat
de la distanță folosind transceiverele nRF24L01. Sunt folosite două astfel de transceivere,
unul fiind conectat la plac a de dezvoltare Arduino Uno iar celălalt la procesorul numeric de
semnal. Acestea comunică prin interfața serială SPI și pot asigura comunicarea până la
distanța de 100m.

Pentru asigurarea transmisiei corecte, mesajele sunt împachetate sub diferite fo rme,
fie ca structuri, uniuni sau șiruri de caractere încă de la compunerea lor după preluarea din
interfața cu utilizatorul. Aceste mesaje conțin în permanență o sumă de control pentru a fi
verificate. După fiecare recepție această sumă este verificată, i ar când mesajul este din nou
pregătit pentru transmisie, această sumă este recalculată.

Schema bloc a întregului proiect și modul în care elementele interacționează între ele
sunt prezentate în figura Fig 1 -1.

CONTROLUL LA DISTANȚĂ AL UNUI BRAȚ MANIPULATOR CU PATRU GRADE DE LIBERTATE
4 Fig 1-1 Schema bloc a proiectului

CONTROLUL LA DISTANȚĂ AL UNUI BRAȚ MANIPULATOR CU PATRU GRADE DE LIBERTATE
5 Capitolul 2. Noțiuni generale
2.1. Placa de dezvoltare Arduino Uno

Arduino este o platformă de dezvoltare open -source, atât hardware cât și software, ce
este folosită pe scară largă pentru diferite proiecte, de la cele mai simple la cele mai
complexe. Plăcile de dezvoltare sunt disponibile în mai multe modele, fiecare cu caracteristici
diferite.

Fig 2-1 Arduino IDE

Arduino IDE( Fig 2-1) este softul folosit pentru scrierea programelor pentru plăcile de
dezvoltare. Acesta este scris în Java, C și C++ și este eliberat sub licență GNU General Public
License.

CONTROLUL LA DISTANȚĂ AL UNUI BRAȚ MANIPULATOR CU PATRU GRADE DE LIBERTATE
6
Arduino IDE vine împreună cu o librărie software numite Wiring ce a jută la multe
operații de intrare/ieșire pentru o utilizare mult mai ușoară. Programele pot fi scrise în C sau
C++, iar pentru realizarea unui program funcțional utilizatorul trebuie să definească doar două
funcții:
 setup – este funcția care se apelează o singură dată la începutul programului;
aici se pot face inițializări de variabile globale, precum și alte definiții și
inițializări, de exemplu inițializarea portului serial;
 loop – este funcția care se apelează ciclic până la întreruperea alimentării plăc ii
de dezvoltare;

Fig 2-2 Funcționarea unui program scris pentru Arduino

Funcționarea unui program scris pentru Arduino este prezentată in figura Fig 2-2.

Pentru c ompilarea programelor se folosesc GNU toolchain și AVR Libc iar pentru
uploadarea pe placa de dezvoltare se folosește avrdude.

Placa de dezvoltare Arduino Uno R3( Fig 2-3) este bazată pe un microcontroler
Atmeg a328 și are dimensiunile 68 x 53mm. Aceasta este capabilă să interacționeze cu mediul
înconjurător prin intermediul porturilor de intrare/ieșire cu ajutorul unei multitudini de senzori
disponibili pe piață (ex.: senzor de temperatură, senzor de presiune, s enzor de umiditate, etc.)
și elemente de comandă(ex.: leduri, servomotoare, etc.)

Conectarea plăcii de dezvoltare la un calculator se face folosind un cablu USB A -B.
Placa mai dispune de un buton de reset, un led conectat la pinul 13, o mufă jack pentru
alimentare și header ICSP.

CONTROLUL LA DISTANȚĂ AL UNUI BRAȚ MANIPULATOR CU PATRU GRADE DE LIBERTATE
7 Caracteristici:
 Microcontroler: Atmega328;
 Tensiunea de lucru: 5V;
 Tensiunea de intrare recomandată: 7 -12V;
 Tensiunea de intrare(limite): 6 -20V;
 Pini digitali de intrare/ ieșire : 14, din care 6 pot genera semnale PWM;
 Pini analog ici de intrare: 6;
 Curent Continuu pe pin de intrare/ ieșire : 40mA;
 Curent Continuu pentru pinul de 3.3V: 50mA;
 Memorie Flash: 32Kb din care 0.5 Kb sunt folosiți pentru bootloader;
 SRAM: 2Kb;
 EEPROM: 1Kb;
 Frecvența ceasului: 16MHz;

Fig 2-3 Placa de dezvoltare Arduino Uno R3

Comunitatea Arduino este una foarte vastă în care foarte mulți utilizatori își
împărtășesc cunoștințele și problemele întâlnite pe parcursul folosirii produselor. Sunt foarte
multe idei de proiecte realizabile cu diferite plăci de dezvoltare Arduino, librării pentru
diferite periferice(ex.: drivere pentru senzori, etc), tutoriale, manuale de utilizare, și multe
altele.

Câteva exemple de proiecte ce pot fi implementate folosind Arduino:
 Robo t mobil;
 Ceas digital;
 Hexapod;
 Alarmă ;
 Jocuri de lumini;

CONTROLUL LA DISTANȚĂ AL UNUI BRAȚ MANIPULATOR CU PATRU GRADE DE LIBERTATE
8 2.2. Procesorul Numeric de Semnal dsPIC33FJ128MC708

Procesoarele numerice de semnal sunt optimizate pentru procesare rapidă în timp real
a datelor analogice și/sau digitale de natură diversă. Sunt const ruite pe arhitectură Harvard
(memorie separată pentru date și pentru program) și au capacitatea de a acționa ca un circuit
microprocesor cu acces direct la memorie.

Procesorul numeric de semnal dsPIC33FJ128MC708( Fig 2-4) lucrează pe 16 biți și
poate executa până la 40 operații MIPS (Microprocessor without Interlocked Pipeline Stages).
Intervalul de temperatură în care acesta poate lucra este -40°C – +85°C.

Fig 2-4 dsPIC33FJ128MC708

Construită pe arhitectura Harvard modificată, unitatea centrală de prelucrare dispune
de un compilator C cu un set optimizat de instrucțiuni pe 24 de biți. Memoria program este
adresabilă liniar, și conține 128Kb. Dispune de doi acumula tori de 40 de biți, cu mai multe
moduri de adresare a memoriei.

Controlerul de întreruperi conține un tabel al vectorilor de întrerupere cu până la 118
surse de întrerupere. În general, fiecare sursă de întrerupere are propriul vector din tabel.
Acest e întreruperi pot fi prioritizate pe 7 nivele iar valoarea programată pentru fiecare
întrerupere este adresa de început a ISR -ului asociat.

CONTROLUL LA DISTANȚĂ AL UNUI BRAȚ MANIPULATOR CU PATRU GRADE DE LIBERTATE
9 Pentru folosirea întreruperilor au fost implementați 30 de regiș tri:
 INTCON1
 INTCON2
 IFS0 – IFS4
 IEC0 – IEC7
 IPC0 – IPC17
 INTTREG
Fiecare dintre acești regiștri are un scop bine definit, de exemplu, regiștrii IFS
păstrează toate flagurile cererilor de întrerupere, iar regiștrii IPC sunt folosiți pentru setarea
priorității fiecărei surse de întrerupere.

Acest PNS dispune de 80 de pini, dintre care 69 sunt de intrare/ieșire. Toți pinii de
ieșire funcționează în intervalul 3.0V – 3.6V, iar toți pinii analogici de intrare pot accepta până
la 5V.

Modulul PWM conține patru generatoare de duty cycle, și poate fu ncționa în mod
independent sau complementar. Aceste patru generatoare sunt:
 PWM1H / PWM1L
 PWM2H / PWM2L
 PWM3H / PWM3L
 PWM4H / PWM4L

Acestora le corespund 8 pini de intrare/ieșire. Fiecare generator are asociat 2 pini, pe
pinul high fiind valoarea factorul ui de umplere, iar pe pinul low este aceeași valoare, dar
complementată.

Acest modul poate fi folosit la controlul:
 Motoarelor de inducție trifazate
 Motoarelor de curent continuu fără perii
 Motoarelor cu reluctanță variabilă
 Etc.

Timerul 1 lucrează p e 16 biți și poate fi folosit ca numărător pentru ceasul de timp
real, sau în mod free -running. Acesta poate opera ca timer pe 16 biți, numărător sincron pe 16
biți sau numărător asincron pe 16 biți. Pentru configurarea lui tre buiesc executați următorii
pași:
1. Se setează bitul TON =1 din registrul T1CON;
2. Se selectează prescalerul folosind biții TCKPS din registrul T1CON;
3. Se seteaz ă biții TCS si TGATE din registrul T1CON;
4. Se seteaz ă bitul TSYNC din registrul T1CON pentru alegerea modului sincron
sau asincron;
5. Se încarc ă perioada timerului în registrul PR1;
6. Pentru a genera întreruperi, se setează bitul T1IE, iar pentru a seta prioritatea
întreruperii se setează biții T1IP ;

Diagrama bloc a timerului 1 este prezentată în figura Fig 2-5.

CONTROLUL LA DISTANȚĂ AL UNUI BRAȚ MANIPULATOR CU PATRU GRADE DE LIBERTATE
10 Dacă se dorește utilizarea unui timer pe 32 de biți, se pot folosi următoarele timere ce
lucrează împreună, ele putând fi configurate și ca timere pe 16 biți:
 Timerul 2/3
 Timerul 4/5
 Timerul 6/7
 Timerul 7/8
Fig 2-5 Schema bloc a timerului 1

Pentru configurarea lor, trebuiesc executate operații similare cu cele pentru
configurarea timerului 1. Valoarea timerului este stocată în orice moment în regiștrii pereche
TMR3:TMR2, TMR5:TMR4, TMR7:TMR6 și TMR9:TMR8.

La folosirea regiștrilor pereche, cei mai semnificativi biți se află în TMR3, TMR5,
TMR7 și TMR9, în timp ce biții cel mai puțin semnificativi se află în TMR2, TMR4, TMR6
și TMR8.

Acest procesor numeric de semnal conține mai multe module de comunicații, și
anume :
 2 module SPI;
 2 module I2C;
 2 module UART;
 2 module ECAN;

Modulele SPI folosesc date pe 16 biți, și suportă toate tipurile de semnale de ceas și
moduri de eșantionare. Fiecare modul SPI conține un registru de deplasare pe 16 biți SPIxSR,
unde x poate fi 1 sau 2, în funcție de modulul SPI folosit, și un registru SPIxBUF, ce
reprezintă bufferul pentru modulul SPI respectiv.

CONTROLUL LA DISTANȚĂ AL UNUI BRAȚ MANIPULATOR CU PATRU GRADE DE LIBERTATE
11 De asemenea, fiecare modul mai conține și un registru de configurare, SPIxCON, și
un registru SP IxSTAT din car e se pot citi diferiți parametr i de stare. Interfața serială SPI
folosește 4 pini: SDI(serial data in), SDO(serial data out), SCK(shift clock input sau output) și
SS(slave select, activ pe nivel scăzut). Schema bloc a modulului SPI este preze ntată în figura
Fig 2-6.

Fig 2-6 Schema bloc a modulului SPI

Modu lele I2C folosesc adrese pe 7 și 10 biți, atât pentru master cât și pentru slave, și
permit transferu l bidirecțional între master și slave. Sincronizarea ceasului portului I2C poate
fi folosită ca mecanism de handshake pentru a suspenda sau reveni transfer ul pe linia serială .

Regiștrii de control folosiți de modulele I2C sunt I2CxCON, unde x poate fi 1 s au 2,
în funcție de modulul I2C folosit, iar regiștrii de stare sunt I2CxSTAT. Regiștrii I2CxRSR
sunt regiștrii de deplasare, iar I2CxRCV sunt regiștrii în care se scriu sau din care se citesc
datele.

Convertorul ADC are de asemenea două module ce pot fi configurate independent, pe
10 sau pe 12 biți. Printre opțiunile convertorului pe 10 biți se numără :
 Viteza de conversie de 1.1 Msps;
 Până la 32 pini de intrare ;
 Scanarea automat ă a canalului;
 Se poate folosi în modul de sleep și în modul idle al unității centrale de
prelucrare ;

CONTROLUL LA DISTANȚĂ AL UNUI BRAȚ MANIPULATOR CU PATRU GRADE DE LIBERTATE
12 Spre deosebire de convertorul pe 10 biți, viteza celui de 12 biți poate suporta 500 ksps
și poate eșantiona o singură valoare la un moment de timp, deci eșantionarea simultană a mai
multor canale nu este posibilă.

Inițializar ea modulului ADC presupune selectarea pinilor doriți ca intrări analogice,
selectarea voltajului referință, selectarea ceasului, câte canale vor fi folosite, metoda de
eșantionare dorită, modalitatea de stocare a rezultatelor în buffer și bineînțeles, porn irea
modulului .

2.3. Transceiverul nRF24L01

Tranceiverul nRF24L011( Fig 2-7) este produs de firma Nordic Semiconductor. Acesta
folosește interfața serială SPI pentru comunicarea cu microcontrolerul. Din această cauză,
pinii pentru comunicații specifici SPI vor fi tratați mai detaliat în secțiunea dedicată SPI.

Din cele patru moduri de lucru ale interfeței seriale SPI pentru polaritate și faza
ceasului, moduri ce sunt prezentate în secțiunea dedicată SPI, nRF20L01 f olosește modul 0,
adică CPOL = 0 și CPHA = 0.

Acest lucru înseamnă că data este capturată pe tranziția jos – sus a ceasului și este
propagată pe tranziția sus – jos a ceasului. Ținând cont de aceste valori, la dezvoltarea
driverului trebuie avut în ve dere acest aspect .

Fig 2-7 Transceiverul nRF20L01

CONTROLUL LA DISTANȚĂ AL UNUI BRAȚ MANIPULATOR CU PATRU GRADE DE LIBERTATE
13 Pentru scrierea și citirea datelor din regiștrii interni ai transceiverului se folosesc
următoarele comenzi :
 R_REGISTER – este folosită pentru citirea datelo r dintr -un SFR al
transceiverului. Această instrucțiune are formatul 000A AAAA, iar în locul
caracterelor A se introduce adresa pe care dorim să o citim. În acest moment,
transceiverul știe că trebuie să citească o anumită adresă ;
 W_REGISTER – este folosit ă pentru scrierea unei anumite valori într -un
registru intern al transceiverului. Formatul acesteia este 001A AAAA, iar în
locul caracterelor A se introduce adresa dorită. În acest moment, transceiverul
știe că trebuie să scrie la o anumită adresă ;
 R_RX_PA YLOAD – este folosită pentru citirea datelor primite. Se folosește
de registrul RX FIFO;
 W_TX_PAYLOAD – este folosită pentru a scrie date în registrul TX FIFO,
adică datele ce urmează a fi trimise ;
 FLUSH_TX – este folosită pentru a șterge datele din RX FIF O;
 FLUSH_RX – este folosită pentru a șterge datele din TX FIFO;
 REUSE_TX_PL – este folosită pentru a retransmite aceleași date încărcate în
TX FIFO;
 NOP – nu execută nicio operație, însă este folosită, de exemplu, pentru citirea
registrului de stare .

Câteva exemple de regiștr i interni pe care îi are acest transceiver sunt :
 CONFIG (00h)
 EN_AA (01h)
 EN_RXADDR (02h)
 SETUP_AW (03h)
 SETUP_RETR (04h)
 RF_CF (05h)
 Etc.

Acest transceiver are nevoie de foarte puțin curent pentru a funcționa, de exemplu, în
modul de sleep acesta consumă doar 900nA, iar la transmisie și recepție consumă 11.3mA și
respectiv 12.3mA. Folosește spectrul radio cu bandă de frecvență ISM 2.4GHz cu modulare
GFSK, și folosește un cristal de 16MHz. Are un regulator de voltaj intern, alimentarea se face
între 1.9V și 3.6V iar temperatura de lucru poate fi între -40 și +80 °C.

Acesta poate transmite până la 100m la o viteză de 250kbps, iar la distanțe apropiate
viteza poate crește până la 2Mbps. Dispune de 125 de canale, iar alegerea lor se face din
software, de la 2400MHz la 2525MHz. Acest model particular de transceiver are antenă
inclusă pe placă, însă sunt și modele la care antena este externă și distanța de transmisie și
recepție poate fi mai mare .

Câteva tipuri de proiecte în care pot fi folosite aceste transceivere :
 Sistem de monitorizare al cl ădirilor
 Controlul la distan ță al robo ților
 Monitorizarea vehiculelor autonome

CONTROLUL LA DISTANȚĂ AL UNUI BRAȚ MANIPULATOR CU PATRU GRADE DE LIBERTATE
14 2.4. Magistrala Serială Universală

Magistrala Serială Universală (USB) este un standard industrial dezvoltat la mijlo cul
anilor 1990, la proiectarea lui participând mai multe companii mari din industria IT. Acest
standard este capabil să conecteze majoritatea perifericelor unui calculator pentru
comunicarea cu acesta, dar să le și alimenteze în același timp.

La nive l hardware cablul conține patru fire conductoare, două din fire sunt folosite
pentru transmisia datelor, iar două pentru alimentare. La ultima versiune USB, și anume USB
3.1, viteza de transfer poate ajunge până la 10Gbit/s.

Fig 2-8 Conector USB tip A

Conectorii pot fi de mai multe tipuri, cei mai folosiți fiind conectorii de tip A( Fig 2-8),
și conectorii de tip B. În acest proiect, cablul ce unește calculatorul cu pl aca de dezvoltare
Arduino are la un capăt un conector de tip A, iar la celălalt un conector de tip B.

Comunicația utilizând USB se face folosind un protocol bazat pe pachete de date. Un
pachet de date reprezintă o colecție de cadre de date, fiecare ca dru având în general între 4 și
8 biți de date. Fiecare pachet de date conține la începutul lui un câmp de sincronizare și un
câmp de identificare al pachetului. Transmisia utilizează patru tipuri de pachete de date, și
anume :
 Pachet de semnalizare
 Pachet de date
 Pachet de dialog
 Pachet special

Câmpul de sincronizare(SYNC) conține o serie de biți ce produc un șir des de tranziții
utilizând codificarea NRZI. Acest lucru permite sincronizarea și resetarea ceasului
dispozitivelor conectate. Forma semnalului î n acest câmp corespunzător codării NRZI este
1010 1011 iar datele au succesiunea de valori 0000 0001.

Câmpul de identificare al pachetului(PID) este alcătuit din 8 biți, dintre care primii
patru definesc tipul pachetului, iar ultimii patru sunt aceia și patru biți, de această dat ă
complementa ți. Din primii 4 biți, cei mai semnificativi doi biți reprezintă tipul pachetului, iar
ceilalți doi împart pachetele în categorii, și anume :
 xx00 xx11 – pachet special;
 xx01 xx10 – pachet de semnalizare;

CONTROLUL LA DISTANȚĂ AL UNUI BRAȚ MANIPULATOR CU PATRU GRADE DE LIBERTATE
15  xx10 xx01 – pachet de dialog;
 xx11 xx00 – pachet de date.

Pachetul de semnalizare este primul pachet trimis. Acesta are 32 de biți, împărțiți în 5
câmpuri. Structura acestui pachet este prezentată în figura Fig 2-9.

Fig 2-9 Structura pachetului de semnalizare

În acest pachet semnificația câmpului PID este următoarea :
 0001 1110 – Pachet de ieșire ;
 0101 1010 – Început de cadru;
 1001 0110 – Pachet de intrare;
 1101 0010 – Pachet d e comandă .

Pachetul de date se ocupă de transferul informației propriu -zise pe magistrala USB.
Structura pachetului de date este prezentată în figura Fig 2-10.

Fig 2-10 Structura pachetului de date

În acest pachet, câmpul PID are următoarele semnificații :
 0011 1100 – DATA0;
 1011 0100 – DATA1.

Aceste două categorii de pachete de date, din punct de vedere funcțional, formează
între receptor și emițător un sistem supli mentar de verificare a erorilor. Corectitudinea datelor
trimise mai este verificată și de câmpul de verificare ciclică de la sfârșitul pachetului.

CONTROLUL LA DISTANȚĂ AL UNUI BRAȚ MANIPULATOR CU PATRU GRADE DE LIBERTATE
16 Pachetul de dialog este folosit pentru confirmarea primirii corecte a datelor. Acest
pachet nu are decât câmpul de SYNC și câmpul PID. Câmpul PID poate avea următoarele
semnificații :
 0010 1101 – ACK – indică faptul că pachetul de date a fost recepționat cu
succes;
 1010 0101 – NAK – în cazul unei tranzacții de ieșire semnifică faptul că
funcția nu a recepțion at mesajele de la gazdă, iar într -o tranzacție de intrare
funcția nu are date de transmis gazdei ;
 1110 0001 – STALL – poate însemna faptul că o funcție nu este capabilă să
emită sau să recepționeze date .

2.5. Interfața serială SPI

Interfața serială SPI este o interfață sincronă de comunicare ce operează în mod full
duplex. Aceasta funcționează pe principiul master -slave, adică dispozitivul master
inițializează cuvântul de date. Se pot folosi mai multe dispozitive slave cu selectare
individuală, însă un singur dispozitiv master .

Pinii specifici interfeței seriale SPI sunt următorii :
 SCLK – ceasul serial – este setat de către dispozitivul master ;
 MOSI – ieșirea din dispozitivul master și intrarea în dispozitivul slave ;
 MISO – ieșirea din dispozitivul slave și i ntrarea în dispozitivul master ;
 SS – este activ pe nivel scăzut și anunță dispozitivul slave când trebuie să
citească sau să trimită date .

Modul în care dispozitivul master comunică cu dispozitivul slave prin intermediul
acestor semnale este prezentat în figura Fig 2-11.

Fig 2-11 Magistrala SPI

Pentru inițierea comunicației, dispozitivul master trebuie să configureze ceasul
folosind o frecvență mai mică sau cel mult egală cu frecvența suportată de către slave. După
această operație, când masterul dorește să trimită un mesaj, setează pe nivel scăzut pinul
corespunzător dispozitivului slave către care dorește să trimită date.
În timpul fiecărui ciclu de ceas are loc o transmisie de tip full duplex, și anume :
 Dispozitivul master trimite un bit pe linia MOSI iar dispozitivul slave îl citește
de pe aceeași linie ;

CONTROLUL LA DISTANȚĂ AL UNUI BRAȚ MANIPULATOR CU PATRU GRADE DE LIBERTATE
17  Dispozitivul slave trimite un bit pe linia MISO iar dispozitivul master îl citește
de pe aceeași linie .

Fig 2-12 Regiștrii de deplasare în configurație de tip inel

Această transmisie implică existența a doi regiștri de deplasare de aceeași dimensiune,
unul situat în dispozitivul master și celălalt în dispozitivul s lave. Aceștia sunt conectați într -o
configurație de tip inel( Fig 2-12). De obicei, informația de transmite începând cu cel mai
semnificativ bit și continuă până se transferă și cel mai puțin semnificativ bit din re gistru.
După terminarea transmisiei, linia prin care se selecta dispozitivul slave este setată pe nivel
înalt. Dacă este nevoie, dispozitivul master poate inițializa multiple transmisii.

Pe lângă alegerea frecvenței ceasului, dispozitivul master trebu ie să configureze și
polaritatea și faza ceasului. Cei mai mulți producători au acceptat aceste două opțiuni ca
CPOL și CPHA. Cu aceste două opțiuni interfa ța serial ă SPI poate comunica în patru moduri,
după tabelul Tabel 2-1.

Tabel 2-1 Modurile de lucru ale interfe ței seriale SPI
Mod CPOL CPHA
0 0 0
1 0 1
2 1 0
3 1 1

Modurile de lucru sunt prezentate în continuare:
 Modul 0 – valoarea inițială a ceasului este 0 logic iar achiziția datei se face pe
tranziția jos -sus a ceasului și propagarea se face pe tranziția sus-jos;
 Modul 1 – valoarea inițială a ceasului este 0 logic iar achiziția datei se face pe
tranziția sus -jos a ceasului și propagarea se face pe tranziția jos-sus;
 Modul 2 – valoarea inițială a ceasului este 1 logic iar achiziția datei se face pe
tranziția sus -jos a ceasului și propagarea se face pe tranziția jos -sus;
 Modul 3 – valoarea inițială a ceasului este 1 logic iar achiziția datei se face pe
tranziț ia jos -sus a ceasului și propagarea se face pe tranziția sus -jos.
Avantajele interfeței seriale SPI:
 Comunica ție full duplex;
 Viteza mai mare fa ță de alte protocoale de comunica ție;

CONTROLUL LA DISTANȚĂ AL UNUI BRAȚ MANIPULATOR CU PATRU GRADE DE LIBERTATE
18  Protocol flexibil;
 Interfa țare hardware simpl ă;
 Etc.

Printre dezavantajel e interfeței seriale SPI se numără :
 Necesită mai mulți pini conectați la microcontroler față de alte protocoale ;
 Nu există confirmarea recepției datelor la nivel hardware ;
 Funcționează cu un singur dispozitiv master ;
 Nu suportă conectarea de noduri noi în timpul funcționării ;
 Etc,

2.6. Sistemul de operare FreeRTOS

Sistemul de operare FreeRTOS este un sistem de operare de timp real conceput pentru
sisteme integrate, portabil pe un număr mare de arhitecturi. Fiind open source și ușor de
configurat beneficiază de un suport bun din partea utilizatorilor. Acest a este un sistem de
operare mult i-tasking, adică permite rularea în paralel a mai multor procese(taskuri), ce pot
avea atribuite diferite funcționalități ale aplicației.

Taskul este unitatea executabilă d e bază a sistemului de operare. Acesta este
echivalentul unui fir de execuție dintr -un sistem de operare de uz general. Taskurile rulează
independent unele de celelalte, fiecare având propria stivă.

Implementarea lor este sub forma unei funcții ce con ține o buclă infinită din care nu
trebuie permisă ieșirea. Structura generică a unui task este prezentată în figura Fig 2 -13.

Fig 2-13 Structura generică a unui task
void taskGeneric( void pvParameters )
{
for ( ; ; )
{
// – Codul taskului –

vTaskDelay( ms_delay );
}
}

Orice task este creat folosind funcția xTas kCreate, cu următorii pa rametr i:
 Numele taskului;
 Identificatorul taskului;
 Dimensiunea stivei;
 Parametrii transmiși;

CONTROLUL LA DISTANȚĂ AL UNUI BRAȚ MANIPULATOR CU PATRU GRADE DE LIBERTATE
19  Prioritateea taskului;
 Handle la task.

Aceste taskuri pot avea diferite priorități, cel cu prioritatea cea mai mică fiind taskul
IDLE. Acesta este creat automat la pornirea planificatorului și are atribuită priorita tea
tskIDLE_PRIORITY. Acesta are rolul de a elibera spațiul de memorie alocat taskurilor ce nu
mai există. De asemenea, în momentul în care niciun task nu poate fi executat, taskul IDLE
trebuie să ruleze .

Fig 2-14 Stările în care se poate afla orice task

Fiecare task se poate afla în una din următoarele stări :
 RULEAZĂ – în momentul în care taskul este în această stare, el deține
controlul procesorului ;
 PREGĂTIT – în momentul în care taskul este în această st are, el este pregătit
să ruleze, și rămâne în această stare până când primește permisiunea de a
controla procesorul ;
 BLOCAT – în această stare, taskurile așteaptă apariția unui eveniment extern
sau temporal. Toate taskurile care sunt în această stare, după o anumită
perioadă de timp o părăsesc indiferent dacă a apărut sau nu evenimentul

CONTROLUL LA DISTANȚĂ AL UNUI BRAȚ MANIPULATOR CU PATRU GRADE DE LIBERTATE
20 așteptat. În această stare se poate ajunge așteptând într -o coadă de mesaje, sau
prin apelarea unei funcții, de exemplu , vTaskDelay();
 SUSPENDAT – în această stare, taskul n u mai are perioadă de așteptare. Un
task poate intra în această stare prin apelul funcției vTaskSuspend și o poate
părăsi prin apelul funcției vTaskResume.

Modul în care un task poate trece prin orice stare și funcțiile ce sunt apelate, sunt
prezentate în figura Fig 2 -14.

Comunicarea între taskuri se face cu ajutorul cozilor de mesaje și a semafoarelor.
Cozile pot fi folosite pentru a transmite date între taskuri și între rutinele de tratare a
întreruperilor și taskuri. Ele sunt create cu ajutorul funcției xQueueCreate, citirea din coadă se
face cu ajutorul funcției xQueueReceive iar scrierea în coada de mesaje se face cu funcția
xQueueSend. Elementele sunt copiate în coada de mesaje prin copiere și nu prin refe rință.

Planificatorul sistemului de operare poate rula în mod preemtiv sau nepreemtiv, fiind
pornit cu ajutorul funcției vTaskStartScheduler. În mod nepreemtiv, punctul de replanificare
este apelat doar la apelul funcției taskYIELD, asta însemnând că un task odată ce a preluat
controlul asupra procesorului poate să nu îl mai cedeze.

În modul preemtiv, planificatorul arbitrează ocuparea procesorului la fiecare început
de frame, în cazul în care un task în curs de execuție intră în suspendare sau bl ocare sau în
alte situați speciale cum ar fi ștergerea unui task.

2.7. Limbajul de programare Visual Basic

Limbajul Basic a fost dezvoltat de un colectiv de la Universitatea din Datrmouth din
Statele Unite ale Americii sub conducerea profesorului John Kemeny. Acesta este un limbaj
foarte asemănător cu limba engleză, ceea ce îl face ușor de memorat și ideal pentru începători.

Limbajul Visual Basic este un limbaj de programare derivat din limbajul Basic,
produs de Microsoft. Acesta dispune de o interfață gr afică relativ simplă și intuitivă. Face
parte din pachetul Visual Studio și este axat pe componenta de interfață a programului,
programatorul putând realiza foarte ușor componente standard de tip Windows, de exemplu,
ferestre, butoane, casete de text, avân d la dispoziție o bibliotecă cu componente vizuale a
căror funcționalitate este deja implementată.

Este un limbaj condus de evenimente și are implementată o listă de clase cu utilizare
generală. Până la versiunea 6, putea utiliza și dezvolta component e COM/COM+ și ActivX
dar și librării DLL. Odată cu apariția versiunii 7, adică odată cu apariția tehnilogiei .NET,
poate utiliza și crea componente .NET cu toate avantaleje pe care acestea le aduc. Fiind un
limbaj de nivel înalt, are implementată mai multe nivele de abstractizare a dezvoltării unei
aplicații, dar și posibilitatea de compilare în formatul .exe sau dll de 16 și 32 de biți.

Câteva diferențe față de limbajul C și limbajele derivate din acesta ar fi:
 Instrucțiunile se termină folosind cuvin te cheie, în locul parantezelor, de
exemplu End If;
 Constanta booleana True are valoarea numeric ă -1;
 Operatorii logici și cei pe bit sunt unificați ;

CONTROLUL LA DISTANȚĂ AL UNUI BRAȚ MANIPULATOR CU PATRU GRADE DE LIBERTATE
21  Integrare relativ puternică cu sistemul de operare Windows;
 Variabilele întregi sunt tratate ca variabile reale în expresiile în care apare
operatorul de împărțire ;
 Implicit, dacă o variabilă nu a fost declarată sau tipul variabilei nu a fost
specificat, acesteia i se atribuie tipul Variant .

Într-un program clasic, procedural, execuția programului urmărește o cale predefinită,
ea pornind de la prima linie de cod și apelează metodele pe măsură ce este nevoie de ele.

Într-o aplicație condusă de evenimente, sunt executate diverse secvențe de cod ca
răspuns la evenimente. Aceste evenimente pot fi declanșate d e acțiuni ale utilizatorului, cum
ar fi apăsarea unei taste, completarea unei căsuțe de text, dar pot fi declanșate și de mesaje ale
sistemului sau mesaje ale aplicației sau altor aplicații. Secvența în care apar aceste evenimente
determină secvența în car e se va executa codul.

Chiar dacă în aplicațiile tradiționale, dezvoltarea aplicațiilor implică trei mari etape,
scrierea, comp ilarea și testarea codului, în limbajul Visual Basic nu se face o distincție netă
între cele 3 etape. Acest limbaj de progra mare interpretează codul pe măsură ce este introdus,
semnalând astfel aproape instant orice greșeală sintactică sau semantic ă. Pe lângă această
semnalizare a erorilor, Visual Basic compilează parțial codul pe măsură ce este introdus iar
datorită acestei co mpilări parțiale, în momentul în care se dorește rularea aplicației,
compilarea se termină foarte rapid.

Mediul de lucru Visual Basic mai este numit și mediu integrat de dezvoltare (IDE),
deoarece generează numeroase funcții pentru proiectarea și edit area textului, compilarea și
depănarea codului în cadrul unui mediu comun, etc. Acest mediu de dezvoltare este constituit
din următoarele elemente:
 Bara cu meniuri;
 Meniuri contextuale;
 Bare cu instrumente;
 Fereastra Toolbox;
 Fereastra Project Explorer;
 Fereastra Proprietă ților;
 Etc.

Se pot adăuga în aplicație și obiecte din cadrul altor aplicații, cum ar fi cele incluse în
biblioteca de obiecte Microsoft Word sau Excel, drept controale în caseta cu instrumente sau
obiecte programabile în cod. Pentru a put ea folosi aceste obie cte trebuie atribuită o referință
către biblioteca de obiecte a acelei aplica ții.

O facilitate foarte importantă a limbajului de programare Visual Basic ce ajută la
micșorarea timpului de scriere al codului este opțiunea de comple tare automată a codului.
Această opțiune poate completa automat delara ții, proprietăți sau argumente pe măsura
introducerii codului fiind disponibilă o list ă cu opțiuni adecvate, prototipuri de declarații,
funcții sau valori.

CONTROLUL LA DISTANȚĂ AL UNUI BRAȚ MANIPULATOR CU PATRU GRADE DE LIBERTATE
22 Capitolul 3. Implementarea proiectului
3.1. Interfața cu utilizatorul
3.1.1. Inițializarea

Trimiterea comenzilor către brațul manipulator și setarea modului de lucru se face
printr -o interfață cu utilizatorul realizată în Visual Basic. Această interfață permite conectarea
la placa de dezvoltare Arduino folos ind Magistrala Serială Universală (USB).

Fig 3-1 Conectarea la placa de dezvoltare Arduino Uno

Interfața cu utilizatorul este împărțită în patru taburi:
 Inițializare;
 Joystick;
 Manual;
 Mănușa.

Tabul de Ini țializare ( Fig 3-1) se ocupă de conectarea la placa de dezvoltare Arduino
Uno. Aici sunt prezente trei liste drop-down . Prima este o listă cu toate porturile conectate în
acel moment, urmând a fi selectat portul c orespunzător plăcii de dezvoltare.

Din a doua listă se selectează viteza de baud. Sunt mai multe viteze disponibile,
pentru acest proiect comunicația cu placa de dezvoltare făcându -se la viteza de 115200 baud.

Cea de -a treia listă conține modalitatea de control dorită. Se poate alege între:
 Manual – în care se pot introduce valori pentru fiecare articulație sau un punct
dorit din spațiu;
 Joystick – în care cu ajutorul controalelor analogice se poate duce efectorul
într-un anumit punct din spațiu;
 Mănuș a – în care se folosește o mănușă dotată cu accelerometru și giroscop
pentru determinarea punctului dorit din spațiu și senzor de flexibilitate pentru
determinarea nivelului de deschidere al apucătorului.

CONTROLUL LA DISTANȚĂ AL UNUI BRAȚ MANIPULATOR CU PATRU GRADE DE LIBERTATE
23 Pe lângă aceste trei liste mai este disponibilă o casetă de text care poate lua
următoarele valori:
 DECONECTAT! – în cazul în care placa de dezvoltare nu este conectată;
 CONECTAT! – în cazul în care placa de dezvoltare este conectată cu succes;
 PORT OCUPAT! – în cazul în care portul selectat este folosi t în acel moment;

Ultimele elemente grafice ale acestui tab sunt butoanele de Inițializare, Oprire și
Ieșire. Butonul de Ieșire este activ în orice moment al execuției programului, în timp ce restul
butoanelor sunt active condiționat. La deschiderea progr amului, butonul de Inițializare este
inactiv până când toate cele trei liste necesare pentru conectare au fost completate. În
momentul în care se apasă butonul de Inițializare, dacă toate condițiile conectării sunt
îndeplinite, acesta devine inactiv și se activează butonul de Oprire. Acesta rămâne activ până
la apăsare, moment în care conexiunea cu placa de dezvoltare este întreruptă și se activează
din nou butonul de Inițializare.

Pentru a verifica dacă cele trei liste sunt completate se folosește timerul
checkSelectedTimer care odată la 100 milisecunde verifică câmpurile celor trei liste și le
compară cu șirul vid. Dacă cel puțin o listă a r ămas vidă, starea butonului de i nițializare
rămâne inactivă. În momentul în care conținutul celor trei liste este di ferit de șirul vid, starea
butonului de i nițializare devine activă( Fig 3-2).

Fig 3-2 Setarea butonul ui de i nițializare

În timp ce conținutul lis telor pentru viteza de baud și metoda de control este adăugat
manual, lista cu porturile disponibile se compune în mod automat la lansarea în execuție a
programului. În variabila porturi de tip Array se salvează toate porturile conectate iar folosind
metod a AddRange(porturi) se adaugă elementele listei.

În același eveniment de lansare în execuție al programului se mai fac și alte setări,
cum ar fi:
 Butonul de oprire este setat ca inactiv;
 Taburile de control sunt setate ca inactive;
 Timerul checkSelected Timer este pornit;
 Se setează mărimea și flagurile variabilei corespunzătoare informațiilor primite
de la joystick;
 Sunt făcute setările pentru casetele de text folosite ;
 Sunt setate ca inactive alte butoane folosite în alte taburi ale aplicației .

La even imentul creat de apăsarea butonului de inițializare, portul serial creat primește
numele ales din lista de porturi conectate și viteza de baud aleasă. Portul serial este deschis
folosind metoda Open, folosind setările alese anterior. După acest pas se porn ește timerul
sendTimer care se ocupă de trimiterea informațiilor către placa de dezvoltare, se dezactivează
butonul de Inițializare și se activează cel de Oprire.

În funcție de metoda de control aleasă, se activează tabul corespunzător, celelalte
rămânând inactive. Conținutul casetei de text care corespunde stării conexiunii USB este
initB.Enabled = True

CONTROLUL LA DISTANȚĂ AL UNUI BRAȚ MANIPULATOR CU PATRU GRADE DE LIBERTATE
24 schimbat în „CONECTAT!” folosind culoarea verde, timerul checkSelectedTimer este oprit,
se activează și se dezactivează unele butoane pentru a fi gata de lucru în momentul în care se
accesează tabul care le conține. Pentru a preveni aruncarea unor excepții în tabul Manual, se
inițializează valorile tuturor câmpurilor acestui tab cu valorile pe care urmează să le aibă în
mod implicit.

În cazul în care intervin probleme în timpu l conectării sau portul selectat este utilizat
de un alt dispozitiv se aruncă o excepție care setează conținutul casetei de text
corespunz ătoare conexiunii USB în „PORT OCUPAT!”.
La evenimentul declanșat de apăsarea butonul ui de oprire are loc următoarea listă de
acțiuni:
 Se închide conexiunea;
 Se activează butonul de inițializare și se dezactivează cel de oprire;
 Sunt setate ca inactive toate cele 3 taburi de control;
 Se opresc toate timerele cu excepția checkSelectedTimer ;
 Se seteaz ă conținutul casetei de text în „DECONECTAT!” folosind culoarea
roșie;

3.1.2. Preluarea informațiilor de la Joystick

Informațiile primite de la joystick sunt stocate într -o variabilă de tipul JOYINFOEX.
Aceasta este o structură ce are componența ca î n Fig 3 -3.

Fig 3-3 Structura JOYINFOEX
Public Structure JOYINFOEX
Public dwSize As Integer
Public dwFlags As Integer
Public dwXpos As Integer
Public dwYpos As Integer
Public dwZpos As Integer
Public dwRpos As Integer
Public dwUpos As Integer
Public dwVpos As Integer
Public dwButtons As Integer
Public dwButtonNumber As Integer
Public dwPOV As Integer
Public dwReserved1 As Integer
Public dwReserved2 As Integer
End Structure

CONTROLUL LA DISTANȚĂ AL UNUI BRAȚ MANIPULATOR CU PATRU GRADE DE LIBERTATE
25
Informațiile sunt stocate în variabila globală myjoyEX prin apelul funcției
joyGetPosEx ce are doi parametr i: primul specifică numărul joysti ckului ce se dorește a fi
utilizat, iar al doilea este un pointer către o variabilă de tipul JOYINFOEX în care se vor salva
informațiile referitoare la poziția și butoanele apăsate ale joystickului. Valorile acceptate
pentru primul parametru sunt în interv alul 0 -15, corespunzătoare joystickului dorit.

La declararea acestei funcții se va ține cont de faptul că aceasta va folosi Winmm.dll
care este un modul pentru Windows Multimedia API ce conține funcții low -level pentru
joystick. Valoarea returnată de ace astă funcție este JOYERR_NOERROR în cazul în care
funcția a fost apelată cu succes sau un mesaj de eroare în cazul în care au intervenit probleme
la apelarea funcției, conform tabelului Tabel 3-1.

Tabel 3-1 Valorile returnate de func ția joyGetPosEx
Valoare Returnata Descriere
MMSYSERR_NODRIVER Driverul joystickului nu este prezent
MMSYSERR_INVALPARAM Funcția a fost apelată cu un parametru invalid
MMSYSERR_BADDEVICEI D Identificatorul joystickului nu este valid
JOYERR_UNPLUGGED Joystickul specificat nu este conectat
JOYERR_PARMS Identificatorul joystickului nu este valid

Funcția se apelează odată la 10 milisecunde, la tickul timerului jTimer. Acest timer se
ocupă și de actualizarea barelor de progres( Fig 3-4) corespunzătoare fiecărei axe, orientării și
nivelului de deschidere al efectorului.

Toate valorile sunt salvate în labeluri corespunzătoare fiecărei valori primite de unde
vor fi accesate de fiecare dată când este nevoie de ultimele informații primite de la joystick.
Acest timer afișează și starea joystickului, dacă este sau nu prezent, iar în cazul în care este
prezent se afișează dacă este sau nu apăsat butonul Analo g(Fig 3-4). În cazul în care acest
buton nu este apăsat sau joystickul nu este prezent, se oprește timerul actJoy pentru a evita
actualizarea și interpretarea eronată a informațiilor primite și transmisia greșită a informațiilor
mai departe către brațul manipulator.

Fig 3-4 Afișarea datelor preluate de la joystick

Verificarea stării butonului Analog sau lipsa joystickului se face prin compararea în
același moment de timp a valorilor axelor x, y, z și o, cea din urmă fiind utilizată la calcularea
orientării apucătorului. Stabilirea stării butonului Analog sau lipsa joystickului se face
conform tabelului Tabel 3-2.

CONTROLUL LA DISTANȚĂ AL UNUI BRAȚ MANIPULATOR CU PATRU GRADE DE LIBERTATE
26 Tabel 3-2 Verificarea prezentei/starii joystickului
X Y Z O Stare
0 0 0 0 Lipsa Joystick
32767 32767 32767 32767 Analog Ok
32511 32511 32511 32511 Nu este apăsat butonul Analog

Pe lângă folosirea controalelor analog ice(Fig 3 -5) pentru poziție și orientare, de la
joystick se mai primesc informații cu privire la nivelul de deschidere al apucătorului (Fig 3 -6).
Pentru a deschide la maxim apucătorul se apasă butonul 1R, iar pentru a închide complet
apucătorul se apasă butonul 1L. Apucătorul poate lua valori în intervalul 0 -100%
incrementând sau decrementând în pași de câte 10% folosind butoanele 2L și 2R după cum
urmează: pentru deschiderea cu 10% a apucătorului se apasă butonul 2R iar pentru închiderea
cu 10% a apucătorului se apasă butonul 2L. Pentru o închidere sau deschidere treptată mai
rapidă se pot ține apăsate aceste butoane. Apăsarea a mai mult de un singur buton simultan va
afișa timp de 3 secunde un mesaj de ate nționare pe ecran.

Fig 3-5 Atribuirea axelor controalelor analogice

Fig 3-6 Controlul nivelului de deschidere al apuc ătorului

CONTROLUL LA DISTANȚĂ AL UNUI BRAȚ MANIPULATOR CU PATRU GRADE DE LIBERTATE
27 3.1.3. Comenzi manuale

Tabul manual perm ite introducerea de comenzi manuale pentru a fi trimise către brațul
manipulator. Aceste comenzi pot fi de două tipuri: Poziție sau Unghiuri.

Pentru a alege unul din aceste două moduri de lucru se bifează căsuța radio
corespunzătoare. La prima accesa re a tabului nicio căsuță nu este bifată, transmisia fiind
oprită până în momentul în care un mod de lucru este ales. Alegerea celui de -al doilea mod de
lucru duce implicit la oprirea primului. Se poate opri manual transmisia datelor introduse prin
apăsare a butonului „Oprește Actualizare”( Fig 3-7).

Fig 3-7 Butonul Oprește Actualizare

Reluarea transimisiei se face apăsând același buton care acum are textul „Pornește
Actualizare”. La prima deschidere a tabului, butonul este inactiv până la prima alegere a unui
mod de lucru, moment în care el se activează și primește rolul de a opri actualizarea. Oprirea
actualizării se face atribuind variabilei globale „tip” valoarea 0, corespunzătoare stării de
repaus. Butonul reacționează la evenimentul declanșat de apăsarea lui după tabelul Tabel 3-3.

Tabel 3-3 Stările butonului Opre ște/Pornește Actualizare
Precondi ții Acțiuni
Poziție (x) Unghiuri (x) Text Tip Text
Oprește Actualizare 0 Oprește Actualizare
x Oprește Actualizare 0 Pornește Actualizare
x
x Pornește Actualizare 1 Oprește Actualizare
x Pornește Actualizare 2 Oprește Ac tualizare

Timerul saveValuesTimer salvează valorile tuturor celor zece căsuțe de text. Aceste
valori vor fi folosite la o implementare ulterioară a unei noi funcționalități. Pe lângă această
funcționalitate, acest timer verifică valoarea variabilei errJo y iar în cazul în care această este
setată pe 1 în timpul aruncării unei excepții, face eroarea să clipească la frecvența de 10Hz
timp de 3 secunde.
3.1.3.1 Poziție manuală

Pentru setarea manuală a poziției se folosesc cinci bare de derulare care au asociate
fiecare câte o căsuță de text în care se poate introduce manual valoarea dorită.( Fig 3-8).
Primele trei valori ce pot fi introduse reprezintă coordonatele punctului în spațiu dorit
pentru efector, respectiv X, Y și Z. Următorul câmp setează orientarea apucătorului și poate
lua valori între -90 și 90 grade. În ultimul câmp se setează nivelul de deschidere al
apucătorului și se pot introduce valori între 0 și 100%.

CONTROLUL LA DISTANȚĂ AL UNUI BRAȚ MANIPULATOR CU PATRU GRADE DE LIBERTATE
28 Introducerea de valori eronate sau peste limitele admise determină aruncarea unei
excepții care resetează căsuța de text cu o valoare inițială și pune variabila errJoy pe 1, ceea
ce determină afișarea unui mesaj de eroare timp de trei secunde.

Fig 3-8 Preluarea pozi ției manuale

De asemenea, valorile se pot introduce trăgând de bara de derulare corespunzătoare
modificării dorite. De fiecare data când se trage de o bară de derulare se declanșează un
eveniment care actualizează caseta de text corespunzătoare cu valoa rea dată de bară.

În același mod, la fiecare modificare a căsuței de text se declanșează un eveniment
care actualizează poziția barei de derulare corespunzătoare cu valoarea introdusă.

La evenimentul declanșat de schimbarea valorii căsuței radio „Poz iție” se face
verificarea dacă respectiva căsuță este sau nu bifată. În cazul în care căsuța a fost bifată se
face inițializarea casetelor de text cu următoarele valori:
 X = 10
 Y = 10
 Z = 10
 Orientare = 0
 Apucător = 50

În mod automat se face și actuali zarea barelor de derulare, se egalează variabila
globală „tip” cu valoarea 1, corespunzător controlului manual al poziției.

În cazul în care căsuța radio a fost debifată, înseamnă că a fost selectată cealaltă
căsuță și valorile pentru poziția introdu să manual sunt resetate.

Acest eveniment presupune că s -a ales un mod de lucru nou, deci starea butonului de
oprire actualizare este activă.
3.1.3.2 Unghiuri manuale

Dacă se dorește alegerea unui anumit unghi pentru fiecare articulație se poate
completa fie care căsuță de text corespunzătoare unghiului dorit, sau se poate trage bara de
rulare în poziția dorită, asemănător cu setarea manuală a poziției.

CONTROLUL LA DISTANȚĂ AL UNUI BRAȚ MANIPULATOR CU PATRU GRADE DE LIBERTATE
29 La fel ca la setarea manuală a poziției, sunt disponibile cinci căsuțe de text care au
asociate fiecare cât e o bară de rulare ( Fig 3-9). Primele patru corespund primelor patru
articulații ale brațului manipulator și pot lua valori între 0 și 180 de grade.

Fig 3-9 Preluarea u nghiurilor manuale

Ultima căsuță de text corespunde nivelului de deschidere al apucătorului și poate lua
valori între 0 și 100%.

Asemănător cu setarea manuală a poziției, introducerea de valori eronate sau în afara
intervalului admis conduce la aru ncarea unei excepții ce resetează căsuța respectivă la
valoarea inițială și dă valoarea 1 variabilei globale errJoy pentru afișarea mesajului de eroare
timp de trei secunde.

Utilizarea barelor de derulare este la fel de eficientă pentru setarea unghi urilor fiecărei
articulații, actualizându -se în același timp și căsuța de text corespunzătoare cu valoarea
preluată de la bara de derulare.

În momentul în care căsuța radio corespunzătoare unghiurilor manuale este bifată se
declanșează evenimentul provoca t de bifarea/debifarea căsuței. Se verifică dacă evenimentul a
fost produs de bifarea căsuței respective, iar în caz afirmativ se face inițializarea câmpurilor
cu următoarele valori:
 Unghi 1: 90
 Unghi 2: 90
 Unghi 3: 90
 Unghi 4: 90
 Apucător: 50

Aceste valo ri se regăsesc și în pozițiile barelor de derulare la momentul inițial.

Variabila globală „tip” ce reprezintă tipul mesajului trimis primește valoarea 2,
corespunzător controlului manual al unghiurilor. De asemenea, se activează butonul „Oprește
Actu alizare”.

CONTROLUL LA DISTANȚĂ AL UNUI BRAȚ MANIPULATOR CU PATRU GRADE DE LIBERTATE
30 3.1.4. Manușa

Tabul manual permite ca brațul manipulator să fie controlat de poziția și orientarea
accelerometrului și giroscopului de pe mănuș ă. Nivelul de deschidere al apucătorului este dat
de nivelul de îndoire al senzorului de flexibilitate.

Starea inițială a butoanelor din acest tab este reprezentată în imaginea Fig 3-10

Fig 3-10 Butoanele pentru Start/Stop Manușa

Pentru a permite ca brațul manipulator să fie controlat de către mănușă, variabila
globală „tip” trebuia să ia valoarea 4, corespunzătoare controlului brațului de către mănușă.
Acest lucru se întâmplă în momentul apăsării butonului Start Mănușă. La evenimentul
declanșat de apăsarea acestui buton variabila „tip” primește valoarea 4. Pentru a preveni
aruncarea excepțiilor în cazul unei apăsări ulterioare a aceluiași buton, starea lui devine
inactiva, trecând în starea activă butonul Stop Mănușă.

La apăsarea butonului Stop Mănușă, variabila „tip” de vine 0, starea butonului devine
inactivă și se reactivează butonul Start Mănușă.
3.1.5. Trimiterea mesajului către placa de dezvoltare Arduino Uno

La evenimentul declanșat de apăsarea butonului de Inițializare se pornește timerul
sendTimer. Acest timer verifică variabila globală „tip” iar în funcție de valoarea acesteia se
decide tipul mesajului ce urmează a fi trimis. Semnificația variabilei „tip” este dată de tabelul
Tabel 3-4.

In funcție de valoarea variabilei, câmpur ile mesajului sunt egalate cu valorile
corespunzătoare.

Tabel 3-4 Semnificația variabilei tip
tip Tipul mesajului
0 Repaus
1 Setarea manuală a poziției
2 Setarea manuală a unghiurilor
3 Brațul manipulato r este controlat de către Joystick
4 Brațul manipulator este controlat de către Mănușă
5 Eroare

Mesajul este o variabilă globală de tipul structurii mesaj. Această are structură
detaliată în secvența de cod Fig 3-11.

CONTROLUL LA DISTANȚĂ AL UNUI BRAȚ MANIPULATOR CU PATRU GRADE DE LIBERTATE
31 Fig 3-11 Structura mesajului
Structure mesaj

Public tip As Integer
Public x As Decimal
Public y As Decimal
Public z As Decimal
Public orien As Integer
Public apuc As Integer
Public sc As Integer

End Structure

Rolul fiecărui element din structură este următorul:
 Variabila tip reprezintă tipul mesajului si primește valoarea variabilei globale
tip;
 Variabila x poate reprezenta coordonata p unctului dorit pe axa X în cazul în
care valoarea variabilei tip este 1 sau 3 și poate reprezenta valoarea unghiului
primei articulații în cazul în care valoarea variabilei tip este 2;
 Variabila y poate reprezenta coordonata punctului dorit pe axa Y în caz ul în
care valoarea variabilei tip este 1 sau 3 si poate reprezenta valoarea unghiului
celei de -a doua articulații în cazul în care valoarea variabilei tip este 2;
 Variabila z poate reprezenta coordonata punctului dorit pe axa Z în cazul în
care valoarea v ariabilei tip este 1 sau 3 și poate reprezenta valoarea unghiului
celei de -a treia articulații în cazul în care valoarea variabilei tip este 2;
 Variabila orien reprezintă valoarea pentru orientarea apucătorului;
 Variabila apuc reprezintă nivelul de deschid ere al apucătorului;
 Variabila sc reprezintă suma de control trimisă odată cu mesajul; Aceasta are
rolul de a verifica dacă mesajul recep ționat este corect. Pentru a face această
verificare se calculează din nou la receptie suma de control și se compară cu
suma de control primită. Dacă valorile sunt egale, se presupune că mesajul
recepționat este corect.

Calculul sumei de control se face adunând toate elementele structurii.

Pentru a trimite tot mesajul ca un singur element am ales să unesc toate elementel e
structurii într -un șir de caractere( Fig 3-12). Pentru o decodificare mai ușoară, am folosit ca
separator între elementele structurii caracterul ‘ ‘.

Fig 3-12 Șirul d e caractere trimis pe magistrala serială universală
tip ` ` x ` ` y ` ` z ` ` orien ` ` apuc ` ` sc `\n`

CONTROLUL LA DISTANȚĂ AL UNUI BRAȚ MANIPULATOR CU PATRU GRADE DE LIBERTATE
32
Pentru a uni tot mesajul într -un șir de caractere am creat funcția StructToString
(Fig 3-13) ce pri mește ca parametru variabila de tipul mesaj și returnează șirul de caractere.

Fig 3-13 Funcția StructToString
3.2. Placa de dezvoltare Arduino Uno
3.2.1. Inițializare și Recepția mesajelor

Recepția mesajelor pe placa de dezvoltare Arduino Uno se face folosind Magistrala
Serială Univers ală. Acest lucru se face apelând funcția begin ce primește ca parametru viteza
de baud dorită. Pentru o utilizare optimă a magistralei am ales viteza de baud 115200.

Fiecare mesaj primit pe magistrală este sub forma unui șir de caractere, descris de
figur a Fig 3-12. Toate mesajele sunt salvate în variabila globală m, de tipul mesaj. Această
structură a fost declarată ca în figura Fig 3-14.

Fig 3-14 Structura mesajului

În variabila globală m va fi mereu salvat ultimul mesaj recepționat corect. Până la
stabilirea corectitudinii mesajului, acesta rămâne în variabila globală mesaj_temporar.
Procesul de citire și decodificare al mesajului este descris în continuare.

Funcția care se ocupă de preluarea șirului de caractere de pe magistrală este
ReadString. Stru ctura acestei funcții este prezentată în figura Fig 3-15.
Public Function StructToString(obj As Object) As String
Return String.Join(" ",
obj.GetType().GetFields().Select(Function(field) field.GetValue(obj)))
End Function
typedef struct
{
int tip;
float x;
float y;
float z;
int orien;
int apuc;
int sc;
}
mesaj;

CONTROLUL LA DISTANȚĂ AL UNUI BRAȚ MANIPULATOR CU PATRU GRADE DE LIBERTATE
33 Fig 3-15 Funcția ReadString

Această funcție se folosește de cele două șiruri de caractere declarate global, temp și
îndată, care au fost iniț ializate cu șirul vid. Atâta timp cât pe magistrala serială sunt caractere
de preluat, acestea sunt salvate pe rând în variabila locală received. După citirea caracterului,
acesta este adăugat în șirul de caractere îndată. În momentul în care caracterul ci tit este
terminatorul de linie, variabila temp ce urmează a fi returnată este egalată cu îndată ce conține
toate caracterele citite până în acel moment. În acel moment pe magistrală nu mai este nimic
de citit, variabila îndată este egalată cu șirul vid și se returnează temp.

Funcția ActualM se ocupă de interpretarea și verificarea șirului de caractere primit. În
șirul de caractere local s se salvează valoarea returnată de funcția ReadString. Acest șir este
parcurs, iar tuturor câmpurilor variabilei mesaj_t emporar le sunt atribuite valorile
corespunzătoare din șirul de caractere, conform figurii Fig 3-16. În șirul de caractere
recepționat componentele mesajului sunt separate prin spațiu.
String ReadString(void)
{
while (Serial.available() > 0)
{
char recieved = Serial.read();
inData += recieved;
if (recieved == ' \n')
{
temp = inData;
inData = "";
}
}
return temp;
}

CONTROLUL LA DISTANȚĂ AL UNUI BRAȚ MANIPULATOR CU PATRU GRADE DE LIBERTATE
34 Fig 3-16 Modul de lucru al funcției ActualM

Pentru conversia fiecărui subșir( Fig 3-17) în variabile de tip in t sau float am creat
funcți ile Stoi și respectiv S tof ce primesc ca parametri subșiru l ce urmează a fi convertit și
returnează variabila convertită.

Fig 3-17 Exemplu de folosire al funcției StoI

Funcțiile au la bază metodele atoi și atof ale limbajului de pro gramare C++. Deoarece
trebuie convertite variabile de tipul String și aceste metode primesc ca parametru un pointer
de tipul char la șirul ce urmează a fi convertit, este de preferat folosirea fu ncțiilor Stoi și S tof
datorită simplității apelării.

Structura funcțiilor Sto I și StoF este prezentată în figurile Fig 3-18 si Fig 3-19.

Fig 3-18 Funcția StoI

Fig 3-19 Funcția StoF mesaj_temporar.tip = StoI(prov);
int StoI(String s)
{
return atoi((const char*)s.c_str());
}
float StoF(String s)
{
return atof((const char*)s.c_str());

CONTROLUL LA DISTANȚĂ AL UNUI BRAȚ MANIPULATOR CU PATRU GRADE DE LIBERTATE
35
Verificarea corectitudinii mesajului se face calculând suma de control. Ace astă sumă
este egală cu suma tuturor elementelor mesajului. Pentru această verificare am folosit funcția
mesajOk.

Structura acestei funcții este prezentată în figura Fig 3-20.

Fig 3-20 Funcția mesajOk

Această funcție folosește variabila locală sc, inițializată cu 0, în care se adună pe rând
toate elementele variabilei mesaj_temporar. După adunarea tuturor elementelor mesajului,
dacă variabila sc es te egală cu sumă de control trimisă odată cu mesajul, se presupune că
mesajul transmis este corect și funcția returnează valoarea 0xff. Dacă rezultatul comparației
egalității celor două valori este negativ funcția returnează valoarea 0.

Variabila glob ală m primește valoarea variabilei mesaj_temporar doar în cazul în care
funcția mesajOk returnează o valoare diferită de 0 ( Fig 3-21).
}
int mesajOk(void)
{
int sc = 0;
sc += mesaj_temporar.tip;
sc += mesaj_temporar.x;
sc += mesaj_temporar.y;
sc += mesaj_temporar.z;
sc += mesaj_temporar.orien;
sc += mesaj_temporar.apuc;
if(mesaj_tempora r.sc == sc)
return 0xff;
else
return 0;
}

CONTROLUL LA DISTANȚĂ AL UNUI BRAȚ MANIPULATOR CU PATRU GRADE DE LIBERTATE
36 Fig 3-21 Actualizarea variabilei m cu mesajul temporar corect recepționat

3.2.2. Impachetarea și trimiterea mesajelor

Mesajul recepționat corect este împachetat și trimis mai departe către procesorul
numeric de semnal dsPIC33FJ128MC708. Împachetarea mesajului se face sub forma unei
uniuni de 32 de octeți, prezentată în figura Fig 3-22.

Fig 3-22 Structura mesajului transmis

Această uniune poate fi accesată sub forma unui șir de 32 de caractere, sub forma unui
șir de 16 variabile de tip int și sub forma unui șir de 8 variabile de tip float. La completarea
câmpurilor uniunii se folosesc 4 câmpuri întregi și 3 câmpuri zecimale. În momen tul în care
uniunea este trimisă, se trimite un pointer către adresa șirului de 32 de caractere.

Variabila de tipul uniunii în care se întroduc toate informațiile pentru transmisie este
ra_out. Pentru dezvoltări ulterioare, în care se dorește a se imp lementa un sistem de feedback
împreună cu alte informații primite înapoi de la brațul manipulator este creata și variabila
ra_in. union pack
{
char pac[32];
int in[16];
float fl[8];
}; pack ra_out;

CONTROLUL LA DISTANȚĂ AL UNUI BRAȚ MANIPULATOR CU PATRU GRADE DE LIBERTATE
37
Funcția care atribuie câmpurilor din uniune valorile corespunzătoare este
ActualizareUniune. Deoarece toate variabilele c u care se lucrează sunt declarate global,
această funcție nu are nevoie de niciun parametru și nu returnează nimic. Funcționarea
acesteia este ilustrată în figura Fig 3-23.

Fig 3-23 Modul de lucru al funcției ActualizareUniune

Ordinea componentelor mesajului în cadrul uniunii este următoarea:
 int[0] – tipul mesajului;
 int[1] – orientarea apucătorului;
 int[2] – nivelul de deschidere al apucătorului;
 int[3] – suma de co ntrol;
 float[2] – coordonata x a punctului dorit;
 float[3] – coordonata y a punctului dorit;
 float[4] – coordonata z a punctului dorit;

Această funcție se mai ocupă și de calcularea sumei de control ce reprezintă suma
elementelor mesajului ce urmează a fi transmis. Pentru a asigura corectitudinea sumei de
control transmisă în cazul în care unele elemente au fost modificate, aceasta se recalculează și
nu se păstrează suma primită din interfața cu utilizatorul.

Transmisia mesajului către dsPIC33FJ128MC708 s e face utilizând transceiverele
wireless nRF24L01, folosind interfața serială SPI. Interfațarea transceiverelor se face folosind
librăria Mirf, o librărie open -source oferită de către comunitatea Arduino. Această librărie
pune la dispoziție mai multe metod e prin care se poate configura interfața serială SPI.

Inițializarea( Fig 3-24) se face în metoda setup, specifică Arduino. Aici se apelează
funcția de inițializare a modulului pentru configurarea pinilor I/O, s e setează driverul SPI, se
setează adresa dispozitivului, se alege lungimea mesajului de 32 de octeți, canalul 120 ce
urmează a fi folosit, și se setează ca ieșire pinul 2 al portului digital la care va fi conectat un
led ce va indica starea transmisiei.

CONTROLUL LA DISTANȚĂ AL UNUI BRAȚ MANIPULATOR CU PATRU GRADE DE LIBERTATE
38
Fig 3-24 Inițializarea comunicației pentru interfața serială SPI

Pinii specifici SPI, prezent ați în capitolul teoretic, sunt conectați la placa de dezvoltare
Arduino Uno după cum urmează:
 MISO – pinul digital 12
 MOSI – pinul digital 11
 SCK – pinul digital 13
 CE – pinul digital 8
 CSN – pinul digital 7

Funcția care se ocupă de transmisia mesajului este sendi( Fig 3-25). Această funcție
salvează la începutul execuției timpul scurs de la pornirea aplicației în variabila time, ce va fi
folosită ulterior.

Pentru a putea trimite mesajul, trebuie setată anteri or adresa către care dorim să fie
trimis. Acest lucru se face folosind funcția setTADDR, apoi se trimite adresa șirului de
caractere ce reprezintă mesajul folosind funcția send.

După finalizarea transmisiei programul așteaptă confirmarea recepției mesajului.
Acesta așteaptă într -o buclă while atâta timp cât pe linia de intrare nu sunt date de recepționat.
În acest timp, se compară variabila time cu timpul curent al execuției programului. În cazul în
care au trecute mai mult de 10 milisecunde și prog ramul nu a primit niciun răspuns, se
presupune că mesajul este pierdut, ledul conectat la pinul 2 este stins, și se iese forțat din
funcție.

În cazul în care se primește un răspuns, acesta este citit în variabila ra_in și ledul este
aprins.

Fig 3-25 Funcția sendi Mirf.setRADDR((byte *)"clie1");
Mirf.payload = 32;
Mirf.channel = 120;
Mirf.config();
pinMode(2, OUTPUT);
void sendi(void)
{
unsigned long time = millis();
Mirf.setTADDR((byte *)"serv1");
Mirf.send((byte *)&ra_out.pac);
while(Mirf.isSending())

CONTROLUL LA DISTANȚĂ AL UNUI BRAȚ MANIPULATOR CU PATRU GRADE DE LIBERTATE
39
Pentru funcționarea programului, în funcția loop specifică Arduino sunt apelate în
ordinea prezentată urmă toarele funcții:
 ActualM
 ActualizareUniune
 sendi
3.3. Procesorul Numeric de Semnal dsPIC33FJ128MC708
3.3.1. Configurare PLL

Sistemul de operare de timp real FreeRTOS a fost configurat pentru a rula pe
procesorul numeric de semnal dsPIC33FJ128MC708. Frecvența nominală a oscilatorului fiind
de 7.37 Mhz, am ales mărirea frecvenței la 80 Mhz utilizând modulul PLL pe care îl pune la
dispoziție dsPIC -ul. Schema bloc a modulului PLL este prezentată în figura Fig 3-26.

Fig 3-26 Schema bloc a modulului PLL

{
}
while(!Mirf.dataReady()){
if ( ( millis() – time ) > 10 ) {
digitalWrite(2, LOW);
return;
}
}
Mirf.getData((byte *) &ra_in.pac);
digitalWrite(2, HIGH);
}

CONTROLUL LA DISTANȚĂ AL UNUI BRAȚ MANIPULATOR CU PATRU GRADE DE LIBERTATE
40 Pentru obținerea frecvenței dorite, trebuie luată în considerare frecvența nominală a
oscilatorului, precum și următoarele variabile:
 N1 – Reprezintă prescalerul cu care este împărțită frecvența actuală a
oscilatorului. Acesta poate lua valori între 2 și 33, iar valoarea rezultată trebuie
să fie între 0.8 și 8.0 Mhz. Setarea acestei valori se face punând în biții
PLLPRE ai registrului CLKDIV valoarea dorită, conform specificațiilor din
foaia de catalog;
 M – Reprezintă divizorul de feedback. Cu această valoare se înmulțește
rezultatul operației anterioare. Acesta poate lua valori între 2 și 513, însă
trebuie ținut cont de restricția impusă, rezultată din schema bloc, și anume
rezultatul tr ebuie să fie între 100 și 200 Mhz. Setarea acestei valori se face
punând în biții PLLDIV ai registrului PLLFBD valoarea dorită, conform
specificațiilor din foaia de catalog;
 N2 – Reprezintă postscalerul cu care este împărțită valoarea rezultată din
opera ția anterioară. Acesta poate lua valorile 2, 4 și 8 iar frecvența rezultată
trebu ie să fie în intervalul 12.5 a 80 Mhz. Setarea acestei valori se face punând
în biții PLLPOST ai registrului CLKDIV valoarea dorită, conform
specificațiilor din foaia de catal og.

(Ec. 3-1)

Urmărind schema bloc, putem deduce formula de calcul a frecvenței dorite a
oscilatorului( Ec. 3-1) ținând cont de frecvența nominală și de cele 3 variabile anterior
menționate.

Frecvența de magistrală, conform ecuației Ec. 3-2 este jumătate din frecvența
oscilatorului.

(Ec. 3-2 )

Ținând cont de aceste aspecte, pentru obținerea frecvenței oscilatorului de 80MHz,
respectiv frecvența de magistrală de 40MHz, pentru variabilele date am folosit următoarele
valori:
 N1 = 2
 M = 43
 N2 = 2

3.3.2. Conectare nRF24L01

Transceiverul wireless este c onectat cu ajutorul celor cinci pini specifici interfeței
seriale SPI, prezentați în capitolul teoretic, după cum urmează:
 MOSI – _RG8;
 MISO – _RG7;
 SCK – _RG6;
 CSN – _RG9;
 CE – RB3;

CONTROLUL LA DISTANȚĂ AL UNUI BRAȚ MANIPULATOR CU PATRU GRADE DE LIBERTATE
41
Deoarece trebuiesc alese aceleași valori pentru payload și canal la a mbele
transceivere, am ales canalul 120 și payloadul 32.

Driverul folosit pe Arduino nu poate fi folosit aici deoarece toate metodele acelui
driver aparțineau clasei Mirf, iar sistemul de operare FreeRTOS folosește limbajul de
programare C. Din acest motiv, driverul pentru conectarea transceiverului a fost modificat
pentru a fi compatibil cu procesorul numeric de semnal dsPIC33FJ128MC708.

Funcțiile au rămas aceleași, cu mici modificări. Un aspect foarte important este
setarea rezistenței de pull -up pentru pinul de intrare (MISO).

Funcția configNRF se ocupă de inițializarea transmisiei, setând adresa „serv1” și
payloadul 32.

3.3.3. Taskuri folosite

Aplicația funcționează cu două taskuri de prioritate egală, NRF_TASK și
ACTUALIZARE_ROBOT. Aceste a se execută la 10 și respective 30 milisecunde. Ordinea de
executare a taskurilor este prezentată în figura Fig 3-27.

Fig 3-27 Ordinea de executare a taskurilor

NRF_TAS K se ocupă de recepționarea, verificarea și actualizarea mesajelor primite.
Mesajele, la fel ca și până acum, sunt sub formă unei structuri cu următoarea componență:
 tip – reprezintă tipul mesajului trimis. Valorile pe care le poate lua această
variabilă ș i semnificația lor poate fi văzută în tabelul Tabel 3-4;
 x – reprezintă coordonata x a punctului dorit, sau unghiul primei articulații, în
funcție de valoarea variabilei tip;
 y – reprezintă coordonata y a punctului dorit, sau unghiul celei de -a doua
articulații, în funcție de valoarea variabilei tip;
 z – reprezintă coordonata z a punctului dorit, sau unghiul celei de -a doua
articulații, în funcție de valoarea variabilei tip;
 orien – reprezintă orientarea efectorului ;
 apuc – reprezintă nivel ul de deschidere al efectorului.

CONTROLUL LA DISTANȚĂ AL UNUI BRAȚ MANIPULATOR CU PATRU GRADE DE LIBERTATE
42 Acest task așteaptă recepționarea unui mesaj de la placa de dezvoltare Ardiuno Uno.
Confirmarea recepției se face prin verificarea valorii returnate de două funcții, și anume, se
verifică dacă nu s e trimite nimic, și dacă sunt date pregătite să fie recepționate. Dacă aceste
două condiții sunt îndeplinite, cu funcția getData se citește mesajul în variabila ra_in. Această
variabilă este de tipul pack, o uniune cu structură identică cu cea prezentată î n figura Fig 3-22.

Variabila globală m, de tipul structurii menționate anterior, conține în orice moment
de timp ultimul mesaj corect recepționat. Verificarea corectitudinii mesajului se face
comparând suma el ementelor mesajului cu suma de control trimisă odată cu acesta. Funcția
care face verificarea mesajului este mesajOk. Aceasta este prezentată în figura Fig 3-28.

În cazul în care funcția mesajOk returnează o v aloare diferită de 0 se presupune că
mesajul recepționat este corect, se trimite un răspuns înapoi către placa de dezvoltare Arduino
Uno pentru a confirma recepția corectă a mesajului și se apelează funcția actualizareMesaj.

Această funcție se ocupă d e actualizarea variabilei globale m, menționate anterior.
Modul de despachetare al datelor pe care îl execută această funcție este prezentat în figura
Fig 3-29.
Fig 3-28 Funcția mesajOk

unsigned char mesajOk(void)
{
int sc = 0;
sc += ra_in.in[0];
sc += ra_in.in[1];
sc += ra_in.in[2];
sc += ra_in.fl[2];
sc += ra_in.fl[3];
sc += ra_in.fl[4];
return(sc == ra_in.in[3] ? 0xff : 0);
}

CONTROLUL LA DISTANȚĂ AL UNUI BRAȚ MANIPULATOR CU PATRU GRADE DE LIBERTATE
43 Fig 3-29 Modul de lucru al funcției actualizareMesaj

Taskul ACTUALIZARE_ROBOT verifică câmpul tip al mesajului, iar în funcție de
valoarea acestuia, într -un switch, apelează funcțiile corespunzătoare, după cum urmează:
 tip = 0 – nu apelea ză nicio funcție; break;
 tip = 1 sau tip = 3 – apelează funcția SeteazaPunct care duce brațul
manipulator în punctul indicat de variabila globală m;
 tip = 2 – apelează funcția SetazaPozitie pentru fiecare din cele 4 articulații și
pentru nivelul de deschid ere al apucătorului;
 tip = 4 – apelează funcția pentru actualizarea poziției în funcție de poziția
accelerometrului;
Dacă variabila tip nu are niciuna din valorile menționate, șirul de caractere erori este
egalat cu mesajul „EROARE ACTUALIZARE ROBOT”.

CONTROLUL LA DISTANȚĂ AL UNUI BRAȚ MANIPULATOR CU PATRU GRADE DE LIBERTATE
44 Capitolul 4. Conc luzii

Realizarea și controlarea unui braț manipulator necesită multă documentare, nu doar
din domeniul roboticii, ci și din domeniile ce fac posibilă achiziționarea, transmisia și
interpretarea comenzilor ce urmează a fi trimise către acesta.

Alegerea modalității de control se face din interfața cu utilizatorul realizată în Visual
Basic ce rulează pe un calculator. Utilizatorul se conectează la placa de dezvoltare Arduino
Uno folosind Magistrala Serială Universală la viteza de 115200 baud. Fiecare moda litate de
control are un tab separat în care se introduc comenzile. Deplasarea efectorului în punctul
dorit cu ajutorul unui joystick se face folosind controalele analogice ale joystickului, iar
efectorul se poate deschide și închide, total sau parțial fol osind butoanele 1L, 1R, 2L și 2R.
Comenzile manuale pentru unghiuri sau poziție se introduc în tabul specific controlului
manual folosind casete de text sau bare de derulare. Controlul către alegerea unghiurilor în
mod manual sau către alegerea poziției în mod manual se acordă exclusiv prin bifarea căsuței
radio corespunzătoare. Permisiunea de a controla brațul manipulator de către mănușa echipată
cu accelerometru și giroscop se acordă din tabul Mănușă.

Un aspect important al achiziției datelor este reprez entat de achiziția corectă a
acestora. Fiecare valoare introdusă trebuie validată pentru a nu transmite comenzi greșite
brațului manipulator. Aceste comenzi greșite pot duce la o funcționare eronată a acestuia sau
chiar la defectarea brațului manipulator.

După recepția datelor pe placa de dezvoltare Arduino Uno, acestea sunt pregătite
pentru transmisia wireless. De această transmisie se ocupă transceiverele nRF24L01 ce
comunică cu microcontrolerul ATmega328 și cu Procesorul Numeric de S emnal
dsPIC33FJ128M C708 folosind interfața serială SPI.

Datorită perturbațiilor ce pot apărea în orice moment al transmisiei unui mesaj,
indiferent de metoda de transmisie folosită, acestea trebuie în permanență verificate. O
modalitate foarte eficientă de verificare a core ctitudinii unui mesaj o reprezintă calcularea
unei sume de control înainte de transmisia mesajului și trimiterea acesteia odată cu trimiterea
mesajului. La recepție, se va verifica această sumă pentru a avea certitudinea că mesajul
recepționat este corect.

Procesorul Numeric de Semnal se ocupă de recepția mesajelor, decodificarea lor și
elaborarea comenzilor către servomotoare. Acesta rulează folosind sistemul de operare de
timp real FreeRTOS cu două taskuri. Primul task se ocupă de recepția, verificarea și
actualizarea mesajelor primite, iar cel de -al doilea task se ocupă de trimiterea comenzilor
către servomotoare în funcție de tipul modalității de control și conținutul mesajului primit.

În varianta inițială a planificării aplicației pentru sistemul d e operare de timp real
există câte un task pentru fiecare metodă de control dorită, însă s -a constatat în urma
experimentelor că suspendarea și revenirea din starea de suspendare a taskurilor nu este cea
mai optimă soluție pentru interpretarea diferită a d atelor recepționate, așa că s -a adoptat
soluția folosirii unui singur task pentru actualizarea brațului manipulator, indiferent de metoda
de control folosită.

CONTROLUL LA DISTANȚĂ AL UNUI BRAȚ MANIPULATOR CU PATRU GRADE DE LIBERTATE
45 Acest proiect poate fi folosit ca un întreg, sau poate fi integrat în alte proiecte mai
mari, cum ar fi:
 Folosirea într -o linie de fabricație ;
 Datorită controlului la distanță, poate fi folosit în medii radioactive sau în zone
în care accesul oamenilor în timpul proceselor este interzis ;
 Chiar dacă transceiverele nRF permit comunicarea pe o dista nță de maxim
100m, din moment ce interfața cu utilizatorul rulează pe un calculator conectat
la internet, practic brațul manipulator poate fi controlat de oriunde și de la
orice distanță ;
 Folosind comenzile manuale, se pot efectua operații de manipulare a obiectelor
cu o precizie ridicată .

Datorită constrângerilor de timp și materiale, nu toate funcționalitățile propuse la
începutul proiectului au fost implemenate. Însă, pe viitor se dorește continuarea proiectului și
îmbunătățirea acestuia cu următoarele facilități :
 Calcularea spațiului accesibil brațului manipulator ;
 Verificarea în timp real a comenzilor trimise către brațul manipulator pentru a
verifica dacă punctul dorit este accesibil ;
 Montarea unei camere video pe efector și trimiterea imaginilor pent ru a fi
vizualizate în interfața cu utilizatorul ;
 Folosind o serie de senzori montați pe brațul manipulator se dorește verificarea
acurateții interpretării comenzilor recepționate .

CONTROLUL LA DISTANȚĂ AL UNUI BRAȚ MANIPULATOR CU PATRU GRADE DE LIBERTATE
46 Capitolul 5. Bibliografie

1. Arduino Playground – nRF24L01, Mirf library
2. Benjamin Dav id Lunt, 2012 – USB: The Universal Serial Bus (Operating
System Design)
3. Brennen Ball, 2007 – Everything You Need to Know about the nRF24L01 and
MiRF -v2
4. David Kalinsky and Roee Kalinsky, 2002 – Introduction to Serial Peripheral
Interface
5. Don Anderson, Dave Dzatko, 2001 – USB System Architecture (USB 2.0)
6. Greg Perry , 1999 – Sams Teach Yourself Visual Basic 6 in 24 Hours
7. Jan Axelson, 2005 – USB Complete, Everything You Need to Develop Custom
USB Peripherals, Third Edition
8. Jesse Russell, Ronald Cohn, 2012 – Serial Peripheral Interface Bus
9. Lavinia Ferariu, 2014 – Programarea aplicațiilor de timp real -note de curs,
10. Mayank Prasad, 2013 – Serial Peripheral Interface – SPI Basics
11. Microchip, 2009 – dsPIC33FJXXXMCX06/X08/X10 Data Sheet
12. Neil Smyth , 2007 – Visual Basic E ssentials
13. Nordic Semiconductor, 2008 – nRF24L01 + Single Chip 2.4GHz Transceiver,
Preliminary Product Specification v1.0
14. www.arduino.cc
15. www.FreeRTOS.org

Similar Posts