Schemdraw小白从入门到放弃---原理工具书

SchemDraw是一款非常优秀简单高效的python的电路图软件,猜测其设计者是一位优秀的电子信息工程师,他从传统的纸上画图入手,抽象出很多手绘图的习惯,将至迁移到编程中,所以学习成本超低,适合小白入手到大神。

python是一门很简单的编程语言,如果您有java或者c语言基础,那么学习成本超级低。

学习就是学且练习,一篇好的文章,应该简单明了的说明思路及大量的习题,而真正的做题方式是做一题理解更深一层。很多习题是笔者自己出的,才疏学浅度,多多扶正,另外,很多是开发题目,言之成理即可,不要在乎答案。

schemdraw包含了作者大量心血,我试图用最简单的逻辑去阐明作者设计初衷,降低各位学习成本,所以与原教程有明显不一样的编排,不喜勿喷。我自己的理解:设计者将纸上作图的方法完全照抄到了编程绘图上,所以纸上怎么画图就怎么编写程序。看完本教程,忘记我的言语,留着您的理解,记住几个常用函数,展开您的想象,随意发挥。

太长了,没有编写完的章节后续慢慢补。

版本

SchemDraw的最佳python版本是3.8.0+,最新版本是0.14,可以在jupyter中使用此软件。

最简单的例子

import schemdraw
import schemdraw.element as elm

with schemdraw.Drawing():
    elm.Resistor()
    elm.Capacitor().down()
    elm.Diode().color('red').left()
    elm.SourceV().label("3V").up()

在这里插入图片描述

一、总体思路

  1. 在设计者看来,电路图是由电路元件按照一定顺序连接而成。
  2. 元件:具备一定的属性最常见的是label、color、length等等。
  3. 布局:大部分电路图很简单,是一堆元件依次连接形成的,在绘制过程中,您都是在前一个元件的端点上绘制下一个,只需要在绘制的过程中把握好方向就行了。当然复杂电路上,有可能需要在某个之前很早画好的元件上画下一个元件,这就涉及改鼠标焦点,设计者也预留了方法。

接下来,本文先介绍电子元件及其一些简单属性和方法,再介绍电子元件的连接及其一些比较深入的属性和方法。

二、元件

Schemdraw的元件,在schemdraw.element包下,需要用到哪些元件您看其介绍就好。下面讲他们的一些属性介绍。

2.1 color

with schemdraw.Drawing() as draw:
	# 1. color函数链式调用
	elm.Capacitor().color('#A0F')
	
	# 2. 初始化元素
	elm.Diode(color="red")

在这里插入图片描述

习题

2.1.1 color函数支持6位的RGB数值吗?

2.2 label

label除了显示正常文字,也支持latex语法,loc属性注明其位置;同时,也支持label链式连续调用,以满足多处注释的需求。

with schemdraw.Drawing() as draw:
    elm.Capacitor().label("$3uf$", loc="bottom").\
       label("left", loc='left').\
       label("right", loc='right').\
       label("top", loc='top')

在这里插入图片描述

2.3 length

元件都有默认长度,一般为3,您也可以尝试改变一下。别问我3的单位是啥,我也不知道,这是设计者自己设定的,它仅仅是电子元器件间长度的绝对数值,应该不是物理意义上的绝对数值。

with schemdraw.Drawing() as draw:
    d = elm.Diode(color='red', label='3')
    
with schemdraw.Drawing() as draw:
    d = elm.Diode(label='2').length(2)
    
with schemdraw.Drawing() as draw:
    d = elm.Diode(label='2.5').length(2.5)
    
with schemdraw.Drawing() as draw:
    d = elm.Diode(label='5').length(5)

在这里插入图片描述

三、元件的连接

回想一下,我们在纸上画图的过程,不难发现:您一般都是在上一个元件的末尾,开始画下一个元件的,尤其是简单串联电路上,肯定遵守这个法则。有时,您的元件需要拐弯,也就是改变了画笔的方向,而且下一个元件也延续在这个方向上画。最后,您也时常会画好一个子部分后,在另外一个元件的某个接线点上继续画原件。在上面过程中,提到设计者最核心的三个设计点:接线点、方向和延续性
下面进行讲解。

3.1 延续性

延续性,在其底层实现是:设计者将类似鼠标焦点的东西,每次都迁移到最新的元件的其他接线点上,如下代码:起初,存在一个鼠标焦点,用户定义了一个二极管对象后,二极管一端接到这个鼠标焦点上,然后二极管另一端就变成新的鼠标焦点接上后续定义的电容,再转移鼠标焦点,接新的电阻对象…,依次画元件变更新的鼠标焦点,完成此幅电路图。

with schemdraw.Drawing() as draw:
    # 在上一个元件的尾部画下一个元件
    # 方向保持不变
    # 第一组 三个元件
    elm.Diode()
    elm.Capacitor()
    elm.Resistor()
    # 第二组 两个元件
    elm.Diode(color="red").up()
    elm.Capacitor(color="red")
    # 第三组 三个元件
    elm.Diode(color="blue").left()
    elm.Capacitor(color="blue")
    elm.Resistor(color="blue")

在这里插入图片描述
在上述很容易看到方向和鼠标焦点的延续性。另外设计者,这样子隐式地规定了各元件间连接搭配,既符合我们日常画图顺序,又省去大量代码描述元件的连线,实在优秀。

习题

3.3.1 还有哪些功能上,可能存在这种延续性???您可以在看完文章后,再来回答这个问题。

3.2 方向

方向,就是你在纸上画这个元件时的走向,也就是元件起点到结束点的走向。有两种实现,一种是利用elm的up,left,right,down,另一种是用偏转角度函数theta来表示,theta是希腊字母 θ \theta θ的读音,在数学上用来表示角度。

wwith schemdraw.Drawing() as draw:
    elm.Diode().label("默认方向是向右画")
    elm.Capacitor().down().label("向下画")
    elm.Resistor(color="red").theta(60).label("60度画", loc='bottom')
    elm.Resistor(color="blue").theta(300).label("300度")

在这里插入图片描述

习题

3.2.1 为什么是up,down两个单词来表示,而不是top,bottom?

3.2.2 如下代码,会画出什么有意思的?

with schemdraw.Drawing() as draw:
    elm.Diode().label("默认方向是向右画")
    elm.Capacitor().down().label("向下画")
    elm.Diode(color="red").up().label("向上画", loc='bottom')

3.2.3 请问theta函数的0度时,元件走向如何?90度呢?180度?270度?360度?如下代码,请猜一下如何画?

with schemdraw.Drawing():
    elm.Resistor().theta(0)

3.3 接线点

接线点,就是元件的电线接入点,设计者给它取名为anchor。在schemdraw中,元件分为两种:一种是有五个anchors,一般分别叫做start,end,center, istart, iend,大多数都属于这种,如二极管、电阻、电容,其中三极管这类的,含有一些有名的anchors;一种是只有一个anchors,比如接地符号。

with schemdraw.Drawing():
    # 电阻R1 具有五个接线anchor名字分别为start,end,center,istart,iend。 
    # 其中start和end是电线接入点,center也是一个接入点,但是电阻,电容这类元件没啥用。
    # 使用label函数中的loc将sec三个字符分别显示到对应的点上。
    R1 = elm.Resistor().label("s", loc='start').label("e", loc="end").label("c", loc="center")
    # istart,iend是电阻元器件本身的起始位置,一般用不到
    # 现在给您展示下,生成一个接地符号,挂在R1的istart位置上。
    g1 = elm.Ground().at(R1.istart).color("red")

在这里插入图片描述
在下面您可以看出,如何查看一个元素的有多少个anchor,及其具体的名字,而anchor是元件的一个重要属性,是一个个二维坐标点,是设计者预留给使用者的绘图接口,属于较为高级的内容。
在这里插入图片描述
一般而言,常用型元器件中,电容电阻二极管电源,它们最常用的anchor是start和end,大家也没有管用叫法,所以统一叫做start和end。
但是对于三极管这种的话,每个anchor是有各自不同的命名的如下:
在这里插入图片描述

习题

3.3.1 运行如下代码,为啥没有东西?

import schemdraw.elements as elm
R1 = elm.Diode()
print(R1.anchors)

3.3.2 您觉得anchor功能有哪些设计亮点?

3.3.1 默认激活anchor与沉默anchor

绘图时,设计者规定,电路图中所有anchor中,有且只有一个默认激活anchor,也就是鼠标焦点,其它均为沉默anchor。

3.3.2 切换鼠标焦点机制

设计者有一套自动的鼠标焦点切换管理机制,一般情况下,当您画了一个元件后,鼠标焦点默认在您当前的元件的默认结束接线点,也就是延续性。

3.3.2.1 at函数规定元件的start接在哪个anchor上

只是碰到一些复杂电路时,需要将鼠标焦点切换到其他元件的某接线点上。推荐您使用at函数如下:

with schemdraw.Drawing():
    r1 = elm.Diode().label("第一个元件")
    elm.Capacitor().label("第二个元件")
    # 使用at函数,at函数为当前元件指定其开始点即start anchor接在某元件的某anchor上。
    elm.Resistor(color="red").up().at(r1.start).label("第三个元件", loc='bottom')

在这里插入图片描述

3.3.2.2 to函数规定元件的end接线在哪里
with schemdraw.Drawing():
    R1 = elm.Resistor().label("R1")
    C2 = elm.Capacitor().down().label("C2")
    D3 = elm.Diode().color('red').left().label("D3")
    R2 = elm.Resistor().at(R1.start).to(C2.end).label("R2")
    elm.Dot(color="blue")

在这里插入图片描述

3.3.2.3 anchor函数规定当前元件用那个anchor与其他元件对接
with schemdraw.Drawing():
    R1 = elm.Resistor().label("R1")
    C2 = elm.Capacitor().down().label("C2")
    D3 = elm.Diode().color('red').left().label("D3")
    jit1 = elm.BjtNpn().label("bji1")
    elm.Dot(color="blue")
    jit2 = elm.BjtNpn().anchor("collector").at(R1.start).label("bji2")

在这里插入图片描述

习题

二极管适合用anchor函数吗?

四、自定义元件

五、附加介绍:制作GiF

六、升华习题

6.1 请问您觉得设计者的编程方法是否别扭?这种别扭带来的好处是什么?

6.2 请问您是否觉得schemdraw是否在编程上是相对高效的?体现在哪里?

6.3 请问本文第一个例子中,schemdraw是怎么将之自动封口成为一个四方形的?

习题答案

仅供参考,开放题目!

3.1.1 其他都不会具备延续性了,因为纸上画图也是这样的,只有这两处具备不变性。颜色,大小,等等都会变的,或者是可以全局设置的。

3.2.1 因为up,down是说向上向下画,top和bottom表示一张图中的上下位置。

3.2.2 会覆盖,如下图,而且可以看到,作者是多么相信我们呀!
在这里插入图片描述

<think>嗯,用户想用Pythonschemdraw库来画《单片机控制LED》的原理图。首先,我得确认schemdraw的基本用法,确保自己了解这个库的元件支持和绘图流程。 用户可能需要一个简单的电路图,包含单片机、LED、电阻和电源。得考虑元件的连接方式,比如LED通常需要限流电阻,接在单片机的IO口上。那在schemdraw里,这些元件怎么表示呢?比如,单片机可以用IC元件,LED是LED类,电阻是Resistor。 然后要确定元件的摆放位置。单片机应该放在中间,左边接电源和地,右边接LED电路。电源符号用Vdd和GND,可能需要使用标签来标注。 接下来是连接线路。要注意引脚的正确连接,比如IO口连接到电阻,再接到LED阳极,阴极接地。可能还需要在单片机旁边标注VCC和GND的连接。 代码部分,需要导入schemdraw,创建Drawing对象,然后逐个添加元件。每个元件的方向和位置参数要调整好,比如电阻可能需要旋转90度,LED的方向也要正确。连接时使用up、down、left、right参数控制走线方向。 可能遇到的问题:元件的位置调整,避免线路交叉。比如,电源和地符号的位置是否合适,LED的方向是否正确,电阻的值标注是否清晰。 测试代码时,确保所有元件都正确导入,没有语法错误。运行后检查图形是否符合预期,线路连接是否正确,标签是否清晰可见。 最后,提醒用户可能需要根据实际需求调整参数,比如IO口编号、电阻值、LED颜色等。还有schemdraw的文档参考,方便用户进一步自定义。</think>我将分步骤介绍如何使用Pythonschemdraw库绘制《单片机控制LED》原理图: 1. **环境准备** ```python pip install schemdraw ``` 2. **基础电路绘制代码** ```python from schemdraw import flow from schemdraw import logic from schemdraw import elements as elm with elm.Style(elm.IC_LABEL_FONT_SIZE=9): # 设置元件标签字号 d = elm.Drawing() # 绘制单片机主体 uC = elm.Ic(pins=[elm.IcPin(name='VCC', side='left', pin='40'), elm.IcPin(name='GND', side='left', pin='20'), elm.IcPin(name='IO1', side='right', pin='1')]) d += uC # 添加电源电路 d += elm.Vdd().label('5V').at(uC.VCC).left() d += elm.Ground().at(uC.GND).left() # 绘制LED驱动电路 R = elm.Resistor().down().label('220Ω').at(uC.IO1) d += R LED = elm.LED().down().label('LED') d += LED d += elm.Ground() # 连接导线 d += elm.Line().left().length(3).at(uC.IO1) # 单片机引脚引出线 d.draw() # 执行绘图 ``` 3. **关键元件说明** - `Ic()`:表示集成电路(单片机) - `Vdd()`:直流电源符号 - `Resistor()`:限流电阻(220Ω典型值) - `LED()`:发光二极管 - `Ground()`:接地符号 4. **输出效果说明** - 左侧显示单片机电源引脚(VCC/GND) - 右侧IO口通过电阻驱动LED - 所有元件自动对齐布局 - 带有元件参数标注 5. **自定义调整建议** - 修改`pins`参数调整单片机引脚配置 - 修改`.label()`参数设置元件标注 - 使用`elm.style()`修改线条粗细/颜色 - 添加`elm.Capacitor()`实现滤波电路 - 使用`elm.Arrow()`添加信号流向标注 完整绘图支持导出为SVG/PNG格式: ```python d.save('mcu_led.svg') d.save('mcu_led.png', dpi=300) ``` 建议参考schemdraw官方文档(https://schemdraw.com/)获取更多元件类型和布局控制参数。该方案可用于教学演示、实验报告插图或简单硬件设计示意图绘制。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值