我们使用的Mega 2560的定制板MKS Gen V1.2进行的基本配置,5个A4988步进电机驱动已经安装在板子上,其余部件没有安装,仅进行了基本的软件连通性测试。下面介绍下在 Linux 下的软件连通方法。
主机上需要安装printrun-gui,官方wiki给出了如下的方法(Debian):
Debian</span></h4>
You can run Printrun directly from source, as there are no (official) packages available yet. Fetch and install the dependencies using:</p>
sudo apt-get install python-serial python-wxgtk2.8 python-pyglet
</pre>
There are experimental packages for Debian (squeeze wheezy):</p>
sudo echo "deb http://apt.ulrichard.ch/</a> squeeze main contrib non-free" >> /etc/apt/sources.list
sudo apt-get update
sudo apt-get install printrun-gui
</pre>
</blockquote>
由于我使用的是Debian Sid 9,官方只给出了debian6 的源(不吐槽,这个源还是404的。。。。。。。无法使用)</p>
我的安装方法如下:
sudo apt-get install python-serial python-wxgtk2.8 python-pyglet python-tornado python-setuptools python-libxml2 python-gobject avahi-daemon libavahi-compat-libdnssd1 python-dbus python-psutil git</li>
git clone https://github.com/kliment/Printrun.git</li>
sudo ./pronterface.py</li>
</ol>
然后期待已久的画面终于出来了! 赶紧给板子通电~~波特率选择为250000 Connect</p>
[caption id="attachment_76" align="alignnone" width="1366"]<img class="size-full wp-image-76" src="http://www.bmysoft.org/wp-content/uploads/2014/10/2014-10-27-200000-的屏幕截图.png" alt="./pronterface.py" width="1366" height="768" /></a> ./pronterface.py[/caption]</p>
由于我们没有接入步进电机和温度模块,只能通过右侧基本的数据进行观察,由于没有接入温度模块,温度曲线一直是平的,如下图
[caption id="attachment_77" align="alignnone" width="1366"]<img class="size-full wp-image-77" src="http://www.bmysoft.org/wp-content/uploads/2014/10/2014-10-27-200013-的屏幕截图.png" alt="./pronterface.py 温度曲线" width="1366" height="768" /></a> ./pronterface.py 温度曲线[/caption]</p>
使用的单片机: mega 2560
Marlin固件下载地址: https://github.com/ErikZalm/Marlin/releases (在这里下载最新版本的Marlin, 个人不建议直接clone,在开发版本可能会出现bug)
Marlin固件的设置存在Configure.h 文件中,下面摘录网上对部分配置的解读和自己的一些解读
#define BAUDRATE 250000</code>这是配置串口波特率的,只有上位机波特率和固件波特率相同来能通讯成功,一定需要注意。当然也不能随便改,常见的波特率为:2400,9600,19200,38400,57600,115200,250000。在3d打印机中常用的是后3个。</p>
关于波特率的概念可以参见我的博客里的另一篇文章:浅谈关于串口通信中的波特率</a></p>
#define MOTHERBOARD 33</code>
这个参数是配置板子类型的,3d打印机主控板类型非常多,每个板子的io配置不尽相同,所以这个参数必须要跟你自己的板子类型相同,否则无法正常使用。我们定的板子是MKS Gen V1.1,因为是兼容Ramps1.4的,所以对应的配置应该为33(单打印头配置),和34(双打印头配置)。如果你使用的是其它板子,请参考旁边的注释并选择合适的配置。</p>
#define TEMP_SENSOR_0 1</code>
#define TEMP_SENSOR_BED 1
</code>这两个参数分别配置温度传感器的类型。这是读取温度是否正常的重要参数,如果读取的温度不正常将不能工作甚至有很大的潜在危险(烧毁器件等)。配置为1说明两个都是100K ntc热敏电阻。如果你使用了其它温度传感器需要根据情况自行更改。</p>
#define EXTRUDE_MINTEMP 170
</code>这个参数是为了防止温度未达到而进行挤出操作时带来的潜在风险,如果你做其它3d打印机,比如有朋友做巧克力打印机,挤出温度只需要45度,那么这个参数需要配置为较低数值,比如40度。</p>
const bool X_ENDSTOPS_INVERTING = true;</code>
const bool Y_ENDSTOPS_INVERTING = true;</code>
const bool Z_ENDSTOPS_INVERTING = true;</code>
这里的三个参数是配置3各轴的限位开关类型的,配置为true,限位开关默认状态输出为1,触发状态输出为0,也就是机械限位应该接常开端子。如果你接常闭端子,则将true改为false。</p>
#define INVERT_X_DIR false</code>
#define INVERT_Y_DIR true
</code>这两个参数是比较容易错的。根据自己机械的类型不通,两个的配置不尽相同。但是原则就是要保证原点应该在打印平台的左下角(原点位置为[0,0]),或右上角(原点位置为[max,max])。只有这样打印出来的模型才是正确的,否则会是某个轴的镜像而造成模型方位不对。参考下图坐标。<img src="http://ww4.sinaimg.cn/mw690/78d6d1a7gw1e8f2mnswbqj203j03o743.jpg" alt="" data-bd-imgshare-binded="1" />
#define X_HOME_DIR -1</code>
#define Y_HOME_DIR -1</code>
#define Z_HOME_DIR -1</code>
如果原点位置为最小值参数为-1,如果原点位置为最大值配置为1.</p>
#define X_MAX_POS 205</code>
#define X_MIN_POS 0</code>
#define Y_MAX_POS 205</code>
#define Y_MIN_POS 0</code>
#define Z_MAX_POS 200</code>
#define Z_MIN_POS 0</code>
这几个参数是配置打印尺寸的重要参数,参考上面的坐标系图来填写,这里需要说明的是坐标原点并不是打印中心,真正的打印中心一般在[(x.max-x.min)/2,(y.max-y.min)/2]的位置。中心位置的坐标需要在后面的切片工具中使用到,打印中心坐标应该与这里的参数配置匹配,否则很可能会打印到平台以外。</p>
#define HOMING_FEEDRATE {50*60, 50*60, 4*60, 0}</code>
配置回原点的速率,单位为毫米每分钟,如果你使用的是xy轴同步带传动,z轴螺杆传动,这个参数可以使用默认值。</p>
#define DEFAULT_AXIS_STEPS_PER_UNIT {85.3333, 85.3333,2560,158.8308}</code>
这个参数是打印机打印尺寸是否正确的最重要参数,参数含义为运行1mm各轴所需要的脉冲数,分别对应x,y,z,e四轴。多数情况下这个数字都需要自己计算才可以。计算公式可以参考的文章3d打印机各轴脉冲数计算方法</a>。如果你不想自己计算可以用计算器:3d打印机脉冲数计算器
</a>
至此,最常用的参数都已经配置完成,可以开始使用了。</p>
下面介绍一下Marlin的编译方法:
编译方法有两种:
使用Arduino IDE 直接打开INO文件,选择board的类型为Arduino Mega 2560点击Verify校验代码
<img src="http://ww3.sinaimg.cn/mw690/78d6d1a7gw1e8f3zztbhej20dw0godid.jpg" alt="" data-bd-imgshare-binded="1" />
再点击向右的箭头按钮来上传固件,如图
<img src="http://ww2.sinaimg.cn/mw690/78d6d1a7gw1e8f400qju9j20dw0gomzp.jpg" alt="" data-bd-imgshare-binded="1" /></li>
第二种方法:进入目录执行ake</li>
</ol></p>
[caption id="attachment_61" align="alignnone" width="799"]<img class="size-full wp-image-61" src="http://www.bmysoft.org/wp-content/uploads/2014/09/pyre_ebb9ce1c-e5e8-4219-a8ae-7ee620d5f9f1.png" alt="Python 正则" width="799" height="1719" /></a> Python 正则[/caption]</p>
Step</td></p>
Matched</td></p>
Explanation</td>
</tr></p>
1</td></p>
a</td></p>
a 匹配模式</td>
</tr></p>
2</td></p>
abcbd</td></p>
引擎匹配 [bcd]*,并尽其所能匹配到字符串的结尾</td>
</tr></p>
3</td></p>
Failure</td></p>
引擎尝试匹配 b,但当前位置已经是字符的最後了,所以失败</td>
</tr></p>
4</td></p>
abcb</td></p>
退回,[bcd]*尝试少匹配一个字符。</td>
</tr></p>
5</td></p>
Failure</td></p>
再次尝次b,但在当前最後一位字符是"d"。</td>
</tr></p>
6</td></p>
abc</td></p>
再次退回,[bcd]*只匹配 "bc"。</td>
</tr></p>
7</td></p>
abcb</td></p>
再次尝试 b ,这次当前位上的字符正好是 "b"</td>
</tr>
</tbody>
</table>
</p>
方法/属性</td></p>
作用</td>
</tr></p>
match()</td></p>
决定 RE 是否在字符串刚开始的位置匹配</td>
</tr></p>
search()</td></p>
扫描字符串,找到这个 RE 匹配的位置</td>
</tr></p>
findall()</td></p>
找到 RE 匹配的所有子串,并把它们作为一个列表返回</td>
</tr></p>
finditer()</td></p>
找到 RE 匹配的所有子串,并把它们作为一个迭代器返回</td>
</tr>
</tbody>
</table>
</p>
方法/属性</td></p>
作用</td>
</tr></p>
group()</td></p>
返回被 RE 匹配的字符串</td>
</tr></p>
start()</td></p>
返回匹配开始的位置</td>
</tr></p>
end()</td></p>
返回匹配结束的位置</td>
</tr></p>
span()</td></p>
返回一个元组包含匹配 (开始,结束) 的位置</td>
</tr>
</tbody>
</table>
编译标志
编译标志让你可以修改正则表达式的一些运行方式。在 re 模块中标志可以使用两个名字,一个是全名如 IGNORECASE,一个是缩写,一字母形式如 I。(如果你熟悉 Perl 的模式修改,一字母形式使用同样的字母;例如 re.VERBOSE的缩写形式是 re.X。)多个标志可以通过按位 OR-ing 它们来指定。如 re.I | re.M 被设置成 I 和 M 标志:</p>
标志</td></p>
含义</td>
</tr></p>
DOTALL, S</td></p>
使 . 匹配包括换行在内的所有字符</td>
</tr></p>
IGNORECASE, I</td></p>
使匹配对大小写不敏感</td>
</tr></p>
LOCALE, L</td></p>
做本地化识别(locale-aware)匹配</td>
</tr></p>
MULTILINE, M</td></p>
多行匹配,影响 ^ 和 $</td>
</tr></p>
VERBOSE, X</td></p>
能够使用 REs 的 verbose 状态,使之被组织得更清晰易懂</td>
</tr>
</tbody>
</table></p>
\d 匹配任何十进制数;它相当于类 [0-9]。
\D 匹配任何非数字字符;它相当于类 [^0-9]。
\s 匹配任何空白字符;它相当于类 [ \t\n\r\f\v]。
\S 匹配任何非空白字符;它相当于类 [^ \t\n\r\f\v]。
\w 匹配任何字母数字字符;它相当于类 [a-zA-Z0-9_]。
\W 匹配任何非字母数字字符;它相当于类 [^a-zA-Z0-9_]。
</pre>
</p>
sudo pip install Django==1.7</li>
sudo apt-get install python-mysqldb</li>
</ol>
创建一个新的工程 :django‐admin.py startproject [project name]</p>
运行开发服务器:python manage.py runserver
出现Socket operation on non-socket 错误的原因是:</p>
if(listenfd= socket(AF_INET,SOCK_STREAM, 0)==-1)</p>
if(connfd=accept(listenfd,(struct sockaddr *)&client_addr,(socklen_t *)&sin_size)==-1)</p>
这两句中缺失了()造成的。赋值符合优先级最低,导致listenfd和connfd在创建/连接成功是为0,不成功时为1</p>