17 марта 2014 г.

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

(c) DIY
Введение:

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

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

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

DIY, Робот среднего уровня сложности - Роботы среднего уровня - Robotics


Шаг 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см.

DIY, Робот среднего уровня сложности - Роботы среднего уровня - Robotics


Шаг 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. Если вы не будете использовать ее, можно подключить батарею к основной плате напрямую.

DIY, Робот среднего уровня сложности - Роботы среднего уровня - Robotics

1. крышка серво подключены к PWM контакте 9 
2. рука серво подключены к PWM контакте 9 
3. схема включения


Шаг 5: Установка сервоприводов:

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

Рука делается из любого дерева (чем легче, тем лучше). Ее размеры подбираются в ходе монтирования, что бы получить эффект выключения тумблера управления. Сервопривод и толкатель крышки монтируется так, что бы рука не задевала их в процессе работы.

DIY, Робот среднего уровня сложности - Роботы среднего уровня - Robotics

DIY, Робот среднего уровня сложности - Роботы среднего уровня - Robotics

DIY, Робот среднего уровня сложности - Роботы среднего уровня - Robotics


Шаг 6: Подключение коммутатора и сервоприводов к плате Arduino:

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

DIY, Робот среднего уровня сложности - Роботы среднего уровня - Robotics

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


Шаг 7: Установка электромоторов, колес, редуктора, кнопки рестарта и батареи DC:

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

DIY, Робот среднего уровня сложности - Роботы среднего уровня - Robotics

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.

DIY, Робот среднего уровня сложности - Роботы среднего уровня - Robotics

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);                    
    }
   }
                                                                                                                                                                                                                     


Заключение:

Прекрасная игрушка как для детей, так и для взрослых. Казалось бы ничего сложного: простая конструкция, доступность материалов и деталей, минимум специальных средств, инструментов и знаний. А сколько возможностей показывает данный робот... Советуем к процессу сборки подключить вашего ребенка. Это поможет развить в нем навыки конструирования, технического мышления, моторики рук при сборке, основы радиотехники и программирования. И не забывайте о том, сколько радости доставит эта игрушка ребенку. 

Комментариев нет:

Отправить комментарий