Differences

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

Link to this comparison view

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 dezvoltareArduino 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 isset 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>​
  
pm/prj2023/vstoica/marinela-cotoi.1685289971.txt.gz · Last modified: 2023/05/28 19:06 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