Robotik
OKUDUĞUNUZ KONU
Arduino Android Kontrollü Örümcek Robot Yapımı
152

Arduino Android Kontrollü Örümcek Robot Yapımı

Yazar : Alper Gencan29 Aralık 2016

Herkese merhaba. Uzun bir aradan sonra yazmaya devam ediyorum. Bu yazımda sizlere yapmış olduğum örümcek robottan bahsedeceğim. Hep yapmak istediğim projelerden biriydi ama motorlar maliyetli olduğu için bir türlü yapamıyordum. Şimdi yapma imkanı buldum ve sizlerle paylaşmak istedim.

İşe öncelikle malzemeleri temin etmekle başladım. Resimde görüldüğü gibi örümcek robot 4 bacaklı ve her bacakta 3 adet servo sg90 bulunmakta.

Malzemeleri Satın Al

Bu projenin malzemelerini tek sepette satın alabilirsiniz.Malzemeler demonte olarak gönderilir. “Satın Almak İçin Yukarıda Butona Basınız”

Malzemeler:

NOT-1: Kaynak gösterdiğim yerde bütün 3d parçalar bulunmaktadır. Ancak “s_hold ” isimli parça biraz ayarsız olmuş. Sorun şu ki parça servonun hareketini sağlıyor eklem gibi. Ancak parçanın silindir kısmı girmesi gereken yere girmiyor yani çaplar aynı gibi. Bende bu parçanın çapını Solid’de düşürerek yeniden yaptım bu sayede servo rahat hareket ediyor. Genede isteyen istediğini basabilir. Kendi parçam dosya içerisindedir.

Basılması Gereken Parçalar:

  • 1 x body_d.stl
  • 1 x body_u.stl
  • 2 x coxa_l.stl
  • 2 x coxa_r.stl
  • 2 x tibia_l.stl
  • 2 x tibia_r.stl
  • 4 x femur_1.stl
  • 8 x s_hold.stl

Şimdi bütün plastik parçaları bastıktan sonra montaja geçiyoruz.Yapmanız gereken şey öncelikle servo motorları girmesi gereken yerlere sokarken servonun kablosuna zarar vermemek için servonun altında bulunan 4 adet vidayı çıkarın ve kapağı kaldırın. Servoyu yerine yerleştirdikten sonra tekrar kapağı takarak vidalayın.

NOT-2: Servo motorların üst plastik kısımlarını vidalamayın henüz. Servo motorları yerine takarken verdiğim kaynakları takip ederek yapınız ve motorların ne tarafa dönük olduğuna dikkat edin.

Motorların bacak sırasına göre bağlanması gerekmektedir. Bacak sırasına göre motorlar numaralandırılmıştır. Aynı zamanda Arduino kodu içerisinde hangi motorun hangi pine bağlanması gerektiği yazmaktadır.

Montaj bittikten sonra motorların açılarının ayarlanması için bir ayar kodu bulunmaktadir. Servoların üst plastik parçaları bu test kodu yüklendikten sonra vidalanması gerekmektedir. Burada dikkat etmeniz gereken verdiğim kaynakta gösterdiği gibi parçaların konumları ve hizaları çok önemli olabildiğince simetrik yapmaya çalışın ve ondan sonra servo motorların üst plastik parçasını vidalayın.

Servoların Ayar Kodu :

 http://www.instructables.com/id/DIY-Spider-RobotQuad-robot-Quadruped/step11/Locate-the-initial-position-for-legs/

Ayar kodundan sonra servoları da vidaladıysanız işlem tamamdır. Artık asıl kodu yükleyebilirsiniz.

Arduino Kodu: 

http://www.instructables.com/id/DIY-Spider-RobotQuad-robot-Quadruped/step13/It-is-showtime/

/* Includes ------------------------------------------------------------------*/
#include <Servo.h> //to define and control servos
#include <FlexiTimer2.h>//to set a timer to manage all servos
/* Servos --------------------------------------------------------------------*/
//define 12 servos for 4 legs
Servo servo[4][3];
//define servos' ports
const int servo_pin[4][3] = { {2, 3, 4}, {5, 6, 7}, {8, 9, 10}, {11, 12, 13} };
/* Size of the robot ---------------------------------------------------------*/
const float length_a = 55;
const float length_b = 77.5;
const float length_c = 27.5;
const float length_side = 71;
const float z_absolute = -28;
/* Constants for movement ----------------------------------------------------*/
const float z_default = -50, z_up = -30, z_boot = z_absolute;
const float x_default = 62, x_offset = 0;
const float y_start = 0, y_step = 40;
/* variables for movement ----------------------------------------------------*/
volatile float site_now[4][3]; //real-time coordinates of the end of each leg
volatile float site_expect[4][3]; //expected coordinates of the end of each leg
float temp_speed[4][3]; //each axis' speed, needs to be recalculated before each movement
float move_speed; //movement speed
float speed_multiple = 1; //movement speed multiple
const float spot_turn_speed = 4;
const float leg_move_speed = 8;
const float body_move_speed = 3;
const float stand_seat_speed = 1;
volatile int rest_counter; //+1/0.02s, for automatic rest
//functions' parameter
const float KEEP = 255;
//define PI for calculation
const float pi = 3.1415926;
/* Constants for turn --------------------------------------------------------*/
//temp length
const float temp_a = sqrt(pow(2 * x_default + length_side, 2) + pow(y_step, 2));
const float temp_b = 2 * (y_start + y_step) + length_side;
const float temp_c = sqrt(pow(2 * x_default + length_side, 2) + pow(2 * y_start + y_step + length_side, 2));
const float temp_alpha = acos((pow(temp_a, 2) + pow(temp_b, 2) - pow(temp_c, 2)) / 2 / temp_a / temp_b);
//site for turn
const float turn_x1 = (temp_a - length_side) / 2;
const float turn_y1 = y_start + y_step / 2;
const float turn_x0 = turn_x1 - temp_b * cos(temp_alpha);
const float turn_y0 = temp_b * sin(temp_alpha) - turn_y1 - length_side;
/* ---------------------------------------------------------------------------*/

/*
- setup function
---------------------------------------------------------------------------*/
void setup()
{
//start serial for debug
Serial.begin(115200);
Serial.println("Robot starts initialization");
//initialize default parameter
set_site(0, x_default - x_offset, y_start + y_step, z_boot);
set_site(1, x_default - x_offset, y_start + y_step, z_boot);
set_site(2, x_default + x_offset, y_start, z_boot);
set_site(3, x_default + x_offset, y_start, z_boot);
for (int i = 0; i < 4; i++)
{
for (int j = 0; j < 3; j++)
{
site_now[i][j] = site_expect[i][j];
}
}
//start servo service
FlexiTimer2::set(20, servo_service);
FlexiTimer2::start();
Serial.println("Servo service started");
//initialize servos
servo_attach();
Serial.println("Servos initialized");
Serial.println("Robot initialization Complete");
}
void servo_attach(void)
{
for (int i = 0; i < 4; i++)
{
for (int j = 0; j < 3; j++)
{
servo[i][j].attach(servo_pin[i][j]);
delay(100);
}
}
}

void servo_detach(void)
{
for (int i = 0; i < 4; i++)
{
for (int j = 0; j < 3; j++)
{
servo[i][j].detach();
delay(100);
}
}
}
/*
- loop function
---------------------------------------------------------------------------*/
void loop()
{
Serial.println("Stand");
stand();
delay(2000);
Serial.println("Step forward");
step_forward(5);
delay(2000);
Serial.println("Step back");
step_back(5);
delay(2000);
Serial.println("Turn left");
turn_left(5);
delay(2000);
Serial.println("Turn right");
turn_right(5);
delay(2000);
Serial.println("Hand wave");
hand_wave(3);
delay(2000);
Serial.println("Hand wave");
hand_shake(3);
delay(2000);
Serial.println("Sit");
sit();
delay(5000);
}

/*
- sit
- blocking function
---------------------------------------------------------------------------*/
void sit(void)
{
move_speed = stand_seat_speed;
for (int leg = 0; leg < 4; leg++)
{
set_site(leg, KEEP, KEEP, z_boot);
}
wait_all_reach();
}

/*
- stand
- blocking function
---------------------------------------------------------------------------*/
void stand(void)
{
move_speed = stand_seat_speed;
for (int leg = 0; leg < 4; leg++) { set_site(leg, KEEP, KEEP, z_default); } wait_all_reach(); } /* - spot turn to left - blocking function - parameter step steps wanted to turn ---------------------------------------------------------------------------*/ void turn_left(unsigned int step) { move_speed = spot_turn_speed; while (step-- > 0)
{
if (site_now[3][1] == y_start)
{
//leg 3&1 move
set_site(3, x_default + x_offset, y_start, z_up);
wait_all_reach();

set_site(0, turn_x1 - x_offset, turn_y1, z_default);
set_site(1, turn_x0 - x_offset, turn_y0, z_default);
set_site(2, turn_x1 + x_offset, turn_y1, z_default);
set_site(3, turn_x0 + x_offset, turn_y0, z_up);
wait_all_reach();

set_site(3, turn_x0 + x_offset, turn_y0, z_default);
wait_all_reach();

set_site(0, turn_x1 + x_offset, turn_y1, z_default);
set_site(1, turn_x0 + x_offset, turn_y0, z_default);
set_site(2, turn_x1 - x_offset, turn_y1, z_default);
set_site(3, turn_x0 - x_offset, turn_y0, z_default);
wait_all_reach();

set_site(1, turn_x0 + x_offset, turn_y0, z_up);
wait_all_reach();

set_site(0, x_default + x_offset, y_start, z_default);
set_site(1, x_default + x_offset, y_start, z_up);
set_site(2, x_default - x_offset, y_start + y_step, z_default);
set_site(3, x_default - x_offset, y_start + y_step, z_default);
wait_all_reach();

set_site(1, x_default + x_offset, y_start, z_default);
wait_all_reach();
}
else
{
//leg 0&2 move
set_site(0, x_default + x_offset, y_start, z_up);
wait_all_reach();

set_site(0, turn_x0 + x_offset, turn_y0, z_up);
set_site(1, turn_x1 + x_offset, turn_y1, z_default);
set_site(2, turn_x0 - x_offset, turn_y0, z_default);
set_site(3, turn_x1 - x_offset, turn_y1, z_default);
wait_all_reach();

set_site(0, turn_x0 + x_offset, turn_y0, z_default);
wait_all_reach();

set_site(0, turn_x0 - x_offset, turn_y0, z_default);
set_site(1, turn_x1 - x_offset, turn_y1, z_default);
set_site(2, turn_x0 + x_offset, turn_y0, z_default);
set_site(3, turn_x1 + x_offset, turn_y1, z_default);
wait_all_reach();

set_site(2, turn_x0 + x_offset, turn_y0, z_up);
wait_all_reach();

set_site(0, x_default - x_offset, y_start + y_step, z_default);
set_site(1, x_default - x_offset, y_start + y_step, z_default);
set_site(2, x_default + x_offset, y_start, z_up);
set_site(3, x_default + x_offset, y_start, z_default);
wait_all_reach();

set_site(2, x_default + x_offset, y_start, z_default);
wait_all_reach();
}
}
}

/*
- spot turn to right
- blocking function
- parameter step steps wanted to turn
---------------------------------------------------------------------------*/
void turn_right(unsigned int step)
{
move_speed = spot_turn_speed;
while (step-- > 0)
{
if (site_now[2][1] == y_start)
{
//leg 2&0 move
set_site(2, x_default + x_offset, y_start, z_up);
wait_all_reach();

set_site(0, turn_x0 - x_offset, turn_y0, z_default);
set_site(1, turn_x1 - x_offset, turn_y1, z_default);
set_site(2, turn_x0 + x_offset, turn_y0, z_up);
set_site(3, turn_x1 + x_offset, turn_y1, z_default);
wait_all_reach();

set_site(2, turn_x0 + x_offset, turn_y0, z_default);
wait_all_reach();

set_site(0, turn_x0 + x_offset, turn_y0, z_default);
set_site(1, turn_x1 + x_offset, turn_y1, z_default);
set_site(2, turn_x0 - x_offset, turn_y0, z_default);
set_site(3, turn_x1 - x_offset, turn_y1, z_default);
wait_all_reach();

set_site(0, turn_x0 + x_offset, turn_y0, z_up);
wait_all_reach();

set_site(0, x_default + x_offset, y_start, z_up);
set_site(1, x_default + x_offset, y_start, z_default);
set_site(2, x_default - x_offset, y_start + y_step, z_default);
set_site(3, x_default - x_offset, y_start + y_step, z_default);
wait_all_reach();

set_site(0, x_default + x_offset, y_start, z_default);
wait_all_reach();
}
else
{
//leg 1&3 move
set_site(1, x_default + x_offset, y_start, z_up);
wait_all_reach();

set_site(0, turn_x1 + x_offset, turn_y1, z_default);
set_site(1, turn_x0 + x_offset, turn_y0, z_up);
set_site(2, turn_x1 - x_offset, turn_y1, z_default);
set_site(3, turn_x0 - x_offset, turn_y0, z_default);
wait_all_reach();

set_site(1, turn_x0 + x_offset, turn_y0, z_default);
wait_all_reach();

set_site(0, turn_x1 - x_offset, turn_y1, z_default);
set_site(1, turn_x0 - x_offset, turn_y0, z_default);
set_site(2, turn_x1 + x_offset, turn_y1, z_default);
set_site(3, turn_x0 + x_offset, turn_y0, z_default);
wait_all_reach();

set_site(3, turn_x0 + x_offset, turn_y0, z_up);
wait_all_reach();

set_site(0, x_default - x_offset, y_start + y_step, z_default);
set_site(1, x_default - x_offset, y_start + y_step, z_default);
set_site(2, x_default + x_offset, y_start, z_default);
set_site(3, x_default + x_offset, y_start, z_up);
wait_all_reach();

set_site(3, x_default + x_offset, y_start, z_default);
wait_all_reach();
}
}
}

/*
- go forward
- blocking function
- parameter step steps wanted to go
---------------------------------------------------------------------------*/
void step_forward(unsigned int step)
{
move_speed = leg_move_speed;
while (step-- > 0)
{
if (site_now[2][1] == y_start)
{
//leg 2&1 move
set_site(2, x_default + x_offset, y_start, z_up);
wait_all_reach();
set_site(2, x_default + x_offset, y_start + 2 * y_step, z_up);
wait_all_reach();
set_site(2, x_default + x_offset, y_start + 2 * y_step, z_default);
wait_all_reach();

move_speed = body_move_speed;

set_site(0, x_default + x_offset, y_start, z_default);
set_site(1, x_default + x_offset, y_start + 2 * y_step, z_default);
set_site(2, x_default - x_offset, y_start + y_step, z_default);
set_site(3, x_default - x_offset, y_start + y_step, z_default);
wait_all_reach();

move_speed = leg_move_speed;

set_site(1, x_default + x_offset, y_start + 2 * y_step, z_up);
wait_all_reach();
set_site(1, x_default + x_offset, y_start, z_up);
wait_all_reach();
set_site(1, x_default + x_offset, y_start, z_default);
wait_all_reach();
}
else
{
//leg 0&3 move
set_site(0, x_default + x_offset, y_start, z_up);
wait_all_reach();
set_site(0, x_default + x_offset, y_start + 2 * y_step, z_up);
wait_all_reach();
set_site(0, x_default + x_offset, y_start + 2 * y_step, z_default);
wait_all_reach();

move_speed = body_move_speed;

set_site(0, x_default - x_offset, y_start + y_step, z_default);
set_site(1, x_default - x_offset, y_start + y_step, z_default);
set_site(2, x_default + x_offset, y_start, z_default);
set_site(3, x_default + x_offset, y_start + 2 * y_step, z_default);
wait_all_reach();

move_speed = leg_move_speed;

set_site(3, x_default + x_offset, y_start + 2 * y_step, z_up);
wait_all_reach();
set_site(3, x_default + x_offset, y_start, z_up);
wait_all_reach();
set_site(3, x_default + x_offset, y_start, z_default);
wait_all_reach();
}
}
}

/*
- go back
- blocking function
- parameter step steps wanted to go
---------------------------------------------------------------------------*/
void step_back(unsigned int step)
{
move_speed = leg_move_speed;
while (step-- > 0)
{
if (site_now[3][1] == y_start)
{
//leg 3&0 move
set_site(3, x_default + x_offset, y_start, z_up);
wait_all_reach();
set_site(3, x_default + x_offset, y_start + 2 * y_step, z_up);
wait_all_reach();
set_site(3, x_default + x_offset, y_start + 2 * y_step, z_default);
wait_all_reach();

move_speed = body_move_speed;

set_site(0, x_default + x_offset, y_start + 2 * y_step, z_default);
set_site(1, x_default + x_offset, y_start, z_default);
set_site(2, x_default - x_offset, y_start + y_step, z_default);
set_site(3, x_default - x_offset, y_start + y_step, z_default);
wait_all_reach();

move_speed = leg_move_speed;

set_site(0, x_default + x_offset, y_start + 2 * y_step, z_up);
wait_all_reach();
set_site(0, x_default + x_offset, y_start, z_up);
wait_all_reach();
set_site(0, x_default + x_offset, y_start, z_default);
wait_all_reach();
}
else
{
//leg 1&2 move
set_site(1, x_default + x_offset, y_start, z_up);
wait_all_reach();
set_site(1, x_default + x_offset, y_start + 2 * y_step, z_up);
wait_all_reach();
set_site(1, x_default + x_offset, y_start + 2 * y_step, z_default);
wait_all_reach();

move_speed = body_move_speed;

set_site(0, x_default - x_offset, y_start + y_step, z_default);
set_site(1, x_default - x_offset, y_start + y_step, z_default);
set_site(2, x_default + x_offset, y_start + 2 * y_step, z_default);
set_site(3, x_default + x_offset, y_start, z_default);
wait_all_reach();

move_speed = leg_move_speed;

set_site(2, x_default + x_offset, y_start + 2 * y_step, z_up);
wait_all_reach();
set_site(2, x_default + x_offset, y_start, z_up);
wait_all_reach();
set_site(2, x_default + x_offset, y_start, z_default);
wait_all_reach();
}
}
}

// add by RegisHsu

void body_left(int i)
{
set_site(0, site_now[0][0] + i, KEEP, KEEP);
set_site(1, site_now[1][0] + i, KEEP, KEEP);
set_site(2, site_now[2][0] - i, KEEP, KEEP);
set_site(3, site_now[3][0] - i, KEEP, KEEP);
wait_all_reach();
}

void body_right(int i)
{
set_site(0, site_now[0][0] - i, KEEP, KEEP);
set_site(1, site_now[1][0] - i, KEEP, KEEP);
set_site(2, site_now[2][0] + i, KEEP, KEEP);
set_site(3, site_now[3][0] + i, KEEP, KEEP);
wait_all_reach();
}

void hand_wave(int i)
{
float x_tmp;
float y_tmp;
float z_tmp;
move_speed = 1;
if (site_now[3][1] == y_start)
{
body_right(15);
x_tmp = site_now[2][0];
y_tmp = site_now[2][1];
z_tmp = site_now[2][2];
move_speed = body_move_speed;
for (int j = 0; j < i; j++)
{
set_site(2, turn_x1, turn_y1, 50);
wait_all_reach();
set_site(2, turn_x0, turn_y0, 50);
wait_all_reach();
}
set_site(2, x_tmp, y_tmp, z_tmp);
wait_all_reach();
move_speed = 1;
body_left(15);
}
else
{
body_left(15);
x_tmp = site_now[0][0];
y_tmp = site_now[0][1];
z_tmp = site_now[0][2];
move_speed = body_move_speed;
for (int j = 0; j < i; j++)
{
set_site(0, turn_x1, turn_y1, 50);
wait_all_reach();
set_site(0, turn_x0, turn_y0, 50);
wait_all_reach();
}
set_site(0, x_tmp, y_tmp, z_tmp);
wait_all_reach();
move_speed = 1;
body_right(15);
}
}

void hand_shake(int i)
{
float x_tmp;
float y_tmp;
float z_tmp;
move_speed = 1;
if (site_now[3][1] == y_start)
{
body_right(15);
x_tmp = site_now[2][0];
y_tmp = site_now[2][1];
z_tmp = site_now[2][2];
move_speed = body_move_speed;
for (int j = 0; j < i; j++)
{
set_site(2, x_default - 30, y_start + 2 * y_step, 55);
wait_all_reach();
set_site(2, x_default - 30, y_start + 2 * y_step, 10);
wait_all_reach();
}
set_site(2, x_tmp, y_tmp, z_tmp);
wait_all_reach();
move_speed = 1;
body_left(15);
}
else
{
body_left(15);
x_tmp = site_now[0][0];
y_tmp = site_now[0][1];
z_tmp = site_now[0][2];
move_speed = body_move_speed;
for (int j = 0; j < i; j++)
{
set_site(0, x_default - 30, y_start + 2 * y_step, 55);
wait_all_reach();
set_site(0, x_default - 30, y_start + 2 * y_step, 10);
wait_all_reach();
}
set_site(0, x_tmp, y_tmp, z_tmp);
wait_all_reach();
move_speed = 1;
body_right(15);
}
}

/*
- microservos service /timer interrupt function/50Hz
- when set site expected,this function move the end point to it in a straight line
- temp_speed[4][3] should be set before set expect site,it make sure the end point
move in a straight line,and decide move speed.
---------------------------------------------------------------------------*/
void servo_service(void)
{
sei();
static float alpha, beta, gamma;

for (int i = 0; i < 4; i++)
{
for (int j = 0; j < 3; j++) { if (abs(site_now[i][j] - site_expect[i][j]) >= abs(temp_speed[i][j]))
site_now[i][j] += temp_speed[i][j];
else
site_now[i][j] = site_expect[i][j];
}

cartesian_to_polar(alpha, beta, gamma, site_now[i][0], site_now[i][1], site_now[i][2]);
polar_to_servo(i, alpha, beta, gamma);
}

rest_counter++;
}

/*
- set one of end points' expect site
- this founction will set temp_speed[4][3] at same time
- non - blocking function
---------------------------------------------------------------------------*/
void set_site(int leg, float x, float y, float z)
{
float length_x = 0, length_y = 0, length_z = 0;

if (x != KEEP)
length_x = x - site_now[leg][0];
if (y != KEEP)
length_y = y - site_now[leg][1];
if (z != KEEP)
length_z = z - site_now[leg][2];

float length = sqrt(pow(length_x, 2) + pow(length_y, 2) + pow(length_z, 2));

temp_speed[leg][0] = length_x / length * move_speed * speed_multiple;
temp_speed[leg][1] = length_y / length * move_speed * speed_multiple;
temp_speed[leg][2] = length_z / length * move_speed * speed_multiple;

if (x != KEEP)
site_expect[leg][0] = x;
if (y != KEEP)
site_expect[leg][1] = y;
if (z != KEEP)
site_expect[leg][2] = z;
}

/*
- wait one of end points move to expect site
- blocking function
---------------------------------------------------------------------------*/
void wait_reach(int leg)
{
while (1)
if (site_now[leg][0] == site_expect[leg][0])
if (site_now[leg][1] == site_expect[leg][1])
if (site_now[leg][2] == site_expect[leg][2])
break;
}

/*
- wait all of end points move to expect site
- blocking function
---------------------------------------------------------------------------*/
void wait_all_reach(void)
{
for (int i = 0; i < 4; i++) wait_reach(i); } /* - trans site from cartesian to polar - mathematical model 2/2 ---------------------------------------------------------------------------*/ void cartesian_to_polar(volatile float &alpha, volatile float &beta, volatile float &gamma, volatile float x, volatile float y, volatile float z) { //calculate w-z degree float v, w; w = (x >= 0 ? 1 : -1) * (sqrt(pow(x, 2) + pow(y, 2)));
v = w - length_c;
alpha = atan2(z, v) + acos((pow(length_a, 2) - pow(length_b, 2) + pow(v, 2) + pow(z, 2)) / 2 / length_a / sqrt(pow(v, 2) + pow(z, 2)));
beta = acos((pow(length_a, 2) + pow(length_b, 2) - pow(v, 2) - pow(z, 2)) / 2 / length_a / length_b);
//calculate x-y-z degree
gamma = (w >= 0) ? atan2(y, x) : atan2(-y, -x);
//trans degree pi->180
alpha = alpha / pi * 180;
beta = beta / pi * 180;
gamma = gamma / pi * 180;
}

/*
- trans site from polar to microservos
- mathematical model map to fact
- the errors saved in eeprom will be add
---------------------------------------------------------------------------*/
void polar_to_servo(int leg, float alpha, float beta, float gamma)
{
if (leg == 0)
{
alpha = 90 - alpha;
beta = beta;
gamma += 90;
}
else if (leg == 1)
{
alpha += 90;
beta = 180 - beta;
gamma = 90 - gamma;
}
else if (leg == 2)
{
alpha += 90;
beta = 180 - beta;
gamma = 90 - gamma;
}
else if (leg == 3)
{
alpha = 90 - alpha;
beta = beta;
gamma += 90;
}

servo[leg][0].write(alpha);
servo[leg][1].write(beta);
servo[leg][2].write(gamma);
} 

Yazar kodda robotun hareketlerini sonsuz döngü olarak ayarlamış. Yani linkte gösterdiğim hareketleri sürekli tekrarlıyor. Kendiniz kodu düzenleyebilirsiniz. Ben kendime göre yeniden düzenledim ve bir android uygulaması hazırladım. Bu sayede istenilen hareketi telefonunuzdan yaptırabilirsiniz.

Robotun kaynağı :

http://www.thingiverse.com/thing:1009659

http://www.instructables.com/id/DIY-Spider-RobotQuad-robot-Quadruped/step1/Test-the-main-board/

Bluetooth Bağlantısı:

Sensör Shield üzerinde bulunan COM kısmına bluetooth modülünüzün pinleri bağlanıcaktır.Bağlantı pinleri:

Arduino     Bluetooth

RX————-TX

TX————-RX

VCC———–VCC

GND———-GND

 

Android Uygulaması:

İndirme dosyasının içerisinde bulunan Spider.apk dosyasını telefonunuzun herhangi bir klasörüne atarak telefonunuzdan dosyayı açtığınızda uygulama yüklenecektir.Eğer bilinmeyen kaynaklara izin ver uyarısı çıkarsa ayarlar kısmından izin verirseniz uygulama sorunsuz yüklenecektir.

Proje Dosyası İndirme Linki: (3D Parçalar dahil değil)

https://yadi.sk/d/y4WuEOeD35XrEb

Herkese Merhaba

Genel Bilgilendirme:
Öncelikle projeye gösterilen ilgi için teşekkür ederim. Elimden geldiğince herkese yardımcı olmaya çalıştım.

* Robot için 3.7v lipo pil kullanmanızı tavsiye ediyorum.Projeyi yaparken bende 7.4v olduğu için onunla denemiştim ama 3.7v da gayet hesapllı ve stabil çalıştırıyor sorunsuz.Direk sensor shielde bağladığınızda robotun çalışması lazım.Arduino için ayrıca beslemeye gerek yok.Eğer çalışmazsa sensor shield sorunlludur. Şahsen sıfır aldığım 3 shieldden 2 si bozuk çıktı.
* Kodun derlenmesinde oluşan hatalar için şunları söyleyim. Öncelikle bluetooth bağlı değilken kodu yükleyin.Bağlıyken kod yüklenmez.Bağlıyken denediyseniz bluetooth çıkarın sonra arduinoyu çıkarıp tekrar takın öyle yükleyin. Birde sensor shield i arduinodan kaldırıp öyle yüklemenizi öneririm.

Son olarak projenin videosunu çekmiştim.Buradan izleyebilirsiniz:

SİZCE NASIL OLMUŞ?
Beğendim
80%
İlginç
8%
Eh İşte
4%
Anlamadım
6%
Kötü
0%
Berbat
2%
YAZAR HAKKINDA
Alper Gencan
Alper Gencan
Karabük Üniversitesi Elektrik Elektronik Mühendisliği mezunuyum. Ankara'da Best Grup Savunma Sanayi firmasında Ar-Ge mühendisi olarak çalışmaktayım. Üniversite hayatıma kadar amatörce olan elektrik elektronik uğraşım okul hayatım ile bir adım öne taşınmış oldu. Daha çok kontrol sistemleri ve robot projeleri ile uğraşmaktayım.
152 YORUMLAR
1 2 3
  • ibrahim
    30 Ekim 2018 at 18:18

    merhabalar. Bu projeye mesafe sensörü ekleyip engellerden kaçan hale getirmek için neler yapmamız gerekir?

    • Alper Gencan
      Alper Gencan
      17 Kasım 2018 at 14:00

      Merhaba. Bu projeye ultrasonik mesafe sensörü eklenemez çünkü boşta başka pin kalmıyor. Ama Arduino Mega kullanıp sensör ekleyebilirsiniz. Bunun içinde normal sensör kodunu ayrı bir void şeklinde yazıp program başında o bloğu çağırarak sürekli işleme sokturabilirsiniz. Bu sayede sensör kod bloğu sürekli çalışır. Veya ikinci bir seçenek yön bloklarının içerisinde çağırarak işleme sokabilirsiniz.

  • muhendisbey
    31 Ekim 2018 at 16:36

    biz butun bu parcalari siparis ettikten sonra ekstradan 3D yazicidan parca mi basmamiz gerekiyor? basilacak parcalar demissiniz aciklar misiniz

    • Alper Gencan
      Alper Gencan
      17 Kasım 2018 at 14:02

      Merhaba. Örümceğin plastik iskeleti 3d yazıcıdan basılacak. Hazır olarak satan vardır belki. Ama orjinal proje dosyasının içerisinde bir eklem parçası var ufak birşey. O parça ekleme girmiyor girse bile rahat hareket etmiyor bacak zorlanıyor yani. o yüzden o parçayı küçültüp eklemiştim onu kullanmanız daha kolay çalışmasını sağlar robotun.

  • hüseyin çınar
    3 Kasım 2018 at 21:05

    güç kaynağı linki çalışmıyot hangisini kullanmamızı önerirsiniz

  • Rcihad
    6 Kasım 2018 at 17:39

    bağlantı şeması varmı acaba

  • erdal aslsanoğlu
    10 Kasım 2018 at 11:29

    Merhaba çalışmanız gayet güzel olmuş. Emeğinize sağlık..
    benim bir sorum olacaktı. Bu kodları Mblock’ta yapabiliyor muyuz? Scratch eğitimi ile Arduino eğitimi için..
    teşekkürler.

  • melih
    15 Kasım 2018 at 18:05

    error: FlexiTimer2.h: No such file or directory
    exit status 1
    FlexiTimer2.h: No such file or directory

    Sorununun çözümü için ne yapmalıyız?

    • Alper Gencan
      Alper Gencan
      17 Kasım 2018 at 14:04

      FlexiTimer2.h kütüphanesi sisteminizde bulunmadığı için bu hatayı vermiş. İnternetten kütüphane dosyasını indirerek Arduinonun kurulu olduğu yerde libraries klasörüne kopyalayın. Sorun çözülecektir.

  • Mehmet SERÇE
    25 Kasım 2018 at 20:45

    Adam adam adam gibi adam

  • deniz ekin çelik
    7 Aralık 2018 at 16:34

    biz 9. sınıf lise öğrencileri olarak bir örümcek robot yapıyoruz fakat örümcek robotun devre şemasını paylaşmamışsınız bu bizim projemizin taslağı için çok önemli lütfen paylaşabilir misiniz ? bu devre şemasını paylaşmadığınız için biz projeyi tamamlayıp testlim edemiyoruz lütfen yardımcı olun !!

  • CENK KILIÇ
    14 Aralık 2018 at 12:25

    :\Users\user\AppData\Local\Temp\arduino_modified_sketch_442732\sketch_dec14b.ino: In function ‘void cartesian_to_polar(volatile float&, volatile float&, volatile float&, float, float, float)’:

    sketch_dec14b:623: error: ‘v’ was not declared in this scope

    v=w-length_c;

    gibi bir hata alıyorum.Lütfen yardımcı olur musunuz sorun nedir

  • kerem dogan
    19 Aralık 2018 at 02:57

    ‘v’ was not declared in this scope hatası alıyorum nasıl düzeltebilirim

  • REHA KÖK
    21 Aralık 2018 at 19:31

    Arduino:1.6.5 (Windows 8.1), Kart:”Arduino Uno”

    sketch_dec21a.ino: In function ‘void cartesian_to_polar(volatile float&, volatile float&, volatile float&, float, float, float)’:
    sketch_dec21a:623: error: ‘v’ was not declared in this scope
    sketch_dec21a:623: error: ‘w’ was not declared in this scope
    ‘v’ was not declared in this scope

    hatası alıyorum

  • FURKAN DOĞAN
    24 Aralık 2018 at 19:25

    ROBOTUN DEMİR KISMI KAÇ GRAM

  • Shafuq
    24 Aralık 2018 at 20:30

    Merhaba ben Örümcek robot yapacaktım ve YouTube yabancı bir kanal buldum bu projeyi yapıyordu ama oled ekran ve 3 tane rgb led eklemişti şimdi benim merak ettiğim şey acaba bende ekleye bilirmiyim bunları ?
    Eklersem nasıl ekleye bilirim ve led ışığının telefon uygulamasından değişmesini nasıl sağlarım + olarak birde kamera eklemek istiyorum yardımcı olursanız çok sevinirim,teşekkür ederim.

  • Kadir
    26 Aralık 2018 at 22:13

    Uygulamada hata çıkıyor, error 516 unable to write broken pipe diye bir hata. Sebebi nedir?

  • CENK KILIÇ
    3 Ocak 2019 at 09:31

    bacaklardan bir tanesi başlangıç konumundayken diğerleri ile aynı konumda durmuyor.ayar kodundan bahsetmişsiniz ancak o ayar kodunu bulup o bacağı ayarlayamadım lütfen yardımcı olun

YORUM YAP