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

2025-05-3147
AI 快速预览详细 收起
本教程介绍了如何使用Arduino制作一个可以用伺服器控制的平衡板游戏。项目包括3D打印部件、接线和代码编写。该平衡板有三种操作模式:自动平衡、单人操纵杆控制和双人光电管控制。通过这个项目,你可以学习到传感器控制、伺服电机应用以及PID控制等技术。

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

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

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

 

00.jpg

## 步骤1:组件

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

1个Arduino Uno

1个面包板

1个操纵杆模块

2个伺服电机

2个光电管

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

2x 330欧姆电阻

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

别忘了电线……

 

01.jpg
01-.jpg
01-1.jpg
01-2.jpg
01-3.jpg
01-4.jpg
01-5.jpg

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

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

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

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

 

02.jpg

 

Arduino 动手做 · 伺服器控制的平衡板游戏_image_1.webp

## 步骤3:控制系统

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

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

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

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

 

03.jpg

## 步骤4:接线

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

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

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

操纵杆连接到A2和A3。

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

 

04.jpg

## 步骤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;

  }
}

## 第六步:最终项目

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

 

05.jpg

附录
项目链接: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

 

Arduino 动手做 · 伺服器控制的平衡板游戏_image_2.webp
Arduino 动手做 · 伺服器控制的平衡板游戏_image_3.webp

创作许可协议

本项目采用 None(不开放任何权利,保留所有权利) 进行许可。

评论(0)
- 没有更多了 -