一、介绍
这款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模型下载的文件可以私信我获取
当然除了以上材料以外你还需要准备胶水等一些常用的工具。
三、 打印部件和焊接
- 打印部件。如果我没记错的话,柱子需要支撑,接触构建板的地方需要一个边缘。
- 将Arduino、SD卡读取器、电源锁存器以及连接到面包板的导线焊接起来。照片显示了最终的样子。不要焊接输入电源线。我是基于这个制作的电源锁存器。电源锁存器是必需的,这样Arduino在关闭之前就可以将其在DNA中的位置保存到EEPROM中。
- 清理打印部件。
四、拼装打印的DNA散件
- 剪下一段包含11个LED的灯带(确保在第11和第12个LED之间的中间剪断电线,这样第11个LED上就有一段电线可以用来焊接)。
- 按照图片所示,将这些LED穿过10个柱子。每两个LED之间应该有一个柱子。
- 这串LED中的最后一个(在第一个螺旋柱的顶部)将连接到第二串的第一个LED(在那个柱子的底部),因此需要在第11个LED上焊接一条电线到数据线(白色线)。然后,这条线需要穿过所有的柱子,以便所有四根线(三个LED输入线+这个输出数据线)都从柱子底部伸出。这个输出数据线最终将被拉伸到基座的底部以连接到另一串LED,所以确保它足够长(见图片)。
- 为下一步做准备,剪下大约两打胶带来包裹柱子,以便在胶水干燥时将其固定在一起。
- 使用泡沫/膨胀大猩猩胶将所有十个柱子部件粘合在一起,确保LED从柱子之间的孔中突出,如图片所示。LED应该相对松散且自由。用胶带包裹接合处。尽量减少胶水粘在柱子外部的数量。
- 剪下另一段包含11个LED的灯带,并将它们穿过另外10个柱子。
- 用另一串柱子重复粘合过程。
五、组合DNA螺旋结构
- 将柱头帽和柱基座粘合到柱子上,确保将所有导线穿过基座部分的底部孔。对于每个“横档”,使用两个交叉梁部件,并将它们夹在一起,使得一个交叉梁部件在顶部,另一个在底部。这可能是一个紧密的配合,所以要做好心理准备。我使用透明大猩猩胶来粘合交叉梁。将一个交叉梁部件插入灯座部分的足迹中并粘合在那里。然后粘合两个柱子到基座上,确保将所有导线穿过基座的孔(如图)。然后在上面粘合另一个交叉梁,使其全部闭合在一起,第一个横档就完成了。
- 将两个交叉梁粘合到所有其他“横档”上。
- 对于接下来的步骤,面包板最终将安装在灯座部分,确保从螺旋顶部部分到面包板的导线足够长,以便顶部部分可以被移除并侧放以访问面包板(如图)。
- 将通往第一柱子起始端的LED数据线焊接到面包板上的Arduino的第5脚。
将之前从第一柱子最后一个LED末端伸出的LED数据线焊接到第二柱子的第一个LED上。 - 将电源和地线焊接到两个LED柱子上。
- 在灯座部分安装电位计和按钮,并焊接它们与面包板之间的所有连接。我使用了一些热熔胶来帮助固定电位计,以便在旋转时不会转动。我还在基座上用记号笔标记了电位计。
- 使用M3x5螺栓将面包板安装到灯座底部。确保螺栓没有短路/连接面包板上的任何线路。我使用了一小块电工胶带作为临时的“垫圈”,将螺栓头与板子隔开。
- 将电源线穿过灯座底部侧面的孔,然后将其焊接到面包板上的正确位置。
六、执行DNA文件
由于DNA文件大小为3GB,我无法将它们附加到本指南中。以下是获取它们的步骤:
- 访问网站
- 滚动到页面底部,打开染色体1的RefSeq链接。
- 按照图片指示下载为FASTA文件。
- 对其他染色体重复上述步骤。
- FASTA文件包含了标题和N等不需要的内容。
dna_processing.py
脚本可以去除所有这些内容,并创建只包含ATGC的文本文件。将所有文件和dna_processing.py
文件移动到一个文件夹中。 - 在
dna_processing.py
中,将chromosome_number
设置为1来处理第一个染色体并运行代码。 - 为每个染色体更改
chromosome_number
并重新运行代码。
我一开始没有理解的一件事是:'A’总是与’T’配对,'G’总是与’C’配对。因此,FASTA/文本文件中的所有字母只是每对的一半。例如,文件中的一个’A’意味着一个AT配对,这就是在螺旋的“横档”上显示的内容。
DNA执行文件可以私信我进行获取
七、程序烧录
DNA_Lamp_Clean.ino
和 functions.ino
构成了螺旋灯的主要程序。正如我之前所说,一个已知的问题是碱基对在螺旋中的移动速度没有我想象的那么快。理想情况下(在最快速度下),它们应该每2毫秒更新一次,但实际上(在SD卡上存放所有染色体文件的情况下),我测量的速度在80-500毫秒之间(有时候可能会更慢;我的测试并不全面)。让事情变快的一个方法是一次只在SD卡上放置单个染色体的文件,但这意味着当Arduino处理完这些文件后,你将不得不将下一个染色体的文件放到SD卡上。你可以通过在代码中更改 ONE_CHROM_AT_TIME
来配置(所有文件或仅单个染色体)。
在主程序中,每个文件播放完毕后都会有庆祝模式,因此我也附加了一个仅包含庆祝模式的程序。我是用ChatGPT生成这些模式的,这相当容易也很有趣。我只需坐下来,请求模式,然后看看它们看起来有多酷。如果你想修改主程序中的模式,这段代码很有帮助。或者你可能只想全程运行模式代码。
在所有内容都上传并工作后(确保也将上一步骤中生成的DNA文件放到micro SD卡上),使用2-4个M3螺栓将灯座和底部连接在一起。你可能需要用刀子将底部的孔稍微扩大一些。确保在两部分组合在一起时,没有任何导线被夹住,以及按钮和电位计上裸露的电气连接没有触碰/短路到面包板上的任何东西。
以上所涉及到的程序可以私信我进行获取
八、总结及成品展示
按下电源按钮可以打开灯具。要关闭它,按住电源按钮直到灯光停止移动。
最后,为灯具找个地方,坐下来,享受这场灯光秀。整个人类的基因组代码正在照亮你的房间。
希望你喜欢这个项目,并在构建过程中找到乐趣!如果你有任何问题或需要帮助,欢迎在评论区交流。
作者:Svan.
注意:本博文为不得在未经本人同意进行转载或者二次创作,违者必究!!!