«Котовий брызгатрон» — или боевая турель против кота ^_^

Эта история будет полна интриги, заговоров, разочарований, слез и искренней радости… А впрочем, я малость увлекся — не будет там такого.

Предыстория: у меня есть пожилая мать, которая живет в другом городе. И лечит свои недуги с помощью алоэ. Метод хорошо помогает — и она постоянно сажает новые ростки, взамен потраченных. У нее проживают 2 представителя хвостатой фауны: Кузя и Марек (кот и кошечка). Почему кошечка стала вдруг «Мареком» — долгая история. Вкратце обозначим причину как «потому что так сложились звезды». То бишь, сделаем допущение, что Cat cat = new Cat («Марек»);

Хотелось бы, чтобы ее постояльцы относились к произрастающей флоре с соответствующим уважением. Например, так:

0adac4b23cf1e0f027b04ca6af59fc17.jpg

Однако, они относятся как то так:  

88fd47cd86cbc573924c29db850cb716.jpg

В течение года была перепробована масса подходов, как то: учить, ругать, закрывать дверь в комнату… Ничего не помогает. Результат всегда одинаков — только растянут во времени.

Была рассмотрена дажа масса инженерных подходов. Но они не годятся по причине: дороговизны и сложности. Или закрытия флоры от лучей солнца.

ada197a3e0acfbcc7d6c6721cef52648.jpg

В результате, консилиум, в лице: меня, меня и меня — постановил: «а позвать сюды лучшего ынженегра нашева королефства (меня) LOL! А пущай собирет нечто «эдакое»! И работа — закипела… Так как у меня завалялась небольшая плата ардуино нано, оставшаяся от прошлых проектов, было решено собирать на ней. Вкратце, ядро наших космических технологий составило следующее (слева направо):  

— ардуино нано;

— инфракрасные датчики движения (хорошая, кстати, штука — угол зрения до 100 градусов, дальность видения 2–3 метра);

— мосфет транзистор.

2d4b074f9100627a28e9685fa3f530ff.jpg

Ну, дальше уже и так понятно — поэтому на этом всё. Расходимся… 

Ладно, ладно — шутеечка… Продолжаем…

Для незнающих (что очень вряд ли, на хабре, но тем не менее) поясню:

— ардуино нано-позволяет запрограммировать некую последовательность действий,

— датчики движения — видят перемещения тепловых объектов,

— мосфет транзистор — является по сути реле, которое служит для включения мощной нагрузки — после получения слабого сигнала от процессора.

Но мосфет лучше чем реле, так как почти не потребляет энергии для своей работы, не «наклёпываются» контакты от постоянной работы. В результате — долговечен.

Но, электроника без корпуса — ничто. Моделируем в 3d и печатаем корпус:

2b6696609abffcd1ba8eb1b60f7d152d.jpg

Начинаем сборку с самого низа: пропускаем телефонные провода (да, да взял именно их — ибо дешево и длинные) в корпус и фиксируем болтиками (под них предварительно были заложены каналы, в которых потом вручную, метчиком — нарезана резьба м3х0,5):

4a6e336594f77b17f2f33498bb9e3900.jpg

Кстати, тут следует сказать пару слов о мосфете: несмотря на то, что он практически не греется (это одно из его достоинств) — я от греха прикрутил его на радиатор. «Пущай будэ»…

Присоединяем мосфет к питанию. Стараемся соединять аккуратно, с использованием термоусадки — иначе коты заругают ^_^

Далее, устанавливаем мосфет с радиатором и датчики движения — в предназначенные для них места…

c7991e34a9e0dc643c5d4abc7e57af53.jpg

…устанавливаем «мосх» — то бишь ардуино нано:

7d199a27eb10c3252160faac49d1499e.jpg

Монтируем на место крышку. И теперь НИКТО не в курсе-как оно устроено (LOL):

935abffc68bcf9dc22f1ec3028c7d1d9.jpg

Загружаем программу и усиленно машем руками перед датчиками. Ишь ты! Работат!  

23210053838219fba7c6b19d9500696c.jpg

Наступает главный момент: ради чего это всё: мы создаем зону запрета доступа для кота. А именно, согласно вики:

«Одним из самых популярных терминов в критериях оценок является понятие anti-access/area-denial или сокращенно A2/AD, которым обозначается территория, где вооруженные силы не смогут действовать в полной мере из-за того, что их войска оказываются в уязвимом положении для средств поражения армии».

В качестве такого средства, создания зоны запрета доступа, для нашей системы поражения, класса «подоконник-кот» — послужит распыление жидкой фракции воды, с помощью щелевых форсунок. То есть: берем форсунки для стеклоомывателей ВАЗ и делаем вот енто:

a8eea0fde3c6d1baa50ff3d214f2f812.jpg

Далее, берем нержавеющую капиллярную трубку с проходным сечением 0,3 мм — это важно! (на самом деле-ни разу не важно (LOL, это я — чтобы важности напустить)- т.к. она играет роль просто палки, которая втыкается в горшок с цветком и крепим к ней всю систему. В свое время брал эту трубку-за «много много денег» — для аппарата высокого давления (в той затее, я собрал рюкзачный бензиновый воздушный компрессор высокого давления (500 бар) — но, по ряду причин, затея «замерла»). Поэтому, «сгорел сарай — гори и хата»: смахиваем скупую мужскую слезу и пускаем трубку в дело:

81f587933a635940f6203b94fbaccea5.jpg

В качестве бака для воды был взят бачок от «копейки» (ВАЗ 2101).

P.S. Ноги — мои. Отличные — правда? LOL.

А вот так, выглядит эта штука при свете дня:

53c4127903a6cb57d564dc026bf90a15.jpg

Далее, эта система будет втыкаться в землю под алоэ и «контролировать окрестности». Эдакое «антикотовое ПВО».

На днях система уедет «благодарной аудитории». Надеюсь, они оценят…

5048aaf7331cde3110e6da08d984110c.jpg

Продемонстрировать в работе пока не могу — т.к. под рукой нет котов.

db9bcd9efc2fc7c070ffcf534182d847.jpg

Но буду вести наблюдение и дам знать, «когда-что».

Теперь ряд примечаний:

1) Если будете строить нечто подобное — мосфет надо брать «с логическим уровнем»- то есть, чтобы он открывался от 3–5 вольт;

2) Как выяснилось, датчики категорически не приемлют светлые оттенки пластика (просто постоянно стоят во «включенном» состоянии). Пришлось перепечатать нижнюю часть корпуса — черным ABS — пластиком. С ним всё работает хорошо:

3e876591ad20937769eb1c1b1e536c94.jpg

А теперь, самое главное — если кому понадобится, делюсь файлами.

Скетч для Arduino IDE:


int sensor1 = 2 ;// пин инфракрасного сенсора 1
int sensor2 = 3; // пин инфракрасного сенсора 2
int mosfet = 10; // пин силового мосфета, который включает насос

boolean isSensorStarted = false; // сработал ли хоть какой то датчик
boolean isMotorStarted = false; // запущен ли в данный момент двигатель
boolean catStatusMessage = false; // вывод сообщения о текущем статусе кота
boolean isFirstMessage = true; // вывод первого сообщения

boolean firstStart = true; //пауза только при первом старте системы (даёт возможность загрузиться)

volatile uint32_t startTime = 0; //время в миллисекундах, когда стартовал двигатель
volatile uint32_t workingTime = 3000; //время в миллисекундах, которое будет работать двигатель

void setup ()
{
  Serial.begin(9600);
  pinMode (sensor1, INPUT) ; // пин датчика работает как вход
  pinMode (sensor2, INPUT) ; // пин датчика работает как вход
  pinMode (mosfet, OUTPUT) ;// пин мосфета работает как выход

  attachInterrupt(digitalPinToInterrupt (sensor1), sensor_impulse, HIGH);
  attachInterrupt(digitalPinToInterrupt (sensor2), sensor_impulse, HIGH);
}

void loop ()
{

  while (isSensorStarted)
  {
      if (firstStart) //пауза при первом старте системы, после включения питания - даёт системе загрузиться и датчикам-прийти в состояние LOW
        {
          detachInterrupt(sensor1);
          detachInterrupt(sensor2);
          while ( (digitalRead(sensor1)==HIGH) || (digitalRead(sensor2)==HIGH) )
          {
            //ничего не делаем-ждем, пока не появится сигнал LOW
          }
          firstStart = false;
          isSensorStarted  = false;
          Serial.println ("Стартуем");
          isFirstMessage = false;           
          attachInterrupt(digitalPinToInterrupt (sensor1), sensor_impulse, HIGH);
          attachInterrupt(digitalPinToInterrupt (sensor2), sensor_impulse, HIGH);
          break;                      
        }
    
     if (catStatusMessage)
     {
        Serial.println ("Агонь па кату!!! :-)"); 
        catStatusMessage = false;     
     }

     detachInterrupt(sensor1);
     detachInterrupt(sensor2);
   
     digitalWrite(mosfet, HIGH);
     startTime = millis(); //записали время старта двигателя    
     isMotorStarted = true;
     Serial.println ("Двигатель запущен!");     
    
     while (isSensorStarted)
     {
        if (isMotorStarted)
        {
          if (millis()-startTime >= workingTime)
          { 
            isMotorStarted=false;
            digitalWrite(mosfet, LOW);
            Serial.println ("Двигатель остановлен!");
          }          
        }

      
      if ( (digitalRead(sensor1)==LOW) && (digitalRead(sensor2)==LOW) )
         {
           attachInterrupt(digitalPinToInterrupt (sensor1), sensor_impulse, HIGH);
           attachInterrupt(digitalPinToInterrupt (sensor2), sensor_impulse, HIGH); 
           isSensorStarted = false;
         }
     }
  }

 if (!isFirstMessage)
 {
    if (!catStatusMessage)
       {
         Serial.println ("Кота что то нету...:-(");
         catStatusMessage = true;      
       }  
 }
     

}

void sensor_impulse () 
{
  if (!isSensorStarted)
  {
     isSensorStarted = true;
  }
}

Скачать файлы для 3d печати можно по этой ссылке.

На этом всё — доклад закончил.

© Habrahabr.ru