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.

