DDA для кошки
#include // библиотека сервомашинок#include // библиотека таймера#define laser 7 // лазер включен на этот pin#define led 13 // встроенный в Ардуино светодиод// экспериментально выбираем безопасную зону перемещения пятнаint minv = 85; //10; // крайнее нижнее положение пятнаint maxv = 115; //55; // крайнее верхнееint minh = 90; //45; // крайнее левое, смотреть спередиint maxh = 145; //120; // крайнее правое, смотреть спереди
unsigned long DelayBetweenMovements = 1000; // задержка в мсunsigned long second = 1000; // одна сек. = 1000 мс
Servo myservo_ver; // перемещение по вертикалиServo myservo_hor; // перемещение по горизонтали
void setup (){pinMode (laser, OUTPUT); pinMode (led, OUTPUT); digitalWrite (led, HIGH); ServoOn (); myservo_hor.write ((maxh + minh)/2); // установливаем лазерmyservo_ver.write ((maxv + minv)/2); // в среднее положениеdelay (2000); // и пару секунд смотрим
}
//-Main----------------------------------------------void loop (){randomSeed (analogRead (0)); // инициализация random случайным значением с порта 0int g = random (1,7); // выбираем случайно одно траекторию из семиrandomSeed (analogRead (0)); int tg = random (1,3); // выбираем случайно длительность сеанса 30, 60 или 90 секDelayBetweenMovements = second * random (1,5)/2; // выбираем случайно время перемещения между точками траекторииswitch (g){case 1: GameRandom (tg*30*second); break; case 2: GameFan (tg*30*second); break; case 3: GameFan1(tg*30*second); break; case 4: GameFan2(tg*30*second); break; case 5: GameCorners (tg*30*second); break; case 6: GameSinHor (tg*30*second); break; case 7: GameSinVer (tg*30*second); break;}delay (random (10,60)*second);
}
//-End Main-----------------------------------------
// синусоида вертикальная со случайной амплитудойvoid GameSinVer (unsigned long GameTime){Metro game_time = Metro (GameTime); ServoOn (); servo_move ((maxh+minh)/2, minv,10); while (! game_time.check ()){randomSeed (analogRead (0)); int i = minv; int j = random (1,5); for (i; i // синусоида горизонтальная со случайной амплитудойvoid GameSinHor (unsigned long GameTime){Metro game_time = Metro (GameTime); ServoOn (); servo_move ((maxv+minv)/2, minh,10); while (! game_time.check ()){randomSeed (analogRead (0)); int i = minh; int j = random (1,5); for (i; i // квадрат со случайным размеромvoid GameCorners (unsigned long GameTime){Metro game_time = Metro (GameTime); ServoOn (); servo_move ((maxh+minh)/2, minv,10); randomSeed (analogRead (0)); int c = random (1,4); while (! game_time.check ()){int i = random (1,5); switch (i){case 1: servo_move (minh,(minv+1), random (1,4)*10); break; case 2: servo_move (minh,(maxv+1), random (1,4)*10); break; case 3: servo_move (maxh,(maxv+1), random (1,4)*10); break; case 4: servo_move (maxh,(minv+1), random (1,4)*10); break;}delay (DelayBetweenMovements);//digitalWrite (laser, random (2));}ServoOff ();} // веерные движения со случайным размахомvoid GameFan (unsigned long GameTime){Metro game_time = Metro (GameTime); ServoOn (); servo_move ((maxh+minh)/2, minv,10); while (! game_time.check ()){randomSeed (analogRead (0)); servo_move (random (minh, maxh+1), maxv, random (1,4)*10); delay (DelayBetweenMovements); servo_move ((maxh+minh)/2, minv, random (1,4)*10); delay (DelayBetweenMovements);//digitalWrite (laser, random (2));}ServoOff ();} // веерные движенияvoid GameFan1(unsigned long GameTime){Metro game_time = Metro (GameTime); ServoOn (); servo_move ((maxh+minh)/2, maxv,10); while (! game_time.check ()){randomSeed (analogRead (0)); servo_move (random (minh, maxh+1), minv, random (1,4)*10); delay (DelayBetweenMovements); servo_move ((maxh+minh)/2, maxv, random (1,4)*10); delay (DelayBetweenMovements);//digitalWrite (laser, random (2));}ServoOff ();} // веерные движенияvoid GameFan2(unsigned long GameTime){Metro game_time = Metro (GameTime); ServoOn (); servo_move ((maxh+minh)/2,(maxv+minv)/2,10); while (! game_time.check ()){randomSeed (analogRead (0)); servo_move (random (minh, maxh+1), random (minv, maxv+1), random (1,4)*10); delay (DelayBetweenMovements); servo_move ((maxh+minh)/2,(maxv+minv)/2, random (1,4)*10); delay (DelayBetweenMovements);//digitalWrite (laser, random (2));}ServoOff ();} // случайные перемещения во всех напраленияхvoid GameRandom (unsigned long GameTime){Metro game_time = Metro (GameTime); ServoOn (); while (! game_time.check ()){randomSeed (analogRead (0)); servo_move (random (minh, maxh+1), random (minv, maxv+1), random (1,4)*10); delay (DelayBetweenMovements);//digitalWrite (laser, random (2));}ServoOff ();} void ServoOn (void){ // задействовать сервы и включить лазерmyservo_ver.attach (9); // серво по вертикали присоединить на цифровой pin 9myservo_hor.attach (8); // серво по горизонтали присоединить на цифровой pin 8digitalWrite (laser,1); // включаем лазер} void ServoOff (void){ // отключить сервы и лазер — отдыхаемmyservo_ver.detach (); myservo_hor.detach (); digitalWrite (laser,0);} // переместить из текущей точки х1, y1 в точку x2, y2 с задержками между шагами delay_msvoid servo_move (double x2, double y2, int delay_ms){double x1 = myservo_hor.read (); // читаем текущее положение сервdouble y1 = myservo_ver.read (); int iX1 = round (x1); // округляем координатыint iY1 = round (y1); int iX2 = round (x2); int iY2 = round (y2); // Длина и высота линииint deltaX = abs (iX1 — iX2); int deltaY = abs (iY1 — iY2); // Считаем минимальное количество итераций, необходимое// для отрисовки отрезка. Выбирая максимум из длины и высоты// линии, обеспечиваем связность линииint length = max (deltaX, deltaY); if (length == 0) return; // Вычисляем приращения на каждом шаге по осям абсцисс и ординатdouble dX = (x2 — x1) / length; double dY = (y2 — y1) / length; // Начальные значенияdouble x = x1; double y = y1; // Oсновной циклlength++; while (length--){x += dX; y += dY; myservo_hor.write (x); myservo_ver.write (y); delay (delay_ms); }}