This shows you the differences between two versions of the page.
|
pm:prj2023:vstoica:marinela-cotoi [2023/05/28 19:18] victorita.cotoi |
pm:prj2023:vstoica:marinela-cotoi [2023/05/29 10:47] (current) victorita.cotoi |
||
|---|---|---|---|
| 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> | ||