Бесполезная коробка своими руками

Бесполезная роботизированная коробка URoboBox

Многие из вас наверняка знают и видели гаджет под названием «Бесполезная коробка».

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

Решив позабавить своих детей, друзей и знакомых, я сделал URoboBox.

Это моя версия легендарной коробки.

Наткнулся в сети на такую штуку:

https://www.youtube.com/watch?v=mOPPas21Kbk

И еще вариант продвинутый вариант от LEGO:

В интернете также нашел инструкцию как собрать самостоятельно URoboBox — бесполезную роботизированную коробку.

URoboBox – Useless Robotic Box (Бесполезная Роботизированная Коробка).

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

URoboBox в действии:

URoboBox может работать в двух режимах, случайный выбор движений и по порядку.

Коробочка имеет 7 движений для отключения тумблера, можно добавлять свои движения.

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

Работа продолжится после отключение тумблера вручную.

Далее идет часть для тех кто желает собрать такую коробочку самостоятельно.

Работа URoboBox изнутри:

Корпус и рычаг вырезаны лазером из фанеры толщиной 4 мм.

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

Но толщина материала не должна превышать 4 мм, в противном случае, вам придется изменить чертежи.

Чертежи нарисованы в программе CorelDRAW X6.

Следуйте инструкции и у вас всё получится.

ВНИМАНИЕ: Вовремя сборки внимательно смотрите на фотографии и располагайте детали именно так, как они расположены на фото.

Необходимые компоненты:

  1. Плата Arduino. Я использую Arduino Mega, вы можете использовать любую другую.
  2. Тумблер с двумя положениями. Диаметр втулки с резьбой не должен превышать 6 мм.
  3. Серво. Я использую TowerPro g9. Если вы будете использовать другие серво, вам придется изменить чертежи крепления серво.
  4. Элементы питания.
  5. Супер клей. Маленькие тюбики, желательно гель.
  6. Шесть маленьких саморезов диаметром до 2.5 мм.
  7. Сверло 2 мм, 1 мм. Дрель или шуруповерт.

Инструкция по сборке:

Крепление для Arduino.

  1. Возьмите необходимые детали. Расположите их точно также как на фото (рис. 1).
  2. Переверните боковую стенку, поставьте детали крепления (гантельки) в прямоугольные отверстия (рис. 2).
  3. Сделайте отметки с двух сторон у каждой «гантельки», примерно посередине, между прямоугольными отверстиями (рис. 2 и рис. 3).
  4. Поочередно, установите «гантельки» с обратной (внутренней стороны) и просверлите отверстия (сверло 2 мм) в местах указанных точками на рисунке (рис. 3). Сверлите таким образом, чтобы сверло вошло в стенку «гантельки» прямо по центру. Диаметр сверла зависит от диаметра самореза.
  5. Закрепите «гантельки» саморезами (рис. 4, рис. 5).
  6. Возьмите пластинку для крепления Arduino. Приложите к ней плату так, чтобы совпали отверстия для креплений. Отметьте где будет находиться гнездо USB и куда оно направлено (рис. 6).
  7. Нанесите клей на паз «гантелек» (рис. 7), приложите пластину крепления Ардуино к «гантелькам» и дождитесь пока она приклеится.

Вот что у вас должно получиться:

Корпус

  1. Разложите детали так, как показано на фото (рис. 8). Синими стрелками указаны основные элементы деталей, убедитесь, что ваши детали лежат также.
  2. Склейте скотчем: дно, левый торец, заднюю стенку и правый торец (видео 2). Соблюдайте расположение деталей.
    3. Нанесите клей на торцы пазов дна и передней стенки (рис. 9). Прижмите переднюю стенку и дождитесь высыхания клея. У вас должно получиться так (видео 3).
  3. Склейте скотчем: дно, левый торец, переднюю стенку и правый торец. Нанесите клей на торцы пазов дна и задней стенки (рис. 10).
  4. Прижмите заднюю стенку соблюдая расположение деталей и дождитесь высыхания клея. Вот что у вас должно получиться (видео 4).
  5. Со стороны правого торца, намажьте клеем торцы пазов задней стенки, дна и передней стенки. Аккуратно вставьте правый торец в пазы и дождитесь засыхания клея.
  6. Левый торец приклеивать не нужно.

Вот что должно получится:

Левая верхняя крышка:

  1. Возьмите корпус, левую крышку и 2 крючка (рис. 11).
  2. Приклейте крючки. Крючок в корпусе должен быть направлен прорезью в сторону левого торца коробки. Крючок на крышке должен быть направлен прорезью в сторону правого торца (рис. 12), (рис. 13).
  3. Возьмите канцелярскую скрепку, распрямите её и откусите кусачками два куска по 3 см. Загните оба отрезка как показано на рисунке (рис. 14).
  4. Уберите стенку левого торца, приложите правую верхнюю крышка как показано на рисунке (рис. 13) и просверлите отверстие (сверло 1 мм) в указанных на картинке местах (рис. 15). Сверло должно пройти сквозь боковые стенки и в середину торца верхней крышки.
  5. Вставьте в просверленные отверстия скобы из канцелярской скрепки (рис. 16).
  6. Загните каждую скобу так, чтобы «свободный» конец был направлен внутрь корпуса (рис. 17).
  7. Возьмите резинку для денег, сложите её в двое, закрутите на нужное число оборотов и наденьте на крючки (рис. 18).

Вот что у вас должно получиться:

Крепление серво, рычага, тумблер, завершение сборки:

  1. Возьмите крепление для серво и сам сервопривод (рис. 19).
  2. Вставьте серво в прямоугольное отверстие, при этом вал серво должен быть ближе к верхнему краю крепления. Нижняя часть крепления обозначена отверстием (рис. 20, рис. 21). Закрепите серво шурупами или винтиками M2 (пример на фото), предварительно просверлив отверстия (сверло 2 мм).
  3. Возьмите две части рычага (рис. 22), склейте их или соедините винтиками (пример на фото). Прикрутите качалку от серво точно также, как на фото (рис. 23).
  4. Поставьте серво в положение 0 градусов и закрепите рычаг на серво. Прямая часть рычага должна быть направлена вниз (рис. 24).
  5. Возьмите тумблер, провода штекера и сопротивление 10 кОм. Припаяйте провода и сопротивление как на картинке (рис. 25).
  6. Закрепите тумблер в правой верхней крышке как на картинке (рис. 26).
  7. Если у вас не Arduino Mega, тогда изготовьте вот такой провод (рис. 27).
  8. Подключите все компоненты к ардуино, смотрите схему (рис. 28, рис. 29, рис. 30).
  9. Закрепите Ардуино. Установите крепление с серво таким образом, чтобы вал серво был направлен в сторону задней стенки. Блок с батареями можно разместить на стенке левого торца (рис. 31, рис. 32).
  10. Закрепите верхнюю правую крышку и левый торец при помощи шурупов. Предварительно, под шурупы просверлите отверстия (сверло 2 мм) (рис. 33).

Вот что у вас должно получиться:

Настройка программы:

Откройте код для URoboBox. В самом начале кода, вы увидите раздел настроек.

  1. Укажите пины на которых подключены серво (пин 3) и тумблер (пин 2).
  2. Укажите минимальное положение рычага, по умолчанию 10. Максимальное положение рычага, в диапазоне от 90 до 110. Укажите такой градус, при котором в максимальном положении рычаг будет выключать тумблер.
  3. Укажите пин для светодиода подсветки.
  4. Выберите режим работы URoboBox, 1 — Выбор движений в случайном порядке, 2 — Движения идут по порядку.
  5. Общее число движений. Измените это число, если вы добавляли свои движения, укажите общее число движений.
  6. Настройте движение Shake, читайте описание в коде.

Файлы проекта:

DIY: Коробочка самовыключатель под управлением Arduino. Пошаговая инструкция по созданию

  1. Введение
  2. Видеопрезентация работы
  3. Шаг 1: Как это работает?
  4. Шаг 2: Детали
  5. Шаг 3: Построение коробочки
  6. Шаг 4: Схема электрической части
  7. Шаг 5: Установка сервоприводов
  8. Шаг 6: Подключение коммутатора и сервоприводов к плате Arduino
  9. Шаг 7: Установка электромоторов, колес, редуктора, кнопки рестарта и батареи DC
  10. Шаг 8: Код
  11. Шаг 9: Дополнительный функция — определение движения
  12. Заключение

Введение:
Это руководство — как построить еще один бесполезный робот, который предназначен скорее для развлечения, чем для решения логических задач.
На минуту представим себе о вымышленном персонаже, живущем в коробочке. Одно только осознание присутствия его там, пробуждает интерес и желание хоть на секунду заглянуть в его сказочный, никому неизведанный мир.
Игрушка в виде коробочки с тумблером и открывающейся створкой, заключает в себе ряд механических элементов и блок управления на основе Arduino. Для удобства представляем вам 9 шагов для более детального подхода к сборке. Что из этого получиться увидим, когда соберем эту игрушку у себя дома.

Видеопрезентация работы:
Шаг 1: Как это работает?
Вся работа данного устройства, так или иначе, завязана на микропроцессоре Arduino. При переключении тумблера в позицию «Вкл» на корпусе сигнал поступает в плату управления, активирует сервомоторы и приводит их в движение. При этом происходит следующее: створка коробки открывается, оттуда высовывается механическая «рука», переводит переключатель в исходное положение «Выкл», возвращается обратно, створка закрывается. Следующее включение тумблера повторяет работу робота.
Если вы внимательно смотрели видео, при каждом новом нажатии переключателя, устройство реагирует немного по-другому. Это связано с программным кодом, который случайным образом определяет ту или иную модель поведения руки. В зависимости от встроенной памяти Arduino количество ходов может быть столько, сколько вы сами захотите.
Шаг 2: Детали:
Для сборки конструкции вам понадобится:
Коробка:

  • Любая плата Arduino с PWM выходами.
  • Два стандартных RC серводвигателя (например, Futaba — S3003 , у них есть 3,2 кг/см крутящего момента, более чем достаточных, чтобы переместить дверь или руку).
  • 6-12 В батареи.
  • SPTT или SPST переключатель для триггера (в принципе это любой выключатель, который вам понравится).
  • Выключатель для батареи.
  • Кнопка для перезагрузки Arduino (restart).
  • Перемычки и провода.

Дополнительно:
Если вы хотите, чтобы коробочка еще и двигалась (как в видео) вам будут нужны:

  • Специальная плата для электромотора — Arduino motor shield.
  • Электромотор постоянного тока (RC серводвигатель) и коробка передач, подходящие практически с любой машинки на радиоуправлении.

Для уменьшения шума и грохота при работе необходимы:

  • Электролитический конденсатор 10mF
  • Резистор 10K.
  • Инвертор (чип 74HC04).

Шаг 3: Построение коробочки:
Для построения коробочки вам понадобится фанера или пробковое дерево, а также сильнодействующий клей для дерева. Учтите, что вес конструкции играет большую роль в нагрузке на сервоприводы и расходе заряда батареи. Размеры коробки 22см x 14см x 14см.

Шаг 4: Схема электрической части:
Верхняя часть:
Основная плата Arduino, 2 сервопривода, переключателя Вкл/Выкл. Обратите внимание, что вы можете заменить часть цепи, отвечающую за уменьшение шума при закрытии крышки и движении руки, на простой резистор.
Сервоприводы питаются непосредственно от контакта 5 на Arduino. Сигнальные провода подключены к контакту 9 и 10 соответственно. Эти контакты поддерживают PWM, что обеспечивает управление углом/положением сервопривода (от 0 до 180 градусов макс). Красная кнопка предназначена для сброса(перезагрузки) платы Arduino.
Нижняя часть:
Для перемещения коробочки на столе в нижней части представлена плата для электромотора — Arduino motor shield. В плате имеются два канала подключения — А или В, поэтому возможно использование сразу двух моторов, при желании. Главное, что этот элемент позволяет задать в программном коде направление, скорость и разрывы для любого из доступных 2 каналов двигателей. По схеме используется канал В, где контакт 13 — для направления, 11 — для скорости и 8 — для управления тормозами.
На схеме аккумулятор 11.1/1000 мА (кстати, такой же как в ARDrone), соединен с платой Arduino motor shield. Если вы не будете использовать ее, можно подключить батарею к основной плате напрямую.

1. крышка серво подключены к PWM контакте 9
2. рука серво подключены к PWM контакте 9
3. схема включения
Шаг 5: Установка сервоприводов:
Методом проб и ошибок необходимо установить сервопривод руки таким образом пока не получите необходимый результат. Вы можете использовать примеры серво-программ (готовые скетчи для движения сервоприводов) в Arduino IDE, что бы проверить величину (градус) отклонения сервоприводов.
Рука делается из любого дерева (чем легче, тем лучше). Ее размеры подбираются в ходе монтирования, что бы получить эффект выключения тумблера управления. Сервопривод и толкатель крышки монтируется так, что бы рука не задевала их в процессе работы.

Шаг 6: Подключение коммутатора и сервоприводов к плате Arduino:
С помощью проводов и перемычек необходимо подключить все соединения, показанные в схеме выше, и попытаться уложить все детали внутри коробки так, чтобы они не мешали работе механических частей.

1. схема включения
2. резинка, чтобы дать некоторую напряженность на открытие и закрытие двери
3. двигатель щит установлен над Arduino
Шаг 7: Установка электромоторов, колес, редуктора, кнопки рестарта и батареи DC:

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

1. кнопка сброса
2. батарейки и главный выключатель питания
Шаг 8: Код:
Чтобы написать код для Arduino установите на свой ПК программу Arduino IDE.
Пример кода приведен ниже. Внимание, значения для отклонения сервоприводов, указанные в коде, предназначены именно для этого коробка, принимая во внимание место расположения сервоприводов, размеры и многое другое. Таким образом, вы должны подобрать свои значения в соответствии с вашими данными
#include <Servo.h>
Servo doorServo;
Servo handServo;
int switch_pin = 2; //set switch on pin 2
//motor variables
int motorThrottle=11;
int motorDirection = 13;
int motorBrake=8;
int pos = 0;
int selectedMove = 0; //move selector
int Testmove = 0; //test mode: set to move number to test only one selected move
//(set to Zero to run normally i.e: roundrobbin on amm moves)
void setup()
{
Serial.begin(9600);
pinMode(switch_pin, INPUT);
doorServo.attach(9); //set door servo on Pin 9 pwm
handServo.attach(10); //set hand servo on Pin 10 pwm
doorServo.write(80); //set door to hiding position
handServo.write(0); //set hand to hiding position
//Setup Channel B, (since Channel A is reserved by door and hand servos and can’t ber used at same time)
pinMode(motorDirection, OUTPUT); //Initiates Motor Channel B pin
pinMode(motorBrake, OUTPUT); //Initiates Brake Channel B pin
}
void loop()
{
if (Testmove != 0) {
selectedMove = Testmove;
}
//if the switch is on, then move door and hand to switch it off…
if(digitalRead(switch_pin) == HIGH)
{
if (selectedMove > 10) { selectedMove = 0; } //when all moves are played, repeat the moves from beginning
// below are all the «Moves» i designed so far, each is a function that is written below in the code, execuse the names, abit strange? yes as some are written in arabic
if (selectedMove == 0) { switchoff(); }
else if (selectedMove == 1) { switchoff(); }
else if (selectedMove == 2) { switchoffbitaraddod(); }
else if (selectedMove == 3) { crazydoor(); }
else if (selectedMove == 4) { crazyslow(); }
else if (selectedMove == 5) { m7anika7anika(); }
else if (selectedMove == 6) { m3alla2(); }
else if (selectedMove == 7) { switchoff(); }
else if (selectedMove == 8) { matrix(); }
else if (selectedMove == 9) { sneak(); }
else if (selectedMove == 10) { zee7(); }
if (Testmove == 0) {
selectedMove++; //swith to next move if not in test mode
}
}
}
// Library of moves
// basic move
void switchoff()
{
//Moving door
for(pos = 80; pos < 155; pos = 3)
{
doorServo.write(pos);
delay(15);
}
//Moving hand
for(pos = 0; pos < 129; pos = 4)
{
handServo.write(pos);
delay(15);
}
//hiding hand
for(pos = 129; pos>=0; pos-=4)
{
handServo.write(pos);
delay(15);
}
//hiding door
for(pos = 155; pos>=80; pos-=3)

{
doorServo.write(pos);
delay(15);
}
}
// move 3: open and wait, then move hand and wait, then switch of and hide
void switchoffbitaraddod()
{
//Moving door
for(pos = 80; pos < 155; pos = 3)
{
doorServo.write(pos);
delay(15);
}
delay(800);
//Moving hand
for(pos = 0; pos < 100; pos = 4)
{
handServo.write(pos);
delay(15);
}
delay(1000);
for(pos = 100; pos < 129; pos = 4)
{
handServo.write(pos);
delay(15);
}
//hiding hand
for(pos = 129; pos>=0; pos-=5)
{
handServo.write(pos);
delay(15);
}
//hiding door
for(pos = 155; pos>=80; pos-=3)
{
doorServo.write(pos);
delay(15);
}
}
//move 4: open door then close it many times, wait, then quickly reoprn a nd switch off and hide.
void crazydoor()
{
//Moving door
for(pos = 80; pos < 125; pos = 3)
{
doorServo.write(pos);
delay(15);
}
//hiding door
for(pos = 125; pos>=80; pos-=5)
{
doorServo.write(pos);
delay(15);
}
//Moving door
for(pos = 80; pos < 110; pos = 3)
{
doorServo.write(pos);
delay(15);
}
//hiding door
for(pos = 110; pos>=80; pos-=15)
{
doorServo.write(pos);
delay(15);
}
delay(700);
//Moving door
for(pos = 80; pos < 125; pos = 3)
{
doorServo.write(pos);
delay(15);
}
delay(700);
//hiding door
for(pos = 125; pos>=80; pos-=5)
{
doorServo.write(pos);
delay(15);
}
//—-of switch of—-//
//Moving door
for(pos = 80; pos < 155; pos = 8)
{
doorServo.write(pos);
delay(15);
}
//Moving hand
for(pos = 0; pos < 129; pos = 3)
{
handServo.write(pos);
delay(15);
}
//hiding hand
for(pos = 129; pos>=0; pos-=3)
{
handServo.write(pos);
delay(15);
}
//hiding door
for(pos = 155; pos>=80; pos-=15)
{
doorServo.write(pos);
delay(15);
}
}
// move 5: open door, then move hand very slowly forward and back to hiding very slowly, then quickly close door
void crazyslow()
{
//Moving door
for(pos = 80; pos < 155; pos = 1)
{
doorServo.write(pos);
delay(30);
}
//Moving hand
for(pos = 0; pos < 129; pos = 1)
{
handServo.write(pos);
delay(30);
}
//hiding hand
for(pos = 129; pos>=0; pos-=1)
{
handServo.write(pos);
delay(30);
}
//hiding door
for(pos = 155; pos>=125; pos-=1)
{
doorServo.write(pos);
delay(30);
}
delay(100);
for(pos = 125; pos>=80; pos-=4)
{
doorServo.write(pos);
delay(15);
}
}
//move 6:
void m7anika7anika() {
//Moving door
for(pos = 80; pos < 155; pos = 3)
{
doorServo.write(pos);
delay(15);
}
//Moving hand
for(pos = 0; pos < 70; pos = 1)
{
handServo.write(pos);
delay(15);
}
delay(800);
//hiding door
for(pos = 155; pos>=130; pos-=3)
{
doorServo.write(pos);
delay(15);
}
//hiding door
for(pos = 130; pos < 155; pos =3)
{
doorServo.write(pos);
delay(15);
}
//hiding door
for(pos = 155; pos>=130; pos-=3)
{
doorServo.write(pos);
delay(15);
}
//hiding door
for(pos = 130; pos < 155; pos =3)
{
doorServo.write(pos);
delay(15);
}
handServo.write(40);
delay(1000);
//Moving hand
for(pos = 40; pos < 129; pos = 4)
{
handServo.write(pos);
delay(15);
}
//hiding hand
for(pos = 129; pos>=0; pos-=4)
{
handServo.write(pos);
delay(15);
}
for(pos = 120; pos>=80; pos -= 1)
{
doorServo.write(pos);
delay(15);
}
}
void m3alla2(){
//Moving door
for(pos = 80; pos < 155; pos = 3)
{
doorServo.write(pos);
delay(15);
}
//Moving hand
for(pos = 0; pos < 127; pos = 4)

{
handServo.write(pos);
delay(15);
}
//hiding door
for(pos = 155; pos>=130; pos-=3)
{
doorServo.write(pos);
delay(15);
}
delay(2000);
for(pos = 130; pos < 155; pos = 3)
{
doorServo.write(pos);
delay(15);
}
for(pos = 155; pos>=140; pos-=3)
{
doorServo.write(pos);
delay(15);
}
for(pos = 140; pos < 155; pos = 3)
{
doorServo.write(pos);
delay(15);
}
delay(500);
//hiding hand
for(pos = 127; pos>=0; pos-=4)
{
handServo.write(pos);
delay(15);
}
//hiding door
for(pos = 155; pos>=80; pos-=3)
{
doorServo.write(pos);
delay(15);
}
}
void matrix()
{
//Moving door
for(pos = 80; pos < 155; pos = 3)
{
doorServo.write(pos);
delay(15);
}
//Moving hand
for(pos = 0; pos < 80; pos = 4)
{
handServo.write(pos);
delay(15);
}
for(pos = 80; pos < 129; pos = 1)
{
handServo.write(pos);
delay(30);
}
delay(300);
for(pos = 129; pos>=0; pos-=4)
{
handServo.write(pos);
delay(10);
}
//hiding door
for(pos = 155; pos>=80; pos-=3)
{
doorServo.write(pos);
delay(15);
}
}
void sneak()
{
//Moving door
for(pos = 80; pos < 130; pos = 1)
{
doorServo.write(pos);
delay(30);
}
delay(2000);
//Moving hand
for(pos = 0; pos < 40; pos = 1)
{
handServo.write(pos);
delay(30);
}
delay(500);
for(pos = 130; pos < 155; pos = 4)
{
doorServo.write(pos);
delay(15);
}
delay(100);
for(pos = 40; pos < 90; pos = 4)
{
handServo.write(pos);
delay(15);
}
delay(500);
//hiding hand
for(pos = 90; pos>=70; pos-=4)
{
handServo.write(pos);
delay(15);
}
delay(100);
for(pos = 70; pos < 90; pos = 4)
{
handServo.write(pos);
delay(15);
}
delay(100);
for(pos = 90; pos>=70; pos-=4)
{
handServo.write(pos);
delay(15);
}
delay(100);
for(pos = 70; pos < 129; pos = 4)
{
handServo.write(pos);
delay(15);
}
for(pos = 129; pos>=0; pos-=4)
{
handServo.write(pos);
delay(15);
}
//hiding door
for(pos = 155; pos>=80; pos-=3)
{
doorServo.write(pos);
delay(15);
}
}
void zee7()
{
//Moving door
for(pos = 80; pos < 155; pos = 3)
{
doorServo.write(pos);
delay(15);
}
delay(2000);
//forward @ half speed to the left
digitalWrite(motorDirection, LOW); //Establishes RIGHT direction of Channel B
digitalWrite(motorBrake, LOW); //Disengage the Brake for Channel B
analogWrite(motorThrottle, 100); //Spins the motor on Channel B at full speed
delay(300);
digitalWrite(motorBrake, HIGH); //Eengage the Brake for Channel B
delay(2000);
//backward @ half speed to the right
digitalWrite(motorDirection, HIGH); //Establishes LEFT direction of Channel B
digitalWrite(motorBrake, LOW); //Disengage the Brake for Channel B
analogWrite(motorThrottle, 100); //Spins the motor on Channel B at half speed
delay(300);
digitalWrite(motorBrake, HIGH); //Eengage the Brake for Channel B
delay(1000);
//Moving hand
for(pos = 0; pos < 129; pos = 4)
{
handServo.write(pos);
delay(15);
}
//hiding hand
for(pos = 129; pos>=0; pos-=4)
{
handServo.write(pos);
delay(15);
}
//hiding door
for(pos = 155; pos>=80; pos-=3)
{
doorServo.write(pos);
delay(15);
}
}
Шаг 9: Дополнительный функция — определение движения:
В дополнение, можно снабдить своего робота зрением. Если вы уже построили колеса, чтобы коробка двигалась, остается добавить оптический датчик и внести некоторые изменения в коде для обнаружения движения.
На примере сенсора GP2Y0A21, датчик имеет 3 провода: желтый провод подключается к контакту 3 на Arduino, красный и черный подключены к контакту 5 и к заземлению соответственно. Устанавливается датчик на внутренней стороне створки, что позволяет ему срабатывать лишь тогда, когда она открывается. Предлагаем вашему вниманию код с функцией обнаружения движения (см. код в функции zee7() ), которая позволяет коробке двигаться влево, а затем вправо при приближении к тумблеру человеческой руки. В обновленном коде возможен выбор последовательной или случайнай модели поведения робота путем логической команды Randomize.

1. ИК датчик
#include
Servo doorServo;
Servo handServo;
unsigned long TimerA,TimerB; //timer for the movement detection routine
int switch_pin = 2; //set switch on pin 2
//motor variables
int motorThrottle=11;
int motorDirection = 13;
int motorBrake=8;
//Distance Variables
int motionPin = 3; //motion sensor pin on analog 0
int lastDist = 0; //to remember last distance
int currentDist = 0;
int thresh = 200; //Threshold for Movement (set it such that you get the desired sensetivity of motion detection)
int pos = 0;
int selectedMove = 0; //move selector
int Testmove = 0; //test mode: set to move number to test only one selected move
//(set to Zero to run normally i.e: roundrobbin on all moves)
boolean randomize = true; // if true, the box will do movers randomly, if set to false then the moves will be done sequencially from 1 to 10
void setup()
{
Serial.begin(9600);
pinMode(switch_pin, INPUT);
doorServo.attach(9); //set door servo on Pin 9 pwm
handServo.attach(10); //set hand servo on Pin 10 pwm
doorServo.write(80); //set door to hiding position
handServo.write(0); //set hand to hiding position
//Setup Channel B, since Channel A is reserved by door and hand servos and can’t ber used at same time
pinMode(motorDirection, OUTPUT); //Initiates Motor Channel B pin
pinMode(motorBrake, OUTPUT); //Initiates Brake Channel B pin
}
void loop()
{
//if the switch is on, then move door and hand to switch it off…
if(digitalRead(switch_pin) == HIGH)
{
if (Testmove == 0)
{
if(randomize == false)
{
if (selectedMove > 10)
{
selectedMove = 0; //when all moves are played, repeat the moves from beginning
}
}
else
{
selectedMove = random(11);
}
}
else
{
selectedMove = Testmove;
}
Serial.println(selectedMove);
if (selectedMove == 0) { switchoff(); }
else if (selectedMove == 1) { switchoff(); }
else if (selectedMove == 2) { switchoffbitaraddod(); }
else if (selectedMove == 3) { crazydoor(); }
else if (selectedMove == 4) { crazyslow(); }
else if (selectedMove == 5) { m7anika7anika(); }
else if (selectedMove == 6) { m3alla2(); }
else if (selectedMove == 7) { switchoff(); }
else if (selectedMove == 8) { matrix(); }
else if (selectedMove == 9) { sneak(); }
else if (selectedMove == 10) { zee7(); }
if (Testmove == 0 && randomize == false) {
selectedMove++; //switch to next move if not in test mode
}
}
}
// Library of moves
// basic move
void switchoff()
{
//Moving door
for(pos = 80; pos < 155; pos = 3)
{