Skip to content

The vibing robot

Martin Robomaze edited this page Jun 8, 2021 · 9 revisions

Pred určitým časom vznikol jeden zaujímavý hudobný meme - The vibing cat. V tomto návode naučíme robota tancovať po vzore vibing catu. Program si vytvoríme podľa tohto návodu. Tento návod nadväzuje na skúsenosti z predchádzajúceho návodu. Na konci nájdete hotový program.

Začiatok programu

Predtým, než začneme písať samotný program, budeme musieť pridať knižnice. Pre tento program ich budeme potrebovať päť:

// Kniznice pre srobka.
#include <Arduino.h>
#include <robot/speaker.h>
#include <robot/types.h>
#include <robot/motors.h>
#include <robot/tones.h>

Následne zadefinujeme globálne premenné - premenné, ktoré budú prístupné v celom programe:

// Noty "Ievan Polkky".
int tones[] = {AS3, AS3, DS4, DS4, F4, FS4, DS4, DS4, FS4, F4, CS4, CS4, F4, FS4, DS4, DS4, AS3, AS3, DS4, DS4, F4, FS4, DS4, DS4, FS4, AS4, GS4, FS4, F4, FS4, DS4, DS4};
int bpm = 130;

// Pozicia hlava hore.
HeadPosition headUp;
// Pozicia hlava dole.
HeadPosition headDown;
Motors motors;
Speaker speaker;

Najprv si vytvoríme pole tones, ktoré obsahuje názvy všetkých tónov.
Head position je premenná, ktorá uchováva pozíciu hlavy. Vytvorili sme ju dvakrát, lebo v programe budeme striedať medzi dvoma pozíciami. Motors je trieda, ktorá ovláda motory a Speaker má zas na starosti ovládanie reproduktora.

Setup

Funkcia void setup() sa spustí iba raz, pri zapnutí programu. V nej nastavíme správne hodnoty pre pozície hlavy:

void setup() {
    // Nastavenie pozicii hlava hore a hlava dole.
    headUp.headY = 90;
    headDown.headY = 0;
}

headX nenastavujeme, lebo v prípade, ak nezadáme nič, tak to s hlavou v danej osi nepohne.

Rozzvučanie hudby

Na prehrávanie hudby použijeme veci, ktoré sme si už predtým definovali. speaker nám bude ovládať reproduktor, pole tones mu zas povie, čo má zahrať. Pomocou bpm si vypočítame potrebnú dĺžku tónu v milisekudnách. Na to, aby sme postupne prehrávali tóny z poľa použijeme cyklus for. Okrem toho budeme potrebovať hýbať hlavou, na to nám poslúžia dve podmienky, if a else if, jedna bude hlavu posúvať dole a druhá hore.

Celé to napíšeme do funkcie void loop() aby sa tanec opakoval a vznikne nám toto:

void loop() {
    // Opakuj 32 krat.
    for (int i = 0; i < 32; i++) {
        // Dlzka tonu - 1 sekunda / 8 * takt.
        int toneDuration = 1000 / (bpm * 8);
        // Hraj notu.
        speaker.play(tones[i], toneDuration);

        // Ak je i nasobok 8.
        if (i % 8 == 0) {
            // Pohni hlavu hore.
            motors.moveHead(headUp);
        } 
        // Ak je i nasobok 4.
        else if (i % 4 == 0) {
            // Pohni hlavu dole.
            motors.moveHead(headDown);
        }

        delay(toneDuration);
    }
}

Celý program

// Kniznice pre srobka.
#include <Arduino.h>
#include <robot/speaker.h>
#include <robot/types.h>
#include <robot/motors.h>
#include <robot/tones.h>

// Noty "Ievann Polkky".
int tones[] = {AS3, AS3, DS4, DS4, F4, FS4, DS4, DS4, FS4, F4, CS4, CS4, F4, FS4, DS4, DS4, AS3, AS3, DS4, DS4, F4, FS4, DS4, DS4, FS4, AS4, GS4, FS4, F4, FS4, DS4, DS4};
int bpm = 130;

// Pozicia hlava hore.
HeadPosition headUp;
// Pozicia hlava dole.
HeadPosition headDown;
Motors motors;
Speaker speaker;

void setup() {
    // Nastavenie pozicii hlava hore a hlava dole.
    headUp.headY = 90;
    headDown.headY = 0;
}

void loop() {
    // Opakuj 32 krat.
    for (int i = 0; i < 32; i++) {
        // Dlzka tonu - 1 sekunda / 8 * takt.
        int toneDuration = 1000 / (bpm * 8);
        // Hraj notu.
        speaker.play(tones[i], toneDuration);

        // Ak je i nasobok 8.
        if (i % 8 == 0) {
            // Pohni hlavu hore.
            motors.moveHead(headUp);
        } 
        // Ak je i nasobok 4.
        else if (i % 4 == 0) {
            // Pohni hlavu dole.
            motors.moveHead(headDown);
        }

        delay(toneDuration);
    }
}

Clone this wiki locally