仔细阅读 Thingiverse,我发现了 liteul 的电子蚀刻草图。它使用电位器进行 X 和 Y 绘图控制。虽然草图可能还可以,但它们不能像旋转编码器那样提供精确的定位。所以在这个版本中,我决定用旋转编码器替换电位器。因为旋转编码器还包含按钮开关,这意味着我可以添加更多功能。
任何形式的机械开关的问题是触点在接触或断开时会“弹跳”。这被称为噪声。通常所有开关都有某种形式,旋转编码器,作为一对开关,也不例外。
处理反弹的一种方法是通过软件通过 debounce 例程。当您检测到开关状态更改时,您等待大约 10mS 并再次测试开关的状态。如果它们不匹配,则原始状态是由接触弹跳引起的。
硬件去抖使用 RC(电阻-电容)网络来抑制触点弹跳。选择电阻器和电容器值以产生 10mS 延迟。通过向 RC 网络添加施密特触发器,结果将是准确和精确的状态变化。
我设计了一个简单的电路板,其中包含电子元件、旋转编码器和用于清除绘图画布的触觉开关。如果您希望将板商业化或像我一样做并自己制作,Eagle 文件已包含在内。我使用了碳粉方法。
PCB 通过旋转编码器固定在顶部。我必须在旋转编码器和顶部之间使用几个垫圈,以便按钮有足够的空间。
SCLK to D13
DIN to D12
DC to D11
CS to D9
RST to D10
LIGHT to A0 via a 220 ohm resistor
Left encoder A pin to D3
Left encoder B pin to D2
Left encoder Switch pin to D4
Right encoder A pin to D8
Right encoder B pin to D7
Right encoder Switch pin to D6
Reset switch to D5
Positive battery terminal to RAW
Negative battery terminal to GND via ON/OFF switch
该代码使用来自Rinky-Dink Electronics的修改后的 LCD5110_Graphic 库。我添加了一个额外的屏幕缓冲区和几个函数来控制它。
void updateFromCanvas(); //Transfers canvas buffer to screen buffer
void setCanvasMode(bool on); //On - writes to screen buffer also written to canvas
The
旋转编码器和开关都是使用引脚更改中断驱动的。以下变量由中断处理程序自动更新:
int horzPosition;
int vertPosition;
bool leftEncoderPressed;
bool rightEncoderPressed;
bool switchPressed;
因为中断处理程序可以随时更新这些变量,所以任何使用这些变量的非中断处理程序代码都需要在处理它们时禁用中断。请注意,delay() 函数依赖于中断,如果在您调用它时禁用中断,则会阻塞。
Etch-A-Sketch 有 4 种绘图模式,通过按下左旋钮设置:
绘图模式
在绘图模式下,左旋钮左右移动光标,右旋钮上下移动光标。通过按下右侧旋钮,您可以在 PEN DOWN、PEN UP 或 ERASE 笔模式之间循环。
线模式
在线条模式下,左右旋钮将分别左右和上下移动光标,并在起始位置和当前光标位置之间画一条闪烁的线。按下右键将永久锁定线路并开始新线路。您可以通过更改绘图模式退出当前行。
矩形模式
在矩形模式下,左右旋钮将分别左右和上下移动光标,并在起始位置和当前光标位置之间绘制一个闪烁的矩形。按下右键将永久锁定矩形并返回到 DRAW 模式。
圆模式
在圆形模式下,左右旋钮将分别向左/向右和向上/向下移动光标,并以起始位置为中心绘制一个闪烁的圆形,以当前光标位置为半径。按下右侧按钮将永久锁定圆圈并返回到 DRAW 模式。注意:诺基亚 5110 LCD 没有 1:1 的像素宽/高比。圆不会是圆的。
中心按钮
中心按钮将清除画布。
有大量的闪存和 RAM 来扩展代码。这个项目很好地转移了疫情期间居家隔离的无聊。
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
全部0条评论
快来发表一下你的评论吧 !