爱玩矢量打印机

写在前面,这个是我几周前做的,但是最近一直没写,咕

受到乡村熊的启发,我开始做矢量打印机,从打印像素到打印公式,从打印文字到打印形状,从粗略描述到精准绘图

1.1 爱玩矢量 打印机——爱玩 矢量打印机

首先我把A4纸分为1mm*1mm的方格纸作为坐标系(密恐请跳过

‘藲‘就是度(角度)

然后根据官网上写的x轴9度1mm,y轴8度1mm写出程序

1.2 程序(”’就是我在这里写的注释”’

#!/usr/bin/env pybricks-micropython
# coding: utf-8
'''导入需要的模块(接入EV3)'''
from pybricks import ev3brick as brick
from pybricks.ev3devices import (Motor, TouchSensor, ColorSensor,
                                 InfraredSensor, UltrasonicSensor, GyroSensor)
from pybricks.parameters import (Port, Stop, Direction, Button, Color,
                                 SoundFile, ImageFile, Align)
from pybricks.tools import print, wait, StopWatch
from pybricks.robotics import DriveBase

# Write your program here
from time import sleep


xmotor = Motor(Port.C)
ymotor = Motor(Port.B)
updownmotor = Motor(Port.D)
touch = TouchSensor(Port.S3)
'''定义端口电机和传感器'''

while touch.pressed() == 0:
    xmotor.run(-300)

xmotor.run_angle(300, 100)
updownmotor.run_until_stalled(360)
xmotor.reset_angle(0)
ymotor.reset_angle(0)
'''初始化'''

#36*n
#x:9 degree/1mm
#y:8 degree/1mm

def cmp(a, b):
    return (a > b) - (a < b) 
'''即为python2中的compare,比较两数大小'''

def wait():
    while xmotor.speed() != 0 or ymotor.speed() != 0:
        sleep(0.1)
'''等待到x、y轴电机停转,过一会有大用'''

def line(x1,y1,x2,y2):'''画线,输入起始点坐标和结束点坐标'''
    xmotor.run_target(1000,x1 * 9,Stop.COAST,False)
    ymotor.run_target(1000,y1 * 8,Stop.COAST)
    sleep(0.1)
    wait()
    '''等待电机完成移动'''

    updownmotor.run_angle(360,-30)
    '''移动到起始点并放下画笔''' 

    speed = cmp(abs(x2-x1),abs(y2-y1))
    '''比较xy轴的变化量大小,以确定较大的电机转速'''

    if speed == 1:'''x轴变化大'''           
        xmotor.run_target(600,x2 * 9,Stop.COAST,False)
        if y2-y1 != 0:
            proportion = abs(x2-x1)/abs(y2-y1)
            ymotor.run_target(600 / proportion,y2 * 8,Stop.COAST,False)
  
    if speed == -1:'''y轴变化大'''           
        if x2-x1 != 0:
            proportion = abs(x2-x1)/abs(y2-y1)
            xmotor.run_target(600 * proportion,x2 * 9,Stop.COAST,False)
        ymotor.run_target(600,y2 * 8,Stop.COAST,False)

    if speed == 0:'''xy轴变化一样大(等速)'''           
        xmotor.run_target(600,x2 * 9,Stop.COAST,False)
        ymotor.run_target(600,y2 * 8,Stop.COAST,False)

    sleep(0.3)
    wait()
    updownmotor.run_until_stalled(360)
    '''放下画笔'''

def circle(a,b,r):'''画圆'''
    #(x-a)**2 + (y-b)**2 = r**2
    updownmotor.run_angle(360,-30)
    #上半圆
    for x in range(a-r,a+r):
        y = (r**2-(x-a)**2) ** 0.5 + b
        xmotor.run_target(300,x * 9,Stop.COAST,False)
        if y != 0:
            ymotor.run_target(300/x*y,y * 8,Stop.COAST,False)
        sleep(0.1)
        wait()
        
    #下半圆
    for x in range(a-r,a+r):
        y = -(r**2-(x-a)**2) ** 0.5 + b
        xmotor.run_target(300,x * 9,Stop.COAST,False)
        if y != 0:
            ymotor.run_target(300/x*y,y * 8,Stop.COAST,False)
        sleep(0.1)
        wait()
    updownmotor.run_until_stalled(360)

然后就完工了,相比于逐行打印,这种办法对于图形更加高效且无损,相当于是字体文件和png的区别

2.1 一些问题

画圆的时候开始过于紧密,之后又过于稀疏(线段个数

2.2 解决

    for x in range(a-r,a+r):
        y = (r**2-(x-a)**2) ** 0.5 + b
        print(x,y)
        if abs(x - lastx) > 5 or abs(y - lasty) > 5:
            xmotor.run_target(300,x * 9,Stop.COAST,False)
            if y != 0:
                ymotor.run_target(300/x*y,y * 8,Stop.COAST,False)
        sleep(0.1)
        wait()
        lastx,lasty = x,y

增加一个距离的判别,聚集超过5mm就花一条线(即为分辨率,1mm会更精确

3.1 我在做的事

  • 树莓派的带有图像识别摄像头的小车
  • 用teachable machine做的作业分拣装置,识别不同学科的作业
  • 树莓派弹奏ukulele(我大概还要科普一下乐理知识和弹拨乐器的使用方法
  • 了解深度学习

关于 “爱玩矢量打印机” 的 1 个意见

发表评论

电子邮件地址不会被公开。 必填项已用*标注