最近我设计了一个基于 ESP32 的微控制器开发板。我用不同的程序和 Wi-Fi 共享测试了该板。现在我将在本文展示原理图、电路组装并对这个 DIY 板进行全面审查。
ESP32开发板:
ESP32 WiFi 和蓝牙芯片是最新一代的乐鑫产品。它有一个双核32位MCU,内部集成了WiFi HT40和蓝牙/BLE 4.2技术。
与 arduino ESP8266(上一代)相比,ESP32 wifi 和蓝牙芯片(也称为 ESP wroom 32)具有显着的性能提升。它配备了高性能双核 Tensilica LX6 MCU。一个核心处理高速连接,另一个用于独立应用程序开发。双核MCU频率为240 MHz,计算能力为600 DMIPS。
ESP32芯片(ESP wroom 32)集成了丰富的硬件外设,包括电容式触摸传感器、霍尔传感器、低噪声传感器放大器、SD卡接口、以太网接口、高速SDIO/SPI、UART、I2S和I2C等。
特征:
时钟频率高达 240 MHz 的单核或双核 32 位 LX6 微处理器。
520 KB 的 SRAM、448 KB 的 ROM 和 16 KB 的 RTC SRAM。
支持速度高达 150 Mbps 的 802.11 b/g/n Wi-Fi 连接。
支持经典蓝牙 v4.2 和 BLE 规范。
34 个可编程 GPIO。
多达 18 个 12 位 SAR ADC 通道和 2 个 8 位 DAC 通道
串行连接包括 4 x SPI、2 x I2C、2 x I2S、3 x UART。
用于物理 LAN 通信的以太网 MAC(需要外部 PHY)。
1 个用于 SD/SDIO/MMC 的主控制器和 1 个用于 SDIO/SPI 的从控制器。
电机 PWM 和多达 16 通道 LED PWM。
安全启动和闪存加密
电路设计:
我在 EasyEDA 中制作了原理图。我把USB转串口编程芯片改成了CH340g,方便又便宜。该 IC 需要两个晶体管,以便在程序编译完成时将 ESP32 的一般模式更改为编程模式。
所需组件:
1) ESP32 Wi-Fi 模块
2) Ch340g编程器IC
3) 10K、5k、1K电阻
4) 100nf电容
5)BC547晶体管
6) USB C 型
7)定制PCB
PCB设计:
如果您想使用设计,那么这里是下载链接,所有 3 个文件 Gerber、BOM 和 CPL 都是共享的。因此,您可以尝试JLCPCB的 SMT 服务。
这里我使用蓝色,HASL 表面处理,1.6mm 双层 PCB。我调整了组件以匹配市场上可用的原始 ESP32 板的参数。
测试:
我用 7 段显示器测试了这个 ESP32 模块,我从 Instructables 上的朋友那里得到了 7 段显示器的文件。该程序用于在 LCD 上显示数字。
注意:我注意到我的设计可能存在问题,上传草图编程器时不会自动切换到编程模式。因此,我们必须通过按下 BOOT 和 FLASH 按钮来给外部触发。
7段显示代码:
#include
#define PIXELS_PER_SEGMENT 2 // Number of LEDs in each Segment
#define PIXELS_DIGITS 1 // Number of connected Digits
#define PIXELS_PIN 2 // GPIO Pin
Adafruit_NeoPixel strip = Adafruit_NeoPixel(PIXELS_PER_SEGMENT * 7 * PIXELS_DIGITS, PIXELS_PIN, NEO_GRB + NEO_KHZ800);
//Pixel Arrangement
/*
a
f b
g
e c
d
*/
// Segment array
byte segments[7] = {
//abcdefg
0b0000001, // Segment g
0b0000100, // Segment e
0b0001000, // Segment d
0b0010000, // Segment c
0b0100000, // Segment b
0b1000000, // Segment a
0b0000010 // Segment f
};
//Digits array
byte digits[10] = {
//abcdefg
0b1111110, // 0
0b0110000, // 1
0b1101101, // 2
0b1111001, // 3
0b0110011, // 4
0b1011011, // 5
0b1011111, // 6
0b1110000, // 7
0b1111111, // 8
0b1110011 // 9
};
//Clear all the Pixels
void clearDisplay() {
for (int i = 0; i < strip.numPixels(); i++) {
strip.setPixelColor(i, strip.Color(0, 0, 0));
}
strip.show();
}
void setup() {
strip.begin();
}
void loop() {
//disp_Seg(200); // Cycle through all segments (DelayTime)
disp_Digits(1000); // Show digits from 0-9 (DelayTime)
//disp_Animation(); // Show some Animations with the segments
//disp_CountUP(500, 450); // Count numbers in Ascending order (NUMBER, DelayTime)
// disp_CountDOWN(500, 250); // Count numbers in Descending order (NUMBER, DelayTime)
}
void disp_Seg(int wait) {
clearDisplay();
for (int d = 0; d < 5; d++) {
for (int i = 6; i > 0; i--) {
for (int n = 0; n < PIXELS_DIGITS; n++) {
writeSegment(n, i);
}
strip.show();
delay(wait);
}
}
}
void disp_Digits(int wait) {
clearDisplay();
for (int i = 0; i < 10; i++) {
for (int n = 0; n < PIXELS_DIGITS; n++) {
writeDigit(n, i);
}
strip.show();
delay(wait);
}
}
void disp_CountUP(int num, int wait) {
clearDisplay();
for (int i = 0; i <= num; i++) {
writeDigit(0, (i / 100) % 10);
writeDigit(1, (i / 10) % 10);
writeDigit(2, (i / 1) % 10);
strip.show();
delay(wait);
}
}
void disp_CountDOWN(int num, int wait) {
clearDisplay();
for (int i = num; i >= 0; i--) {
writeDigit(0, (i / 100) % 10);
writeDigit(1, (i / 10) % 10);
writeDigit(2, (i / 1) % 10);
strip.show();
delay(wait);
}
}
void disp_Animation() {
clearDisplay();
//UP-DOWN
for (int i = 0; i < 7; i++) {
for (int n = 0; n < PIXELS_DIGITS; n++) writeSegment(n, 5);
strip.show();
delay(100);
for (int n = 0; n < PIXELS_DIGITS; n++) writeSegment(n, 0);
strip.show();
delay(100);
for (int n = 0; n < PIXELS_DIGITS; n++) writeSegment(n, 2);
strip.show();
delay(100);
for (int n = 0; n < PIXELS_DIGITS; n++) writeSegment(n, 0);
strip.show();
delay(100);
for (int n = 0; n < PIXELS_DIGITS; n++) writeSegment(n, 5);
strip.show();
delay(100);
}
//LEFT-RIGHT
for (int i = 0; i < 5; i++) {
for (int n = 0; n < PIXELS_DIGITS; n++) {
writeSegment(n, 6);
strip.show();
delay(150);
}
for (int n = PIXELS_DIGITS - 1; n >= 0; n--) {
writeSegment(n, 3);
strip.show();
delay(150);
}
clearDisplay();
for (int n = 0; n < PIXELS_DIGITS; n++) {
writeSegment(n, 1);
strip.show();
delay(150);
}
for (int n = PIXELS_DIGITS - 1; n >= 0; n--) {
writeSegment(n, 4);
strip.show();
delay(150);
}
clearDisplay();
}
//ZIG-ZAG
for (int i = 0; i < 5; i++) {
for (int n = 0; n < PIXELS_DIGITS; n++) {
writeSegment(n, 6);
strip.show();
delay(125);
clearDisplay();
writeSegment(n, 1);
strip.show();
delay(125);
clearDisplay();
writeSegment(n, 4);
strip.show();
delay(125);
clearDisplay();
writeSegment(n, 3);
strip.show();
delay(125);
clearDisplay();
}
}
}
void writeDigit(int index, int val) {
byte digit = digits[val];
for (int i = 6; i >= 0; i--) {
int offset = index * (PIXELS_PER_SEGMENT * 7) + i * PIXELS_PER_SEGMENT;
uint32_t color;
if (digit & 0x01 != 0) {
if (val == 1) color = strip.Color(50, 0, 0);
if (val == 2) color = strip.Color(50, 50, 0);
if (val == 3) color = strip.Color(50, 0, 50);
if (val == 4) color = strip.Color(0, 50, 0);
if (val == 5) color = strip.Color(0, 50, 50);
if (val == 6) color = strip.Color(0, 0, 50);
if (val == 7) color = strip.Color(50, 25, 0);
if (val == 8) color = strip.Color(25, 5, 75);
if (val == 9) color = strip.Color(75, 25, 5);
if (val == 0) color = strip.Color(5, 75, 25);
}
else
color = strip.Color(0, 0, 0);
for (int j = offset; j < offset + PIXELS_PER_SEGMENT; j++) {
strip.setPixelColor(j, color);
}
digit = digit >> 1;
}
}
void writeSegment(int index, int val) {
byte seg = segments[val];
for (int i = 6; i >= 0; i--) {
int offset = index * (PIXELS_PER_SEGMENT * 7) + i * PIXELS_PER_SEGMENT;
uint32_t color;
if (seg & 0x01 != 0) {
if (val == 0) color = strip.Color(50, 0, 0);
if (val == 1) color = strip.Color(0, 50, 50);
if (val == 2) color = strip.Color(0, 50, 0);
if (val == 3) color = strip.Color(50, 0, 50);
if (val == 4) color = strip.Color(50, 50, 50);
if (val == 5) color = strip.Color(0, 0, 50);
if (val == 6) color = strip.Color(50, 50, 0);
}
else
color = strip.Color(0, 0, 0);
for (int j = offset; j < offset + PIXELS_PER_SEGMENT; j++) {
strip.setPixelColor(j, color);
}
seg = seg >> 1;
}
}
可能会遇到的故障:
1) 如果您不使用 SMT 服务,请正确制作焊点。
2) 焊接时不要过度加热 Wi-Fi 模块。
3)如果微控制器没有切换到编程模式,则重新启动并使用触觉按钮闪烁控制器。
这里还没有内容,您有什么问题吗?
电子电路资源推荐
- 基于运算放大器和模拟集成电路的电路设计
来源:下载中心
- 电动车辆能量转换与回收技术
来源:下载中心
- 示波器的原理及使用
来源:大学堂
- 基尔霍夫定律:支路、节点、回路和网孔
来源:电路图
- 数字电子技术基础
来源:大学堂
- 常用的13种半导体功率器件介绍
来源:电路图
推荐帖子 最新更新时间:2024-11-13 08:54
- Zigbee组网原理详解
- 建一个完整的zigbee网状网络包括两个步骤:网络初始化、节点加入网络。其中节点加入网络又包括两个步骤:通过与协调器连接入网和通过已有父节点入网。 1.组网概述 组建一个完整的zigbee网状网络包括两个步骤:网络初始化、节点加入网络。其中节点加入网络又包括两个步骤:通
- 灞波儿奔无线连接
- DSP系统设计-技术性问题
- 问: 我有两个关于C2000的问题:1、C240或C2407的RS复位引脚既可输入,也可输出,直接用CMOS门电路(如74ACT04)驱动是否合适,还是应该用OC门(集电极开路)驱动?2、大程序有时运行异常,但加一两条空指令就正常,是何原因? 答: 1、OC门(集电极开路
- 火辣西米秀DSP 与 ARM 处理器
- 在EVC下如何让使用和注册ActiveX控件?
- 在EVC下如何让使用和注册ActiveX控件? 我在EVC下选择插入ActiveX控件的时候那个文件夹里面是空的。 谢谢。 在EVC下如何让使用和注册ActiveX控件? 基本上用不了 关键是没有针对CE的ActiveX控件,有的只是PC上的。 是啊,基本没可能 这个问题,很复杂
- weipingid嵌入式系统
- PCB背板制造技术
- PCB背板一直是PCB制造业中具有专业化性质的产品。其设计参数与其它大多数电路板有很大不同,生产中需要满足一些苛刻的要求,噪声容限和信号完整性方面也要求PCB背板设计遵从特有的设计规则。PCB背板的这些特点导致其在设备规范和设备加工等制造要求上存在巨大差异。未来的PCB背板尺
- ESD技术咨询PCB设计
- 有关boost电路的迷惑?
- 大家好,我最近在学习boost电路,我有点不太明白,就是电感的两个峰值电流I1和I2,他们的平均电流IL到底是和输入电流相等,还是和输出电流相等啊?有的资料上是和输入,有的是和输出,希望大家帮忙指教。谢谢了……! 还有一个问题就是boost电路的开关频率是和是吗有关的……怎样控制
- 你好协同模拟电子
- 看了今年的清单,发现有无线收发模块……求大神预测会是那一款……
- 看了今年的清单,发现有无线收发模块……求大神预测会是那一款…… 看了今年的清单,发现有无线收发模块……求大神预测会是那一款…… WiFi 会不会是zigbee。wifi可能性高一点。 来个具体型号呗 另求大神预测一下今年高频的题目 esp8226
- lxqtwo电子竞赛
- 电子电路好书推荐---综合电子系统设计与实践
- Protel 99从入门到精通教程(中)
- 【Nucleo+BLUENRG心得】+实验第一步
- 使用工业电池组为替代交通工具提供动力电池组
- 14.【学习LPC1768库函数】之DAC实验
- 无线天然气报警系统之硬件电路设计
- 【转帖】介绍几种巧妙的廉价的电流检测电路
- 实用RF入门教材
- 有没有检测静电流的传感器或是电路方案?
- 电池充电管理设计参考技术资料!
- Launchpad时钟程序求助
- 【抢楼有礼】学TI 降压稳压器架构,晒成绩赢大礼!
- 谁的MMA7455驱动成功了啊?
- lunchpad触摸板附送的G2452里面是不是已经有程序了?
- 关于STM32 RTC参考手册
- linux 常提到的程序(进程)的睡眠 是什么意思?
- 求含二极管的直流电压输出值
- 【TI荐课】#2015电源设计研讨会: 小功率的AC/DC变换器的控制难题(2)#
- 答谢-nonameok,接分
- LSD-TEST4F232H5_V1.0 实验指导书
- AD8531ARTZ-REEL 高输出电流基准/稳压器的典型应用
- EVAL-ADuM1241EBZ,基于 ADuM1440ARQZ 数字隔离器的 iCoupler 评估系统
- TS79 三端固定负电压稳压器典型应用
- TDA7569LV 4 x 50 W 功率放大器的典型应用电路,具有完整的 I2C 诊断、高效率和低电压操作
- LT1361CS8、LT1210CR 演示板、移动 CPU VRM 测试仪、1 个输入、3 个输出,具有 15A 负载脉冲发生器
- 86型人体存在传感器(二)电源板
- 超级迷你UART工具
- AD8646WARZ-RL 24MHz 轨到轨运算放大器的典型应用电路
- 【武汉理工大学电子设计竞赛】直流电机控制系统
- AM1G-2418DZ ±18V 1 瓦 DC-DC 转换器的典型应用