// библиотека для работы с сервоприводами #include // даём разумное имя пину к которому подключён лазерный модуль #define LASER 11 // даём разумное имя пинам к которым подключены сервомоторы #define SERV_X 4 #define SERV_Y 6 // Ограничения углов поворота сервы-X #define MIN_X 60 #define MAX_X 120 // Ограничения углов поворота сервы-Y #define MIN_Y 60 #define MAX_Y 90 // создаём два объекта для управления сервоприводами // 1 — для вращение влево-вправо «серво-X» Servo myservoX; // 2 — для вращение вверх-вниз «серво-Y» Servo myservoY; // переменная для хранения положения сервопривода по шкале X int posX = 0; // переменная для хранения положения сервопривода по шкале Y int posY = 0; // переменная для хранения направления сервопривода по шкале X int dirX = 0; // переменная для хранения направления сервопривода по шкале Y int dirY = 0; // переменная для хранения времени работы программы // после смены режима скорости вращения лазерного модуля long previousMillis = 0; void setup(void) { // настраиваем пин, к которому подключён лазер в режим выхода pinMode(LASER, OUTPUT); // подключаем сервоприводы myservoX.attach(SERV_X); myservoY.attach(SERV_Y); // инициализируем генератор псевдослучайных чисел // с параметром величиной напряжения аналогового пина 0 randomSeed(analogRead(0)); // включаем лазерный модуль analogWrite(11, 50); // присваиваем переменной случайное значение от MIN_X до MAX_X posX = random(MIN_X, MAX_X); // присваиваем переменной случайное значение от MIN_Y до MAX_Y posY = random(MIN_Y, MAX_Y); } void loop(void) { // проверяем не прошел ли нужный интервал времени while (millis() - previousMillis < 10000) { // перемещаем лазерный модуль в режиме 1 servoRotation(5); delay(50); } //если прошел, то сохраняем текущее время previousMillis = millis(); // проверяем не прошел ли нужный интервал времени while (millis() - previousMillis < 5000) { // перемещаем лазерный модуль в режиме 2 servoRotation(2); delay(100); } //если прошел, то сохраняем текущее время previousMillis = millis(); } // функция вращения лазерного модуля по двум осям // принимает параметр изменение угла void servoRotation(int i) { // если направление сервы-X стремиться к увеличению угла // и не превысила максимально допустимый угол if (dirX == 0 && posX < MAX_X) // увеличиваем состояние сервомотора // на случайный угол от 0 до i posX = posX + random(i); // иначе, если направление сервы-X стремится к увеличению угла // и превысила или равно максимально допустимому углу else if (dirX == 0 && posX >= MAX_X) // меняем направление сервы-X dirX = 1; // иначе, если направление сервы-X стремится к уменьшению угла // и не превысила минимально допустимый угол else if (dirX == 1 && posX > MIN_X) // уменьшаем состояние сервомотора // на случайный угол от 0 до i posX = posX - random(i); // иначе, если направление сервы-X стремится к уменьшению угла // и превысила минимально допустимый угол else if (dirX == 1 && posX <= MIN_X) // меняем направление сервы-X dirX = 0; // устанавливаем заданный угол сервы-X myservoX.write(posX); // если направление сервы-X стремится к увеличению угла // и не превысила максимально допустимый угол if (dirY == 0 && posY < MAX_Y) // увеличиваем состояние сервомотора // на случайный угол от 0 до i posY = posY + random(i); // иначе, если направление сервы-X стремится к увеличению угла // и превысила или равно максимально допустимому углу else if (dirY == 0 && posY >= MAX_Y) // меняем направление сервы dirY = 1; // иначе, если направление сервы-X стремится к уменьшению угла // и не превысила минимально допустимый угол else if (dirY == 1 && posY > MIN_Y) // уменьшаем состояние сервомотора // на случайный угол от 0 до i posY = posY - random(i); // иначе, если направление сервы-X стремится к уменьшению угла // и превысила минимально допустимый угол else if (dirY == 1 && posY <= MIN_Y) // меняем направление сервы-Y dirY = 0; // устанавливаем заданный угол на сервы-Y myservoY.write(posY); }