Мазмұны:

6 DOF роботтық қолының XYZ позициясына Arduino Uno қолдану: 4 қадам
6 DOF роботтық қолының XYZ позициясына Arduino Uno қолдану: 4 қадам

Бейне: 6 DOF роботтық қолының XYZ позициясына Arduino Uno қолдану: 4 қадам

Бейне: 6 DOF роботтық қолының XYZ позициясына Arduino Uno қолдану: 4 қадам
Бейне: Kingmaker - The Change of Destiny Episode 6 | Arabic, English, Turkish, Spanish Subtitles 2024, Қараша
Anonim
Image
Image

Бұл жоба XYZ кері кинематикалық орналасуын қамтамасыз ету үшін қысқа және салыстырмалы түрде жеңіл Arduino эскизін енгізу туралы. Мен 6 серво роботты қолын жасадым, бірақ оны іске қосатын бағдарламалық қамтамасыз етуді іздеуге келгенде, SSC-32 (U) сияқты реттелетін серво қалқандарында жұмыс істейтін реттелетін бағдарламаларды немесе басқа бағдарламалар мен қосымшаларды қоспағанда, көп нәрсе болған жоқ. қолмен орнату және байланыс жасау қиын. Содан кейін мен Олег Мазуровтың «Ардуинодағы роботтық қолдың кері кинематикасын» таптым, онда ол кері кинематиканы қарапайым Arduino эскизінде енгізді.

Мен оның кодын бейімдеу үшін екі өзгеріс енгіздім:

1. Мен VarSpeedServo кітапханасын оның сервистік қалқан кітапханасының орнына қолдандым, себебі мен сервопроцестердің жылдамдығын басқара алатын едім және ол қолданған серво қалқанын пайдаланудың қажеті жоқ еді. Мұнда берілген кодты іске қосуды ойлайтын кез келген адам үшін роботтың қол қозғалысын бәсеңдету үшін servo.h кітапханасын емес, осы VarSpeedServo кітапханасын пайдалануды ұсынамын немесе сіздің қолыңыз сізді күтпеген жерден итеріп жіберуі мүмкін. бет немесе одан да жаман, себебі ол толық серво жылдамдығымен қозғалады.

2. Мен серверлерді Arduino Uno -ға қосу үшін қарапайым сенсор/серво қалқанын қолданамын, бірақ ол арнайы сервистік кітапхананы қажет етпейді, себебі ол тек Arduino түйреуіштерін қолданады. Бұл бірнеше долларды құрайды, бірақ қажет емес. Бұл сервистердің Arduino -ға жақсы таза қосылуын қамтамасыз етеді. Мен енді ешқашан Arduino Uno серверлеріне қайтып оралмаймын. Егер сіз бұл сенсорды/серво қалқанын қолдансаңыз, мен төменде сипаттайтын бір ғана кішігірім модификация жасауыңыз қажет.

Код өте жақсы жұмыс істейді және x, y, x және жылдамдық параметрлерін беретін бір функцияны қолдана отырып қолды басқаруға мүмкіндік береді. Мысалға:

set_arm (0, 240, 100, 0, 20); // параметрлері (x, y, z, ұстағыш бұрышы, серво жылдамдығы)

кешіктіру (3000); // уақытты осы орынға жылжыту үшін кешіктіру қажет

Қарапайым болуы мүмкін емес. Мен төмендегі эскизді қосамын.

Олегтің бейнесі мына жерде: Arduino мен USB тінтуірінің көмегімен роботтық қолды басқару

Олегтің түпнұсқа бағдарламасы, сипаттамасы мен ресурстары: Arduino Uno үшін Олегтің кері кинематикасы

Мен күнделікті математиканы түсінбеймін, бірақ жақсы нәрсе - кодты қолданудың қажеті жоқ. Сіз оны сынап көресіз деп үміттенемін.

1 -қадам: аппараттық құралдарды өзгерту

Аппараттық құралдардың модификациясы
Аппараттық құралдардың модификациясы

1. Жалғыз талап - сіздің серво күтілетін бағытта бұрылуы, бұл сізге сервопростордың орнатылуын физикалық түрде өзгертуді талап етуі мүмкін. Негізгі, иық, шынтақ және білек сервосының күтілетін сервоа бағытын көру үшін осы бетке өтіңіз:

2. Егер сіз мен қолданатын сенсорлық қалқанды қолдансаңыз, оған бір нәрсені жасау керек: қалқаннан 5v -ты Arduino Uno -ға қосатын түйреуішті Uno тақтасына қосылмайтындай етіп бүгіңіз. Сіз қалқандағы сыртқы кернеуді Arduino Uno -ны емес, серверлеріңізді ғана қуаттандыру үшін қолданғыңыз келеді немесе ол Uno -ны бұзуы мүмкін, себебі мен білемін, мен екі Uno тақтасын 5 вольт емес, 6 вольт күйдіргенде күйдірдім. серверлерді қуаттандыру үшін 5 вольттан жоғары пайдалану, бірақ егер сіздің сыртқы кернеуіңіз 5 вольттан жоғары болса, қалқанға 5 вольтты сенсорларды қоспаңыз немесе олар қуырылады.

2 -қадам: VarSpeedServo кітапханасын жүктеңіз

Сіз стандартты arduino сервистік кітапханасының орнын басатын бұл кітапхананы пайдалануыңыз қажет, себебі ол сервоприводты жазу операторына серво жылдамдығын беруге мүмкіндік береді. Кітапхана мына жерде орналасқан:

VarSpeedServo кітапханасы

Сіз zip түймесін қолдана аласыз, zip файлын жүктей аласыз, содан кейін Arduino IDE көмегімен орната аласыз. Бағдарламада орнатылғаннан кейін команда келесідей болады: servo.write (100, 20);

Бірінші параметр - бұрыш, екіншісі - серваның 0 -ден 255 -ке дейінгі жылдамдығы (толық жылдамдық).

3 -қадам: Бұл эскизді іске қосыңыз

Міне сайыс бағдарламасы. Қолдың робот өлшемдері үшін бірнеше параметрлерді өзгерту қажет:

1. BASE_HGT, HUMERUS, ULNA, GRIPPER ұзындығы миллиметрмен.

2. Серво түйреуіш нөмірлерін енгізіңіз

3. Тіркеме мәлімдемелерінде servo min және max енгізіңіз.

4. Содан кейін қарапайым set_arm () пәрменін, содан кейін zero_x (), line () және шеңбер () функцияларын сынап көріңіз. Қол мен өз қолыңызға зақым келтірмеу үшін осы функцияларды бірінші рет іске қосқанда, серво жылдамдығының төмен екеніне көз жеткізіңіз.

Іске сәт.

#VarSpeedServo.h қосыңыз

/ * AL5D тұтқасы үшін сервистік басқару */

/ * Қолдың өлшемдері (мм) */

#BASE_HGT 90 // негіз биіктігін анықтаңыз

#define HUMERUS 100 // иықтан шынтаққа дейін «сүйек»

#анықтаңыз ULNA 135 // шынтақтан білекке дейін «сүйек»

#depine GRIPPER 200 // ұстағыш (білектің айналу механизмін қосқанда) ұзындығы »

#define ftl (x) ((x)> = 0? (long) ((x) +0.5):(long) ((x) -0.5)) // ұзақ түрлендіруге ауысу

/ * Серво атаулары/нөмірлері *

* HS-485HB негізгі серво */

#BAS_SERVO анықтаңыз 4

/ * Иық Servo HS-5745-MG */

#SHL_SERVO анықтаңыз 5

/ * Шынтақ Servo HS-5745-MG */

ELB_SERVO 6 анықтаңыз

/ * HS-645MG білек серво */

#анықтаңыз WRI_SERVO 7

/ * HS-485HB білегін айналдыру серво */

#анықтаңыз WRO_SERVO 8

/ * HS-422 ұстағыш ұстағышы//

#анықтаңыз GRI_SERVO 9

/ * алдын ала есептеулер */

float hum_sq = HUMERUS*HUMERUS;

float uln_sq = ULNA*ULNA;

int servoSPeed = 10;

// ServoShield серверлері; // ServoShield нысаны

VarSpeedServo servo1, servo2, servo3, servo4, servo5, servo6;

int loopCounter = 0;

int pulseWidth = 6.6;

int microsecondsToDegrees;

жарамсыз орнату ()

{

servo1.attach (BAS_SERVO, 544, 2400);

servo2.attach (SHL_SERVO, 544, 2400);

servo3.attach (ELB_SERVO, 544, 2400);

servo4.attach (WRI_SERVO, 544, 2400);

servo5.attach (WRO_SERVO, 544, 2400);

servo6.attach (GRI_SERVO, 544, 2400);

кешіктіру (5500);

//servos.start (); // Серво қалқанын іске қосыңыз

servo_park ();

кешіктіру (4000);

Serial.begin (9600);

Serial.println («Бастау»);

}

бос цикл ()

{

loopCounter += 1;

// set_arm (-300, 0, 100, 0, 10); //

// кешігу (7000);

// нөл_x ();

//түзу();

// шеңбер ();

кешіктіру (4000);

if (loopCounter> 1) {

servo_park ();

// set_arm (0, 0, 0, 0, 10); // саябақ

кешіктіру (5000);

шығу (0); } // бағдарламаны кідірту - жалғастыру үшін қалпына келтіру түймесін басыңыз

// шығу (0);

}

/ * кері кинематиканы қолданатын қолды орналастыру тәртібі */

/* z - биіктік, у - базалық орталықтан қашықтық, х - бүйірден. y, z тек оң болуы мүмкін */

// void set_arm (uint16_t x, uint16_t y, uint16_t z, uint16_t grip_angle)

void set_arm (float x, float y, float z, float grip_angle_d, int servoSpeed)

{

өзгермелі grip_angle_r = радиандар (grip_angle_d); // есептеулерде қолдану үшін радианмен ұстау бұрышы

/ * Негізгі бұрыш және х, у координаттарынан радиалды қашықтық */

float bas_angle_r = atan2 (x, y);

float rdist = sqrt ((x * x) + (y * y));

/ * rdist - бұл қолдың координаты */

y = rdist;

/ * Тұтқаны бұру негізінде есептелген тұтқаның ығысуы */

float grip_off_z = (sin (grip_angle_r)) * GRIPPER;

float grip_off_y = (cos (grip_angle_r)) * GRIPPER;

/ * Білектің орналасуы */

float wrist_z = (z - grip_off_z) - BASE_HGT;

жүзу білегі_y = y - grip_off_y;

/ * Иық білекке дейінгі қашықтық (AKA sw) */

float s_w = (білек_z * білек_z) + (білек_ж * білек_ж);

қалқыма s_w_sqrt = sqrt (s_w);

/ * s_w жерге бұрышы */

float a1 = atan2 (білек_z, білек_ж);

/ * s_w иық сүйегіне бұрышы */

float a2 = acos (((hum_sq - uln_sq) + s_w) / (2 * HUMERUS * s_w_sqrt));

/ * иық бұрышы */

float shl_angle_r = a1 + a2;

float shl_angle_d = градус (shl_angle_r);

/ * шынтақ бұрышы */

float elb_angle_r = acos ((hum_sq + uln_sq - s_w) / (2 * HUMERUS * ULNA));

float elb_angle_d = градус (elb_angle_r);

float elb_angle_dn = - (180.0 - elb_angle_d);

/ * білек бұрышы */

float wri_angle_d = (grip_angle_d - elb_angle_dn) - shl_angle_d;

/ * Серво импульсі//

float bas_servopulse = 1500.0 - ((градус (bas_angle_r)) * pulseWidth);

float shl_servopulse = 1500.0 + ((shl_angle_d - 90.0) * pulseWidth);

float elb_servopulse = 1500.0 - ((elb_angle_d - 90.0) * pulseWidth);

// float wri_servopulse = 1500 + (wri_angle_d * pulseWidth);

// float wri_servopulse = 1500 + (wri_angle_d * pulseWidth);

float wri_servopulse = 1500 - (wri_angle_d * pulseWidth); // jimrd арқылы 2018/2/11 жаңартылды - мен плюсті минусқа өзгерттім - бұл код бұрын ешкімге қалай жұмыс істегенін білмеймін. Мүмкін, шынтақ серво 0 градусқа жоғары емес, төмен қаратып орнатылған болар.

/ * Серваларды орнату */

//servos.setposition(BAS_SERVO, ftl (bas_servopulse));

microsecondsToDegrees = карта (ftl (bas_servopulse), 544, 2400, 0, 180);

servo1.write (microsecondsToDegrees, servoSpeed); // бұл функцияны серво жылдамдығын орнату үшін қолданыңыз //

//servos.setposition(SHL_SERVO, ftl (shl_servopulse));

microsecondsToDegrees = карта (ftl (shl_servopulse), 544, 2400, 0, 180);

servo2.write (microsecondsToDegrees, servoSpeed);

//servos.setposition(ELB_SERVO, ftl (elb_servopulse));

microsecondsToDegrees = карта (ftl (elb_servopulse), 544, 2400, 0, 180);

servo3.write (microsecondsToDegrees, servoSpeed);

//servos.setposition(WRI_SERVO, ftl (wri_servopulse));

microsecondsToDegrees = карта (ftl (wri_servopulse), 544, 2400, 0, 180);

servo4.write (microsecondsToDegrees, servoSpeed);

}

/ * автокөлікті тұраққа қою *

жарамсыз servo_park ()

{

//servos.setposition(BAS_SERVO, 1500);

servo1.write (90, 10);

//servos.setposition(SHL_SERVO, 2100);

servo2.write (90, 10);

//servos.setposition(ELB_SERVO, 2100);

servo3.write (90, 10);

//servos.setposition(WRI_SERVO, 1800);

servo4.write (90, 10);

//servos.setposition(WRO_SERVO, 600);

servo5.write (90, 10);

//servos.setposition(GRI_SERVO, 900);

servo6.write (80, 10);

қайтару;

}

нөл_x () жарамсыз

{

for (double yaxis = 250.0; yaxis <400.0; yaxis += 1) {

Serial.print («yaxis =:»); Serial.println (yaxis);

set_arm (0, yakis, 200.0, 0, 10);

кешіктіру (10);

}

for (double yaxis = 400.0; yaxis> 250.0; yaxis -= 1) {

set_arm (0, yakis, 200.0, 0, 10);

кешіктіру (10);

}

}

/ * қолды түзу сызықпен жылжытады */

бос жол ()

{

үшін (қос xaxis = -100.0; xaxis <100.0; xaxis += 0.5) {

set_arm (xaxis, 250, 120, 0, 10);

кешіктіру (10);

}

үшін (float xaxis = 100.0; xaxis> -100.0; xaxis -= 0.5) {

set_arm (xaxis, 250, 120, 0, 10);

кешіктіру (10);

}

}

бос орын ()

{

#RADIUS 50.0 анықтаңыз

// өзгермелі бұрыш = 0;

float zaxis, yaxis;

үшін (қалқымалы бұрыш = 0,0; бұрыш <360,0; бұрыш += 1,0) {

yaxis = RADIUS * sin (радиандар (бұрыш)) + 300;

zaxis = RADIUS * cos (радиандар (бұрыш)) + 200;

set_arm (0, yaxis, zaxis, 0, 50);

кешіктіру (10);

}

}

4 -қадам: Фактілер, мәселелер және ұқсас …

Фактілер, мәселелер және сол сияқты…
Фактілер, мәселелер және сол сияқты…

1. Мен шеңберді () кіші бағдарламаны іске қосқанда, менің роботым шеңберден гөрі эллиптикалық пішінде көбірек қозғалады, менің ойымша, бұл менің серводарым калибрленбегендіктен. Мен олардың біреуін сынап көрдім және 1500 микросекунд 90 градусқа ұқсамады. Бұл мәселені шешуге тырысады. Алгоритмде дұрыс емес нәрсе бар деп сенбеңіз, керісінше менің параметрлерімде. 2018/2/11 жаңарту - бұл бастапқы кодтағы қатеге байланысты екенін анықтады. Мен оның бағдарламасы қалай жұмыс істейтінін білмеймін Бекітілген код: float wri_servopulse = 1500 - (wri_angle_d * pulseWidth); (бастапқы код қосылды)

2. set_arm () функциясы қалай жұмыс істейтіні туралы қосымша ақпаратты қайдан алуға болады: Олег Мазуровтың веб-сайты бәрін түсіндіреді немесе қосымша ақпарат алу үшін сілтемелер береді:

3. Шекаралық шартты тексеру бар ма? Жоқ. Менің робот қолым жарамсыз xyz координатынан өткенде, ол мысықтың созылуы сияқты доғал қозғалыстың бұл түрін жасайды. Менің ойымша, Олег қолдың қозғалысын бағдарламалау үшін USB қолдайтын өзінің соңғы бағдарламасын тексереді. Оның бейнесін қараңыз және оның соңғы кодына сілтеме жасаңыз.

4. Кодты тазалау қажет, ал микросекундтық кодты жоюға болады.

Ұсынылған: