или войти через:
Ваша корзина пока пуста
favorite_border
Доступно только зарегистрированным пользователям

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

schedule 12.03.2014 в 15:59 link DIY Робот среднего уровня сложности
Содержание:
  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: Дополнительный функция - определение движения: