7. Páka S Ř-duino

by prokyber in Circuits > Arduino

118 Views, 0 Favorites, 0 Comments

7. Páka S Ř-duino

Snímek obrazovky 2023-12-31 012733.png

Ahoj, v dnešním tutoriálu si naprogramujeme již komplikovanější, ale zato zábavnější projekt. Řeč je o hře pro dva hráče, kterou si můžete zahrát se spolužáky, rodinou, kamarády a nebo s kýmkoliv jiným. Základní myšlenkou celé hry bude otočit nožičku servomotoru na soupeřovu stranu. Můžete si pod tím představit takovou elektrickou hru "páky".

Supplies

  • Ř-duino - zde
  • USB-C - zde
  • Rezistory - zde
  • Nepájivé pole - zde
  • Vodiče - zde
  • Sg90 servo - zde
  • Tlačítka

Zapojení

Snímek obrazovky 2024-01-09 151816.png

Na ovládání serva v tomto tutoriálu si vyhradíme pin 13.

Pro jednoho hráče budeme potřebovat 3 piny. Jeden z nich bude sloužit k čtení, zda bylo tlačítko stisknuto (PlPin). Další pin bude používán k napájení tlačítka (PoPin). PoPin používáme namísto 3.3V z důvodu, abychom jej po dosažení cíle mohli odpojit. Poslední pin používáme pro napájení LED diody hráče (LedPin).

V našem zapojení mají hráči tyto piny:

Hráč 1:

PoPin = 6

PlPin = 2

LedPin = 8

Hráč 2:

PoPin = 10

PlPin = 3

LedPin = 9

Nezapomeňte, že servo potřebuje k fungování napětí 5V.

Kód

Chceme, aby se nám po spuštění programu otáčelo na pozici 90° (prostředek). Následně chceme, aby každé stisknutí tlačítka změnilo pozici o sedm stupňů na příslušnou stranu. V každém cyklu se pak servo otočí na příslušnou pozici. Poté, co pozice překročí 180° nebo klesne pod 0°, tlačítka se odpojí od elektřiny a rozsvítí se vítězova LEDka


POZOR!! - funkce attachInterrupt() funguje pouze na pinech 2 a 3.


A nyní již pojďme psát kód


// Přidáme knihovnu pro ovládání Arduina pro možnost použití kódu na platformě PlatformIO
#include <Arduino.h>
// Přídáme knihovnu pro ovládání Serva
#include <Servo.h>

// Definujeme si na kterých PINech budeme číst tlačítka
#define Player1 2
#define Player2 3

// Definujeme si které PINy nám poští proud do tlačítek
#define PlayerPower1 6
#define PlayerPower2 10

// Definujeme si které PINy aktivují LEDku vítěze
#define PlayerLED1 8
#define PlayerLED2 9


// Vytvoříme si zástupce pro servo
Servo myservo;

// definujeme si proměnou uchovávjící aktuální pozici serva
int pos = 90;


// tyto dvě proměnné nám budou pomáhat zbavit se šumu na tlačítkách
long buttonDebouncePlayer1 = 0;
long buttonDebouncePlayer2 = 0;


void setup() {
  // Přiřadíme Pin pro ovládání serva
  myservo.attach(13);

// Vycentrujeme servo
  myservo.write(pos);


  Serial.begin(9600);


  pinMode(Player1, INPUT);
  pinMode(Player2, INPUT);
  pinMode(PlayerPower1, OUTPUT);
  pinMode(PlayerPower2, OUTPUT);
  pinMode(PlayerLED1, OUTPUT);
  pinMode(PlayerLED2, OUTPUT);

  digitalWrite(PlayerLED1, LOW);
  digitalWrite(PlayerLED2, LOW);
  digitalWrite(PlayerPower1, HIGH);
  digitalWrite(PlayerPower2, HIGH);

  /*
  * Tímto řekneme že pokud nám poklesne napětí na čtecích PINech tak
  * se má okamžitě spustit metoda moveServoPlayer1/2 (FALLING můžeme nahradit RISING
  * a poté se metoda spustí po zvýšení, nebo CHANGE a pak se změní při jakékoliv změně)
  */
  attachInterrupt(digitalPinToInterrupt(Player1), moveServoPlayer1, RISING);
  attachInterrupt(digitalPinToInterrupt(Player2), moveServoPlayer2, RISING);

}


void loop() {


  // Zkontroluje se jestli někdo nevyhrál
  if(pos <= 0 || pos >= 180){

    // Pokud ano tak se "vypnou" napájecí PINy
    digitalWrite(PlayerPower1, LOW);
    digitalWrite(PlayerPower2, LOW);


    // Rozsvítí se vítězova LEDka
    if(pos <= 0)
      digitalWrite(PlayerLED1, HIGH);

    if(pos >= 180)
      digitalWrite(PlayerLED2, HIGH);

  }
}

/*
 * Pokud zmáčkne hráč 1 tlačítko posuň servo 7 stupňů zpět
*/
int moveServoPlayer1()
{


 // funkce millis() vrací aktuální čas
  if((millis() - buttonDebouncePlayer1) > 5)
  {
    pos -= 7;
    buttonDebouncePlayer1 = millis();
    myservo.write(pos);
  }
  return 0;
}

/*
 * Pokud zmáčkne hráč 2 tlačítko posuň servo 7 stupňů vpřed
*/
int moveServoPlayer2()
{
  if((millis() - buttonDebouncePlayer2) > 5)
  {
    pos += 7;
    buttonDebouncePlayer2 = millis();
    myservo.write(pos);
  }
  return 0;
}


Nyní klikněte na "Upload" a máte hotovo :D