#include #include #include #include byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xEF }; byte ip[] = { 192, 168, 1, 100 }; byte server[] = { 82, 138, 2, 107 }; // G0l.ru int CONNECT_WAIT = 10; // задержка (в милисекундах) между следующей попыткой коннекта с сервером int SLOW_MOVE_DELAY = 10; // задержка между тактами при медленном дискретном перемещении int MOVE_DELAY = 10; // задержка между тактами при пропорциональном перемещении int max_length = 20; // максимальная длинна буфера для строк int max_x = 180, max_y = 180, min_x = 1, min_y = 1; // искусственно ограничиваем углы вращения, дабы камера не билась башкой о стол int init_X = 90, init_Y = 90; int delta_x = 5, delta_y = 5; // шаг изменения позиции int X = init_X; // текущее положение по оси Х, начальное значение - примерно середина (90) int Y = init_Y; // текущее положение по оси Y, начальное значение - примерно середина (90) int old_X = X, old_Y = Y; // для сохраннения предыдущей позиции Servo myservo, myservo1; // создаём объект для каждой сервы Client client(server, 80); // создаём объект для подключения к серверу boolean Action = false; // семафор, если true - строка получена и укомплектована, можно разбирать int repeat = 0; String buffer = String(max_length); int val1, val2; // промежуточная переменная при преобразовании типов void setup() { // Задаём первичные настройки Ethernet.begin(mac, ip); // куда будем подключаться по сети Serial.begin(9600); // в консоль будем писать текущее состояние дел myservo.attach(7); // серва Y подключена к 7-му пину myservo1.attach(6); // серва X подключена к 6-му пину } void loop() { // Если не приконнектились - ждём 100 милисекунд и снова пробуем приконнектиться if (!client.connected()) { Serial.println("Client stop"); client.stop(); delay(CONNECT_WAIT); repeat = 0; // на всякий случай обнуляем флаг повторности подключения (во загнул). //Эт чтоб в консоль по сто раз не выводилось сообщение о коннекте if (client.connect()) { Serial.println("Client connect "); if (!repeat) { Serial.println("ok"); // теперь мы подключены к серверу repeat = 1; // выставляем уже известный флаг } // отправляем запрос к скрипту на сервере client.print("GET /test/serva/get.php HTTP/1.0\r\n"); client.print("Host: www.g0l.ru\r\n"); client.println(); Serial.println("Sending HTTP request"); Action = false; } } if (client.available()) { // при установленнном подключении к серверу char c = client.read(); // читаем символ if (c == '\n') { // Строка готова, можно разбирать. Правда, сначала заголовок идёт, но нам пофиг, его мы как-то отделять не будем if (buffer.length()) Action = true; if (Action) { Action = false; old_X = X; old_Y = Y; // Собссно, обработка команд if (buffer.contains("{1}")) { // Двигаем вверх Y += delta_y; if (Y > max_y) Y = max_y; ServoSlowMove(0, old_Y, Y); } if (buffer.contains("{2}")) { // Двигаем вниз Y -= delta_y; if (Y < min_y) Y = min_y; ServoSlowMove(0, old_Y, Y); } if (buffer.contains("{3}")) { // Центрируем по оси Y Y = init_Y; ServoSlowMove(0, old_Y, Y); } if (buffer.contains("{4}")) { // Двигаем вверх до упора Y = max_y; ServoSlowMove(0, old_Y, Y); } if (buffer.contains("{5}")) { // Двигаем вниз до упора Y = min_y; ServoSlowMove(0, old_Y, Y); } if (buffer.contains("{6}")) { // двигаем влево X -= delta_x; if (X < min_x) X = min_x; ServoSlowMove(1, old_X, X); } if (buffer.contains("{7}")) { // двигаем вправо X += delta_x; if (X > max_x) X = max_x; ServoSlowMove(1, old_X, X); } if (buffer.contains("{8}")) { // Двигаем влево до упора X = min_x; ServoSlowMove(1, old_X, X); } if (buffer.contains("{9}")) { // Двигаем вправо до упора X = max_x; ServoSlowMove(1, old_X, X); } if (buffer.contains("{10}")) { // центрирование по оси X X = 90; ServoSlowMove(1, old_X, X); } // Теперь самое интересное - // Пропорциональные мгновенные перемещения. Т.е. полученные координаты мышки при движении по управляющей области if (buffer.contains("{11}")) { // разбираем строку виде {11}xxxyyy, где {11} - код перемещения, xxx - координата X, yyy - координата Y (Спасибо, Кэп!) String value = buffer.substring(4); String value1 = value.substring(0,3); String value2 = value.substring(3); val1 = atoi(value1); val2 = atoi(value2); val2 = max_y - val2; if (val1 > max_x) val1 = max_x; if (val1 < min_x) val1 = min_x; if (val2 > max_y) val2 = max_y; if (val2 < min_y) val2 = min_y; ServoMove(val1, val2); X = val1; Y = val2; } } // Конец обработки готовой строки buffer = ""; // обнуляем строку } else { if (c != '\r' && buffer.length() < max_length) buffer.append(c); // добавляем символ в наш буфер } } } void ServoSlowMove(int n, int pos1, int pos2){ // Функция медленного перемещения сервы n из одного положения pos1 в другое pos2. if (pos1==pos2) return; if (pos1 < pos2) for (int i = pos1; i <= pos2 ; i++) { n?myservo1.write(i):myservo.write(i); delay(SLOW_MOVE_DELAY); } else for (int i = pos1; i >= pos2 ; i--) { n?myservo1.write(i):myservo.write(i); delay(SLOW_MOVE_DELAY); } } void ServoMove(int x, int y){ myservo1.write(x); myservo.write(y); delay(MOVE_DELAY); }