Sunteți pe pagina 1din 27

Ministerul Educatiei, Culturii si Cercetarii al

Republicii Moldova
Universitatea Tehnica a Moldovei
Facultatea Calculatoare, Informatica si
Microelectronica
Departamentul Calculatoare si Retele

Raport la Stagiul de
Practica

A efectuat: st.gr. C-171, Stroia Mihai-Dragos


A verificat: lect. univ., Turcanu Ana

Chisinau – 2019

1
Cuprins
1. Decurgerea termenului de practica ........................................................... 3
1.1. Caracteristicile companie .................................................................... 3
1.2. Produse ale companiei ......................................................................... 3
1.3. Sistema lidar ......................................................................................... 4
2. Sarcina la locul de practica ........................................................................ 6
2.1. Obiective ............................................................................................... 6
2.2. Componente .......................................................................................... 6
2.3. Elaborarea soft-ului p-u compomente ................................................ 7
2.4. Soft suplimentar .................................................................................... 16
2.5. Detalii de suport .................................................................................... 19
3. Soft-ul si hard-ul de baza ............................................................................. 20
4. Concluzii ........................................................................................................ 26
5. Bibliografie .................................................................................................... 27

2
1 Decurgerea termenului de practica
1.1 Caracteristicile companie
Arobs Transilvania Software este o companie de IT din România,
înființată în anul 1998. Compania are ca obiect de activitate dezvoltarea
de software pentru aplicații mobile și distribuitori de echipamente GPS, distribuția
de dispozitive cu sisteme GPS și externalizare IT. Acționarul principal al firmei
este directorul general Voicu Oprean, cu 90% din titluri. Din 2006 grupul
finlandez Hotelzon este coacționar minoritar al companiei, prin achiziționarea unui
pachet de 10% din acțiuni. Compania are sediul central în Cluj-Napoca și birouri
regionale operaționale în București, Iași și Timișoara. Compania are peste 13 ani
experiență în dezvoltarea de soluții software pentru piața externă folosind
tehnologii diverse: Mobile (S60, QT, iPhone, Android, Blackberry, Windows
Phone 7), Java, Microsoft, PHP, Embedded.
În anul 2011 AROBS și-a extins activitatea și pe piețele internaționale, deschizând
filiale la Budapesta și Chișinău.
1.2 Produse
Produse pentru piața internă:
În anul 2008, AROBS a lansat în calitate de distribuitor național de sisteme de
navigațtie prin GPS propriul brand de sisteme de navigație, Smailo;
TrackGPS - soluție de localizare și monitorizare a parcurilor auto prin GPS;
Optimall SFA - soluție de automatizare a forței de vânzări;
Optimall WMS - soluție pentru managementul depozitelor.

3
1.3 Sisteme LIDAR
Laserul este un dispozitiv optic care generează un fascicul coerent de
lumină. Denumirea de laser este o abreviere în limba engleză pentru „light
amplification by stimulated emission of radiation” (amplificare a luminii prin
emisia stimulată a radiaţiei). Lidarul, numit şi radar laser, este un sistem similar ca
funcţionare cu radarul, care utilizează pentru emisie radiaţia laser, cu lungimi de
undă în spectrul optic (inclusiv ultraviolet şi infraroşu). Un astfel de sistem poate fi
întâlnit sub una din următoarele denumiri:
LIDAR (LIght Detection And Ranging), termen utilizat în
majoritatea aplicaţiilor;
LADAR (LAser Detecting And Ranging)), termen folosit cu
precădere în domeniul militar.
Similar cu un sistem radar, lidarul emite impulsuri scurte de lumină laser în
atmosferă. În momentul când impulsurile întâlnesc un obstacol, ele sunt reflectate
în toate direcţiile (împrăştiate). O parte din energie este reflectată înapoi spre
sistemul lidar. Această energie este recepţionată printr-un telescop, şi apoi
detectată cu ajutorul unor fotodiode sau tuburi multiplicatoare. Informaţia de
distanţă se obţine din timpul de întârziere între emisia impulsului şi recepţia
reflexiei acestuia. O imagine tridimensională a spaţiului cercetat poate fi obţinută
prin baleierea fasciculului laser în azimut şi elevaţie. Utilizând lungimi de undă
mult mai mici decât radarele milimetrice, LIDARUL are o rezoluţie mult mai
bună, de ordinul metrilor. Toruşi, semnalul lidar este puternic atenuat de
componentele atmosferei, precum precipitaţiile.
Lidarul are foarte multe aplicaţii, atât în domeniul civil, cât şi în cel militar.
Datorită rezoluţiei ridicate, lidarul permite recunoaşterea formei ţintelor, asigurând
identificarea acestora (ex. relizarea conturului unui tanc sau identificarea
denivelărilor solului unde au fost îngropate mine). Rezoluţia ridicată permite de
asemenea cartografierea detaliată a suprafeţei Pământului, inclusiv a zonelor
urbane. Lidarul permite măsurarea vitezei prin exploatarea efectului Doppler (ex.
măsurarea vitezei autovehiculelor). Lidarul este intens utilizat în studierea
atmosferei şi determinarea diferitelor caracteristici ale acesteia (măsurarea
vizibilităţii, a înălţimii straturilor de nori, determinarea proprietăţilor aerosolilor,
măsurarea vitezei vântului etc.). De asemenea, lidarul este folosit într-o serie de
alte aplicaţii precum arheologia, geografia, geologia, geomorfologia, seismologia
etc.

4
5
2 Sarcina la locul de practica
2.1 Obiectivele
1) Elaborarea unui sistem hard & soft de tip LIDAR.
2) Utilizarea microcontrolerelor.
3) Intelegerea principiilor de lucru in ansamblu al partilor hard & soft.
2.2 Componente
Pentru elaborarea unui astfel de dispozitiv am avut la dispozitie urmatoarele
componente:
1. EvB 5.1v5 – Kit de elaborare pe baza microcontrolorului Atmega32 ce
contine piese electronice integrate pe o plata.
2. SG90 – Servo motor.
3. 28BYJ-48 – Stepper motor.
4. Sharp 2y0a21 – Senzor de distanta IR.

6
2.3 Elaborarea soft-ului p-u compomente
1) Servo motor.
Descriere: Sunt motoare electrice speciale, de curent continuu sau curent
alternativ cu viteză de rotaţie reglabilă într - o gamă largă în ambele sensuri
având ca scop deplasarea într-un timp prescris a unui sistemmecanic (sarcina)
de- a lungul unei traiectorii date, realizând totodată şi poziţionarea acestuia la
sfârşitul cursei cu o anumită precizie.
Servomotoarele electrice se folosesc în cele mai diverse aplicaţii cum ar fi
acţionarea roboţilor industriali universali , a maşinilor unelte cu comandă
numerică , a perifericelor de calculator , în acţionarea imprimantelor rapide , în
tehnica aerospaţială , instalaţii medicale etc.
Model: SG90

Principiu de lucru: PWM

Program 1:
#define F_CPU 16000000UL

#include <avr/io.h>
#include <util/delay.h>

void pin_setup(void)
{
DDRD = (0 << DDD7) | (0 << DDD6) | (1 << DDD5) | (0 << DDD4) | (0 << DDD3) | (0 << DDD2) | (0
<< DDD1) | (0 << DDD0);
PORTD = (0 << PORTD7) | (0 << PORTD6) | (0 << PORTD5) | (0 << PORTD4) | (0 << PORTD3) | (0
<< PORTD2) | (0 << PORTD1) | (0 << PORTD0);
}

7
/*
* Timer1
* Prescaler - 64
* Mode - FastPWM
* TOP = ICR1 = 4999
*
*/
void timer_setup(void)
{
TCCR1A = (1 << COM1A1) | (0 << COM1A0) | (1 << WGM11);
TCCR1B = (1 << WGM13) | (1 << WGM12) | (1 << CS11) | (1 << CS10);
ICR1 = 4999;
}

int main(void)
{
pin_setup();
timer_setup();
OCR1A = 150; /* 0 */
while (1)
{
/* Test angles */
if (OCR1A == 611) OCR1A = 150;
_delay_ms(1000);
OCR1A += 1;
}
}

Program 2 (Setarea unghiului manual):

#define F_CPU 16000000UL

#include <avr/io.h>
#include <util/delay.h>

#define CR 0b00001101

const int servo_array[180] = { 150, 152, 154, 156, 159, 161, 163, 166, 167, 170, 172, 174, 177,
179, 181, 183, 185, 187, 189, 192, 194, 197, 199, 202, 204, 206,
208, 209, 212, 214, 216, 218, 221, 223, 225, 227, 229, 232, 234,
237, 240, 242, 245, 246, 248, 252, 254, 256, 259, 261, 263, 266,
268, 270, 273, 275, 278, 280, 282, 284, 287, 290, 293, 295, 297,
299, 302, 304, 307, 309, 311, 314, 317, 319, 322, 325, 327, 329,
332, 335, 338, 340, 343, 346, 348, 351, 354, 357, 359, 362, 369,
371, 374, 376, 379, 382, 385, 387, 390, 393, 396, 399, 402, 404,
407, 410, 413, 416, 419, 421, 424, 426, 429, 432, 434, 438, 441,
444, 447, 450, 453, 455, 458, 461, 463, 466, 468, 471, 474, 477,
480, 483, 485, 487, 489, 493, 497, 499, 502, 504, 506, 509, 512,
515, 517, 520, 523, 527, 529, 532, 534, 537, 539, 541, 544, 546,
549, 551, 554, 557, 560, 563, 566, 568, 570, 573, 576, 579, 581,
584, 586, 589, 592, 594, 597, 600, 602, 606, 609, 612 };

8
void pin_setup(void);
void timer_setup(void);
void usart_setup(unsigned int baudrate);
void usart_transmit_byte(unsigned char data);
void usart_transmit_str(char *str);
void usart_transmit_nbr(int nbr);
unsigned char usart_receive(void);

int main(void)
{
unsigned char command;
int increment;
int i;

pin_setup();
timer_setup();
usart_setup(9600);
OCR1A = 150;
command = 0;
increment = 1;
while (1)
{
if ((command = usart_receive()))
{
if (command == 'A' || command == 'a') /* Increase Ton */
OCR1A += increment;
if (command == 'S' || command == 's') /* Decrease Toff */
OCR1A -= increment;
if (command == 'R' || command == 'r') /* Reset */
{
OCR1A = 150;
increment = 1;
}
if (command == 'D' || command == 'd') /* Increase step */
increment++;
if (command == 'F' || command == 'f') /* Decrease step */
{
if (increment == 1) continue;
else increment--;
}
if (command == 'T' || command == 't') /* Test */
{
usart_transmit_str("[TEST]");
usart_transmit_byte(CR);
i = 0;
while (i < 180)
{
usart_transmit_nbr(i);
usart_transmit_byte(CR);
OCR1A = servo_array[i];
_delay_ms(500);
i++;
}
i = 179;
while (i >= 0)
{

9
usart_transmit_nbr(i);
usart_transmit_byte(CR);
OCR1A = servo_array[i];
_delay_ms(500);
i--;
}
}
if (command == 'W' || command == 'w') /* Show OCR1A */
{
usart_transmit_str("SHOW_OCR1A ");
usart_transmit_nbr(OCR1A);
usart_transmit_byte(CR);
}
if (command == 'E' || command == 'e') /* Set OCR1A */
{
usart_transmit_str("SET_OCR1A ");
usart_transmit_nbr(OCR1A);
usart_transmit_byte(CR);
}
command = 0;
}
}
}

void pin_setup(void)
{
DDRD = (0 << DDD7) | (0 << DDD6) | (1 << DDD5) | (0 << DDD4) | (0 << DDD3) | (0 <<
DDD2) | (0 << DDD1) | (0 << DDD0);
PORTD = (0 << PORTD7) | (0 << PORTD6) | (0 << PORTD5) | (0 << PORTD4) | (0 <<
PORTD3) | (0 << PORTD2) | (0 << PORTD1) | (0 << PORTD0);
}

void timer_setup(void)
{
TCCR1A = (1 << COM1A1) | (0 << COM1A0) | (1 << WGM11);
TCCR1B = (1 << WGM13) | (1 << WGM12) | (1 << CS11) | (1 << CS10);
ICR1 = 4999;
}

void usart_setup(unsigned int baudrate)


{
unsigned long baud;

baud = F_CPU / (16 * (long)baudrate) - 1;


UBRRH = (unsigned char)(baud >> 8);
UBRRL = (unsigned char)baud;
UCSRB = (1 << RXEN) | (1 << TXEN);
UCSRC = (1<< URSEL) | (1 << USBS) | (3 << UCSZ0);
}

void usart_transmit_byte(unsigned char data)


{
while (!(UCSRA & (1 << UDRE))) ;
UDR = data;
}

10
void usart_transmit_str(char *str)
{
while (*str) usart_transmit_byte(*str++);
}

void usart_transmit_nbr(int nbr)


{
if (nbr > 9)
{
usart_transmit_nbr(nbr / 10);
usart_transmit_nbr(nbr % 10);
}
else usart_transmit_byte(nbr + 48);
}

unsigned char usart_receive(void)


{
while (!(UCSRA & (1 << RXC)));
return (UDR);
}

11
2) Stepper motor.
Descriere: un dispozitiv electromecanic care converteşte impulsurile
electrice înmişcări mecanice discrete.
Model: 28BYJ-48

Program:
#define F_CPU 16000000UL

#include <avr/io.h>
#include <util/delay.h>

void port_init(void)
{
DDRB = (0 << DDB7) | (0 << DDB6) | (0 << DDB5) | (0 << DDB4) | (1 << DDB3) | (1 <<
DDB2) | (1 << DDB1) | (1 << DDB0);
PORTB = (0 << PORT7) | (0 << PORT6) | (0 << PORT5) | (0 << PORT4) | (0 << PORT3) | (0
<< PORT2) | (0 << PORT1) | (0 << PORT0);
}

int main(void)
{
//char wave_drive[4] = {1, 2, 4, 8};
char half_step_drive[8] = {1, 3, 2, 6, 4, 12, 8, 9};
int i;

i = 0;
while (1)
{
if (i == 8) i = 0;
PORTB = half_step_drive[i];
i++;
_delay_ms(1);
}
}

12
3) Senzor de distanta IR.
Descriere: Senzorului de proximitate prezentat detectează obiectele aflate în
apropiere prin emisia unui puls de energie luminoasă în domeniul infraroşu cu
ajutorul unei diode electroluminiscente (LED); dacă acest puls luminos
întâlneşte un obiect de care se reflectă înapoi spre senzor, reflexia este captată
de elementul fotoreceptor al senzorului şi semnalizată. Senzorul detectează, fără
contact, obiectele capabile sa reflecte radiaţia electromagnetică în spectrul
infraroşu.
Model: Sharp 2y0a21.

Principiu: Convertor Analog-Digital.


Program:
#define F_CPU 16000000UL

#include <avr/io.h>
#include <util/delay.h>
#include <stdint.h>

#define CR 0b00001101

void adc_setup(void);
uint16_t adc_read(void);

void usart_setup(unsigned int baudrate);


void usart_transmit_byte(unsigned char data);
void usart_transmit_str(char *str);
void usart_transmit_nbr(int nbr);

13
unsigned char usart_receive(void);

int main(void)
{
uint16_t adc;
uint16_t distance;

usart_setup(9600);
adc_setup();
adc = 0;
distance = 0;
while (1)
{
adc = adc_read();
distance = (4800 /(adc - 20));
usart_transmit_str("adc: ");
usart_transmit_nbr(adc);
usart_transmit_byte(CR);
usart_transmit_str("distance: ");
usart_transmit_nbr(distance);
usart_transmit_byte(CR);
_delay_ms(1000);
}
}

void adc_setup(void)
{
ADMUX = (1 << REFS0);
ADCSRA = (1 << ADEN) | (1 << ADPS2) | (1 << ADPS1) | (1 << ADPS0); /* ADC 128
prescaler */
}

uint16_t adc_read(void)
{
ADCSRA |= (1 << ADSC);
while (ADCSRA & (1 << ADSC));
return (ADC);
}

void usart_setup(unsigned int baudrate)


{
unsigned long baud;

baud = F_CPU / (16 * (long)baudrate) - 1;


UBRRH = (unsigned char)(baud >> 8);
UBRRL = (unsigned char)baud;
UCSRB = (1 << RXEN) | (1 << TXEN);
UCSRC = (1<< URSEL) | (1 << USBS) | (3 << UCSZ0);
}

void usart_transmit_byte(unsigned char data)


{
while (!(UCSRA & (1 << UDRE)));
UDR = data;
}

14
void usart_transmit_str(char *str)
{
while (*str) usart_transmit_byte(*str++);
}

void usart_transmit_nbr(int nbr)


{
if (nbr > 9)
{
usart_transmit_nbr(nbr / 10);
usart_transmit_nbr(nbr % 10);
}
else usart_transmit_byte(nbr + 48);
}

unsigned char usart_receive(void)


{
while (!(UCSRA & (1 << RXC)));
return (UDR);
}

15
2.4 Soft suplimentar

Obiectiv: Comunicarea prin serie a dispozitivului cu PC .

Descriere: Transmisia de date serială în tehnologia informației, este o tehnologie


de comunicație între calculator și dispozitivele periferice, în care biții de date sunt
transferați succesiv de-a lungul unui canal de comunicare sau magistrală.

Functii microcontroller:

void usart_setup(unsigned int baudrate)


{
unsigned long baud;

baud = F_CPU / (16 * (long)baudrate) - 1;


UBRRH = (unsigned char)(baud >> 8);
UBRRL = (unsigned char)baud;
UCSRB = (1 << RXEN) | (1 << TXEN);
UCSRC = (1<< URSEL) | (1 << USBS) | (3 << UCSZ0);
}

void usart_transmit_byte(unsigned char data)


{
while (!(UCSRA & (1 << UDRE)));
UDR = data;
}

void usart_transmit_str(char *str)


{
while (*str) usart_transmit_byte(*str++);
}

void usart_transmit_nbr(int nbr)


{
if (nbr > 9)
{
usart_transmit_nbr(nbr / 10);
usart_transmit_nbr(nbr % 10);
}
else usart_transmit_byte(nbr + 48);
}

unsigned char usart_receive(void)


{
while (!(UCSRA & (1 << RXC)));
return (UDR);
}

16
Program PC:
#include <windows.h>
#include <stdio.h>
#include <conio.h>

int main(void)
{
HANDLE h_comm;
DCB dcb_serial_param = {0};
COMMTIMEOUTS timeouts = {0};
char command = 0;
char buff[256] = {0};
DWORD d_nbr_bytes_to_write;
DWORD d_nbr_bytes_writen = 0;
DWORD d_nbr_bytes_to_read = 0;

/* COM port */
h_comm = CreateFile("COM3", GENERIC_READ | GENERIC_WRITE, 0, NULL,
OPEN_EXISTING, 0, NULL);
if (h_comm == INVALID_HANDLE_VALUE)
{
printf("[-] Error in opening serial port.\n");
return 1;
}
else
printf("[+] Opening serial port.\n");
dcb_serial_param.DCBlength = sizeof(dcb_serial_param);
if (!GetCommState(h_comm, &dcb_serial_param))
{
printf("[-] Error in getting port state.\n");
return 1;
}
else
printf("[+] Get port state.\n");
dcb_serial_param.BaudRate = CBR_9600;
dcb_serial_param.ByteSize = 8;
dcb_serial_param.StopBits = TWOSTOPBITS;
dcb_serial_param.Parity = NOPARITY;
if (!SetCommState(h_comm, &dcb_serial_param))
{
printf("[-] Error in setting port state.\n");
return 1;
}
else
printf("[+] Set port state.\n");
timeouts.ReadIntervalTimeout = 50;
timeouts.ReadTotalTimeoutConstant = 50;
timeouts.ReadTotalTimeoutMultiplier = 10;
timeouts.WriteTotalTimeoutConstant = 50;
timeouts.WriteTotalTimeoutMultiplier = 10;
if (!SetCommTimeouts(h_comm, &timeouts))
{
printf("[-] Error in setting port timeouts.\n");
return 1;
}

17
else
printf("[+] Set port timeouts.\n");
printf("\n----[SEND_DATA]----[Q/q - EXIT]----\n\n");
while (1)
{
command = getch();
if (command == 'q' || command == 'Q')
break;
d_nbr_bytes_to_write = sizeof(char);
if (!WriteFile(h_comm, &command, d_nbr_bytes_to_write, &d_nbr_bytes_writen,
NULL))
printf("--> Error writing data to port !!!\n");
else
printf("--> Byte [%x](ASCII - %c) was sent to port.\n", command, command);
if (command == 's' || command == 'S')
{
printf("[START_SCANNING]\n");
while (1)
{
if (!ReadFile(h_comm, buff, 256, &d_nbr_bytes_to_read, NULL))
printf("--> Error reading data from port !!!\n");
else
printf("--> %s\n", buff);
}
}
}
printf("[*] Exit.\n");
CloseHandle(h_comm);
return 0;
}

18
2.5 Detalii de suport
Obiective: Elaborarea unor componente din material plastic in 3d. Printarea lor la
3D printer.

Soft utilizat: SketchUp

19
3 Soft-ul si hard-ul de baza
Program:
#define F_CPU 16000000UL

#include <avr/io.h>
#include <util/delay.h>
#include <stdbool.h>
#include <math.h>
#include <stdio.h>

#define CR 0b00001101

#define PI 3.1415F

/* Servo motor lookup table */


const uint16_t servo_array[180] = { 150, 152, 154, 156, 159, 161, 163, 166, 167, 170, 172, 174, 177,
179, 181, 183, 185, 187, 189, 192, 194, 197, 199, 202, 204, 206,
208, 209, 212, 214, 216, 218, 221, 223, 225, 227, 229, 232, 234,
237, 240, 242, 245, 246, 248, 252, 254, 256, 259, 261, 263, 266,
268, 270, 273, 275, 278, 280, 282, 284, 287, 290, 293, 295, 297,
299, 302, 304, 307, 309, 311, 314, 317, 319, 322, 325, 327, 329,
332, 335, 338, 340, 343, 346, 348, 351, 354, 357, 359, 362, 369,
371, 374, 376, 379, 382, 385, 387, 390, 393, 396, 399, 402, 404,
407, 410, 413, 416, 419, 421, 424, 426, 429, 432, 434, 438, 441,
444, 447, 450, 453, 455, 458, 461, 463, 466, 468, 471, 474, 477,
480, 483, 485, 487, 489, 493, 497, 499, 502, 504, 506, 509, 512,
515, 517, 520, 523, 527, 529, 532, 534, 537, 539, 541, 544, 546,
549, 551, 554, 557, 560, 563, 566, 568, 570, 573, 576, 579, 581,
584, 586, 589, 592, 594, 597, 600, 602, 606, 609, 612 };

/* Stepper motor modes */


const uint8_t wave_drive[4] = {1, 2, 4, 8};
const uint8_t half_step_drive[8] = {1, 3, 2, 6, 4, 12, 8, 9};

/* General function */
void pin_setup(void);

/* PWM - Servo motor */


void timer_setup(void);

/* USART functions */
void usart_setup(unsigned int baudrate);
void usart_transmit_byte(unsigned char data);
void usart_transmit_str(char *str);
void usart_transmit_nbr(int nbr);
uint8_t usart_receive(void);

/* Analog-digital convertor */
void adc_setup(void);
uint16_t adc_read(void);

int main(void)
{
uint16_t adc;
uint16_t distance;

20
uint16_t stepper_i;
int16_t stepper_mode_i;
int16_t servo_i;
uint8_t command;
char str[256];
float theta;
float phi;

pin_setup();
timer_setup();
usart_setup(9600);
adc_setup();
OCR1A = 150;
adc = 0;
stepper_i = 0;
command = 0;
servo_i = 0;
distance = 0;
while (1)
{

if ((command = usart_receive()))
{
/* Rotate stepper motor 360 */
if (command == 't' || command == 'T')
{
while (stepper_i != 512)
{
stepper_mode_i = 0;
while (stepper_mode_i < 8)
{
PORTB = half_step_drive[stepper_mode_i];
stepper_mode_i++;
_delay_ms(1);
}
stepper_i++;
}
PORTB = 0;
stepper_i = 0;
}

/* Reverse rotate stepper motor 360 */


if (command == 'r' || command == 'R')
{
while (stepper_i != 512)
{
stepper_mode_i = 7;
while (stepper_mode_i != -1)
{
PORTB = half_step_drive[stepper_mode_i];
_delay_ms(1);
stepper_mode_i--;
}
stepper_i++;
}
PORTB = 0;

21
stepper_i = 0;
}

/* Test all */
if (command == 's' || command == 'S')
{
while (stepper_i != 360)
{

servo_i = 0;
while (servo_i < 180)
{
OCR1A = servo_array[servo_i];
adc = adc_read();
_delay_ms(100);
distance = (4800 /(adc - 20));
if (distance > 80)
distance = 80;
if (distance < 8)
distance = 8;
theta = (float)stepper_i * PI / 180.0F;
phi = (float)servo_i * PI / 180.0F;
sprintf(str, "%d %d %d",(int)(distance * cos(phi) *
cos(theta)), (int)(distance * cos(phi) * sin(theta)), (int)(distance * sin(phi)));
usart_transmit_str(str);
usart_transmit_byte(CR);
_delay_ms(500);
servo_i++;
}
stepper_mode_i = 0;
while (stepper_mode_i < 8)
{
PORTB = half_step_drive[stepper_mode_i];
stepper_mode_i++;
_delay_ms(1);
}
stepper_mode_i = 0;
while (stepper_mode_i < 4)
{
PORTB = half_step_drive[stepper_mode_i];
stepper_mode_i++;
_delay_ms(1);
}
PORTB = 0;
stepper_i++;
servo_i = 179;
while (servo_i >= 0)
{
OCR1A = servo_array[servo_i];
adc = adc_read();
_delay_ms(100);
distance = (4800 /(adc - 20));
if (distance > 80) distance = 80;
if (distance < 8) distance = 8;
theta = (float)stepper_i * PI / 180.0F;
phi = (float)servo_i * PI / 180.0F;

22
sprintf(str, "%d %d %d",(int)(distance * cos(phi) *
cos(theta)), (int)(distance * cos(phi) * sin(theta)), (int)(distance * sin(phi)));
usart_transmit_str(str);
usart_transmit_byte(CR);
_delay_ms(500);
servo_i--;
}
stepper_mode_i = 4;
while (stepper_mode_i < 8)
{
PORTB = half_step_drive[stepper_mode_i];
stepper_mode_i++;
_delay_ms(1);
}
stepper_mode_i = 0;
while (stepper_mode_i < 8)
{
PORTB = half_step_drive[stepper_mode_i];
stepper_mode_i++;
_delay_ms(1);
}
PORTB = 0;
stepper_i++;
}
PORTB = 0;
stepper_i = 0;
}
command = 0;
}

}
}

/* General */
void pin_setup(void)
{
/* Stepper motor setup */
DDRB = (0 << DDB7) | (0 << DDB6) | (0 << DDB5) | (0 << DDB4) | (1 << DDB3) | (1 <<
DDB2) | (1 << DDB1) | (1 << DDB0);
PORTB = (0 << PORT7) | (0 << PORT6) | (0 << PORT5) | (0 << PORT4) | (0 << PORT3) | (0
<< PORT2) | (0 << PORT1) | (0 << PORT0);

/* Servo motor pin setup */


DDRD = (0 << DDD7) | (0 << DDD6) | (1 << DDD5) | (0 << DDD4) | (0 << DDD3) | (0 <<
DDD2) | (0 << DDD1) | (0 << DDD0);
PORTD = (0 << PORTD7) | (0 << PORTD6) | (0 << PORTD5) | (0 << PORTD4) | (0 <<
PORTD3) | (0 << PORTD2) | (0 << PORTD1) | (0 << PORTD0);
}

/* PWM */
void timer_setup(void)
{
TCCR1A = (1 << COM1A1) | (0 << COM1A0) | (1 << WGM11);
TCCR1B = (1 << WGM13) | (1 << WGM12) | (1 << CS11) | (1 << CS10);
ICR1 = 4999;
}

23
/* USART */
void usart_setup(unsigned int baudrate)
{
unsigned long baud;

baud = F_CPU / (16 * (long)baudrate) - 1;


UBRRH = (unsigned char)(baud >> 8);
UBRRL = (unsigned char)baud;
UCSRB = (1 << RXEN) | (1 << TXEN);
UCSRC = (1<< URSEL) | (1 << USBS) | (3 << UCSZ0);
}

void usart_transmit_byte(unsigned char data)


{
while (!(UCSRA & (1 << UDRE)));
UDR = data;
}

void usart_transmit_str(char *str)


{
while (*str) usart_transmit_byte(*str++);
}

void usart_transmit_nbr(int nbr)


{
if (nbr > 9)
{
usart_transmit_nbr(nbr / 10);
usart_transmit_nbr(nbr % 10);
}
else usart_transmit_byte(nbr + 48);
}

uint8_t usart_receive(void)
{
while (!(UCSRA & (1 << RXC)));
return (UDR);
}

/* ADC */
void adc_setup(void)
{
ADMUX = (1 << REFS0);
ADCSRA = (1 << ADEN) | (1 << ADPS2) | (1 << ADPS1) | (1 << ADPS0); /* ADC 128
prescaler */
}

uint16_t adc_read(void)
{
ADCSRA |= (1 << ADSC);
while (ADCSRA & (1 << ADSC));
return (ADC);
}

24
Hard-ul:

25
4 Concluzii
1) Concluzii despre locul de practica: Fiind în plină dezvoltare
compania Arobs a oferit un sprijin major în perfectarea abilităților și
adaptarea la noile modernizări privind implicarea studenților în
activitatea cotidiană a companiei. Stagiul practic este sursa principală de
îmbunătățire și implicare a teoriei studiate întreg semenstrul. De asemeni
datorită modernizării serviciilor care sunt prestate și dezvoltării hard-ului
& soft-ului, stagiul practic a fost asemeni unei scări care a deschis calea
către noi orizonturi în domeniul hard & soft. Experiența acumulată în
compania Arobs în perioada stagiului practic este memorată și va fi
utilizată în următorii ani, la necessitate.
2) Concluzii despre proiect: Proiectul primit la stagiul de practica a intarit
cunostintele teoretice si practice obtinute la facultate , totodata le-a si
extins.

26
5 Bibliografie

https://en.wikipedia.org/wiki/Lidar
https://ro.wikipedia.org/wiki/Microcontroler
http://www.radartutorial.eu/18.explanations/ex32.ro.html
http://cs.curs.pub.ro/wiki/pm/lab/lab3
https://www.scribd.com/doc/93204860/SERVOMOTOARE-ELECTRICE
https://ro.wikipedia.org/wiki/Arobs_Transilvania_Software
https://ro.wikipedia.org/wiki/Transmisie_de_date_serial%C4%83
https://www.scribd.com/doc/226713692/Motoare-pas-cu-pas-caracteristici
http://electronica-azi.ro/2001/11/29/senzor-de-proximitate-activ-in-ir/

27