极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 5772|回复: 6

DIY蓝牙模块+processing互动型绘图机械臂(arduino)

[复制链接]
发表于 2016-4-7 10:10:39 | 显示全部楼层 |阅读模式
DIY蓝牙模块+processing互动型绘图机械臂(arduino
江头钓宝宝   宝宝
看过论坛里好多大神DIY的绘图机感觉十分过瘾,于是自己也下决心做一个。其实网上关于绘图机的实现方法有很多,有用步进电机的,有用丝杆的,不过这些对于一个初入arduino小菜鸟来说还是有点困难的。于是我打算用最容易实现的方法:鼠标画图,processing通过蓝牙传输坐标信号,arduino接受信号并计算角度,舵机函数直接写角度实现绘图。
下图是DIY所需材料:
  
控制器
  
  
Arduino UNO
  
  
标准舵机
  
  
2×PDI-6221MG-180°(大扭力)
  
  
多功能支架
  
  
2(固定舵机用)
  
  
U型架
  
  
4
  
  
U型架
  
  
3
  
  
杜邦线公对母
  
  
4
  
  
杜邦线公对公
  
  
10
  
  
蓝牙模块
  
  
HC-05
  
好了不废话了,下面进入正题。
可以求出OP与X轴夹角,同时在三角形内部根据余弦函数容易得出∠AOP。此时α=180-〖tan〗^(-1)〖y/x〗-∠AOP,如此我们就得到了可以写入舵机的两个角度。由于这里本宝宝偷懒了一下,只使用了两个舵机(也就是说没有控制落笔的舵机,既笔固定在肘部关节末端)这时只要有信号就会画出相应的图形,这就要求该图形必须是封闭的(要画只能连续画)。呵呵,小瑕疵,大家别学我。
三.     数据传输

    这次的DIY宝宝用到了HC-05蓝牙透传模块,并第一次尝试arduino自带的软件串口库<SoftwareSerial>模拟了一个串口(实在是UNO只有一个硬件串口,你下载程序还必须用它)。好了进入正题,首先宝宝打算传输Processing中的x坐标和y坐标。这两个数据都是两字节的int型数据,宝宝把它们分别除以256,分成两个一字节的数据。

再将这四个字节按顺序发送出去,这样其实还不保险于是我加了‘H’和‘M’两个字符作为头字符来进行校验。这样一个数据包一共6个字节,下面是发送代码和接受部分的代码:
/*processing*/
void jisuan(char tag,intx,int y)
{
  myport.write(HEADER);     /发送头字符/
  myport.write(tag);
  myport.write((char)(x/256));      /发送X坐标/
  myport.write( x&0xff);
                          myport.write((char)(y/256));       /发送Y坐标/                                                      
  myport.write(y&0xff);
}
/*arduino*/
if(BT.available()>=TOTAL)           /这里TOTAl=6,判断是否接受一个包/
  {
    if(BT.read()==HEADER)         /判断头字符/
    {
      char tag=BT.read();
      if(tag==MOUSE_TAG)
      {
        int x=BT.read()*256;         /接受并还原X,Y坐标/
        x=x+BT.read();
        int y=BT.read()*256;
y=y+BT.read();
四.      程序设计
arduino
#include<Servo.h>
#include<SoftwareSerial.h>
floatj,z,r1=100.0,r2=190.0;
const char HEADER='H';
const char MOUSE_TAG='M';
const int TOTAL=6;
SoftwareSerial BT(10,9);
Servo jianbu;
Servo zhoubu;
Servo luobi;
void setup()
{
  jianbu.attach(5,500,2500);
  zhoubu.attach(6,500,2500);
  luobi.attach(7,500,2500);
  BT.begin(9600);
  BT.print("BT is ready! ");
  delay(50);
  jianbu.write(0);
  zhoubu.write(0);
}
void loop()
{
  if(BT.available()>=TOTAL)
  {
    if(BT.read()==HEADER)
    {
      char tag=BT.read();
      if(tag==MOUSE_TAG)
      {
        int x=BT.read()*256;
        x=x+BT.read();
        int y=BT.read()*256;
        y=y+BT.read();
        jisuan(x,y);
          jianbu.write(j);
        zhoubu.write(z);
        delay(50);
      }
      else
      {
        BT.print("you are foolish");
        BT.write(tag);
      }
    }
  }
  delay(50);                                                                           
}
float jisuan(int x,int y)
{
  x=x-300;
  float p=sqrt(x*x+y*y);
  float a=acos((r1*r1+p*p-r2*r2)/(2*r1*p));
  float b=acos((r2*r2+p*p-r1*r1)/(2*r2*p));
  z=degrees(a+b);
  j=180-degrees(atan2(y,x))-degrees(a);
  j=floor(j);
  z=floor(z);
if((j>=0&&j<=180)&&(z>=0&&z<=180))
  return j,z;
}
  Processing
importprocessing.serial.*;
Serial myport;
public static final charHEADER='H';
public static final charMOUSE_TAG='M';
void setup()
{
  String portName=Serial.list()[1];
    myport=new Serial(this,portName,9600);
  size(600,400);
  strokeWeight(5);
  point(300,0);
}
void draw()
{
  
}
void mouseDragged()
{
  jisuan(MOUSE_TAG,mouseX,mouseY);
  line(pmouseX,pmouseY,mouseX,mouseY);
  delay(50);
}
void jisuan(char tag,intx,int y)
{
  myport.write(HEADER);
  myport.write(tag);
  myport.write((char)(x/256));
  myport.write( x&0xff);
  myport.write((char)(y/256));
  myport.write(y&0xff);
}





回复

使用道具 举报

发表于 2016-4-7 14:06:52 | 显示全部楼层
来个视频啊大哥
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-4-8 09:01:34 | 显示全部楼层
henrypcw 发表于 2016-4-7 14:06
来个视频啊大哥

没流量啦
回复 支持 反对

使用道具 举报

发表于 2016-5-25 08:57:39 | 显示全部楼层
感谢楼主分享
回复 支持 反对

使用道具 举报

发表于 2016-9-4 08:21:25 | 显示全部楼层
http://tieba.baidu.com/p/4442679476
不知道这个家伙在不在这个论坛
回复 支持 反对

使用道具 举报

发表于 2016-9-9 16:46:27 | 显示全部楼层
谢谢楼主,学习。
回复 支持 反对

使用道具 举报

发表于 2016-11-18 08:51:11 来自手机 | 显示全部楼层
2个蓝牙模块怎么连接起来的哦,不是需要配对吗?
回复 支持 反对

使用道具 举报

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

本版积分规则

Archiver|联系我们|极客工坊 ( 浙ICP备09023225号 )

GMT+8, 2019-8-25 16:15 , Processed in 0.051460 second(s), 24 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

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