Potentiometer + Servo + OLED

电位器 + OLED + SG90 舵机联动验证

前两条视频是在电脑上敲串口命令控制舵机,这条拔掉键盘,拧旋钮就能控制。旋钮转多少 → 舵机转多少 → OLED 屏上显示多少,因果链一目了然。

更新于 2026-08-12分类:电机与控制电位器:T1506 / O63舵机:I56 (SG90 180°)OLED:I61 (SSD1306)开发板:Arduino UNO R3
Arduino 代码下载包含实物验证通过的 pot_servo_oled.ino,可直接烧录。
下载 .ino 文件

一句话结论

Arduino UNO 读取 A1 电位器 → map 成 0~180° → D9 控制 SG90 舵机 → I2C OLED 实时显示 ADC 和角度。

电位器、OLED、SG90 舵机、串口输出四项全部正常,pot_servo_oled.ino 已实物验证通过。

验证状态

✓电位器读取
✓OLED 显示
✓SG90 舵机
✓整体联动

测试记录:G:\06_AI学习\04_ArduinoUNO\02_电位器_OLED_角度控制\测试记录\2026-08-11_pot_servo_oled_验证通过.md

接线

元件SKU引脚备注
电位器T1506 / O63A1⚠ 不是 A0,A0 留给 4 键电阻分压模块
舵机I56 (SG90 180°)D9红线接外部 5V,棕线接外部电源负极 + UNO GND 共地
OLEDI61 (SSD1306)A4/A5 (硬件 I2C)接 B302 扩展板专用 IIC 接口,地址 0x3C

⚠ 舵机不能长期吃 UNO 板载 5V——SG90 动起来电流冲击可能导致 UNO 重启或 OLED 闪屏。建议舵机单独 5V 供电,和 UNO 共 GND。

硬件说明

本项目的验证结论是"拧多少 → 转多少 → 屏上显示多少"这条因果链成立。

  • 电位器范围:实测 T1506 旋钮行程约 0~342(不到 1023 也没关系,map() 自动处理)
  • 舵机角度限制:ANGLE_MIN=10, ANGLE_MAX=170,避免顶到头导致抖动或发热
  • OLED 显示内容:大字角度 + 小字 ADC 原始值 + 百分比,映射关系一目了然

Arduino 代码

pot_servo_oled.ino
/*
 * 电位器 -> 舵机 + OLED · Arduino UNO R3
 *
 * A1 电位器 → D9 SG90 舵机 → I2C OLED 显示
 */

#include <Servo.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

#define POT_PIN      A1
#define SERVO_PIN    9
#define SCREEN_WIDTH  128
#define SCREEN_HEIGHT 64
#define OLED_ADDR     0x3C
#define DEADBAND      4
#define ANGLE_MIN     10
#define ANGLE_MAX     170

Servo sg90;
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);

int angle = 90;
int lastRaw = -999;

void setup() {
  Serial.begin(115200);
  if (!display.begin(SSD1306_SWITCHCAPVCC, OLED_ADDR)) {
    Serial.println(F("OLED FAIL")); while (1);
  }
  display.setTextColor(SSD1306_WHITE);
  sg90.attach(SERVO_PIN, 500, 2400);
  sg90.write(angle);
}

void loop() {
  int raw = analogRead(POT_PIN);
  if (abs(raw - lastRaw) > DEADBAND) {
    angle = map(raw, 0, 1023, ANGLE_MIN, ANGLE_MAX);
    angle = constrain(angle, ANGLE_MIN, ANGLE_MAX);
    sg90.write(angle);
    lastRaw = raw;
  }

  display.clearDisplay();
  display.setTextSize(1);
  display.setCursor(0, 0);
  display.println(F("Pot -> Servo"));
  display.drawFastHLine(0, 10, SCREEN_WIDTH, SSD1306_WHITE);
  display.setTextSize(3);
  display.setCursor(28, 22);
  display.print(angle);
  display.setTextSize(1);
  display.setCursor(0, 56);
  display.print(F("ADC:")); display.print(raw);
  display.print(F(" ang:")); display.print(angle);
  display.display();
  delay(50);
}

完整源码下载见页面顶部下载区域。

串口输出格式

波特率 115200,只在角度变化时打印:

ADC=535  ang=94
ADC=547  ang=96
ADC=560  ang=98

死区参数

电位器读数天然有噪声(ADC 最后一两位一直在跳),不做处理舵机可能在原地小幅抖动。

代码顶部定义了 DEADBAND = 4:ADC 变化小于 4 就不动舵机,仅刷新 OLED 画面。观众看到 ADC 数字在跳动、但舵机纹丝不动——正好是讲死区原理的最佳展示。

实测结论:死区 = 4 够用,不会误触发。视频拍摄时会实际观察抖不抖再回填记录。

视频与发布

B站验证短片:42 秒,展示电位器 → OLED → SG90 联动全过程。

包含:实物全景 → 烧录证明 → 慢拧主镜头 → 定角度停顿 → 快速响应 → 验证汇总。

资料下载与参考

  • Arduino 代码:pot_servo_oled.ino(页面顶部下载按钮)
  • 测试记录:见项目文件夹 测试记录\2026-08-11_pot_servo_oled_验证通过.md
  • 拍摄清单:见项目文件夹 拍摄清单.md

⚠ 未实测标注:死区参数的效果(会不会抖)尚未实测,拍摄时会实际观察再回填。本页不写未验证的结论。

返回首页 电机与控制 SG90 180度 vs 360度对比