Diseño de PCB para Medición de Vibraciones
Table
| Function | XIAO GPIO | Net | Peripheral |
|---|---|---|---|
| SPI SCLK | 7 | SPI_SCLK_ADXL | ADXL355 SCLK |
| SPI MISO | 8 | SPI_MISO_ADXL | ADXL355 MISO |
| SPI MOSI | 9 | SPI_MOSI_ADXL | ADXL355 MOSI |
| SPI CS | 4 | SPI_CS_ADXL | ADXL355 CS |
| Data ready | 3 | ADXL_DRDY | ADXL355 DRDY |
| Interrupt 1 | 1 | ADXL_INT1 | ADXL355 INT1 |
| I2C SDA | 5 | I2C_SDA_OLED | OLED SDA |
| I2C SCL | 6 | I2C_SCL_OLED | OLED SCL |
Ini
[env:seeed_xiao_esp32s3] platform = espressif32 board = seeed_xiao_esp32s3 framework = arduino monitor_speed = 115200 lib_deps = adafruit/Adafruit GFX Library adafruit/Adafruit SSD1306
Cpp
#include <Arduino.h> #include <SPI.h> #include <Wire.h> #include <Adafruit_GFX.h> #include <Adafruit_SSD1306.h> #define ADXL_SCLK_PIN 7 #define ADXL_MISO_PIN 8 #define ADXL_MOSI_PIN 9 #define ADXL_CS_PIN 4 #define ADXL_DRDY_PIN 3 #define ADXL_INT1_PIN 1 #define OLED_SDA_PIN 5 #define OLED_SCL_PIN 6 #define OLED_WIDTH 128 #define OLED_HEIGHT 64 Adafruit_SSD1306 display(OLED_WIDTH, OLED_HEIGHT, &Wire, -1); SPIClass adxlSPI(FSPI); static const uint32_t ADXL_SPI_HZ = 1000000; uint8_t adxlReadReg(uint8_t reg) { uint8_t cmd = (reg << 1) | 0x01; digitalWrite(ADXL_CS_PIN, LOW); adxlSPI.beginTransaction(SPISettings(ADXL_SPI_HZ, MSBFIRST, SPI_MODE0)); adxlSPI.transfer(cmd); uint8_t value = adxlSPI.transfer(0x00); adxlSPI.endTransaction(); digitalWrite(ADXL_CS_PIN, HIGH); return value; } void adxlWriteReg(uint8_t reg, uint8_t value) { uint8_t cmd = (reg << 1) & 0xFE; digitalWrite(ADXL_CS_PIN, LOW); adxlSPI.beginTransaction(SPISettings(ADXL_SPI_HZ, MSBFIRST, SPI_MODE0)); adxlSPI.transfer(cmd); adxlSPI.transfer(value); adxlSPI.endTransaction(); digitalWrite(ADXL_CS_PIN, HIGH); } int32_t signExtend20(uint32_t raw) { raw >>= 4; if (raw & 0x80000) raw |= 0xFFF00000; return (int32_t)raw; } void readAdxlRaw(int32_t &x, int32_t &y, int32_t &z) { digitalWrite(ADXL_CS_PIN, LOW); adxlSPI.beginTransaction(SPISettings(ADXL_SPI_HZ, MSBFIRST, SPI_MODE0)); adxlSPI.transfer((0x08 << 1) | 0x01); // XDATA3 read address uint8_t b[9]; for (int i = 0; i < 9; i++) b[i] = adxlSPI.transfer(0x00); adxlSPI.endTransaction(); digitalWrite(ADXL_CS_PIN, HIGH); x = signExtend20(((uint32_t)b[0] << 16) | ((uint32_t)b[1] << 8) | b[2]); y = signExtend20(((uint32_t)b[3] << 16) | ((uint32_t)b[4] << 8) | b[5]); z = signExtend20(((uint32_t)b[6] << 16) | ((uint32_t)b[7] << 8) | b[8]); } void setup() { Serial.begin(115200); delay(200); pinMode(ADXL_CS_PIN, OUTPUT); digitalWrite(ADXL_CS_PIN, HIGH); pinMode(ADXL_DRDY_PIN, INPUT); pinMode(ADXL_INT1_PIN, INPUT); adxlSPI.begin(ADXL_SCLK_PIN, ADXL_MISO_PIN, ADXL_MOSI_PIN, ADXL_CS_PIN); Wire.begin(OLED_SDA_PIN, OLED_SCL_PIN); display.begin(SSD1306_SWITCHCAPVCC, 0x3C); display.clearDisplay(); display.setTextSize(1); display.setTextColor(SSD1306_WHITE); display.setCursor(0, 0); display.println("ADXL355 start"); display.display(); // Put ADXL355 into measurement mode: POWER_CTL register 0x2D, clear standby bit. adxlWriteReg(0x2D, 0x00); } void loop() { static uint32_t last = 0; if (millis() - last >= 50) { last = millis(); int32_t x, y, z; readAdxlRaw(x, y, z); Serial.printf("X:%ld Y:%ld Z:%ld\n", x, y, z); display.clearDisplay(); display.setCursor(0, 0); display.println("ADXL355 raw"); display.printf("X %ld\nY %ld\nZ %ld\n", x, y, z); display.display(); } }
pio runpio run -t uploadpio device monitorPlatform
Pin Mapping
platformio.ini
src/main.cpp
Build