亿迅智能制造网
工业4.0先进制造技术信息网站!
首页 | 制造技术 | 制造设备 | 工业物联网 | 工业材料 | 设备保养维修 | 工业编程 |
home  MfgRobots >> 亿迅智能制造网 >  >> Manufacturing Technology >> 制造工艺

Arduino 遥控飞机 | 100% 自己动手

在本教程中,我将向您展示如何构建基于 Arduino 的 RC 飞机,并且还将向您展示如何使用我在之前的一个视频中构建的自定义构建 Arduino 发射器来控制它。

您可以观看以下视频或阅读下面的书面教程。

概览

所以,这架飞机完全是用聚苯乙烯泡沫塑料制成的。为了制作形状,我使用了我的 Arduino CNC 泡沫切割机,我已经在之前的视频中向您展示了我是如何构建它的。虽然我使用 CNC 机器来制造这架 Arduino RC 飞机,但我仍然可以说它是 100% DIY,因为 CNC 机器也是 DIY 构建的。

此外,飞机的控制也是100% DIY,基于Arduino和无线电通信的NRF24L01模块。

发射器右摇杆可以控制飞机的副翼和升降舵,左摇杆可以控制方向舵和油门。

除此之外,使用右边的电位器我们可以调整控制响应,或者减少伺服行程,使用左边的操纵杆我们可以微调方向舵或调整伺服臂的中立位置。

哦,我差点忘了提,这架 Arduino RC 飞机的主要特点是飞行,所以是的,它可以飞。

设计遥控飞机——3D模型

我首先使用 3D 建模软件(在本例中为 Fusion 360)设计飞机。我通过查看一些商用 RC 飞机并遵循模型飞机参数的一些基本准则或经验法则来进行设计。

起点是臂展,我选择的是80cm。从那里我们得到机身长度,通常是翼展的 75%。至于机翼,或者机翼截面,我选择了 CLARK Y 机翼,这是 RC 飞机的热门选择。

我从 airfoiltools.com 下载了机翼形状为 .SVG 文件,然后将其导入 Fusion 360。我适当调整了大小,使翼弦或机翼在流向方向的长度约为 1/5翼展。

水平和垂直稳定器的尺寸也根据这些基本准则进行调整。以下是一些基本的 RC 模型飞机设计参数:

飞机的机身将由两个 10 毫米的侧面和一个 50 毫米的核心组成,核心是空心的以容纳电子设备。

您可以从上面的链接下载 3D 模型。有两个版本的飞机。版本 1 是图片中显示的版本,版本 2 的机头更小,电机可以更靠前放置以改善气流。

为我的 DIY CNC 泡沫切割机生成 G 代码

现在,由于我的 Arduino CNC 泡沫切割机的工作区域限制为 45cm,而机身长度为 60cm,我不得不将机身分成两部分。

因此,我在距离前点 34 厘米处切割机身,并制作了一个新草图,我在其中投影了形状并在其附近添加了一个点。接下来,在 Fusion 360 的制造选项卡中,我可以生成用于切割形状的 G 代码。

在这里,我首先做了一个新的设置,我选择了草图作为模型,选择了我之前添加的点作为设置的原点,并适当地调整了 X 和 Y 轴。

然后我选择了 2D 轮廓操作并选择或生成了一个直径为 3 毫米的新工具,因为这是热线穿过聚苯乙烯泡沫塑料时所产生的大致切割尺寸。在这里,我们还可以设置切割进给率,这取决于热线本身和聚苯乙烯泡沫塑料的硬度。我将其设置为 150 毫米/米。

然后在几何点击中我们可以选择需要切割的轮廓或形状。至于高度,我将它们全部设置为 1mm,因为我的泡沫切割机上没有任何 Z 轴运动。最后在链接点击中,我选择了入口位置是位于原点附近的边缘。

这样就生成了刀具路径,我们可以通过单击“模拟”按钮来查看它。刀具路径应该是一个闭环单程,如果是这样,我们最终可以生成 G 代码。为此,我们可以进入 Post Processes,选择 GRBL 固件,选择输出文件夹,命名文件并点击 post 按钮。

然后我们可以保存文件,我们可以在写字板编辑器或类似的东西中看到 G 代码。

所以现在一旦我们有了 G 代码文件,我们就可以将它加载到通用 G 代码发送器中,并将 G 代码发送到 CNC 机床上进行成型。

我们可以注意到,我刚刚向您展示的过程可能不是最好的或根本不专业,但它仍然可以让 G 代码与我的 DIY 数控泡沫切割机一起使用。当然,关于这台 DIY 数控机床的更多详细信息,您可以查看我的特定教程,链接在视频描述中。

您可以在此处下载 G 代码文件:

正如我所说,侧面我使用了 1 厘米刻度的聚苯乙烯泡沫塑料,中间我使用了 5 厘米刻度的泡沫塑料。

至于机翼,我使用了 10 厘米刻度的聚苯乙烯泡沫塑料,我将其切割成 30 厘米宽,因为这是我的热线机可以切割的最大跨度。我在单个 G 代码文件中放置了两个机翼轮廓,并剪切了其中的几个。

为了得到 80 厘米的翼展,我将 3 片 27 厘米的胶粘在一起,为了使它们笔直,我手动切断了它们的末端,使它们垂直。

组装遥控飞机

所以这里是我用数控机床切割的所有聚苯乙烯泡沫塑料片。前三片,后三片,机翼三片。现在我可以开始组装它们了。

我将从前面的部分开始。我正在使用胶枪将碎片粘合在一起。热胶将聚苯乙烯泡沫塑料融化了一点,但我仍然可以使用这种方法将它们粘合起来。

另一种粘合聚苯乙烯泡沫塑料的好方法是使用 5 分钟环氧树脂。在粘合另一面之前,我将制作电机支架。为此,我使用了 30 毫米宽的铝型材,重量很轻。我在大约 18 厘米处切割轮廓,标记用于安装电机的孔,并使用 3 毫米钻头钻孔。然后我将轮廓弯曲 90 度。我用一些 M3 螺栓将电机固定在支架上。

使用这个组件,我在聚苯乙烯泡沫塑料的前部打了一个洞。然后用美工刀把孔扩大到直径30mm,和电机直径一样。

接下来,在电机支架的另一侧,我制作了 4 个孔,用于将支架固定到位并连接起落架。我在机身上标记了这些孔的位置,并使用 4 毫米钻头手动在聚苯乙烯泡沫塑料上钻孔。我又做了一个长约 7 厘米的铝片,上面有相同的孔,现在我可以用它来固定电机支架了。

使用 M4 螺栓,我们可以轻松地将电机支架固定到位,而不会损坏聚苯乙烯泡沫塑料。但是,我稍后会这样做,所以我删除了它们并继续粘合另一面。用同样的方法,我也粘上了背面。

接下来就是联姻了,或者说连接机身的前后部分。为了让联系更牢固,我会在它们之间添加简单的烧烤棒。

我建议甚至使用一些更大的棍子,因为当飞机坠毁时,它可能很容易在这里折断。我在连接处加了一些热胶,然后把它们挤在一起。就是这样,机身已经准备好了,我觉得它看起来很酷。

接下来,使用美工刀切割两块 10 毫米长的泡沫聚苯乙烯,它们将是水平和垂直稳定器。我对边缘进行了斜切,这样它们看起来更好,也更符合空气动力学。稳定器将直接粘在机身背面,但在此之前,我会先制作它们的控制器表面。

为此,我剪掉了它们长度的大约 1/3,这将是它们的控制面或水平安定面的升降舵和垂直安定面的方向舵。为了能够将控制面铰接在稳定器上,我需要对它们的接触面进行斜切。再一次,我用一把美工刀来做,实际上我们需要一把非常锋利的刀来清理这些伤口。

我继续使稳定器更符合空气动力学。为此,我使用了砂纸并将它们的前缘弄圆了。我还稍微打磨了后缘。

现在,由于聚苯乙烯泡沫塑料非常脆弱,我将用简单的包装胶带包裹稳定器及其控制表面的整个区域。这不仅可以使零件更坚固,还可以增加空气动力学,因为胶带比聚苯乙烯泡沫塑料本身光滑得多。

包好后,我把舵底部剪成45度角,为电梯腾出空间,让电梯可以自由移动。

现在终于,我可以为它制作铰链了,我再次使用包装胶带。所以,我只是用胶带把这两个部分连接在一起,这样铰链就很牢固了。

我也对水平稳定器重复了这个过程。为了使铰链更加坚固,我们还可以在另一侧添加胶带。使用相同的胶带,我将侧面包裹起来,两个稳定器就完成了。

我继续使用热胶将水平稳定器粘合到机身上。为了固定垂直稳定器,我首先将 3 根烧烤棒插入并粘在水平稳定器和机身上。然后我在它们和接触面上涂了一些热胶,然后用力将稳定器向下推。

这样我们就完成了稳定器,我们可以继续制作机翼了。

所以,正如我已经说过的,由于我的 DIY 数控泡沫切割机的工作区域有限,机翼将由 3 件制成。同样,我使用烧烤棒在粘合碎片时提供额外的强度。为了将它们精确地连接在一起,我使用了一条直木条,我可以在上面滑动这些碎片。

一旦完成,机翼实际上非常脆弱,因为它又长又锡。因此,我会在上面加一根木棍来加固它。我把棍子剪成合适的尺寸,并在需要做口袋的地方标记了翅膀,这样我就可以把棍子放进去。用美工刀,我慢慢地小心翼翼地做了口袋。我在上面加了一些热胶水并将其固定在适当的位置,而不会过多地破坏机翼形状。

现在,在木棍就位的情况下,机翼变得更加坚固。虽然它更坚固,但如果它撞到地面仍然很容易碎裂,所以我会用包装胶带把它包起来,就像我用稳定器做的一样。我开始将胶带从机翼的后缘或后缘添加到前缘或前缘。

这样,从前面进入的空气不会使胶带脱落。虽然这个过程看起来很简单,但如果你没有稳定的双手和足够的耐心,它可能会有点烦人。我认为机翼非常完美。现在它更坚固、更符合空气动力学并且看起来相当不错。

好的,下一步是制作机翼或副翼的控制面。我要让它们宽 22 厘米,长度约为翼弦的 1/4。为了能够自由移动,我剪掉了半厘米左右。

当然,我用切割包住了所有暴露的边缘。接下来,我将副翼的底部倾斜 45 度,以与之前展示的相同的方式,现在我可以将其铰接到机翼上。为了安装在机身上并能够轻松地将机翼连接到机身上,我不得不在机翼中间再做一个凹槽。

接下来,是时候安装用于控制副翼的伺服电机了。我正在使用 9g 微型舵机。我标记了它们将被放置的位置并使用美工刀,我小心地在机翼上开了一个开口,以便伺服可以安装它。同时,我卸下了舵机安装支架,使它们的形状更简单。我在舵机上涂了一些胶水,然后插入了开口处。

使用美工刀,我从伺服系统到机翼中心做了一个小凹槽,这样我就可以将伺服系统接线安装在其中。最后,我用胶带把所有东西都盖住了。我对另一边也重复了同样的过程。

我继续制作控制喇叭。我打算用我以前用来制作电机支架的铝型材来制作它们。我用手绘制形状以大致匹配伺服电机喇叭的高度并悬挂在铰链点上。我用钢锯切割形状。

我将使用 2 毫米钢丝作为控制杆,因此我使用 2.5 毫米钻头在喇叭上开了一个开口。我在副翼上做了一个小凹槽并将喇叭粘在适当的位置。然后我测量了控制杆应该有多长,并在一些钳子的帮助下用 2mm 钢丝制成。需要注意的是,在测量和插入控制杆时,伺服电机需要处于中位。

我们可以通过手动将其放置在其运动范围的中间,或将其连接到伺服测试仪或使用 Arduino 来做到这一点。我对另一边重复了这个过程,这样机翼就完成了。

接下来,我需要安装舵机来控制方向舵和升降舵。我在这里也使用相同的 9g 微型舵机,安装它们的过程实际上与我刚刚解释的几乎相同。首先,我标记了位置,使用美工刀打开了开口,并将两个电机粘合到位。在这里,它们彼此相邻,但输出轴位于另一侧。

再次,我在机身上做了一个小凹槽,以便将伺服系统接线连接到电子隔间。我用一条胶带盖住了伺服系统,并为伺服喇叭开了口。以与前面所示相同的方式,我制作了控制喇叭并使用胶枪将它们粘合到位。最后,我制作了合适的控制杆并相应地安装了它们。

好的,接下来我要安装两根 8 毫米的木棒,用于将机翼固定到机身上。我使用 6 毫米钻头手动打孔。杆应在两侧悬挂约 1 厘米。我还用一些热胶将它们固定在机身上,这就是它们的实际工作方式。

我们使用橡皮筋将机翼固定在机身上。这样,机翼可以很容易地移除,并且在压碎橡皮筋的情况下将显着减少对机翼的冲击。同时组装也很强大。

接下来,我要制作起落架。为此,我将再次使用由聚苯乙烯泡沫塑料制成的铝型材和车轮。如前所示,我使用 CNC 机器制作它们。我在铝型材上做了一些小凹槽,这样我就可以很容易地弯曲它。这是起落架的实际外观。

为了将车轮连接到型材上,我将使用 M5 螺栓和内径为 6 毫米的铝管。管子使用 M5 螺栓和螺母固定在支架上,在侧面,我添加了 M5 垫圈,这样车轮可以围绕管子自由旋转。用同样的方法制作飞机背面的轮子。

好的,现在所有的组件都准备好了,在我组装它们之前,让我们来看看这个项目的电子设备。

Arduino RC 飞机电子 - 电路图

所以,正如我已经说过的,这架 RC 飞机完全基于 Arduino,发射器和接收器都是基于 Arduino Pro Mini 板的定制构建。

我已经有详细的教程如何构建以及发射器和接收器如何工作,因此您可以查看它们以获取更多详细信息。在这里,我将解释这架Arduino RC飞机的电路图和工作原理以及如何连接所有东西。

您可以通过以下链接获取本项目所需的组件:

  • NRF24L01 + PA + LNA …………..……..…….
  • Arduino Pro Mini………………..………….……..
  • 伺服电机……………………………………
  • 无刷电机……………………..……
  • 电调30A…………………………………….…………
  • 锂聚合物电池……………………..………………

因此,无线电通信基于 NRF24L01 模块。虽然看起来有点复杂,但这个 DIY Arduino 发射器实际上非常简单。它有几个控制器、操纵杆、电位器和一些按钮,它不断地将数据发送到接收器。接收器通过 NRF24L01 模块无线接收这些数据,并向舵机和无刷电机输出适当的指令以控制飞机。

用 Arduino 控制舵机和无刷电机也很简单,因此我认为整个 Arduino RC 飞机概念并不难理解。我在这个项目中使用的无刷电机额定电压为 1000KV,需要 30A 电调。 ESC 驱动电机,并通过其输出 5V 的电池消除器电路功能为 Arduino 和伺服系统提供电源。电调和无刷电机的电源来自3S锂聚合物电池。

我为这架飞机增加了一个功能,那就是一个简单的 LED,它会指示电池是否没电。使用一个简单的分压器,我们将来自锂聚合物电池的 12V 电压降至 5V 左右,这样我们就可以使用 Arduino 模拟输入读取它们,从而知道电池何时会降至 11V 以下。接收器仍然有几个空闲通道,所以我们可以根据需要为这架飞机添加更多功能,如频闪灯、襟翼、下降机制等。

完成组装

尽管如此,让我们现在完成组装。所以,我按照电路图中的说明连接了所有东西。通道 1 是方向舵,通道 2 是升降舵,通道 3 和 4 是副翼,通道 6 是 LED。我把 LED 粘在一侧,电源开关粘在另一侧。

我们可以在这里注意到起落架是如何使用电机支架上的两个螺栓连接到飞机上的。简而言之,我简单地从这个顶部开口插入带有支架的电机,如前所示用螺栓固定到位,并连接起落架。插入支架时,我还添加了一些橡皮筋,以便它们可以将电池固定到位。

所以,一旦我将电池连接到 ESC,我就把所有东西都挤进去了。最后,使用延长线,我可以轻松地将机翼副翼连接到接收器,然后将机翼固定到机身上。

在前面,我将螺​​旋桨连接到电机上,现在剩下的就是检查飞机的重心或重心。

CG可能是飞机飞得好还是能飞的最重要的因素。

飞机最初很重,所以我把电池移到前面并增加了一些重量(一些螺栓和螺母),然后它就平衡了。

就是这样,我们基于Arduino的遥控飞机已经完成了,我们可以去外面试试了。

测试 Arduino RC 飞机

好吧,第一次尝试或首飞并不那么酷。尤其是看到暗恋的结果之后。

我在这里得出的结论是,飞机的尾翼仍然很重,感觉电机没有足够的动力。由于我没有其他电机或螺旋桨可以尝试,我将飞机的机头改小了一点,将电机移到了更前面,这样它有更好的气流,并且前部的边缘也变圆了。至于结构,我用一些木棍和铝型材加固它,粘在机身内部。

在电子隔间的底部,我做了两个孔,一个用于从前开口排出的空气,另一个用于将 NRF24L01 天线放在外面以获得电池范围。

好的,这是第二个尝试。再次,几乎相同的东西,虽然感觉它现在有更好的气流或动力。

机身又坏了,这说明这个聚苯乙烯泡沫塑料很弱。我做了一个新机身,这次用了一点胶带加固。

试试第三个。看起来很有希望,但我起飞的地形实际上一点也不好。飞机开始向右移动,撞到路边,又摔断了。

我修复了它,这次几乎用管道和包装胶带包裹了整个机身。我应该早点这样做,因为这为机身提供了适当的强度,即使经过几次挤压也不会断裂。

现在的问题是,经过几次挤压后,我打破了所有 4 个螺旋桨,所以在这次尝试中,我使用了胶合螺旋桨。当然,起飞时螺旋桨撕裂了。

我尝试了另一个由两个已经损坏的螺旋桨制成的胶水螺旋桨,这次我真的很幸运,飞机终于正常起飞了。

好运没持续多久,螺旋桨又在半空中断了。

尽管如此,由于这是我第一次驾驶遥控飞机,我想我可以认为这个项目是成功的,因为我设法证明了制作一个完全基于 Arduino 的系统来控制遥控飞机的概念​​。

除此之外,我们可以从飞行中注意到来自发射器的控制实际上太苛刻了。那是因为摇杆根本不适合这个用途,动作范围小,反应差。

为了解决这个问题,我在程序中添加了一个功能,通过它我们可以使用发射器上的正确电位器来控制控件的响应性。另外,我添加了一个功能,通过它我们可以使用左侧电位器来微调方向舵。

Arduino RC 飞机代码

所以最后,让我们看一下这个基于 Arduino 的 RC 飞机的 Arduino 代码,并结束这个项目。代码与上一篇教程中解释的完全相同,用于使用 NRF24L01 收发器模块控制舵机和无刷电机。

这是这个 Arduino RC 飞机项目的完整代码:

/*
   Arduino RC Airplane
   == Receiver Code =
  by Dejan, www.HowToMechatronics.com
  Library: TMRh20/RF24, https://github.com/tmrh20/RF24/
*/
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
#include <Servo.h>

#define led 9

RF24 radio(3, 2);   // nRF24L01 (CE, CSN)
const byte address[6] = "00001";
unsigned long lastReceiveTime = 0;
unsigned long currentTime = 0;

Servo throttle;  // create servo object to control the ESC
Servo rudderServo;
Servo elevatorServo;
Servo aileron1Servo;
Servo aileron2Servo;


int throttleValue, rudderValue, elevatorValue, aileron1Value, aileron2Value, travelAdjust;
// Max size of this struct is 32 bytes - NRF24L01 buffer limit
struct Data_Package {
  byte j1PotX;
  byte j1PotY;
  byte j1Button;
  byte j2PotX;
  byte j2PotY;
  byte j2Button;
  byte pot1;
  byte pot2;
  byte tSwitch1;
  byte tSwitch2;
  byte button1;
  byte button2;
  byte button3;
  byte button4;
};
Data_Package data; //Create a variable with the above structure
void setup() {
  Serial.begin(9600);
  radio.begin();
  radio.openReadingPipe(0, address);
  radio.setAutoAck(false);
  radio.setDataRate(RF24_250KBPS);
  radio.setPALevel(RF24_PA_MAX);
  radio.startListening(); //  Set the module as receiver
  resetData();
  throttle.attach(10);
  rudderServo.attach(4);   // CH1
  elevatorServo.attach(5); // CH2
  aileron1Servo.attach(6); // CH3
  aileron2Servo.attach(7); // CH4
  pinMode(led, OUTPUT);    // CH6
}
void loop() {
  // Check whether we keep receving data, or we have a connection between the two modules
  currentTime = millis();
  if ( currentTime - lastReceiveTime > 1000 ) { // If current time is more then 1 second since we have recived the last data, that means we have lost connection
    resetData(); // If connection is lost, reset the data. It prevents unwanted behavior, for example if a drone jas a throttle up, if we lose connection it can keep flying away if we dont reset the function
  }
  // Check whether there is data to be received
  if (radio.available()) {
    radio.read(&data, sizeof(Data_Package)); // Read the whole data and store it into the 'data' structure
    lastReceiveTime = millis(); // At this moment we have received the data
  }

  // Controlling throttle - brushless motor with ESC
  throttleValue = constrain(data.j1PotY, 80, 255); // Joysticks stays in middle. So we only need values the upper values from 130 to 255
  throttleValue = map(throttleValue, 80, 255, 1000, 2000);
  throttle.writeMicroseconds(throttleValue);

  // Adjusting the servos responsiveness
  travelAdjust = map(data.pot2, 0, 255, 0, 25);  
  
  // Elevator control
  elevatorValue = map(data.j2PotY, 0, 255, (85 - travelAdjust), (35 + travelAdjust));
  elevatorServo.write(elevatorValue);
  
  // Ailerons control
  aileron1Value = map(data.j2PotX, 0, 255, (10 + travelAdjust), (80 - travelAdjust));
  aileron1Servo.write(aileron1Value);
  aileron2Servo.write(aileron1Value);

  // Rudder trimming function
  if (data.j1PotX > 127) {
    rudderValue = data.pot1 + (data.j1PotX - 127);
  }
  if (data.j1PotX < 127) {
    rudderValue = data.pot1 - (127 - data.j1PotX);
  }
  // Rudder control
  rudderValue = map(rudderValue, 0, 255, (10 + travelAdjust), (90 - travelAdjust));
  rudderServo.write(rudderValue);

  // Monitor the battery voltage
  int sensorValue = analogRead(A3);
  float voltage = sensorValue * (5.00 / 1023.00) * 3; // Convert the reading values from 5v to suitable 12V i
  // If voltage is below 11V turn on the LED
  if (voltage < 11) {
    digitalWrite(led, HIGH);
  }
  else {
    digitalWrite(led, LOW);
  }
}
void resetData() {
  // Reset the values when there is no radio connection - Set initial default values
  data.j1PotX = 127;
  data.j1PotY = 80; // Motors stops // the central point of the joystick is not starting point for the throttle, its at value of 80 instead of 127
  data.j2PotX = 127;
  data.j2PotY = 127;
  data.j1Button = 1;
  data.j2Button = 1;
  data.pot1 = 1;
  data.pot2 = 1;
  data.tSwitch1 = 1;
  data.tSwitch2 = 1;
  data.button1 = 1;
  data.button2 = 1;
  data.button3 = 1;
  data.button4 = 1;
}Code language: Arduino (arduino)

说明: I will just quickly explain the main functions of the code and for all other details you can check the previous tutorial. So, after receiving the data coming from the transmitter, we use the Joystick1 Y axis value for controlling the throttle of the airplane. We convert the values from 80 to 255 coming from the transmitter into values from 1000 to 2000 which are used for controlling the brushless motor.

For controlling the elevator, we use the Joystick2 Y axis value which we convert to values from 85 to 35. These values directly set the position of the servo motor in degrees. Right next to them we can note that we have the travelAdjust variables, which value depends on the position of the right potentiometer. We actually use that value to decrease the position or the movement of the servos although the joysticks will go to their maximum position.

The same principle is applied for controlling the ailerons and the rudder.  Additionally, we use the data from the left potentiometer to adjust the neutral point of the rudder.

Lastly, using the analogRead() function and some math we control the battery voltage indicator LED.

就是这样了。 I would like to hear your thoughts about this project in the comments section below, especially from you who have experience with building and flying RC airplanes. For those who are beginners and thinking of getting into this, I would suggest to check the FliteTest YouTube channel because it’s an amazing resource for learning about this RC world. I will put a link to it in the description.

I hope you enjoyed this project and learned something new. Feel free to ask any question in the comments section below and don’t forget to check my Arduino Projects Collection.


制造工艺

  1. DIY LUMAZOID Arduino 音乐可视化器
  2. 在家制作 DIY 作业书写机
  3. 使用 Arduino Nano RP 2040 的 DIY Photoshop 编辑控制台
  4. 使用 Arduino 和智能手机的 DIY 电压表
  5. DIY 虚拟现实滑板
  6. DIY 10Hz-50kHz 示波器在 128x64 LCD 显示器上
  7. DIY Arduino RADIONICS 治疗MMachine
  8. DIY 2D 运动赛车模拟器
  9. 本地和远程可编程机械臂
  10. 使用 RFID 的 DIY 创意
  11. DIY 3 轴 CNC VMC
  12. DIY Arduino + GY-906 红外测温仪