- 2024-12-08
-
发表了主题帖:
【Follow me第二季第2期】任务补充 esp32与arduinoUNOR4之间的的udp通信
本帖最后由 Henry-0755 于 2024-12-8 21:52 编辑
【Follow me第二季第2期】任务补充 esp32与arduinoUNOR4之间的udp通信
购买的时候额外购买了块 FIREBEETLE 2 ESP32 DEV BOARD
补充下这个与开发板简单联动
首先是如何用起来的教程:
来自DFRobot家的开发板都有手把手的教程:[教程](https://wiki.dfrobot.com/SKU_DFR1075_FireBeetle_2_Board_ESP32_C6#target_10 "教程"),初学者很快就能上手
也是一个wifi的小模块,下面用它体验下arduino下的esp32与arduino UNOR4之间的udp通信
为了方便演示,当两个开发板之间建立了通信的时候,esp32会每隔1s发送一个心跳包给unoR4,uno接到后将一个一个的亮起matrix_led灯,效果如下:
[localvideo]38c556c34f31ad04592526651c66e074[/localvideo]
附上完整代码(一行不用改就能运行滴~):
UnoR4端(基于官方例程中的开启ap模式代码,unoR4作为热点让esp连接):
```
/*
WiFi Web Server LED Blink
A simple web server that lets you blink an LED via the web.
This sketch will create a new access point (with no password).
It will then launch a new server and print out the IP address
to the Serial Monitor. From there, you can open that address in a web browser
to turn on and off the LED on pin 13.
If the IP address of your board is yourAddress:
http://yourAddress/H turns the LED on
http://yourAddress/L turns it off
created 25 Nov 2012
by Tom Igoe
adapted to WiFi AP by Adafruit
Find the full UNO R4 WiFi Network documentation here:
https://docs.arduino.cc/tutorials/uno-r4-wifi/wifi-examples#access-point
*/
#include
#include "Arduino_LED_Matrix.h" // Include the LED_Matrix library
#include "arduino_secrets.h"
///////please enter your sensitive data in the Secret tab/arduino_secrets.h
char ssid[] = SECRET_SSID; // your network SSID (name)
char pass[] = SECRET_PASS; // your network password (use for WPA, or use as key for WEP)
int keyIndex = 0; // your network key index number (needed only for WEP)
int led = LED_BUILTIN;
int status = WL_IDLE_STATUS;
WiFiServer server(80);
unsigned int localPort = 2390; // local port to listen on
ArduinoLEDMatrix matrix; // Create an instance of the ArduinoLEDMatrix class
char packetBuffer[256]; //buffer to hold incoming packet
char ReplyBuffer[] = "acknowledged\n"; // a string to send back
uint32_t counter[] = {
0,
0,
0
};
WiFiUDP Udp;
void setup() {
//Initialize serial and wait for port to open:
Serial.begin(9600);
while (!Serial) {
; // wait for serial port to connect. Needed for native USB port only
}
Serial.println("Access Point Web Server");
pinMode(led, OUTPUT); // set the LED pin mode
matrix.begin();
// check for the WiFi module:
if (WiFi.status() == WL_NO_MODULE) {
Serial.println("Communication with WiFi module failed!");
// don't continue
while (true);
}
String fv = WiFi.firmwareVersion();
if (fv < WIFI_FIRMWARE_LATEST_VERSION) {
Serial.println("Please upgrade the firmware");
}
// by default the local IP address will be 192.168.4.1
// you can override it with the following:
WiFi.config(IPAddress(192,48,56,2));
// print the network name (SSID);
Serial.print("Creating access point named: ");
Serial.println(ssid);
// Create open network. Change this line if you want to create an WEP network:
status = WiFi.beginAP(ssid, pass);
if (status != WL_AP_LISTENING) {
Serial.println("Creating access point failed");
// don't continue
while (true);
}
// wait 10 seconds for connection:
delay(10000);
// start the web server on port 80
server.begin();
// you're connected now, so print out the status
printWiFiStatus();
Udp.begin(localPort);
}
void loop() {
// compare the previous status to the current status
if (status != WiFi.status()) {
// it has changed update the variable
status = WiFi.status();
if (status == WL_AP_CONNECTED) {
// a device has connected to the AP
Serial.println("Device connected to AP");
} else {
// a device has disconnected from the AP, and we are back in listening mode
Serial.println("Device disconnected from AP");
}
}
// if there's data available, read a packet
int packetSize = Udp.parsePacket();
if (packetSize) {
Serial.print("Received packet of size ");
Serial.println(packetSize);
Serial.print("From ");
IPAddress remoteIp = Udp.remoteIP();
Serial.print(remoteIp);
Serial.print(", port ");
Serial.println(Udp.remotePort());
// read the packet into packetBuffer
int len = Udp.read(packetBuffer, 255);
if (len > 0) {
packetBuffer[len] = 0;
}
Serial.println("Contents:");
Serial.println(packetBuffer);
if (counter[2] != 0xffffffff)
counter[2] = (counter[2]
- 2024-10-22
-
发表了主题帖:
【Follow me第二季第2期】任务汇总-ArduinoUnoR4尝鲜LTR329与LCD_SHIELD_V3
# 【Follow me第二季第2期】任务汇总—ArduinoUnoR4尝鲜LTR329与LCD_SHIELD_V3
## 视频展示
https://training.eeworld.com.cn/course/68723
物料:
使用包括开发板与传感器。
| **制造商产品编号** | 描述 | 图片 |
| ------------------ | ------------------------------- | ------------------------------------------------------------ |
| ABX00087 | ARDUINO UNO R4 WIFI | |
| DFR1075 | FIREBEETLE 2 ESP32 DEV BOARD | |
| 5591 | ADAFRUIT LTR-329 LIGHT SENSOR - | |
实物图:
## 任务实现
### 入门任务(必做)
搭建环境并开启第一步Blink / 串口打印Hello EEWorld!
使用的是arduino ide,串口也通过arduino ide进行查看
``` c
void setup() {
pinMode(13, OUTPUT);
Serial.begin(9600);
Serial.println("Hello EEWorld!");
}
void loop() {
delay(500);
digitalWrite(13, !digitalRead(13));
}
```
### 基础任务(必做)
基础任务可以分为两个
一个是LED矩阵,另一个是DAC,ADC以及OPAMP的模拟信号处理
#### LED矩阵
Arduino的LED矩阵是一个12*8的矩阵,官方有给出原理图,原理和矩阵按键很类似,且利用了发光二极管的单向导电性。
实际点亮的方式应当是时分复用,比如最左边7与剩余的io可以控制第一列,6与剩余控制第二列,类推,按照这样的方式最多应该是10+9+8+7+6+5+4+3+2 = 54,再反向*2最多应当是108个led,这里最后一列少了12个所以是96个。挺巧妙的,虽然实际上我们直接调库就好~
代码如下:心跳
```
#include "Arduino_LED_Matrix.h" /*包含官方的驱动库*/
ArduinoLEDMatrix led_matrix; //实例化一个对象
byte frame[3][8][12] = {
{
{ 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0 },
{ 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0 },
{ 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0 },
{ 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0 },
{ 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
},
{
{ 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0 },
{ 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 0 },
{ 0, 1, 1, 0, 0, 1, 0, 0, 1, 1, 0, 0 },
{ 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0 },
{ 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
},
{
{ 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0 },
{ 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 0 },
{ 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0 },
{ 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0 },
{ 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
},
};
void setup() {
Serial.begin(115200);
led_matrix.begin();
}
void loop() {
led_matrix.renderBitmap(frame[0], 8, 12);
delay(300);
led_matrix.renderBitmap(frame[1], 8, 12);
delay(300);
led_matrix.renderBitmap(frame[2], 8, 12);
delay(500);
led_matrix.renderBitmap(frame[1], 8, 12);
delay(300);
}
```
效果图:
#### DAC + OPAMP + ADC
参考官网`https://docs.arduino.cc/tutorials/uno-r4-wifi/opamp/`
这里将A0 A1短接(DAC输出信号由AMP0+再反馈到放大电路)
按照官网
![Voltage 2x Amplifier Circuit](https://docs.arduino.cc/static/45f63f884a62fa52a30abd12bf5e9755/a6d36/circuitAmplifierWiFi.png)
接线图:
通过一个10k和20k的电阻,将信号放大3倍
代码如下:
```
#include "analogWave.h"
#include
analogWave wave(DAC);
int freq = 600;
void setup() {
// put your setup code here, to run once:
Serial.begin(1000000);
analogReadResolution(14);
wave.sine(freq);
wave.amplitude(0.1);
OPAMP.begin(OPAMP_SPEED_HIGHSPEED);
}
void loop() {
int value = analogRead(A3);
Serial.println(value);
}
```
上述代码,当代码采用14bit精度的DAC再经过dac的amplitude为0.1倍
理论adc直接采集dac的信号应当是2^14/0.1=1638
但adc采集的是经过OPAMP放大3倍的信号,因此实际的峰值为4800左右。
由此例子,便可以验证DAC的sin波形输出、ADC的采集以及OPAMP的放大功能。
### 进阶任务与扩展任务
进阶任务与扩展任务均是使用HomeAssistant结合wifi做控制,放到一起来做
拓展任务采用的是LTR329的光传感器,实物如图:
安装homeassistant不再赘述
基本的概念是有三个:HomeAssistant、MQTT、HAClient
HomeAssistant是一个web服务器,负责展示和与用户交互。
有了web服务器,后台也是需要的,后台采用的是MQTT协议的服务器,有许多实现这个协议的后台,比如本次使用的是mosquitto后台,负责建立与板子的tcp通信。
HAClient就是开发板子上与HomeAssistant交互的客户端,提供数据,提供控制接口实例。
(个人理解)
下面是板端的代码与设计思路,揉合了网上ArduinoHA示例,MQTTClient等示例。
#### 设计思路
使用ArduinoHA库声明实例,包括灯、LTR329的红外光强度、LTR329的可见光强度。
设置回调,控制板子上的灯状态。
再loop循环中,读取LTR329的值,实时更新到HA上。
```arduino
#include
#include
#include
#include "Adafruit_LTR329_LTR303.h"
const char WIFI_SSID[] = "LH"; // CHANGE TO YOUR WIFI SSID
const char WIFI_PASSWORD[] = "qwertyuiop"; // CHANGE TO YOUR WIFI PASSWORD
//const char MQTT_BROKER_ADRRESS[] = "test.mosquitto.org"; // CHANGE TO MQTT BROKER'S ADDRESS
const char MQTT_BROKER_ADRRESS[] = "192.168.2.35"; // CHANGE TO MQTT BROKER'S IP ADDRESS
const int MQTT_PORT = 1883;
const char MQTT_CLIENT_ID[] = "arduino-uno-r4"; // CHANGE IT AS YOU DESIRE
const char MQTT_USERNAME[] = ""; // CHANGE IT IF REQUIRED, empty if not required
const char MQTT_PASSWORD[] = ""; // CHANGE IT IF REQUIRED, empty if not required
// The MQTT topics that Arduino should publish/subscribe
const char PUBLISH_TOPIC[] = "arduino-uno-r4/send"; // CHANGE IT AS YOU DESIRE
const char SUBSCRIBE_TOPIC[] = "arduino-uno-r4/receive"; // CHANGE IT AS YOU DESIRE
WiFiClient client;
HADevice device(MQTT_CLIENT_ID); // 创建一个HA设备
HAMqtt mqtt(client, device);
HASwitch led_switch("ledSwitch"); // 开关实体
HASensorNumber light_sensor("lightSensor");
HASensorNumber infrared_sensor("infraredSensor");
Adafruit_LTR329 ltr = Adafruit_LTR329();
uint16_t visible_lx, infrared_lx;
void onSwitchCommand(bool state, HASwitch *sender)
{
Serial.print("state: ");
Serial.println(state);
sender->setState(state);
if (state)
digitalWrite(LED_BUILTIN, HIGH);
else
digitalWrite(LED_BUILTIN, LOW);
}
void wifi_up();
void printWifiStatus();
void setup()
{
Serial.begin(9600);
pinMode(LED_BUILTIN, OUTPUT);
wifi_up();
led_switch.setIcon("mdi:led-outline");
led_switch.setName("arduino LED");
led_switch.onCommand(onSwitchCommand);
light_sensor.setName("arduino light");
light_sensor.setIcon("mdi:alarm-light-outline");
infrared_sensor.setName("arduino infrared");
infrared_sensor.setIcon("mdi:sun-wireless-outline");
if ( ! ltr.begin(&Wire1) ) {
Serial.println("Couldn't find LTR sensor!");
while (1) delay(10);
}
Serial.println("Found LTR sensor!");
ltr.setGain(LTR3XX_GAIN_2);
ltr.setIntegrationTime(LTR3XX_INTEGTIME_100);
ltr.setMeasurementRate(LTR3XX_MEASRATE_200);
}
void loop()
{
mqtt.loop();
if (ltr.newDataAvailable()) {
ltr.readBothChannels(visible_lx, infrared_lx);
light_sensor.setValue(visible_lx);
infrared_sensor.setValue(infrared_lx);
}
}
void onMqttConnected()
{
Serial.println("Connected to the broker!");
mqtt.subscribe(SUBSCRIBE_TOPIC);
Serial.println("Subscribe to topic: ");
Serial.print(SUBSCRIBE_TOPIC);
}
void onMqttDisconneted()
{
Serial.println("Disconnected from the broker!");
}
void onMqttStateChanged(HAMqtt::ConnectionState state)
{
Serial.print("MQTT state changed to: ");
Serial.println(static_cast(state));
}
void wifi_up()
{
WiFi.begin(WIFI_SSID, WIFI_PASSWORD); // Connect to WPA/WPA2 network:
Serial.print("Attempting to connect to WPA SSID: ");
Serial.println(WIFI_SSID);
while (WiFi.status() != WL_CONNECTED)
{
WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
delay(1000);
}
Serial.println("Starting connect to MQTT server");
mqtt.onConnected(onMqttConnected);
mqtt.onDisconnected(onMqttDisconneted);
mqtt.onStateChanged(onMqttStateChanged);
mqtt.setDataPrefix("homeassistant/sensor");
if (!mqtt.begin(MQTT_BROKER_ADRRESS, MQTT_PORT, MQTT_USERNAME, MQTT_PASSWORD))
{
Serial.print("Failed");
while(1);
}
}
```
在HA面板上,便有了相应entity与device
### 点屏LCD Shield V3
手头上有个不知从何而来的UNO适配的2.8''TFT LCD Shield V3的板子,如图:
想着不用白不用,网上搜啊搜也没有找到屏幕信息,好在社区资源丰富,找到个第三方库[MCUFriendly_kvb](https://docs.arduino.cc/libraries/mcufriend_kbv/)
看到国外友人有适配这个板子,但又很可惜的是这个库的最后版本停留在2年前,自然是没有适配ArduinoR4(因为他是直接写mcu寄存器,不是调用arduino的接口,因此需要根据不同信号适配读写)
找到一个分支今年专门适配的R4,[链接](https://github.com/slviajero/MCUFRIEND_kbv/tree/master),便终于用上屏幕板子啦~
效果如图,屏幕刷新率还不错,目测30帧+
## 心得体会
首先板子选得非常好玩,很有趣功能很丰富的板子,网上也有许多教程。
也是首次接触HomeAssistant,以后可以搭建自己的智能家居了哈哈。
且活动十分人性化,由于个人原因(本来都打算放弃了)迟交了许久也允许补交,太感动了。
非常好的活动与论坛~~,希望自己之后能多总结、多动手,以后有DIY项目,首先就分享到咱们论坛。
## 代码
https://download.eeworld.com.cn/detail/Henry-0755/634602
补充内容 (2024-12-8 21:50):
补充了之前没用上的esps3模块~帖子链接在:https://bbs.eeworld.com.cn/thread-1301229-1-1.html
-
加入了学习《【Follow me第二季第2期】全部任务演示》,观看 任务汇总视频
-
加入了学习《【Follow me第二季第2期】+视频介绍》,观看 【Follow me第二季第2期】
-
上传了资料:
FollowMe第二季第二期代码
- 2024-10-09
-
上传了资料:
FollowMe第二季第一期代码
-
加入了学习《 【Follow me第二季第1期】全部任务演示》,观看 全部视频任务
- 2024-09-01
-
发表了主题帖:
【Follow me第二季第1期】任务汇总—炫酷圆彩灯
本帖最后由 Henry-0755 于 2024-10-9 21:42 编辑
Follow Me第二季 第一期
## Follow me 第二季第1期任务
简单介绍:
本次活动使用[Adafruit Circuit Playground Express](https://www.digikey.cn/zh/products/detail/adafruit-industries-llc/3333/7310913),板卡支持的开发环境多样,支持MakeCode平台、CircuitPython、Arduino
之前使用CircuitPython比较多,接下来的任务都将以这个平台展开。
购买的物料清单:
| 购买清单 | | |
| ---------------------------- | ------------------------------------------------------------ | ------------------------------------------------- |
| CIRCUIT PLAYGROUND EXPRESS | [购买链接](https://www.digikey.cn/zh/products/detail/adafruit-industries-llc/3333/7310913) | [官网链接](https://www.adafruit.com/product/3333) |
| ADDRESS LED RING SERIAL RGBW | [购买链接](https://www.digikey.cn/zh/products/detail/adafruit-industries-llc/3333/7310913) | [官网链接](https://www.adafruit.com/product/2855) |
板卡板载非常多的sensor
无论是红外,光照传感器还是温度传感器以及麦克风,都与LED灯非常搭配,就是各种点灯。
**任务完成效果请看VCR~**
[任务视频链接](https://training.eeworld.com.cn/video/40820)
**入门任务(必做):**开发环境搭建,板载LED点亮
```python
import time
import board
import digitalio
led = digitalio.DigitalInOut(board.LED)
led.switch_to_output()
while True:
led.value = True
time.sleep(1)
led.value = False
time.sleep(1)
```
**基础任务一(必做):**控制板载炫彩LED,跑马灯点亮和颜色变换
网上找到好几个非常优秀的灯效控制开源项目,circuitpython适用的是这个
[Adafruit_CircuitPython_LED_Animation](https://github.com/adafruit/Adafruit_CircuitPython_LED_Animation)
有很多的灯效,跑马灯,彩虹跑马灯,sparkle,多灯效组合等等,然而很可惜运行了下,发现很多demo都无法跑起来,仅import库就已经超出内存范围了。[ATSAMD21G18](https://www.microchip.com/en-us/product/ATSAMD21G18)仅板载32k sram,用code.py脚本一运行就大概仅剩16048bytes了,进命令行还能省点内存。
效果:
```python
Auto-reload is on. Simply save files over USB to run them or enter REPL to disable.
code.py output:
16048
Code done running.
Press any key to enter the REPL. Use CTRL-D to reload.
Adafruit CircuitPython 9.1.1 on 2024-07-22; Adafruit CircuitPlayground Express with samd21g18
>>> import gc
>>> gc.collect()
>>> print(gc.mem_free())
16624
>>>
>>>
```
只能简单的控制灯效,在命令行运行
```python
from adafruit_led_animation.animation.customcolorchase import CustomColorChase
import neopixel
from board import *
# Update to match the number of NeoPixels you have connected
pixel_num = 10
pixels = neopixel.NeoPixel(NEOPIXEL, pixel_num, brightness=0.05, auto_write=False)
custom_color_chase_rainbow = CustomColorChase(pixels, speed=0.1, size=2, spacing=3)
while True:
custom_color_chase_rainbow.animate()
```
额外购买的灯圈模块一起亮
```python
from adafruit_led_animation.animation.customcolorchase import CustomColorChase
import neopixel
from board import *
pixels_ex = neopixel.NeoPixel(A2, 16, brightness=0.05, auto_write=False, pixel_order=neopixel.RGBW)
pixels_in = neopixel.NeoPixel(NEOPIXEL, 10, brightness=0.05, auto_write=False)
custom_color_chase_rainbow_ex = CustomColorChase(pixels_ex, speed=0.1, size=2, spacing=3)
custom_color_chase_rainbow_in = CustomColorChase(pixels_in, speed=0.1, size=2, spacing=3)
while True:
custom_color_chase_rainbow_ex.animate()
custom_color_chase_rainbow_in.animate()
```
**基础任务二(必做):**监测环境温度和光线,通过板载LED展示舒适程度
温度、光线
通过手指头的温度来让开发板升温
[Playground Light Sensor](https://learn.adafruit.com/adafruit-circuit-playground-express/playground-light-sensor)
[Playground Temperature](https://learn.adafruit.com/adafruit-circuit-playground-express/playground-temperature)
将官网的这两个结合并修改,通过slide switch切换温度检测还是光线检测
```python
import time
import adafruit_thermistor
import neopixel
import simpleio
import analogio
import digitalio
import time
import board
pixels = neopixel.NeoPixel(board.NEOPIXEL, 10, brightness=.05, auto_write=False)
pixels.fill((0, 0, 0))
pixels.show()
thermistor = adafruit_thermistor.Thermistor(
board.TEMPERATURE, 10000, 10000, 25, 3950)
light = analogio.AnalogIn(board.LIGHT)
switch = digitalio.DigitalInOut(board.SLIDE_SWITCH)
switch.switch_to_input(pull=digitalio.Pull.UP)
while True:
if switch.value:
temp_c = thermistor.temperature
temp_f = thermistor.temperature * 9 / 5 + 32
print("Temperature is: %f C and %f F" % (temp_c, temp_f))
peak = simpleio.map_range(temp_c, 26, 32, 0, 9)
for i in range(0, 9, 1):
if i 0:
pixels[int(peak)] = PEAK_COLOR
for i in range(16):
if i < c_ex:
pixels_ex = volume_color(i, 16)
if c_ex >= peak_ex:
peak_ex = min(c_ex, 16 - 1)
elif peak_ex > 0:
peak_ex = peak_ex - 1
if peak_ex > 0:
pixels_ex[int(peak_ex)] = PEAK_COLOR
pixels.show()
pixels_ex.show()
time.sleep(0.01)
```
**最后再简单介绍下买的拓展模块**
** 设计思路 **
同样来自adafruit的16灯珠,丝印表明了5v供电 GND,DIN,DOUT,GND,我连接到了对应的PIN,DOUT接到D2,通过neopixel很方便的就配置上了
再通过热熔胶把它固定再背板上,如图:
一开始颜色不对,明明16个灯珠却要填21个才能全亮
后来找库介绍才发现要写RGB的order
```
This example demonstrates using a single NeoPixel tied to a GPIO pin and with a pixel_order to specify the color channel order. Note that bpp does not need to be specified as it is computed from the supplied pixel_order.
import board
import neopixel
pixel = neopixel.NeoPixel(board.D0, 1, pixel_order=neopixel.RGBW)
pixel[0] = (30, 0, 20, 10)
```
这里需要填的模式是RGBW,因为之前忽略了W,所以少了1/3的灯珠颜色。
效果很好,亮度超高:
官网链接在:[NeoPixel Ring - 16 x 5050 RGB LED with Integrated Drivers : ID 1463 : Adafruit Industries, Unique & fun DIY electronics and kits](https://www.adafruit.com/product/1463)
5v的供电非常的亮,之后拿来做屏幕炫彩背光应当很不错。
** 活动总结 **
这次的开发板选的很好玩,多样的传感器,花样电灯,开发平台也很丰富,还带小朋友玩了下MakeCode,也很有意思。已经多次参加了,也有推荐给身边的朋友一起参加,非常好的活动~
** 代码 **
https://download.eeworld.com.cn/detail/Henry-0755/634563
- 2024-08-23
-
回复了主题帖:
《黑神话 悟空》是由什么语言编写的?
UE作游戏引擎的啦 c++ 网上有人用ue vr插件已经玩上VR黑神话了
- 2024-08-19
-
回复了主题帖:
【Follow me第二季第1期】+作业提交+显眼包胸章
干货满满,很值得参考,内存确实是个问题,跑一些库刚import完就内存不够了
- 2024-06-06
-
回复了主题帖:
【Beetle ESP32 C6迷你开发板】低功耗模式与功耗测试
walker2048 发表于 2024-6-6 08:51
大佬要不要测试下降频的功耗,我没搞过。想知道80Mhz主频的情况下,是否能使用wifi,功耗多少?
好的嘞 可以测试下 就80M下看看能不能ping通喽
-
发表了主题帖:
【Beetle ESP32 C6迷你开发板】低功耗模式与功耗测试
# 【Beetle ESP32 C6迷你开发板】低功耗模式与功耗测试
## 一 低功耗模式
esp32主要有两种节能模式 light-sleep 与 deep-sleep
根据官方文档
在 Light-sleep 模式下,数字外设、CPU、以及大部分 RAM 都使用时钟门控,同时电源电压降低。退出该模式后,数字外设、CPU 和 RAM 恢复运行,内部状态保持不变。
在 Deep-sleep 模式下,CPU、大部分 RAM、以及所有由时钟 APB_CLK 驱动的数字外设都会被断电。芯片上继续处于供电状态的部分仅包括:
> - RTC 控制器
> - ULP 协处理器
> - RTC 高速内存
*** 其实还有额外的降低功耗的模式Modem-sleep mode 实际就是给cpu降频+RT部分周期性启动 ***
结合datasheet中的框架图
其中
RTC 高速内存 通常是指与实时时钟模块关联的一小块快速存取内存。
ulp指白色的模块 lp相关的硬件
lp memory 指16 KB of low-power SRAM (LP SRAM) that can be accessed by HP CPU or LP CPU. It can retain data in Deep-sleep mode
进入休眠模式后依据不同的休眠等级 唤醒需要的源也不同
基本包括定时器 外部ext0/1 ULP协处理器(RISC-V核)以及light-sleep下GPIO UART唤醒
## 二 功耗测试
板子的功耗其实高出文档很多 文档中light-sleep与deep-sleep都是uA级别
文档中描述
deep_sleep模式
demo位置`examples/system/deep_sleep/main/deep_sleep_example_main.c`
测量结果
light_sleep模式
demo位置`examples/system/light_sleep/main/light_sleep_example_main.c`
通过测试可以看出ligth_sleep模式比deep_sleep模式高出180uA是符合预期的,所以大概就是板子的一些io没有匹配上或外围电路有一点点的漏电
- 2024-05-26
-
发表了主题帖:
【Beetle ESP32 C6迷你开发板】ADC以及蓝牙初体验
#【Beetle ESP32 C6迷你开发板】ADC以及蓝牙初体验
## 一 ADC
芯片只有一个12bit的ADC通道 引出了三个channels 4 5 6如下图
摇杆需要连续的采样两个ADC通道 采样xy坐标 接线如图
demo在sdk的`examples/ble_handle/main/continuous_read_main.c`
略作修改 采样4 5通道 采样率降低 减小每次READ的长度 提高实时性 修改部分如下
```
#define EXAMPLE_READ_LEN 16
static adc_channel_t channel[2] = {ADC_CHANNEL_4, ADC_CHANNEL_5};
adc_continuous_handle_cfg_t adc_config = {
.max_store_buf_size = 256,
.conv_frame_size = EXAMPLE_READ_LEN,
};
ESP_ERROR_CHECK(adc_continuous_new_handle(&adc_config, &handle));
adc_continuous_config_t dig_cfg = {
.sample_freq_hz = 1 * 1000,
.conv_mode = EXAMPLE_ADC_CONV_MODE,
.format = EXAMPLE_ADC_OUTPUT_TYPE,
};
```
就可以及时的得到采样值啦
## 二 蓝牙
想让开发板作为一个蓝牙设备可以参考
`examples/bluetooth/esp_hid_device/main/esp_hid_device_main.c`
默认的例子采用的是Bluedroid协议的HID 编译运行
在手机上连接设备 会每隔一段时间交替设置声音加减
而要模拟其他设备 比如鼠标设备 也是在这个例子总 通过宏控制
根据EXAMPLE_MOUSE配置menuconfig
```
CONFIG_PARTITION_TABLE_SINGLE_APP_LARGE=y
CONFIG_EXAMPLE_MOUSE_ENABLE=y
CONFIG_BT_ENABLED=y
CONFIG_BT_NIMBLE_ENABLED=y
CONFIG_BT_CONTROLLER_DISABLED=y
```
再编译运行
手机端匹配这个esp设备 输入配对码123456即可连接
蓝牙与网络相关的demo有许多呢 提供的demo也很全面 非常优秀的sdk~~
- 2024-05-13
-
发表了主题帖:
【Beetle ESP32 C6迷你开发板】开箱、LinuxMint Docker环境搭建
# 【Beetle ESP32 C6迷你开发板】开箱、LinuxMint Docker环境搭建
# 一、前言
本次测评的产品DFROBOT家的esp32c6开发板
这种小巧低功耗,带蓝牙wifi,且自带锂电池充放电芯片很适合diy,本次测评想使用这个板子完成一个蓝牙遥控手机的小制作
板卡支持多种开发环境,C、MicroPython、Arduino,考虑想研究蓝牙以及低功耗的功能,主要使用C进行开发
# 二、开箱
正反面
连接type c上电,默认程序有cdc串口打印
开发板灯随之闪烁
# 三、编译环境
官方SDK文档介绍
[esp-idf 快速入门-官方doc](https://docs.espressif.com/projects/esp-idf/zh_CN/v5.2/esp32c6/get-started/index.html)
开发环境为linux mint,电脑上有其他开发的工程,因此采用docker来创建编译环境
参考的教程如下,都是非常详细的教程,值得推荐:
linux mint 21.1上安装docker
https://linuxiac.com/how-to-install-docker-on-linux-mint-21/
安装docker_desktop
https://docs.docker.com/desktop/install/debian/#install-docker-desktop
运行docker
https://docs.espressif.com/projects/esp-idf/en/stable/esp32/api-guides/tools/idf-docker-image.html#
编译
`docker run --rm -v $PWD:/project -w /project -u $UID -e HOME=/tmp espressif/idf idf.py build`
烧录
docker映射的device没研究明白,有其他tty设备但始终没有ttyACM0设备,所以找了其他的烧录方式:
[esptool](https://github.com/espressif/esptool)
下载好release后,给esptool权限`sudo chmod +x esptool`接着执行命令
`./esptool --chip esp32c6 -p /dev/ttyACM0 write_flash 0x1000 ../esp-idf/examples/get-started/hello_world/build/hello_world.bin`
至此已经可以愉快的开发应用了~~
- 2024-04-26
-
回复了主题帖:
测评入围(第二波):Beetle ESP32 C6迷你开发板 基于ESP32-C6芯片
个人信息无误,确认可以完成评测计划。
- 2024-02-27
-
加入了学习《FollowMe第4期》,观看 FollowMe第四期任务视频
-
上传了资料:
FollowMe第四期
- 2024-02-26
-
回复了主题帖:
【补 DigiKey“智造万物,快乐不停”创意大赛】3.usb_otg_hs虚拟串口的调试 基于ST...
wangerxian 发表于 2024-2-26 17:19
当然不是用眼测,不停的发数据,然后看一段时间接收到的数据量,然后和时间计算。
usb眼图测试,可以测usb phy的最大速度,stm32这种各种测试应该都过了,大概就标准的12m,如果测传输速度应该是配置为usb mass storage device然后电脑上看发送的传输速度,或者otg读u盘看读取的速度
-
回复了主题帖:
【补 DigiKey“智造万物,快乐不停”创意大赛】3.usb_otg_hs虚拟串口的调试 基于ST...
wangerxian 发表于 2024-2-18 17:04
全速那个能测试吗,速率能达到多快?
是想测眼图吗?还是啥
-
回复了主题帖:
【得捷Follow me第4期】+ 任务汇总 包含MaixDuino的使用
秦天qintian0303 发表于 2024-2-26 09:14
任务汇总呢?是不是内容被吞了?建议先在word里面写,然后可以直接文件导上来
都有呀 目录结构是这样的视频介绍一、入门任务:开发环境搭建二、基础任务一:静态IP联网三、基础任务二:主控板建立TCPIP或UDP服务器四、简易FTP文件服务器心得代码习惯用markdown 导进来的