Ничего особенно, просто хотелось проект с серводвигателями. Собрал из готового набора: Видео: В описании можно найти кое-какие технические подробности. На практике оказалась довольно скучной и бесполезной игрушкой. Но вечер или даже два за ее сборкой проведете интересно. Могу рекомендовать как подарок ребенку или знакомому гику.
я наливатор чая из нее программировал и настраивал почти целый день - интересно сколько времени нужно чтобы научить её переставлять все фигурки на доске - да и глаз у нее нетю....
Я пробовал сделать движение клешни этой руки в заданную координату, но вся моя задумка обломалась о конструкцию этой руки -- угол самого верхнего "локтя" зависел от положений двух серв, вот эту-то зависимость я найти не смог А так рука подходит только для управления через потенциометры и только.
Мое видео посмотрите http://forum.amperka.ru/threads/Чайная-церемония-на-Ардуино-акриловый-манипулятор-конструктор-из-Китая.10822/ и код - что Вам мешает выписать координаты из положений установленных потенциометрами ?
Я видел, интересный проект. Делал нечто похожее, только для рисования милой елочки. Мне нужно было вводить в порт координату в пространстве(не очень подробно изъяснил, извините), т.е. X, Y, Z , где начало отсчета -- основание робота.Задумал это, т.к. очень много времени занимало написание "одноразового" кода для той самой елочки.
Да я манипулятор по исходным точкам программировал а елочку он в 3D что-ли рисовать должен - любопытно просто....
поверхность, на которой рисует робот, может находится на разном удалении от него, например, быть на пару сантиметров выше... И что тогда ? Переписывать весь код?
Мне просто кажется что для таких целей любая робо-рука плохо подойдет - тут механизм нужен как у 3D принтера иначе запаришься рассчитывать координаты.....
Я собрал его наоборот (ОЙ!). поэтому вам придётся или пересобирать свой, или допиливать программу под себя. Сервы вставляем так, чтобы 0 обоих был ориентирован в противоположную от клешни сторону (горизонтально, параллельно земле). несмотря на замедляющую функцию armWrite манипулятор прыгает, как блоха. Поэтому его надо приделать к чему-нибудь тяжёлому (я использую идеально подходящий по габаритам корпус от сдохшего винчестера). Объяснение для тех кто не хочет разбираться: Servo shoulder; - то которое присоединено к треугольной детальке с 3 дырками, Servo elbow TCK - то, за сколько шагов должен повернуться мотор. cord_write(расстояние по горизонтали от оси моторов, высота от оси моторов, угол на который нужно повернуть базу) Вот работающий скетч: #include <Servo.h>//подключаем библиотеки //объявляем пины серв #define basePin 5 #define shoulderPin 3 #define elbowPin 4 #define gripperPin 2 Servo gripper;//присваем названия переменным типа "Servo" Servo base; Servo shoulder; Servo elbow; Servo* pser[3]={&base,&shoulder,&elbow}; static unsigned char posBase=90; static unsigned char posElbow=90; static unsigned char posSholder=90; static unsigned char posGripper=50; void setup() { // put your setup code here, to run once: base.attach(basePin); //объявляем, base.write(posBase); shoulder.attach(shoulderPin); // к каким shoulder.write(posSholder); elbow.attach(elbowPin); // пинам elbow.write(posElbow); gripper.attach(gripperPin); //присоединены сервы gripper.write(posGripper); base.write(posBase); //тут же крутим их на shoulder.write(posSholder); //нужный нам угол elbow.write(posElbow); //(чтобы конструкция gripper.write(posGripper); //не билась об стол) Serial.begin(9600);//задаём скорость порта } #define TCK 8 void armWrite(int baseZn, int shoulderZn, int elbowZn) { int m[3]; int i,d,ol,pr; int spd[3]; m[0]=baseZn; m[1]=shoulderZn; m[2]=elbowZn; for(i=0;i<3;i++) { ol=pser->read(); spd=(m-ol)/TCK; } for(d=0;d<TCK;d++) { for (i=0;i<3;i++) { ol=pser->read(); if(!spd) { pser->write(m); } else { pser->write(ol+spd); pr=ol+spd; } } delay(66); } delay(33); } void cord_write(int x,int y,int baseZn) { char s[20]; unsigned char st_a=81; unsigned char st_b=80; unsigned char st_c; float cos_ABC; float cos_CAB; float tg_ABE; //=tg(BAD) float ABC; float ABE; float CBE; //a|1 float CAB; float CAD; //a|2 y=-y; st_c=sqrt(x*x+y*y)+0.5; //cos_ABC = ((float)st_a*st_a - st_b*st_b + st_c*st_c)/(2*st_a*st_c); cos_ABC = ((float)161 + (float)st_c*st_c)/(162.0*st_c);// ABC=acos((float)cos_ABC); tg_ABE=(float)y/(float)x; ABE=atan(tg_ABE); CBE=(ABC - ABE)*57.29577957;//* 180.0 / 3.14159265; //cos_CAB = ((float)st_b*(float)st_b + (float)st_c*(float)st_c - (float)st_a*(float)st_a)/(2*st_b*st_c); cos_CAB = ((float)st_c*st_c - 161)/(160.0*st_c);// CAB=acos((float)cos_CAB)*57.29577957;//* 180.0 / 3.14159265; ABE *= 57.29577957; CAD=(float)CAB + ABE - 9; CBE=(float)CBE - 9; armWrite(baseZn, CBE, CAD); /*sprintf(s,"(%d,%d)",x,y); Serial.println(s); Serial.print("cos_ABC = "); Serial.println(cos_ABC); Serial.print("cos_CAB = "); Serial.println(cos_CAB); Serial.print("st_c = "); Serial.println(st_c); Serial.print("tg_ABE = "); Serial.println(tg_ABE); Serial.print("ABC = "); Serial.print(ABC); Serial.println(" rad"); Serial.print("ABE = "); Serial.print(ABE); Serial.println(" grad"); Serial.print("CBE = "); Serial.println(CBE); Serial.print("CAD = "); Serial.println(CAD); Serial.print("CAB = "); Serial.println(CAB); Serial.print("CAD = "); Serial.println(CAD); Serial.println("--------------"); */ } void loop() { while(1) { cord_write(30,-40,104); cord_write(100,-40,104); gripper.write(150); delay(300); cord_write(30,0,104); cord_write(30,0,20); cord_write(140,0,20); gripper.write(50); delay(300); cord_write(30,0,20); cord_write(30,0,104); } }