BrachioGraph 树莓派绘图机

自制一款树莓派驱动的绘图机

Cherry

喜欢

4641
浏览
10
喜欢

> 更多图片

项目状态:已完成
开放度:公开
所属分类:电子
发布时间:2019-10-25
最近更新:2019-11-13

详细说明


本期推荐一个上手简单,又好玩的项目——树莓派绘图机。相较于之前的绘图机器的项目《绘图机器人》和《Arduino + 光驱改造数控绘图机》,这个更简洁,即便没有大触搬的技能和耐心也有制造成形的可能。更难得的是除了树莓派和舵机之外的零件,在家里随便翻翻都可以找得到!

一只笔、一个夹子、三个舵机以及一个树莓派 Zero 就能搭建整个项目,绘图仪使用 Python 脚本运行,所有程序已经开放出来了:
https://github.com/evildmp/BrachioGraph

链接表


教程

组件清单
  • 树莓派 × 1
  • 舵机 × 3
  • 木棍 × 2
  • 夹子 × 1
  • 胶水 × 1

材料清单

树莓派×1
舵机×3
木棍×2
夹子×1
胶水×1

提示:
1、推荐使用 SG90 舵机。
2、用尺寸为 8cm(长)×16cm(宽)×11cm(高)的木棍作为绘图机的「手臂」。制作的绘图机适用于在 A5 上作画。请点击此处的可视化脚本,帮助了解手臂的几何形状和绘图区域之间的关系。
https://brachiograph.readthedocs.io/en/latest/how-to/visualise-behaviour.html#visualise-area

安装部件

安装连接处
使用胶水将舵机连接到底座上。如图所示有两种方法,可以任选其一,安装时舵机需要高于底座。

安装内臂
将舵机的角粘到内臂上,让其与旋转中心相距约8厘米(或根据你的具体情况而定)。

安装外臂
将舵机和夹子粘到外臂上,把笔夹在夹子上,同时让笔和和外部手臂的旋转中心保持适当的距离。按照图中舵机的位置将最后一个舵机安装到位,让其角可以安全旋转,并且可以使笔抬离纸张。

组装绘图机

该项目使用厘米为长度单位。

精确测量手臂上两个舵机的角和轴之间的距离(inner_arm)。
精确测量另一个舵机的轴与笔之间的距离(outer_arm)。
这些变量稍后将会使用。

安装软件

如何使用树莓派驱动绘图机,该指南将详细的讲解使用树莓派 Zero 用作绘图机引擎的方法:
https://brachiograph.readthedocs.io/en/latest/how-to/prepare-pi.html#prepare-pi

brachiograph.py 还需要一些其他组件。建议在 Python 软件包中使用 virtualenv,但无论选择何种方式,软件都要在 Python3 环境中。

虚拟环境(可选)

创建并激活 Python 虚拟化环境
请执行以下操作:

python3 -m venv env
source env/bin/activate

tmux
tmux 是管理终端会话的一种常见的的方法。
即使你的连接断开了,它也可以使你重新加入会话并不会丢失命令的位置。用下面的命令安装:

sudo apt-get install tmux

Pip
如果还未安装或者还没有使用虚拟环境,请执行以下操作:

sudo apt-get install python3-pip

此版本的 pip 需要使用 pip3 调用。因此,如果你未使用 Python 虚拟环境,请在以下的口令中将 pip 替换为 pip3。

PIGPIO
PIGPIO 这是一个很棒的库,它可以实现对树莓派的 GPIO 引脚的硬件控制。这对精确计时脉冲很重要而且它还带有一个用于底层代码的 Python 接口。

sudo apt-get install pigpiod
pip install pigpio  # use pip3 if not using a virtual environment

Pillow
Pillow 是一个 Python 的映像库。
http://abyz.me.uk/rpi/pigpio/index.html
它可以在不需要驱动绘图机的情况下,将位图图像转换为矢量:
https://www.piwheels.org/project/Pillow/

sudo apt install libwebp6 libtiff5 libjbig0 liblcms2-2 libwebpmux3 libopenjp2-7 libzstd1 libwebpdemux2 libjpeg-dev
pip install pillow  # use pip3 if not using a virtual environment

Numpy
Numpy 是一个 Python 的数学库。
https://www.piwheels.org/project/numpy/

sudo apt install libatlas3-base libgfortran5
pip install numpy  # use pip3 if not using a virtual environment

Git
如果还未安装,请运行:

sudo apt-get install git

其他的 Python 软件包
使用 pip 安装 Python 3 版本:
tqdm#用于绘图时的进度指示器
readchar#允许 BrachioGraph.drive() 方法接受用户输入

pip install tqdm readchar  # use pip3 if not using a virtual environment

Clone BrachioGraph 库
如果还未安装,请按照该步骤复制 BrachioGraph 存储库:

git clone git@github.com:evildmp/BrachioGraph.git

或者,如果你需要使用 HTTPS 的话:

git clone https://github.com/evildmp/BrachioGraph.git

将绘图机连接到树莓派

1、将三个舵机连接到树莓派。

树莓派没有足够的 5V 引脚来来连接到每个舵机。因此,你需要使用排线将它们连在一起,或者使用面包板。
2、连接方式如下。
连接处舵机:GPIO 引脚 14
弯头舵机:GPIO 引脚 15
提升舵机:GPIO 引脚 18
树莓派 2-12 的引脚连接方式,请点击https://pinout.xyz/

注意:请在关闭树莓派的情况下进行连线,直到你确定连线正确再开机使用以免造成设备的损坏。

启动 BrachioGraph

创建一个 BrachioGraph 实例,启动树莓派并运行:

sudo pigpiod
cd BrachioGraph
python3

然后,使用你之前记录的 inner_arm 和 external_arm 的变量值:

from brachiograph import BrachioGraph
bg = BrachioGraph(inner_arm=<inner_arm>, outer_arm=<outer_arm>)

系统将创建一个 BrachioGraph 实例并进行初始化。同时调整舵机,使笔处于标称值:
x= -inner_arm
y= outer_arm

这将对应于:
上部手臂处于 -90 度,脉冲宽度为 1500μS。
下部手臂处于 90 度,脉冲宽度为 1500μS。
提升舵机处于笔的上方,脉冲宽度为 1700μS。

检查运动状态

确保绘图机手臂按照预计的方向移动。运行:

bg.set_angles(angle_1=-90, angle_2=90)

不用做任何事情,手臂应该运行在相应的角度。

现在可以尝试以 5 度为增量改变值(一次更改一次),例如:

bg.set_angles(angle_1=-95, angle_2=90)  # should move the inner arm 5 degrees anti-clockwise

增大值使手臂顺时针移动,减小值使手臂逆时针移动。为避免剧烈的移动,请勿一次超过五度或十度的移动。

这些运动有可能会反向,因为不同的舵机或相同的舵机因为安装不一样也可能在相同的输入时产生反向的运动。

在这种情况下,你需要通过显式 servo_1_degree_ms(默认值:-10)和 servo_2_degree_ms(默认值:10)的值,将其合并到 BrachioGraph 定义中。例如,如果外部手臂的运动被反转,则需要运行以下命令初始化绘图机:

bg = BrachioGraph(inner_arm=<inner_arm>, outer_arm=<outer_arm>, servo_2_degree_ms=-10)

安装手臂

按图所示,安装好「手臂」并放置好铅笔。

将角连接到提升舵机上。

你需要将笔悬空并确保不接触纸张。抬起运动时可能会导致笔的不需要的移动,因此需要将其最小化。可以尝试运行:

bg.pen.rpi.set_servo_pulsewidth(18, <value>)

找出一对不错的向上或向下的值。然后,通过提供的 pw_up 和 pw_down 值包含在 BrachioGraph 的初始化中。

当然,手臂可能还是会偏离几度,不用太担心。
使用 BrachioGraph 开始驱动

bg.drive_xy()

控制项:
0: 退出
a: 增加 x 坐标 1cm
s: 减少 x 坐标 1cm
A: 增加 x 坐标 0.1cm
S: 减少 x 坐标 0.1cm
k: 增加 y 坐标 1cm
l: 减少 y 坐标 1cm
K: 增加 y 坐标 0.1cm
L: 减少 y 坐标 0.1cm

使用它来发现 BrachioGraph 可以绘制的框的边界。
记下 bounds 的值,即边界位置: [<minimum x>, <minimum y, <maximum x>, <maximum y>]

使用以下值重新初始化绘图机:

bg = BrachioGraph(inner_arm=<inner_arm>, outer_arm=<outer_arm>, bounds=<bounds>

测试

使用 bounds 的值绘制一个框:

bg.box()

测试模式:

bg.test_pattern()

如果绘制出来的线条还算笔直并且边框为方形,就可以尝试绘制文件:

bg.plot_file("test_file.json")

保存你的 BrachioGraph 定义

使用文件 bg.py 来保存定义的 BrachioGraph 实例以备用。它已经包含了在开发过程中编写的一些范例。

有关绘图机库的调用方法和更多资料可以参考文档:
https://brachiograph.readthedocs.io/en/latest/index.html

最后,希望你喜欢这个简易的绘图机。