This shows you the differences between two versions of the page.
|
pm:prj2023:vstoica:marinela-cotoi [2023/05/28 19:06] victorita.cotoi |
pm:prj2023:vstoica:marinela-cotoi [2023/05/29 10:47] (current) victorita.cotoi |
||
|---|---|---|---|
| Line 7: | Line 7: | ||
| ===== Descriere generală ===== | ===== Descriere generală ===== | ||
| + | === Flow proiect === | ||
| Inițial, ecranul LCD afișează mesajul **„Press the red button to start!”**, iar apăsarea butonului roșu determină ulterior prima mișcare a servo-motorului și respectiv, începutul jocului. | Inițial, ecranul LCD afișează mesajul **„Press the red button to start!”**, iar apăsarea butonului roșu determină ulterior prima mișcare a servo-motorului și respectiv, începutul jocului. | ||
| - | Ulterior, ecranul LCD afișează mesajul „Playing..”, iar jocul se desfășoară, prin utilizarea fotorezistorilor pentru a identifica obstacolele, respectiv momentele în care dinozaurul trebuie să sară. | + | Ulterior, ecranul LCD afișează mesajul **„Playing..”**, iar jocul se desfășoară, prin utilizarea fotorezistorilor pentru a identifica obstacolele, respectiv momentele în care dinozaurul trebuie să sară. |
| {{:pm:prj2023:vstoica:playing...jpeg?600|}} | {{:pm:prj2023:vstoica:playing...jpeg?600|}} | ||
| Line 20: | 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 35: | 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. |
| - | Librării folosite: | + | <code c> |
| - | * **LiquidCrystal_I2C**, pentru gestionarea ecranului LCD cu modul I2C, | + | ISR(PCINT2_vect) { |
| - | * **Servo**, pentru gestionarea miscării servo-motorului | + | /* Pin change type of interrupt */ |
| + | if (!(PIND & (1 << PIND2))) { | ||
| + | buttonPressed = true; | ||
| + | } | ||
| + | } | ||
| + | |||
| + | void setup() { | ||
| + | .... | ||
| + | /* 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(); | ||
| + | .... | ||
| + | } | ||
| + | |||
| + | </code> | ||
| + | |||
| + | |||
| + | 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> | ||
| + | |||
| + | 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!"); | ||
| + | ... | ||
| + | } | ||
| + | |||
| + | </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 ===== | ||
| + | <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 ===== | ||
| + | |||
| + | {{:pm:prj2023:vstoica:proiectpm2023.zip|}} | ||
| + | |||
| + | ===== Bibliografie/Resurse ===== | ||
| + | |||
| + | * https://ocw.cs.pub.ro/courses/pm/lab/lab2-2023 | ||
| + | * https://docs.arduino.cc/built-in-examples/digital/Button | ||
| + | * 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> | ||