【记录】香橙派AI Pro|GPIO入门教程,接SG90 180度舵机,从接线到识别设备并读取结果
本文介绍了基于香橙派AI Pro控制SG90舵机的详细方法。通过官方文档、大模型和SG90说明书,作者明确了舵机的工作参数:5V电源、PWM接口和GND接地线。文章提供了完整的驱动代码,包括角度控制、持续时间设置和参数校验功能,支持-90到90度范围的运动控制。代码采用C语言编写,使用wiringPi库,包含精确的PWM信号生成和严格的安全限制。同时提供了编译方式(命令行和Makefile)及使用
如果这篇看不懂的话,可以先看这篇,更加小白:【记录】香橙派AI Pro|GPIO入门教程,接AM2302(DHT22)温湿度传感器,从接线到识别设备并读取结果-CSDN博客
由于我已经有接第一个设备的经验了,本文主要也就是记录一下SG90的参数以及写的驱动代码,对于具体原理基本上没讲。
基础资源
主要以下三方面:
-
大模型:我主要问Deepseek(不深度思考版本)。
-
SG90说明书:这种廉价且常见的元件一般卖家都不会提供说明书,即使提供了也是网上直接搜的,但网上一搜就能搜出来。这里提供一个在线下载地址舵机控制例程_免费高速下载|百度网盘-分享无限制。
通过文档搞清楚自己需要了解什么具体概念,比如GPIO、电源和GND引脚,SDA、SCL、UTX、URX、PWM等通信协议,SG90这个工作模块的工作电压、接线要求、传输方案和是否需要并联电阻等。
SG90参数
三个接口:
- 电源:5V
- 数据:PWM接口
- 接地线:GND接口
我选择了这三个(蓝框打勾的):
接完线的实物图是这样:
驱动代码
代码说明
主要直接把使用说明丢给大模型让大模型写的,SG90舵机控制程序接口功能说明如下:
功能描述:
- 本程序通过树莓派GPIO控制SG90舵机,实现精确角度定位和持续时间控制。
输入参数:
- 目标角度:-90到90之间的整数,负值为左转,正值为右转
- 持续时间:毫秒级持续时间,最小100ms,最大60000ms(1分钟)
输出效果:
- 舵机旋转到指定角度
- 保持指定毫秒数后停止
技术参数:
- PWM周期:20ms (50Hz)
- 脉冲宽度范围:0.5ms(-90°) ~ 2.5ms(90°)
- 线性映射:角度与脉宽严格线性对应
- 控制精度:约0.18°/步(180°/1000步)
接线说明:
- 橙色线(Signal):GPIO19(WiringPi编号)
- 红色线(VCC):5V
- 棕色线(GND):接地
代码主体
#include <wiringPi.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#define SERVO_PIN 19 // WiringPi编号19,对应PWM3
// 舵机技术参数(根据文档精确设置)
#define PWM_PERIOD_MS 20 // 20ms周期(文档要求)
#define MIN_PULSE_US 500 // 0.5ms最小脉冲(文档图1)
#define MAX_PULSE_US 2500 // 2.5ms最大脉冲
#define NEUTRAL_PULSE_US 1500 // 1.5ms中位脉冲
// 安全限制(防止损坏舵机)
#define MIN_ANGLE -90
#define MAX_ANGLE 90
#define MIN_DURATION_MS 100 // 最小持续时间100ms
#define MAX_DURATION_MS 60000 // 最大持续时间60秒
// 设置舵机角度(带参数校验)
void set_servo_angle(int angle) {
// 严格限制角度范围(文档第1页)
if (angle < MIN_ANGLE) angle = MIN_ANGLE;
if (angle > MAX_ANGLE) angle = MAX_ANGLE;
// 精确脉冲计算(文档公式)
int pulse_width = NEUTRAL_PULSE_US + angle * (MAX_PULSE_US - MIN_PULSE_US) / 180;
// 生成PWM信号(文档描述的20ms周期)
digitalWrite(SERVO_PIN, HIGH);
usleep(pulse_width);
digitalWrite(SERVO_PIN, LOW);
usleep(PWM_PERIOD_MS * 1000 - pulse_width);
}
int main(int argc, char *argv[]) {
// 初始化检查
if (wiringPiSetup() == -1) {
fprintf(stderr, "错误: WiringPi初始化失败\n");
return EXIT_FAILURE;
}
// 参数验证
if (argc != 3) {
printf("用法: %s <角度(-90~90)> <持续时间(ms)>\n", argv[0]);
printf("示例: %s 45 1500 (45度保持1.5秒)\n", argv[0]);
return EXIT_FAILURE;
}
int angle = atoi(argv[1]);
int duration_ms = atoi(argv[2]);
// 参数范围检查
if (angle < MIN_ANGLE || angle > MAX_ANGLE) {
fprintf(stderr, "错误: 角度超出范围(%d到%d度)\n", MIN_ANGLE, MAX_ANGLE);
return EXIT_FAILURE;
}
if (duration_ms < MIN_DURATION_MS || duration_ms > MAX_DURATION_MS) {
fprintf(stderr, "错误: 持续时间超出范围(%d到%d毫秒)\n",
MIN_DURATION_MS, MAX_DURATION_MS);
return EXIT_FAILURE;
}
// 设置GPIO模式(文档要求的数字控制)
pinMode(SERVO_PIN, OUTPUT);
digitalWrite(SERVO_PIN, LOW);
printf("控制参数:\n");
printf("目标角度: %d度\n", angle);
printf("持续时间: %d毫秒\n", duration_ms);
printf("开始控制...\n");
// 计算需要循环的次数(文档建议的20ms周期)
int loops = duration_ms * 1000 / (PWM_PERIOD_MS * 1000);
for(int i = 0; i < loops; i++) {
set_servo_angle(angle);
}
printf("控制完成\n");
return EXIT_SUCCESS;
}
编译方式
命令行
gcc -Wall -o sg90 sg90.c -lwiringPi
Makefile
# 编译器设置
CC = gcc
CFLAGS = -Wall
LDFLAGS = -lwiringPi
# 目标文件
TARGETS = sg90
# 源文件
SG90_SRC = sg90.c
all: $(TARGETS)
sg90: $(SG90_SRC)
$(CC) $(CFLAGS) -o $@ $< $(LDFLAGS)
clean:
rm -f $(TARGETS)
.PHONY: all clean
使用方式
# 转动到45度并保持2秒
./sg90 45 2000
# 回到中立位置(0度)
./sg90 0 1000
总结
本指南详细介绍了如何在Orange Pi开发板上驱动SG90舵机。通过理解PWM控制原理和舵机工作特性,我们实现了一个安全可靠的驱动程序。关键点包括:
硬件连接:正确识别电源、地和信号线,确保5V稳定供电
参数匹配:严格遵循20ms周期和0.5-2.5ms脉宽规范
软件控制:使用wiringPi库实现精确的定时控制
安全设计:多重保护机制防止舵机过载损坏
此方案不仅适用于SG90舵机,也可作为其他PWM设备控制的基础框架。通过调整脉冲参数,可适配不同规格的舵机设备。这种硬件控制方法在机器人、自动化控制等领域有广泛应用前景。
通过本项目的实践,读者可以掌握嵌入式系统中PWM设备控制的核心技术,为更复杂的物联网和自动化项目打下坚实基础。
本账号所有文章均为原创,欢迎转载,请注明文章出处:https://shandianchengzi.blog.csdn.net/article/details/149668157。百度和各类采集站皆不可信,搜索请谨慎鉴别。技术类文章一般都有时效性,本人习惯不定期对自己的博文进行修正和更新,因此请访问出处以查看本文的最新版本。
更多推荐

所有评论(0)