部分电机无法知道当前运行状态处于第几圈,通过加装电阻电位器简单实现电机的状态监控
实现思路:
使用nodemcu32s作为i2c主机,arduino pro micro和adafruit motor featurewing电机驱动板作为i2c从机,Arduino负责读取10k电阻电位器的值,通过i2c传输给主机;主机一边接收arduino数据,一边驱动电机运动
程序运行环境:
macOS+vscode+platformIO
I2C
简介:
和计算机的sata协议、nvme协议一样,是单片机数据传输的总线协议。
i2c包含一个主机master,一个或多个从机slave,SDA数据线,SCL时钟线。
特点:
- 半双工,SDA线是可以双向传输的
- 主机控制数据的接受和发送,切换
- 通信速率由主机SCL线控制
- 以字节byte(8位)传输
- 多从机需要使用上拉电阻,抗干扰能力差
接线:
PS | nodemcu32s | arduiino pro micro | 电位器 | motor featherwing |
---|---|---|---|---|
SDA | P21(GPIO21) | 2 | 左上1 | |
SCL | P22(GPIO22) | 3 | 左下2 | |
21(A3) | 2 | |||
vcc | 1 | |||
gnd | 3 |
各模块引脚图
NodeMCU-32s
aruidno micro pro
Adafruit Motor Featherwing
10k电阻电位器
DC直流电机
代码:
NodeMCU 32s(主机):
#include <Arduino.h>
#include <Wire.h>
#include <stdlib.h>
#include <Adafruit_MotorShield.h>
//定义esp32的i2c引脚、arduino的从机地址、电机驱动板的从机地址
#define SDA_PIN 21
#define SCL_PIN 22
#define ARDUINO_SLAVE_ADDR 0x04
#define MOTOR_SLAVE_ADDR 0x60
//创建线程任务句柄,esp32有两个核心,我准备使用核心0来控制电机,核心1接收arduino数据
TaskHandle_t Task1;
//初始化电机驱动板的地址和端口
Adafruit_MotorShield AFMS &