电子纸在pcDuino上的使用

2024-03-11 20:20
文章标签 使用 电子 pcduino

本文主要是介绍电子纸在pcDuino上的使用,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

电子纸是近些年兴起的一种传统纸质图书的替代品,实现电子纸技术的途径主要包括有胆固醇液晶显示技术、电泳显示技术( EPD )以及电润湿显示技术等。支持电子纸显示的是点只墨水,电子墨水其实是一种新型材料,它是化学、物理学和电子学多学科发展的产物,这种材料可被印刷到任何材料的表面来显示文字或图像信息。由于电子墨水是一种液态材料,所以被形象地称为电子墨“水”。

这次实验是演示通过pcDuino驱动电子纸模块显示pcDuinologo图片和图片转换二进制代码的软件Image2Lcd的使用讲解。

效果图:

一:器件清单

1、pcDuino 一套

2、电子纸模块 一个

3、3.3V电源模块一个

由于电子纸模块页面刷新时功耗较高,pcDuino无法为其提供显示时的功耗,所以需要为电子纸外接3.3V电源,需要注意的是将pcDuino和外接电源共地。
二:电路连接
在此使用的是Arduino上的3.3V为电子纸模块供电,电路连线图如下:


三:代码

#include ”core.h”//pcDuino包含的核心头文件
#include ”ls.h”//包含待显示的图片
#define STATUS_PIN 9//定义电子纸的状态引脚
#define CS_PIN 10//定义电子纸的片选引脚
#define MISO_PIN 11//主输入从输出引脚
#define MOSI_PIN 12//主输出从输入引脚
#define SCK_PIN 13//定义时钟引脚
#define FRAME_END_LEN 11//定义刷新次数(我使用的理想值为11,可自行修改)
unsigned char SoftSpiTransfer(unsigned char data)//模拟SPI时序
{
unsigned char cnt;
unsigned char rst;
rst = 0;
for(cnt = 0;cnt < 8 ;cnt ++)
{
rst <<= 1;
if(data & 0×80)
digitalWrite(MOSI_PIN,HIGH);
else
digitalWrite(MOSI_PIN,LOW);
digitalWrite(SCK_PIN,HIGH);
digitalWrite(SCK_PIN,LOW);
rst |=  digitalRead(MISO_PIN);
data <<= 1;
}
return rst;
}
void ClearScring(void)//清屏函数
{
bool DeviceStatus;//定义一个状态量  
DeviceStatus = digitalRead(STATUS_PIN);
digitalWrite(CS_PIN,LOW);
SoftSpiTransfer(3);
while(digitalRead(STATUS_PIN) == DeviceStatus)
{
asm(“nop”);//嵌入汇编的延时指令,下同
}
digitalWrite(CS_PIN,HIGH);
}
void SetImageWide(unsigned int wide)//设置图片宽度的函数
{
bool DeviceStatus;
DeviceStatus = digitalRead(STATUS_PIN);
digitalWrite(CS_PIN,LOW);
SoftSpiTransfer(1);
while(digitalRead(STATUS_PIN) == DeviceStatus)
{
asm(“nop”);
}
DeviceStatus = !DeviceStatus;
SoftSpiTransfer(wide >> 8);
while(digitalRead(STATUS_PIN) == DeviceStatus)
{
asm(“nop”);
}
DeviceStatus = !DeviceStatus;
SoftSpiTransfer(wide & 0xff);
while(digitalRead(STATUS_PIN) == DeviceStatus)
{
asm(“nop”);
}
digitalWrite(CS_PIN,HIGH);
}
void SetImageHigh(unsigned int high)//设置图片高度的函数
{
bool DeviceStatus;
DeviceStatus = digitalRead(STATUS_PIN);
digitalWrite(CS_PIN,LOW);
SoftSpiTransfer(2);
while(digitalRead(STATUS_PIN) == DeviceStatus)
{
asm(“nop”);
}
DeviceStatus = !DeviceStatus;
SoftSpiTransfer(high >> 8);
while(digitalRead(STATUS_PIN) == DeviceStatus)
{
asm(“nop”);
}
DeviceStatus = !DeviceStatus;
SoftSpiTransfer(high & 0xff);
while(digitalRead(STATUS_PIN) == DeviceStatus)
{
asm(“nop”);
}
digitalWrite(CS_PIN,HIGH);
}
void SendImage(const unsigned char * pic)//显示图片的函数
{
bool DeviceStatus;
unsigned char data;
unsigned char cnt0;
unsigned int cnt1;
unsigned long time;
DeviceStatus = digitalRead(STATUS_PIN);
digitalWrite(CS_PIN,LOW);
SoftSpiTransfer(4);
while(digitalRead(STATUS_PIN) == DeviceStatus)
{
asm(“nop”);
}
DeviceStatus = !DeviceStatus;
for(cnt0 = 0;cnt0 < FRAME_END_LEN; cnt0 ++)
{
Serial.println(“New Line”);
for(cnt1 = 0; cnt1 < 120000; cnt1 ++)
{
data = gImage[cnt1];
SoftSpiTransfer(data);
time = 0;
while(digitalRead(STATUS_PIN) == DeviceStatus)
{
asm(“nop”);
time ++;
if(time > 1000000)
{
Serial.println(“Error”);//超时串口提示错误
digitalWrite(CS_PIN,HIGH);
return;
}
}
DeviceStatus = !DeviceStatus;
}
}
digitalWrite(CS_PIN,HIGH);
}
void setup()
{
Serial.begin(9600);
pinMode(STATUS_PIN, INPUT);
pinMode(CS_PIN, OUTPUT);
pinMode(MOSI_PIN, OUTPUT);
pinMode(MISO_PIN, INPUT);
pinMode(SCK_PIN, OUTPUT);
digitalWrite(CS_PIN,HIGH);
digitalWrite(STATUS_PIN,HIGH);
digitalWrite(SCK_PIN,LOW);
}
void loop()
{
char cmd;
if(Serial.available())//如果串口接收到数据
{
cmd = Serial.parseInt();
switch(cmd)
{
case 1:
SetImageWide(600);
Serial.println(“Set Image Wide Complete !”);
break;
case 2:
SetImageHigh(800);
Serial.println(“Set Image High Complete !”);
break;
case 3:
Serial.println(“Start Clear Scring !”);
ClearScring();
Serial.println(“Clear Scring Complete !”);
break;
case 4:
Serial.println(“Start Send Image Data!”);
SendImage(gImage);
Serial.println(“Send Image Data Complete !”);
break;
default:
Serial.println(“Unknow instruction !”);
break;
}
}
}
      
四:软件使用方法

将图片转换为二进制的工具有很好,我就简单介绍下在windows下使用Image2Lcd软件。

下载Image2Lcd后打开如下应用程序:

进入主程序:

第一步:点击“打开”,选择图片;

第二步:点击“输出数据类型”选项卡,选择“C语言数组”,将图片保存为头文件ls.h用以输出;

第三步:点击“扫描模式”,选择水平扫描,因为本电子纸模块的扫描是从上往下从左往右依次显示的,及图中0->X换列Y->X的显示方向的;

第四步:点击“输出灰阶”选项卡选择4灰,这是由于使用的电子纸模块显示模式为四灰阶的;

第五步:最大宽度和最大高度输入800600并点击右侧三角保存默认;

第六步:勾选“自右至左扫描”,原因详见第三步;

第七步:点击保存按钮,输入***.h保存(***为你取的名字,这里需要和代码中一致,我的为ls.h

由于显示的800*600数据较多,pcDuino显示刷新的时间较长,所以需要耐心的等待。
五:总结

本次试验使用的电子纸是四灰阶的,所以每个像素点使用两位二进制数,显示屏的分辨率是800X600,所以有效的数据是800*600/4=120000,故ls.h里面的数据个数为120000个字节。

要显示其他的图片时修改代码里对应的参数和对应的头文件即可。

上述代码通过串口(波特率为9600)发送ASCII12,,34来控制电子纸的显示,首先需要设置图片显示的宽和高为800*600(指令12),然后清除屏幕(指令3),最后就是发送图片数据(指令4)。
六:附录

1、Ls.h头文件,文件为图片pcDuinologo

ls

2、Archlinux pcDuinologo

linksprite学习中心

这篇关于电子纸在pcDuino上的使用的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/798962

相关文章

Python使用Tenacity一行代码实现自动重试详解

《Python使用Tenacity一行代码实现自动重试详解》tenacity是一个专为Python设计的通用重试库,它的核心理念就是用简单、清晰的方式,为任何可能失败的操作添加重试能力,下面我们就来看... 目录一切始于一个简单的 API 调用Tenacity 入门:一行代码实现优雅重试精细控制:让重试按我

MySQL中EXISTS与IN用法使用与对比分析

《MySQL中EXISTS与IN用法使用与对比分析》在MySQL中,EXISTS和IN都用于子查询中根据另一个查询的结果来过滤主查询的记录,本文将基于工作原理、效率和应用场景进行全面对比... 目录一、基本用法详解1. IN 运算符2. EXISTS 运算符二、EXISTS 与 IN 的选择策略三、性能对比

使用Python构建智能BAT文件生成器的完美解决方案

《使用Python构建智能BAT文件生成器的完美解决方案》这篇文章主要为大家详细介绍了如何使用wxPython构建一个智能的BAT文件生成器,它不仅能够为Python脚本生成启动脚本,还提供了完整的文... 目录引言运行效果图项目背景与需求分析核心需求技术选型核心功能实现1. 数据库设计2. 界面布局设计3

使用IDEA部署Docker应用指南分享

《使用IDEA部署Docker应用指南分享》本文介绍了使用IDEA部署Docker应用的四步流程:创建Dockerfile、配置IDEADocker连接、设置运行调试环境、构建运行镜像,并强调需准备本... 目录一、创建 dockerfile 配置文件二、配置 IDEA 的 Docker 连接三、配置 Do

Android Paging 分页加载库使用实践

《AndroidPaging分页加载库使用实践》AndroidPaging库是Jetpack组件的一部分,它提供了一套完整的解决方案来处理大型数据集的分页加载,本文将深入探讨Paging库... 目录前言一、Paging 库概述二、Paging 3 核心组件1. PagingSource2. Pager3.

python使用try函数详解

《python使用try函数详解》Pythontry语句用于异常处理,支持捕获特定/多种异常、else/final子句确保资源释放,结合with语句自动清理,可自定义异常及嵌套结构,灵活应对错误场景... 目录try 函数的基本语法捕获特定异常捕获多个异常使用 else 子句使用 finally 子句捕获所

C++11右值引用与Lambda表达式的使用

《C++11右值引用与Lambda表达式的使用》C++11引入右值引用,实现移动语义提升性能,支持资源转移与完美转发;同时引入Lambda表达式,简化匿名函数定义,通过捕获列表和参数列表灵活处理变量... 目录C++11新特性右值引用和移动语义左值 / 右值常见的左值和右值移动语义移动构造函数移动复制运算符

Python对接支付宝支付之使用AliPay实现的详细操作指南

《Python对接支付宝支付之使用AliPay实现的详细操作指南》支付宝没有提供PythonSDK,但是强大的github就有提供python-alipay-sdk,封装里很多复杂操作,使用这个我们就... 目录一、引言二、准备工作2.1 支付宝开放平台入驻与应用创建2.2 密钥生成与配置2.3 安装ali

C#中lock关键字的使用小结

《C#中lock关键字的使用小结》在C#中,lock关键字用于确保当一个线程位于给定实例的代码块中时,其他线程无法访问同一实例的该代码块,下面就来介绍一下lock关键字的使用... 目录使用方式工作原理注意事项示例代码为什么不能lock值类型在C#中,lock关键字用于确保当一个线程位于给定实例的代码块中时

MySQL 强制使用特定索引的操作

《MySQL强制使用特定索引的操作》MySQL可通过FORCEINDEX、USEINDEX等语法强制查询使用特定索引,但优化器可能不采纳,需结合EXPLAIN分析执行计划,避免性能下降,注意版本差异... 目录1. 使用FORCE INDEX语法2. 使用USE INDEX语法3. 使用IGNORE IND