Собрал робо-руку MeArm

Тема в разделе "Глядите, что я сделал", создана пользователем afiskon, 20 мар 2017.

  1. afiskon

    afiskon Нерд

    Ничего особенно, просто хотелось проект с серводвигателями. Собрал из готового набора:

    Видео:



    В описании можно найти кое-какие технические подробности.

    На практике оказалась довольно скучной и бесполезной игрушкой. Но вечер или даже два за ее сборкой проведете интересно. Могу рекомендовать как подарок ребенку или знакомому гику.
     
    Nestorovich нравится это.
  2. Tomasina

    Tomasina Сушитель лампочек Модератор

    шахматы сможет переставлять?
     
  3. afiskon

    afiskon Нерд

    Шахматы и спреи для носа, да )
     
  4. ostrov

    ostrov Гуру

    А в нос их забрызгивать? )
     
  5. issaom

    issaom Гуру

    я наливатор чая из нее программировал и настраивал почти целый день - интересно сколько времени нужно чтобы научить её переставлять все фигурки на доске - да и глаз у нее нетю....
     
  6. Troll

    Troll Гик

    Я пробовал сделать движение клешни этой руки в заданную координату, но вся моя задумка обломалась о конструкцию этой руки -- угол самого верхнего "локтя" зависел от положений двух серв, вот эту-то зависимость я найти не смог:(
    А так рука подходит только для управления через потенциометры и только.
     
  7. issaom

    issaom Гуру

    Мое видео посмотрите
    http://forum.amperka.ru/threads/Чайная-церемония-на-Ардуино-акриловый-манипулятор-конструктор-из-Китая.10822/
    и код - что Вам мешает выписать координаты из положений установленных потенциометрами ?
     
  8. Troll

    Troll Гик

    Я видел, интересный проект. Делал нечто похожее, только для рисования милой елочки.
    Мне нужно было вводить в порт координату в пространстве(не очень подробно изъяснил, извините), т.е. X, Y, Z , где начало отсчета -- основание робота.Задумал это, т.к. очень много времени занимало написание "одноразового" кода для той самой елочки.
     
  9. issaom

    issaom Гуру

    Да я манипулятор по исходным точкам программировал а елочку он в 3D что-ли рисовать должен - любопытно просто....
     
  10. Troll

    Troll Гик

    поверхность, на которой рисует робот, может находится на разном удалении от него, например, быть на пару сантиметров выше... И что тогда ? Переписывать весь код?
     
  11. issaom

    issaom Гуру

    Мне просто кажется что для таких целей любая робо-рука плохо подойдет - тут механизм нужен как у 3D принтера иначе запаришься рассчитывать координаты.....
     
  12. Troll

    Troll Гик

    Это проще чем кажется
     
  13. Troll

    Troll Гик

    Могу поделится алгоритмом и полуработающим скетчем;)
     
  14. Elivian

    Elivian Нерд

    Я собрал его наоборот (ОЙ!). поэтому вам придётся или пересобирать свой, или допиливать программу под себя.
    Сервы вставляем так, чтобы 0 обоих был ориентирован в противоположную от клешни сторону (горизонтально, параллельно земле).
    несмотря на замедляющую функцию armWrite манипулятор прыгает, как блоха. Поэтому его надо приделать к чему-нибудь тяжёлому (я использую идеально подходящий по габаритам корпус от сдохшего винчестера).
    Объяснение для тех кто не хочет разбираться:
    Servo shoulder; - то которое присоединено к треугольной детальке с 3 дырками,
    Servo elbow
    [​IMG]
    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);
    }
    }
     
    Последнее редактирование: 14 ноя 2018
    Tomasina нравится это.
  15. Elivian

    Elivian Нерд

    углы.jpg
    вот углы, по которым идёт расчёт, если кому-то интересно
     
  16. Видео недоступно!