主题
📦 模块篇 · 电赛单片机不翻页速通手册
📦 模块篇 — 常用电子模块速通:舵机、电机、电机编码器、TB6612、L298N、TCRT5000、HC-SR04、SSD1306、MPU6050、HC-05。
舵机
3:00【模块·舵机】不翻页!速通!电赛教程
电机
4:27【模块·电机】不翻页!速通!电赛教程
电机编码器
7:08【模块·电机编码器】不翻页!速通!电赛教程
javascript
// 示例伪代码
// 全局变量
volatile int count = 0; // 编码器计数
volatile int speed = 0; // 当前速度
// 中断服务函数:计数器更新
void IRQ_Handler() {
// 根据A和B的状态进行计数
if (A_edge == FALLING) {
if (B == 0) {
count++; // B=0,加一
} elseif (B == 1) {
count--; // B=1,减一
}
}
else if (A_edge == RISING) {
if (B == 1) {
count++; // B=1,加一
} else if (B == 0) {
count--; // B=0,减一
}
}
else if (B_edge == RISING) {
if (A == 0) {
count++; // A=0,加一
} else if (A == 1) {
count--; // A=1,减一
}
}
else if (B_edge == FALLING) {
if (A == 1) {
count++; // A=1,加一
} else if (A == 0) {
count--; // A=0,减一
}
}
}
// 定时器中断服务函数:更新速度
void Timer_IRQHandler() {
speed = count; // 计算当前速度(单位为计数值)
count = 0; // 每次定时器中断时清零计数器
}
int main() {
// 初始化部分
pinMode(A_PIN, INPUT); // 设置A引脚为输入
pinMode(B_PIN, INPUT); // 设置B引脚为输入
// 配置A引脚为双沿触发
setInterrupt(A_PIN, BOTH_EDGES, IRQ_Handler);
// 配置B引脚为双沿触发
setInterrupt(B_PIN, BOTH_EDGES, IRQ_Handler);
Timer_Init(TIM1, PERIODIC, 100); // 100ms周期定时器
NVIC_SetIRQHandler(TIM1_IRQn, Timer_IRQHandler); // 配置定时器中断处理函数
while(1) {
// 主循环,处理其他任务 }
}TB6612 电机驱动
6:22【模块·TB6612电机驱动】不翻页!速通!电赛教程
L298N 电机驱动
5:23【模块·L298N电机驱动】不翻页!速通!电赛教程
带稳压的 TB6612 电机驱动
5:45【模块·带稳压TB6612电机驱动】不翻页!速通!电赛教程
TCRT5000 循迹传感器
3:00【模块·TCRT5000循迹传感器】不翻页!速通!电赛教程
HC-SR04 超声波测距传感器
4:43【模块·HC-SR04超声波测距传感器】不翻页!速通!电赛教程
SSD1306 OLED 屏幕
5:58【模块·SSD1306屏幕】不翻页!速通!电赛教程
c++
// 示例库函数代码
#include <Wire.h> // I2C 库
#include <Adafruit_GFX.h> // GFX 库
#include <Adafruit_SSD1306.h> // SSD1306 显示器库
#define SCREEN_WIDTH 128 // OLED 显示宽度
#define SCREEN_HEIGHT 64 // OLED 显示高度
#define OLED_ADDR 0x3C // I2C 地址,默认是 0x3C
#define OLED_RESET -1 // 重置引脚
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET); // 创建 SSD1306 对象,使用 I2C
intmain(void) {
// 初始化硬件
Wire.begin(); // 初始化 I2C 总线
display.begin(SSD1306_SWITCHCAPVCC, OLED_ADDR); // 初始化 SSD1306
display.clearDisplay(); // 清空显示器
display.setTextSize(1); // 设置文字大小
display.setTextColor(SSD1306_WHITE); // 设置文字颜色为白色
delay(1000); // 延时 1 秒
while (1) {
display.clearDisplay(); // 清空显示器
display.setCursor(20, 10); // 设置显示位置
display.println("- LEO -"); // 显示文本
display.display(); // 更新显示
delay(200); // 延时 200 毫秒
}
}MPU6050 六轴姿态传感器
6:16【模块·MPU6050姿态传感器】不翻页!速通!电赛教程
javascript
// 示例伪代码
// 1. 初始化部分
voidI2C_Init() {
// 配置I2C引脚
pinMode(I2C_SCL_PIN, ALT_FUNC_OPEN_DRAIN);
pinMode(I2C_SDA_PIN, ALT_FUNC_OPEN_DRAIN);
// I2C参数配置
i2c_setup(port:0, speed:400kHz); // 使用快速模式
}
// 2. 主程序
intmain() {
I2C_Init();
// 数据缓冲区
uint8_traw_data[14]; // 14字节原始数据(6轴+温度)
int16_t accel[3], gyro[3], temp;
while(1) {
// 从0x3B寄存器开始读取14字节数据
I2C_Read_Reg(dev_addr:0x68, reg:0x3B, buf:raw_data, len:14);
// 解析原始数据 (大端格式)
accel[0] = (raw_data[0]<<8) | raw_data[1]; // X轴加速度
accel[1] = (raw_data[2]<<8) | raw_data[3]; // Y轴加速度
accel[2] = (raw_data[4]<<8) | raw_data[5]; // Z轴加速度
temp = (raw_data[6]<<8) | raw_data[7]; // 温度
gyro[0] = (raw_data[8]<<8) | raw_data[9]; // X轴角速度
gyro[1] = (raw_data[10]<<8)| raw_data[11]; // Y轴角速度
gyro[2] = (raw_data[12]<<8)| raw_data[13]; // Z轴角速度
// 保存数据 (伪代码)
save_to_storage(accel, gyro, temp);
delay(10); // 10ms采样间隔
}
}HC-05 蓝牙模块
9:36