六角克洛克

846.

5.

4.

Introduction: HexMatrixClock

关于:我喜欢建造硬件和软件。

Hexagons are cool -- they have six sides, they tile a plane, they have a structure like the carbon atoms in graphite, each cell has six neighbors, and there are six cardinal directions. But mostly, they are not square when so many computer things are. So I wanted to make a project using a display made of hexagonal pixels (hexels). I wanted the display to do something useful in addition to looking interesting, so I made it a clock.

时钟有13列,具有四个或五个LED,总共58个exel,主要填充17“X10”的相框。它通过电池备份实时时钟运行独立的保持时间,或者可以通过USB连接到主机,可以按位图,更改颜色方案或最重要的设置内部时钟。它肯定有一些怪癖,但我学会了享受他们。

只是为了好玩,它在每分钟结束时进行过渡,这有时是对John Conway的“生命之比赛”的欣赏。有关CONWAY的更多信息,请参阅本文nytimes.或者享受这个卡通XKCD.

用品:

  • 可寻址LED条(Adafruit Neopixels,每米为30米,https://www.adafruit.com/product/1460
  • Microcontroller (Adafruit Metro Mini 328,https://www.adafruit.com/product/2590
  • 影子盒图片框架。我使用17“X10”的图片框架意味着显示多个较小的照片。尺寸是玻璃面积。
  • 烟雾缭绕的窗户粘贴薄膜(我使用吉拉烟眩光控制薄膜) - 或熏灵动的有机玻璃
  • 电池备份实时时钟(我在亚马逊上获得的DS3231模块)
  • (可选)光传感器(Adafruit veml7700 Lux Sensor,https://www.adafruit.com/product/4162
  • 100 MicroFarad(或更大)电解电容器
  • 220 ohm Resistor
  • 电线,焊料,烙铁
  • USB电源/通信

第1步:计划并制作字体

The basic plan was to make a hexagonal grid of NeoPixel LEDs and then display the time on it. I found anINCREDIBLE网站描述六角坐标系(https://www.redblobgames.com/grids/hexagons/)真正帮助设计,我们经常引用这个网站。如果你想玩六角形,还有一个很好的互动网站https://arunarjunakani.github.io/HexagonalGameOfLife/

我选择使用“平顶”网格,因为我可以制作一个相当可读的字体,但保持了一个明显的六角形。几位数是一个伸展(4,5和7)的一点,但你习惯了他们。我也发现我可以制作所有十六进制数字(0..f),我认为与十六进制的想法一致,所以我采用了这个字体。

The font uses 13 hexels, three columns, and 4/5/4 rows. I encoded this font into a bitmap by using 16-bit unsigned integers and created bitmaps for each digit, which are in the Arduino code that you can download from thegithub链接

Step 2: Make the Grid and Coordinates

在发出字体决定之后,我需要弄清楚网格的程度。除了三列宽的数字之外,我们还需要一个额外的列在数字之间的空间,从而意味着每位点四列,我们需要三个时钟(12列)的全数字,然后是一个前导1位数,这将由一个四个高行组成。这些选择导致宽度为13柱,并且在列中交替包含四个或五个epeLEL,这需要58个exelel,比60-neopixel条的LED数量少两个。人们也可以选择制作一个真正的四位数显示,这需要67个expels,并让您显示24小时。

要解决显示屏,我选择了“轴向坐标” - 查看协调链接,向下滚动到轴向,然后选择“平顶”。这两个坐标是Q为列和其他坐标的r,这增加到右侧,但下降也会向下移动 - 真的,转到该网站;它太酷了。在该坐标系中,存储器存储是比特效率低,需要13值的Q和10值,但是使用以两个8位字符编码的13位意味着20个字符可以保持完整位图,这相当小。坐标系的起源是可能的对称形式的中心,这使得检查对称性更容易(稍后更多)。

第3步:弄清楚尺寸并设计电路

NeoPixel strips are very cool for making linear structures, but of course a hexagonal array has many lines, so I needed to choose a direction. I wanted my display to be as big as possible to show the hexagonal nature, so I chose the wide spacing (30 NeoPixels / meter) and chose to run them vertically, in either four or five LED segments that were wired in a serpentine fashion. On this grid, the vertical spacing of LEDs is square root of 3 times the hexagon edge dimension. The strip having 30 NeoPixels / meter means a pixel spacing of 1.31 inches, so the hexagon's edge is 1.31 inches / sqrt(3) = 0.758 inches, which is then the separation between the columns of the array. It got pretty involved ... so I decided to write code to print out the hexagonal grid. The code and pre-made templates are available onGitHub.。The template grid is produced at 600 DPI, which can be printed at that resolution (be careful that you printer isn't re-scaling!) to make the correct shape for the array. My picture frame had a glass dimension of 17 inches x 10 inches, so the全网格模板缩放到该大小。因为我们中的许多人都有大型打印机,所以我还包括一个半网格模板可以在普通的US 8.5“X11”纸上印刷。两个版本都在GitHub上的“GridTemplates”文件夹中。

该图显示了6-Hexel显示器的接线图作为示例。微控制器通过USB供电,这证明这足以为Neopixels提供动力。另外两个部件是光传感器(更高版本)和保持时间通过I2C总线连接的电池备份实时时钟。全级版本接线图也在github上。它易于适应任何其他微控制器,但是预先安装的是Neopixels希望5V电源和5V数字逻辑信号可靠地运行,现代微控制器经常使用3.3V逻辑,这可能无法可靠地工作。

第4步:建立它

上面的图片显示了我的物理构建。这个版本对Neopixels有一个单独的电源,但它证明是不必要的,所以后来被淘汰了。我将像素的位置处测量到图像框的背面,然后热粘在备用板上。然后我连接了所有像素并粘在另一个部分上。请注意,Neopixels的+ 5V电源在另一个总线上送入另一个总线和地面,而数字控制信号蛇下降。电线后,使用万用表确保+ 5V和地轨之间没有直接短路!

第5步:起初你没有成功

Becky Stern建议许多漫射LED的方法并且一张白纸工作得很好,但是来自一个LED的光也照亮了邻近的六角形区域,导致非清晰的展示。我尝试了很多扩散LED并勾勒出六边形阵列的解决方案,但大多数都很差。我意识到我需要一个六边形阴影网格,将邻近邻居的expels隔离。我通过切换“V”形的黑纸,当弯曲120度时形成两个边缘的黑纸。这种“V”的另一个尺寸是玻璃和图像框架的背面之间的间距,在我的情况下为1/2“。因此,条带是1 + 1/2”x 1/2“并弯曲中间。我使用E6000胶水将黑色“v”胶水连接到透明胶胶片。花了两个8.5“x11”透明度电影来制作完整的网格。我在纸页上打印出我的网格,然后覆盖印刷品具有透明胶片的栅格,沿着栅格线涂上一系列胶水,然后将“v”放置在该胶水中。我发现如果你放下胶水线并等待几分钟以获得俗气,让“v”粘在你想要的地方更容易。一旦透明胶片有“v”粘在一起,我删除了纸张网格模板,并将一个简单的白色纸张添加为漫射器。如果你有一个3-D打印机,你可能会带来更好的结果,少哈希。总体而言,它可能花了一小撮时间来构建(不计算其他故障......)。

第6步:全网格

上面的照片是完全组装的暗影网格。可以看出,光可以通过网格中的空隙泄漏,这有点烦恼,所以我在他们最糟糕的情况下粘在额外的“v”纸上。最后,我认为一些漏洞给时钟给出了更有机的外观,所以我留下了一些。也许我稍后会修复它们。

第7步:最终产品

即使有暗影网格,我也无法让expels看起来很好,直到我看到一些人使用烟雾的有机玻璃而不是前面的透明玻璃。我认为它有效,因为来自盒子外面的光线进出进出,所以很少重新出现,它显示为黑色,但LED非常明亮,只能通过Smokey电影,所以他们可以看好。我无法吸烟有机玻璃,但可以在五金店找到“阴凉控制”窗膜,这真的很好地工作。标题中的照片显示了一些exex的爆炸。您可以看到e6000胶水作为一点镜头,这是不希望的,但似乎可以又一次地借给自制的味道。我认为如果你在阴影网格格栅的内部喷涂涂漆的漫射涂料,它可能会消除这种效果,但你并没有在合理的距离中注意到。

要查看硬件设置,从返回到前面:影子盒框架的后平面用于保持LED阵列和电子设备。六角影栅格格栅位于LED的前方,以允许LED光在exel上传播。在格栅的透明胶片前面,有一片白皮书弥漫着光线,然后从画框上玻璃,最后,在外面,“烟雾”彩色遮阳控制膜。我认为这部电影也可以在玻璃的内侧使用,但我有几个气泡,在外面的电影不太明显,所以我和那个薄膜一起看。

第8步:编写时钟代码

The code for the clock is available at thegithub链接。请随时使用它或适应它。我选择的微控制器是相当于Arduino Uno,所以我告诉Arduino应用程序,“电路板”是一个Arduino Uno,然后我选择了它的端口并将代码上传到它。请参阅关于如何上传代码和/或获取库(RTCLIB,错配,以及用于光传感器的adafruit_veml7700)的在线帮助文​​档。

对于那些有兴趣的人来说,代码中的一些想法在下面。

The basic data to be displayed is held in the "hexgrid", which is a bitmap where 13 values of the column index, q, are held in a 16-bit "word", and the 10 values of the "skewed row" index, r, are the index of the hexgrid array of words. The current hexgrid is displayed, but a prior hexgrid (last) is also kept for various calculations.

新偶联由优秀的控制“错配”LED动画库,这需要显示58元元素的RGB颜色阵列。要在Hexgrid和像素颜色值之间进行转换,我们沿着Neopixel数据线在硬件中采用的路径“步行”Hexgrid。此路径在左上角开始,下行第一行(Q保持常量,R为递增)四个Hexels,然后R保持常量,q递增,这将您放入下一个列的最低exel。然后将索引R递减5个exel,然后重复该过程。除了着色之外,“Walk”算法用于其他目的,因此其使用是:

  • 步行到“颜色”:在这漫来的步行中,Hexgrid位图使用各种方法彩色,但对于网格上的任何位置,总会有一个由位图数据控制的“开”或“关”颜色。
  • Walking for "Conway": Remember that the hexgrid is 13x10 = 130 possible values of q and r, but only 58 of these are on the display, so we can save some computational time by only calculating transitions for the displayable hexels.
  • 散步为“对称性”:在这里,我们检查显示的hexgrid是否具有反转,垂直镜(左/右)或水平镜(顶/底)对称性,如果它确实,则代码始终将选择Conway转换。要检查对称性,我们迭代地检查hexgrid上的对称点,以查看它们是否匹配。

颜色模式是:

  • Mono: One foreground and one background in all locations
  • Two-tone: Two different foregrounds, depending on the column of the display. This is used to distinguish between the hours and minutes
  • HueWave:此模式具有颜色遵循围绕当前前景色调振荡的色调波。

Between the minutes, a randomly selected transition is carried out for the last few seconds of the prior minute. As indicated earlier, if the pattern is symmetric, the Conway transition is always chosen. The current transition modes are:

  • Conway:在六边形网格上扮演康威的生活游戏,规则将与两个邻居活着的任何细胞都保持活跃或诞生。细胞较少或多于两个邻居死亡。
  • Swipeoff:将Hexgrid翻译在六边形网格的六个方向之一中。方向是随机选择的。

请随时修改代码并进行更有趣的转换和/或颜色方案。

实时时钟也具有温度读数,因此我还有显示屏显示温度,通过阻挡在图像框的顶部中间中间的光传感器(在它的前面沿前方波)进行访问。然后在°C和°F中显示温度。对我来说很有趣C和F在我们的十六进制字体集中,甚至看起来正常(与B和D不同)。

Step 9: Serial Interface -- the Backdoor

虽然时钟自己工作正常,但我想给它更多的能力,因此我在USB上使用了串行接口来传输数据。首先,此连接有助于设置正确的时间,但它也用于更改颜色或行为。该命令是非常基本的单字母代码,通常是数字参数(在这些评论中由#表示)。您可以使用Arduino“串行监视器”来测试此接口(确保使用9600波特)。最有用的命令设置了实时时钟:

  • #### s =设置为hhmm的时间

例如,键入“1255s”以将时间设置为12:55。您还可以决定要使用的颜色方案。标准颜色方案是在完全饱和度下显示所选色调中的分钟,并显示同一色调中的小时,但仅在1/3饱和度(例如,比彩色更白光)。背景是低强度的相对的色调。相关命令是:

  • d =设置默认颜色(无参数)
  • ### H =使用带有FITTLED SPECTRUM HSV ColorPace的显示模式(0 ... 255)设置色调
  • ### i =设置“逆”色调,用于显示模式(0 ... 255) - 通常是可怕的丑陋和难以清晰的。

Any choice of the default hue you make will be retained until the USB power is cycled or the Arduino is reset, at which point the display will return to the default hue. The default hue is hard coded in the line #define DEFAULT_HUE, so you can change the value on this line and then upload the code to make the change permanent.

Other commands check information or play Conway at will:

  • V或?=显示版本,时间, and temperature

  • y =检查当前显示的对称性的hexgrid(打印到串行端口)

  • #### C =输入参数毫秒的Conway模式

  • #w =在参数方向上输入“向SwipeOff”模式,其值从0(向上),1(右和向上)...为5(左和向上)。

If you plug the clock's USB cable into a computer (I use a Raspberry Pi), the OS will assign it a port (e.g.,/dev/ttyUSB0)。然后我使用终端仿真器(例如,Minicom,屏幕, 要么hyperterminal在Windows和终奌站on MacOS) to communicate with the clock directly using this port. The settings are 9600 baud, 8 data bits, no parity, 1 stop bit (9600 8N1). In this mode, you don't need to type enter, just type numbers for the argument and then a single letter for the command and it will happen. If you mess up, just type a random letter and start again. The display always reverts to the time, so you won't mess it up for too long. The serial port also gives you some feedback, which can be useful for debugging.

第10步:玩时钟 - 玩得开心

使用串行接口,您可以使用颜色,从而导致一些体面的组合和许多可怕的结果如上所述,但您可能会找到您喜欢的那些。

最有趣的命令是x,它允许您直接转移位图。它适用于高级用户,因为它通常要求您使用像Python这样的编码语言访问串行端口。“x”命令具有不同的语法。它需要一个预处理,这是保持此模式的时间(以毫秒为单位),但后来键入x后,需要通过20个字符,该字符包含要显示的hexgrid。读取这20个字符而无需任何过滤,因此普通命令将为未来20个字符或发生超时。Timeout由#define xfer_timeout设置,默认为500毫秒。如果未接收到20个字符,则会清除缓冲区,并恢复正常的命令模式。命令语法是:

  • #### x [20] =传输二进制hexgrid并保持参数毫秒

20字符数组由编码Q索引的16个行(R索引)的10行(R索引)组成。这些字符通过MSB,LSB顺序传递,然后是下一行。为了测试,新手也能够在一个完整的X-命令字符串(例如5000XZZZZZZZZZZZZZZZZZZZZ)到Arduino串行监控或终端仿真粘贴,而是由类型能够字符所作的图案通常是相当随机的。由于更有趣的模式需要不可打印的字符,并且整个模式需要快于您键入的速度更快,因此您真的需要编写代码以推翻位图。我包括一些“帮助者”Python代码(Fireworks.py.orshowppm.py)使用X命令将烟火或短语“ppm”作为示例。我计算出在9600波特,转移的Hexgrids可以像60 Hz一样快,因此可以做一些快速的变化。我发现,使串口的波特率更快,有时会导致转移数据的失败,我认为我认为可能是一个与错配的冲突,但9600波特似乎可靠。如果有人对这个项目感兴趣,我希望直接转移可能导致有趣的应用,例如从其他传感器或在线数据源显示CO2混合比(以PPM为单位)。人们还可以制作直接传输模式,它将为58个Hexels传输颜色RGB值,并使用该设备作为非常微小的颜色监视器或做一些更有趣的东西。

I hope you enjoyed this project.

Make it Glow Contest

这是一个条目
Make it Glow Contest

是第一个分享

    建议书

    • Make it Glow Contest

      Make it Glow Contest
    • 第一次作家比赛

      第一次作家比赛
    • PCB Challenge

      PCB Challenge

    4讨论

    0.
    w.r.simpson

    1天前回复

    哇!那很酷。我不知道这个游戏秀。他们也用平顶使用六边形。颜色由错配的色调颜色选择。黄色是主要颜色,白色是黄色的较少饱和的版本,蓝色/紫色在色轮上相反(和暗淡)。我对颜色很糟糕,所以有束缚的颜色有助于使它变得更好。如果在赋予指针中滚动,我将其包含在其他一些方案(至少一个非常丑陋)。

    0.
    Michaels401.

    13小时前回复

    当他们看到颜色方案时,我认为来自英国的任何人都会想到我的样子:)很酷的项目