Аэротруба

Дорогие друзья! Сегодня мы прикоснемся к занимательному миру физики, то есть создадим своими руками аэродинамическую трубу! И поможет нам в этом контроллер DaVinci!
Эта "воздушная" самоделка не остваит равнодушным даже твоих родителей, они будут играть словно как дети. А твои младшие братья и сестры скажут, что это магия! :)

Фокус заключается в том, что шарик, находящийса в трубе взлетает ввысь при подъеме руки и опускается вниз - при опускании.

Для того чтобы стать "волшебником" тебе понадобится:
1. Контроллер DaVinci;
2. Шилд QuatroPort A050;
3. Ультразвуковой дальномер GS-V2.0;
4. Модуль с вентилятором;
5. Кабель XH-2.54-4P для подключения к QuatroPort A050  - 2 шт;
6. Доска Quatro screw board;
7. Шарик для настольного тенниса;
8. Прозрачная труба со внутренним диаметром не менее 42 мм, можно скрутить из плотной прозрачной пленки;
9. Подставка для трубы, если нет 3D принтера, то можено вырезать из пластикового стаканчика или бутылки. Главное что бы подставка не мешала крутиться проппелеру вентилятора и не прогибалась под тяжестью самой трубы.

Собрав конструкцию, мы должны подключить контроллер к компьютеру и загрузить программу:

#include <Sonar.h>
#define MOTOR_SPEED 10
#define MOTOR_DIR 8

int inactiveCounter = 0;
int autoRange = 5;
bool up = true;

void setup() {
  pinMode(MOTOR_SPEED, OUTPUT);
  pinMode(MOTOR_DIR, OUTPUT);
  SonarInit();             //Инициализация TWI модуля АРДУИНЫ
  SonarTxDataTime(14, 200); //Даем команду на постоянный замер расстояния
  //С интервалом в 0.5 сек (допустимый интервал 20 - 65535 мсек)
  Serial.begin(9600);
}

void loop() {
  //Забираем результат через каждые 1 сек и выводим его через UART
  int range = SonarRxData(14);
  Serial.println(range);//Выводим данные в терминал в мм

  if (range == 0 || range == 255) {
    range = 40;
    inactiveCounter++;
  } else {
    inactiveCounter = 0;
  }

  if (inactiveCounter > 25) {
    if (autoRange > 40) {
      up = false;
    } else if (autoRange < 5) {
      up = true;
    }

    autoRange = up ? autoRange + 2 : autoRange - 2;
    range = autoRange;

  } else {
    range = min(40, range);
    range = max(1, range);
  }

  digitalWrite(MOTOR_DIR, LOW);
  analogWrite(MOTOR_SPEED, 90 + (70 / 40)*range);

  delay(200);
}

На самом деле ничего волшебного тут нет. Дело все в принципе работы ультразвукового дальномера. Он вычесляет расстояние до руки и дает сигнал вентилятору, что бы тот крутился сильнее или медленее.
В программе прописан режим ожидания, который включается когда датчик не "видит" руки и сразу отключается, когда поднесешь руку. Во время режима ожидания шарик поднимается до конца трубы и плавно опускается вниз.