Differences

This shows you the differences between two versions of the page.

Link to this comparison view

pm:prj2023:vstoica:marinela-cotoi [2023/05/18 13:38]
victorita.cotoi
pm:prj2023:vstoica:marinela-cotoi [2023/05/29 10:47] (current)
victorita.cotoi
Line 4: Line 4:
 Jocul este de tip "​endless runner"​ și implică un dinozaur ce trebuie să se ferească de o serie de obstacole pentru a supraviețui si pentru a obtine puncte. Jocul este de tip "​endless runner"​ și implică un dinozaur ce trebuie să se ferească de o serie de obstacole pentru a supraviețui si pentru a obtine puncte.
  
-{{:​pm:​prj2023:​vstoica:​game-gif.gif?​400|}}+{{:​pm:​prj2023:​vstoica:​game-gif.gif?​500|}}
  
 ===== Descriere generală ===== ===== Descriere generală =====
-==== Hardware design ====+=== 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. 
 + 
 +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|}} 
 + 
 +Fotorezistorii vor fi lipiți la o distanță mică de dinozaur, pe ecranul laptopului. În momentul în care un obstacol se apropie, fotorezistorii vor detecta schimbarea luminii, și vor trimite semnalul către placa Arduino. Cum obstacolul este un copac, servomotorul va efectua o săritură apăsând butonul "​space"​ de pe tastatură. Această acțiune va fi repetată în mod automat pe durata întregului joc, fără intervenția utilizatorului. Proiectul poate fi extins pentru a identifica și alte obstacole din joc și pentru a le evita automat.  
 + 
 +{{:​pm:​prj2023:​vstoica:​final_mc.jpeg?​600|}} 
 + 
 +=== Schemă bloc === 
 +{{:​pm:​prj2023:​vstoica:​86f708dc-0846-4423-9a68-00f770b18258.png?​500|}} 
 + 
 +===== Hardware design ===== 
 + 
 +=== Componente hardware ​===
 Componentele necesare în dezvoltarea proiectului sunt următoarele:​ Componentele necesare în dezvoltarea proiectului sunt următoarele:​
   * **Servomotor** - acesta va simula acțiunile unui jucător. Mai exact, va apăsa butonul '​space'​ al tastaturii laptopului în anumite momente ale jocului, atunci când se apropie un obstacol.   * **Servomotor** - acesta va simula acțiunile unui jucător. Mai exact, va apăsa butonul '​space'​ al tastaturii laptopului în anumite momente ale jocului, atunci când se apropie un obstacol.
Line 13: Line 29:
   * **Fotorezistor** - pentru identificarea obstacolelor din joc   * **Fotorezistor** - pentru identificarea obstacolelor din joc
 {{:​pm:​prj2023:​vstoica:​fotorezistor.png?​200|}} {{:​pm:​prj2023:​vstoica:​fotorezistor.png?​200|}}
-  * **Ecran LCD - Afișaj electronic pe două rânduri** - pentru afișarea de mesaje în timpul jocului.+  * **Ecran LCD - Afișaj electronic pe două rânduri** - pentru afișarea de mesaje în timpul jocului, precum și la începutul acestuia
 {{:​pm:​prj2023:​vstoica:​ecran.jpg?​200|}} {{:​pm:​prj2023:​vstoica:​ecran.jpg?​200|}}
   * **Plăcuță Arduino Uno**   * **Plăcuță Arduino Uno**
   * **Breadboard**   * **Breadboard**
-  * **Rezistențe,​ Fire**+  * **Rezistențe,​ Fire, Buton**
  
-==== Flow proiect ​==== +=== Schema electrică === 
-Proiectul nostru presupune utilizarea fotorezistorilor pentru ​identifica obstacolele din joc. Aceștia vor fi lipiți ​la o distanță mică de dinozaur, pe ecranul laptop-uluiÎn momentul în care un obstacol se apropiefotorezistorii vor detecta schimbarea luminii și vor trimite semnalul ​tre placa ArduinoCum obstacolul ​este un copacservomotorul va efectua ​o săritură ​apăsând butonul ​"space" ​de pe tastaturăAceastă acțiune ​va fi repetată în mod automat pe durata întregului jocfără intervenția utilizatoruluiProiectul poate fi extins pentru ​identifica ​și alte obstacole din joc și pentru a le evita automat+{{:​pm:​prj2023:​vstoica:​schema-electrica.png?​600|}} 
 + 
 +===== Software design ​===== 
 + 
 +Pentru ​simula începerea jocului ​la apăsarea butonuluiam 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; 
 +  } 
 +
 + 
 +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 ​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-ulcu 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-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>​
  
-{{:​pm:​prj2023:​vstoica:​86f708dc-0846-4423-9a68-00f770b18258.png?​500|}} 
pm/prj2023/vstoica/marinela-cotoi.1684406285.txt.gz · Last modified: 2023/05/18 13:38 by victorita.cotoi
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0