Convierte el movimiento en sonido con DevLab: BMI270 + Pulsar C6

Convierte el movimiento en sonido con DevLab BMI270 Pulsar C6

En este tutorial vamos transformar datos de movimiento en señales acústicas utilizando el sensor inercial BMI270 y la placa de desarrollo Pulsar C6. El objetivo de este proyecto es utilizar las lecturas de rotación para controlar un buzzer dinámicamente, donde el sonido responde directamente a la física del dispositivo.

Materiales necesarios

Conexiones

Usaremos la conexion Qwiic para conectar nuestra Pulsar C6 y el sensor inercial BMI270 de esta forma tenemos conexion directa con los pines logicos GPIO 6 y GPIO 7.

Para nuestro Buzzer conectaremos a el GND de nuestra Pulsar C6 y como pin logico usaremos el GPIO 21 este corresponde a el pin D7 fisico, podemos guiarnos con la serigrafia.

Instalación de la Biblioteca

Para hacer uso del módulo sensor IMU 6DoF, requeriremos la librería SparkFun BMI270, en el IDE de Arduino

  • #include <Wire.h>
  • #include “SparkFun_BMI270_Arduino_Library.h”

Realización del Código

EL siguiente código se describe el funcionamiento, para que puedas modificarlo, se obtienen los valores dle giro y dependiendo del valor optenido se asigna una nota musical.

#include <Wire.h>                              // Librería para comunicación I2C
#include "SparkFun_BMI270_Arduino_Library.h"  // Librería del sensor BMI270

// ---------------------- CONFIGURACIÓN DE PINES ----------------------
#define SDA_PIN 6          // Pin SDA para I2C
#define SCL_PIN 7          // Pin SCL para I2C
#define PIN_SDO 1          // Pin SDO define dirección I2C del BMI270
#define PIN_CS 0           // Pin CS activa modo I2C
#define PIN_Buzzer 21      // Pin donde está conectado el buzzer (D7)

// ---------------------- NOTAS MUSICALES ----------------------
// Arreglo con frecuencias (Hz) de notas musicales
const int tonos[] = {
  261, // Do
  277, // Do#
  294, // Re
  311, // Re#
  330, // Mi
  349, // Fa
  370, // Fa#
  392, // Sol
  415, // Sol#
  440, // La
  466, // La#
  494  // Si
};

// Crear objeto del sensor BMI270
BMI270 imu;

// Dirección I2C del sensor:
// 0x68 si SDO = LOW
// 0x69 si SDO = HIGH
uint8_t addr_imu = BMI2_I2C_SEC_ADDR; // Usando 0x69

// ---------------------- SETUP ----------------------
void setup() {
  
  // Iniciar monitor serial
  Serial.begin(115200);
  
  // Configurar pines como salida
  pinMode(PIN_CS, OUTPUT);
  pinMode(PIN_SDO, OUTPUT);
  pinMode(PIN_Buzzer, OUTPUT);
  
  // Configuración del BMI270:
  digitalWrite(PIN_CS, HIGH);   // HIGH = Modo I2C
  digitalWrite(PIN_SDO, HIGH);  // HIGH = Dirección 0x69

  // Iniciar comunicación I2C con pines personalizados
  Wire.begin(SDA_PIN, SCL_PIN);

  Serial.println("Inicializando BMI270...");

  // Intentar iniciar el sensor
  if (imu.beginI2C(addr_imu, Wire) != BMI2_OK) {
    
    // Si falla, mostrar error
    Serial.println("Error: BMI270 no detectado. Revisa conexiones.");
    
    // Detener el programa
    while (1) delay(10);
  }

  // Si todo sale bien
  Serial.println("BMI270 conectado exitosamente!");
}

// ---------------------- LOOP PRINCIPAL ----------------------
void loop() {
  
  // Leer datos del sensor
  imu.getSensorData();

  float gx = imu.data.gyroX;
  float gy = imu.data.gyroY;

  // Variable para guardar tono actual
  int tonoActual = 0;

  // ---------------------- EJE X ----------------------
  if (gx > 0.3 && gx <= 5) tonoActual = tonos[0];       
  else if (gx > 6 && gx <= 10) tonoActual = tonos[4];   
  else if (gx < -0.3 && gx >= -5) tonoActual = tonos[1]; 
  else if (gx < -6 && gx >= -10) tonoActual = tonos[3];  

  // ---------------------- EJE Y ----------------------
  else if (gy > -10 && gy <= -0.3) tonoActual = tonos[6]; 
  else if (gy > -20 && gy <= -10) tonoActual = tonos[8];   
  else if (gy > 0.3 && gy <= 10) tonoActual = tonos[9];    
  else if (gy > 10 && gy <= 20) tonoActual = tonos[11];    

  // ---------------------- SONIDO O PAUSA ----------------------
  if (tonoActual > 0) {
    
    tone(PIN_Buzzer, tonoActual);

  } else {
    noTone(PIN_Buzzer);

  }

  delay(500);
}

Demostración

Conclusiones

Este proyecto demuestra cómo la combinación de sensores de movimiento como el BMI270 con una tarjeta de desarrollo potente como la Pulsar C6 permite transformar datos físicos en experiencias interactivas, en este caso, sonido generado por un buzzer.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *