树莓派DIY方波信号发生器

树莓派DIY方波信号发生器

在做毕设的过程中,读到一篇非常有创意的文章,是利用液态金属的电润湿现象来驱动电解液的流动。关于液态金属的电润湿现象的研究,大多集中在利用介电润湿来驱动液态金属液滴运动及利用连续电润湿驱动液态金属在充满电介质的微流道中流动两个方面。而这篇文章反其道而行之,简直妙。

特别想重复这个实验,实验中会用到方波,而实验室只有直流电源。去找师姐借用电化学工作站,调试了一番后发现电化学工作站的方波信号有步数限制,无法提供高频率的信号源。于是有了利用树莓派或者stm32开发板来自己搭信号发生器的想法。

stm32应用经验不足,所以最终决定用树莓派来实现。主要方案是:

  • 利用python的GPIO库控制树莓派的针脚输出pwm波和控制信号
  • 直流恒压电源、pwm信号源和控制信号连接TB6612FNG驱动模块
  • 驱动模块输出连接电解电极和空气泵

个人实验方法是:

  • xshell ssh 连接树莓派调试
  • pycharm 连接树莓派编写控制程序
  • GPIO库和time库实现精确输出控制信号
  • 输出两路控制信号,一路控制电解电极,另一路控制空气泵
  • 树莓派使用T形扩展板连接面包板 TB6612安装在面包板上 直流电源输入工作电压
  • PDMS 制作图形化沟槽,电解电极为3mm石墨棒,空气泵产生气泡示踪液体流动

树莓派的调试

由于个人习惯,我使用的树莓派系统是官网提供的轻量级lite版系统——2018-03-13-raspbian-stretch-lite。因为要经常在实验室使用,所以用一根短网线直接连接了树莓派和笔记本。

在笔记本中打开控制面板->网络和 Internet->网络和共享中心->更改适配器设置,然后右键WLAN的属性,在共享中打开允许其他网络用户通过此计算机的Internet连接来连接,并在家庭网络连接中选中以太网,也就是通过网线连接的网络。打开树莓派稍等,树莓派与计算机就组成了一个本地网络,树莓派可以通过笔记本的无线网卡访问网络。

连接树莓派和笔记本之后,Win+R -> cmd -> arp -a ,可以找到树莓派的ip地址。或者用Advanced IP Scanner来扫描192.168.137.1-254网段的局域网,可以直接找到名为raspberrypi.mshome.net的树莓派的ip地址。之后通过xshell来ssh连接树莓派。需要注意的是,新版本的树莓派官方系统都默认禁止了ssh,所以需要在根目录下新建一个文件名为ssh的文件就可以ssh连接了。

连接之后当然是修改软件源为阿里源、更新源和更新已安装的包。这可能需要一些时间。

硬件连接

connection

硬件连接如如所示,我买了一个T形转接头,将树莓派的排口转接到了面包板上,然后连接了树莓派和TB6612模块。其中TB6612模块的VM,也就是工作电压是恒压直流电源提供的,恒压直流电压的负极与系统的GND相连。两个输出端连接的是作为输出的碳电极。

树莓派和TB6612模块的工作原理之后介绍。

TB6612FGN驱动模块

TB6612模块是东芝半导体生成的一款直流电机驱动模块,双路输出,最高支持15V的负载电压,最高平均电流1.2A,最高峰值电流3.2A。

TB6612

  • 这张图是网上的两张图合成的。TB6612模块有16个焊点。
  • WM连接直流电源正极,VM值决定了驱动电压。
  • VCC连接信号高电平,即连树莓派的VCC。
  • GND连接信号地,即连接树莓派GND。
  • STBY必须连信号高电平时,模块才工作,如需控制可以连接树莓派的IO脚。
  • PWMA连接树莓派PWM波发生接口,我选择了BCM编码为20的脚。
  • AO1、AO2为PWMA输入后,经电桥放大后的输出端。
  • AIN1、AIN2控制PWMA输入后,控制输出信号停止/倒转,如需控制可以连接树莓派的IO脚。
  • PWMB、B01、B02、BIN1、BIN2关系也类似。
真值表 AIN1 AIN2 状态
0 0 停止
1 0 正转
0 1 倒转

使用pycharm做树莓派python开发

我使用python的GPIO模块来实现控制树莓派的串口,所以使用了pycharm来写程序。
新建项目,然后选择Settings -> Tools -> SSH Terminal,Deployment server选择‘select server on every run’。

pychar_setting_1

然后新建一个SFTP连接,填写必要的项目。

pychar_setting_2

本地目录为D:\Code\waveform generator,远程目录为/wave

pychar_setting_3

Test SFTP 连接成功

pychar_setting_4

之后即可本地写程序,通过SFTP上传到树莓派,并利用树莓派的Python环境跑程序,同时还可以利用pycharm管理树莓派Python的包。

使用GPIO库编写控制程序

GPIO模块的使用wiki可以访问:https://sourceforge.net/p/raspberry-gpio-python/wiki/Home/

这是一个点亮一个发光二极管十秒的样例,test.py:

1
2
3
4
5
6
7
8
9
10
11
12
import time
import RPi.GPIO as GPIO
GPIO.setmode(GPIO.BCM)
GPIO.setup(12, GPIO.OUT)

try:
GPIO.output(12, GPIO.HIGH)
time.sleep(10)
except KeyboardInterrupt:
pass

GPIO.cleanup()

这是一个测试pwm功能的样例,pwm.py:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import RPi.GPIO as GPIO
GPIO.setmode(GPIO.BCM)
GPIO.setup(12, GPIO.OUT)

f = input('f')
dc = input('dc')

p = GPIO.PWM(12, f) # channel=12
p.start(0)

try:
p.ChangeDutyCycle(dc)
time.sleep(100)
except KeyboardInterrupt:
pass

p.stop()
GPIO.cleanup()

这个样例发生的波形为pwm波,正负电平之间跳动。

下面是我所需要的峰值、频率、占空比可调的方波(无负电平)发生器代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
import time
import RPi.GPIO as GPIO

GPIO.setmode(GPIO.BCM)
GPIO.setup(12, GPIO.OUT)
GPIO.setup(20, GPIO.OUT)
GPIO.setup(21, GPIO.OUT)

t = input('time=')
f = input('f=')
dc = input('dc=')
# t = 30
# f = 200
# dc = 70

p = GPIO.PWM(12, 1) # channel=12 frequency=1Hz
p.start(100)

step = t*f
for i in range(1, step):
GPIO.output(20, GPIO.HIGH)
GPIO.output(21, GPIO.LOW)
time.sleep(1.0*dc/100/f)
GPIO.output(20, GPIO.LOW)
GPIO.output(21, GPIO.HIGH)
time.sleep(1.0*(100-dc)/100/f)

p.stop()
GPIO.cleanup()

END

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×