Właściciele kotów doskonale wiedzą jak skutecznie budzi kot który po nas skacze. Zjawisko to jest podstawą działania naszego budzika, który o zadanym czasie uruchamia laser który porusza się tak, by jego ślad poruszał się po powierzchni kołdry osoby śpiącej. Dziś zbudujemy element wykonawczy budzika – głowicę laserową która będzie poruszana dwoma serwomechanizmami.
Do wykonania budzika potrzebujemy oprócz modułu Arduino także dwóch serwomechanizmów i lasera. Przydatny będzie także ‘Sensor shield’ która to płytka posiada wyprowadzenia wszystkich wejść/wyjść w postaci trójpinowych złącz zawierających oprócz linii danych także zasilanie i masę. Do takiej płytki możemy podłączyć bezpośrednio serwomechanizmy ograniczając liczbę połączeń do minimum. Sam laser podłączymy bezpośrednio do zasilania, ponieważ nasz układ będzie jedynie elementem wykonawczym budzika który może być również używany samodzielnie jako kocia zabawka.
Na początek musimy przygotować mechanikę naszego urządzenia. Jeden z serwomechanizmów musimy przymocować do podłoża – na przykład do płytki prototypowej lub kawałka blachy (dobre są blaszki które kiedyś Impost dodawał do listów żeby zwiększyć ich wagę). Serwomechanizm możemy przykręcić ale znacznie prościej będzie przykleić go używając dwustronnej taśmy montażowej lub dwóch gumek recepturek. Serwomechanizm mocujemy tak, by jego oś była umieszczona pionowo. Po założeniu orczyka, mocujemy do niego drugi serwomechanizm przyklejając bok obudowy do orczyka pierwszego serwomechanizmu. Na oś drugiego serwa zakładamy orczyk do którego mocujemy laser. Mocowanie możemy wykonać „na stałe” klejąc klejem epoksydowym, lub tymczasowo – stosując taśmę dwustronną. Poruszając osiami poszczególnych serwomechanizmów możemy obracać laserem w dwóch osiach.

Przewody zasilające serwomechanizmy oraz laser łączymy z sensor shieldem założonym na płytkę Arduino. W przedstawionym modelu serwomechanizmy zostały podłączone do wyjść 10 i 11, a przewód zasilający laser do pinów zasilających znajdujących się przy wyjściu 12.
Teraz pora na przygotowanie programu poruszającego serwomechanizmami. Nie musimy samodzielnie pisać obsługi serw (choć nie jest to trudne). Wystarczy użyć biblioteki „Servo.h” i zadeklarować obiekty odpowiadające naszym serwomechanizmom:
#include <Servo.h>
Servo serwoX;
Servo serwoY;
Potrzebujemy też zmiennych które będą pamiętać bieżące położenie osi a także zestaw stałych określających minimalne i maksymalne wychylenia. Moglibyśmy je umieścić bezpośrednio w kodzie, jednak ewentualne poprawki byłyby później trudniejsze.
byte x;
byte y;
const byte maxX = 100;
const byte minX = 80;
const byte maxY = 100;
const byte minY = 80;
W funkcji setup musimy zainicjować obiekty pozwalające na sterowanie serwomechanizmami - musimy podać do których wyprowadzeń zostały one podłączone. Także tutaj zainicjujemy początkowe położenie:
void setup() {
serwoX.attach(11);
serwoY.attach(10);
x=90;
y=90;
}
Serwomechanizmami będziemy poruszać w funkcji loop zmieniając położenie osi w sposób losowy.
Do losowania w środowisku Arduino służy funkcja random zwracająca liczbę losową z zadanego przedziału. Przy kolejnych wywołaniach tej funkcji losujemy kolejne liczby.
Losując nowe położenia lepiej będzie losować ich zmianę niż nowe położenie. W ten sposób ruch będzie stosunkowo płynny. Możemy wylosować liczbę i przełożyć ja na azymut w którym poruszy się promień lasera, możemy wylosować w którym z czterech kierunków powinniśmy zrobić krok, albo losować niezależnie zmianę o jedne krok w kierunku X i Y jak w przykładzie poniżej:
void loop() {
delay(50);
serwoX.write(x);
serwoY.write(y);
switch(random(3)) {
case 0:
--x;
if (x<minX) x = minX;
break;
case 2:
++x;
if (x>maxX) x = maxX;
break;
}
switch(random(3)) {
case 0:
--y;
if (y<minY) y = minY;
break;
case 2:
++y;
if (y>maxY) y = maxY;
break;
}
}
Zadanie
Proszę poprawić program tak by w każdym kroku losowany był jeden z czterech kierunków. Dla zaawansowanych – losować azymut i przeliczać go na przesunięcie w kierunkach X i Y (wymaga pamiętania położenia jako liczb zmiennoprzecinkowych).