一句话结论
Arduino UNO 读取 A1 电位器 → map 成 0~180° → D9 控制 SG90 舵机 → I2C OLED 实时显示 ADC 和角度。
电位器、OLED、SG90 舵机、串口输出四项全部正常,pot_servo_oled.ino 已实物验证通过。
验证状态
测试记录:G:\06_AI学习\04_ArduinoUNO\02_电位器_OLED_角度控制\测试记录\2026-08-11_pot_servo_oled_验证通过.md
接线
| 元件 | SKU | 引脚 | 备注 |
|---|---|---|---|
| 电位器 | T1506 / O63 | A1 | ⚠ 不是 A0,A0 留给 4 键电阻分压模块 |
| 舵机 | I56 (SG90 180°) | D9 | 红线接外部 5V,棕线接外部电源负极 + UNO GND 共地 |
| OLED | I61 (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 代码
/*
* 电位器 -> 舵机 + 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
⚠ 未实测标注:死区参数的效果(会不会抖)尚未实测,拍摄时会实际观察再回填。本页不写未验证的结论。