基于SD卡的基因(DNA)炫酷LED桌面灯

简介: 基于SD卡的基因(DNA)炫酷LED桌面灯

一、介绍

这款LED灯通过人类的完整基因组点亮房间。它从SD卡中缓慢读取DNA代码,并将基因碱基对显示为颜色,这些颜色沿着螺旋结构向上移动。四个碱基—A、T、G和C—分别以红色、紫色、绿色和蓝色表示。它有一个电源按钮,以及底座上的速度和亮度调节旋钮。对于螺旋结构,我尽力使比例尽可能接近实际的DNA。这是一个让人陷入沉思的有趣灯具。因为大约有三十亿个碱基对,所以需要很长时间才能完整地展示一遍。

实物图如下:

视频如下:

DNA LAMP

一个已知的问题

这款LED灯在最快速度下应该每2毫秒显示一个新的碱基对。但实际上,它的移动速度比这慢得多。最初,我将整个染色体存储在一个文本文件中。Arduino会读取该文件,然后移动到下一个染色体/文件。我注意到,随着时间的推移,它似乎变得越来越慢,确实如此。我怀疑这种减速的原因是,寻找下一个字母的代码不得不遍历所有之前的字母。当它在文件的开头时,这不会花费很长时间,但当下一个字母是几百万个字母之后时,找到它需要一秒钟。

解决办法

为了解决这个问题,我改变了方式,不再是将整个染色体存储在一个文本文件中,而是将染色体分割成许多文件(每个文件100万个字母)。不幸的是,这并没有真正解决慢速问题。接下来,我尝试重新配置,以便SD卡上一次只保存一个染色体。这样的想法是,Arduino会读取该染色体的文件,完成后,用户将SD卡上的染色体文件替换为下一个染色体的文件。这确实提高了速度。

最后,我意识到在读取完文件后让代码删除文件也是一种帮助。仍然有改进的空间。我相信我的代码可以改进,但SD卡的读取速度以及Arduino的速度也可能限制了性能。

我认为这个项目处于一个即将成为中级开发者的初学者水平。这里是指南…

二、支持目录

材料准备

  • LED灯(需要2串,每串11个LED灯(总共22个))
  • PLA材料 - 绿色、灰色和透明色
  • 2个电位计
  • 1个按钮
  • 可焊接的面包板
  • 导线
  • 5V电源线(我使用了一根USB电缆并将其切成两半,以便我可以焊接导线到面包板上)
  • Micro SD卡
  • Micro SD卡读取器
  • Adafruit ItsyBitsy 32u4 3V
  • 3-5个M3x6mm螺栓
  • 电源锁存材料
  • 1个2N3904晶体管
  • 1个FQP27P06 MOSFET
  • 2个二极管(我相当确定这是我使用的)
  • 2个100千欧姆电阻
  • 1个270欧姆电阻
  • 1个10千欧姆电阻
  • 1个13千欧姆电阻
  • 1个12千欧姆电阻

LED灯光文件(我使用的PLA颜色)

  • 1个DNA Lamp Bottom.stl(绿色)
  • 1个DNA Lamp Base.stl(绿色)
  • 22个DNA Lamp_crossbeam short.stl(透明色)
  • 2个DNA Lamp_pillar base.stl(灰色)
  • 2个DNA Lamp_pillar cap2.stl(灰色)
  • 20个DNA Lamp_pillar.stl(灰色)

以上.stl模型下载的文件可以私信我获取

当然除了以上材料以外你还需要准备胶水等一些常用的工具。

三、 打印部件和焊接

  1. 打印部件。如果我没记错的话,柱子需要支撑,接触构建板的地方需要一个边缘。
  2. 将Arduino、SD卡读取器、电源锁存器以及连接到面包板的导线焊接起来。照片显示了最终的样子。不要焊接输入电源线。我是基于这个制作的电源锁存器。电源锁存器是必需的,这样Arduino在关闭之前就可以将其在DNA中的位置保存到EEPROM中。
  3. 清理打印部件。

四、拼装打印的DNA散件

  1. 剪下一段包含11个LED的灯带(确保在第11和第12个LED之间的中间剪断电线,这样第11个LED上就有一段电线可以用来焊接)。
  2. 按照图片所示,将这些LED穿过10个柱子。每两个LED之间应该有一个柱子。
  3. 这串LED中的最后一个(在第一个螺旋柱的顶部)将连接到第二串的第一个LED(在那个柱子的底部),因此需要在第11个LED上焊接一条电线到数据线(白色线)。然后,这条线需要穿过所有的柱子,以便所有四根线(三个LED输入线+这个输出数据线)都从柱子底部伸出。这个输出数据线最终将被拉伸到基座的底部以连接到另一串LED,所以确保它足够长(见图片)。
  4. 为下一步做准备,剪下大约两打胶带来包裹柱子,以便在胶水干燥时将其固定在一起。
  5. 使用泡沫/膨胀大猩猩胶将所有十个柱子部件粘合在一起,确保LED从柱子之间的孔中突出,如图片所示。LED应该相对松散且自由。用胶带包裹接合处。尽量减少胶水粘在柱子外部的数量。
  6. 剪下另一段包含11个LED的灯带,并将它们穿过另外10个柱子。
  7. 用另一串柱子重复粘合过程。

五、组合DNA螺旋结构

  1. 将柱头帽和柱基座粘合到柱子上,确保将所有导线穿过基座部分的底部孔。对于每个“横档”,使用两个交叉梁部件,并将它们夹在一起,使得一个交叉梁部件在顶部,另一个在底部。这可能是一个紧密的配合,所以要做好心理准备。我使用透明大猩猩胶来粘合交叉梁。将一个交叉梁部件插入灯座部分的足迹中并粘合在那里。然后粘合两个柱子到基座上,确保将所有导线穿过基座的孔(如图)。然后在上面粘合另一个交叉梁,使其全部闭合在一起,第一个横档就完成了。
  2. 将两个交叉梁粘合到所有其他“横档”上。
  3. 对于接下来的步骤,面包板最终将安装在灯座部分,确保从螺旋顶部部分到面包板的导线足够长,以便顶部部分可以被移除并侧放以访问面包板(如图)。
  4. 将通往第一柱子起始端的LED数据线焊接到面包板上的Arduino的第5脚。
    将之前从第一柱子最后一个LED末端伸出的LED数据线焊接到第二柱子的第一个LED上。
  5. 将电源和地线焊接到两个LED柱子上。
  6. 在灯座部分安装电位计和按钮,并焊接它们与面包板之间的所有连接。我使用了一些热熔胶来帮助固定电位计,以便在旋转时不会转动。我还在基座上用记号笔标记了电位计。
  7. 使用M3x5螺栓将面包板安装到灯座底部。确保螺栓没有短路/连接面包板上的任何线路。我使用了一小块电工胶带作为临时的“垫圈”,将螺栓头与板子隔开。
  8. 将电源线穿过灯座底部侧面的孔,然后将其焊接到面包板上的正确位置。

六、执行DNA文件

由于DNA文件大小为3GB,我无法将它们附加到本指南中。以下是获取它们的步骤:

  1. 访问网站
  2. 滚动到页面底部,打开染色体1的RefSeq链接。
  3. 按照图片指示下载为FASTA文件。
  4. 对其他染色体重复上述步骤。
  5. FASTA文件包含了标题和N等不需要的内容。dna_processing.py 脚本可以去除所有这些内容,并创建只包含ATGC的文本文件。将所有文件和dna_processing.py文件移动到一个文件夹中。
  6. dna_processing.py中,将chromosome_number设置为1来处理第一个染色体并运行代码。
  7. 为每个染色体更改chromosome_number并重新运行代码。

我一开始没有理解的一件事是:'A’总是与’T’配对,'G’总是与’C’配对。因此,FASTA/文本文件中的所有字母只是每对的一半。例如,文件中的一个’A’意味着一个AT配对,这就是在螺旋的“横档”上显示的内容。

DNA执行文件可以私信我进行获取

七、程序烧录

DNA_Lamp_Clean.inofunctions.ino 构成了螺旋灯的主要程序。正如我之前所说,一个已知的问题是碱基对在螺旋中的移动速度没有我想象的那么快。理想情况下(在最快速度下),它们应该每2毫秒更新一次,但实际上(在SD卡上存放所有染色体文件的情况下),我测量的速度在80-500毫秒之间(有时候可能会更慢;我的测试并不全面)。让事情变快的一个方法是一次只在SD卡上放置单个染色体的文件,但这意味着当Arduino处理完这些文件后,你将不得不将下一个染色体的文件放到SD卡上。你可以通过在代码中更改 ONE_CHROM_AT_TIME 来配置(所有文件或仅单个染色体)。

在主程序中,每个文件播放完毕后都会有庆祝模式,因此我也附加了一个仅包含庆祝模式的程序。我是用ChatGPT生成这些模式的,这相当容易也很有趣。我只需坐下来,请求模式,然后看看它们看起来有多酷。如果你想修改主程序中的模式,这段代码很有帮助。或者你可能只想全程运行模式代码。

在所有内容都上传并工作后(确保也将上一步骤中生成的DNA文件放到micro SD卡上),使用2-4个M3螺栓将灯座和底部连接在一起。你可能需要用刀子将底部的孔稍微扩大一些。确保在两部分组合在一起时,没有任何导线被夹住,以及按钮和电位计上裸露的电气连接没有触碰/短路到面包板上的任何东西。

以上所涉及到的程序可以私信我进行获取

八、总结及成品展示

按下电源按钮可以打开灯具。要关闭它,按住电源按钮直到灯光停止移动。

最后,为灯具找个地方,坐下来,享受这场灯光秀。整个人类的基因组代码正在照亮你的房间。

希望你喜欢这个项目,并在构建过程中找到乐趣!如果你有任何问题或需要帮助,欢迎在评论区交流。

作者:Svan.

注意:本博文为不得在未经本人同意进行转载或者二次创作,违者必究!!!


目录
相关文章
|
1月前
|
监控 IDE 机器人
基于Nodemcu的手机控制小车
基于Nodemcu的手机控制小车
38 0
|
4月前
|
异构计算
FPGA新起点V1开发板(十)——按键控制LED
FPGA新起点V1开发板(十)——按键控制LED
FPGA新起点V1开发板(十)——按键控制LED
|
11月前
|
芯片
LED面板显示屏驱动芯片
一、基本概述 TM1638是一种带键盘扫描接口的LED(发光二极管显示器)驱动控制专用IC,内部集成有MCU数字接口、数据锁存器、LED驱动、键盘扫描等电路。本产品质量可靠、稳定性好、抗干扰能力强。 二、主要应用场合 主要适用于家电设备(智能热水器、微波炉、洗衣机、空调、电磁炉)、机顶盒、电子称、智能电表等数码管或LED显示设备。 三、管脚说明 DIO口输出数据时为N管开漏输出,在读键的时候需要外接1K-10K的上拉电阻。推荐10K的上拉 电阻。DIO在时钟的下降沿控制N管的动作,此时读数时不稳定,在时钟的上升沿读数才时稳定。 四、串行数据传输 读取和接收1个BIT都在时钟的上
|
传感器 Ubuntu Java
ESP-IDF 蓝牙开发实战 — 传感器数据上传及手机控制开发板
ESP32-C3 蓝牙部分我们学习了GATT,本文博主手把手带领大家使用 ESP32-C3的蓝牙做一个简单的小应用。
1279 0
ESP-IDF 蓝牙开发实战 — 传感器数据上传及手机控制开发板
便携式钻孔测斜仪测区如何设置
完成当前测区的添加(新建) 、删除操作。WIN5/612 便携式钻孔测斜仪的数据以区域进行划分,一个区域代表一个地理区域,亦或是一个工程、一个工地。设备默认保存最近一次测量时使用测区名称,对同一测区进行测量时无需再次选择设置。若需更换当前测区名称,请按照以下步骤操作。
便携式钻孔测斜仪测区如何设置
|
物联网 Android开发
毕业设计 基于51单片机无线蓝牙APP控LED灯亮灭亮度设计
毕业设计 基于51单片机无线蓝牙APP控LED灯亮灭亮度设计
304 1
毕业设计 基于51单片机无线蓝牙APP控LED灯亮灭亮度设计
|
Java 开发工具 Android开发
利用MCU实现制作一台蓝牙控制小车方法
今天主要和大家分享一下,如何使用MCU自己做一台蓝牙小车,并通过自己写的APP进行控制。
228 0
利用MCU实现制作一台蓝牙控制小车方法
|
数据格式
智能车常用的上下位机:匿名上位机 V7,TFMiniPlus 激光雷达测距
智能车常用的上下位机:匿名上位机 V7,TFMiniPlus 激光雷达测距
236 0
|
存储 传感器 Android开发
MLX90640 红外热成像仪测温传感器 手机 APP 软件 RedEye 连接操作详细
鉴于手机运算速度较慢,与手机连接时请务必将成像仪的刷新速率设置为 4Hz 或以下,否则可能出现较为更重的显示卡顿甚至无法正常显示实时画面。
MLX90640 红外热成像仪测温传感器  手机 APP 软件 RedEye 连接操作详细
|
传感器 芯片 计算机视觉
树莓派开发笔记(七):GPIO口的SPI使用(BME280三合一传感器:测量温度、湿度、气压、海拔高度)
树莓派开发笔记(七):GPIO口的SPI使用(BME280三合一传感器:测量温度、湿度、气压、海拔高度)
树莓派开发笔记(七):GPIO口的SPI使用(BME280三合一传感器:测量温度、湿度、气压、海拔高度)