Sistem de control la distant , a a unui brat ,robotic [627108]

Universitatea POLITEHNICA din Bucures ,ti
Facultatea de Electronic a, Telecomunicat ,ii s ,i Tehnologia Informat ,iei
Sistem de control la distant , a a unui brat ,robotic
Lucrare de licent , a
Prezentat a ca cerint , a part ,ial a pentru obt ,inerea
titlului de Inginer
^ n domeniul Electronic a, Telecomunicat ,ii s ,i Tehnologia Informat ,iei
programul de studii Electronic a Aplicat a
Conduc ator s ,tiint ,i c Absolvent
R azvan Cr aciunescu
Octavian FratuMihai L acusteanu
Anul 2018

Declarat ie de onestitate academic a
Prin prezenta declar c a lucrarea cu titlul Sistem de control la distant , a a unui brat ,robotic ,
prezentat a ^ n cadrul Facult at ii de Electronic a, Telecomunicat ii  si Tehnologia Informat iei a Uni-
versit at ii \Politehnica" din Bucure sti ca cerint  a part ial a pentru obt inerea titlului de Inginer ^ n
domeniul Inginerie Electronic a  si Telecomunicat ii/ Calculatoare  si Tehnologia Informat iei, pro-
gramul de studii Electronic a Aplicat a este scris a de mine  si nu a mai fost prezentat a niciodat a
la o facultate sau institut ie de ^ nv at  am^ ant superior din t ar a sau str ain atate. Declar c a toate
sursele utilizate, inclusiv cele de pe Internet, sunt indicate ^ n lucrare, ca referint e bibliogra ce.
Fragmentele de text din alte surse, reproduse exact, chiar  si ^ n traducere proprie din alt a limb a,
sunt scrise ^ ntre ghilimele  si fac referint  a la surs a. Reformularea ^ n cuvinte proprii a textelor
scrise de c atre alt i autori face referint  a la surs a. ^Int eleg c a plagiatul constituie infract iune  si se
sanct ioneaz a conform legilor ^ n vigoare. Declar c a toate rezultatele simul arilor, experimentelor
 si m asur atorilor pe care le prezint ca ind f acute de mine, precum  si metodele prin care au fost
obt inute, sunt reale  si provin din respectivele simul ari, experimente  si m asur atori. ^Int eleg c a
falsi carea datelor  si rezultatelor constituie fraud a  si se sanct ioneaz a conform regulamentelor
^ n vigoare.
Bucure sti, Septembrie 2018.
Absolvent: [anonimizat] acusteanu
………………………

Cuprins
Lista gurilor : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : iii
Lista tabelelor : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : iv
Lista acronimelor : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : v
1. Introducere : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : 1
1.1. Alte recomand ari . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
2. Notiuni Teoretice : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : 2
2.1. Hardware Folosit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
2.1.1. Raspberry PI . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
2.1.2. Arduino Uno . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
2.1.3. Arduino Nano . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
2.1.4. Modul Bluetooth HC-05 . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
2.1.5. Servo Motoare . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
2.2. Software Folosit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
2.2.1. Sistemul de operarare Raspbian . . . . . . . . . . . . . . . . . . . . . . . 5
2.2.2. ROS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
2.2.2.1. Pachete in ROS . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
2.2.2.2. Noduri in ROS . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
2.2.2.3. Topic-uri in ROS . . . . . . . . . . . . . . . . . . . . . . . . . . 6
2.2.2.4. Mesaje in ROS . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
2.2.2.5. Publisher in ROS . . . . . . . . . . . . . . . . . . . . . . . . . . 7
2.2.2.6. Subscriber in ROS . . . . . . . . . . . . . . . . . . . . . . . . . 7
2.2.2.7. ROS SERIAL . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
2.2.3. Android . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
2.2.4. Arduino . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
2.3. LIMBAJE FOLOSITE:(de ce) . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
3. Implementare : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : 10
3.1. Conectare elemente Harware . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
3.1.1. Conectare Raspberry Ard Uno . . . . . . . . . . . . . . . . . . . . . . . . 10
3.1.2. Conectare Raspberry Ard Nano . . . . . . . . . . . . . . . . . . . . . . . 11
3.1.3. Conectare Ard Uno cu servo . . . . . . . . . . . . . . . . . . . . . . . . . 12
3.1.4. Conectare Ard Nano cu HC05 . . . . . . . . . . . . . . . . . . . . . . . . 13
3.2. Con gurare . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
3.2.1. Con gurare ROS Raspbian pe Raspberry . . . . . . . . . . . . . . . . . . 14
3.2.2. Con gurare ROS Arduino . . . . . . . . . . . . . . . . . . . . . . . . . . 15
3.2.3. Creare Proiect Android . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
3.3. Cod ROS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
3.4. Cod Arduino . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18

3.4.1. Arduino Nano . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
3.4.2. Arduino Uno . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
3.5. Cod Android . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
4. aplicatii : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : 22
Anexa A. Rezolvare "Cinci P^ aini" : : : : : : : : : : : : : : : : : : : : : : : : : : : : 23
Anexa B. Alte poves ,ti s ,i basme : : : : : : : : : : : : : : : : : : : : : : : : : : : : : 24
ii

Lista gurilor
2.1. Raspberry . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
2.2. Arduino Uno . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
2.3. Arduino Nano . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
2.4. HC-05 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
2.5. Comunicare Noduri . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
2.6. Arduino Uno . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
3.1. Conectare Raspberry Ard Uno . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
3.2. Conectare Raspberry Ard Nano . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
3.3. Conectare Ard Uno cu servo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
3.4. Conectare Ard Nano cu HC05 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
3.5. Biblioteci ROS in Arduino . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
iii

Lista tabelelor
B.1. Alte basme. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
iv

Lista acronimelor
DOF = Degrees of freedom
ROS = Robot Operating System
v

1
Capitolul 1
Introducere
Odata cu evolutia tehnologiei task-urile oamenilor sunt din ce in ce mai usoare datorita ajuto-
rului primit din partea automatizarilor.
Nu doar marile companii au astazi acces la tehnologie, informatia este mai acesibila ca nicio-
data, oricine putand sa creeze automatizari, atat la munca cat si acasa.
In domeniul roboticii braturile robotice sunt din ce in ce mai populare, putem gasi nenumarate
modele pentru hobisti pe intternet, totodata la un nivel mai intalt cercetarile in acest domeniu
ne dezvaluie noi si noi aplicatii, de la brate robotice folosite in fabricii, care ajuta la crearea
tehnologiei pana la brate folosite in medicina care sunt controlate prin impulsuri neuronale
direct de catre om, putand sa inlocuiasca un brat uman amputat.
Lucrarea de fat , a implementeaz a controlul unui brat robotic cu 3 grade de libertate (DOF)
Controlul este realizat wireless cu ajutorul tehnologiei Bluetooth, dispozitivul de pe care se
dau comenzile ind un smartphone cu sistem de operare Android
Capitolul 1 se ocupa de elementele teoretice ale proiectului in care sunt prezentate elementele
hardware, atat speci catii folosite ale acestora, cat si unele speci catii de interes general ale
acestor elemente.
Tot acest capitol ne introduc in programarea robotilor folosind Robot Operating System(ROS).
A
am ce este ROS, detalii despre versiunea folosita si ne sunt prezentate concepte de baza ce
sunt folosite aici.
De asemenea ne sunt prezentate notiuni elementare despre Android si Arduino Elemente despre
limbajele folosite
Capitolul 2 prezinta asamblarea partilor bratului robotic.
Sunt prezentate partile 3D printate, conectarea partilor electronice si introducerea aceastora in
structura printata 3D.
Capitolul 3 explica cum se creaza mediile de dezvoltare ce vor programare ulterior. Ne este
prezentat cum sa creez un card de memorie cu sistemul Raspbian pentru placuta Raspberry,
cum sa generam bibliotecile ROS pentru arduino si cum sa le folosim
OPTIONAL PROIECT ANDROID
1.1 Alte recomand ari
Se recomand a folosirea pachetului aspell (pachetul aspell-ro ^ n Debian/Ubuntu) pentru
veri carea ortogra ei, cu comanda:
aspell –lang=en -t check ./exemplu_teza.tex
Se recomand a veri carea fonturilor ^ n PDF-ul produs – este preferabil s a nu se foloseasc a
dec^ at \Type 1" sau \Truetype", nu \Type 3".

2
Capitolul 2
Notiuni Teoretice
2.1 Hardware Folosit
2.1.1 Raspberry PI
Figura 2.1: Raspberry
Raspberry PI 3 este o placut , a de dezvoltare pe care se poate instala sistemul de operare
Raspbian, ind optimizata pentru interconetabilitate cu senzori si pentru controlul diferitelor
device-uri de mic a putere. Popularitatea acestei pl acut ,e se datoreaz a at^ at pret ,ului foarte mic
relativ la alternativele de pe piat , a(180 de lei pentru modelul Raspberry PI 3), dar si a functiilor
sale, de natura sa creeze un mediu optim pentru proiectele mici de electronica
CPU: 4 ARM Cortex-A53, 1.2GHz
GPU: Broadcom VideoCore IV
RAM: 1GB LPDDR2 (900 MHz)
Networking:
10/100 Ethernet
2.4GHz 802.11n wireless
Bluetooth: Bluetooth 4.1 Classic, Mod Low Energy
Stocare: microSD
Porturi:
HDMI
3.5mm analogue audio-video jack
4USB 2.0, Ethernet
Camera Serial Interface (CSI)
Display Serial Interface (DSI)
Raspberry are 40 de pini generali de intrare-iesire(GPIO = General PIN INPUT OUTPUT)
Pini necon gurabili(pentru alimentare)
2 pini de 5V
2 pini 3V3

3
8 pini GND
Pini con gurabili:
Folositi ca ouput pot avea una din 2 valori: high (3V3) sau low (0V).
Folositi ca input citi: (3V3) or low (0V)
Functii speciale pini con gurabili:
PWM (pulse-width modulation)
PWM Software – disponibil pentru toti pini
PWM Hardware – disponibil la pinii: GPIO12, GPIO13, GPIO18, GPIO19
SPI
SPI0: MOSI (GPIO10); MISO (GPIO9); SCLK (GPIO11); CE0 (GPIO8), CE1 (GPIO7)
SPI1: MOSI (GPIO20); MISO (GPIO19); SCLK (GPIO21); CE0 (GPIO18); CE1 (GPIO17);
CE2 (GPIO16)
I2C
Date: (GPIO2); Semnal de Clock (GPIO3)
Date EEPROM: (GPIO0); EEPROM Semnal Clock (GPIO1)
Serial
TX (GPIO14); RX (GPIO15)
Porturi USB
Raspberry dispune de 4 intrari USB la care putem conecta periferice precum mouse si tas-
tatura, totodata USB-urile pot folosite pentru a realiza comunicare seriala cu Arduino
Alimentare
Alimentarea placutei poate facuta incepand de la 700mA, dar in cazul nostru pentru a
siguri ca placutele Arduino alimentate prin USB de la Raspberry functioneaza corect s-a decis
folositea unui alimentator cu un curent de 2.5 A
2.1.2 Arduino Uno
Figura 2.2: Arduino Uno

4
Arduino Uno este o placut , a bazat a pe microcontrollerul ATmega328P. Este foarte folosit
datorita pretului mic Avand 14 pini digitali input/output din care 4 pot folositi ca output
PWM. 6 pini de input analog Frecventa de lucru: 16 MHz Alimentare: prin jack direct de la
un alimentator prin USB tip B de la un calcultor
Microcontroler: ATmega328 Tensiune de lucru: 5V Tensiune de intrare (recomandat): 7-
12V Tensiune de intrare (limita): 6-20V Pini digitali: 14 (6 PWM output) Pini analogici: 6
Curent per pin I/O: 40 mA Curent 3.3V: 50 mA Memorie Flash: 32 KB (ATmega328) 0.5 KB
pentru bootloader SRAM: 2 KB (ATmega328) EEPROM: 1 KB (ATmega328) Clock Speed:
16 MHz
2.1.3 Arduino Nano
Figura 2.3: Arduino Nano
Este folosit pentru a primi informatii de la modulul Bluetooth HC05 si a le trimite la
Raspberry ASemanator cu Arduino Uno este conectat atat pentru date cat si pentru alimentare
la Raspberry PI 3.
2.1.4 Modul Bluetooth HC-05
Figura 2.4: HC-05
Modulul HC-05 este un modul Bluetooth care poate folosit atat ca master cat si ca slave.
El foloseste protocolul de comuncare serial, putand usor folosit cu majoritatea device-urilor.
Alimentare: 5V

5
2.1.5 Servo Motoare
Modelul de servo motot folosit este : Aceste servomotor este un actuator rotativ, acesta
putandu-se roti de la 0 la 180 grade. Precizia acestui servo motor este destul de mare,
mentinandu-si pozitia pe care o comandam cu ajutorul placutei arduino, cu o stabilitate destul
de mare. Servo motorul este alimntat prin 2 re la tensiunea de 5V, existand un al 3 r ce este
folosit la comunicare.
2.2 Software Folosit
2.2.1 Sistemul de operarare Raspbian
Raspbian este un sistem de operare bazat pe Debian, ind special creat pentru placut ,a Ras-
pberry PI. Desi pl acut ,a poate folosit a si cu alte sisteme de operare, Raspbian este cel mai
folosit, datorita optimizarilor hardware speciale, dispunand de pachete software precompilate
special avand in vedere limitarile de memorie.
2.2.2 ROS
ROS(Robot Operating System) este un mediu de programare format din numeroase biblioteci
software si unelte aditionale creat special pentru a usura implementarea proiectelor din robo-
tica.
Pentru a ajuta la modularizare, totul este structurat sub forma de pachete, acestea putand
usor transferate de pe un sistem pe altul.
ROS poate folosit gratuit ind open source.
Exista mai multe distributii de ROS existente, cea recomandata si folosita in acest proiect
este ROS Kinetic, ind una din cele mai vechi distriburti, avand stabilitate si suport tehnic din
partea dezvoltatorilor.
2.2.2.1 Pachete in ROS
Dupa cum am mentionat anterior cand scriem cod in ROS il organizam in pachete. Un pachet
poate contine Noduri, biblioteci, seturi de date, siere de con gurare si orice alte siere ajuta-
toare pe care putem include in pachet.
Pachetele din ROS adauga functionalitate la cea existenta, putand sa se foloseasca unul de cela-
lalt, astfel putem separa logica in unitati cat mai mici pentru a obtine un grad de abstractizare
cat mai mare.Un packet nu este altceva decat un folder cu o anume structura creat de obicei
folosing comanda catkin create pkg, el ind localizat pe sistemul de operare la o anume cale
data de variabila de sistem ROS PACKAGE PATH.
Logica principala de functionare a ROS este preluarea unor date din realitatea zica cu ajutorul
unor senzori, trimiterea datelor spre prelucrare si actionarea pe baza acestora prin actuatori
asupra mediului.
Unul dintre aspectele importante este faptul ca ROS poate rula pe mai multe device-uri conec-
tate intre ele si face schimb de informatii la nivelul acestora intr-un mod foarte usor de separat
din punct de vedere hardware logica intregii aplicatii.

6
Acest lucru ajuta intrucat putem crea sisteme mai stabile si abile, defectarea unor parti har-
dware nu afecteaza functionarea intregului sistem.
2.2.2.2 Noduri in ROS
Figura 2.5: Comunicare Noduri
http://wiki.ros.org/Nodes
Punctele in care trimitem si in care primim informatii/date sunt numite Noduri, intr-un
sistem exista minim un nod numit Master, acesta comunica cu toate celelate noduri. Prin
analogie acestea pot comparate cu nodurile unei retele de telecomunicatii, indiferent daca
acestea sunt pe acelasi device sau nu. Aceste noduri efectueaza tranformari asupra datelor,
comunicand pe baza unor topic-uri. Intregul sistem de noduri poate astfel vazut ca un graf.
Nodurile au functii speci ce, ind independente functional unele de celelalte. De exemplu un
nod citeste distanta pana la un zid, in timp ce alt nod porneste motoarele de deplasare pana
la acel zid. Sistemul de noduri ne ofera pe langa avantajele modularizarii codului si un sistem
mai abil, crash-ul unui nod neimplicand neaparat proasta functionare a celorlalte. Nodurile
pot avea un nume putand identi cate usor in cadrul sistemului si un tip, care este dat de
numele pachetului de care apartine
2.2.2.3 Topic-uri in ROS
Topicurile sunt un fel de canale prin intermediul carora nodurile comunica prin Mesaje.
Nodurile trimit si primesc mesaje in mod anonim, ceea ce ajuta la decuplarea codului. Un nod
nu cunoaste nimic despre identitatea altui nod cu care comunica, singurul lucru de care este
interesat un nod ind sa primeasca si sa trimita tipul de mesaje corespunzator topicului prin
intermediul caruia comunica.
Un nod poate avea mai multi Publisheri si mai multi Subscriberi care comunica independent.
2.2.2.4 Mesaje in ROS
ROS comunica de la un nod la altul prin intermediul unor mesaje Message. Structura unui
mesaj in ros este data de un sier cu extensia .msg. Aceste siere sunt siere text care descriu
campuri de date din structura unui mesaj in ROS, pe baza lor generandu-se cod sursa atunci
cand compilam pachetele facute de noi in ROS. Mai mult, codul poate generat in mai multe
limbaje de programare, in functie de cum este construit pachetul (C++ sau Python)

7
2.2.2.5 Publisher in ROS
Un Publisher in ROS este folosit pentru a trimite mesaje pe un anumit topic. Acesta este creat
prin comanda NodeHandle::advertise().
Odata ce toate instantele clasei Publisher sunt distruse, functia callback a tuturor Instantelor
Subscriber nu mai este apelata. Totodata procesul prin care un topic este expus prin interfata
sa, numit advertise, pentru a se putea trimite mesaje este stopat.
Toate acestea sunt facute pentru managementul resurselor, acestea ind folosite doar atunci
cand este nevoie.
Cand un Publisher publica un mesaj folosind functia .publish(msg) a clasei Publisher toti Sub-
scriberi sunt informatii prin apelarea unei functii de callback Un Publisher stie intodeauna ce
tip de mesaj accepta un topic, in cazul in care incercam sa trimitem un alt tip de mesaj decat
cel al topic-ului respectiv vom primi un mesaj de eroare.
Cu ajutorul Publisher-ului putem stabili, in functie de logica aplicatiei, cat de des transmitem
mesaje si care este marimea maxima a unui mesaj transmis. Cea din urma ajuntand la imbu-
natatirea performantelor sistemului.
2.2.2.6 Subscriber in ROS
Figura 2.6: Arduino Uno
Un Subscriber va prelua toate mesajele trasmise pe un topic la care este cuplat. Viteza la
care sunt preluate mesajele de pe topic este viteza la care Publisherul trimite mesajele.
2.2.2.7 ROS SERIAL
ROS Serial este un protocol de comunicatii care trimite date intre device-uri prin intermediul
comuncarii seriale. Se foloseste acelasi sistem de trimitere a datelor sub forma de mesaje prin
intermediul topic-urilor, doar ca toate device-urile trebuie sa aiba acces la bibliotecile ROS
si sa aiba aceleasi pachete, ce genereaza topic-urile si mesajele ce urmeaza sa e folosite in
comunicatie. rosserial.

8
2.2.3 Android
Android este un sistem de operare dezvoltat de Google, cu un mediu de dezvoltare accesibil, ce
permite crearea de aplicatii native utilizand Limbajul Java.
Dezvoltarea pe aceasta platforma este foarte usoara datorita bibliotecilor deja existente si al
comunitati create in jurul acesteia.
Bluetooth overview
The Android platform includes support for the Bluetooth network stack, which allows a device
to wirelessly exchange data with other Bluetooth devices. The application framework provides
access to the Bluetooth functionality through the Android Bluetooth APIs. These APIs let
applications wirelessly connect to other Bluetooth devices, enabling point-to-point and multi-
point wireless features. Using the Bluetooth APIs, an Android application can perform the
following: Scan for other Bluetooth devices
Query the local Bluetooth adapter for paired Bluetooth devices
Establish RFCOMM channels
Connect to other devices through service discovery
Transfer data to and from other devices
Manage multiple connections
This page focuses on Classic Bluetooth. Classic Bluetooth is the right choice for more battery-
intensive operations, which include streaming and communicating between Android devices.
For Bluetooth devices with low power requirements, Android 4.3 (API level 18) introduces API
support for Bluetooth Low Energy. To learn more, see Bluetooth Low Energy.
This document describes di erent Bluetooth pro les, including the Health Device Pro le. It
then explains how to use the Android Bluetooth APIs to accomplish the four major tasks ne-
cessary to communicate using Bluetooth: setting up Bluetooth, nding devices that are either
paired or available in the local area, connecting devices, and transferring data between devices.
Bluetooth basics
Pentru a transmite date intre 2 dispozitive echipate cu bluetooth aceastea trebuie sa stie unul
de celalalt prin intermediul procesului de imperechere(paring).
Paring-ul presupune urmatoarele etapte: un device devine discoverable, adica este disponibil
pentru conexiuni de intrare celalalt device incepe un proces de cautare al dispozitivelor
dupa ce gaseste dispozitivul cele doua incep procesul de paring ce presupune un schimb de
coduri secrete, ecare stocheaza codul celuilalt in memoria cache pentru a-l utiliza in viitor
In viitor cele 2 dispozitive se pot conecta automat unul la celalalt, fara a mai nevoie sa
faca paring.
Permisiuni bluetooth
Pentru a folosi functionalitate bluetooth a sistemului android trebuie sa declaram 2 permisiuni.
Prima este BLUETOOTH, necesara orice comunicare bluetooth, e ca e vorba de a porni o
comuncatie bluetooth, a accepta o comunicatie sau pentru a trimite date catre un alt dispozitiv
bluetooth.
Cealalta permisiune se numeste BLUETOOTH ADMIN si este folosita pentru a gasi dispoziti-
vele din jur.
Declararea permisiunilor se face conform codului urmator, in sierul manifest:
<manifest … > <uses-permission android:name="android.permission.BLUETOOTH" /> <uses-
permission android:name="android.permission.BLUETOOTH ADMIN" /> … </manifest>

9
2.2.4 Arduino
Structure An Arduino program run in two parts: void setup() void loop() setup() is preparation,
and loop() is execution. In the setup section, always at the top of your program, you would set
pinModes, initialize serial communication, etc. The loop section is the code to be executed {
reading inputs, triggering outputs, etc.
Un program Arduino este scris in limbajul C++, ind alcatuit din importuri de biblioteci,
declaratii de variabile globale si 2 functii: setup() si loop()
Functia void setup() este intodeuna inaintea functiei loop, continand declaratii despre cum
urmeaza sa e folositi pinii placutei, initializari de comunicatie seriala si orice alt cod ce trebuie
rulat atunci cand este alimentata placuta
Functia void loop() – este o functie ce este rulata, in continuu, codul nd rulat, dupa
cum spune si numele functiei intr-o bucla(la nalul executarii codului din functie, aceasta este
rulata din nou). Codul rulat poate contine citirea valorii pinilor(input) sau modi carea valorilor
pinilor(output).
Viteza de rulare a codului din aceasta functie depinde de complexitatea operatiilor facute,
si de pauzele puse prin intermediul functiei delay(durata); unde durata reprezinta o valoare in
milisecunde.
ROS detine cand este rulat in totalitate o multime de functionalitati, iar pentru a usura
munca unele dintre aceste sunt emulate si pentru sistemul de dezvoltare Arduino. Astfel In-
cluzand bibliotecile ROS create special pentru Arduino putem bene cia de un Nod chiar pe
placuta noastra Arduino. Acest Nod se comporta exact ca unul rulat pe Raspbian sau alt
sistem de operare. Putem folosi acest nod pentru a crea un Subscriber sau un Publisher si sa
trimitem si sa primim mesaje. De asemenea putem cere data si ora sistemului ROS, ce ruleaza
pe un PC, pentru a sincroniza evenimentele mult mai bine. Pentru a face ROS sa functioneze
pe Arduino trebuie sa creem o biblioteca speciala pentru acesta numit ros lib, aceasta este
creata de pe sistemul de operare pe care rulam ROS de ecare data cand modi cam pache-
tele ce comunica cu Arduino, intrucat ros lib contine informatii precum structura unui mesaj
ROS(Message), esential pentru buna comunicare seriala. Biblioteca generata trebuie pusa in
folderul sketchbook de pe sistemul de operare de pe care programam placut ,a Arduino. Pen-
tru a include biblioteca respictiva folosim: include <ros.h> Iar urmatorea linie de cod importa
functionalitea pentru trimiterea de mesaje de tip String din pachetul ROS std msgs include
<stdmsgs/String.h>
2.3 LIMBAJE FOLOSITE:(de ce)
Pentru programarea pe Android s-a ales limbajul JAVA ind recomandat pentru dezvoltarea
acestor aplicatii. Pentru Arduino am folosit C++ Pentru programarea ROS este indicata
folosirea limbajului Python, dar am ales sa folosim tot C++ pentru similaritatile codului folosit
in Arduino

10
Capitolul 3
Implementare
ssssss ROS(RASP) CREATE PACHET ROS(cu tot cu con guratii) cd /catkin ws/src ca-
tkin create pkg beginner tutorials std msgs roscpp cd /catkin ws catkin make
CREATE SUBSCRIBER(la Arduino NANO) CREARE PUBLISHER(la Arduino UNO)
ROS(ARDUINO) ARDUINO NANO(PUBLISHER) ARDUINO UNO(SUBSCRIBER)
3.1 Conectare elemente Harware
3.1.1 Conectare Raspberry Ard Uno
Se conecteaza Arduino Uno cu Raspberry Pi pentru alimentare si comunicare de date
Figura 3.1: Conectare Raspberry Ard Uno

11
3.1.2 Conectare Raspberry Ard Nano
In acealasi mod conectam Arduino Nano cu Raspberry Pi
Figura 3.2: Conectare Raspberry Ard Nano

12
3.1.3 Conectare Ard Uno cu servo
Dupa ce la Raspberry conectam Arduino Uno conectam la acesta din urma servo motoarele,
vom folosi pinul GND si pini digitali 9, 10, 11 si 12 pentru cele 4 servo motoare, alimentarea
acestora ind facute de la o sursa separata
Figura 3.3: Conectare Ard Uno cu servo

13
3.1.4 Conectare Ard Nano cu HC05
Se conecteaza
pinul VCC la 5v
GND la GND
TXD la RX0
RXD la TX1
Figura 3.4: Conectare Ard Nano cu HC05

14
3.2 Con gurare
3.2.1 Con gurare ROS Raspbian pe Raspberry
Se adauga lista cu coduri sursa pentru instalarea softurilor:
1sudo sh -c 'echo " deb http :// packages .ros. org/ ros / ubuntu $( lsb_release -sc) main " > / etc / apt /
sources . list .d/ros – latest .list '
Se instateaza dirmngr, folositor pentru downloadarea unor certi cate:
1sudo apt – get install dirmngr
1sudo apt – key adv – keyserver hkp :// ha. pool .sks – keyservers .net :80 –recv – key 421
C365BD9FF1F717815A3895523BAEEB01FA116
1sudo apt – get update
2sudo apt – get upgrade
3sudo apt – get install -y python – rosdep python – rosinstall – generator python – wstool python –
rosinstall build – essential cmake
4sudo rosdep init
5rosdep update
6sudo leafpad /etc/dphys – swapfile
7etc / init .d/dphys – swapfile restart
8mkdir -p ~/ ros_catkin_ws
9cd ~/ ros_catkin_ws
10rosinstall_generator ros_comm – rosdistro kinetic –deps –wet – only –tar > kinetic – ros_comm –
wet . rosinstall
11wstool init src kinetic – ros_comm – wet . rosinstall
12rosinstall_generator desktop – rosdistro kinetic –deps –wet – only –tar > kinetic – desktop -wet
. rosinstall
13wstool init src kinetic – desktop -wet. rosinstall
14wstool update -j4 -t src
15cd ~/ ros_catkin_ws
16rosdep install -y –from – paths src –ignore – src – rosdistro kinetic -r –os= debian : jessie
17sudo ./ src / catkin / bin / catkin_make_isolated – install – DCMAKE_BUILD_TYPE = Release –install –
space / opt / ros / kinetic
18echo " source /opt/ ros/ kinetic / setup . bash " >> ~/. bashrc
19cd ~/ ros_catkin_ws
20git clone https :// github . com / ros / common_msgs . git
21mv common_msgs /* src /
22sudo ./ src / catkin / bin / catkin_make
23
24
25cd ~/ ros_catkin_ws
26git clone https :// github . com /ros – drivers / rosserial . git
27sudo ./ src / catkin / bin / catkin_make

15
3.2.2 Con gurare ROS Arduino
Pentru a genera librariile necesare pentru Arduino folosim codul
1rosrun rosserial_arduino make_libraries .py / home / mihai / sketchbook / libraries
Acest cod v-a genera biblioteca necesara si o va plasa in folderul:
`/home/mihai/sketchbook/libraries`
Astfel cand pornim Arduino IDE biblioteca este disponibila fara nicio alta operatie, in gura
urmatoare putem vedea exemplele de cod ce se incarca autormat in IDE
Figura 3.5: Biblioteci ROS in Arduino

16
3.2.3 Creare Proiect Android
Se creaza un nou proiect de Android. Deschidem sierul AndroidManifest.xml si adugam
urmatorul cod
1<? xml version ="1.0" encoding =" utf -8"? >
2<manifest xmlns : android =" http :// schemas . android . com /apk/ res/ android "
3 package =" com . mihailacusteanu . robocontroller ">
4
5 <uses – permission android : name =" android . permission . BLUETOOTH " />
6 <uses – permission android : name =" android . permission . BLUETOOTH_ADMIN " />
7
8
9 < application
10 android : allowBackup =" true "
11 android : icon =" @mipmap / ic_launcher "
12 android : label =" @string / app_name "
13 android : roundIcon =" @mipmap / ic_launcher_round "
14 android : supportsRtl =" true "
15 android : theme =" @style / AppTheme ">
16 <activity android : name =". MainActivity ">
17 <intent – filter >
18 <action android : name =" android . intent . action . MAIN " />
19
20 <category android : name =" android . intent . category . LAUNCHER " />
21 </ intent -filter >
22 </ activity >
23 </ application >
24
25</ manifest >
Se observa pe liniile 5 si 6 codul pentru permisiuniile legate de Bluetooth

17
3.3 Cod ROS
Mai intai trebuie creat un pachet ROS nou:
1cd ~/ ros_catkin_ws /src
2catkin_create_pkg robot_controller std_msgs roscpp
Numele pachetului este robot controller, iar std msgs si roscpp sunt numele altor pachete
care vor dependinte pentru pachetul nostru.
Apoi creem un director nou numit msg conform conventiilor ROS, iar in acesta creem un
sier nou numit servo.msg:
1mkdir msg
2touch msg / servo . msg
Acesta va contine urmatoarele linii de cod:
1int64 servo
2int64 grade
Acest sier v-a genera un sier sursa pentru un mesaj ROS – Message, ce va avea 2 campuri
de tip intreg.
Acum vom crea 2 noduri ce vor rula pe Raspbian:
1touch src / nod_ard_nano .cpp
2touch src / nod_ard_uno . cpp
Aceste 2 noduri vor avea acelasi nume ca si numele sierelor cpp in care sunt implementate,
avand o structura asemanatore, continand ecare un Subscriber si un Publisher.
Subscriber-ul va asculta mesajele trimise pe un anumit Topic, iar atunci cand un mesaj
este receptionat se va folosi de Publisher pentru a trimite mai departe informatia, dupa ce o va
prelucra.
Astfel nodul nod ardnano va prelua informatii de la Arduino Nano, Subscriber-ul sau ind
cuplat la Topic-ul numit bluetooth, iar atunci cand v-a primi mesaje, Publisher-ul va publica
un mesaj pe Topic-ul calcule servo, acesta ind folosit pentru comunicarea intre cele 2 noduri
de pe Raspberry. Nodul nod arduno va prelua mesajele de pe Topic-ul calcule servo si v-a
publica un mesaj pe control servo ce este Topic-ul prin care Raspberry comunica cu Arduino
Nano

18
3.4 Cod Arduino
3.4.1 Arduino Nano
Importurile necesare
1# include < SoftwareSerial .h>
2# include <ros .h>
3# include " robot_controller / servo .h"
Primul import este necesar pentru comunicarea seriala cu modulul Bluetooth.
Al doilea import este pentru principalele functionalitati ale ROS pentru Arduino.
Al treilea import este legat de mesajul(Message) ROS din pachetul robot controller creat pentru
scrierea codului.
Declararea unor variabile globale
1SoftwareSerial BTserial (10 , 11) ;
2ros :: NodeHandle nh;
Creem o noua instanta a clasei SoftwareSerial, iar ca parametrii pentru constructor trimitem
valorile 10 si 11, acestea ind valorile pinilor prin care comunicam cu modulul bluetooth, adica
RX si TX. De asemenea initializam si o variabilia de tipul NodeHandle care reprezinta chiar
nodul de la nivelul Arduino prin intermediul caruia vom comunca cu exteriorul
Functia setup():
1void setup ()
2{
3 nh. initNode ();
4 nh. advertise ( publisher_arduino );
5
6 BTserial . begin (9600) ;
7 BTserial . setTimeout (50) ;
8}
Pe prima linie initializam nodul creat la nivel global, dupa care pe a doua linie anuntam
prin functia advertise() ca avem un Publisher ce va publica mesaje pe topicul "servo".
Urmeaza 2 linii legate de comunicarea seriala cu modului bluetooth HC-05, prima seteaza
baudrate-ul la care se va comunica (9600), iar a doua seteaza un timeout, timeout-ul default
ind 1000, insemnand 1 secunda ce face ca trimiterea datelor prin bluetooth sa aiba loc la
interval de 1 secunda.
In functia loop() ce v-a i rulata la nesfarsit atata timp cat placuta Arduino va alimentata
avem urmatorul cod:
1void loop (){
2 if( BTserial . available ()){
3 dateSeriale = BTserial . readString ();
4 for (int i = 0; i < dateSeriale . length (); i ++) {
5 if ( dateSeriale . substring (i, i +1) == ",") {
6 mesaj . number = dateSeriale . substring (0, i). toInt ();
7 mesaj . degree = dateSeriale . substring (i +1) . toInt ();
8 break ;
9 }
10 }
11 publisher_arduino . publish (& mesaj );
12 }
13 nh. spinOnce ();
14 delay (1) ;
15 }
Veri cam de ecare data daca este disponibila comunicarea seriala apeland BTserial.available(),
iar apoi citim string-ul trimis de catre telefon prin apelarea BTserial.readString(), preluam
datele si le punem in obiectul mesaj pe care il trimitem prin intermediul Publisher-ului: pu-
blisher arduino.publish(&mesaj);

19
3.4.2 Arduino Uno
Importurile sunt la fel ca la Arduino Nano, la fel si initializarea nodului.
La acestea adaugam importul bibliotecii servo:
1# include <Servo .h>
Uemeaza initializarea a 4 obiecte corespunzatoare celor 4 servo motoare, 4 pini pentru controlul
acestora, si 8 constante pentru pozitia maxima si minima a ecarui servo motor, exemplu pentru
servo 1
1unsigned int servoPin1 = 9;
2const unsigned int POZITIE_MAXIMA1 = 60;
3const unsigned int POZITIE_MINIMA1 = 0;
Creem un Subscriber:
1ros :: Subscriber < robot_controller :: servo > sub (" servo ", & functieCallback );
Acesta v-a i conectat la Topic-ul numit servo, iar ori de cate ori acest Topic v-a primi un
mesaj, functia numita functieCallback v-a i apelata. In aceasta functie pentru ecare mesaj
primit veri cam daca datele sunt in intervalul dorit(pozitia minima si maxima), iar daca este
in interval servo motorul va dus in pozitia primita. Exemplu pentru servo 1:
1 if( mesaj . grade >= POZITIE_MINIMA1 && mesaj . grade <= POZITIE_MAXIMA1 )
2 servo1 . write ( mesaj . grade );
De aceasta data functia loop contine doar 2 instructiuni pentru functionarea corecta a
bibliotecilor ROS
1void loop (){
2 nh. spinOnce ();
3 delay (1) ;
4 }

20
3.5 Cod Android
Fisierul MainActivity.java contine functia trimiteDate()
1 String mesaj = numarServo + "," + grade ;
2 byte [] msgBuffer = mesaj . getBytes ();
3 try {
4 int marimeBuffer = 1024;
5 byte [] buffer = new byte [ marimeBuffer ];
6 streamIesire . write ( msgBuffer ,0, msgBuffer . length );
7 streamIesire . flush ();
8 } catch ( IOException e) {
9 errorExit (" Fatal Error ", " Eroare la scriere : " + e. getMessage () ;);
10 }
11 }
12}
Aceasta functie compune un mesaj de tip String, preia biti corespunzatori string-ului si ii tri-
mite folosing stream-ul de iersire.
De asemenea tot in sierul MainActivity.java putem vedea functia apelata ori de cate ori
un slider isi schimba valorea:
1 SeekBar . OnSeekBarChangeListener seekBarChangeListener = new SeekBar .
OnSeekBarChangeListener () {
2 @Override
3 public void onProgressChanged ( SeekBar seekBar , int progress , boolean fromUser ) {
4 int servoNum = 1;
5 switch ( seekBar . getId ()) {
6 case R.id. seekBarServo1 :
7 servoNum = 1;
8 break ;
9 case R.id. seekBarServo2 :
10 servoNum = 2;
11 break ;
12 case R.id. seekBarServo3 :
13 servoNum = 3;
14 break ;
15 case R.id. seekBarServo4 :
16 servoNum = 4;
17 break ;
18 }
19 trimiteDate ( servoNum , progress );
20 }
21 };
22 @Override
In aceasta functie se veri ca ce id are slider-ul care a initiat apelul functiei, ecare slider e
corespunzator unui servo motor, astfel trimitem un numar corespuzator slider-ului respectiv
impreuna cu valoarea acestuia catre functia trimiteDate().
Fisierul activity main.xml este un sier de layout, iar in liniile de cod care urmeaza putem
vedea cum se implementeaza un slider, numit in Android SeekBar:
1 < LinearLayout xmlns:android =" http: // schemas . android . com/ apk / res / android "
2 android:layout_width =" fill_parent "
3 android:layout_height =" wrap_content "
4 android:orientation =" horizontal "
5 android:gravity =" center " style =" android:style / ButtonBar " >
6 <TextView
7 android:layout_width =" wrap_content "
8 android:layout_height =" wrap_content "
9 android:text =" Servo 1"/>
10 <SeekBar
11 android:id ="@+id/ seekBarServo1 "
12 android:max =" 100 "
13 android:progress ="5"
14 android:layout_width =" match_parent "

21
15 android:layout_height =" wrap_content "/>
16 </ LinearLayout >
Putem observa proprietatile android:max ce indica care e valoarea maxima care va rezulta
din modi carea slider-ului.
Proprietatea android:progress ne da pasul sliderului

22
Capitolul 4
aplicatii

23
Anexa A
Rezolvare "Cinci P^ aini"
A aduce 3 p^ aini, iar B aduce 2 p^ aini. C pl ates ,te 5 lei. Se ^ mparte ecare p^ aine ^ n 3 p art ,i egale:
33 + 23 = 15 buc at ,i. Fiecare mesean cap at a c^ ate 5 buc at ,i. Reiese c a A i-a dat lui C
335 = 4 p^ aini, iar B i-a dat 2 35 = 1 p^ aine. ^Imp art ,eal a cinstit a este deci 4 lei pentru
A, s ,i 1 leu pentru B.

24
Anexa B
Alte poves ,ti s ,i basme
Vezi tabela B cu alte poves ,ti s ,i autorii/culeg atorii lor.
1function [ out ] = Cod ( varinput )
2% acesta este un comentariu
3% param intrare varinput
4% param iesire out
5
6rez = 0;
7n =10;
8for i=1:n
9 for j=i +1:n -1
10 if abs ( -2) <abs ( -3)
11 rez = rez +1;
12 end
13 end
14end
15end
D anil a prepeleac Pr^ aslea cel voi-
nic s ,i merele de
aurF at-Frumos din
lacrim aGreuceanu
Ion Creang a Petre Ispirescu Mihai Eminescu Petre Ispirescu
Tabela B.1: Alte basme.

Similar Posts