Při práci s Arduinem a servomotory je důležité pochopit, jak správně naprogramovat a zapojit komponenty, aby se vaše zařízení chovalo podle očekávání. V této kapitole si vysvětlíme, jak nastavit základní skicu pro ovládání servomotoru, jak reagovat na případné chyby při kompilaci a jak přejít k pokročilejším interakcím, například řízení serva pomocí potenciometru.

Po napsání a otevření vaší skici je nutné zkontrolovat správnost kódu stisknutím tlačítka „Compile“. Pokud v kódu existují syntaktické chyby, kompilátor je zvýrazní červeně v okně zpráv. Jakmile je kód správně zkompilován, můžete kliknout na tlačítko „Upload“ a nahrát skicu na Arduino desku. Po úspěšném nahrání by měl servomotor začít vykonávat pohyb zpětně a dopředu po 180 stupních, vytvářejíc tak efekt „tančení“ na stole. Pokud se nic nestane, je třeba zkontrolovat zapojení komponent:

✓ Ujistěte se, že používáte pin 9 pro datovou (bílou/žlutou) linku.
✓ Zkontrolujte, zda jsou ostatní vodiče servomotoru připojeny k odpovídajícím pinům na Arduinu.

Skica „Sweep“ obsahuje knihovnu pro servomotory, která značně usnadňuje práci s těmito zařízeními. Tato knihovna je součástí Arduina a nabízí jednoduché rozhraní pro ovládání serv. Na začátku skici je deklarována knihovna Servo, která pomáhá při řízení servomotoru, a následně se vytváří objekt servomotoru nazvaný „myservo“. Při použití této knihovny můžete jednoduše ovládat pozici serva pomocí funkce write(), která mu říká, kam má jít.

cpp
#include <Servo.h>
Servo myservo; // vytvoření objektu pro ovládání servomotoru int pos = 0; // proměnná pro uložení pozice servomotoru

V metodě setup() se pouze připojí servo k pinu 9 pomocí funkce myservo.attach(9). Poté v hlavní smyčce (loop()) probíhá cyklus, který postupně zvyšuje hodnotu proměnné pos od 0 do 180 a pomocí funkce myservo.write(pos) posílá nové hodnoty servu. Tento pohyb je pomalý, protože mezi každým krokem je zpoždění 15 milisekund, což umožňuje servu dostat se na požadovanou pozici.

cpp
void loop() { for (pos = 0; pos < 180; pos++) { myservo.write(pos); delay(15); } for (pos = 180; pos >= 0; pos--) { myservo.write(pos); delay(15); } }

Tato skica je základním příkladem, jak ovládat servomotor, a slouží k ověření, zda je servo funkční. Dalším krokem je přejít k interaktivnímu ovládání serva, například pomocí potenciometru.

Pro ovládání serva pomocí potenciometru je nutné připojit potenciometr k analogovému vstupu na Arduinu, obvykle na pin A0. Potenciometr funguje jako variabilní odpor, jehož hodnotu lze měřit mezi 0 a 1023. Tato hodnota je následně mapována na rozsah od 0 do 179, což odpovídá možným pozicím serva v rozsahu 0 až 180 stupňů. Pomocí funkce analogRead() čteme hodnotu potenciometru a pomocí funkce map() ji přizpůsobujeme potřebnému rozsahu.

cpp
#include <Servo.h>
Servo myservo; int potpin = 0; // analogový pin pro potenciometr int val; // proměnná pro uložení hodnoty z potenciometru void setup() { myservo.attach(9); // připojí servo k pinu 9 } void loop() { val = analogRead(potpin); // čte hodnotu potenciometru val = map(val, 0, 1023, 0, 179); // mapuje hodnotu na rozsah pro servo myservo.write(val); // nastaví pozici serva delay(15); // čeká na dosažení požadované pozice }

Pokud skica nefunguje, jak očekáváte, je třeba zkontrolovat:

✓ Použití správného pinu pro datovou linku (pin 9 pro servo).
✓ Správné připojení potenciometru k pinu A0.
✓ Zajištění správného zapojení na breadboardu, protože nesprávné připojení může způsobit problémy.

Tento příklad ukazuje, jak snadno ovládat servo pomocí analogového senzoru a rozšiřuje možnosti interakce s vaší elektronikou. Je to ideální způsob, jak začít s experimentováním s analogovými vstupy a ovládáním servomotorů v reálném čase.

Je důležité si uvědomit, že při práci s Arduinem a servomotory může být nutné experimentovat s hodnotami, které slouží k řízení pozice serva, a vyzkoušet různé způsoby, jak dosáhnout co nejlepšího výsledku. V praxi může být potřeba upravit rozsah hodnot, které jsou mapovány, nebo změnit parametry zpoždění mezi jednotlivými kroky pro plynulejší pohyb serva. Také se ujistěte, že máte dostatečné napájení pro servo, zejména při použití více zařízení nebo při intenzivní zátěži, aby nedošlo k přetížení zdroje napájení.

Jak vytvořit jednoduchý nástroj pomocí Arduina: Případová studie Thereminu

V předchozí části jsme se zabývali tím, jak můžete použít Arduino k přehrávání melodie, místo aby se světlo blikalo. Tento přístup ukazuje, jak může zvukový signál být cennější než vizuální indikace, pokud je projekt umístěn mimo zorné pole uživatele. Tento přístup je užitečný například v případě, kdy chcete potvrdit stav zařízení nebo upozornit na událost, aniž by bylo nutné vizuálně vnímat změnu, jako je blikání LED diody. Tento princip však lze posunout ještě dál a vytvořit skutečný zvukový nástroj. Tento nástroj nemusí být složitý; můžeme se inspirovat například elektronickým nástrojem Theremin, který patří mezi nejstarší elektronická hudební zařízení.

Theremin, jehož vynálezcem je Leon Theremin, se začal vyvíjet ve 20. letech minulého století a byl revolučním nástrojem, protože umožňoval ovládání hudby bez fyzického kontaktu – změníte tón pouze pohybem ruky v elektromagnetickém poli. Tento způsob interakce s hudebním nástrojem se ukázal jako fascinující nejen pro vědecký svět, ale i pro umělecký. V této části ukážeme, jak si můžete vytvořit velmi jednoduchý a cenově dostupný "Theremin" s pomocí Arduina, piezoelektrického bzučáku a světelného senzoru.

Pro tento projekt budete potřebovat:

  • Arduino Uno

  • Prototypovací desku (breadboard)

  • Piezo bzučák

  • Světelný senzor (photoresistor)

  • 4,7kΩ rezistor

  • Propojovací kabely

Tento obvod se skládá ze dvou částí: piezo bzučák je propojen s digitálním pinem 8, zatímco světelný senzor je připojen k analogovému pinu 0. 4,7kΩ rezistor je zapojen mezi analogový pin 0 a zem. Tento obvod vám umožní ovládat výšku tónu podle intenzity světla, které dopadá na světelný senzor. Když senzor pokryjete rukou, změní se tón, což simuluje změnu výšky, jak by to dělalo u Thereminu.

Kód, který si k tomu připravíte, je jednoduše konvertuje hodnoty ze senzoru na frekvenci, která je přenášena na piezo bzučák. Tento kód překlenuje rozsah hodnot z analogu na frekvence, které bzučák zvládne reprodukovat. Jakmile je kód nahrán do Arduina, můžete si vychutnat jednoduchý hudební nástroj, který reaguje na světlo a umožňuje hráči vytvářet zvuky bez nutnosti fyzického kontaktu.

Kód vypadá následovně:

cpp
void setup() { Serial.begin(9600); // inicializace sériové komunikace pro ladění } void loop() { int sensorReading = analogRead(A0); // čtení hodnoty z světelného senzoru Serial.println(sensorReading); // tisk hodnoty pro zobrazení v sériovém monitoru int thisPitch = map(sensorReading, 400, 1000, 100, 1000); // převod hodnoty na frekvenci
tone(8, thisPitch, 10); // přehrání tónu s určitou frekvencí
delay(1); // malý zpoždění pro stabilitu měření }

Tento kód čte hodnoty ze senzoru, které se pak mapují na rozsah frekvencí, jež může bzučák přehrát. Funkce tone() přehrává tento tón po dobu 10 milisekund. Tento přístup umožňuje hladkou změnu výšky tónu, což je charakteristické pro nástroje jako Theremin.

Pokud při testování kódu nebudete slyšet žádnou změnu tónu, ujistěte se, že máte dostatečné osvětlení, nebo zkuste použít jiný zdroj světla. Pokud problém přetrvává, zkontrolujte zapojení drátů a komponent.

Tento příklad ukazuje, jak se jednoduchými prostředky pomocí Arduina můžete dostat k zajímavým výsledkům v oblasti elektronické hudby. Ačkoliv je tato verze Thereminu jednoduchá, představuje solidní základ pro další experimenty a zdokonalení tohoto typu nástroje.

Pokud budete chtít tento projekt posunout dále, můžete začít experimentovat s různými senzory nebo přidat další ovládací prvky, jako jsou potenciometry nebo tlačítka, pro další manipulaci s tónem nebo intenzitou zvuku. Také se můžete zaměřit na vylepšení samotného bzučáku, například přidáním většího počtu piezoelektrických prvků nebo použitím složitějšího zvukového generátoru pro širší paletu zvuků.

Jak vytvořit graf z analogového vstupu s Arduino a Processing

Pro vytvoření grafu, který zobrazuje hodnoty z analogového vstupu na desce Arduino, je nutné propojit hardware i software. Tento proces zahrnuje nejen správné zapojení, ale také napsání kódu pro Arduino i Processing, který umožní vizualizaci měřených dat v reálném čase.

Prvním krokem je sestavení elektronického obvodu. Potenciometr, který bude sloužit jako analogový senzor, je připojen k analogovému vstupu 0 na desce Arduino. Střední pin potenciometru je připojen k tomuto vstupu, zatímco dva zbývající piny jsou propojeny s napájením 5V a zemí (GND). V případě potřeby lze směrování hodnot, které potenciometr odesílá, obrátit přepojením těchto dvou pinů, čímž se změní směr otáčení, ve kterém potenciometr bude vykazovat změny.

Po sestavení obvodu je dalším krokem napsání správného kódu pro Arduino. Tento kód bude pravidelně číst hodnoty z analogového vstupu a posílat je přes sériovou komunikaci do počítače. Následující Arduino kód umožňuje odesílání hodnoty z analogového vstupu 0:

cpp
void setup() {
// inicializace sériové komunikace Serial.begin(9600); } void loop() { // odeslání hodnoty z analogového vstupu 0 Serial.println(analogRead(A0)); // krátké zpoždění pro stabilizaci analogu na digitální hodnoty delay(2); }

Tento kód pravidelně odesílá hodnoty mezi 0 a 1023, které odpovídají napětí na analogovém pinu, do sériového portu. Data jsou pak použita v Processing kódu pro vykreslení grafu, který vizualizuje změny hodnoty během času.

Pokud chcete zobrazit tyto hodnoty v grafické podobě na obrazovce, je potřeba spustit sketch v Processing, který přijímá data ze sériového portu a zobrazuje je v reálném čase. Kód v Processing může vypadat následovně:

java
import processing.serial.*; Serial myPort; // Sériový port
int xPos = 1; // Horizontální pozice grafu
void setup() { size(400, 300); // Nastavení velikosti okna println(Serial.list()); // Zobrazení dostupných sériových portů myPort = new Serial(this, Serial.list()[0], 9600); // Otevření sériového portu myPort.bufferUntil('\n'); // Čekání na nový řádek pro zahájení příjmu background(0); // Nastavení počátečního pozadí na černou } void draw() { // Všechno se děje v metodě serialEvent } void serialEvent(Serial myPort) { String inString = myPort.readStringUntil('\n'); if (inString != null) { inString = trim(inString); // Odstranění mezer float inByte = float(inString);
inByte = map(inByte, 0, 1023, 0, height); // Mapování hodnoty na výšku obrazovky
stroke(
127, 34, 255); // Nastavení barvy čáry na fialovou line(xPos, height, xPos, height - inByte); // Kreslení čáry if (xPos >= width) { xPos = 0; // Pokud se dostaneme na konec obrazovky, začneme znovu background(0); // Resetování pozadí } else { xPos++; // Posunutí na další pozici v horizontálním směru } } }

Po spuštění tohoto kódu se objeví okno, ve kterém se začne vykreslovat fialový graf, který zobrazuje hodnoty z potenciometru. Jak otáčíte potenciometrem, graf reaguje na změny hodnoty v reálném čase. Když graf dosáhne pravého okraje obrazovky, vrátí se na začátek a začne znovu.

Pokud graf nefunguje, zkontrolujte několik věcí:

  • Správné zapojení pinu na Arduino (analogový pin 0).

  • Ověřte, že potenciometr je zapojen správně, tzn. že piny 5V a GND nejsou zaměněny.

  • Ujistěte se, že kód pro Arduino byl správně nahrán a že v kódu Processing neexistují chyby.

Pokud vše funguje správně, měli byste vidět plynule aktualizující se graf, který zobrazuje změny hodnoty analogového vstupu. Tento projekt ukazuje, jak propojit svět hardwaru s vizualizací v reálném čase, což může být užitečné nejen pro hobby projekty, ale i pro tvorbu interaktivních aplikací nebo analytických nástrojů.

V tomto procesu je také důležité si uvědomit, jaká data jsou posílána z Arduino do počítače. Sériová komunikace je základem pro většinu projektů, kde je nutné získávat data z fyzických senzorů. Jakmile jsou data získána, je možné je pomocí software interpretovat a využít pro různé účely – v tomto případě pro grafické zobrazení změn.