7. Páka S Ř-duino

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
Zapojení

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