Skip to content

Commit 7d8da4e

Browse files
committed
add Module 4EncoderMotor Example
1 parent 3c799a3 commit 7d8da4e

File tree

1 file changed

+148
-0
lines changed

1 file changed

+148
-0
lines changed
Lines changed: 148 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,148 @@
1+
/**
2+
* @file DriverSample.ino
3+
* @author SeanKwok ([email protected])
4+
* @brief Module 4EncoderMotor Test Demo.
5+
* @version 0.1
6+
* @date 2024-01-19
7+
*
8+
*
9+
* @Hardwares: M5Core + Module 4EncoderMotor
10+
* @Platform Version: Arduino M5Stack Board Manager v2.1.0
11+
* @Dependent Library:
12+
* M5Unified: https://github.com/m5stack/M5Unified
13+
* M5GFX: https://github.com/m5stack/M5GFX
14+
* M5Module4EncoderMotor: https://github.com/m5stack/M5Module-4EncoderMotor
15+
*/
16+
17+
#include "M5Unified.h"
18+
#include "M5GFX.h"
19+
#include "M5Module4EncoderMotor.h"
20+
21+
M5Module4EncoderMotor driver;
22+
23+
#define MAX_RECORD_SIZE 256
24+
25+
float amp_record[MAX_RECORD_SIZE] = {0};
26+
uint8_t record_index = 0;
27+
float amp_value = 0.0f;
28+
29+
uint8_t avg_filter_level = 20;
30+
31+
float avg_filter(float *data, int len) {
32+
float sum = 0;
33+
float min = data[0];
34+
float max = data[0];
35+
for (int i = 0; i < len; i++) {
36+
if (data[i] < min) {
37+
min = data[i];
38+
}
39+
if (data[i] > max) {
40+
max = data[i];
41+
}
42+
sum += data[i];
43+
}
44+
sum -= min;
45+
sum -= max;
46+
return sum / (len - 2);
47+
}
48+
49+
void setup() {
50+
M5.begin();
51+
M5.Display.begin();
52+
53+
M5.Display.setTextColor(WHITE);
54+
M5.Display.setTextDatum(top_center);
55+
M5.Display.setFont(&fonts::FreeSansBold12pt7b);
56+
M5.Display.setTextSize(1);
57+
58+
while (!driver.begin(&Wire, MODULE_4ENCODERMOTOR_ADDR, 21, 22)) {
59+
Serial.println("Driver Init faild!");
60+
M5.Display.drawString("Driver Init faild!", 160, 7);
61+
delay(1000);
62+
}
63+
64+
Serial.println("Driver Init success!");
65+
M5.Display.clear();
66+
M5.Display.fillRect(0, 0, 320, 35, 0x27f);
67+
M5.Display.drawString("4Encoder Motor", 160, 7);
68+
M5.Display.setTextDatum(top_left);
69+
70+
// motor channel 0 -3
71+
for (uint8_t i = 0; i < 4; i++) {
72+
driver.setMode(i, NORMAL_MODE);
73+
driver.setMotorSpeed(i, 127);
74+
}
75+
M5.Display.drawString("NORMAL MODE", 20, 40 + 35 * 5);
76+
}
77+
78+
bool direction = true;
79+
int mode = NORMAL_MODE;
80+
81+
void loop() {
82+
M5.update();
83+
for (uint8_t i = 0; i < 4; i++) {
84+
M5.Display.fillRect(20, 40 + 35 * i, 300, 35, BLACK);
85+
int32_t encoder_value = driver.getEncoderValue(i);
86+
M5.Display.drawString("CH" + String(i) + ": " + String(encoder_value),
87+
20, 40 + 35 * i);
88+
}
89+
90+
if (avg_filter_level != 0) {
91+
amp_record[record_index] = driver.getMotorCurrent();
92+
record_index++;
93+
if (record_index >= avg_filter_level) {
94+
record_index = 0;
95+
}
96+
amp_value = avg_filter(amp_record, avg_filter_level);
97+
}
98+
99+
float voltage = driver.getAnalogInput(_8bit) / 255.0 * 3.3 / 0.16;
100+
float current = amp_value;
101+
102+
M5.Display.fillRect(20, 40 + 35 * 4, 300, 35, BLACK);
103+
M5.Display.drawString(
104+
"POWER: " + String(voltage) + "V/" + String(current) + "A", 20,
105+
40 + 35 * 4);
106+
107+
if (M5.BtnA.wasClicked() ||
108+
(M5.Touch.getCount() && M5.Touch.getDetail(0).wasClicked())) {
109+
mode++;
110+
if (mode > SPEED_MODE) {
111+
mode = NORMAL_MODE;
112+
}
113+
M5.Display.fillRect(20, 40 + 35 * 5, 300, 35, BLACK);
114+
115+
switch (mode) {
116+
case NORMAL_MODE: {
117+
M5.Display.drawString("NORMAL MODE", 20, 40 + 35 * 5);
118+
// motor channel 0 -3 NORMAL_MODE
119+
for (uint8_t i = 0; i < 4; i++) {
120+
driver.setMode(i, NORMAL_MODE);
121+
driver.setMotorSpeed(i, 127);
122+
}
123+
break;
124+
}
125+
case POSITION_MODE: {
126+
M5.Display.drawString("POSITION MODE", 20, 40 + 35 * 5);
127+
// motor channel 0 -3 POSITION_MODE
128+
129+
for (uint8_t i = 0; i < 4; i++) {
130+
driver.setMode(i, POSITION_MODE);
131+
driver.setEncoderValue(i, 0);
132+
driver.setPostionPIDMaxSpeed(i, 127);
133+
driver.setPositionPoint(i, 1000);
134+
}
135+
break;
136+
}
137+
case SPEED_MODE: {
138+
M5.Display.drawString("SPEED MODE", 20, 40 + 35 * 5);
139+
// motor channel 0 -3 SPEED_MODE
140+
for (uint8_t i = 0; i < 4; i++) {
141+
driver.setMode(i, SPEED_MODE);
142+
driver.setSpeedPoint(i, 127);
143+
}
144+
break;
145+
}
146+
}
147+
}
148+
}

0 commit comments

Comments
 (0)