Android蓝牙串口绘图器,DIY蓝牙模块+processing互动型绘图机械臂(arduino)
DIY蓝牙模块+processing互动型绘图机械臂(arduino)
江头钓宝宝宝宝
看过论坛里好多大神DIY的绘图机感觉十分过瘾,于是自己也下决心做一个。其实网上关于绘图机的实现方法有很多,有用步进电机的,有用丝杆的,不过这些对于一个初入arduino小菜鸟来说还是有点困难的。于是我打算用最容易实现的方法:鼠标画图,processing通过蓝牙传输坐标信号,arduino接受信号并计算角度,舵机函数直接写角度实现绘图。
下图是DIY所需材料:控制器Arduino UNO
标准舵机2×PDI-6221MG-180°(大扭力)
多功能支架2(固定舵机用)
长U型架4
短U型架3
杜邦线公对母4
杜邦线公对公10
蓝牙模块HC-05
好了不废话了,下面进入正题。
一.机械部分
首先我们需要搭建起一个霸气的机械手臂,同学们请准备好足量的螺丝和螺母。多功能支架用来固定舵机,剩下的发挥自己的想象力完全可以自己拼的,要不怎么说是DIY呢?两个舵机自然要有两节手臂部分了,为了之后好说明我把它们分别命名为肩部舵机和肘部舵机。这两部分的长度可以自己定的,不过最好不要太长会存在支撑的问题。除此之外,一件必不可少的工作就是找一把尺子尽量精确的测出肩部和肘部的长度(这里指实际参与转动的长度)。这很重要的是要写入程序的。
二.建模部分
在这里我们其实有三个已知量鼠标的坐标,肩部长度r1,肘部长度r2.
α为肩部舵机的角度,β为肘部舵机的角度,P点为鼠标所在位置。通过直线OP,由 可以求出OP与X轴夹角,同时在三角形内部根据余弦函数容易得出∠AOP。此时α=180-〖tan〗^(-1)〖y/x〗-∠AOP,如此我们就得到了可以写入舵机的两个角度。由于这里本宝宝偷懒了一下,只使用了两个舵机(也就是说没有控制落笔的舵机,既笔固定在肘部关节末端)这时只要有信号就会画出相应的图形,这就要求该图形必须是封闭的(要画只能连续画)。呵呵,小瑕疵,大家别学我。
三.数据传输
这次的DIY宝宝用到了HC-05蓝牙透传模块,并第一次尝试arduino自带的软件串口库模拟了一个串口(实在是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
#include
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);
}
Android蓝牙串口绘图器,DIY蓝牙模块+processing互动型绘图机械臂(arduino)相关推荐
- android 蓝牙串口自动断开,uni-app 蓝牙连接被自动断开问题
遍历 快速对两个蓝牙设备(deviceId,mac地址不同)进行连接操作,时间隔为1秒,蓝牙刚进行连接,监听蓝牙连接状态,直接监听到被自动断开,而且断开两次,有知道怎么回事的不?ios ,androi ...
- 如何禁止ACR1255U|ACR1311U蓝牙NFC读写器的蓝牙自动休眠
蓝牙NFC读卡器ACR1255U 和ACR1311U这两款设备过程中,常常反应读卡器工作一段时间,就不工作了,其实是我们在应用过程中考虑到电池的供电性问题,专门为这两款产品做了休眠处理,可以设定设备不 ...
- ESP32解析ble蓝牙手柄信号,直接通讯,用于控制机器人小车机械臂等
(一)SET.h库文件 (用于整合各种用到的类和实例化对象) #pragma once // 加入该指令的文件只会被编译一次 #include <NimBLEDevice.h>NimBLE ...
- arduino蓝牙通讯代码_蓝牙4.0模块 无线数据传输模块 无线蓝牙串口 Arduino
产品介绍: 蓝牙4.0模块是专为智能无线数据传输而打造的.该模块遵循BT2.1+EDR/3.0/4.0(BLE)蓝牙规范,支持SPP 蓝牙串口协议等.本模块集成了MCU 和蓝牙芯片,支持UART.SP ...
- ESP32-pico-kit 串口通信 与 蓝牙串口
文章目录 一.串口及ESP32介绍 1.串口通信 2.ESP32-pico-kit 二.串口UART 1.串口引脚 2.串口常用函数 (1)开启串口 (2)关闭串口 (3)输出数据 (4)读取数据 ( ...
- 基于ESP32的蓝牙翻页器设计(论文附调试成功代码!!)
基于ESP32的蓝牙翻页器设计 目录 基于ESP32的蓝牙翻页器设计 1 摘要 1 1.绪论 2 1.1认识蓝牙 2 1.2研究思路 3 2.软硬件设计 3 2.1中央处理模块------ESP32 ...
- 笔记本蓝牙崩溃、图标消失不能打开蓝牙功能-解决办法(由于蓝牙串口连接出现的问题)
学单片机遇到蓝牙崩溃的问题 解决蓝牙串口发送时,蓝牙功能突然消失如下图: 原因: 单片机发送速度太快了,串口不断向电脑发送数据,导致电脑端崩溃. 解决办法:本人前前后后这种情况出现了6次.总结方法如下 ...
- 【Bluetooth|蓝牙开发】二、蓝牙开发入门
个人主页:董哥聊技术 我是董哥,嵌入式领域新星创作者 创作理念:专注分享高质量嵌入式文章,让大家读有所得! [所有文章汇总] 1.蓝牙基础概念 蓝牙,是一种利用低功率无线电,支持设备短距离通信的无线电 ...
- 华为“天才少年” DIY 生日礼物:四个月打造能缝葡萄的机械臂!
他来了他来了!"鸽"了这么久,华为"天才少年"稚晖君终于带着他的新项目回归了! 还记得今年六月,稚晖君带着一辆改装自行车成为了自动驾驶界的清流:<我把自行 ...
最新文章
- Cissp-【第8章 软件开发安全】-2021-3-15(822页-918页)【完】
- matlab和C如何混编
- 用Tensorflow搭建第一个神经网络
- vue+iview 设置全局的url以及跨越问题
- Gson之toJson和fromJson方法
- mysql show 翻页_mysql show操作
- matlab更改矩阵的值,怎么修改矩阵中的某些元素 或者简单点说保留矩阵中的元素...
- Android Fragment 使用详解
- java的num的数据类型_Java基础---Java数据类型
- 学习U-Boot之--mkconfig
- 最简单的python爬虫案例,适合入门学习
- 计算机同步不了计算机策略,修复sysvol netlog共享和组策略不同步组策略丢失等问题...
- 快速开发项目的前端框架主要针对后台界面
- [BZOJ4816][Sdoi2017]数字表格 数学
- 计算机等级考试报名班级填什么,全国计算机等级考试报名流程
- Android技术点滴记录
- 好听的歌曲单片机c语言程序,单片机音乐播放C语言程序
- c语言 符号自动换行,单片机串口发送字符为什么会自动换行?
- vue和微信小程序的基本使用区别
- LIN总线协议详解10(LIN的API)
热门文章
- 前端入门css3-----字体引入
- 【Flutter】从安卓与iOS包体优化到一键自动打包脚本的一条龙服务
- 【OTT】Fandango introuduce
- STM32CubeMX实战教程(三)——外部中断(中断及HAL_Delay函数避坑)
- Fuzz的原理与实现
- idfa安卓_uni-app如何获取苹果手机的IDFA及安卓手机的IEMI
- mysql 唯一索引与插入重复自动更新
- 如何使用ThinkUp存档,搜索和查看推文统计信息
- Cmp计算机编码,数据处理指令之: CMP比较指令-嵌入式系统-与非网
- 开盘上涨300%,有人预测市值将会超越ETH,200刀的波卡还能买么?