驴友花雕 发表于 2025-5-31 16:59:47

【Arduino 动手做】可以用伺服器控制的盘子 : 平衡板游戏

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

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





驴友花雕 发表于 2025-5-31 17:06:35

【Arduino 动手做】可以用伺服器控制的盘子 : 平衡板游戏

本教程是为了满足南佛罗里达大学 Makecourse 的项目要求而创建的(www.makecourse.com)

你好,我叫拉米·穆尼尔 (Ramy Mounir),是一名学生创客,就读于南佛罗里达大学 2015 年秋季的 MAKE 课程。我使用 Arduino 作为微控制器,制作了一个可以用伺服器控制的盘子。它有三种操作模式,适合 0 到 2 人。0 人模式是让盘子自行保持平衡,无论你如何移动盒子,盘子始终保持水平!单人模式是使用操纵杆将球保持在盘子上。最后一种模式与前一种类似;但是,两名玩家可以使用闪光灯来移动盘子。

在本教程中,我将向您介绍如何构建这个令人敬畏的项目。



驴友花雕 发表于 2025-5-31 17:08:13

【Arduino 动手做】可以用伺服器控制的盘子 : 平衡板游戏

## 步骤1:组件

对于这个项目,您将需要:

1个Arduino Uno

1个面包板

1个操纵杆模块

2个伺服电机

2个光电管

1x 3轴加速度计/陀螺仪(MPU 6050)

2x 330欧姆电阻

1 个 9V 电池组,带开/关开关

别忘了电线……















驴友花雕 发表于 2025-5-31 17:10:12

【Arduino 动手做】可以用伺服器控制的盘子 : 平衡板游戏

## 第 2 步:3D 打印部件

我已附上在 SolidWorks 上建模的 3D 零件。所有零件均已考虑公差。所有零件均使用 PLA 材料 3D 打印,并选择您想要的颜色。

我用螺栓和螺母把伺服支架固定在盒子上,其实没必要。强力胶比3D打印部件的强度更高,所以用强力胶把固定部件粘上。

使用装配文件中的尺寸连接零件。



驴友花雕 发表于 2025-5-31 17:12:08

【Arduino 动手做】可以用伺服器控制的盘子 : 平衡板游戏

## 步骤3:控制系统

控制系统
Arduino 从红色方框中的传感器获取信号,并计算出 PWM 信号,发送给执行器(绿色方框中的伺服电机)。伺服电机控制板的方向。

将加速度计的实际信号与期望值进行比较,并乘以一个恒定的比例因子来移动伺服器。

光电管采用相同的比例控制系统。

操纵杆输入信号到arduino被映射以输出合适的PWM信号。(这里没有应用比例控制系统)



驴友花雕 发表于 2025-5-31 17:13:24

【Arduino 动手做】可以用伺服器控制的盘子 : 平衡板游戏

## 步骤4:接线

接线
接线与附图完全相同。

光电管通过 330 欧姆电阻连接到分压电路中。(A0 和 A1)

加速度计连接到 A4 和 A5(SDA 和 SCL)。

操纵杆连接到A2和A3。

两个伺服器连接到 PWM 数字引脚 3 和 5。



驴友花雕 发表于 2025-5-31 17:14:30

【Arduino 动手做】可以用伺服器控制的盘子 : 平衡板游戏

## 步骤5:Arduino代码

注释的 arduino 草图附于此步骤。

草图分为两个选项卡:主选项卡和功能选项卡。

主选项卡本质上是循环函数中的一个 switch case。它调用模式检查函数,并根据模式检查函数的返回结果转到正确的 case。

功能选项卡包含 5 个功能:

setplane(); // 该函数在设置函数中将平面设置为水平

checkbuttons(); // 此函数检查我们处于哪种模式。如果操纵杆不在正常位置,它将返回相应的案例编号。同样,如果它检测到的光照值大于指定值,它将返回一个不同的案例编号。如果没有检测到任何内容,则将激活默认案例。

followlight(); // 使用比例控制系统根据期望光值和实际光值之间的误差保持光电管和手电筒之间的特定距离。

balance(); // 与 followlight() 功能相同,但使用加速度计值而不是光值。

followjoystick(); //将操纵杆的输入信号映射到伺服电机的输出 pwm 信号。

////////////////////////////////////////////////////////////////////////////*********** beggining of code***********/////////////////////////////////////////////////////////
#include <Servo.h>
#include<Wire.h>

int initial_photo1;   //defining integers
int initial_photo2;
int initial_photo;
int desired1;
int desired2;
int button;

Servo servox;         // defining objects
Servo servoy;

const int MPU = 0x68; // I2C address of the MPU-6050
int16_t AcX, AcY;


void setup() {

initial_photo1 = analogRead(A0);   // setting initial values for automatic calibration
desired1 = initial_photo1 +100;
initial_photo2 = analogRead(A1);
desired2 = initial_photo2 +100;
initial_photo = max(initial_photo1, initial_photo2);// comparing values and storing the maximum
button = checkbuttons();// check which mode are in

servox.attach(5);// attaching servos
servoy.attach(3);
setplane();   // initial setting plane to horizontal
Serial.begin(9600);// initiating serial communication

Wire.begin();// begin I2C communication
Wire.beginTransmission(MPU); //begin transmission of bytes
Wire.write(0x6B);// PWR_MGMT_1 register
Wire.write(0);   // set to zero (wakes up the MPU-6050)
Wire.endTransmission(true); // end transmission of bytes


}

void loop() {
checkbuttons();// check for mode

switch (button) {
    case 1:

      while ((analogRead(A0) > initial_photo + 5) && (analogRead(A1) > initial_photo + 5))// stay in this loop until the light goes back to initial
      {
      followlight(); // follow light program
      }

      break;

    case 2:
      while ((analogRead(A2) / 8 != 63)|| (analogRead(A3) / 8 != 63))// while joystick is not in zero position
      {
      followjoystick();// follow the joystick program
      }
      break;

    default:

      balance(); // Keep balancing the plate as a default mode

      break;

}
}


驴友花雕 发表于 2025-5-31 17:15:43

【Arduino 动手做】可以用伺服器控制的盘子 : 平衡板游戏

## 第六步:最终项目

最终项目
如果你一步一步按照这个教程操作,你应该能完成一个像我一样的项目(见附图)。如果你有任何疑问,请留言。祝你玩得开心,好运连连!



驴友花雕 发表于 2025-5-31 17:18:11

【Arduino 动手做】可以用伺服器控制的盘子 : 平衡板游戏

附录
项目链接:https://www.instructables.com/Balancing-Plate-Game-Ramy-Mounir-MAKE-Course/
项目作者:拉米·穆尼尔 (Ramy Mounir)
项目视频(3分钟):https://www.youtube.com/watch?v=M2et4XJb3e4&t=3s
项目代码:https://content.instructables.com/FOQ/GOSX/IHWIPK8J/FOQGOSXIHWIPK8J.zip
3D文件:https://content.instructables.com/FY6/WM6F/IHWIPG4O/FY6WM6FIHWIPG4O.zip





页: [1]
查看完整版本: 【Arduino 动手做】可以用伺服器控制的盘子 : 平衡板游戏