学习笔记:透明电子纸的粒子运动仿真模型

学习笔记:透明电子纸的粒子运动仿真模型


前言

透明电子纸,又称透明墨水屏,其显示机理是通过TFT的电场调控实现墨水颜色颗粒的移动,进而产生显示画面或透明区域。在国内外研究进展中,透明电子纸技术相关的仿真模型的研究较少,这主要是因为目前还没有较完整以及较精确的粒子运动仿真模型。而构建一个符合实际情况的仿真模型,对于深入研究电泳电子纸技术,或者是电泳、电渗流等物理现象具有很强的实际意义。因此本文将根据所学知识以及相关经验,提出了一种基于Python编写的透明电子纸的粒子运动模型。本人水平有限,请看官们多多包涵。


一、粒子运动模型的基本物理背景

电子纸墨水中的颜色颗粒的粒径一般在百纳米级别,根据界面与胶体学相关知识,其颗粒表面会形成“电双层(electric double layer)”结构。该结构的作用是:稳定了颜色粒子在墨水溶剂中的稳定性及分散性,使其不会轻易发生颗粒之间的团聚及吸附现象。“电双层”这一物理结构对于颜色颗粒的运动行为有着至关重要的影响,因此透明电子纸的粒子运动仿真模型也主要是围绕“电双层”这一结构而展开。

根据Peter Debye 和 Erich Hückel等人的相关研究,电子墨水中颜色颗粒的“电双层”结构可由如下表达式表达:
κ − 1 = ε 0 ε r k B T 2 e 2 I \kappa^{-1}=\sqrt{\frac{\varepsilon_0\varepsilon_rk_BT}{2e^2I}} κ1=2e2Iε0εrkBT
其中 ε 0 ε r \varepsilon_0\varepsilon_r ε0εr为溶剂的介电常数, k B k_B kB是玻尔兹曼常数, T T T是绝对温度, e e e是基本电荷, I I I是以量纲 m − 3 m^{-3} m3为单位的离子浓度。颜色颗粒的电泳迁移率和其移动速度由如下表达式表述:

μ e = 2 ε 0 ε r ζ 3 η f 1 ( κ a ) \mu_e=\frac{{2\varepsilon}_0\varepsilon_r\zeta}{3\eta}f_1\left(\kappa a\right) μe=3η2ε0εrζf1(κa)
v ⃗ = μ e E ⃗ \vec{v}=\mu_e\vec{E} v =μeE
其中 a a a为粒子半径, ζ \zeta ζ为粒子的Zeta电势, η \eta η是溶液的黏度系数, f 1 ( k a ) f_1\left(ka\right) f1(ka)是一个在1至1.5之间变化的系数,相关的知识及资料均可以在谷歌学术或者专业书籍中找到,这里不再赘述。

二、粒子运动仿真模型

我是用 Python 构建透明电子纸的粒子运动模型,原因是 Python 代码编写自由度大,并且社区里有很多的开源代码及拓展包。同时,用 Python 进行仿真计算所占用的资源少,计算速度快(相对于某些专业多物理场仿真软件而言)。当然,用 Python 建模仿真对使用者的代码能力要求较高,并且还要对电子纸的物理模型有深入了解。那么,接下来本文将详细介绍使用 Python 构建电子纸粒子运动模型的思路及步骤。

1. 导入Python库

导入的Python库大致如下:

import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
from matplotlib import animation
from mpl_toolkits.mplot3d.art3d import Poly3DCollection
from parameters import *
import matplotlib.pylab as py
from mpl_toolkits.mplot3d import Axes3D
import time

当然,后续如果有其他的需求,如:图形化界面设计、神经网络搭建等,也可以导入相关的包。

2. 修改相关参数及输入仿真文件

在上一篇博客:“学习心得:使用 Comsol 5.6 with Matlab 构建自动仿真模型”中,我介绍了如何自动化批量生成大量电场仿真数据。在这一步骤,我们将这些电场仿真数据(csv格式)导入模型之中,相关代码如下:

df_1 = pd.read_csv('15um方块空间电场0321.csv')
df_2 = pd.read_csv('15um方块空间电场电场翻转.csv')
df = df_1

对 csv 文件中的 x,y,z 电场模分量进行检索:

        self.idx = np.argmin((df[['x', 'y', 'z']] - [x0, y0, z0]).pow(2).sum(1))
        self.E_x = df.loc[self.idx, 'es.Ex (V/m)']
        self.E_y = df.loc[self.idx, 'es.Ey (V/m)']
        self.E_z = df.loc[self.idx, 'es.Ez (V/m)']

同时,下列代码中列举了典型的电子纸墨水的器件材料参数,后续所有的粒子运动计算都将基于这里给出的参数而开展。使用者可以根据自己的需求修改其中的参数。相关参数如下:

import pandas as pd
import numpy as np

# Parameters (All SI units)
# =============================================================================
k_B = 1.38e-23  # Boltzmann constant
T = 300  # Temperature (K)
epsilon_0 = 8.854187817e-12  # 真空介电常数F/m
epsilon_r = 2.01  # 溶剂介电常数
e = 1.6e-19
k_electricity = 9.0e9
I = 0.41153e18  # 分散液电荷浓度
g = 9.8  # m/s2

eta = 1.4e-3  # Dynamic viscosity of water (PaS)
rou_m = 750  # 溶剂密度 kg/m3

# 电泳粒子参数:
a = 400e-9  # 粒子直径
zeta_p = -60e-3  # 白粒子zeta 电位
rou_p = 1120  # 粒子密度 kg/m3
m_p = 4 / 3 * np.pi * (a / 2) ** 3 * rou_p

# 带电反胶束CIMs参数:
a_c = 10e-9  # 粒子直径
q_c = e
zeta_c = q_c / (6 * np.pi * a_c / 2 * epsilon_0 * epsilon_r)

# 非极性溶剂粒子带电量公式
q = 6 * np.pi * epsilon_0 * epsilon_r * a/2 * zeta_p

k = np.sqrt((2 * e ** 2 * I) / (epsilon_0 * epsilon_r * k_B * T))
debye_length = 1/k
print(f'德拜长度为:{debye_length}')

fH_ka = 1/(3*(1+2.5/k*a*(1+2*np.exp(-k*a))))
print(f'亨利修正系数为:{fH_ka}')

mu_e = ((2 * epsilon_0 * epsilon_r * zeta_p)/(3 * eta)) * fH_ka
print(f'电泳迁移率为:{mu_e}')

rho = 1055  # density of polystyrene beads in kg/m3

3. 粒子三维运动速度计算

在透明电子纸的像素单元中,颜色颗粒的运动是沿各个方向的(三维方向),因此需要对粒子的三维方向的运动速度进行分别计算,计算基于了 Debye–Hückel 电泳迁移公式。如下是相关的计算代码:

 # Debye–Hückel迁移率公式,v_x,v_y,v_z的 随着当前坐标的空间电场分量进行变化,
        self.v_x = -self.E_x * (2 * epsilon_0 * epsilon_r * zeta_p * (
                1 + np.sqrt((2 * e ** 2 * I) / (epsilon_0 * epsilon_r * k_B * T)) * a)) / (3 * eta)
        self.v_y = -self.E_y * (2 * epsilon_0 * epsilon_r * zeta_p * (
                1 + np.sqrt((2 * e ** 2 * I) / (epsilon_0 * epsilon_r * k_B * T)) * a)) / (3 * eta)
        self.v_z = -self.E_z * (2 * epsilon_0 * epsilon_r * zeta_p * (
                1 + np.sqrt((2 * e ** 2 * I) / (epsilon_0 * epsilon_r * k_B * T)) * a)) / (3 * eta)

然后,再根据以上计算结果对每颗粒子的空间位置进行更新:

        self.x += self.v_x * dt
        self.y += self.v_y * dt
        self.z += self.v_z * dt

4. 其它物理模块的添加

以上三个步骤仅仅是满足了基本的粒子运动的仿真,但是这样离符合真实情况的粒子运动仿真模型还相距甚远。差距主要在于:

  1. 颜色粒子运动至靠近电极界面的时候,会受到来自其它带电物质的“电场屏蔽”作用;
  2. 当粒子数量众多(紧密堆积)时,粒子与粒子间会存在库伦排斥等作用,影响粒子的运动轨迹;
  3. 颜色粒子的粒径大小不一,其运动速度及运动轨迹也有差别;
  4. 电子墨水中的其它带电物质的影响;

本文根据上述第2点,添加了一个粒子间距离判定的模块,其基本思路就是强行让各个粒子间距离保持在两者半径之和之外,倘若发生距离小于两者半径之和,则发生粘弹性碰撞反弹。相关代码演示如下:

    # # 增加电泳粒子间的碰撞检测,0.9为碰撞衰减系数
    def collision_detect(self, other):
        for other in particles:
            if other is not self:
                distance = np.sqrt((self.x - other.x) ** 2 +
                                   (self.y - other.y) ** 2 +
                                   (self.z - other.z) ** 2)

                if distance < (self.r + other.r) * 1:
                    overlap_distance = (other.r + self.r) * 2
                    overlap_direction_x = (other.x - self.x) / distance
                    overlap_direction_y = (other.y - self.y) / distance
                    overlap_direction_z = (other.z - self.z) / distance
                    self.v_x, other.v_x = -self.v_x * 0.9, -other.v_x * 0.9
                    self.v_y, other.v_y = -self.v_y * 0.9, -other.v_y * 0.9
                    self.v_z, other.v_z = -self.v_z * 0.9, -other.v_z * 0.9
                    other.x += overlap_distance * overlap_direction_x
                    other.y += overlap_distance * overlap_direction_y
                    other.z += overlap_distance * overlap_direction_z

以上仅做了一个复杂物理模块的展示,针对上述其余几点的物理现象,使用者可以根据自己的需求进行修改。

5. 粒子运动轨迹动画展示

下列代码展示了使用 python 自带的动画模块 animation 绘制粒子的运动轨迹。使用者亦可根据自己的需求,调整绘图框的格式以及动画的相应参数。

def animate(t):
    ax.clear()
    ax.set_xlim(0, 100e-6)
    ax.set_ylim(0, 100e-6)
    ax.set_zlim(0, 40e-6)
    ax.ticklabel_format(style='sci', axis='both', scilimits=(0, 0))

    for p in particles:
        p.move_p(0.005)  # 更新时间
        for i in range(len(particles)):
            particles[i].move_p(dt)

            for j in range(i + 1, len(particles)):
                particles[i].collision_detect(particles[j])
        ax.scatter(p.x, p.y, p.z, s=100, c='r', marker='o')
         # 时间步长显示
    time_string = ax.text(0.2e-3, 0.5e-3, 0.4e-3, f'Time = {t * 0.005}s', size=20, transform=ax.transAxes)

    # 电极图形:顺时针的四个顶点
    verts = [
        [0.0425e-3, 0.0425e-3, 0.000],
        [0.0425e-3, 0.0575e-3, 0.000],
        [0.0575e-3, 0.0575e-3, 0.000],
        [0.0575e-3, 0.0425e-3, 0.000]]

    collection = Poly3DCollection([verts], alpha=.25)
    collection.set_facecolor('#9400D3')
    ax.add_collection(collection)

    return ax, time_string
ni = animation.FuncAnimation(fig, animate, frames=100)  # 动画总共有100帧

# ani.save('15um方块电极.gif', writer='Pillow', dpi=100)  # 默认和代码存在一个路径下
plt.show()

6. 粒子运动仿真结果展示

最后,经过以上步骤,我们得到了透明电子纸三维的粒子运动仿真结果,粒子运动仿真示意图如下图所示:
在这里插入图片描述
通过对上述仿真模型的绘图和动画部分进行稍许修改,在输入合适的参数以及电场仿真文件后,我们便可以得到一组粒子运动轨迹仿真的可视化动图,以及其相对应的结果(如:粒子运动响应时间、粒子三维坐标值等)。根据这些仿真结果,我们可以判定不同的器件结构、墨水参数、驱动波形对粒子运动行为的影响关系。下图展示了一组粒子运动仿真的三视图动画:
在这里插入图片描述


总结

以上就是关于透明电子纸的粒子运动仿真模型的全部介绍。本模型由 Python 代码编写,粒子的运动计算基于 Debye–Hückel 电泳迁移理论,空间电场需要由 Comsol with matlab 导出。使用者可以根据自己的需求,灵活修改其中电子墨水的材料参数,及仿真结果的判定标准,同时也可以根据自己审美,修改动画绘图的格式,以适应不同的需求。

该粒子运动仿真模型不仅可以模拟电泳粒子的运动轨迹,还可以计算电子纸器件的响应时间、粒子聚集情况、粒子三维坐标等,为电子纸显示屏的设计制造提供一定的参考依据。同时也可为研究电泳、电渗流等物理现象提供一定的仿真基础。

最后,如果对电泳理论以及胶体界面理论的研究足够深入后,粒子运动仿真模型可以较好地模拟真实的粒子运动情况,或许可以考虑搭配 Comsol with Matlab 进行大批量自动化的建模仿真,构建庞大且较为准确AI训练数据集!

  • 42
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值