引子
继续前面的改造
电子计数跳绳原型-CSDN博客文章浏览阅读443次,点赞3次,收藏8次。摘要:作者尝试用3D打印和编程实现跳绳计数功能,采用Arduino Nano和两个霍尔传感器搭建原型系统。通过调试程序(含去抖动处理)和万用表检测,最终成功实现旋转计数。实验发现AI生成的初版代码仍需人工优化,并总结了老款Nano需选旧Bootloader的上传问题。未来计划改用ESP32-C3开发板,并进一步研究PCB设计,最终实现完整的跳绳手柄定制开发。(149字)
https://blog.csdn.net/zfive5/article/details/149004730?spm=1001.2014.3001.5501
这次主要改进了两点:
1、之前3D打印的跳绳轴承支架放在面包板,实验起来有些不牢固,使用过程中还的扶着
2、把ariduino nano改成了esp32 c3,
a)nano板子有些大,将来塞入跳绳手柄里尺寸有些尴尬。esp32 c3 supper mini的板子+led在尺寸上看好解决了接下来的尺寸的问题,如果不行将来独立设计PCB也完全可行。
b)esp32 c3 有蓝牙和WiFi功能,将来产品和手机APP互动成为可能。
c)支持一下国产芯片,比较我们这个也不输入外国的芯片。
本次改造结果图:
正文
问题1:跳绳轴承支架加固
就是把之前的卡着的设计 ,改成面包插入的设计。
跳绳轴承支架的3D打印图如下:
也终于把我去年剩下的绿色+蓝色的料都完美用完了
卡着面包板上,真的挺合适的。也买了一本freecad的书再系统的学习一下。
问题2:替代为esp32C3
通过aridiuno的IDE编写esp32C3的程序大费周章。的确没有直接用aridiuno nano 容易,而且搭出电路后,又彻夜未眠(记得2个月前写AI应用的时候搞了一个通宵)
esp32c3 的板子分有串口和没有串口上传的能力,我选用的supper mini版就是没有的,所有必须
1) 按Boot ->按 Reset ->松 Reset-> 松 boot的方式才能上传程序
2)led的操作,之前的一直显示不出来,最后只能使用上开发版的例子程序改了一下才可以,到现在我都不知道是怎样操作的,只能后续再仔细研究了。
3)用esp32c3的模拟接口读霍尔传感器简直就是噩梦,
同样的位置,一会800,一会1200,简直了,最后把5V的输入,直接改成3V的输入,一切都立马变成一马平川顺利。
#include <Arduino.h>
#include <U8g2lib.h>
#include <Wire.h>
#define led 8
// IIC OLED 初始化(适用于 ESP32-C3)
U8G2_SSD1306_72X40_ER_1_SW_I2C u8g2(U8G2_R0, 6, 5, U8X8_PIN_NONE);
// 模拟引脚定义(两个传感器平分圆,相距180度)
const int hallA = 0; // 使用 ESP32-C3 的 ADC 引脚 A0 -> GPIO0
const int hallB = 1; // 使用 ESP32-C3 的 ADC 引脚 A1 -> GPIO1
// 参数设置
const int threshold = 1640; // 磁场阈值(根据实际校准)
const int debounceDelay = 5; // 去抖动时间(毫秒)
// 变量声明
long totalRevolutions = 0; // 总圈数(整数)
int lastTriggered = 0; // 上次触发的传感器(0: 无,1: A,2: B)
void setup() {
pinMode(hallA, INPUT);
pinMode(hallB, INPUT);
u8g2.setContrast(250); // 设置对比度
u8g2.begin();
u8g2.setFont(u8g2_font_ncenB18_tr); // 更适合小屏的字体
}
void loop() {
static long lastRev = -1;
if (totalRevolutions != lastRev) {
char buffer[16];
sprintf(buffer, "%ld", totalRevolutions);
u8g2.clearBuffer();
u8g2.firstPage();
do {
u8g2.drawStr(2,30,buffer);
} while ( u8g2.nextPage() );
u8g2.sendBuffer();
lastRev = totalRevolutions;
}
checkHall(); // 检测并更新状态
delay(5); // 控制刷新频率
}
// 获取当前状态(转换为高低电平)
int getState(int pin) {
int val = readMedian(pin);
return (val < threshold) ? LOW : HIGH;
}
// 防抖读取数据
int readMedian(int pin) {
int values[5];
for (int i = 0; i < 5; i++) {
values[i] = analogRead(pin);
delay(2);
}
// 排序
for (int i = 0; i < 4; i++) {
for (int j = i + 1; j < 5; j++) {
if (values[i] > values[j]) {
int temp = values[i];
values[i] = values[j];
values[j] = temp;
}
}
}
return values[2]; // 返回中位数
}
// 检测并处理触发事件
void checkHall() {
static unsigned long lastTime = 0;
unsigned long now = millis();
if (now - lastTime < debounceDelay) return;
lastTime = now;
int stateA = getState(hallA);
int stateB = getState(hallB);
// 判断是哪一个传感器被触发
if (stateA == LOW && stateB == HIGH) {
// A 被触发
if (lastTriggered == 2) {
// B → A = 完成一圈
totalRevolutions++;
}
lastTriggered = 1;
} else if (stateA == HIGH && stateB == LOW) {
// B 被触发
if (lastTriggered == 1) {
// A → B = 半圈(暂不计数)
}
lastTriggered = 2;
} else if (stateA == LOW && stateB == LOW) {
// A 和 B 同时触发 -> 中间位置,忽略
lastTriggered = 0;
}
}
再来一张原型图
感受
1、freecad继续学习,尤其是在删改约束时,找起来有些不方便
2、esp32c3 super mini版已经成功迈入了使用的大门
上传程序时:需要 按Boot ->按 Reset ->松 Reset-> 松 boot的方式才能编译上传
esp32C3 super mini 的模拟读入的最大电压一定控制再3.3V以内,要不度数会出现飘的。
3、焊接技术还得在练习。焊点多了密了,对于700度眼镜的我有些费力。看看有什么简易设备能让它变的容易些。
下次版本里,加入锂电充电模块,这个之前已经有经验了,估计没有难度。对了也得开始学习PCB设计的书,再下一个要攻克的山头就是它。