This shows you the differences between two versions of the page.
|
pm:prj2023:vstoica:marinela-cotoi [2023/05/28 20:26] 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 ===== | ||
| - | Pentru a simula începerea jocului la apăsarea butonului, am configurat o intrerupere, ce va întrerupe programul curent la sesizarea evenimentuluii. | + | Pentru a simula începerea jocului la apăsarea butonului, am configurat o intrerupere, ce va opri programul curent la sesizarea evenimentului. |
| <code c> | <code c> | ||
| ISR(PCINT2_vect) { | ISR(PCINT2_vect) { | ||
| + | /* Pin change type of interrupt */ | ||
| if (!(PIND & (1 << PIND2))) { | if (!(PIND & (1 << PIND2))) { | ||
| buttonPressed = true; | buttonPressed = true; | ||
| Line 49: | Line 50: | ||
| void setup() { | void setup() { | ||
| - | // Configure interrupt using registers | + | .... |
| + | /* Configure interrupt using registers */ | ||
| | | ||
| - | // input | + | /* input */ |
| DDRD &= ~(1 << DDD2); | DDRD &= ~(1 << DDD2); | ||
| - | // input pullup | + | /* input pullup */ |
| PORTD |= (1 << PORTD2); | PORTD |= (1 << PORTD2); | ||
| | | ||
| - | // | + | /* Enable the pin change interrupt*/ |
| PCMSK2 |= (1 << PCINT18); | PCMSK2 |= (1 << PCINT18); | ||
| PCICR |= (1 << PCIE2); | PCICR |= (1 << PCIE2); | ||
| | | ||
| + | /* Enable interrupts */ | ||
| sei(); | sei(); | ||
| + | .... | ||
| } | } | ||
| Line 67: | Line 71: | ||
| Pentru display-ul de mesaje folosind afișajul LCD pe două rânduri, | Pentru display-ul de mesaje folosind afișajul LCD pe două rânduri, | ||
| - | am folosit biblioteca LiquidCrystal_I2C, inițializând lcd-ul astfel: | + | am folosit biblioteca **LiquidCrystal_I2C**, inițializând lcd-ul astfel: |
| <code c> | <code c> | ||
| void setup() { | void setup() { | ||
| + | ... | ||
| /* Initialize LCD screen */ | /* Initialize LCD screen */ | ||
| lcd.init(); | lcd.init(); | ||
| Line 83: | Line 88: | ||
| lcd.setCursor(0,1); | lcd.setCursor(0,1); | ||
| lcd.print("button to start!"); | lcd.print("button to start!"); | ||
| + | ... | ||
| } | } | ||
| </code> | </code> | ||
| + | |||
| + | Ultima bibliotecă folosită este biblioteca **Servo**, cu ajutorul căreia am gestionat miscările servomotorului. | ||
| + | <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> | ||
| + | |||
| + | 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 ===== | ===== Rezultate Obţinute ===== | ||
| Line 93: | Line 152: | ||
| ===== Concluzii ===== | ===== Concluzii ===== | ||
| - | ===== Download ===== | + | 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. | ||
| - | <note warning> | + | ===== Download ===== |
| - | 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**. | + | |
| - | </note> | + | |
| - | + | ||
| - | ===== Jurnal ===== | + | |
| - | <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> | ||