/* * Servo Serial Better * ------------------- * * * Created 18 October 2006 * copyleft 2006 Tod E. Kurt * http://todbot.com/ * * Взято из "http://itp.nyu.edu/physcomp/Labs/Servo" */ int servoPin = 7; // Управляющий пин для сервомотора int pulseWidth = 0; // значение импульса для сервы long lastPulse = 0; // время последнего импульса в миллисекундах int refreshTime = 20; // время в миллисекундах, необходимое между импульсами int val; // переменная для хранения данных из последовательного порта int minPulse = 700; // минимальная ширина импульса void setup() { pinMode(servoPin, OUTPUT); // объявить пин сервы выходом pulseWidth = minPulse; // установить положение мотора на минимум Serial.begin(19200); // подключиться к последовательному порту Serial.println("Servo Serial Better ready"); } void loop() { val = Serial.read(); // прочитать значение с последовательного порта // если величина - число из одной цифры, мигнуть светодиодом столько раз if (val >= '0' && val <= '9' ) { val = val - '0'; // преобразовать из символа в число val = val * (180/9); // преобразовать из числа в градус pulseWidth = (val * 9) + minPulse; // перевести угол в микросекунды Serial.print("moving servo to "); Serial.print(pulseWidth,DEC); Serial.println(); } updateServo(); // обновить позицию сервы } // called every loop(). // uses global variables servoPin, pulsewidth, lastPulse, & refreshTime void updateServo() { // pulse the servo again if rhe refresh time (20 ms) have passed: if (millis() - lastPulse >= refreshTime) { digitalWrite(servoPin, HIGH); // Turn the motor on delayMicroseconds(pulseWidth); // Length of the pulse sets the motor position digitalWrite(servoPin, LOW); // Turn the motor off lastPulse = millis(); // save the time of the last pulse } }