查看: 298|回复: 0

[教程] 【翻译】带3D磁传感器的RGB无限镜子

[复制链接]

主题

好友

1497

积分

进士

  • TA的每日心情
    开心
    22 小时前
  • 签到天数: 244 天

    连续签到: 34 天

    [LV.8]以坛为家I

    发表于 2018-11-15 02:43:56 |显示全部楼层
    原文标题:RGB Infinity Mirror with 3D Magnetic Sensor
    原作者:Abdullah Sadiq

    由于本人翻译水平有限,翻译以意译为主,难免有翻译不严谨以及不准的问题,欢迎指正。

    已完成翻译!
    ===========================================================
    这是一个带有RGB LED灯带的无限镜子,这个灯带能使用连接到Arduino MKR1000的英飞凌3D磁传感器旋钮改变其颜色。



    用于这个项目的东西

    硬件元件
    1.jpg
    英飞凌3D磁传感器2Go
    x1
    2.jpg
    Arduino MKR1000
    x1
    3.jpg
    达林顿大功率晶体管
    x3
    RGB LED灯带 x1
    4.jpg
    跳线(通用)
    x1
    软件应用程序和在线服务
    5.jpg
    Arduino IDE
    手动工具和装配工具
    6.jpg
    烙铁(通用)


    用于这个项目的东西


      当我第一次看到无限镜子的效果时,我就对它印象深刻。


      我想建立我自己的版本。因此,我决定使用英飞凌的3D磁传感器套件和旋钮通过一条RGB LED灯条来控制的无限镜子上的颜色。


      在进行实际制作之前,请务必查看最终成品的演示视频:

    GIF1.gif


      注意:无限效果不是那么明显。由于相机的原因,我还需要试验摆放镜子的位置,使其显得更加明显。


      这些是制作它所需的部件(仅电子部分):

    7.jpg


    细节

      我对这个项目的灵感来自于techydiy的无限镜子(这里)。看一下它吧,以便明白无限镜子的理念。

      由于3D磁传感器2Go套件没有足够的PWM引脚,我使用了Arduino MKR1000板来扩展它,因此我可以轻松地向无限镜子添加任何其他东西。

      除此之外,颜色变化算法通过将RGB值(从0到255)转换为HSV(色调饱和度值)来工作,其中将色调值从0改变为360将改变LED的颜色。

      注意:我没有编写从HSV转换到RGB的代码。在网上搜索后,我从这个网站(这里)找到了代码。因此,我使用了修改后适配了3D Magnetic 2Go套件的算法。

      这是我转换的代码片段:

    1. void setLedColorHSV(int h, double s, double v) {
    2. //this is the algorithm to convert from RGB to HSV
    3. double r=0;
    4. double g=0;
    5. double b=0;
    6. double hf=h/60.0;
    7. int i=(int)floor(h/60.0);
    8. double f = h/60.0 - i;
    9. double pv = v * (1 - s);
    10. double qv = v * (1 - s*f);
    11. double tv = v * (1 - s * (1 - f));
    12. switch (i)
    13. {
    14. case 0: //rojo dominante
    15.    r = v;
    16.    g = tv;
    17.    b = pv;
    18.    break;
    19. case 1: //verde
    20.    r = qv;
    21.    g = v;
    22.    b = pv;
    23.    break;
    24. case 2:
    25.    r = pv;
    26.    g = v;
    27.    b = tv;
    28.    break;
    29. case 3: //azul
    30.    r = pv;
    31.    g = qv;
    32.    b = v;
    33.    break;
    34. case 4:
    35.    r = tv;
    36.    g = pv;
    37.    b = v;
    38.    break;
    39. case 5: //rojo
    40.    r = v;
    41.    g = pv;
    42.    b = qv;
    43.    break;
    44. }
    45. //set each component to a integer value between 0 and 255
    46. int red=constrain((int)255*r,0,255);
    47. int green=constrain((int)255*g,0,255);
    48. int blue=constrain((int)255*b,0,255);
    49. setLedColor(red,green,blue);
    50. }
    复制代码

    以下是整个项目如何运作的概要:

    • 3D Magnetic 2Go通过其硬件串口发送旋钮的当前位置(范围从0到360度)。
    • MKR1000连接到3D Magnetic 2Go的UART引脚,它会解析之前发送的角度。
    • 这个角度在上面的代码片段中用于代替色调(正如我之前所说的那样,范围从0到360)。
    • 此功能根据该角度生成三个值(红色,绿色和蓝色),范围从0到255。
    • 用analogWrite函数将这些值写入到连接到MKR1000的RGB LED灯条(当然使用像TIP120这样的晶体管!)。只需旋转旋钮,就可以将光变换为色环上最亮的颜色,从而得到一个漂亮的效果。

    8.png


      话虽如此,让我们继续讨论这个项目本身。

    配置3D Magnetic 2Go套件

      这是连接到套件的旋钮:

    9.jpg

    10.jpg


    这是套件的引脚:

    11_.jpg


      注意:我将使用Arduino IDE对套件进行编程(版本1.1.2)。


      假设您了解了基础知识,比如如何上传代码以及已经设置好套件并从Arduino IDE获得程序模板,这一步将非常简单。

      只需下载XMC1100的附加代码即可。

      选择正确的板子和COM端口,并将“串行输出选择”设置为“PC”。完成后,上传代码并打开串行监视器。 你应该看到一个从0到360这样的数字,通过旋钮来改变:

    12.jpg


      如果和上图一样,则意味着一切正常,再次上传相同的代码,但这一次,将“串行输出选择”设置为“在板上”,并确保正确地上传

    13_.jpg


      现在你不会在串行监视器中看到任何输出,这是完全正常的,只需继续下一步。

    配置MKR1000

      这是MKR1000:


    14.jpg


      这是MKR1000的引脚,供您参考:


    15.png


      下载Arduino MKR1000附上的代码,然后将其简单地上传到Arduino MKR1000。这很容易,不是吗?

    连接一切和测试


      现在,只需将一块板的Tx引脚连接到另一块板的Rx引脚,将一块板的Rx引脚连接到另一块板的Tx,然后将MKR1000的3.3v电源连接到XMC2Go的3.3v引脚(如果你想的话!),并确保地线也连接。

      注意:我已将3.3v从MKR1000连接到XMC2Go; 这将直接从MKR1000启动XMC2Go。引自XMC2Go引脚图:

    如果电路板通过3.3v引脚供电,则不建议通过USB供电,反之亦然

      这是它们应该看起来的样子:

    16.jpg


      注意:我会建议您首先搭起所有电子部件,当它运行得完美时,然后继续搭建无限镜子。

      如果要测试MKR1000和3D磁传感器套件之间的连接是否正常,请将MKR1000连接到计算机的USB端口,以9600波特打开串行监视器。你应该看到这样:

    17.jpg


      正在发生的事情是3D磁传感器套件正在发送旋钮的角度(从0到360度),MKR1000分析该角度并将其转换为RGB颜色编码(每个从0到255),循环处理所有颜色。旋转旋钮,查看值的变化。

      现在是时候将晶体管连接到MKR1000了。根据此连接图:

    18.jpg


      注意:我使用的是共阳极型RGB LED灯条,Adafruit上的这篇文章对它的设置很有帮助。

      我将晶体管连接在一个单独的小面包板上:

    19.jpg


      连接完所有东西之后:

    20.jpg


      插入LED灯条的12伏电源,以及MKR1000的电源(我假设您已经从MKR1000上的3.3v为XMC2Go供电),LED灯条应该如下那样点亮:

    21.jpg


      旋转旋钮,看到颜色变化:

    22.jpg


    23.jpg


    24.jpg


      一个用旋钮LED灯条变色的视频,循环显示所有颜色:

    GIF2.gif


    制作无限镜子

      现在您已经完成了电子部分并且能够改变RGB LED灯条的颜色,我们继续制作无限镜子本身。

      我不会更详细地介绍这个,因为我不是专家; 这是我第一次做这样的事情,但最终的结果还不是那么糟糕。 我再次在YouTube上看到了这个视频,它确实帮助我搭建了它。

      这些是我如何搭建它的一些图片,只是为了让你明白个大概。

      我已经有了这个木制框架,我在制作PCB时用它作为边框,它作为无限镜子时看起来更好用。


    25.jpg


    25_2.jpg



      框架也有这个透明玻璃,可以删除:

    26.jpg


      但要使无限镜子错觉起作用,需要对玻璃进行着色。要做到这一点,首先需要清洁玻璃:


    27.jpg


      我用这个车窗色调(我从一家汽车店买到的)用肥皂水和一张用于压出气泡的卡片。

    28.jpg


      并将线焊接到带子上并通过镜子中的一个孔将它们取出,以使后镜(稍后将安装)与框架平放。

    29.jpg

    30.jpg


      将LED灯条安装到框架上后(后面没有镜子)测试LED灯条。

    GIF3.gif


      现在换另一个完全反光的镜子,它放在镜架的后面,但因为我现在还没有这个,我只是将镜架(配有RGB LED条带)放在梳妆台镜子前面测试。 最后使用3D磁传感器旋钮更改无限镜子的颜色。

    GIF5.gif


    最后的总结

      所以现在您可以使用旋钮柄和Arduino MKR1000更改RGB LED灯条的颜色。您可以轻松更改XMC2Go中的代码以更改另一种RGB LED的颜色,但是当按下开关时,您还可以添加更多效果。您甚至可以使用相同的旋钮来调暗或照亮另一个LED,只需更改代码即可。

      我找不到一个有多色LED的RGB LED灯条; 我找到的那个有红色,绿色和蓝色LED。使用带有多色LED的RGB灯条会产生更明显的颜色变化,因此如果您找到它们,它们看起来会更好看。

      任何人都可以想出另一种用处,而不是无限镜子,你可以在任何你能想到的东西中使用它。 它可以为您的汽车后备箱,自行车或踏板车照明,或为您的桌子照明,如:


    31.jpg


      请务必评论您对该项目的想法和意见。

    GIF4_.gif


    原理图


    连接示意图
      将代码上传到3D磁传感器套件和MKR1000,并根据此图连接所有内容。

    32.png


    代码

    3D磁传感器代码:
    在Arduino IDE上安装这块板后,上传这个代码到3D磁传感器。
    1. #include <Tle493d_w2b6.h>
    2. const float pi = (22.0 / 7.0);
    3. bool switchPressed;

    4. Tle493d_w2b6 Tle493dMagnetic3DSensor = Tle493d_w2b6();
    5. void setup() {
    6.   Serial.begin(9600);
    7.   Tle493dMagnetic3DSensor.begin();
    8.   Tle493dMagnetic3DSensor.begin();
    9. }

    10. void loop() {
    11.   Tle493dMagnetic3DSensor.updateData();
    12.   delay(100);
    13.   isSwitchPressed();

    14.   float angle = pi + Tle493dMagnetic3DSensor.getAzimuth();
    15.   angle = (angle * 180.0) / pi;

    16.   if (!switchPressed) {
    17.     Serial.println(angle);
    18.   } else if (switchPressed) {
    19.   //Do here whatever you want to do when the switch is pressed
    20.   }
    21. }

    22. void isSwitchPressed() {
    23.   if (Tle493dMagnetic3DSensor.getNorm() < 55) {
    24.     switchPressed = false;
    25.   }
    26.   else if (Tle493dMagnetic3DSensor.getNorm() > 85) {
    27.     switchPressed = true;
    28.   }
    29. }
    复制代码


    Arduino MKR1000代码
    上传这个代码到Arduino MKR1000,并且根据连接示意图连接所有组件(在上传这个代码到XMC2GO)。
    1. float deg;
    2. int pinRed = 2;
    3. int pinGreen = 3;
    4. int pinBlue = 4;

    5. void setup() {
    6.   Serial.begin(9600);
    7.   Serial1.begin(9600);

    8.   pinMode(pinRed, OUTPUT);
    9.   pinMode(pinGreen, OUTPUT);
    10.   pinMode(pinBlue, OUTPUT);
    11. }

    12. void loop() {
    13.   if (Serial1.available() > 0) {
    14.     deg = Serial1.parseFloat();
    15.     setLedColorHSV(deg, 1, 1);
    16.   }
    17. }

    18. void setLedColorHSV(int h, double s, double v) {
    19.   //this is the algorithm to convert from RGB to HSV
    20.   double r = 0;
    21.   double g = 0;
    22.   double b = 0;

    23.   double hf = h / 60.0;

    24.   int i = (int)floor(h / 60.0);
    25.   double f = h / 60.0 - i;
    26.   double pv = v * (1 - s);
    27.   double qv = v * (1 - s * f);
    28.   double tv = v * (1 - s * (1 - f));

    29.   switch (i) {
    30.     case 0:
    31.       r = v;
    32.       g = tv;
    33.       b = pv;
    34.       break;
    35.     case 1:
    36.       r = qv;
    37.       g = v;
    38.       b = pv;
    39.       break;
    40.     case 2:
    41.       r = pv;
    42.       g = v;
    43.       b = tv;
    44.       break;
    45.     case 3:
    46.       r = pv;
    47.       g = qv;
    48.       b = v;
    49.       break;
    50.     case 4:
    51.       r = tv;
    52.       g = pv;
    53.       b = v;
    54.       break;
    55.     case 5:
    56.       r = v;
    57.       g = pv;
    58.       b = qv;
    59.       break;
    60.   }

    61.   //set each component to a integer value between 0 and 255
    62.   int red = constrain((int)255 * r, 0, 255);
    63.   int green = constrain((int)255 * g, 0, 255);
    64.   int blue = constrain((int)255 * b, 0, 255);

    65.   Serial.print("Red: ");    Serial.print(red);
    66.   Serial.print(" Green: "); Serial.print(green);
    67.   Serial.print(" Blue: ");   Serial.print(blue);
    68.   Serial.println();

    69.   analogWrite(pinRed, red);
    70.   analogWrite(pinGreen, green);
    71.   analogWrite(pinBlue, blue);
    72. }
    复制代码








    13.jpg
    已有 1 人评分周年币 收起 理由
    satoll + 700 翻译完成奖励

    总评分: 周年币 + 700   查看全部评分

    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    关闭

    站长推荐上一条 /2 下一条

    手机版|爱板网

    GMT+8, 2018-12-10 22:17 , Processed in 0.304165 second(s), 17 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-5   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001056号

    Powered by Discuz!

    返回顶部