我们抽宜家:如何将轻音乐变成老大哥


介绍


宜家是一家好奇的商店。即使您打算购买一件特定的东西而不会被所有其他垃圾分散注意力,您也会通过购买比必要数量多三倍的商品而退出。对于我们的黑客来说,这种影响在宜家的电力电缆或电池部门尤为明显。

对我来说,上一次这种精神错乱发生在荷兰。我正在计划行程中,计划只在该国呆几个星期。但是,这是在2020年初,COVID-19灾难……我不得不离开实验室更长的时间。

当我在宜家看到Frekevens的电子产品线时,我情不自禁地买了全部。

对于那些不知道的人:宜家的Frekvens系列应该成为老式HiFi装置和六角形轻音乐装置的现代模拟,后者似乎出现在90年代青少年的一半中。在这种情况下,彼此连接的设备线包括用于声音输出的蓝牙扬声器和闪烁于音乐节拍的LED投影仪(由各种喷嘴组成),以及可以显示也会移动到音乐的动画的LED立方体显示器。宜家自豪地称,这条生产线是与“少年工程”(Teenage Engineering)共同开发的,后者以“便携式游戏机”合成器的Pocket Operator系列而闻名。


宜家宣传视频所示,完成购买数十种设备后,看起来就像是一场难以忍受的闪烁的狂欢节,我那位内心的15岁少年不介意安排在他的房间里。

我对LED立方体显示器特别感兴趣:这是一种可以在电源上工作的高质量集成设备。前面板上是一个16行16列非常明亮的白色LED的矩阵,即总共256个LED。内置于设备中的动画非常简单,但它们使我想到铁实际上可以单独控制每个LED。但是,由于这个原因,这个小盒子很贵:我的口袋空了约40欧元。为此,您会得到一个装有LED和电源线的盒子。由于假定您必须将本产品与其他Frekvens产品一起购买,因此您还会收到其他连接元件:用于从主电源到其他盒子的端到端供电的延长电源电缆,以及一组螺钉和塑料垫,您可以使用它们将壳体相互机械固定。

到家后,我就连接了设备,并且……说实话,我对他们用熨斗做的事有点失望。该设备具有几个动画,可以通过按下机箱背面的按钮进行选择。外壳中装有一个小型麦克风-每次识别到噪音时,动画的帧都会改变。动画不是很有趣:它们仅包含4到5帧,并且帧本身仅为黑白,没有灰色阴影。如果您很好奇,我录制了包含所有动画的简短视频

显然,这不适合我。让我们对设备进行黑客攻击-让我们看看它是如何工作的,是否有可能使它的行为更有趣。

尸检


要拆卸Frekvens,只需使用一个十字形螺丝刀和一把刀就足够了。您还需要有足够的毅力,因为该设备不容易拆卸:设计复杂且某些元件填充有硅树脂,可能会消除振动并简化制造。


Frekvens机箱的拆卸从后面开始。除前部外,外壳的所有侧面都有螺孔;多亏了设备套件中的螺丝和盖套,它可以连接到其他Frekvens小工具。但是,螺钉的后孔要深一些,并且在它们的下面有固定外壳的螺钉。


卸下后盖后,我们看到所有螺钉孔都有带螺纹的金属插件,可以将螺钉拧入其中。哇!这应该为孔提供足够的安全裕度。这可能会使生产或拆卸变得非常复杂;后者由于我们首先需要切割硬化的有机硅化合物的液滴而变得复杂。


插入件实际上已与其他塑料插入件固定在一起。必须先将它们删除。

我没有拆卸过程的其他照片,但是在此阶段之后,您将看到需要拧开的四个螺钉,然后该过程将像以前一样继续进行。了解哪个塑料片将其他所有东西都粘在一起,切开硅酮化合物,然后拆下塑料紧固件。继续直到可以拉出电路板。


这是:电路板的背面。事实证明,它是由两块印刷电路板组装而成的:白色的有两面-背面是所有LED驱动器(另一块板已连接到其上),而正面是LED本身。

白色电路板设计得非常好:有16个SCT2024 LED驱动器代替了LED矩阵用直流电工作。这些LED驱动器具有16个通道,即每个LED都直接受到控制。 LED驱动器只能完全打开或关闭LED。驱动程序本身没有本地灰度支持。实际上,它们使用电流控制的输出来执行寄存器移位,并且它们都按顺序进行切换。绿色的PCB连接接口包括其同步总线和数据,快速启用线,输出,接地和电源启用线。

这个绿板是设备的细微大脑:微控制器和麦克风的运算放大器,该微控制器的文章无法在Google上找到。有趣的是,有迹象表明该设备应该具有更多功能:大概有一个I2C EEPROM 24Cxx的地方,并且有一个暗示,在原始项目中,前面板上有一个IR接收器。也许有人认为该设备将配备允许您创建自己的图案的遥控器?这可以解释现有动画看起来很乏味。


白板的前面是所有LED。一个微型平板麦克风也焊接到了它。起初,我认为它是焊接到绿色板上并从白板上的孔中伸出的,但实际上它只是平坦的。


所有其他电子设备位于电路板的背面。那里还不够:仅宜家品牌的电源提供4 V电压。电源下有一块小的印刷电路板,在其背面有两个用于按钮的触觉开关。

因此,如果我们要“优化”设计,那么我们有一个明显的弱点:最好用功能更强大的处理器代替小的绿卡。

我们修改铁


我认为有可能用ESP-Cam替换设备。这是一块非常便宜的板(约10欧元),带有ESP32 WiFi / BT芯片,几兆字节的PSRAM和一个摄像头模块。我对轻音乐不是很感兴趣,我希望设备对视觉效果做出反应。由于接收器的前端已经有一个孔,所以我认为我可以在相机下使用它。我还需要在麦克风所在的白板上钻孔。幸运的是,除了这些现在没用的麦克风音轨之外,这只会破坏LED的一个音轨。我钻了一个洞,恢复了轨道。暂时将板放回原处并打开立方体,我确保所有LED仍在工作。


现在,我有一块带有钻孔的电路板,并且只能连接和机械连接ESP-Cam。设计师们亲切地指出了绿板丝印板上所有垫子的用途,因此我几乎没什么可猜测的。由于电源仅提供4 V,因此我将其直接连接到ESP-CAM芯片的3.3 V输入。我必须这样做,因为当我将其连接到Vin 5V引脚时,芯片并不想启动。最有可能的是,LDO稳压器的电压降略高。回过头来,我现在认为值得尝试将二极管与4 V电源串联以得到3.3-3.4 V,但是我的解决方案有效。 ESP32非常朴实。


焊接所有的连接器后,无论如何我还是要处理机械问题。这是一个“快速而又肮脏”的项目,我之前已经焊接过ESP-Cam连接器,因此要使摄像头与孔对齐,可以使用多个垫圈和大量环氧树脂。


完成此操作后,最后一个问题仍然存在:相机旁边的LED照在其框架窗口上,从而导致各种奇怪的伪像。首先,为了消除它们,我从铝带上切下了一个小边框,以保护相机免于直射光。


第二步是丙烯酸涂料的应用。这是一个塑料插件,所有扩散器都位于该插件上,LED发光。我已经扩大了麦克风上的孔,为相机创建了一个更宽的框架窗口,但这又导致了另一个问题-该孔太引人注目,并且散射光过多地落在相机上。在这两个问题上,黑色丙烯酸涂料的染色效果都很好。相机仍然从LED接收很多光线,但是现在并没有完全淹没它。

因此,脑移植已经完成,身体已准备好进行组装。您可以启动软件。

软件


让我们继续该软件。首先,我们需要控制LED驱动器。这并不困难:驱动器信号几乎直接与ESP32芯片的SPI外围接口一致:开发板上的CLK焊盘连接到SPI外围CLK接口,开发板上的DA焊盘连接到SPI信号的MOSI。这将使您可以通过一系列LED驱动器同步256位:每个同步位控制相应LED的开或关。此外,还有一个LAK入口。如果其上的信号为低电平,则无论传输到移位寄存器的内容如何,​​LED都将保持其先前的值。如果信号为高电平,则它们全部同时切换到移位寄存器中当前的值。最后,有一个EN输入可打开或关闭所有LED。我没有将其连接到GPIO,而只是始终以编程方式打开LED。

因此,我现在可以打开和关闭单个LED,获得黑白显示。但是,我还需要其他东西。有了足够的计算能力,显示器还应该能够显示灰色阴影-为此,您只需要以比眼睛看到的快得多的速度打开和关闭LED。

为了用单个LED来实现这一点,我通常使用PWM,但是在256个LED的情况下,这将占用ESP32处理器功率的很大一部分。因此,我决定使用二进制代码调制(也称为位角调制)。此技术可让您以较少的CPU能力获得灰色阴影。我已经在其他项目中成功使用过它,因此我确信它会起作用。


而且有效。我还添加了一个查找表,将CIE亮度转换为PWM,因为眼睛本质上是非线性地响应LED的亮度。查找表可解决此问题。最后,根据我设置的像素值,我设法获得了足够的灰度和光学亮度的线性缩放。

实施相机项目并不难:可以将ESP-IDF组件添加到项目中;他将负责设置摄像机并与其交换数据,您只需要指定所需的参数,然后请求摄像机看到的位图即可。在标准设置中,我唯一无法使用的是默认情况下自动对齐和自动曝光处于启用状态,这极大地干扰了我控制LED的方式:根据创建图像的二进制编码调制序列的哪一部分,相机会随机增加或减少对准和曝光。我通过将相机切换为手动对齐和快门速度来解决此问题;代码本身检查图像并确定这些参数是否需要补偿。由于进行了这种手动处理,我还设法排除了直接看向LED的像素,以便将它们从等式中完全删除。这也大大有助于获得稳定的图像。

现在,我有一个相机和一个16x16的灰色阴影画布。我该怎么办?我有一个主意:在第一台Macintosh电脑出现的时候,有一个受欢迎的扩展,只在菜单栏中添加了两只卡通眼睛。这些眼睛只是跟随光标。 (在Linux / Unix上,该主题的一个变种称为“ xeyes”仍然存在。)如果我尝试在现实生活中重复该主题怎么办?


首先,我需要一些眼睛的图像。我不认为我可以画些有价值的东西,所以我决定用自己的眼睛作为基本图片。观看一个简短的视频,我在其中观看并向各个方向眨动。值得考虑的是,由于目前的情况,我只有很少的专业工具:我躺在地板上以最大化从天花板荧光灯射出的光线并获得清晰的图像;所有视频都是在我手持的智能手机上拍摄的。

由于初始数据比较草率,因此我不得不努力进行后处理。我首先切出一个大约在我右眼周围的碎片。然后,我将视频的每一帧都转换为图像,并删除了所有多余的图像;最终,我选择了不同方向的图像,还有眨眼的几帧。但是,由于我使用手机进行录制,因此视频显示有点不稳定,并且图像被跳过了。为了解决这个问题,我通过Hugin图像胶水程序传递了一组图像通常用于全景图和HDR图像;在出口处,我得到的照片理想地集中在我脸部的这一部分。现在,我只能标记我所朝的方向以及是否眨眼。为此,我首先将所有图像转换为灰色阴影,然后将其上传到Gimp。在每幅图像中,我用红点表示瞳孔中心的位置,在左或右角用红点表示是否眨眼,如果眨眼,则表示眼睛半睁或闭眼。


用这种方法标记每个图像之后,编写脚本以获取瞳孔的位置以及闪烁状态变得非常简单。该脚本还将图像缩放到16x16并将其保存为原始二进制数据,以准备写入ESP-CAM模块固件。最后,我得到了一组图像,以及一个瞳孔在哪里以及眨眼处于什么状态的索引。

ESP-Cam具有用于ESP-IDF的相当易于使用的相机库组件,因此获取图像非常容易。我设置了以灰色阴影抓取120x160的图像,因为它们最容易处理,并且我不需要太多的分辨率,因为最终结果应该显示在16x16的屏幕上。但是,我仍然遇到硬件问题:相机仍然离LED太近。


最初,我尝试通过校准来解决该问题:设备启动时,会拍摄两张照片:一张带有靠近相机镜头的LED,一张只有远离相机的LED。从另一个图像中减去一个图像,您可以了解哪些像素受LED影响。这些像素存储在遮罩中。掩码中标记的像素随后将被忽略。上图显示了两个镜头和一个蒙版。

有了更清晰的图像,我可以继续进行运动识别。我通过从相机获取一帧并减去前一帧来实现它。然后,我可以通过将所有结果像素相加来计算运动量。此外,可以通过取所有像素的坐标的平均值来计算运动集中的位置,该像素由该像素中的帧差加权。最后,执行过滤魔术,以使设备不会像具有ADHD的杰克罗素梗犬那样四处张望:为了吸引他的注意力,物体必须移动得更均匀或移动得足够远。

仅存在一个问题:在非常黑暗的时候,运动识别算法有时会作用于LED在房间内闪闪发光的物体上的反射:如果眼睛眨了眨,请注意其自身的反射。这并不是我想要的,因此我通过在更改LED上的图像时使运动识别算法“盲”来解决了这个问题。所以我停止了这种行为。而且,它也更现实一些:眨眼时看不到。

固件具有多种调试模式,可演示整个过程。这是一个简短的视频,说明了这一点:


结论


所以现在我有一个跟在我后面的设备……我同意,这并不是很有用。但是创建它对我来说很有趣,如果我发现可以在16x16 LED屏幕上实现的更有用的东西,那么我就可以做到,因为我已经有了控制代码。谈到代码:您可以从此处免费下载我的原始结果希望您喜欢它并保重。


All Articles