This shows you the differences between two versions of the page.
pm:prj2024:vstoica:dragos.plesa [2024/05/16 15:00] dragos.plesa [Hardware Design] |
pm:prj2024:vstoica:dragos.plesa [2024/05/27 17:28] (current) dragos.plesa [Jurnal] |
||
---|---|---|---|
Line 18: | Line 18: | ||
===== Hardware Design ===== | ===== Hardware Design ===== | ||
- | {{:pm:prj2024:vstoica:schemaaaa_electricaaa.png?300|}} | + | {{:pm:prj2024:vstoica:image_2024-05-27_120308881.png?500|}} |
+ | |||
+ | == Arduino Uno R3 == | ||
+ | * Arduino UNO este o platforma de procesare open-source, bazata pe software si hardware flexibil si simplu de folosit ce are la baza microcontroller-ul ATmega 328. | ||
+ | |||
+ | == HC-SR04 == | ||
+ | * Tensiune de operare: 5V DC | ||
+ | * Curent de operare: 15mA | ||
+ | * Unghi de masurare: 15 grade | ||
+ | * Distanta de variatie: 2cm - 4m | ||
+ | |||
+ | == Monochrome 1.3" 128x64 OLED graphic display == | ||
+ | * Acest bord / cip foloseste adresa I2C intre 0x3C-0x3D, selectabil cu jumperi | ||
+ | * Display-ul foloseste 40mA de la sursa de 3.3V. | ||
+ | |||
+ | == LED == | ||
+ | * Tip diodă LED | ||
+ | * Tensiune de lucru 1.8...2.4V | ||
+ | |||
+ | == Buzzer activ == | ||
+ | * Tensiune de lucru 5V | ||
- | <note tip> | ||
- | Lista piese: | ||
- | * Arduino Uno R3 | ||
- | * Senzor ultrasunete HC SR-04P | ||
- | * 128x64 OLED graphic display | ||
- | </note> | ||
===== Software Design ===== | ===== Software Design ===== | ||
+ | ==Mediu de Dezvoltare: == | ||
+ | Firmware-ul a fost dezvoltat folosind Arduino IDE, un mediu de dezvoltare integrat care oferă unelte și biblioteci esențiale pentru programarea și încărcarea codului pe plăcile Arduino. | ||
+ | |||
+ | == Librării și Surse 3rd-Party: == | ||
+ | Pentru acest proiect, am folosit următoarele librării standard disponibile în Arduino IDE: | ||
+ | |||
+ | "Adafruit_GFX.h": Folosită pentru controlul ecranului OLED și afișarea informațiilor relevante. | ||
+ | În plus, pentru a obține un control mai precis și eficient al unor componente hardware, am optat să lucrez direct cu registrele microcontroller-ului. Astfel, **senzorul ultrasonic HC-SR04** are patru pini : VCC pentru alimentare (5V), GND pentru ground, TRIG pinul de trigger pentru a iniția măsurarea, ECHO pinul de echo pentru a citi durata impulsului de întoarcere: | ||
+ | DDRD |= (1 << DDD3); | ||
+ | DDRD &= ~(1 << DDD2); | ||
+ | | ||
+ | PORTD |= (1 << PORTD3); | ||
+ | PORTD &= ~(1 << PORTD3); | ||
+ | Pentru led in loc de functia **pinMode(LED, OUTPUT)** din libraria Arduino am folosit: | ||
+ | DDRB |= (1 << DDB3); // configuram pinul 11 ca output | ||
+ | TCCR2A |= (1 << WGM20) | (1 << WGM21); // Timer/Counter Control Register A pentru Timer 2 | ||
+ | TCCR2A |= (1 << COM2A1); | ||
+ | TCCR2A &= ~(1 << COM2A0); | ||
+ | TCCR2B |= (1 << CS22); | ||
+ | TCCR2B &= ~(1 << CS21); | ||
+ | TCCR2B &= ~(1 << CS20); | ||
+ | OCR2A = 254; | ||
+ | Pentru buzzer in loc de functia **tone(BUZZER,x)** din libraria Arduino am folosit: | ||
+ | DDRD |= (1 << DDD6); | ||
+ | TCCR0A |= (1 << WGM00) | (1 << WGM01) | (1 << COM0A1); // PWM | ||
+ | TCCR0B |= (1 << CS01); | ||
+ | | ||
+ | unsigned int ocrValue = 16000000 / (2 * 8 * frequency) - 1; | ||
+ | // 16MHz - system clock frequency | ||
+ | // 8 - prescaler value | ||
+ | OCR0A = ocrValue; | ||
+ | | ||
+ | Pentru afisajul senzorului pe ecranul oled am folosit functii din bibloteca arduino unde **epd_bitmap_sensor_x_on** este imaginea pentru care obiectul nu se afla in raza senzorului, iar **epd_bitmap_sensor_x_off** pentru obiectul care se afla in raza senzorului, **dist_step_x** este pragul de distanta: | ||
+ | dist_step_x = min_dist + round((max_dist - min_dist) / 4.0 * x); | ||
+ | |||
+ | display.drawBitmap( | ||
+ | 24, | ||
+ | 17, | ||
+ | sensor.measured_distance_cm > dist_step_01 ? epd_bitmap_sensor_01_a_on : epd_bitmap_sensor_01_a_off, 32, 14, 1); | ||
+ | display.drawBitmap( | ||
+ | 21, | ||
+ | 25, | ||
+ | sensor.measured_distance_cm > dist_step_02 ? epd_bitmap_sensor_01_b_on : epd_bitmap_sensor_01_b_off, 32, 16, 1); | ||
+ | display.drawBitmap( | ||
+ | 18, | ||
+ | 34, | ||
+ | sensor.measured_distance_cm > dist_step_03 ? epd_bitmap_sensor_01_c_on : epd_bitmap_sensor_01_c_off, 32, 17, 1); | ||
+ | display.drawBitmap( | ||
+ | 16, | ||
+ | 43, | ||
+ | sensor.measured_distance_cm > dist_step_04 ? epd_bitmap_sensor_01_d_on : epd_bitmap_sensor_01_d_off, 32, 18, 1); | ||
+ | | ||
+ | |||
+ | == Algoritmi și Structuri de Date: == | ||
+ | Senzorul are urmatoarele caracteristici: | ||
+ | struct sensor_data{ | ||
+ | int echo_pin; | ||
+ | int trig_pin; | ||
+ | int measured_distance_cm; | ||
+ | int label_xpos; // x position of the distance label | ||
+ | int label_ypos; // y position of the distance label | ||
+ | int label_width; // calculated width of the distance string | ||
+ | int label_startpos_x; // start X position for the label | ||
+ | int label_startpos_y; // start Y position for the label | ||
+ | int label_endpos_x; // end X position for the label | ||
+ | int label_endpos_y; // end Y position for the label | ||
+ | }; | ||
+ | Principalele algoritmi implementate în firmware includ: Logica de pornire a ledului si buzzerului(ce este comentat este cu functii arduino avand aceeasi functionalitate): | ||
+ | | ||
+ | if(sensor.measured_distance_cm >= 2 && sensor.measured_distance_cm <= 25){ | ||
+ | //analogWrite(LED, 254); | ||
+ | OCR2A = 254; | ||
+ | tone(BUZZER,300); | ||
+ | //setBuzzerFrequency(50); | ||
+ | } | ||
+ | else if(sensor.measured_distance_cm > 25 && sensor.measured_distance_cm <= 50) { | ||
+ | // analogWrite(LED, 127); | ||
+ | OCR2A = 127; | ||
+ | tone(BUZZER, 200); | ||
+ | //setBuzzerFrequency(100); | ||
+ | } | ||
+ | else if(sensor.measured_distance_cm > 50 && sensor.measured_distance_cm <= 75) { | ||
+ | //analogWrite(LED, 64); | ||
+ | OCR2A = 64; | ||
+ | tone(BUZZER, 100); | ||
+ | //setBuzzerFrequency(200); | ||
+ | } | ||
+ | else { | ||
+ | //analogWrite(LED, 0); | ||
+ | OCR2A = 0; | ||
+ | //noTone(BUZZER); | ||
+ | TCCR0A &= ~((1 << COM0A1) | (1 << COM0A0)); | ||
+ | } | ||
+ | Actualizarea și afișarea informațiilor pe ecranul OLED, inclusiv distanța față de obstacol. Astfel, o imagine pe ecranul OLED va arata asa: | ||
+ | // 'car_image', 56x15px | ||
+ | const unsigned char epd_bitmap_car_image [] PROGMEM = { | ||
+ | 0xc0, 0x40, 0x00, 0x00, 0x00, 0x02, 0x03, 0xc0, 0x8f, 0xff, 0xff, 0xff, 0xf1, 0x03, 0xe0, 0x70, | ||
+ | 0x00, 0x00, 0x00, 0x0e, 0x07, 0xff, 0x00, 0xff, 0xff, 0xff, 0x00, 0xff, 0xc0, 0xff, 0x00, 0x00, | ||
+ | 0x00, 0xff, 0x03, 0xc0, 0x00, 0x05, 0x75, 0xc0, 0x00, 0x03, 0x47, 0xf8, 0x05, 0x51, 0x40, 0x1f, | ||
+ | 0xe2, 0x47, 0xfc, 0x05, 0x65, 0x80, 0x3f, 0xe2, 0x40, 0x78, 0x06, 0x45, 0x40, 0x1e, 0x02, 0x30, | ||
+ | 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x1e, 0x01, 0xff, 0xff, 0xff, 0x80, 0x78, 0x07, 0xe2, 0x00, | ||
+ | 0x00, 0x00, 0x47, 0xe0, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xbf, 0xff, 0xff, 0xff, | ||
+ | 0xfd, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x06, 0x00 | ||
+ | }; | ||
+ | == Surse și Funcții Implementate: == | ||
+ | |||
+ | setup(): Inițializează configurările necesare pentru comunicarea cu senzorul cu ultrasunete și ecranul OLED. | ||
+ | unsigned long measurePulseHigh(uint8_t pin): Realizează măsurarea distanței cu senzorul ultrasonic. | ||
+ | unsigned long measurePulseHigh(uint8_t pin) { | ||
+ | unsigned long startTime = 0; | ||
+ | unsigned long endTime = 0; | ||
+ | | ||
+ | while (!(PIND & (1 << pin))); | ||
+ | // Record the start time | ||
+ | startTime = micros(); | ||
+ | // Wait for the pulse to end | ||
+ | while (PIND & (1 << pin)); | ||
+ | endTime = micros(); | ||
+ | | ||
+ | return endTime - startTime; | ||
+ | } | ||
+ | | ||
+ | unsigned long duration = measurePulseHigh(PIN_ECHO); | ||
+ | float distance_cm = duration * 0.034 / 2; // se inmulteste cu viteza sunetului (cm/us) and se imparte la 2(pentru distanta undei inainte si inapoi) | ||
+ | |||
+ | loop(): Implementează bucla principală a programului, care: | ||
+ | Procesează datele și actualizează afișajul pe ecranul OLED. | ||
+ | Gestionează alte acțiuni sau funcționalități specifice proiectului, cum ar fi semnalarea sonoră în caz de apropiere excesivă de obstacol. | ||
- | <note tip> | ||
- | Descrierea codului aplicaţiei (firmware): | ||
- | * mediu de dezvoltare (if any) (e.g. AVR Studio, CodeVisionAVR) | ||
- | * librării şi 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> | ||
===== Rezultate Obţinute ===== | ===== Rezultate Obţinute ===== | ||
<note tip> | <note tip> | ||
- | Care au fost rezultatele obţinute în urma realizării proiectului vostru. | + | {{:pm:prj2024:vstoica:whatsapp_image_2024-05-27_at_17.13.05.jpeg?300|}} |
+ | {{:pm:prj2024:vstoica:whatsapp_image_2024-05-27_at_17.13.06.jpeg?300|}} | ||
+ | {{:pm:prj2024:vstoica:whatsapp_image_2024-05-27_at_17.13.19.jpeg?300|}} | ||
+ | |||
+ | Link pentru video: | ||
+ | {{:pm:prj2024:vstoica:videos.rar|}} | ||
</note> | </note> | ||
- | ===== Concluzii ===== | + | |
===== Download ===== | ===== Download ===== | ||
Line 54: | Line 194: | ||
</note> | </note> | ||
- | ===== Jurnal ===== | ||
- | |||
- | <note tip> | ||
- | Puteți avea și o secțiune de jurnal în care să poată urmări asistentul de proiect progresul proiectului. | ||
- | </note> | ||
===== Bibliografie/Resurse ===== | ===== Bibliografie/Resurse ===== | ||
+ | == Resurse Hardware == | ||
+ | |||
+ | <note> | ||
+ | https://docs.arduino.cc/resources/datasheets/A000066-datasheet.pdf | ||
+ | https://ww1.microchip.com/downloads/en/DeviceDoc/Atmel-7810-Automotive-Microcontrollers-ATmega328P_Datasheet.pdf | ||
+ | https://html.alldatasheet.com/html-pdf/1179026/ETC2/SSD1306/111/1/SSD1306.html | ||
+ | </note> | ||
+ | |||
+ | == Resurse Software == | ||
<note> | <note> | ||
- | Listă cu documente, datasheet-uri, resurse Internet folosite, eventual grupate pe **Resurse Software** şi **Resurse Hardware**. | + | https://projecthub.arduino.cc/Isaac100/getting-started-with-the-hc-sr04-ultrasonic-sensor-7cabe1 |
+ | https://docs.arduino.cc/built-in-examples/basics/Blink/ | ||
</note> | </note> | ||
<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> | ||