/*
* Набор для экспериментов MaxKit 01
* Код программы для опыта №9: sketch 09
*
* ДАТЧИК ИЗГИБА (FLEX SENSOR)
*
* Написано для сайта «Полный комплект» http://maxkit.ru
*
*
* Помощь сообщества Arduino.
* Посетите сайт http://www.arduino.cc
*
*
* ДАТЧИК ИЗГИБА (FLEX SENSOR)
*
* Использование «FLEX SENSOR» для изменения положение сервопривода
*
* В предыдущем скетче мы узнали, как устанавливать сервопривод
* в разные позиций. Теперь же, мы познакомимся с новым датчиком
* который тоже можно использовать для управления сервоприводом.
*
* Датчик изгиба представляет собой пластиковую полоску с
* токопроводящим покрытием. Когда полоса не изогнута, покрытие
* обладает определенным сопротивлением, но как только полоска
* начинает изгибаться, частицы в покрытии изменяют положение
* друг относительно друга, тем самым увеличивая общее сопротивление.
* Вы можете использовать это датчик встроив его например в перчатку
* для определения движение пальца, прикрепив к дверным петлям, чтобы
* узнать угол открытия двери, и т.д.
*
* Подключение оборудования:
*
*  Flex сенсор:
*
*  Flex сенсор — пластиковая полоска с черными поперечными полосками.
*  Он воспринимает изгиб с полосатой стороны.
*
*  Flex датчик имеет два контакта, и так как это резистор, полярность
*  у него отсутствует, т.е. все равно какой куда подключать.
*
*  Подключите один из выводов на аналоговый Pin0 Arduino.
*  И тот же вывод подключите, через резистор 10 кОм (коричневый
*  черный оранжевый) к земле (GND).
*  Подключите второй вывод к питанию +5В.
*
* Сервопривод:

*  Из Сервопривода выходит кабель, с тремя проводами оканчивающийся
* разъемом. Соедините Arduino и серву воткнув провода перемычки,
*  непосредственно в разъем сервопривода и макетной платы.
*
*  Подключите красный провод (питание) в +5 вольт (5V)
*  Подключите белый (или желтый) провод (сигнал) к цифровому выводу Pin9
*  Подключите черный провод (земля) к минусовой шине (GND)
*
*  Обратите внимание, что сервоприводы могут потреблять много энергии,
* что может вызывать неравномерность в работе, а также зависание или
* перезапуск вашей Arduino. Если вы используете большую серву, или
* несколько, то лучше предоставьте для них отдельный источник питания
* 5V. Дополнительно смотрите эту ветку Arduino Форума:
* http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1239464763
*
*
*
*
*
* Этот sketch был написан SparkFun Electronics,
* Переведен специально для сайта http://maxkit.ru
* 20 января 2015г.
*
*/

// Подключите библиотеку сервопривода для добавления функций управления:

#include

// Создание «объекта» 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»
}