极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 10363|回复: 4

转载两篇很旧很旧的文章...

[复制链接]
发表于 2013-1-31 02:54:43 | 显示全部楼层 |阅读模式
本帖最后由 迷你强 于 2013-1-31 22:40 编辑

这两篇文章,是自己很久前写的了,09年,呵呵 那时候刚接触arduino,对电子、机械什么的,也是完全的外行,突然想起这两篇文章,去机器人天空翻出来看了看 哈哈 还是挺有意思的,就转过来啦

第一篇:
我的机械手臂设想(附哟代码~!)大家进来讨论讨论~
最近我在弄一个小程序,就是用机械手臂来写字和画画
本来是打算做六足的,但是在制作的时候一不小心电压接高了!
结果,只见伺服控制板火花四溅,一缕青烟袅袅升起!哎
200在一瞬间烧了!! {:soso_e109:}
六足也就只能搁一边了,慢慢攒钱买个新的吧
不过另一个想法就在我头脑里出现了
用一只腿来实现写字
经过一个星期的思考和n个晚上的时间,我终于写出了核心代码
先是在DEV上模拟实现,然后再移植到arduino里
原理就是,把每个字(目前只考虑英文与数字,简单点)用坐标表示,存在eeprom里,
于是每个字就可以用一根根直线画出来
核心程序就是实时计算3个伺服的角度,如此让机械手臂画出一条条直线
经过几个测试,我写的程序能在arduino上运行,但精确度不是很高
才85%~97%,希望能达到99%
因为伺服控制器被烧了,所以无法进行完全测试,而只是输出每时刻三个伺服的角度
以后应该还有很多要测试吧,但是高三了,可能没那么多时间,会弄的很慢
公布出源码,与大家讨论讨论,代码写的没什么水平,见笑
不知道我这个思路对不对,如果大家有更好的方法,尽情提出来~!
源码已经过测试,可以直接编译运行
dev版,可以自己修改printf来看实现过程
/*************************Hand_v1_0_dev_test**********************************************
[pre lang="c" line="1"]#include<stdio.h>
#include<math.h>
#include<stdlib.h>
int l2=60,l3=70,li;// 用mm做单位
void Line(int xa,int ya,int xb,int yb)
{
  //用int代替float,扩大100000倍,xa3位,cos5位,alpha为整,oa4位
  int cosin(int alpha);
  int arccos(int cos_alpha);
  int alpha=0,alphai=0,beta=0,sita=0,fai=0;
  int cos_alpha,cos_alphai,cos_fai,sin_fai,cos_sita,sin_sita;
  int oa,oa_2,ob,ob_2,xx_yy;


  //save the caculate result for reuse
  oa_2=xa*xa+ya*ya;
  oa=(int)sqrt(oa_2);
  ob_2=xb*xb+yb*yb;
  ob=(int)sqrt(ob_2);
  xx_yy=xa*xb+ya*yb;
  //printf("oa:%d,ob:%d,xx_yy:%d\n",oa,ob,xx_yy);
  //printf("Line 1\n");
  cos_alpha=100000*abs(xx_yy)/(oa*ob);
  cos_alphai=0;
  alpha=arccos(cos_alpha);
  alphai=0;
  //printf("cos_fai=(int)(100000*(%d-%d)/(sqrt(%d+%d-2*%d)*%d));\n",
            //oa_2,xx_yy,oa_2,ob_2,xx_yy,oa);
  cos_fai=(int)(100000*(oa_2-xx_yy)/(sqrt(oa_2+ob_2-2*xx_yy)*oa));
  //printf("cos_fai=100000*(%d-%d)/(sqrt(%d+%d-2*%d)*%d))\n",
            //oa_2,xx_yy,oa_2,ob_2,xx_yy,oa);
  sin_fai=cosin(arccos(cos_fai)-90);
  //printf("cos_alpha:%d\n",cos_alpha);
  //printf("alpha:%d,alphai:%d\n",arccos(cos_alpha),alphai);
  //printf("fai:=%d,cos_fai:%d,sin_fai:%d\n",arccos(cos_fai),cos_fai,sin_fai);
  //getchar();
  while(abs(alphai-alpha)>1)
  {
    //printf("alpha:%f,alphai:%f\n",alpha,alphai);
    //printf("oa:%f,oa_2:%f,ob:%f,ob_2:%f,\n",oa,oa_2,ob,ob_2);
    if(alphai>alpha)
      alphai-=1;
    else alphai+=1;
    //printf("alpha:%d,alphai:%d\n",alpha,alphai);
    //printf("li=(%d*%d)/(%d*%d+%d*%d);\n",
        //sin_fai,oa,cosin(alphai-90),cos_fai,cosin(alphai),sin_fai);
    li=(sin_fai*oa)/cosin(alphai+arccos(cos_fai)-90);
    printf("li=%d\n",li);
    //printf("cos_sita=100000*(%d*%d+%d*%d-%d*%d)/(2*%d*%d);\n",
             //l2,l2,l3,l3,li,li,l2,l3);
    cos_sita=100000*(l2*l2+l3*l3-li*li)/(2*l2*l3);
    sin_sita=cosin(arccos(cos_sita)-90);
    //printf("cos_sita:%d,sin_sita:%d\n",cos_sita,sin_sita);
    int t1=10000000,t2=0;
    //printf("Line 2\n");
    //printf("sita:%d\n",arccos(cos_sita));
    while(abs(t1-t2)>100000)
    {
      t1=l2*cosin(beta-90);
      t2=l3*cosin(beta+arccos(cos_sita)-90);
      //printf("cosin(beta-90):%d,cosin(beta+sita):%d\n",
               //cosin(beta-90),cosin(beta+arccos(cos_sita)-90));
      //printf("t1:%d,t2:%d\n",t1,t2);
      if(t1>t2)
        beta-=1;
      else    beta+=1;
    }
    //printf("Line 3\n");
    //printf("alpha:%d,beta:%d,sita:%d,\n",
               //alpha,beta,arccos(cos_sita));
    //getchar();
    //servo(.....);
    //delay(100);
    printf("alpha:%d,beta:%d,sita:%d,\n",
               alpha,beta,arccos(cos_sita));
  }
  getchar();
}

void InitHand()
{
  int beta=45,sita=45;
  printf("beta:%d,sita:%d,\n",beta,sita);
}
int cosin(int t)
{
      return (int)(100000*cos(t*3.1415926/180));
}
int arccos(int t)
{
int left=0,mid,right=180,i=0;
int cos_mid,delta;
if(t==100000) return 0;
while(i<9)
{
   mid=(left+right)/2;
   cos_mid=(int)(100000*cos(mid*3.1415926/180));
   if(mid>90) delta=(181-mid)*29;
   else delta=mid*29;
   //printf("cos:%f,fabs:%f,delta:%f\n",cos(mid*3.1415926/180),
   //          fabs(t-cos(mid*3.1415926/180)),delta);
   if(fabs(t-cos_mid)<=delta)
      break;
   else if(t<cos_mid)
     left=mid;
   else right=mid;
   i++;
   }
   return mid;
}
main()
{
       int i,j,n;
       int xa,xb,ya,yb;
       n=20;
       InitHand();
       while(1){
       system("cls");
       printf("Input x1,y1,x2,y2(mm)\n");
       scanf("%d,%d,%d,%d",&xa,&ya,&xb,&yb);
       printf("InitHand() done\n");
       getchar();
       //printf("xa:%3.1f,ya:%3.1f,xb:%3.1f,yb:%3.1f,\n",1,2.8,7,6);
       Line(xa,ya,xb,yb);
        getchar();
        }
        }
[/code]
arduino版
/****************************Hand_v1_0*************************************************         
  1. long int l2=60,l3=70,li;
  2. void Line(long int xa,long int ya,long int xb,long int yb)
  3. {
  4.   long int cosin(long int alpha);
  5.   long int arccos(long int cos_alpha);
  6.   long int alpha=0,alphai=0,beta=0,sita=0,fai=0;
  7.   long int cos_alpha,cos_alphai,cos_fai,sin_fai,cos_sita,sin_sita;
  8.   long int oa,oa_2,ob,ob_2,xx_yy;


  9.   //save the caculate result for reuse
  10.   oa_2=xa*xa+ya*ya;
  11.   oa=(long int)sqrt(oa_2);
  12.   ob_2=xb*xb+yb*yb;
  13.   ob=(long int)sqrt(ob_2);
  14.   xx_yy=xa*xb+ya*yb;
  15.   cos_alpha=100000*abs(xx_yy)/(oa*ob);
  16.   cos_alphai=0;
  17.   alpha=arccos(cos_alpha);
  18.   alphai=0;
  19.   cos_fai=(long int)(100000*(oa_2-xx_yy)/(sqrt(oa_2+ob_2-2*xx_yy)*oa));
  20.   sin_fai=cosin(arccos(cos_fai)-90);
  21.   while(abs(alphai-alpha)>1)
  22.   {
  23.     if(alphai>alpha)
  24.       alphai-=1;
  25.     else alphai+=1;
  26.     li=(sin_fai*oa)/cosin(alphai+arccos(cos_fai)-90);
  27.     printf("li=%d\n",li);
  28.     cos_sita=100000*(l2*l2+l3*l3-li*li)/(2*l2*l3);
  29.     sin_sita=cosin(arccos(cos_sita)-90);
  30.     long int t1=10000000,t2=0;
  31.     while(abs(t1-t2)>100000)
  32.     {
  33.       t1=l2*cosin(beta-90);
  34.       t2=l3*cosin(beta+arccos(cos_sita)-90);
  35.       if(t1>t2)
  36.         beta-=1;
  37.       else    beta+=1;
  38.     }
  39.     Serial.print("alpha:");
  40.     Serial.println(alpha);
  41.     Serial.print("beta:");
  42.     Serial.println(beta);
  43.     Serial.print("sita:");
  44.     Serial.println(arccos(cos_sita));
  45.     Serial.print("li:");
  46.     Serial.println(li);
  47.   }
  48.   Serial.println("Line() done!");
  49. }

  50. void InitHand()
  51. {
  52.   long int beta=45,sita=45;
  53.   Serial.print("beta:");
  54.   Serial.println(beta);
  55.   Serial.print("sita");
  56.   Serial.println(sita);
  57. }
  58. long int cosin(long int t)
  59. {
  60.       return (long int)(100000*cos(t*3.1415926/180));
  61. }
  62. long int arccos(long int t)
  63. {
  64. long int left=0,mid,right=180,i=0;
  65. long int cos_mid,delta;
  66. if(t==100000) return 0;
  67. while(i<9)
  68. {
  69.    mid=(left+right)/2;
  70.    cos_mid=(long int)(100000*cos(mid*3.1415926/180));
  71.    if(mid>90) delta=(181-mid)*29;
  72.    else delta=mid*29;
  73.    if(fabs(t-cos_mid)<=delta)
  74.       break;
  75.    else if(t<cos_mid)
  76.      left=mid;
  77.    else right=mid;
  78.    i++;
  79.    }
  80.    return mid;
  81. }
  82. void setup()
  83. {
  84.   Serial.begin(9600);
  85.   InitHand();
  86.   Serial.println("InitHand done!");
  87. }
  88. int n;
  89. int xa,xb,ya,yb;
  90. //因为自己对processing和arduino通信不是很了解,所以干脆
  91. //把测试点直接存在arduino里,测试的时候发送0~3进行选择
  92. //以后在改进了
  93. unsigned int Point[10][4]={ {0,30,40,30},
  94.                             {50,25,15,80},
  95.                             {30,10,30,100},
  96.                             {50,65,5,65},   };
  97. void loop()
  98. {
  99.        if(Serial.available())
  100.        {
  101.          n=Serial.read()-48;
  102.          Serial.print("The line-points group is");
  103.          Serial.println(n);
  104.          xa=Point[n][0];
  105.          ya=Point[n][1];
  106.          xb=Point[n][2];
  107.          yb=Point[n][3];
  108.          Serial.println("And the points are(");
  109.          Serial.print(xa);Serial.print(",");Serial.print(ya);Serial.print("),(");
  110.          Serial.print(xb);Serial.print(",");Serial.print(ya);Serial.println(")");
  111.          Serial.println("Yes or N0 ?");
  112.          delay(4000);
  113.          Serial.println("begin in 3s");
  114.          delay(1000);
  115.          Serial.println("begin in 2s");
  116.          delay(1000);
  117.          Serial.println("begin in 1s");
  118.          delay(1000);
  119.          Serial.println("go!");
  120.            Line(xa,ya,xb,yb);
  121.         }
  122.         }
复制代码

接下来有张原理草图,所用的“机械手臂”大家可以去看我的另张帖子“与大家分享我的六足”

希望大家看得懂
更希望大家多交流!


第二篇:
与大家分享我的六足!

六足是我很久前的想法了,但是一直没时间,现在放假了,各种材料也终于买齐了,再经过我一番折腾,外形终于做出来啦!选了几张图给大家看一下            










另外公布一下各种材料与费用:
伺服     18个 9g,2kg/cm,7v  24*18元,淘宝买的
腿、身躯等零件       240元 (吐血,好贵..当然也因为自己是第一次,走了很多弯路)
32路伺服控制器套件       捷龙D3009 有DB9串口,TTL电平串口 190元
腿和身躯是自己拿图纸找招牌灯店制作的,用的是什么材料我也忘了,但是机身用这种材料太有弹了!!失策啊现在我遇到了个问题,不知道用什么控制器调用这个伺服控制器,我家用的是手提没有串口,买了串口转USB,没用!郁闷...请大家推荐一下,或告诉我该怎么办,如
能解决非常感谢!
这个控制器是接收字符串的,如"#03A99!"代表第四路舵机转动到99度位置
Email:[email protected]


原帖地址:
http://bbs.robotsky.com/thread-4242-1-1.html
http://bbs.robotsky.com/thread-4110-1-1.html
ps:我觉得我的文字风格一直没变。。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复

使用道具 举报

发表于 2013-2-2 23:32:23 | 显示全部楼层
楼主6足结构是taobao买的还是自己做的啊?多少米啊?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-2-3 00:48:14 | 显示全部楼层
DinoChen 发表于 2013-2-2 23:32
楼主6足结构是taobao买的还是自己做的啊?多少米啊?

这个文中说了吧。。
那时候什么家伙都没有,自己画图纸然后去了一家广告店加工的。。很贵
现在自己是可以加工出这样的零件了,但是对机器人的兴趣淡了。。
回复 支持 反对

使用道具 举报

发表于 2013-3-23 13:43:24 | 显示全部楼层
实在是强啊!
回复 支持 反对

使用道具 举报

发表于 2015-3-26 12:02:52 | 显示全部楼层
Malc 发表于 2013-2-3 00:48
这个文中说了吧。。
那时候什么家伙都没有,自己画图纸然后去了一家广告店加工的。。很贵
现在自己是可 ...

女生能做出这样的东西,不简单
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-4-23 18:51 , Processed in 0.042984 second(s), 21 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表