// Подключите библиотеку сервопривода для добавления функций управления:
#include <Servo.h>
// Создание "объекта" Servo, с именем servo1. Каждый "объект" может
// иметь одно имя с помощью которого можно обращаться к конкретному
// сервоприводу через весь скетч. Максимально количество
// сервоприводов которыми можно управлять может быть 12:
Servo servo1;
// Задать аналоговый порт для считывания показаний с датчика изгиба:
const int flexpin = 0;
void setup()
{
// Используйте окно монитора порта для отладки программы:
Serial.begin(9600);
// Включение управления сервоприводом на pin 9:
servo1.attach(9);
}
void loop()
{
int flexposition; // Значение входного сигнала с аналогового порта.
int servoposition;// Выходное значение для сервы.
// Прочитать положение гибкого датчика (от 0 до 1023):
flexposition = analogRead(flexpin);
// Мы уже знаем, рабочий диапазон значений функции analogRead()
// 0-1023. Значения "делителя напряжения" получаемого с Датчика
// изгиба, который мы используем, будет приблизительно 600-900.
// Для сервы нужен диапазон градусов от 0 до 180...
// Эта проблема решается с помощью двух полезных функций
// о которых шла речь в опыте №6 - map() и constrain().
// ...таким образом "конвертируем" диапазон значений 600-900
// в значения градусов для сервопривода от 0 до 180.
// Небольшая ремарка:
// В некоторых наборах в комплекте нет датчика изгиба, это
// из за его дорогой стоимости, но вам не стоит расстраиваться
// для того чтобы разобраться с этим опытом вы можете вместо
// него поставить фоторезистор не меняя ничего в схеме и ваш
// серводвигатель будет менять свое положение в зависимости
// освещенности датчика.
// Единственное что вам нужно будет поправить это вот эта
// строка:
// servoposition = map(flexposition, 870, 1000, 0, 180);
// значения 870 и 1000 взяты из монитора порта, 870 - наибольшая
// освещенность датчика, 1000 - наименьшая (темнота)
servoposition = map(flexposition, 600, 900, 0, 180);
servoposition = constrain(servoposition, 0, 180);
// Теперь мы отдаем команды "серве", чтобы она
// установилась в определенную позицию:
servo1.write(servoposition);
// Каждый гибкий датчик имеет слегка различное, свое сопротивление,
// Цифры 600-900 очень приблизительные, а нам бы хотелось точности.
// Для точной настройки мы будем использовать COM порт, значения
// которого мы увидим в окне Serial Monitor (Монитора порта):
Serial.print("sensor: ");
Serial.print(flexposition);
Serial.print(" servo: ");
Serial.println(servoposition);
// Обратите внимание, что все перечисленные выше строки
// используют команду "print", за исключением последней "Println".
// Это позволяет ставить получаемые значения на той же линии, что
// и надписи ("sensor: "), (" servo: "), и только в конце отправляет
// окончательную команду "возврат каретки", чтобы перейти к следующей
// строке.
// После загрузки скетча в Arduino, включите Serial Monitor
// (значок увеличительного стекла в правом углу панели инструментов).
// Вы сможете увидеть изменяемые значения датчика. Запишите значения
// не искривленного датчика и в максимальном искривлении, т.е.
// минимальное и максимальное значение. Впишите полученные вами
// значения вместо 600 и 900 в функции map() выше, тем самым вы
// повысите точность сопоставления гибкого датчика с точностью
// поворота сервопривода.
delay(20); // пауза 20мс между обновлением значений "servo"
}