回到首页 返回首页
回到顶部 回到顶部
返回上一页 返回上一页

【Arduino动手做】特色乒乓球 LED 壁挂时钟 简单

头像 驴友花雕 2025.05.18 12 0

Arduino是一个开放源码的电子原型平台,它可以让你用简单的硬件和软件来创建各种互动的项目。Arduino的核心是一个微控制器板,它可以通过一系列的引脚来连接各种传感器、执行器、显示器等外部设备。Arduino的编程是基于C/C++语言的,你可以使用Arduino IDE(集成开发环境)来编写、编译和上传代码到Arduino板上。Arduino还有一个丰富的库和社区,你可以利用它们来扩展Arduino的功能和学习Arduino的知识。

Arduino的特点是:
1、开放源码:Arduino的硬件和软件都是开放源码的,你可以自由地修改、复制和分享它们。
2、易用:Arduino的硬件和软件都是为初学者和非专业人士设计的,你可以轻松地上手和使用它们。
3、便宜:Arduino的硬件和软件都是非常经济的,你可以用很低的成本来实现你的想法。
4、多样:Arduino有多种型号和版本,你可以根据你的需要和喜好来选择合适的Arduino板。
5、创新:Arduino可以让你用电子的方式来表达你的创意和想象,你可以用Arduino来制作各种有趣和有用的项目,如机器人、智能家居、艺术装置等。

zzz.jpg
zzz-0.jpg

00.jpg

这个很棒的 LED 时钟是一个非常简单的项目,几乎每个人都可以制作。它可以用作时钟,可以是 LED 装饰,或者关闭时可以只是一个不错的装饰品。

1、为什么我制作这个项目?
去年,我看到了一些很棒的项目,人们使用乒乓球作为 LED 的扩散器。这也激发了我用乒乓球做一些事情。在绘制了一些草图并订购零件后,我终于完成了这个项目。由于有些人对教程感兴趣,我决定改进构建并制作一个新的改进版本的乒乓球钟。通过这个 instructable,我希望让其他人感到兴奋和启发,以构建他们自己的项目。

2、设计选择
由于乒乓球不是在矩阵中定向的,因此我必须想出一种显示数字的好方法。我确定的设计为每个数字使用 12 个乒乓球。经过一些草图绘制后,我发现这允许最清晰的数字表示。中排的长度为 20 个球(20*4 = 80 厘米)。之所以出现这个大小,是因为我想让四位数字彼此相邻,中间有一个冒号。我还希望数字之间至少有一排球,以提高可读性。在这样做的时候,我发现这样球和 LED 的总数就变成了 128 个。

3、与第一个版本相比的改进
在图片中,您可以看到以前的版本和新版本(带有 2 个面板的图片,顶部的是旧版本)。较新的版本:
- 使用 LED 灯条而不是单独焊接在一起的 Neo-Pixel。
- 像素的方向使其更易于编程。
- 暴露的触点较少。
- 有一个背板,因此您无法透过缝隙看到。
- 允许更轻松地进行修改和可能的维修。
- 看起来更干净,因为从正面看不到电线和电子设备。
- 制作速度要快得多,因为焊接 128*6 触点和剥去相同数量的电线需要一些时间

4、注意:
对于构建这个项目的人:这个项目需要一些重复的工作,我建议先做一个小的测试版本,看看最终结果会是什么样子。这使您可以查看乒乓球是否很好地散射了光线。这也可以防止以后可能发生的错误(例如球之间必须有很大的空间)。我两次都制作了这个显示器的一小块(图片),我很高兴我做到了。

01.jpg
02.jpg
03.jpg
04.jpg
05.jpg
06.jpg
07.jpg
08.jpg
09.jpg
10.jpg
11.jpg

第 1 步:材料/工具:

1、材料:
本地购买:
- MDF 板 (80*30 cm)
- 框架的木材(必须 5 厘米宽,总长度至少 200 厘米)
- 128 个乒乓球(白色的最好是乳白色的)
- 几 (4) 个小钉子
- 旧 USB 电缆(可以为 Arduino nano 供电的电缆)
- 旧电子设备的电源线
在线购买
- 5V 10A 电源(较低的安培数也可能有效)
- Arduino nano
- ws2812b LED 灯带 (5m 30Leds/米 IP30)
- DS3231 RTC
- 3 芯线(2+ 米)
自选
- 母针连接器
- 电阻器(300 至 500 欧姆之间)

2、工具:
- 可切割 30 度角的锯(斜切锯)
- 带细齿的手锯(金属锯)
- 剥线钳
-烙铁
- 12 毫米钻头
- 32 毫米孔锯
- 木胶
- 热胶
-手电筒
-砂纸

3、注意:
选择正确类型的乒乓球对于这个项目非常重要。乒乓球通常有一个接缝,其中两半加在一起。这本身不是问题,因为通过在中间的一半中打一个孔,接缝在显示屏中将不可见。但是,当乒乓球的一侧也有印记时,球上的印记朝向背面很重要。这可能会导致从前面可以看到一块接缝。购买乒乓球时,也不要购买会发光(反射光线)的球。它们会很好地散射光线,看起来会很奇怪(你不应该买的乒乓球的一个例子)。
摘要:最好使用无印花的无缝乒乓球,这些球是白色且不反光的。

12.jpg
13.jpg
14.jpg

第 2 步:在乒乓球上打孔

每个乒乓球后面都有自己的 LED。为了获得尽可能多的光线,需要去除乒乓球背面的一块,这样 LED 的光就只需要穿过乒乓球的一侧。这些孔需要相当大(大约 30 毫米),因为 LED 不会在球后面居中。

在乒乓球上打这些大洞有点挑战。由于球本身很弱,因此在打孔之前需要一些支撑。我通过在一块 MDF 上钻一些 32 毫米的孔来完成此作。锯球时,我用一只手按压乒乓球,将它们压在孔上。由于孔的直径比球小约 8 毫米,因此球只会被压在孔上。在一侧施加压力的同时,我在另一侧锯掉了乒乓球的顶部,只是在中密度纤维板上锯成一条直线。

在锯切它们之前,我确保印在球上的标志在我要锯掉的一侧。我还用手电筒找到了两半加在一起的接缝。我把球多转动了一点,这样从前面就看不到标志,而且从接缝处也看不到。

提示:如果您对乒乓球旋转有问题,在孔内添加一些双面胶带可以帮助将乒乓球固定到位
注意:如果不是所有孔的尺寸都完全相同,也没关系,尺寸可能会相差几毫米。构建完成后,从任何方向都看不到这一点。

15.jpg
16.jpg
17.jpg
18.jpg
19.jpg

第 3 步:将所有球粘合成行

在所有乒乓球上打出大孔后,需要将它们粘成一排(2 排(17、18 和 19)和 1 排 20)。这些行应尽可能笔直,并且球之间不应有空间。我用买来的木头来做这个。通过让 2 块木头支撑球,我确定它们在一条线上。放置几个球后,在确保孔朝上且球相互接触的同时,我将它们粘合在一起。一点点胶水就足以做到这一点。如果你用了很多胶水,它会从前面看到。我再次使用手电筒这种音调来确保乒乓球的正面没有难看的地方(有些人有这些,因为它是便宜的球)。

20.jpg
21.jpg
22.jpg
23.jpg
24.jpg
25.jpg
26.jpg
27.jpg
28.jpg
29.jpg
30.jpg

第 4 步:将行粘合在一起

为此,我使用木头作为框架,以保持 2 行压在一起。请记住使用小滴胶水,如果您使用太多,它会从前面看到。一次在大约 8 个连接上涂上胶水后,我用手施加压力以确保球紧密粘合在一起。

31.jpg
32.jpg
33.jpg
34.jpg
35.jpg
36.jpg
37.jpg
38.jpg
39.jpg
40.jpg

第 5 步:制作框架

框架由 6 件组成。2 个长块和 4 个短块。这些块的所有边缘都应该有 60 度角。由于我的乒乓球的尺寸并不完全是 40 毫米,而是(39,5 左右),我计算了框架件的大致长度(这可以通过测量面板的高度或宽度并使用 a^2 + b^2 = c^2 来完成)。我计算出 2 个长块的内长应该是 66.3 厘米,4 个短块的内长应该是 14.3 厘米。由于我的锯子不是太准确,我确保将它们切得大一点,这样它们就不会太短。

剪完所有 6 个后,我将它们放在乒乓球面板周围,看看它是否合适。它没有,所以我锯了一些几毫米的碎片。我将乒乓球面板周围的所有东西粘在一起,以确保它以完全正确的形状粘合在一起,这是必要的,因为角度没有完美地切割成 60 度,而更有可能是 59.5 毫米。

41.jpg
42.jpg
43.jpg
44.jpg
46.jpg
47.jpg

第 6 步:焊接 LED 灯条

需要切割 LED 灯条(1 个 LED、1 个 3 个 LED、1 个 5 个 LED 和 17 个 7 个 LED)。如图所示,LED 灯条需要接线(首先是一个 LED,然后是 5 个 LED,接下来是 17 个带有 7 个 LED,最后是带有 3 个 LED 的一块)。连接条带较短部分的电线应比其他部分长,因为它需要覆盖更长的距离。我将条带贴在一块 MDF 上,看看每个 LED 是否都在自己的球后面。将所有部件焊接在一起后,我通过逐个激活每个 LED 来测试所有焊接连接是否良好 (见附件:checkIfLedsAreBehindBalls.ino)。

48.jpg
49.jpg
50.jpg
51.jpg
52.jpg
53.jpg

第 7 步:切割 MDF

框架完成后,我将框架和乒乓球面板放在 MDF 上,MDF 上贴有 LED。在确保每个 LED 都追逐自己的球后,我移除了乒乓球面板。接下来,我在 MDF 上沿着框架的内侧绘制,以获得我需要切割的形状。我这样做是因为 LED 不在球后面居中,这样我就有了 LED 与框架的相对位置。去除贴在板上的 LED 后,我切出面板的形状并打磨边缘,使其很好地适合框架内。
注意:请注意,LE LED 不会位于乒乓球后面的中心,请参阅代码。

54.jpg
55.jpg
56.jpg
57.jpg
58.jpg
59.jpg

第 8 步:向 MDF 添加孔和 LED

如前所述,连接 LED 的电线有点碍事。现在的情况是,电线将从前面可以看到。我决定通过在每个垂直 LED 条的位置末端钻孔来解决这个问题,这样电线就可以从背面穿过。我将 LED 灯条穿过孔并暂时用胶带粘住。在再次确保每个 LED 都位于自己的乒乓球后面后,我撕下胶带并用 LED 灯条上已有的胶条将 LED 灯条连接到电路板上。
注意:在 MDF 上钻孔时,要非常小心,你很容易就把板子弄坏了。

60.jpg
61.jpg
62.jpg
63.jpg
64.jpg
65.jpg
66.jpg

第 9 步:将球粘在框架上

我将乒乓球面板倒置在框架中,然后在乒乓球接触(或几乎没有接触框架)的每个点上涂上胶水。

67.jpg
68.jpg
69.jpg
70.jpg

第 10 步:将 LED 面板连接到框架上

我将 LED 面板放在球的背面顶部。接下来,我用 4 个小钉子将面板连接到框架上。我通过将钉子放在框架内侧来做到这一点。我选择这样做,因为它允许我在损坏时修复某些东西(它还允许我将 LED 的数量增加一倍,因为不存在许多流明)

71.jpg
72.jpg
73.jpg
74.jpg
75.jpg

第 11 步:电子元件

好吧,我(几乎)没有使用 Arduino 的经验,所以这可能并不完美。但我试图以尽可能简单的方式做到这一点。
我将连接器焊接到 Arduino nano 上(图中的黑色东西)(不是必需的)。

我决定这样做,这样如果我想添加按钮或光敏电阻器 (LDR) 或其他功能,可以轻松地再次将所有内容拆开。
接下来,我将 RTC 连接到 Arduino,只需确保时钟模块的 SDA 和 SCl 连接到 Arduino Nano 的 SDA 和 SCL 即可。然后在引脚 9 和 LED 灯条的数据输入之间连接电阻器。

最后,将电线连接到 LED 灯条的末端,也为 LED 灯条的末端供电,以防止电压下降。
是的,真的就是这么简单。

为了给一切提供动力,我剪掉了一根可以连接到 Arduino nano 的 USB 电缆,并将两根电缆的 5V 侧连接到 LED 灯条和切成两半的 USB 电缆。我对 Other side 做了同样的事情。这使我可以在不通过 Arduino 供电的情况下为 LED 灯条供电。
使用旧灯的电缆将 5V 10A 电源与时钟连接。

我还在框架的一侧底部钻了一个孔,以便电源线穿过。这使得时钟可以平靠在墙上,同时如果愿意,仍然可以站在表面上。
剩下唯一要做的就是编写一些代码。

76.jpg
77.jpg
78.jpg
79.jpg

第 12 步:编码

上传代码时,请确保电源已关闭!

在 clock module 知道当前时间之前,必须在 module 上设置时间。幸运的是,有一些代码可用于执行此作。只需添加 4 行代码并安装 DS1307RTC 模块后,我们就可以运行这个(SetTime_on_ds3231_nano.ino,链接到原始代码 / instructable 关于如何在 DS3231RTC 上设置时间)代码,将 Arduino 上的时间设置为 PC 的时间。

设置好时间后,我们可以开始考虑为这个 clock 编写一些代码。我在程序中使用了 2 个库,FastLED 库和 DS3232RTC 库。这两个库几乎可以为你完成所有工作,并允许编程经验很少的人编写程序。

在这里的下面,你可以看到我在这个 Instructable 顶部和大多数图片中的视频中使用的代码。(时间白背景彩虹.ino)

代码
#include <FastLED.h><fastled.h>
#include <DS3232RTC.h><ds3232rtc.h>

#define LED_PIN     9
#define NUM_LEDS    128
DS3232RTC myRTC(false);
tmElements_t tm;
CRGB leds[NUM_LEDS];
CHSV colour( 0, 255, 180);
int counter=0;
const int Digits[10][10] =
{
  {7,8,10,11,14,18,22,24},
  {14,16,18,22,24},
  {7,8,9,11,14,16,18,24},
  {7,9,11,14,16,18,22,24},
  {9,10,11,16,18,22,24},
  {7,9,10,11,14,16,18,22},
  {7,8,9,14,15,16,18,22},
  {7,11,14,16,17,24},
  {7,8,9,10,11,14,16,18,22,24},
  {7,9,10,11,14,16,17,24},
};
void setup()
{
    pinMode(17, OUTPUT); //ground and v5 for clock module
    pinMode(16, OUTPUT);
    digitalWrite(17, HIGH);
    digitalWrite(16, LOW);
    FastLED.addLeds<</ds3232rtc.h></fastled.h>WS2812, LED_PIN, GRB>(leds, NUM_LEDS);</p><p><fastled.h><ds3232rtc.h><ws2812, led_pin,="" grb="">    myRTC.begin();
}</ws2812,></ds3232rtc.h></fastled.h></p><p>//function that uses the Digit aray to display numbers between 0 and 100
void displaynumber( int place , int number){
  for (int i = 0 ; i < 10 ; i++) {
    if (Digits[number/10][i] != 0) {
      leds[(Digits[number/10][i]+place)] = CRGB(255,255,255);;
    }
    if (Digits[number%10][i] != 0) {
      leds[(Digits[number%10][i]+28+place)] = CRGB(255,255,255);;
    }
  }
}</p><p>void loop(){
  RTC.read(tm);
  
  //changes the colour of background every 10 cycles
  if (counter<10){
    counter++;
  }else{
    colour.hue = (colour.hue+1)%256;
    counter=0;
  }</p><p>  // sets background to rainbow colours
  for ( int i=0; i< 128;i++){
    colour.hue = (colour.hue+1)%256;
    leds[i]= colour;
  }
  colour.hue = (colour.hue+128)%256;
  
  displaynumber(0,tm.Hour);
  displaynumber(70,tm.Minute);</p><p>  //display colons
  if ( tm.Second%2 == 0 ){
    leds[64] = CRGB(255,255,255);
    leds[66] = CRGB(255,255,255);
  }
  FastLED.show();
}

我认为代码相对较短,但当然可以改进。它所做的只是从 RTC 读取时间并显示该时间。应点亮以形成数字的 LED 的位置在矩阵 'Digits' 中硬编码。例如,Digits[0] 包含应点亮以形成零的 LED 的位置。

我还提供了我制作的其他程序,它们是对上述程序的细微改动。程序 'CycleThroughDigits.ino' 只计数到 9999 来演示所有数字的外观。程序 'onlyTime.ino' 只是以不同的颜色显示时间,没有背景颜色。最后,'FastledExampleCode.ino' 是 FastLED 库提供的一些代码,用于演示一些简单的动画(见附件)。

第 13 步:添加您想要的所有功能

这个项目可以不仅仅是一个基本的时钟,你可以添加按钮,让它根据光线改变亮度,让它只显示一些颜色,让它对音乐做出反应,用 ESP 把它连接到 wifi。它基本上是一个连接到显示器的 Arduino,一切皆有可能。

80.jpg
82.jpg

附录:
原文链接:https://www.instructables.com/Ping-Pong-Ball-LED-Clock/
原文作者:荷兰 thomasj152
记录视频:https://www.youtube.com/watch?v=7urN2OS0fjs&t=4s
驱动库之一:https://github.com/JChristensen/DS3232RTC
驱动库之二:https://github.com/FastLED/FastLED
开源代码:

84.jpg

83.jpg
83-.jpg

00128-=--.gif

评论

user-avatar
icon 他的勋章
    展开更多