–обот-паук на сервоприводах + » -управление

14.02.2018, 10:24
»сточник: cxem.net


„етырехногий робот-паук создан дл€ демонстрации работы сервомашинок под управлением контроллера Arduino (дл€ кружка робототехники).

” робота два режима:

  • автономный - робот движетс€ вперед, при обнаружении преп€тстви€ (используетс€ ультразвуковой датчик) поворачиваетс€ и движетс€ дальше;
  • внешнее управление с помощью » -пульта.

»спользовались сервомашинки Turnigy TGY-9025MG металлическим редуктором.

–обот-паук на сервоприводах + » -управление

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

–обот-паук на сервоприводах

–обот-паук

 орпус был сделан из упаковочного материала дл€ компов. ƒл€ сервомашинок требуетс€ отдельное питание. ¬ качестве источника питани€ используетс€ Li-po батаре€ Turnigy 2S 1600 mAh. 

–обот-паук на сервоприводах

–обот-паук на » -управление

¬от вид сверху и снизу робота в процессе сборки.

–обот + » -управление

–обот-паук на сервоприводах + » -управление

ƒл€ управлени€ сервоприводом в Arduino имеетс€ стандартна€ библиотека Servo. Ќа платах, отличных от Mega, использование библиотеки отключает возможность использовани€ analogWrite() (PWM) на пинах 9 и 10 (вне зависимости подключены к этим пинам сервы или нет). Ќа платах Mega, до 12 серв могут использоватьс€ без вли€ни€ на функциональность PWM, но использование от 12 до 23 сервомашинок отключит PWM на пинах 11 и 12. Cервопривод подключаетс€ 3-м€ проводами: питание, земл€ и сигнальный. ѕитание Ц красный  провод. „ерный(или коричневый) провод Ц земл€ подключаетс€ к GND выводу Arduino, сигнальный(оранжевый/желтый/белый) провод подключаетс€ к цифровому выводу контроллера Arduino. Ѕудем использовать выводы 5,6,7,8 Arduino.

Ќапр€жение выдаваемое батареей 7.4 Ц 8.4 ¬. “.к. дл€ питани€ сервоприводов необходимо напр€жение 4.8 Ц 6.0 ¬ будем использовать стабилизатор напр€жени€ 5¬, собранный на микросхеме L7805. ќдна микросхема посто€нно перегревалась, проблема решилась установкой параллельно двух микросхем L7805. 

ƒл€ обнаружени€ преп€тствий будем использовать ультразвуковой датчик HC-SR04, который позвол€ет определ€ть рассто€ние до объекта в диапазоне от 2 до 500 см с точностью 0.3 см. ≈сли рассто€ние до преп€тстви€ меньше 10 см, робот делает поворот и движетс€ дальше вперед.  

images.jpg

¬ качестве пульта используетс€  пульт lg, приемник » -сигналов - TSOP31238(1-GND, 2 - +5V, 3-OUT).

krab10.jpg

TSOP31238.jpg

—хема электрическа€

—хема робота

» весь робот в сборе (плата Arduino питаетс€ от батарейки  рона).

krab11.jpg

krab12.jpg

ѕриступим к написанию скетча

ƒл€ управлени€ сервоприводами используетс€ Arduino библиотека Servo. Ќам необходимо реализовать совокупность движений сервоприводов дл€ движени€ робота-паука вперед, назад, поворота по часовой стрелке и поворота против часовой стрелки.  роме того необходимо реализовать функции остановки робота, а также дл€ экономии электроэнергии предусмотрим режим засыпани€ (когда сервоприводы наход€тс€ в режиме detach) и пробуждени€ (перевод сервоприводов в режим attach).  ѕоэтому каждое движение робота состоит из нескольких шагов.

Ќапример движение вперед состоит из следующих шагов:

  1. лева€ передн€€ нога вперед;
  2. права€ передн€€ нога вперед;
  3. лева€ задн€€ нога вперед;
  4. права€ задн€€ нога вперед;
  5. четыре ноги вместе назад (что приведет к перетаскиванию тела робота-паука).

ƒанные дл€ угла поворота каждой сервы на каждом шаге дл€ каждого движени€ робота-паука хран€тс€ в трехмерном массиве arr_pos.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
int arr_pos[4][6][4]={
 
   { // forward
   {90,90,90,90},{45,90,90,90},{45,135,90,90},
   {45,135,45,90},{45,135,45,135},{135,45,135,45}
   },
 
   { // back
   {90,90,90,90},{90,90,90,45},{90,90,135,45},
   {90,45,135,45},{135,45,135,45},{45,135,45,135}
   },
 
   { // circle_left
   {90,90,90,90},{0,90,90,90},{0,0,90,90},
   {0,0,0,90},{0,0,0,0},{180,180,180,180}
   },
 
   { // circle_right
   {90,90,90,90},{180,90,90,90},{180,180,90,90},
   {180,180,180,90},{180,180,180,180},{0,0,0,0}
   }
 
 };
 
int pos_stop[1][4]={{90,90,90,90}};

ѕроцедура course(int variant)реализует перемещени€ сервоприводов дл€ каждого шага следующих движений робота-паука: вперед, назад, поворота по часовой стрелке и поворота против часовой стрелки.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
void course(int variant)
 {
 int i=0;
 for(i=1;i<6;i++)
   {
   if(arr_pos[variant-1][i][0]!=arr_pos[variant-1][i-1][0])
   {myservo11.write(arr_pos[variant-1][i][0]);}
 
   if(arr_pos[variant-1][i][1]!=arr_pos[variant-1][i-1][1])
   {myservo12.write(arr_pos[variant-1][i][1]);}
 
   if(arr_pos[variant-1][i][2]!=arr_pos[variant-1][i-1][2])
   {myservo13.write(arr_pos[variant-1][i][2]);}
 
   if(arr_pos[variant-1][i][3]!=arr_pos[variant-1][i-1][3])
   {myservo14.write(arr_pos[variant-1][i][3]);}
 
   delay(200);
   }
 }

ƒл€ остановки, засыпани€ и пробуждени€ робота-паука существует процедура go_hor_all()

1
2
3
4
5
6
7
8
void go_hor_all()
 {
 myservo11.write(pos_stop[0][0]);
 myservo12.write(pos_stop[0][1]);
 myservo13.write(pos_stop[0][2]);
 myservo14.write(pos_stop[0][3]);
 delay(500);
}

–еализуем простое » -управление с пульта. ¬ыбираем 7 клавиш, данные о кодах заносим в скетч в виде констант. » в цикле loop() реализуем логику выбора движений робота-паука при нажатии клавиш » -пульта. ѕрограмма получени€ кода get_ir_kod() вызываетс€ по прерыванию CHANGE на входе 2. »спользуетс€ Arduino библиотека IRremote.

  режиму управлени€ робота с » -пульта добавим автономный режим. ¬ автономном режиме робот будет двигатьс€ вперед, при достижении преп€тстви€ робот будет делать поворот и оп€ть двигатьс€ вперед. ”льтразвуковой датчик HC-SR04 позвол€ет определ€ть рассто€ние до объекта в диапазоне от 2 до 500 см с точностью 0.3 см. —енсор излучает короткий ультразвуковой импульс (в момент времени 0), который отражаетс€ от объекта и принимаетс€ сенсором. –ассто€ние рассчитываетс€ исход€ из времени до получени€ эха и скорости звука в воздухе. ≈сли рассто€ние до преп€тстви€ меньше 10 см, робот делает поворот и движетс€ дальше вперед. ѕереход из режима » -управлени€ в автономный режим производим нажатием клавиш "желта€" и "син€€".

ƒл€ работы с датчиком HC-SR04 будем использовать Arduino библиотеку Ultrasonic.  онструктор Ultrasonic принимает два параметра Ч номера пинов к которым подключены выводы Trig и Echo:

1
2
3
4
5
#include "Ultrasonic.h"
 
// trig -12, echo - 13
 
Ultrasonic ultrasonic(12, 13);

ѕолучаетс€ такой код

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
// коды клавиш »  пульта
// lg 6710v00090d
#define FORWARD 32       //  pr +
#define BACK  33         //  pr -
#define CIRCLE_LEFT 17   //  vol-
#define CIRCLE_RIGHT 16  //   vol+
#define STOP 54          //   зелена€
#define SLEEP 55          //  красна€
#define AWAKE 37         //  ок
#define EXT 50          //  желта€
#define AUTO 52          //  син€€
 
... .... .....
  
void loop()
  {
  delay(1000);
  if(ext==0)
   {
   float dist_cm = ultrasonic.Ranging(CM);
   Serial.print("dist_cm=");Serial.println(dist_cm);
   if(dist_cm<10.0)
     ir_kod=CIRCLE_LEFT;
   else
     ir_kod=FORWARD;
   }
  if(ir_kod!=0)
   {
   Serial.print("ir_kod=");Serial.println(ir_kod); 
   switch(ir_kod)
     {
     case FORWARD :     // вперед
        course(1);
        Serial.print("forward\n");
        break;
     case BACK :     // назад
        course(2);
        Serial.print("back\n");
        break;
     case CIRCLE_LEFT:     // вращение влево
        course(3);
        Serial.print("circle_left\n");
        break;
     case CIRCLE_RIGHT :     // вращение вправо
        Serial.print("circle_right\n");
        course(4);
        break;
     case STOP :     // остановка
        ir_kod=0;
        go_hor_all();
        Serial.print("pause\n");
        break;
     case SLEEP :     // засыпание
        ir_kod=0;
        go_hor_all();
        myservo11.detach();myservo12.detach();
        myservo13.detach();myservo14.detach();
        digitalWrite(13,LOW);
        Serial.print("sleep\n");
        break;
     case AWAKE :     // пробуждение
        ir_kod=0;
        myservo11.attach(5);myservo12.attach(6);
        myservo13.attach(7);myservo14.attach(8);
        digitalWrite(13,HIGH);
        go_hor_all();
        Serial.print("awake\n");
        break;
     case AUTO :     // режим автономный
        //ir_kod=FORWARD;
        ext=0;
        myservo11.attach(5);myservo12.attach(6);
        myservo13.attach(7);myservo14.attach(8);
        Serial.print("auto\n");
        break;
    default:
        break;
     }
   }
 }
 
// получить код переданный с »  пульта
void get_ir_kod()
 {
 detachInterrupt(0);    // отключить прерывание 0
 if (irrecv.decode(&results)) 
  {
  //Serial.println(results.value);
  if (results.value > 0 && results.value < 0xFFFFFFFF)
    {
    ir_dt = results.value;
    if(ir_dt==EXT && ext==0)
      {ir_kod = SLEEP;ext=1;}
    else if(ext==1)
      {
      if(ir_dt==FORWARD || ir_dt==BACK || ir_dt==CIRCLE_LEFT
         || ir_dt==CIRCLE_RIGHT || ir_dt==STOP || ir_dt==SLEEP
         || ir_dt==AWAKE || ir_dt==AUTO )
       ir_kod = ir_dt;
      }
    else
      ;
    }
    irrecv.resume();
  }
  attachInterrupt(0, get_ir_kod, CHANGE);
 }

јрхив со скетчем и библиотеками Ultrasonic и IRremote можно скачать по ссылке:

ѕрикрепленные файлы:

 лючевые слова:
–обот-паук
сервопривод
/» -управление
ардуино
variant
Serial
Arduino
робот
паук
пульт
myservo
FORWARD
–оботы на платформе јрдуино
робот
робототехника


¬ернутьс€ в рубрику:

ѕроекты на платформе јрдуино


≈сли вы хотите видеть на нашем сайте больше статей то кликните ѕоделитьс€ в социальных сет€х! —пасибо!
—мотрите также:

ќбратите внимание полезна€ информаци€.