Мазмуну:
- 1 -кадам: Аппараттык өзгөртүүлөр
- 2 -кадам: VarSpeedServo китепканасын жүктөп алыңыз
- 3 -кадам: Бул эскизди иштетүү
- 4 -кадам: Фактылар, маселелер жана башкалар …
Video: 6 DOF робот колунун XYZ позициясына Arduino Uno колдонуу: 4 кадам
2024 Автор: John Day | [email protected]. Акыркы өзгөртүү: 2024-01-30 10:41
Бул долбоор XYZдин тескери кинематикалык позициясын камсыз кылуу үчүн кыска жана салыштырмалуу жеңил Arduino эскизин ишке ашыруу жөнүндө. Мен 6 servo робот колун кургам, бирок аны иштетүү үчүн программалык камсыздоону табууга келгенде, SSC-32 (U) сыяктуу колдонуучунун серво калканчында иштеген бажы программаларынан же башка программалар менен колдонмолордон башка эч нерсе жок болчу. орнотуу жана кол менен байланышуу татаал. Андан кийин мен Олег Мазуровдун эң мыкты "Роботтук колдун артка кинематикасын" таптым, ал жерде тескери кинематиканы жөнөкөй Arduino эскизинде ишке ашырды.
Мен анын кодун ыңгайлаштыруу үчүн эки өзгөртүү киргиздим:
1. Мен VarSpeedServo китепканасын колдонгон серво калкан китепканасынын ордуна колдондум, анткени мен серволордун ылдамдыгын башкара алчумун жана ал колдонгон серво калканды колдонуунун кажети жок болчу. Бул жерде берилген кодду иштетүүнү ойлонгондор үчүн мен сизди servo.h китепканасынын ордуна ушул VarSpeedServo китепканасын колдонууну сунуштайм, ошондо сиз роботтун кыймылын басаңдата аласыз, же сизди күтүлбөгөн жерден колуңузга салып коёт бет же андан да жаманы, анткени ал толук servo ылдамдыкта кыймылдайт.
2. Мен серверлерди Arduino Uno менен туташтыруу үчүн жөнөкөй сенсорду/серво калканы колдоном, бирок ал атайын сервопрепатеканы талап кылбайт, анткени ал жөн гана Arduino казыктарын колдонот. Бул бир нече доллар турат, бирок ал талап кылынбайт. Бул сервистердин Arduino менен жакшы таза байланышын түзөт. Мен азыр эч качан кайра Arduino Uno серверлерине кайрылбайм. Эгерде сиз бул сенсорду/серво калканды колдонсоңуз, мен төмөндө сүрөттөп бере турган кичинекей бир өзгөртүүлөрдү жасашыңыз керек.
Код абдан жакшы иштейт жана x, y, x жана ылдамдык параметрлерин өткөрүп берген бир функцияны колдонуу менен кол менен иштөөгө мүмкүндүк берет. Мисалы:
set_arm (0, 240, 100, 0, 20); // параметрлери (x, y, z, gripper бурчу, servo ылдамдыгы)
кечигүү (3000); // кечигүү бул жерге жылуу үчүн убакыт керек
Жөнөкөй болушу мүмкүн эмес. Мен төмөндөгү эскизди киргизем.
Олегдин видеосу бул жерде: Arduino жана USB чычкандын жардамы менен робот колун башкаруу
Олегдин баштапкы программасы, сүрөттөөлөрү жана ресурстары: Олегдин Ардуино Уно үчүн тескери кинематикасы
Мен күн тартибинин артындагы бардык математиканы түшүнбөйм, бирок эң сонун жери - бул кодду колдонуунун кажети жок. Сиз аракет кыласыз деп үмүттөнөбүз.
1 -кадам: Аппараттык өзгөртүүлөр
1. Бир гана нерсе талап кылынат, бул сиздин сервонун күтүлгөн багыттарга бурулушу, бул сиздин сервопросторуңуздун физикалык жактан артка кайтарылышын талап кылышы мүмкүн. Базага, ийинге, чыканакка жана билек үчүн күтүлгөн серво багытын көрүү үчүн бул баракчага өтүңүз:
2. Эгерде мен колдонуп жаткан сенсордук калканчты колдонсоңуз, анда бир нерсени жасашыңыз керек: 5v калканчтан Arduino Uno менен туташтырылган пинти Uno тактасына туташпай тургандай кылып ийип коюңуз. Сиз калкандагы тышкы чыңалууну Arduino Uno эмес, сервосуңузду гана иштетүү үчүн колдонгуңуз келет, же бул Unoну жок кылышы мүмкүн, мен билем, мен 5 Uno эмес, 6 вольт болгон тышкы Uno тактасын күйгүздүм. Серваңызды иштетүү үчүн 5v жогору колдонуу, бирок эгер тышкы чыңалууңуз 5 вольттон жогору болсо, анда калканга 5 вольттуу сенсорлорду туташтырбаңыз, болбосо алар куурулат.
2 -кадам: VarSpeedServo китепканасын жүктөп алыңыз
Сиз стандарттык arduino servo китепканасынын ордун ээлеген бул китепкананы колдонушуңуз керек, анткени ал servo ылдамдыгын servo write билдирүүсүнө өткөрүүгө мүмкүндүк берет. Китепкана бул жерде:
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 () жана Circle () функцияларын сынап көрүңүз. Колуңузга жана өзүңүздүн колуңузга зыян келтирбөө үчүн, бул функцияларды биринчи жолу иштеткенде, servo ылдамдыгыңыз төмөн экенине ишениңиз.
Жакшы ийгилик.
#кошуу VarSpeedServo.h
/ * AL5D колу үчүн servo control */
/ * Кол өлчөмдөрү (мм) */
#define BASE_HGT 90 // базанын бийиктиги
#define HUMERUS 100 // ийинден чыканакка чейин "сөөк"
#define ULNA 135 // чыканактан билекке "сөөк"
#define 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
/ * Gripper servo HS-422 */
#аныктоо GRI_SERVO 9
/ * алдын ала эсептөөлөр */
float hum_sq = HUMERUS*HUMERUS;
float uln_sq = ULNA*ULNA;
int servoSPeed = 10;
// ServoShield servos; // 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);
// zero_x ();
// сызык ();
// чөйрө ();
кечигүү (4000);
if (loopCounter> 1) {
servo_park ();
// set_arm (0, 0, 0, 0, 10); // парк
кечигүү (5000);
exit (0); } // программаны тындыруу - улантуу үчүн, "Старт" баскычын басыңыз
// чыгуу (0);
}
/ * тескери кинематиканы колдонуу менен колду жайгаштыруу тартиби */
/* z - бийиктик, y - базалык борбордон алыстык, x - капталга. 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)
{
float grip_angle_r = радиандар (grip_angle_d); // эсептөөлөрдө колдонуу үчүн радиандардагы кармоо бурчу
/ * Негизги бурч жана радиалдык аралык x, y координаттары */
float bas_angle_r = atan2 (x, y);
rdist float = sqrt ((x * x) + (y * y));
/ * rdist - бул кол үчүн координат */
y = rdist;
/ * Тутуу бурчуна негизделген эсептөө тутуму */
float grip_off_z = (күнөө (grip_angle_r)) * GRIPPER;
float grip_off_y = (cos (grip_angle_r)) * GRIPPER;
/ * Билек позициясы */
float wrist_z = (z - grip_off_z) - BASE_HGT;
float wrist_y = y - grip_off_y;
/ * Билек аралыкка далы (AKA sw) */
float s_w = (wrist_z * wrist_z) + (билек_y * билек_y);
сүзүү s_w_sqrt = sqrt (s_w);
/ * s_w жерге бурчу */
сүзүү a1 = atan2 (wrist_z, wrist_y);
/ * s_w humerusка бурчу */
float a2 = acos (((hum_sq - uln_sq) + s_w) / (2 * HUMERUS * s_w_sqrt));
/ * ийин бурчу */
float shl_angle_r = a1 + a2;
сүзүү shl_angle_d = градус (shl_angle_r);
/ * чыканак бурчу */
float elb_angle_r = acos ((hum_sq + uln_sq - s_w) / (2 * HUMERUS * ULNA));
сүзүү 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); // бул функцияны колдонуп, servo ылдамдыгын коюңуз //
//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 жылдыруу */
жараксыз 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);
кайтуу;
}
боштук zero_x ()
{
үчүн (кош yaxis = 250.0; yaxis <400.0; yaxis += 1) {
Serial.print ("yaxis =:"); Serial.println (yaxis);
set_arm (0, yaxis, 200.0, 0, 10);
кечигүү (10);
}
үчүн (кош yaxis = 400.0; yaxis> 250.0; yaxis -= 1) {
set_arm (0, yaxis, 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. Кодду тазалоо керек жана микросекунддук кодду жок кылса болот.
Сунушталууда:
Интеллектуалдык робот колунун келиши: 3 кадам
Интеллектуалдык робот колунун келиши: Коноктор менен кол алышуу, сүйлөө, тамактануу жана башка ушул сыяктуу нерселер, анткени биздин жашообуздун ден соолугу кадимки нерселерде, ал эми кээ бир өзгөчө адамдар үчүн бул түш. Мен айткан кээ бир өзгөчө адамдар - жоготкон майыптар
Адамдын артынан робот Arduino Uno колдонуу 20 $ төмөн: 9 кадам
Адамдын артынан робот Arduino Uno колдонуп 20 доллардан төмөн: ошондуктан мен бул роботту болжол менен бир жыл мурун жасаганмын жана мага жакты, ал сизди каалаган жерде жана бардык жерде ээрчий алат. бул ит үчүн эң жакшы альтернатива. ал азырга чейин жанымда. Менде дагы youtube каналы бар, анда сиз аны жасоо процессин көрө аласыз
Куткарылган Ротари Encoders колдонуу XYZ Пойнт Сканери: 5 кадам
XYZ Пойнт Сканери Куткарылган Ротари Энкодерлерди Колдонуу: Менин жумуш ордумдан көп сандаган жараксыз айлануучу оптикалык коддогучтарды сатып алып, акыры алар менен кызыктуу/пайдалуу бир нерсе кылууну чечтим. Мен жакында эле үйүмө жаңы 3D принтер сатып алдым. аны 3D с караганда жакшыраак мактоого болот
Баланстоочу робот / 3 дөңгөлөк робот / STEM робот: 8 кадам
Баланстоочу робот / 3 дөңгөлөктүү робот / STEM роботу: Биз мектептерде жана мектептен кийинки билим берүү программаларында билим берүү үчүн аралаш балансташтырууну жана 3 дөңгөлөктүү роботту курдук. Робот Arduino Unoго негизделген, колдонуучу калкан (курулуштун бардык деталдары келтирилген), Li Ion батарейкаларынын пакети (бардык курулуш
Blynkти колдонуу менен Arduino WeMos D1 WiFi UNO ESP8266 IOT IDEге шайкеш келген тактаны кантип колдонуу керек: 10 кадам
Blynkти колдонуу менен Arduino WeMos D1 WiFi UNO ESP8266 IOT IDEге шайкеш келген тактаны кантип колдонсо болот: Arduino WeMos D1 WiFi UNO ESP8266 IOT IDE Compatible Board Description: Description: WiFi ESP8266 Development Board WEMOS D1. WEMOS D1 - ESP8266 12Eге негизделген WIFI өнүктүрүү тактасы. Иштөө тутуму NODEMCUга окшош, бирок аппараттык жабдуулар бузулган