硬核!用Arduino打造纯机械装置模拟数字时钟
本文转载自程序员极客实验室
本项目是一个真正意义上的「机械时钟」,由 3D 打印部件、25 个 Arduino Nano 和 48 个步进电机构建。每个时钟面都是用 Eagle 设计的 PCB。
时钟的灵感来自几年前我在波士顿一家商店里看到的时钟,叫 ClockClock 24,成本约为 6000 美元,非常漂亮。
完成这个项目,将学习到 3D 打印、Arduino 编程、原理图和 PCB 设计、机械方面的技能,还有一定的调试技巧。
材料和成本
完整的材料清单文件(ClockPartsList.xlsx)在文末的项目文件库中可以下载。
工具清单
3D 打印机
烙铁
螺丝刀
剪线钳和压线钳
粘胶
费用大约是 500 美元。也可以通过采购更便宜的零件来降低成本。电子表格中的描述是可单击的链接。如果链接失效,可以在 google 中搜索链接中的单词。
3D 打印
整个项目的打印使用 PLA 材料,所用的 3D 打印机是 Creality Ender 3 Pro。利用 Cura 的免费版本切成薄片。
大约花费了 1 个月的时间打印。其中,每个时钟模块底板大约需要 9 个小时的打印时间。如果每天打印 2 张,需要 12 天,如果使用两台 3D 打印机,速度会更快。
所有零件均在标准温度下以 20% 的填充率进行打印。
这个项目上有很多关于 3D 打印的知识:
机床需要每隔几天调平一次。否则,零件将从机床上抬起或损坏。
喷嘴需要隔一段时间清洗一次。否则,打印件将变得很薄。
PLA 线轴需要保持紧绷,以使打印时的长丝不会束缚和卡住。
3D 打印部件清单(Clock 3D Printed Parts List.xlsx)和打印所需的 STL 文件(stls.zip),在文末的项目文件库中可以下载。
原理图和 PCB 文件
原理图是用 Autodesk 的 Eagle 绘制的。
需要注意的是,最初使用的是光电模块而不是磁检测器模块,这就是在原理图和电路板上都能看到光电模块的原因。
每个磁性霍尔效应传感器都连接到 PCB 板上的 5V,Gnd 和 模拟引脚(O_0 或 O_1)。
更多信息参见组装详情。
原理图文件(analog_clock_rev2.sch),在文末的项目文件库中可以下载。
该项目需要 25 个 PCB 板。此处所附的 Gerber 文件,可以在任何 PCB 厂制造电路板。要打开压缩成 .gz 的文件,推荐 7Zip 解压缩程序。
原理图文件(H2W-312555_Analog_clock_Rev2.zip.gz),在文末的项目文件库中可以下载。
Arduino 编程
项目的 Arduino 文件有两个:主控文件和从属设备文件。
主控代码仅使用一次,控制所有从属设备。从属设备代码使用 24 次。
RTC(实时时钟)库 .zip 文件也包含在 .gz 文件中。通过执行以下操作,可以将 .zip 文件添加到 Arduino IDE:
sketch -> include library -> add .zip library.
要对 Arduino 进行编程,请选择:
tools -> Boards: Arduino Nano
tools -> Processor Atmega328 (旧的引导程序)
tools -> port (选择端口)
代码文件(HartClock_Arduino_Code.zip.gz),在文末的项目文件库中可以下载。
Arduino SW 介绍
主控的 Arduino 将 I2C 串行命令发送到位于每个时钟面后面的 24 个从属 Arduino。从属 Arduino 将 I2C 命令解码为时钟运动。
主机到从机可能的 Arduino I2C 命令:
0= IDLE, 1= Calibrate, 2= Arm_go_clockwise, 3= Arm_go_counter_clockwise
(0 = 空闲,1 = 校准,2 = 顺时针旋转,3 = 逆时针旋转)
如图所示,时钟有 8 个可能的位置。
重置后,主机将向每个 Arduino 发送一个校准命令,使其到达与时钟位置 8 相对应的原始位置。每个时钟后面的齿轮中都有归位磁铁,还有一个霍尔效应传感器,用于检测磁铁是否归位。
PCB 焊接
PCB 板中有 24 个需要焊接,必要时可求助朋友:)
切记要从电动机随附的小型驱动板的插座中拔出 ULN2003 驱动器 IC。
将每个元件插入电路板,并稍微弯曲引脚,以免它们掉落,将元件引脚焊接到板上。
注意:每块板上焊接有 6 条跳线。此处未使用图片中显示的绿色 4 针端子,直接焊接了板间线路,这样压降较低且更可靠。
设置拨码开关
每个 PCB 板上都有一个拨码开关。将每个时钟的拨码开关设置为图片中所示的值,以便主控器可以分别寻址每个从属时钟模块。
组装 PCB 主板
Arduino 主板包含 Real Time Clock(RTC)板和 Arduino nano。每当主 Arduino 通过其 USB 进行编程时,RTC 就会使用当前计算机时间进行编程,并将时间数据通过 RTC 电池保存起来。
可以将 RTC 板热粘合或用双面胶带粘贴到主 PCB 上。焊接连接使其牢固。
使用 3D 打印支架将主板固定在时钟上。
将 RTC Vcc 连接到板上的 +5 引脚。
将 RTC Gnd,SCL 和 SDA 连接到 PCB 板上的相应名称。
在 RTC 板 Vcc 和 SDA 之间的 I2C 上焊接 1 个 1.3k(或接近值)的上拉电阻。
在 RTC 板 Vcc 和 SCL 之间的 I2C 上焊接 1 个 1.3k(或接近值)的上拉电阻。
用 4 根导线焊接 +6V、Gnd、SDA 和 SCL,预留长度大约为 6 英寸,以便将来与其他电路板连接。
用 10 英寸长导线对焊接 D2 引脚和地,通过按钮增加时间。
用 10 英寸长导线对焊接 D3 引脚和地,通过按钮减少时间。
注意:在关闭电源之前,应从主 Arduino Nano 上拔下 USB 线。这是一条潜在电流路径,在电源关闭时其他 Arduino 会尝试用 USB 电源供电,主机上的微型 7805 稳压器可能会烧坏。如果发生这种情况,请购买功率更大的 7805 稳压器并将其焊接到主板上。这里需执行此操作。
时钟模块组装
通过使用霍尔效应传感器模块(连接到 5V 电源或小型电池组)进行测试,确定磁体朝上。这里使用了 4.5V 电池组供电。方向正确时,指示灯应变为绿色。
用 Cyanoacrylate Krazy 粘胶将磁铁粘上。
如图所示,组装时钟。
将 4 根钩形导线切成约 6 英寸长。将导线两端剥开约 1/4 英寸,并将它们绞合在一起。将它们焊接到 PCB 的 +6V、Gnd、SDA、SCL 点的一侧。安装数字时,它们将用于焊接到相邻的时钟。
单个时钟 Arduino 代码测试
建议在组建每个时钟模块后对其进行测试。为此,请确保时钟模块已完全组装好,并且(临时)将拨码开关设置为大于 23 的值。这将在通电后强制 Arduino 从代码运行校准。视频仅供参考,这样可以检查时钟的运动是否良好和磁铁是否正确归位。USB 电源能够为该测试的两个电动机供电,因此不需要电源连接。
插入 USB 线并加载从 Arduino 代码。应该会看到它在每个臂上都进行了校准。每个臂校准后,将臂移动到顶部的 8 点钟位置。按下 Arduino Nano 上的 Reset(重置)按钮几次,以确保它可以正常工作。
完成操作后,请不要忘记将拨码开关设置为正确的值(0 到 23)。在时钟背面的沙皮纸上写下时钟编号,以便于组装。
电源连接
如图,电源设备需要用连接器压接并连接到电源和供电线上,为此使用了延长线。将电压调节到 7.5V,并在调节旋钮上缠上胶带,以免被意外转动。
直流电压线将通过开关连接到主板。
此处每个 28BYJ48 步进电机均由 7.5V 电压驱动。绕组分别为 70 欧姆。
因此,通过每个绕组的电流为 7.5V/70 欧姆 = 107mA
每个步进电机主动驱动时有 2 个绕组。因此,每个电机 2 * 107mA = 214mA
如果所有 48 台电动机都在运动,则为 48 * 214mA = 10.2Amps。
那是相当大的电流,这里显示的 10Amp 电源可以提供该电流。
仅供参考,当电动机未处于主动驱动状态时,Arduino 代码会关闭绕组,因此在电动机不运动时不会向电动机施加电流。且 Arduino Nano 和霍尔效应传感器使用的电流很小。
单个时钟数字 Arduino 主控代码测试
测试由 6 个时钟模块组成的数字。
在每个结点使用 2 个侧面连接器件并用螺丝拧紧,将 6 个时钟模块组装成一个数字。
此处称为 debug_master_counter.ino 的 Arduino 代码已加载到主 PCB 中。到现在为止,所有从时钟模块均应已加载 Analog_clock_slave.ino。
拨码开关应设置为:(0 至 5)或(6 至 11)或(12 至 17)或(18 至 23)
可以一次建立一个数字,对其进行测试并通过焊接将 6 个时钟连接起来。
暂时将这 4 个主模块导线焊接到该时钟的 +6V、Gnd、SDA、SCL空点进行测试。
确保主模块已连接电源(暂时不带开关)并设置为 7.5V。由于没有连接器,暂时将其焊接以进行此测试。
主模块上电并初始化所有 6 个时钟。如果尚未将手臂移到顶部(8 点钟位置),则需要将它们移到顶部。然后,它将发送指令显示从 0 到 9 的递增计数,如图所示。
测试完所有数字后,请使用正确的 master_clock_slave.ino 加载主 PCB Arduino。
测试用的代码文件(debug_master_counter.ino),在文末的项目文件库中可以下载。
安装全部时钟数字
组装完所有模块后,就可以开始使用连接器链接组装完整的时钟。每段连接需要 2 个连接器链节,然后将螺丝插入链节的每一侧,把部件固定在一起,如图操作。
时钟放在一起后,焊接每个模块之间的导线。最初,在每块板上都有绿色螺丝端子,但后来切换为焊接连接,因为螺丝端子在每个螺丝处引入电阻,导致 6V 线路和地上的电压下降。
请注意,如果不连接框架,则完整的 3×8 大时钟不稳定。
安装边框
添加框架,框架增加了支撑,让时钟整体将变稳定。
有 4 种框架。2 种角件和 2 种边件。尝试时,要看它们的适合程度。
给长框架打孔。组装框架时,将 3 个开关安装在钻出的孔中。将时钟放置在底部框架的中心。
如图所示组装框架。
下面固定 Arduino PCB 主板。
将主 Arduino PCB 固定(粘)在 master_support 支架上,然后如图所示,在中心找到一个合适的位置。拧入 2 个螺钉固定它。
主控的反向选项
Arduino 主代码具有反转时钟方向的功能。某些 28BYJ-48 步进电机的运行方向是反向的。那么可以在代码中控制它。如图,在 Arduino 主代码中设置 appropriate bits = 1 就好了。
调试和维修
推荐步骤:
1)组建并测试 24 个时钟模块(一个一个测)。
2)用 6 个时钟模块建立一个数字,并使用特殊的测试主控代码进行测试。
3)组建时钟整体,并使用正确主控代码对其进行测试。
如果主控时钟有问题,请检查接线,并确保时钟模块之间的焊接正确。确保电线从 clk0 到 clk23 贯穿整个时钟。
如果遇到通信问题,请确保主机上有 I2C 上拉电阻。可使用示波器检查 I2C 信号是否正常。
常见问题
1)为什么不用一个微控制器,并使用多路复用器在每个时钟之间切换?
组建这东西时,总要做出工程复杂度上的权衡。可以将单个微控制器与多路复用器配合使用,但一次只能移动一个时钟。实际上有一个这样的想法,使用伺服器并一次移动一个模拟时钟面。也可以用具有许多 IO 的 FPGA(现场可编程门阵列)来代替许多从属控制器,但这会贵得多,且需要额外技能。
2)为什么不用某种步进芯片替代 24 个从机的 Arduino Nano 呢?
Arduino nano 的价格在 2 美元。作为从机,每个都对 2 个电机执行步进控制,并且读取每个电机齿轮的霍尔效应模拟信号以进行校准。很难找到价格便宜的芯片来完成这两个功能。
3)为什么不使用霍尔效应传感器芯片,而使用 $1.50 的霍尔效应传感器模块?
单个霍尔效应传感器芯片更便宜,但它们需要添加一个电阻,因此每个霍尔效应传感器都必须放在 PCB 上。这需要另外的 3D 打印部件,并将 3 条导线焊接到小型设备的每个引脚上。而只安装 1 个螺钉的霍尔效应模块 PCB 板,使组装变得更加容易。
4)为什么用那么多 Arduino 而不用一个芯片?
将需要一个具有以下功能的 Arduino(或FPGA)芯片:
48 个电机 4 个步进信号 + 48 个电机 2 个用于校准的霍尔效应传感器 = 288 pin。Arduino 做不到,FPGA 可以。
5)在主控 Arduino 上增加 3 端稳压器的目的是什么?
3 端稳压器是添加到主控制器中的 7805 稳压器,当主控 Arduino 连接到其他电路板,关闭电源时,会烧。关闭电源之前,应先从主机上拔下 USB。
6)如果 RTC 模块的时间出现误差,如何调整?
可以使用按钮开关调整时区的小时数。要更改 RTC 芯片上的时钟时间,需要对 Arduino 主程序进行重新编程。
可以将代码修改为允许通过蓝牙无线访问主机和调整 RTC。
这个项目耗时三年,现在可以享受成果了。
硬核!用Arduino打造纯机械装置模拟数字时钟相关推荐
- 硬核:科学家打造全套人工神经系统,让瘫痪病人重新控制身体
来源[IT之家]来源:智东西 作者:信仪 责编:姜戈 地址链接 1 月 29 日消息,据外媒 IEEE Spectrum 报道,美国一组神经科学家和工程师研发了一套人造神经系统,能让瘫痪的人重新控制自 ...
- C语言/C++程序员大神打造纯C的电子时钟(加图形库+源码)
C语言/C++程序员大神打造纯C的电子时钟,每天看时间再也不麻烦了 C和C++的区别: C是一个结构化语言,它的重点在于算法和数据结构.C程序的设计首要考虑的是如何通过一个过程,对输入(或环境条件)进 ...
- 模拟数字时钟走字60次
任务描述 本关任务:本题中已给出一个时钟类的定义,请模拟数字时钟走字过程. 相关知识 为了完成本关任务,你需要掌握:1.类和对象. 编程要求 根据提示,在右侧编辑器补充代码,模拟数字时钟走字,只需输出 ...
- 模拟数字时钟,python代码
这是一个使用 Python 创建模拟数字时钟的示例代码: importtime import oswhile True:# 获取当前时间current_time = time.strftime(&qu ...
- Arduino实战小项目: 数字时钟制作
前言: 通过5641AS四位数码管,了解控制方法,顺带记录一下arduino线程的使用方法,并制作一个简单的数字时钟 效果如下: 目录 前言: 主要材料:
- 01.纯CSS实现数字时钟
效果 源码 <!doctype html> <html><head><meta charset="utf-8"><title& ...
- 这只机械手太硬核!失去手指的机械工程师独立打造,网友:赛博朋克,太酷了...
鱼羊 萧箫 发自 凹非寺 量子位 报道 | 公众号 QbitAI 这只硬核机械手火了. 能稳稳抓握,也能伸张自如: 是不是有点金刚狼内味了? 更令网友们惊叹的是,这样一只机械手,是一位失去左手四指的机 ...
- 硬核机械手!失去手指的机械工程师独立打造
鱼羊 萧箫 发自 凹非寺 量子位 报道 | 公众号 QbitAI 这只硬核机械手火了. 能稳稳抓握,也能伸张自如: 是不是有点金刚狼内味了? 更令网友们惊叹的是,这样一只机械手,是一位失去左手四指的机 ...
- Petal Maps的美学钥匙,解锁AITO问界M5的硬核浪漫
从羊皮卷到互联网地图,自古以来,地图对空间的演绎,也是人类不断理解事物.环境和社会的一扇窗口.随着世界进入虚实交融的数字时代和人们生活习惯的变化,地图已经不再仅仅作为导航工具而存在,还被注入了许多新的 ...
最新文章
- [安卓基础] 006.打开另一个Activity
- 【企业管理】组织与管理的思考
- 在python中给自己介绍对象笔记--OO面向对象
- jquery表单验证源码
- amd核芯显卡控制面板自定义分辨率_主流显卡的一位猛将:蓝宝石Radeon RX 5500XT显卡首测...
- 对广义表L=((a,b),(c,d),(e,f))执行操作tail(tail(L))的结果是 ()
- TCP流式套接字的异步事件WSAAsyncSelect编程
- Lamda和kappa架构
- Anaconda python安装使用
- 传统的6d位姿估计fangfa1_基于视觉的机器人抓取从物体定位、位姿估计到抓取位姿估计 | 公开课预告...
- 有限域:基本性质和特征
- redis 集群 set key报错CLUSTERDOWN Hash slot not served
- RTD-Net:Relaxed Transformer Decoders for Direct Action Proposal Generation 论文阅读笔记
- echarts树形结构实现组织架构图
- android天气api接口,[Android] 免费天气预报接口
- 笔记01-如何创建一个vue3的项目
- 潮汕古韵之都,这次目的地——潮州
- sql中以sa命名的用户名无法使用,错误码1845
- MySQL数据库的进销存
- Spring Security应用详解(集成SpringBoot)