Orodha ya maudhui:
- Hatua ya 1: Mabadiliko ya vifaa
- Hatua ya 2: Pakua Maktaba ya VarSpeedServo
- Hatua ya 3: Endesha Mchoro huu
- Hatua ya 4: Ukweli, Maswala na kama …
Video: Kutumia Arduino Uno kwa Uwekaji wa XYZ wa 6 DOF Robotic Arm: Hatua 4
2024 Mwandishi: John Day | [email protected]. Mwisho uliobadilishwa: 2024-01-30 12:53
Mradi huu ni juu ya kutekeleza mchoro mfupi na rahisi wa Arduino kutoa nafasi ya kinematic ya XYZ inverse. Nilikuwa nimejenga mkono wa roboti wa servo 6 lakini ilipokuja kupata programu ya kuiendesha, hakukuwa na mengi huko nje isipokuwa mipango ya kawaida inayotumia ngao za servo kama SSC-32 (U) au programu na programu zingine ambazo zilikuwa ngumu kufunga na kuwasiliana na mkono. Kisha nikapata "Kinematics Inverse Inverse Kinematics" ya Oleg Mazurov kwenye Arduino "ambapo alitekeleza kinematics ya inverse katika mchoro rahisi wa Arduino.
Nilifanya marekebisho mawili ili kubadilisha nambari yake:
1. Nilitumia maktaba ya VarSpeedServo badala ya maktaba yake ya ngao ya servo kwa sababu ningeweza kudhibiti kasi ya servos na singeweza kutumia ngao ya servo aliyotumia. Kwa mtu yeyote anayezingatia kutumia nambari iliyotolewa hapa ninapendekeza utumie maktaba hii ya VarSpeedServo, badala ya maktaba ya servo.h, ili uweze kupunguza mwendo wako wa mkono wa roboti wakati wa maendeleo au unaweza kugundua kuwa mkono utakutia bila kutarajia uso au mbaya zaidi kwa sababu itakuwa ikitembea kwa kasi kamili ya servo.
2. Ninatumia sensor rahisi / ngao ya servo kuunganisha servos na Arduino Uno lakini haiitaji maktaba maalum ya servo kwani hutumia tu pini za Arduino. Inagharimu pesa chache tu lakini haihitajiki. Inafanya uhusiano mzuri safi wa servos na Arduino. Na sitarudi tena kwa huduma ngumu za Arduino Uno sasa. Ikiwa unatumia hii sensorer / ngao ya servo unahitaji kufanya marekebisho moja madogo ambayo nitaelezea hapa chini.
Nambari inafanya kazi vizuri na inakuwezesha kutumia mkono kwa kutumia kazi moja ambayo unapitisha vigezo vya x, y, x na kasi. Kwa mfano:
seti_arm (0, 240, 100, 0, 20); Vigezo vya // ni (x, y, z, pembe ya gripper, kasi ya servo)
kuchelewesha (3000); // kuchelewa kunahitajika kuruhusu muda wa mkono kuhamia eneo hili
Haikuweza kuwa rahisi. Nitajumuisha mchoro hapa chini.
Video ya Oleg iko hapa: Kudhibiti mkono wa Robotic na Arduino na Panya ya USB
Mpango wa asili wa Oleg, maelezo, na rasilimali: Kinematics Inverse ya Oleg ya Arduino Uno
Sielewi hesabu zote nyuma ya kawaida lakini jambo zuri sio lazima utumie nambari. Natumahi utajaribu.
Hatua ya 1: Mabadiliko ya vifaa
1. Kitu pekee kinachohitajika ni kwamba servo yako igeuke katika mwelekeo unaotarajiwa ambao unaweza kukuhitaji ubadilishe upangilio wa servos zako. Nenda kwenye ukurasa huu kuona mwelekeo wa servo unaotarajiwa kwa msingi, bega, kiwiko, na servos za mkono:
2. Ikiwa unatumia ngao ya sensa ambayo ninatumia unahitaji kufanya jambo moja kwake: piga pini inayounganisha 5v kutoka kwa ngao hadi Arduino Uno ili isiingie kwenye bodi ya Uno. Unataka kutumia voltage ya nje kwenye ngao kuwezesha servos zako tu, sio Arduino Uno au inaweza kuharibu Uno, najua kama nilichoma bodi mbili za Uno wakati voltage yangu ya nje ilikuwa volts 6 badala ya 5. Hii hukuruhusu kutumia juu kuliko 5v kuwezesha servos zako lakini ikiwa voltage yako ya nje iko juu kuliko volts 5 basi usiunganishe sensorer 5 za volt kwenye ngao au zitakaangwa.
Hatua ya 2: Pakua Maktaba ya VarSpeedServo
Unahitaji kutumia maktaba hii ambayo inachukua nafasi ya maktaba ya kiwango cha arduino servo kwa sababu hukuruhusu kupitisha kasi ya servo kwenye taarifa ya kuandika servo. Maktaba iko hapa:
Maktaba ya VarSpeedServo
Unaweza tu kutumia kitufe cha zip, pakua faili ya zip kisha usakinishe na Arduino IDE. Mara tu ikiwa imewekwa amri katika programu yako itaonekana kama: servo.write (100, 20);
Kigezo cha kwanza ni pembe na ya pili ni kasi ya servo kutoka 0 hadi 255 (kasi kamili).
Hatua ya 3: Endesha Mchoro huu
Hapa kuna mpango wa kushindana. Unahitaji kurekebisha vigezo vichache vya mwelekeo wako wa roboti:
1. BASE_HGT, HUMERUS, ULNA, GRIPPER urefu wa milimita.
2. Ingiza nambari zako za servo
3. Ingiza dakika ya servo na max katika taarifa za ambatisho.
4. Kisha jaribu amri rahisi set_arm () na kisha zero_x (), mstari () na duara () kazi za kupima. Hakikisha kasi yako ya servo iko chini mara ya kwanza unapoendesha kazi hizi kuzuia kuharibu mkono wako na mkono wako mwenyewe.
Bahati njema.
# pamoja na VarSpeedServo.h
/ * Udhibiti wa Servo kwa mkono wa AL5D * /
/ * Vipimo vya mkono (mm) * /
#fafanua BASE_HGT 90 // urefu wa msingi
#fafanua HUMERUS 100 // bega-kwa-kiwiko "mfupa"
#fafanua ULNA 135 // mfupa "wa kiwiko na mkono"
#fafanua GRIPPER 200 // gripper (ikiwa ni pamoja na utaratibu mzito wa mkono wa mzunguko) urefu"
#fafanua ftl (x) ((x)> = 0? (ndefu) ((x) +0.5): (ndefu) ((x) -0.5))
/ * Majina / nambari za Servo *
* Msingi servo HS-485HB * /
#fafanua BAS_SERVO 4
/ * Bega Servo HS-5745-MG * /
#fafanua SHL_SERVO 5
/ * Kiwiko Servo HS-5745-MG * /
#fafanua ELB_SERVO 6
/ * Wrist servo HS-645MG * /
#fafanua WRI_SERVO 7
/ * Mzunguko wa mkono Servo HS-485HB * /
#fafanua WRO_SERVO 8
/ * Kishikizi cha servo HS-422 * /
#fafanua GRI_SERVO 9
/ * mahesabu ya awali * /
kuelea hum_sq = HUMERUS * HUMERUS;
kuelea uln_sq = ULNA * ULNA;
int servoSPeed = 10;
// ServoShield servos; // Kitu cha ServoShield
VarSpeedServo servo1, servo2, servo3, servo4, servo5, servo6;
int loopCounter = 0;
mapigo ya upana upana = 6.6;
int microsecondsToDerees;
kuanzisha batili ()
{
kiambatisho cha servo1 (BAS_SERVO, 544, 2400);
kiambatisho cha servo2 (SHL_SERVO, 544, 2400);
kiambatisho cha servo3 (ELB_SERVO, 544, 2400);
kiambatisho cha servo4 (WRI_SERVO, 544, 2400);
kiambatisho cha servo5 (WRO_SERVO, 544, 2400);
kiambatisho cha servo6 (GRI_SERVO, 544, 2400);
kuchelewesha (5500);
//servos.start (); // Anza ngao ya servo
servo_park ();
kuchelewesha (4000);
Serial. Kuanza (9600);
Serial.println ("Anza");
}
kitanzi batili ()
{
loopCounter + = 1;
// set_arm (-300, 0, 100, 0, 10); //
// kuchelewa (7000);
// zero_x ();
// mstari ();
// mduara ();
kuchelewesha (4000);
ikiwa (loopCounter> 1) {
servo_park ();
// set_arm (0, 0, 0, 0, 10); // mbuga
kuchelewesha (5000);
toka (0); } // mpango wa kusitisha - piga upya ili kuendelea
// kutoka (0);
}
/ * utaratibu wa kuweka mkono kutumia kinematics inverse * /
/ * z ni urefu, y ni umbali kutoka kituo cha msingi nje, x ni upande kwa upande. y, z inaweza tu kuwa chanya * /
// batili set_arm (uint16_t x, uint16_t y, uint16_t z, uint16_t grip_angle)
batili set_arm (kuelea x, kuelea y, kuelea z, kuelea grip_angle_d, int servoSpeed)
{
kuelea grip_angle_r = radians (grip_angle_d); // mtego angle katika radians kwa matumizi katika mahesabu
/ * Pembe ya msingi na umbali wa radial kutoka x, y kuratibu * /
kuelea bas_angle_r = atan2 (x, y);
kuelea rdist = sqrt ((x * x) + (y * y));
/ * rdist ni uratibu wa mkono * /
y = rdist;
/ * Msaada wa mtego umehesabiwa kulingana na pembe ya mtego * /
kuelea grip_off_z = (dhambi (grip_angle_r)) * GRIPPER;
kuelea grip_off_y = (cos (grip_angle_r)) * GRIPPER;
/ * Msimamo wa Wrist * /
kuelea wrist_z = (z - mtego_off_z) - BASE_HGT;
kuelea wrist_y = y - mtego_off_y;
/ * Bega kwa umbali wa mkono (AKA sw) * /
kuelea s_w = (wrist_z * wrist_z) + (wrist_y * wrist_y);
kuelea s_w_sqrt = sqrt (s_w);
/ * s_w pembe kwa ardhi * /
kuelea a1 = atan2 (wrist_z, wrist_y);
/ * s_w angle kwa humerus * /
kuelea a2 = acos (((hum_sq - uln_sq) + s_w) / (2 * HUMERUS * s_w_sqrt));
/ * pembe ya bega * /
kuelea shl_angle_r = a1 + a2;
kuelea shl_angle_d = digrii (shl_angle_r);
/ * pembe ya kiwiko * /
kuelea elb_angle_r = acos ((hum_sq + uln_sq - s_w) / (2 * HUMERUS * ULNA));
kuelea elb_angle_d = digrii (elb_angle_r);
kuelea elb_angle_dn = - (180.0 - elb_angle_d);
/ * pembe ya mkono * /
kuelea wri_angle_d = (grip_angle_d - elb_angle_dn) - shl_angle_d;
/ * Kunde za Servo * /
kuelea bas_servopulse = 1500.0 - ((digrii (bas_angle_r)) * mapigo Upana);
kuelea shl_servopulse = 1500.0 + ((shl_angle_d - 90.0) * mapigo Upana);
kuelea elb_servopulse = 1500.0 - ((elb_angle_d - 90.0) * upana wa mapigo);
// kuelea wri_servopulse = 1500 + (wri_angle_d * pulseWidth);
// kuelea wri_servopulse = 1500 + (wri_angle_d * pulseWidth);
kuelea wri_servopulse = 1500 - (wri_angle_d * pulseWidth); // ilisasishwa 2018/2/11 na jimrd - nilibadilisha pamoja kuwa minus - sijui jinsi nambari hii ilifanya kazi kwa mtu yeyote hapo awali. Inawezekana kwamba servo ya kiwiko ilikuwa imewekwa na digrii 0 ikitazama chini badala ya juu.
/ * Weka servos * /
nafasi ya //servos. BAS_SERVO, ftl (bas_servopulse));
microsecondsToDegrees = ramani (ftl (bas_servopulse), 544, 2400, 0, 180);
andika servo1. (microsecondsToDerees, ServoSpeed); // tumia kazi hii ili uweze kuweka kasi ya servo //
nafasi ya //servos. SHL_SERVO, ftl (shl_servopulse));
microsecondsToDegrees = ramani (ftl (shl_servopulse), 544, 2400, 0, 180);
servo2.andika (microsecondsToDerees, servoSpeed);
nafasi ya //servos. ELB_SERVO, ftl (elb_servopulse));
microsecondsToDegrees = ramani (ftl (elb_servopulse), 544, 2400, 0, 180);
servo3. andika (microsecondsToDerees, servoSpeed);
nafasi ya //servos. WRI_SERVO, ftl (wri_servopulse));
microsecondsToDegrees = ramani (ftl (wri_servopulse), 544, 2400, 0, 180);
andika.
}
/ * songa servos kwenye nafasi ya maegesho * /
batili servo_park ()
{
nafasi ya //servos. BAS_SERVO, 1500);
andika servo1 (90, 10);
nafasi ya //servos. (SHL_SERVO, 2100);
andika servo2 (90, 10);
nafasi ya //servos. ELB_SERVO, 2100);
andika servo3 (90, 10);
nafasi ya //servos (WRI_SERVO, 1800);
andika servo4 (90, 10);
nafasi ya //servos. WRO_SERVO, 600);
andika servo5 (90, 10);
nafasi ya //servos (GRI_SERVO, 900);
andika servo6. (80, 10);
kurudi;
}
batili zero_x ()
{
kwa (mara mbili yaxis = 250.0; yaxis <400.0; yaxis + = 1) {
Serial.print ("yaxis =:"); Serial.println (yaxis);
seti_arm (0, yaxis, 200.0, 0, 10);
kuchelewesha (10);
}
kwa (mara mbili yaxis = 400.0; yaxis> 250.0; yaxis - = 1) {
seti_arm (0, yaxis, 200.0, 0, 10);
kuchelewesha (10);
}
}
/ * inasonga mkono kwa mstari ulionyooka * /
laini batili ()
{
kwa (mara mbili xaxis = -100.0; xaxis <100.0; xaxis + = 0.5) {
kuweka_arm (xaxis, 250, 120, 0, 10);
kuchelewesha (10);
}
kwa (kuelea xaxis = 100.0; xaxis> -100.0; xaxis - = 0.5) {
kuweka_arm (xaxis, 250, 120, 0, 10);
kuchelewesha (10);
}
}
duara tupu ()
{
#fafanua RADIUS 50.0
// pembe ya kuelea = 0;
kuelea zaxis, yaxis;
kwa (angle ya kuelea = 0.0; angle <360.0; angle + = 1.0) {
yaxis = RADIUS * dhambi (radians (angle)) + 300;
zaxis = RADIUS * cos (radians (angle)) + 200;
seti_arm (0, yaxis, zaxis, 0, 50);
kuchelewesha (10);
}
}
Hatua ya 4: Ukweli, Maswala na kama …
1. Ninapoendesha mduara () subroutine robot yangu inahamia zaidi kwa umbo la duara kuliko duara. Nadhani hiyo ni kwa sababu servos zangu hazijalinganishwa. Nilijaribu moja yao na microsecond 1500 hazikuwa sawa na digrii 90. Itafanya kazi hii kujaribu na kupata suluhisho. Usiamini kuna kitu kibaya na algorithm lakini badala ya mipangilio yangu. Sasisha 2018/2/11 - umegundua tu hii ni kwa sababu ya hitilafu katika nambari ya asili. Sioni jinsi mpango wake ulifanya kazi Nambari ya kudumu kwa kutumia hii: kuelea wri_servopulse = 1500 - (wri_angle_d * pulseWidth); (nambari asili ilikuwa ikiongeza)
2. Ninaweza kupata wapi habari zaidi juu ya jinsi kazi ya set_arm () inavyofanya kazi: Wavuti ya Oleg Mazurov inaelezea kila kitu au hutoa viungo kwa habari zaidi:
3. Je! Kuna hali yoyote ya ukaguzi wa mipaka? Hapana. Wakati mkono wangu wa roboti unapopitishwa uratibu batili wa xyz hufanya aina hii ya kuchekesha ya harakati ya kupindika kama paka ikinyoosha. Ninaamini Oleg anafanya ukaguzi katika programu yake ya hivi karibuni ambayo hutumia USB kupanga harakati za mkono. Tazama video yake na unganisha nambari yake mpya.
4. Kanuni inahitaji kusafishwa na nambari ya microsecond inaweza kufutwa.
Ilipendekeza:
Majaribio ya Uwekaji wa Takwimu za Juu (Kutumia Chatu): Hatua 11
Majaribio ya Uwekaji wa Takwimu za Juu (Kutumia Chatu): Kuna maagizo mengi ya upachikaji wa data, kwa hivyo wakati nilitaka kujenga mradi wa kukata miti mwenyewe niliangalia karibu na kundi. Zingine zilikuwa nzuri, zingine sio nyingi, kwa hivyo niliamua kuchukua maoni bora na kufanya maombi yangu mwenyewe. Mkutano huu
Xbox 360 ROBOTIC ARM [ARDUINO]: AXIOM ARM: 4 Hatua
Xbox 360 ROBOTIC ARM [ARDUINO]: SANAA:
Arduino 4 Wheel Drive Bluetooth RC Car Kutumia UNO R3, HC-05 na L293D Motorshield Pamoja na Uwekaji Coding na Programu ya Android: Hatua 8
Arduino 4 Wheel Drive Bluetooth RC Car Kutumia UNO R3, HC-05 na L293D Motorshield Pamoja na Coding na App ya Android: Leo nitakuambia juu ya jinsi ya kutengeneza gari la Bluetooth RC la arduino 4 kwa kutumia HC 05, ngao ya L2, 4 DC motor, na uandishi na programu ya android kudhibiti gari.Component iliyotumiwa: -1-Arduino UNO R32-Bluetooth HC-053-Motorshield L293
Jinsi ya Kutumia Arduino WeMos D1 WiFi UNO ESP8266 IOT IDE Bodi Inayoendana kwa Kutumia Blynk: Hatua 10
Jinsi ya Kutumia Bodi ya Sambamba ya Arduino WeMos D1 WiFi UNO ESP8266 IOT IDE kwa Kutumia Blynk: Arduino WeMos D1 WiFi UNO ESP8266 IOT IDE Bodi Sambamba Ufafanuzi: WiFi ESP8266 Bodi ya Maendeleo WEMOS D1. WEMOS D1 ni bodi ya maendeleo ya WIFI kulingana na ESP8266 12E. Utendaji ni sawa na ile ya NODEMCU, isipokuwa kwamba vifaa ni boil
Fanya Kusimama kwa Mlima wa DSLR kwa chini ya $ 6 Kutumia Mabomba ya PVC (Monopod / Tripod kwa Kamera yoyote): Hatua 6
Fanya Mlima wa DSLR Usimame chini ya $ 6 Kutumia Mabomba ya PVC (Monopod / Tripod kwa Kamera Yoyote): Ndio …. Unaweza kutengeneza yako na bomba tu la PVC na T's ni nyepesi … Ni sawa kabisa … Ni Imara imara … Ni ya kirafiki sana … ni mimi Sooraj Bagal na nitashiriki uzoefu wangu juu ya mlima huu wa kamera niliyounda