Close

Arduino robot RedBot #6: Tlačítko start a první „slova“

Tlačítko na Arduino robotovi RedBot

V posledním díle jsme naučili robota RedBot otáčet se. Představený program měl ale jednu nepříjemnou vlastnost. Hned po nahrání programu se totiž robot začal pohybovat. Dnes si ukážeme, jak se dá použít tlačítko dostupné na robotovi ke spuštění programu. A k tomu všemu také robota naučíme vydávat pípavé zvuky. Bzučák, kterým budeme zvuky vydávat je součástí kitu SparkFun Inventor’s Kit for RedBot.

Začneme tím, že otevřeme následující program (File > Examples > SparkFun RedBot Library > Exp4_1_MakingSounds) a nahrajeme si jej do RedBota.

#include <RedBot.h>
RedBotMotors motors;

// Create a couple of constants for our pins.
const int buzzerPin = 9;
const int buttonPin = 12;

void setup()
{
  pinMode(buttonPin, INPUT_PULLUP); // nastaví tlačítko jako vstup
  // výchozí hodnota u INPUT_PULLUP je HIGH.
  pinMode(buzzerPin, OUTPUT);  // nastaví pin bzučáku jako výstup
}

void loop()
{ 
  if ( digitalRead(buttonPin) == LOW ) // pokud je tlačítko stisknuto (LOW)
  { 
    tone(buzzerPin, 1000);   // přehrávej tón o frekvenci 1kHz
    delay(125);   // čekej 125ms 
    noTone(buzzerPin);   // zastav přehrávání

    tone(buzzerPin, 2000);  // přehrávej tón o frekvenci 2kHz

    motors.drive(255);     // zapni motory (nárazníky je mohou zastavit)
    delay(1000);   // počkej 1000 ms (1 s)

    noTone(buzzerPin);       // vypni zvuk
    motors.brake();          // zastaví motory
  }
  else  // jinak udělej následující
  { 
  }
}

Co by se mělo dít?

Robot by měl po stisku tlačítka D12 (vedle USB konektoru) začít pípat a kola by se měla začít otáčet.

Tlačítko na Arduino robotovi RedBot

Tlačítko

Důležité části kódu

Funkce tone(pin, frekvence) přehrává tón dané frekvence na určeném pinu. Jelikož je proměnná buzzerPin nastavena na hodnotu 9, můžeme použít funkci tone() k přehrávání různých tónu na připojeném bzučáku. Namísto použití LED jako indikátoru tak dostáváme od robota zvukovou zpětnou vazbu, takže víme, co v daný moment dělá. Toto je způsob, jak se dají ladit problémy s kódem jen za pomoci zvuku!

tone(buzzerPin, 1000);

Funkce noTone(pin) pak zastaví přehrávání tónu na zadaném pinu.

noTone(buzzerPin);

Naučte se více

Zvuk je ve skutečnosti podélná vlna, způsobená vibracemi (stlačením a roztažením) částic ve vzduchu. Arduino vytváří zvuk tak, že na pinu generuje čtvercovou vlnu dané frekvence. Bzučák na tuto vlnu reaguje tak, že pohybuje vzduchem tam a zpět, čímž vytváří zvuk. Jelikož čtvercová vlna není ani zdaleka podobná sinusoidě, uslyšíme v tónu i vyšší harmonické frekvence základní frekvence.

Seznam tónů a jim odpovídající frekvence naleznete zde. Umíte sestavit z tónů jednoduchou hudební stupnici? (Nápověda: Stupnice C-dur je nejjednodušší, protože neobsahuje žádné křížky, ani béčka).

Lidský sluch je většinou schopný rozlišit frekvence v rozsahu 20 Hz až 20000 Hz. Umíte najít váš maximální rozsah? Poznámka: Piezo bzučák má problém s nízkými frekvencemi.

Seznam tónů a jejich frekvencí

Nemůžete si zapamatovat, jakému tónu odpovídá jaká frekvence? Podívejte se na příklad File > Examples > SparkFun RedBot Library > Exp4_2_Music, nebo si zkopírujte kód níže.

#include "notes.h"  // jednotlivé tóny a jejich frekvence jsou popsané v souboru notes.h

#include <RedBot.h> 
RedBotMotors motors;

const int buzzerPin = 9;
const int buttonPin = 12;

void setup()
{
  pinMode(buttonPin, INPUT_PULLUP);
  pinMode(buzzerPin, OUTPUT);
}

void loop()
{
  if(digitalRead(buttonPin) == LOW)
  {
    playTwinkleTwinkle();
  }
}

void playTwinkleTwinkle()
{
  playNote(noteC4, QN);
  playNote(noteC4, QN);
  
  playNote(noteG4, QN);    
  playNote(noteG4, QN);  

  playNote(noteA4, QN);    
  playNote(noteA4, QN);  

  playNote(noteG4, HN);
 
  playNote(noteF4, QN);    
  playNote(noteF4, QN);  

}

void playSmallWorld()
{ 
  playNote(noteG5, HN+QN);
  playNote(noteG5, QN);
  playNote(noteB5, HN);
  playNote(noteG5, HN);
  playNote(noteA5, HN+QN);
  playNote(noteA5, QN);
  playNote(noteA5, HN+QN);
  playNote(Rest, QN);
  playNote(noteA5, HN+QN);
  playNote(noteA5, QN);
  playNote(noteC6, HN);
  playNote(noteA5, HN);
  playNote(noteB5, HN+QN);
  playNote(noteB5, QN);
  playNote(noteB5, HN+QN);
  playNote(Rest, QN);
  playNote(noteB5, HN+QN);
  playNote(noteB5, QN);
  playNote(noteD6, HN);
  playNote(noteB5, HN);
  playNote(noteC6, HN+QN);
  playNote(noteC6, QN);
  playNote(noteC6, HN);
  playNote(noteB5, QN);
  playNote(noteA5, QN);
  playNote(noteD5, WN);
  playNote(noteFs5, WN);
  playNote(noteG5, WN);
}

void playNote(int note, int duration)
// Tato funkce má dva parametry - jméno tónu a dobu trvání. To nám usnadní přehrávání melodie.
// Doba trvání je dána pomocí konstant: HN = poloviční nota, QN = čtvrťová, EN = osminová, SN = šestnáctinová.
{
  tone(buzzerPin, note, duration);
  delay(duration);
}

Pokud jste kód kopírovali z webu, vytvořte si také novou záložku (tab). V pravé horní části Arduino IDE je tlačítko s šipkou dolů, na které když klikneme, zobrazí se nabídka s možností New Tab. Na ni klikneme a nový soubor nazveme notes.h. Ten bude obsahovat mj. definici jednotlivých tónů s jejich frekvencemi.

#define beatLength 200  // # of milliseconds per beat

// Define the length of each note
#define WN   beatLength*4  // ...a whole note...
#define HN   beatLength*2  // ...a half note...
#define QN   beatLength    // ...a quarter note...
#define EN   beatLength/2  // ...an eighth note...
#define SN   beatLength/4  // ...and a sixteenth note.

// These are pre-written #defines for every note on a piano
#define Rest 0
#define noteC0 16
#define noteCs0 17
#define noteDb0 17
#define noteD0 18
#define noteDs0 19
#define noteEb0 19
#define noteE0 21
#define noteF0 22
#define noteFs0 23
#define noteGb0 23
#define noteG0 25
#define noteGs0 26
#define noteAb0 26
#define noteA0 28
#define noteAs0 29
#define noteBb0 29
#define noteB0 31
#define noteC1 33
#define noteCs1 35
#define noteDb1 35
#define noteD1 37
#define noteDs1 39
#define noteEb1 39
#define noteE1 41
#define noteF1 44
#define noteFs1 46
#define noteGb1 46
#define noteG1 49
#define noteGs1 52
#define noteAb1 52
#define noteA1 55
#define noteAs1 58
#define noteBb1 58
#define noteB1 62
#define noteC2 65
#define noteCs2 69
#define noteDb2 69
#define noteD2 73
#define noteDs2 78
#define noteEb2 78
#define noteE2 82
#define noteF2 87
#define noteFs2 93
#define noteGb2 93
#define noteG2 98
#define noteGs2 104
#define noteAb2 104
#define noteA2 110
#define noteAs2 117
#define noteBb2 117
#define noteB2 123
#define noteC3 131
#define noteCs3 139
#define noteDb3 139
#define noteD3 147
#define noteDs3 156
#define noteEb3 156
#define noteE3 165
#define noteF3 175
#define noteFs3 185
#define noteGb3 185
#define noteG3 196
#define noteGs3 208
#define noteAb3 208
#define noteA3 220
#define noteAs3 233
#define noteBb3 233
#define noteB3 247
#define noteC4 262
#define noteCs4 277
#define noteDb4 277
#define noteD4 294
#define noteDs4 311
#define noteEb4 311
#define noteE4 330
#define noteF4 349
#define noteFs4 370
#define noteGb4 370
#define noteG4 392
#define noteGs4 415
#define noteAb4 415
#define noteA4 440
#define noteAs4 466
#define noteBb4 466
#define noteB4 494
#define noteC5 523
#define noteCs5 554
#define noteDb5 554
#define noteD5 587
#define noteDs5 622
#define noteEb5 622
#define noteE5 659
#define noteF5 698
#define noteFs5 740
#define noteGb5 740
#define noteG5 784
#define noteGs5 831
#define noteAb5 831
#define noteA5 880
#define noteAs5 932
#define noteBb5 932
#define noteB5 988
#define noteC6 1047
#define noteCs6 1109
#define noteDb6 1109
#define noteD6 1175
#define noteDs6 1245
#define noteEb6 1245
#define noteE6 1319
#define noteF6 1397
#define noteFs6 1480
#define noteGb6 1480
#define noteG6 1568
#define noteGs6 1661
#define noteAb6 1661
#define noteA6 1760
#define noteAs6 1865
#define noteBb6 1865
#define noteB6 1976
#define noteC7 2093
#define noteCs7 2217
#define noteDb7 2217
#define noteD7 2349
#define noteDs7 2489
#define noteEb7 2489
#define noteE7 2637
#define noteF7 2794
#define noteFs7 2960
#define noteGb7 2960
#define noteG7 3136
#define noteGs7 3322
#define noteAb7 3322
#define noteA7 3520
#define noteAs7 3729
#define noteBb7 3729
#define noteB7 3951
#define noteC8 4186
#define noteCs8 4435
#define noteDb8 4435
#define noteD8 4699
#define noteDs8 4978
#define noteEb8 4978

Tento příklad zahraje po stisku tlačítka D12 začátek melodie „Sviť mi, sviť mi, hvězdičko“. Pro jednodušší ovládání melodie jsme si vytvořili funkci playNote(). Soubor notes.h obsahuje definice not a také délek trvání. Jedná se o tzv. hlavičkový soubor, který většinou obsahuje definice konstant a proměnných použitých v kódu.

Jakou melodii si složíte vy? Zkuste vymyslet znělku pro vašeho RedBota 🙂

Přeloženo z https://learn.sparkfun.com/tutorials/experiment-guide-for-redbot-with-shadow-chassis/experiment-4-push-to-start–making-sounds-sik a mírně upraveno.
Původní text je licencován pod CC BY-NC-SA 3.0.

Zbyšek Voda

Zbyšek Voda

Už nějaký čas se zajímám o věci kolem Internetu věcí a otevřeného hardware a software. Tak jsem se také v roce 2010 dostal k Arduinu, pro které dodnes programuji a taky píšu články o práci s ním. Baví mě vymýšlet, jak staré věci používat novým způsobem.
Zbyšek Voda

Latest posts by Zbyšek Voda (see all)

Napsat komentář