Sisukord:

Arduino Uno kasutamine 6 DOF robotkäe XYZ positsioneerimiseks: 4 sammu
Arduino Uno kasutamine 6 DOF robotkäe XYZ positsioneerimiseks: 4 sammu

Video: Arduino Uno kasutamine 6 DOF robotkäe XYZ positsioneerimiseks: 4 sammu

Video: Arduino Uno kasutamine 6 DOF robotkäe XYZ positsioneerimiseks: 4 sammu
Video: Hiwonder xArm UNO Robotic Arm Arduino UNO with Secondary Development Kit 2024, November
Anonim
Image
Image

Selle projekti eesmärk on rakendada lühike ja suhteliselt lihtne Arduino visand, et pakkuda XYZ -pöördkinemaatilist positsioneerimist. Olin ehitanud 6-servilise robotkäe, kuid selle käivitamiseks vajaliku tarkvara leidmiseks polnud seal palju muud, välja arvatud kohandatud programmid, mis töötavad kohandatud servokilpidel nagu SSC-32 (U) või muud programmid ja rakendused, mis olid käsivarre paigaldamine ja sellega suhtlemine on keeruline. Siis leidsin Oleg Mazurovi suurepäraseima „Robotkäepöördte pöördkinemaatika Arduino peal”, kus ta rakendas pöördkinemaatikat lihtsas Arduino visandis.

Tegin tema koodi kohandamiseks kaks muudatust:

1. Kasutasin tema kohandatud servokilbiteegi asemel VarSpeedServo raamatukogu, sest siis sain kontrollida servode kiirust ja ma ei peaks kasutama tema poolt kasutatavat servokilpi. Kõigil, kes kaaluvad siin esitatud koodi käivitamist, soovitan teil kasutada seda VarSpeedServo raamatukogu, mitte servo.h raamatukogu, et saaksite arendamise ajal oma robotkäe liikumist aeglustada või võite avastada, et käsi ootamatult teid sisse torkab. nägu või veel hullem, sest see liigub täie servo kiirusega.

2. Ma kasutan servode ühendamiseks Arduino Unoga lihtsat andurit/servokilpi, kuid see ei vaja spetsiaalset servoteeki, kuna see kasutab lihtsalt Arduino nööpnõelu. See maksab vaid paar dollarit, kuid pole vajalik. See tagab servode kena puhta ühenduse Arduinoga. Ja ma ei naase enam kunagi Arduino Unosse ühendatavate servode juurde. Kui kasutate seda andurit/servokilpi, peate tegema ühe väikese muudatuse, mida kirjeldan allpool.

Kood töötab suurepäraselt ja võimaldab teil kätt juhtida, kasutades ühte funktsiooni, milles edastate parameetrid x, y, x ja kiirus. Näiteks:

set_arm (0, 240, 100, 0, 20); // parameetrid on (x, y, z, haardenurk, servo kiirus)

viivitus (3000); // viivitus on vajalik, et anda käsivarrele aega sellesse kohta liikuda

Lihtsam ei saaks olla. Lisan visandi allpool.

Olegi video on siin: Robotkäe juhtimine Arduino ja USB -hiirega

Olegi algne programm, kirjeldused ja ressursid: Olegi pöördkineetika Arduino Unole

Ma ei mõista kogu rutiini taga olevat matemaatikat, kuid tore on see, et te ei pea koodi kasutama. Loodetavasti proovite.

Samm: riistvara muutmine

Riistvara muutmine
Riistvara muutmine

1. Ainus nõutav asi on see, et teie servo pöörleb oodatud suundadesse, mis võib nõuda teie servode paigaldamise füüsilist tagasipööramist. Minge sellele lehele, et näha põhi-, õla-, küünarnuki- ja randmeservade eeldatavat servosuunda:

2. Kui kasutate minu kasutatavat andurikilpi, peate tegema ühe asja: painutama tihvti, mis ühendab 5v kilbist Arduino Unoga, nii et see ei ühenduks Uno plaadiga. Kui soovite kasutada kilbi välist pinget, et toita ainult oma servosid, mitte Arduino Unot, vastasel juhul võib see Uno hävitada. Ma tean, et põletasin kaks Uno -plaati, kui mu väline pinge oli 6 volti, mitte 5. See võimaldab teil kasutada kõrgemat kui 5 V toiteallikat, kuid kui teie väline pinge on kõrgem kui 5 volti, siis ärge ühendage kilbiga 5 -voldiseid andureid, vastasel juhul lähevad need praadima.

Samm: laadige alla VarSpeedServo raamatukogu

Peate kasutama seda teeki, mis asendab tavalise arduino servoteegi, kuna see võimaldab teil edastada servo kiiruse servo kirjutamise avaldusse. Raamatukogu asub siin:

VarSpeedServo raamatukogu

Võite lihtsalt kasutada zip -nuppu, alla laadida zip -faili ja seejärel installida see Arduino IDE -ga. Kui programm on installitud, näeb see välja selline: servo.write (100, 20);

Esimene parameeter on nurk ja teine servo kiirus vahemikus 0 kuni 255 (täiskiirus).

Samm: käivitage see visand

Siin on võistlusprogramm. Peate oma robotkäe mõõtmete jaoks muutma mõnda parameetrit:

1. BASE_HGT, HUMERUS, ULNA, GRIPPER pikkus millimeetrites.

2. Sisestage oma servopinge numbrid

3. Sisestage lisamislausetesse servo min ja max.

4. Seejärel proovige testimiseks lihtsat käsku set_arm () ja seejärel null_x (), line () ja ring () funktsioone. Veenduge, et teie servo kiirus on nende funktsioonide esmakordsel käivitamisel madal, et vältida teie käe ja käe vigastamist.

Edu.

#include VarSpeedServo.h

/ * Servojuhtimine AL5D käele */

/ * Käe mõõtmed (mm) */

#define BASE_HGT 90 // aluskõrgus

#define HUMERUS 100 // õlast küünarnukini "luu"

#define ULNA 135 // küünarnukist randmeni "luu"

#define GRIPPER 200 // haaratsi (sh raskeveokite randme pööramismehhanismi) pikkus"

#define ftl (x) ((x)> = 0? (long) ((x) +0,5):(long) ((x) -0,5)) // float to long conversion

/ * Servo nimed/numbrid *

* Alusservo HS-485HB */

#define BAS_SERVO 4

/ * Õla servo HS-5745-MG */

#defineeri SHL_SERVO 5

/ * Küünarliigese servo HS-5745-MG */

#define ELB_SERVO 6

/ * Randmeservo HS-645MG */

#define WRI_SERVO 7

/ * Randme pöörlev servo HS-485HB */

#define WRO_SERVO 8

/ * Haaratsi servo HS-422 */

#define GRI_SERVO 9

/ * eelarvutused */

float hum_sq = HUMERUS*HUMERUS;

ujuk uln_sq = ULNA*ULNA;

int servoSPeed = 10;

// ServoShield servod; // ServoShield objekt

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

int loopCounter = 0;

int pulseWidth = 6,6;

int mikrosekunditToDegrees;

tühine seadistus ()

{

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

viivitus (5500);

//servos.start (); // Käivitage servokilp

servo_park ();

viivitus (4000);

Seriaalne algus (9600);

Serial.println ("Start");

}

tühine tsükkel ()

{

loopCounter += 1;

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

// viivitus (7000);

// null_x ();

// line ();

// ring ();

viivitus (4000);

if (loopCounter> 1) {

servo_park ();

// set_arm (0, 0, 0, 0, 10); // park

viivitus (5000);

väljapääs (0); } // programmi peatamine - jätkamiseks klõpsake nuppu Lähtesta

// väljumine (0);

}

/ * käe positsioneerimise rutiin, kasutades pöördkinemaatikat */

/* z on kõrgus, y on kaugus aluse keskpunktist väljapoole, x on küljelt küljele. y, z saab olla ainult positiivne */

// 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)

{

float grip_angle_r = radiaanid (grip_angle_d); // haardenurk radiaanides arvutustes kasutamiseks

/ * Põhinurk ja radiaalkaugus x, y koordinaatidest */

ujuk bas_nurk_r = atan2 (x, y);

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

/ * rdist on käe y koordinaat */

y = rdist;

/ * Haarde nihked arvutatakse haardenurga alusel */

float grip_off_z = (patt (grip_angle_r)) * GRAAPER;

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

/ * Randmeasend */

ujuk randme_z = (z - grip_off_z) - BASE_HGT;

ujuk randme_y = y - grip_off_y;

/ * Kaugus õlast randmeni (AKA sw) */

ujuk s_w = (randme_z * randme_z) + (randme_y * randme_y);

ujuk s_w_sqrt = sqrt (s_w);

/ * nurk maapinna suhtes */

ujuk a1 = atan2 (randme_z, randme_y);

/ * s_w nurk õlavarreluu suhtes */

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

/ * õla nurk */

ujuk shl_angle_r = a1 + a2;

float shl_angle_d = kraadid (shl_angle_r);

/ * küünarnuki nurk */

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

float elb_angle_d = kraadid (elb_angle_r);

float elb_angle_dn = - (180,0 - elb_angle_d);

/ * randme nurk */

float wri_angle_d = (grip_angle_d - elb_angle_dn) - shl_angle_d;

/ * Servo impulsid */

float bas_servopulse = 1500,0 - ((kraadi (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); // uuendas 2018/2/11 by jimrd - muutsin pluss miinuseks - pole kindel, kuidas see kood kellegi jaoks varem töötas. Võib juhtuda, et küünarnuki servo oli paigaldatud 0 kraadi allapoole, mitte üles.

/ * Määra servod */

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

mikrosekundidToDegrees = kaart (ftl (bas_servopulse), 544, 2400, 0, 180);

servo1.write (mikrosekundidToDegrees, servoSpeed); // kasutage seda funktsiooni servokiiruse seadistamiseks //

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

mikrosekundidToDegrees = kaart (ftl (shl_servopulse), 544, 2400, 0, 180);

servo2.write (mikrosekundidToDegrees, servoSpeed);

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

mikrosekundidToDegrees = kaart (ftl (elb_servopulse), 544, 2400, 0, 180);

servo3.write (mikrosekundidToDegrees, servoSpeed);

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

mikrosekundidToDegrees = kaart (ftl (wri_servopulse), 544, 2400, 0, 180);

servo4.write (mikrosekundidToDegrees, servoSpeed);

}

/ * liigutage servod parkimisasendisse */

void 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.kirjutage (80, 10);

tagasipöördumine;

}

tühine null_x ()

{

jaoks (kahekordne telg = 250,0; telg <400,0; telg += 1) {

Serial.print ("yaxis =:"); Serial.println (yaxis);

set_arm (0, teljed, 200,0, 0, 10);

viivitus (10);

}

jaoks (kahekordne telg = 400,0; telg> 250,0; telg -= 1) {

set_arm (0, teljed, 200,0, 0, 10);

viivitus (10);

}

}

/ * liigutab kätt sirgjooneliselt */

tühi rida ()

{

jaoks (kahekordne telg = -100,0; telg <100,0; telg += 0,5) {

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

viivitus (10);

}

jaoks (ujuk xaxis = 100,0; xaxis> -100,0; xaxis -= 0,5) {

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

viivitus (10);

}

}

tühi ring ()

{

#define RADIUS 50.0

// ujukinurk = 0;

ujuk zaxis, yaxis;

jaoks (ujuknurk = 0,0; nurk <360,0; nurk += 1,0) {

yaxis = RAADIUS * sin (radiaanid (nurk)) + 300;

zaxis = RAADIUS * cos (radiaanid (nurk)) + 200;

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

viivitus (10);

}

}

Samm: faktid, probleemid jms …

Faktid, probleemid jms…
Faktid, probleemid jms…

1. Kui ma käivitan ringi () alamprogrammi, liigub mu robot rohkem elliptilise kujuga kui ring. Ma arvan, et see on tingitud sellest, et minu servod pole kalibreeritud. Testisin ühte neist ja 1500 mikrosekundit ei olnud sama mis 90 kraadi. Töötab selle kallal, et leida lahendus. Ärge uskuge, et algoritmis on midagi viga, vaid pigem minu seadetes. Värskendus 2018/2/11 - avastasin just, et selle põhjuseks oli viga algkoodis. Ma ei näe, kuidas tema programm töötas Fikseeritud kood, kasutades seda: float wri_servopulse = 1500 - (wri_angle_d * pulseWidth); (lisati algne kood)

2. Kust leida lisateavet funktsiooni set_arm () toimimise kohta: Oleg Mazurovi veebisait selgitab kõike või pakub linke lisateabe saamiseks:

3. Kas on olemas piiritingimuste kontroll? Ei. Kui mu robotkäest möödub kehtetu xyz -koordinaat, teeb see seda naljakat kaardumist nagu kass sirutades. Usun, et Oleg kontrollib oma viimast programmi, mis kasutab käeliigutuste programmeerimiseks USB -d. Vaadake tema videot ja linki tema viimasele koodile.

4. Kood tuleb puhastada ja mikrosekundiline kood ära kaotada.

Soovitan: