Лазерная игрушка для кота на ардуино

Обновлено: 28.04.2024

Есть у нас в семье кошка по имени Киса. Молодая, а также трусливая и любопытная одновременно. Единственное, что начисто отбивает у нее всю трусость – это красное лазерное пятнышко от бошевского дальномера. Она готова охотиться за ним безоглядно. Но. У дальномера есть ограничение по времени работы, батареек на него не напасешься, да и влом на длительные игры с кошкой время терять.

Находил на просторах интернета всякие автоматические кошачьи дразнилки – дорого, да и функционал ограничен. Опять же, нет гарантии, что лучик не попадет на занавески, и они не будут при этом подраны вдрызг.

Или мы не инженеры-электронщики-ардуинщики?! А самому собрать?

Сначала взял железо: Arduino Nano, пару сервомашинок простеньких (можно в наборе с Arduino в Мастер-Кит приобрести) и красный полупроводниковый лазер от завалявшейся указки с апертурой пятнышком. ЛУТом в момент сделал платку, чтобы сервы было куда воткнуть, ну и ключ на транзисторе для лазера, чтобы ардуиновский пин не перегружать.

Принципиальная схема устройства:





В Arduino Nano втыкается обычный USB-mini из любого блока питания на 5 В. Ну, или в компьютер для заливки скетча.

Конструкцию хотелось сделать, конечно, как можно проще в изготовлении. Помог 3D-принтер. Вот поистине выручалочка для домашних умельцев! Очень понравилось печатать небольшие детали вместо того, чтобы пилить их напильником. За час MC5 D.R.O.V.A. напечатал четыре детальки для двухкоординатного поворотного устройство. Сам процесс печати настолько завораживает, что час этот пролетел вообще незаметно!



Собранное поворотное устройство вместе с платой крепим на обрезке крашеной фанеры. Это хозяйство и будем программировать.



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

Экспериментальным путем после некоторого количества экспериментов были выбраны следующие принципы движения объекта охоты:

— шевеление лазером происходит не постоянно, а со случайными остановками с выключением пятнышка, при этом животное нервно озирается в его поисках;
— траектория движения меняется от сеанса к сеансу опять же случайным образом;
— размах движения тоже меняется в рамках заданной траектории;
— после перемещения в конец траектории точка замирает, чтобы зверь мог ее затоптать в попытке схватить;
— пятно не должно попадать на стены и занавески, только на пол!

Побаловавшись с простейшими движениями типа линия и квадрат от точки к точке попеременными движениями сервомашинок, захотелось реализовать и более сложные траектории. После недолгого гугления остановился на старом добром алгоритме DDA-линии, растеризующим отрезок прямой между двумя точками. То есть, задаем функцию траектории, задаем абсциссу, вычисляем ординату, и перемещаем лазер мелкими последовательными шагами по двум координатам в новую точку. Траектории сделал, какие в голову пришли: веер, синусоида, сектор, квадрат и т.п. Можно и более сложные функции рисовать, если кому охота.

Под спойлером полный текст работающего на данный момент скетча:

// экспериментально выбираем безопасную зону перемещения пятна
int minv = 85; //10; // крайнее нижнее положение пятна
int maxv = 115; //55; // крайнее верхнее
int minh = 90; //45; // крайнее левое, смотреть спереди
int maxh = 145; //120; // крайнее правое, смотреть спереди

unsigned long DelayBetweenMovements = 1000; // задержка в мс
unsigned long second = 1000; // одна сек. = 1000 мс

Servo myservo_ver; // перемещение по вертикали
Servo myservo_hor; // перемещение по горизонтали

void setup()
<
pinMode(laser, OUTPUT);
pinMode(led, OUTPUT);
digitalWrite (led,HIGH);
ServoOn();
myservo_hor.write((maxh + minh)/2); // устанавливаем лазер
myservo_ver.write((maxv + minv)/2); // в среднее положение
delay(2000); // и пару секунд смотрим

//-Main----------------------------------------------
void loop()
randomSeed(analogRead(0)); // инициализация random случайным значением с порта 0
int g = random(1,7); // выбираем случайно одно траекторию из семи
randomSeed(analogRead(0));
int tg = random(1,3); // выбираем случайно длительность сеанса 30, 60 или 90 сек
DelayBetweenMovements = second * random(1,5)/2; // выбираем случайно время перемещения между точками траектории
switch (g) <
case 1: GameRandom(tg*30*second); break;
case 2: GameFan(tg*30*second); break;
case 3: GameFan1(tg*30*second); break;
case 4: GameFan2(tg*30*second); break;
case 5: GameCorners(tg*30*second); break;
case 6: GameSinHor(tg*30*second); break;
case 7: GameSinVer(tg*30*second); break;
>
delay(random(10,60)*second);

void ServoOn(void) < // задействовать сервы и включить лазер
myservo_ver.attach(9); // серво по вертикали присоединить на цифровой pin 9
myservo_hor.attach(8); // серво по горизонтали присоединить на цифровой pin 8
digitalWrite (laser,1); // включаем лазер
>

void ServoOff(void) < // отключить сервы и лазер — отдыхаем
myservo_ver.detach();
myservo_hor.detach();
digitalWrite (laser,0);
>

// переместить из текущей точки х1, y1 в точку x2, y2 с задержками между шагами delay_ms
void servo_move(double x2, double y2, int delay_ms)
double x1 = myservo_hor.read(); // читаем текущее положение серв
double y1 = myservo_ver.read();

int iX1 = round(x1); // округляем координаты
int iY1 = round(y1);
int iX2 = round(x2);
int iY2 = round(y2);

// Длина и высота линии
int deltaX = abs(iX1 — iX2);
int deltaY = abs(iY1 — iY2);

// Считаем минимальное количество итераций, необходимое
// для отрисовки отрезка. Выбирая максимум из длины и высоты
// линии, обеспечиваем связность линии
int length = max(deltaX, deltaY);
if (length == 0) return;

// Вычисляем приращения на каждом шаге по осям абсцисс и ординат
double dX = (x2 — x1) / length;
double dY = (y2 — y1) / length;

// Начальные значения
double x = x1;
double y = y1;

// Основной цикл
length++;
while (length--)
x += dX;
y += dY;
myservo_hor.write(x);
myservo_ver.write(y);
delay(delay_ms);

Первый лазер вышел из строя через неделю – отломились выводы, хоть и сделаны они из многожильного провода. У второго отформовал выводы спиралью. Помогло. Можно еще клея капнуть из клеевого пистолета на место, откуда выводы выходят из корпуса.

Не все адаптеры питания подходят. От некоторых Ардуино не заводится или лазер дергается. Видимо, большие пульсации на выходе. Конденсатор лень было впаивать, просто подобрал хороший адаптер, благо их куча валялась.
Испытано на нескольких кошках. Молодые долго носятся. Постарше – побегают, а потом лежат и смотрят, как пятно шарахается, или на саму машинку пялятся, как она жужжит и шевелится. Лапой машинку не пытались. Но, на всякий случай, придумал кожух из коробки для бумажек.


Лазерная указка — пульт управления кошкой. Эта игрушка даже у самых ленивых представителей кошачьих вызывает небывалый охотничий азарт. А какие трюки проделывает питомец, в попытке схватить призрачную добычу! Давайте соберём лазерную игрушку для кошки вашими руками.

Что нам понадобится?


Как собрать?


Установите Troyka Shield на плату Iskra Neo.


Прикрепите боковые панели («пластины 7×5 шипов») и заднюю панель («пластина 6×5 шипов») к основанию корпуса игрушки («крепление Arduino 7×8 шипов»).

Так как регулятор напряжения, установленный на плате Iskra Neo, не может выдавать ток, обеспечивающий стабильную работу сервомоторов, мы будем запитывать всю конструкцию от отдельного источника питания на 5V через клеммник. Поэтому, перед установкой лицевой панели («пластина 6×5 шипов»), с помощью бокорезов или ножа сделайте в ней отверстие для клеммника и установите его. Также отделите бокорезами секции, мешающие подключению USB-кабеля. Установите лицевую панель бокса на основание.

Если вы не хотите резать деталь, выведете клеммник наружу и закрепите на верхней панели корпуса с помощью стяжек или двустороннего скотча. Доступ к USB можно обеспечить, открывая и закрывая заднюю панель.



С помощью проводов «папа-папа» соедините пин 5V Arduino с плюсом клеммника, а пин GND Arduino с минусом клеммника.


С помощью двух панелей «крепление микросервопривода 3×4 шипа» и четырёх панелей («пластина 2×3 шипа») сделайте «домик» для микросервопривода. Данный мотор будет вращаться по оси X, назовём его «Серво-X».


Используя «крепление качалки 2×4 шипа» с первого «домика», две панели «крепление микросервопривода 3×4 шипа» и две панели («пластина 2×3 шипа»), сделайте «домик» для второго микросервопривода. Этот мотор будет вращаться по оси Y, назовём его «Серво-Y».


Закрепите лазерный модуль к подвижной панели верхнего сервопривода через «пластину 2×2 шипа». Мы получили двухосевой сустав из сервоприводов.


Используя 3-проводной шлейф, подключите лазерный модуль к 11 цифровому пину Troyka Shield.


Подключите «Серво-X» и «Серво-Y» через 3-проводные шлейфы к 4 и 6 пину Troyka Shield соответственно.


В результате должна получиться такая схема:


Установите верхнюю панель («пластина 7×8 шипов»), прикрепив её к боковым, передней и задней стенкам корпуса.


В заключение установите сустав из сервоприводов на верхнюю панель бокса.

Алгоритм

Передвигаем лазерный модуль с большой плавающей скоростью одновременно по двум осям в течении 10 секунд.

Передвигаем лазерный модуль с медленной плавающей скоростью одновременно по двум осям в течении 5 секунд.

Исходный код

Демонстрация работы устройства

Что дальше?

Добавьте в проект Wireless Shield и Bluetooth Bee, и управляйте лазерной игрушкой с мобильного телефона. Привлеките кота звуком с помощью Зуммера (Troyka-модуль). Замените плату Iskra Neo на Arduino Yún, подключите к ней веб-камеру, и наблюдайте за тем как играет ваш питомец где бы вы ни находились.

Если не указано иное, содержимое этой вики предоставляется на условиях следующей лицензии: CC Attribution-Noncommercial-Share Alike 4.0 International

Набор для сборки лазерной игрушки для кошек. Микроконтроллер перемещает луч лазерной указки по случайному алгоритму, развлекая котика даже в ваше отсутствие.

Iskra Neo

Российская плата на ATmega32U4, эквивалентная итальянской Arduino Leonardo

Troyka Shield

Универсальный хаб для быстрого и удобного подключения Troyka-модулей

Микросервопривод Feetech FS90 / 180°

Аналоговый сервопривод с углом поворота 180° и крутящим моментом 1,3 кг·см

Гнездо питания 2,1 мм с клеммником

Гнездо под штекер диаметром 2,1 мм

Лазерный модуль мини

Миниатюрный лазерный модуль с точечным красным лазером

Трёхпроводной шлейф «мама-мама»

Шлейф из трёх проводов для подключения Troyka-модулей к Troyka Shield

Соединительные провода «папа-папа»

Пучок из 65 проводов-перемычек для прототипирования. Это провода необходимые чаще всего

Детали для крепления плат Arduino Uno, Iskra Neo и совместимых с ними

Средние конструктивные детали общего назначения

Большие конструктивные детали общего назначения

Детали для крепления микросервоприводов

Нейлоновые винты М3×8 (4 шт.)

Комплект из четырёх пластиковых винтов М3×8

Нейлоновые гайки М3 (4 шт.)

Комплект из четырёх пластиковых гаек М3

Комплект из четырёх пластиковых стоек с резьбой М3 и высотой 8 мм

Блок питания Robiton TN1000S (1000 мА)

Импульсный блок питания 1 А с выбором напряжения 3–12 В и сменными штекерами

Блок питания Robiton TN2000S (2000 мА)

Импульсный блок питания 2 А с выбором напряжения 3–12 В и сменными штекерами

Лазерная указка — пульт управления кошкой. Эта игрушка вызывает небывалый охотничий азарт даже у самых ленивых представителей кошачьих. А какие трюки проделывает питомец в попытке схватить призрачную добычу! Соберите лазерную игрушку для кошки своими руками, и всё увидите.

Лазерная игрушка для котенка на Arduino — это простой проект для начинающих с минимальным количеством необходимых деталей. Игрушку для своего кота довольно легко сделать своими руками. Мы представим на этой странице схему сборки проекта с пошаговой инструкцией и представим программу для управления сервомоторами от Arduino, где вы можете подставить свои значения по скорости и времени игры.

Интерактивная лазерная игрушка для кота

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

Игрушка для кошки «лазерная указка» состоит из двух сервоприводов, которые поворачивают лазер по горизонтали и вертикали на разный угол и с разной задержкой времени. Первый сервопривод крепится на клей или термоклей к какому-либо основанию, второй сервопривод приклеивается на качалку (шестерню) первого моторчика. Модуль лазерного светодиода крепится на качалку второго светодиода.

Лазерная игрушка для кошек своими руками

Для этого проекта потребуется:

  • Arduino Uno / Arduino Nano / Arduino Mega;
  • два сервопривода;
  • лазерный светодиод;
  • провода «папа-папа»;
  • термоклей, изолента, инструмент.

Схема подключения сервоприводов и светодиода представлена на картинке выше. Чтобы сделать конструкцию более надежной, лучше сделать корпус для игрушки на 3D принтере или придумать более надежное крепление к качалкам, так как при резких поворотах сервоприводы могут отклеиться. После сборки конструкции загрузите следующий скетч в плату Arduino Nano или другой микроконтроллер Ардуино.

Скетч для интерактивной лазерной игрушки

Пояснения к коду:

  1. в программе включение лазерного модуля и запуск счетчика отсчета времени производится один раз в процедуре void setup() ;
  2. процедура while будет выполняться до тех пор, пока счетчик времени не станет больше заданного количества миллисекунд (minutes * 60000);
  3. для повторного запуска игры необходимо перезагрузить микроконтроллер.

Еще раз предупредим об опасности попадания лазерного луча в глаза человека или животного. Также следите, чтобы пятно от лазерной игрушки не попадал на вещи, которые котенок может повредить и тем более на открытые окна. Вы можете здесь скачать одним архивом программу для игрушки на Ардуино, а также файлы для изготовления корпуса игрушки на лазерном или фрезерном ЧПУ станке.

Чем только не займешься в новогодние праздники? В этом году подарил своей кошке электронную игрушку на базе лазерной указки, двух сервоприводов и контроллера на базе Mega16. Может сравнить применение Меги в этой схеме со стрельбой по воробьям из пушки, но дома на тот момент была только она. Человеку, имеющему опыт программирования AVR микроконтроллеров не составит труда перенести ее на другую микросхему, вплоть до микроконтроллеров серии Tiny.

Электронная и механическая части.

image


(рис.1)

В качестве излучателя применен лазерный диод с оптикой от лазерной указки. С нее же взят и токоограничительный резистор номиналом 100 Ом.

image


(рис.2)

Механическая часть состоит из двух сервоприводов Corona CS-928BB, купленных в магазине радиоуправляемых моделей. Их можно заменить любыми другими. Сервоприводы соединены между собой следующим образом.

image


(рис.3)

Для большей жесткости, соединения выполнены из алюминиевого уголка толщиной 1,5 мм.
Управляющий транзистор может быть любым, обратной проводимости. Я нашел дома только КТ805БМ, его успешно и применил.
Питается схема от сетевого выпрямителя через стабилизатор 7805 (5 Вольт, потребляемый ток не более 300 мА).

Программная часть

Сервоприводы вращаются случайным образом в небольшом диапазоне (не более 60 градусов от общего хода), чтобы ограничить положение лазерного зайчика на полу, либо чуть выше. Также реализовано программное выключение излучателя на короткое время (для придания кошке азарта).
За основу взят код из учебного курса по программированию AVR микроконтроллеров — Ссылка.
Файлы проекта на Codevision AVR, разводку печатной платы, схему в Proteus и готовую прошивку можно скачать по ссылке — Проект одним архивом.

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

Читайте также: