Differences

This shows you the differences between two versions of the page.

Link to this comparison view

pm:prj2024:vstoica:alexandru.ciornei [2024/05/15 14:23]
alexandru.ciornei [Hardware Design]
pm:prj2024:vstoica:alexandru.ciornei [2024/05/27 12:24] (current)
alexandru.ciornei [Jurnal]
Line 15: Line 15:
 ===== Hardware Design ===== ===== Hardware Design =====
  
-<note tip> +==== Listă piese ==== 
-Aici puneţi tot ce ţine de hardware design: + 
-  * listă de piese +  * Arduino Nano ATmega328P 
-  * scheme electrice (se pot lua şi de pe Internet şi din datasheet-uri, e.g. http://​www.captain.at/​electronic-atmega16-mmc-schematic.png) +  * Modul Bluetooth JDY-18 
-  * diagrame de semnal ​ +  * Convertor nivel logic TXS0108E 
-  * rezultatele simulării +  * Driver motoare L293D 
-</​note>​+  * Motor JGA25-370 
 +  * Senzor ultrasonic HC-SR04 
 +  * Fotorezistor 
 +  * Buzzer 
 +  * LED-uri albe, galbene și roșii 
 +  * Rezistențe 
 +  * 2x Baterii 9V 
 +==== Schema electrică ====
  
-{{:​pm:​prj2024:​vstoica:​schema_electrica_alex_ciornei.jpg?​nolink&​800|}}+{{ :​pm:​prj2024:​vstoica:​schema_electrica_alex_ciornei.jpg?​nolink&​600 |}}
 ===== Software Design ===== ===== Software Design =====
  
 +==== USART ====
  
 <note tip> <note tip>
-Descrierea codului aplicaţiei (firmware)+  * Pentru codul mașinii am folosit PlatformIO și avr-libc, [[https://​github.com/​alexciornei22/​rc-lego-car|repo GitHub]] 
-  * mediu de dezvoltare (if any) (e.g. AVR StudioCodeVisionAVR) +  * Pentru codul aplicației ​de iOS am folosit XcodeSwiftUI șCoreBluetooth,​ [[https://​github.com/​alexciornei22/​rc-lego-car-ios|repo GitHub]]
-  * librării şsurse 3rd-party (e.g. Procyon AVRlib) +
-  * algoritmi şi structuri pe care plănuiţi să le implementaţi +
-  * (etapa 3) surse şi funcţii implementate+
 </​note>​ </​note>​
  
-===== Rezultate Obţinute =====+Pentru comunicarea Bluetooth am folosit modulul USART0 al microcontrolerului,​ configurat să declanșeze o întrerupere la finalul fiecărei recepții, astfel încât să pună caracterele primite într-un buffer și să seteze un flag atunci când a detectat finalul unui mesaj (când a detectat newline).
  
-<note tip+<code
-Care au fost rezultatele obţinute în urma realizării proiectului vostru. +void USART0_init(unsigned int ubrr) 
-</note>+
 +    ​/* baud rate registers */ 
 +    UBRR0H = (unsigned char)(ubrr>>8); 
 +    UBRR0L = (unsigned char)ubrr;
  
-===== Concluzii =====+    /* enable TX and RX */ 
 +    UCSR0B ​_BV(RXEN0) | _BV(TXEN0);​ 
 +    // enable receive complete interrupt 
 +    UCSR0B |_BV(RXCIE0);​
  
-===== Download =====+    /* frame format: 8 bits, 2 stop, no parity */ 
 +    UCSR0C ​_BV(USBS0) | (3<<​UCSZ00);​ 
 +}
  
-<note warning>​ +...
-O arhivă (sau mai multe dacă este cazul) cu fişierele obţinute în urma realizării proiectului:​ surse, scheme, etcUn fişier README, un ChangeLog, un script de compilare şi copiere automată pe uC crează întotdeauna o impresie bună ;-).+
  
-Fişierele se încarcă pe wiki folosind facilitatea **Add Images or other files**. Namespace-ul în care se încarcă fişierele este de tipul **:​pm:​prj20??:​c?​** sau **:​pm:​prj20??:​c?:​nume_student** ​(dacă este cazul). **Exemplu:​** Dumitru Alin, 331CC -> **:​pm:​prj2009:​cc:​dumitru_alin**. +ISR(USART_RX_vect{ 
-</note>+    // read data register into buffer and increase its length 
 +    uint8_t new_data = UDR0; 
 +    usart_buffer[usart_buffer_len++] = new_data;
  
-===== Jurnal =====+    // reset buffer length on overflow 
 +    if (usart_buffer_len >USART_BUFFER_MAX_LEN - 1) { 
 +        usart_buffer_len ​0; 
 +    }
  
-<note tip+    // set string received flag 
-Puteți avea și o secțiune ​de jurnal ​în care să poată urmări asistentul ​de proiect progresul proiectului+    if (new_data == '​\n'​) { 
-</note>+        string_received = true; 
 +    } 
 +
 +</code
 + 
 +==== ADC ==== 
 + 
 +Pentru a putea detecta lumina din mediul înconjurător cu ajutorul unui fotorezistor am folosit modulul de convertor analogic digital, care să interpreteze practic lumina ca o valoare pe 10 biți (0-1023). 
 + 
 +<​code>​ 
 +void adc_init() 
 +
 +    // channel 7 
 +    ADMUX |= _BV(MUX0) | _BV(MUX1) | _BV(MUX2);​ 
 +    // AVcc with external capacitor at AREF PIN 
 +    ADMUX |= _BV(REFS0);​ 
 + 
 +    ADCSRA = 0; 
 +    // set 128 prescaler 
 +    ADCSRA |= _BV(ADPS0);​ 
 +    ADCSRA |= _BV(ADPS1);​ 
 +    ADCSRA |= _BV(ADPS2);​ 
 +    // enable ADC 
 +    ADCSRA |= _BV(ADEN);​ 
 +
 + 
 +uint16_t adc_get_light_value() 
 +
 + // start conversion 
 + ADCSRA |= (1 << ADSC); 
 + 
 + // wait until conversion is complete 
 + while ((ADCSRA & (1 << ADSC))); 
 + 
 + return ADC; 
 +
 +</​code>​ 
 + 
 +==== Timere/PWM ==== 
 + 
 +Am folosit toate cele 3 Timere ale ATMega328P, fiecare dintre ele având un scop esențial în funcționarea mașinii. 
 + 
 +=== Timer 0 PWM=== 
 + 
 +Primul timer este configurat în modul Phase Correct PWM și mă folosesc ​de cei 2 pini PWM ai săi (OC0A și OC0B) pentru a controla motorul mașinii ​în ambele direcții, în funcție de input-ul utilizatorului. 
 + 
 +<​code>​ 
 +void Timer0_init_phase_correct_pwm() 
 +
 +    // set PD6(OC0A) 
 +    // and PD5(OC1A) 
 +    // as output 
 +    DDRD |= _BV(PD6); 
 +    DDRD |= _BV(PD5); 
 + 
 +    // set Phase Correct PWM mode 
 +    TCCR0A |= _BV(WGM00);​ 
 + 
 +    // set OC0A/OC1A when up-counting 
 +    // TCCR0A |= _BV(COM0A0);​ 
 +    TCCR0A |= _BV(COM0A1);​ 
 +    // TCCR0A |= _BV(COM0B0);​ 
 +    TCCR0A |= _BV(COM0B1);​ 
 + 
 +    // set 1024 prescaler 
 +    TCCR0B |= _BV(CS00);​ 
 +    TCCR0B |= _BV(CS02);​ 
 + 
 +    OCR0A = 0; 
 +    OCR0B = 0; 
 +
 +</​code>​ 
 + 
 +=== Timer 1 Input Capture === 
 + 
 +Pentru a putea detecta timpul scurs de la emiterea semnalului ultrasonic de către senzorul de distanță, ​care este de regulă foarte scurt (poate fi de ordinul microsecundelor),​ am setat contorul timer-ului 1 pe 0 la momentul emiterii semnalului de trigger și am folosit funcția de input capture a timer-ului 1, pentru a putea declanșa o întrerupere la detectarea unui front negativ pe pinul ICP1. 
 + 
 +<​code>​ 
 +void Timer1_init_input_capture() 
 +
 +    cli(); 
 + 
 +    // OC1A/OC0B disconnected,​ normal mode 
 +    TCCR1A = 0; 
 + 
 +    // set input capture noise canceler 
 +    TCCR1B |= _BV(ICNC1);​ 
 +    // set falling edge trigger 
 +    TCCR1B &= ~_BV(ICES1);​ 
 + 
 +    // set 8 prescaler 
 +    TCCR1B |= _BV(CS11);​ 
 + 
 +    // set input capture interrupt 
 +    TIMSK1 |= _BV(ICIE1);​ 
 +     
 +    sei(); 
 +
 + 
 +ISR(TIMER1_CAPT_vect) 
 +
 +    ultrasonic_sensor_micros = ICR1 / 2; 
 +    distance_updated = true; 
 +
 +</​code>​ 
 + 
 +=== Timer 2 1Khz === 
 + 
 +Timer-ului 2 rulează în modul CTC pentru a putea oferi o frecvență de 1ms și deservește o bună parte din activitățile mașinii: pulsară regulată a luminilor de semnalizare,​ ping-urile emise de buzzer în momentul detectării unor obstacole, declanșarea senzorilor pentru a obține valori actualizate de la aceștia de 4 ori pe secundă. 
 + 
 +<code> 
 +void Timer2_init_1Khz() 
 +
 +    cli(); 
 + 
 +    ​// set CTC mode 
 +    TCCR2A |= _BV(WGM21);​ 
 + 
 +    // set 64 prescaler 
 +    TCCR2B |= _BV(CS22);​ 
 +     
 +    // set compare register for 1000Hz 
 +    OCR2A |= 250; 
 + 
 +    // set interrupt 
 +    TIMSK2 |= _BV(OCIE2A);​ 
 + 
 +    sei(); 
 +
 +</code> 
 +===== Rezultate Obţinute ===== 
 + 
 +{{:​pm:​prj2024:​vstoica:​porsche_lego_leduri.jpg?​nolink&​200|}} 
 +{{ :​pm:​prj2024:​vstoica:​placa_centrala_arduino_bluetooth.jpg?​nolink&​300|}} 
 +{{:​pm:​prj2024:​vstoica:​ansamblu_motor.jpg?​nolink&​300 |}} 
 +{{ :​pm:​prj2024:​vstoica:​senzor_ultrasonic_parcare.jpg?​nolink&​300 |}} 
 + 
 +{{ :​pm:​prj2024:​vstoica:​porsche_lego_full_fara_trapa.jpg?​nolink&​600 |}} 
 +===== Concluzii ===== 
 + 
 +Proiectul a fost mult mai dificil decât mă așteptam, atât pe partea de dezvoltare a codului mașinii și a aplicației,​ dar mai ales pe partea de hardware și de mecanică, pentru că nu aveam multă experiență cu astfel de lucruri, însă am învățat multe pe parcurs și am reușit să aduc proiectul într-o stare de funcționare bună. 
 +===== Download ===== 
 + 
 +  * Arhivă cod mașinuță:​{{:​pm:​prj2024:​vstoica:​rc-lego-car-main.zip|}} 
 +  * Arhiva cod aplicație iOS:​{{:​pm:​prj2024:​vstoica:​rc-lego-car-ios-main.zip|}}
  
 ===== Bibliografie/​Resurse ===== ===== Bibliografie/​Resurse =====
  
-<​note>​ +**Resurse ​Hardware** 
-Listă cu documente, datasheet-uri,​ resurse Internet folosite, eventual grupate pe **Resurse ​Software** şi **Resurse Hardware**. +  ​Datasheet ATMega328P {{:​pm:​prj2024:​vstoica:​atmel-7810-automotive-microcontrollers-atmega328p_datasheet.pdf|}} 
-</​note>​+  ​Datasheet TXS108E {{:​pm:​prj2024:​vstoica:​txs0108e.pdf|}} 
 +  ​Datasheet JDY-18 {{:​pm:​prj2024:​vstoica:​jdy-18.pdf|}} 
 +  * Datasheet L293D {{:​pm:​prj2024:​vstoica:​l293d.pdf|}}
  
 +**Resurse Software**
 +  * [[https://​developer.apple.com/​documentation/​swiftui/​|SwiftUI]]
 +  * [[https://​developer.apple.com/​documentation/​corebluetooth|CoreBluetooth]]
 <​html><​a class="​media mediafile mf_pdf"​ href="?​do=export_pdf">​Export to PDF</​a></​html>​ <​html><​a class="​media mediafile mf_pdf"​ href="?​do=export_pdf">​Export to PDF</​a></​html>​
  
pm/prj2024/vstoica/alexandru.ciornei.1715772195.txt.gz · Last modified: 2024/05/15 14:23 by alexandru.ciornei
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0