This shows you the differences between two versions of the page.
pm:prj2023:vstoica:marinela-cotoi [2023/05/28 19:17] victorita.cotoi |
pm:prj2023:vstoica:marinela-cotoi [2023/05/29 10:47] (current) victorita.cotoi |
||
---|---|---|---|
Line 21: | Line 21: | ||
{{:pm:prj2023:vstoica:86f708dc-0846-4423-9a68-00f770b18258.png?500|}} | {{:pm:prj2023:vstoica:86f708dc-0846-4423-9a68-00f770b18258.png?500|}} | ||
- | ==== Hardware design ==== | + | ===== Hardware design ===== |
=== Componente hardware === | === Componente hardware === | ||
Line 36: | Line 36: | ||
=== Schema electrică === | === Schema electrică === | ||
- | {{:pm:prj2023:vstoica:schema-electrica.png?550|}} | + | {{:pm:prj2023:vstoica:schema-electrica.png?600|}} |
- | ==== Software design ==== | + | ===== Software design ===== |
- | Mediu de dezvoltare: **Arduino IDE** | + | Pentru a simula începerea jocului la apăsarea butonului, am configurat o intrerupere, ce va opri programul curent la sesizarea evenimentului. |
+ | <code c> | ||
+ | ISR(PCINT2_vect) { | ||
+ | /* Pin change type of interrupt */ | ||
+ | if (!(PIND & (1 << PIND2))) { | ||
+ | buttonPressed = true; | ||
+ | } | ||
+ | } | ||
- | Librării folosite: | + | void setup() { |
- | * **LiquidCrystal_I2C**, pentru gestionarea ecranului LCD cu modul I2C și afișarea de mesaje | + | .... |
- | * **Servo**, pentru gestionarea mișcării servo-motorului | + | /* Configure interrupt using registers */ |
+ | |||
+ | /* input */ | ||
+ | DDRD &= ~(1 << DDD2); | ||
+ | /* input pullup */ | ||
+ | PORTD |= (1 << PORTD2); | ||
+ | |||
+ | /* Enable the pin change interrupt*/ | ||
+ | PCMSK2 |= (1 << PCINT18); | ||
+ | PCICR |= (1 << PCIE2); | ||
+ | |||
+ | /* Enable interrupts */ | ||
+ | sei(); | ||
+ | .... | ||
+ | } | ||
- | ===== Rezultate Obţinute ===== | + | </code> |
- | <note tip> | ||
- | Care au fost rezultatele obţinute în urma realizării proiectului vostru. | ||
- | </note> | ||
- | ===== Concluzii ===== | + | Pentru display-ul de mesaje folosind afișajul LCD pe două rânduri, |
+ | am folosit biblioteca **LiquidCrystal_I2C**, inițializând lcd-ul astfel: | ||
+ | <code c> | ||
- | ===== Download ===== | + | void setup() { |
+ | ... | ||
+ | /* Initialize LCD screen */ | ||
+ | lcd.init(); | ||
+ | /* Clear content on the screen */ | ||
+ | lcd.clear(); | ||
+ | /* Turn on backlight */ | ||
+ | lcd.backlight(); | ||
+ | |||
+ | /* Setup initial message on lcd */ | ||
+ | lcd.setCursor(2,0); | ||
+ | lcd.print("Press the red"); | ||
+ | lcd.setCursor(0,1); | ||
+ | lcd.print("button to start!"); | ||
+ | ... | ||
+ | } | ||
- | <note warning> | + | </code> |
- | O arhivă (sau mai multe dacă este cazul) cu fişierele obţinute în urma realizării proiectului: surse, scheme, etc. Un 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**. | + | Ultima bibliotecă folosită este biblioteca **Servo**, cu ajutorul căreia am gestionat miscările servomotorului. |
- | </note> | + | <code c> |
+ | void setup() { | ||
+ | /* Initial servomotor configuration */ | ||
+ | |||
+ | /* Attach the servomotor to the object */ | ||
+ | servo.attach(servoPin); | ||
+ | /* Set the servomotor position to the unpressed angle value */ | ||
+ | servo.write(unpress_angle); | ||
+ | } | ||
+ | </code> | ||
- | ===== Jurnal ===== | + | Flow-ul programului final arată astfel: |
+ | <code c> | ||
+ | void loop() { | ||
+ | /* Print fotoresistor's value */ | ||
+ | Serial.println(analogRead(A0)); | ||
+ | Serial.println("\n"); | ||
+ | |||
+ | /* Check if the pushbutton is pressed. If it is, set the game | ||
+ | as 'Playing' on the LCD screen*/ | ||
+ | if (buttonPressed && !playing) { | ||
+ | playing = true; | ||
+ | buttonPressed = false; | ||
+ | |||
+ | /* Start the game */ | ||
+ | servo.write(press_angle); | ||
+ | delay(100); | ||
+ | |||
+ | /* Clear LCD and show text */ | ||
+ | lcd.clear(); | ||
+ | lcd.setCursor(2,0); | ||
+ | lcd.print("Playing.. "); | ||
+ | } | ||
+ | |||
+ | /* If the game has started */ | ||
+ | if (playing == true) { | ||
+ | servo.write(unpress_angle); | ||
+ | delay(10); | ||
+ | |||
+ | /* If we catch an obstacle */ | ||
+ | if(analogRead(A0)< threshold) | ||
+ | { | ||
+ | servo.write(press_angle); | ||
+ | /* Waits 100ms for the servo to reach the position */ | ||
+ | delay(100); | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | </code> | ||
+ | |||
+ | Fiecare apelare de funcție servo.write(), cu valoarea press_angle, este echivalentului apăsării fizice, în timp real, a butonului **Space** de pe tastatura laptopului, servo-motorul fiind lipit de acesta, declanșând astfel o săritură a dinozaurului în joc, după cum se poate vedea în video-ul atașat mai jos. | ||
+ | |||
+ | ===== Rezultate Obţinute ===== | ||
+ | <html><iframe width="600" height="350" src="https://www.youtube.com/embed/Uztkw54-Vng" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe></html> | ||
+ | |||
+ | |||
+ | ===== Concluzii ===== | ||
+ | |||
+ | Proiectul a reprezentat pentru mine o primă interacțiune independentă cu hardware-ul, cu piese fizice, în afara laboratorului și m-a ajutat să înțeleg cum să le configurez și cum interacționează unele cu altele, încorporând mai multe concepte învățate la PM în acest an. | ||
+ | Mi s-a părut distractiv și nu foarte dificil să automatizez un joc real în această formă și datorită lui, am realizat câte lucruri faine putem face cu 2-3 componente și o placuță Arduino. | ||
+ | |||
+ | ===== Download ===== | ||
- | <note tip> | + | {{:pm:prj2023:vstoica:proiectpm2023.zip|}} |
- | 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 ===== | ||
- | <note> | + | * https://ocw.cs.pub.ro/courses/pm/lab/lab2-2023 |
- | Listă cu documente, datasheet-uri, resurse Internet folosite, eventual grupate pe **Resurse Software** şi **Resurse Hardware**. | + | * https://docs.arduino.cc/built-in-examples/digital/Button |
- | </note> | + | * https://docs.arduino.cc/learn/electronics/servo-motors |
+ | * https://www.instructables.com/How-to-use-a-photoresistor-or-photocell-Arduino-Tu/ | ||
<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> | ||