(c) DIY
Введение:
Это руководство - как построить еще один бесполезный робот, который предназначен скорее для развлечения, чем для решения логических задач.
На минуту представим себе о вымышленном персонаже, живущем в коробочке. Одно только осознание присутствия его там, пробуждает интерес и желание хоть на секунду заглянуть в его сказочный, никому неизведанный мир.
Игрушка в виде коробочки с тумблером и открывающейся створкой, заключает в себе ряд механических элементов и блок управления на основе Arduino. Для удобства представляем вам 9 шагов для более детального подхода к сборке. Что из этого получиться увидим, когда соберем эту игрушку у себя дома.
Шаг 1: Как это работает?
Вся работа данного устройства, так или иначе, завязана на микропроцессоре Arduino. При переключении тумблера в позицию "Вкл" на корпусе сигнал поступает в плату управления, активирует сервомоторы и приводит их в движение. При этом происходит следующее: створка коробки открывается, оттуда высовывается механическая "рука", переводит переключатель в исходное положение "Выкл", возвращается обратно, створка закрывается. Следующее включение тумблера повторяет работу робота.
Если вы внимательно смотрели видео, при каждом новом нажатии переключателя, устройство реагирует немного по-другому. Это связано с программным кодом, который случайным образом определяет ту или иную модель поведения руки. В зависимости от встроенной памяти Arduino количество ходов может быть столько, сколько вы сами захотите.
Шаг 2: Детали:
Для сборки конструкции вам понадобится:
Коробка:
Дополнительно:
Если вы хотите, чтобы коробочка еще и двигалась (как в видео) вам будут нужны:
Для уменьшения шума и грохота при работе необходимы:
Шаг 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.
Пример кода приведен ниже. Внимание, значения для отклонения сервоприводов, указанные в коде, предназначены именно для этого коробка, принимая во внимание место расположения сервоприводов, размеры и многое другое. Таким образом, вы должны подобрать свои значения в соответствии с вашими данными
Шаг 9: Дополнительный функция - определение движения:
В дополнение, можно снабдить своего робота зрением. Если вы уже построили колеса, чтобы коробка двигалась, остается добавить оптический датчик и внести некоторые изменения в коде для обнаружения движения.
На примере сенсора GP2Y0A21, датчик имеет 3 провода: желтый провод подключается к контакту 3 на Arduino, красный и черный подключены к контакту 5 и к заземлению соответственно. Устанавливается датчик на внутренней стороне створки, что позволяет ему срабатывать лишь тогда, когда она открывается. Предлагаем вашему вниманию код с функцией обнаружения движения (см. код в функции zee7() ), которая позволяет коробке двигаться влево, а затем вправо при приближении к тумблеру человеческой руки. В обновленном коде возможен выбор последовательной или случайнай модели поведения робота путем логической команды Randomize.
1. ИК датчик
Заключение:
Прекрасная игрушка как для детей, так и для взрослых. Казалось бы ничего сложного: простая конструкция, доступность материалов и деталей, минимум специальных средств, инструментов и знаний. А сколько возможностей показывает данный робот... Советуем к процессу сборки подключить вашего ребенка. Это поможет развить в нем навыки конструирования, технического мышления, моторики рук при сборке, основы радиотехники и программирования. И не забывайте о том, сколько радости доставит эта игрушка ребенку.
Введение:
Это руководство - как построить еще один бесполезный робот, который предназначен скорее для развлечения, чем для решения логических задач.
На минуту представим себе о вымышленном персонаже, живущем в коробочке. Одно только осознание присутствия его там, пробуждает интерес и желание хоть на секунду заглянуть в его сказочный, никому неизведанный мир.
Игрушка в виде коробочки с тумблером и открывающейся створкой, заключает в себе ряд механических элементов и блок управления на основе 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)
{
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);
}
}
//this move will open the door and wait for movement, if detected near the switch,
//the box will move first to the Right, and then to the Left, and finally the hand moves and turns off the switch
void zee7()
{
//open door
for(pos = 80; pos < 155; pos = 3)
{
doorServo.write(pos);
delay(15);
}
delay(1200); //wait to stabilize sensor readings after opening the door
// set the timer and read the sensor
// wait for movement that exceeds threshold or if timer expires (5 sec),
lastDist= analogRead(motionPin);
TimerA= millis();
while(millis()-TimerA <= 5000)
{
currentDist = analogRead(motionPin);
//Does the current distance deviate from the last distance by more than the threshold?
//if yes, then move box to the right
if ((currentDist > lastDist thresh || currentDist < lastDist - thresh) || currentDist > 300)
{
//forward @ half speed to the left (choose the speed and the delay
//(i.e delay(300) according to you box and battery voltage such that the movement throw is desirable)
digitalWrite(motorDirection, LOW); //Establishes RIGHT direction of Channel A
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
break;
}
lastDist = currentDist;
}
// set the timer and read the sensor
// wait for movement that exceeds threshold or if timer expires (5 sec),
delay(1200); //wait to stabilize sensor readings after opening the door
lastDist= analogRead(motionPin);
TimerB= millis();
while(millis()-TimerB <= 5000)
{
currentDist = analogRead(motionPin);
//did the box already move to the right and the current distance deviate from the last distance by more than the threshold?
//If yes, then move to the Left
if ((currentDist > lastDist thresh || currentDist < lastDist - thresh) || currentDist > 300)
{
//backward @ half speed to the right (choose the speed and the delay
//(i.e delay(300) according to you box and battery voltage such that the movement throw is desirable)
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
break;
}
lastDist = currentDist;
}
delay(100);
//Moving hand
for(pos = 0; pos < 130; pos = 4)
{
handServo.write(pos);
delay(15);
}
//hiding hand
for(pos = 130; pos>=0; pos-=4)
{
handServo.write(pos);
delay(15);
}
//hiding door
for(pos = 155; pos>=80; pos-=3)
{
doorServo.write(pos);
delay(15);
}
}
Заключение:
Прекрасная игрушка как для детей, так и для взрослых. Казалось бы ничего сложного: простая конструкция, доступность материалов и деталей, минимум специальных средств, инструментов и знаний. А сколько возможностей показывает данный робот... Советуем к процессу сборки подключить вашего ребенка. Это поможет развить в нем навыки конструирования, технического мышления, моторики рук при сборке, основы радиотехники и программирования. И не забывайте о том, сколько радости доставит эта игрушка ребенку.
Комментариев нет:
Отправить комментарий