Skip to content

jebentancour/Bandonberry

Repository files navigation

Bandonberry

El proyecto Bandonberry tiene como objetivo crear un simulador electrónico para el aprendizaje del bandoneón. Pretende ser una alternativa económica en comparación con un bandoneón, de forma de permitir el acceso a un instrumento por parte de los estudiantes. No solo se limita a reproducir su forma y sonido, sino que incorpora tecnologías que ayudan y estimulan el proceso de aprendizaje.

bandonberry

Hardware

PCBs

Los archivos necesarios para fabricar las PCBs se encuentran en la carpeta pcbs.

Carcasa

Los archivos necesarios para fabricar la carcasa en impresora 3D se encuentran en la carpeta stl.

Software

El software del Arduino se encuentra en la carpeta supervisor_firmware.

En las secciones siguientes se encuentran las instrucciones para instalar los diferentes componentes del Bandonberry si se desea hacerlo manualmente en una instalación del sistema operativo en blanco.

Raspberry Pi

Para comunicarse por SSH es necesario en primer lugar habilitarlo en la Raspberry Pi, ya que viene deshabilitado por defecto por motivos de seguridad, y en segundo lugar debe estar conectada a una red. Dado que no posee puerto Ethernet sino que WiFi, es necesario además pasarle las credenciales de la red a la que se desea que se conecte.

En primer lugar la imagen del sistema operativo se descarga en una PC y es grabada en una tarjeta SD. Luego se reinserta la memoria SD en la PC y en la partición /boot se debe crear un archivo llamado ssh (sin extensión) para habilitar la conxión SSH y un archivo wpa_supplicant.conf con la información de la red WiFi, como se muestra a continuación:

ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
country=UY

network={
     ssid="SSID"
     psk="PASSWORD"
     key_mgmt=WPA-PSK
}    

Para que los programas necesarios sean inicados en automáticamente se agregaron los comandos de inicialización a /etc/rc.local.

python /etc/shutdownirq.py &
sudo fluidsynth -i -s -a alsa -o audio.alsa.device=hw:1,0 -g 3 -c 2 -z 64 /home/pi/Bandonberry/bandoneon_v2.sf2 &
python /home/pi/Bandonberry/botoneras.py &
python /home/pi/Bandonberry/fuelle.py &

HARDWARE DOCUMENTATION

Uso de pines:

uso función pin pin función uso
3.3 V 3.3 V 1 2 5 V 5 V
PRESION I2C1 SDA 3 4 5 V 5 V
PRESION I2C1 SCL 5 6 GND GND
SERVO GPIO 04 7 8 UART0 TX
GND GND 9 10 UART0 RX
GPIO 17 11 12 BITCLK AUDIO
GPIO 27 13 14 GND GND
GPIO 22 15 16 GPIO 23
3.3 V 3.3 V 17 18 GPIO 24
TECLADO SPI0 MOSI 19 20 GND GND
TECLADO SPI0 MISO 21 22 GPIO 25
TECLADO SPI0 SCLK 23 24 SPI0 CS0 TECLADO
GND GND 25 26 SPI0 CS1 TECLADO
EPROM 27 28 EPROM
GPIO 05 29 30 GND GND
GPIO 06 31 32 GPIO 12 BMS
GPIO 13 33 34 GND GND
AUDIO LRCLK 35 36 GPIO 16 BMS
GPIO 26 37 38 GPIO 20
GND GND 39 40 DATAOUT AUDIO

RaspiATX

El mecanismo de apagado es el de RaspiATX.

Un script que corre en la raspberry monitorea el estado de un pin para enviar una señal de apagado en el sistema cuando se detecta un cambio en su estado. Una señal es enviada por otro pin para indicar el correcto booteo del sistema. Solo utilizamos los scripts provistos e implementamos en el BMS la funcionalidad del manejo de la energía.

Se copia el script de instalación:

sudo wget https://raw.githubusercontent.com/LowPowerLab/ATX-Raspi/master/shutdownchecksetup.sh

Se editan los pines a usar sudo nano shutdownchecksetup.sh:

SHUTDOWN = 12     # GPIO used for shutdown signal
BOOT = 16         # GPIO used for boot signal

Se instala eligiendo la opción 1:

sudo bash shutdownchecksetup.sh
sudo rm shutdownchecksetup.sh
sudo reboot

Audio

Adafruit MAX98357 I2S Class-D Mono Amp

Dado que la raspberry no posee salida analógica de audio es necesario agregar hardware adicional para generar las señales de audio y amplificarlas. Optamos por dicho integrado dado que posee entrada digital I2S, presente en la raspberry, y provee una señal ya aplificada para ser conectada directamente a un parlante.

Para instalarlo correr el comando dos veces:

curl -sS https://raw.githubusercontent.com/adafruit/Raspberry-Pi-Installer-Scripts/master/i2samp.sh | bash

Para ver una lista de los dispositivos de audio:

aplay -l

Los auriculares con conexión de 3.5 mm poseen un terminal en común, configuración que no es posible llevar a cabo con estos integrados. La etapa de aplificación de este integrado tiene una configuración complementaria o diferencial, lo cuál implica que no es posible utilizar dos amplificadores para alimentar un par de auriculares. Dado el gran impacto que tiene en el diseño el cambio de este integrado se optó por conservarlo y eliminar la salida de audio de 3.5 mm.

Se puso una resistencia a Vcc en los pines SD para seleccionar el canal en cada amplificador:

  • Izquierdo 150k
  • Derecho 1M

Fluidsynth

FLUIDSYNTH USER MANUAL

Para generar el sonido de bandoneón utilizamos el sintetizador Fluidsynth en conjunto con una biblioteca de sonidos de uso libre creado por Jörg Bleymehl.

Para instalarlo:

sudo apt-get install fluidsynth

Para usar con las soundfonts de General MIDI:

sudo fluidsynth --audio-driver=alsa --gain 3 --verbose /usr/share/sounds/sf2/FluidR3_GM.sf2

Para usarlo con las soundfonts nuestras:

sudo fluidsynth --audio-driver=alsa --gain 3 --verbose /home/pi/Bandonberry/bandoneon_v2.sf2

Se siguieron los consejos encontrados en FLUIDSYNTH WIKI para reducir la latencia.

En particular se elige number of audio buffers = 2 y audio buffer size = 64.

Para que se inicie en el arranque se debe agregar la siguiente línea en /etc/rc.local:

sudo fluidsynth -i -s -a alsa -g 3 -c 2 -z 64 /home/pi/Bandonberry/bandoneon_v2.sf2 &

Rtmidi python

RTMIDI PYTHON GITHUB

Para instalarlo:

sudo apt-get install build-essential
sudo apt-get install libasound2-dev
sudo apt-get install libjack-jackd2-dev
sudo apt-get install python-dev python-pip
sudo pip install rtmidi-python

GPIO expander

Las botoneras poseen una gran cantidad de botones (71 en total) y es necesario detectar el accionar de distintos botones de manera simultánea. Dado que la raspberry posee solo 26 entradas digitales se utiliza un módulo expansor de puertos.

El chip MCP23S17 es SPI, se debe habilitar SPI desde sudo raspi-config como se explica en la GUíA ADAFRUIT.

Linux driver

El driver por defecto es: spi-bcm2708.

Soporta las siguientes velocidades (2014-07-05):

cdiv speed config
2 125.0 MHz
4 62.5 MHz
8 31.2 MHz
16 15.6 MHz
32 7.8 MHz <- 10.0 MHz
64 3.9 MHz
128 1953 kHz
256 976 kHz
512 488 kHz
1024 244 kHz
2048 122 kHz
4096 61 kHz
8192 30.5 kHz
16384 15.2 kHz
32768 7629 Hz

Una escritura o lectura necesita de la trasnmisión de 3 bytes DEVICE OPCODE + REGISTER ADDRESS + REGISTER VALUE. A la frecuencia seleccionada dicha tarea tarda, teóricamente: 3 * 8 / 7.8 MHz = 3.1 us.

Librería

La librería RPiMCP23S17 no fincionó, basados en la misma se creó BDN_MCP23S17.py.

Requisitos previos:

sudo apt-get install python-dev python-pip
sudo pip install RPi.GPIO
sudo pip install spidev

Para usarlo (tiene que estar en el mismo directorio):

from BDN_MCP23S17 import MCP23S17

Pinout

uso función pin pin función uso
COL 0 B0 1 28 A7 FILA 7
COL 1 B1 2 27 A6 FILA 6
COL 2 B2 3 26 A5 FILA 5
COL 3 B3 4 25 A4 FILA 4
COL 4 B4 5 24 A3 FILA 3
COL 5 B5 6 23 A2 FILA 2
B6 7 22 A1 FILA 1
B7 8 21 A0 FILA 0
3.3 V VDD 9 20 INTA
GND VSS 10 19 INTB
CS0 o CS1 nCS 11 18 nRESET 3.3 V
SPI0 SCLK SCK 12 17 A2 GND
SPI0 MOSI SI 13 16 A1 GND
SPI0 MISO SO 14 15 A0 GND

MIDI USB

MIDI TUTORIAL

Para ver una lista de los dispositivos MIDI:

aplaymidi -l

Raspberry Pi Zero OTG Mode

Para activar la interfaz MIDI USB:

echo "dtoverlay=dwc2" | sudo tee -a /boot/config.txt
echo "dwc2" | sudo tee -a /etc/modules
echo "g_midi" | sudo tee -a /etc/modules
sudo reboot

Esto cambia el dispositivo de reproducción por defecto, es necesario arreglar el inicio del sintetizador:

sudo fluidsynth -i -s -a alsa -o audio.alsa.device=hw:1,0 -g 3 -c 2 -z 64 /home/pi/Bandonberry/bandoneon_v2.sf2 &

Sensor de presión

El chip BMP180 es I2C, se debe habilitar I2C desde sudo raspi-config como se explica en la GUíA ADAFRUIT.

Para detectar los dispositivos I2C:

sudo i2cdetect -y 1

Si el sensor está bien conectado debe aparecer en la dirección 0x77.

Librería

Using the BMP085/180 with Raspberry Pi

Para instalarla:

sudo apt-get update
sudo apt-get install git build-essential python-dev python-smbus
git clone https://github.com/adafruit/Adafruit_Python_BMP.git
cd Adafruit_Python_BMP
sudo python setup.py install

BMS

Arduino Pro Micro

HARDWARE DOCUMENTATION

Uso de pines:

uso función pin pin función uso
TX/D0 1 2 RAW
RX/D1 3 4 GND GND
GND GND 5 6 RESET
GND GND 7 8 VCC 5V
SDA_Fuel_Guage SDA/D2 9 10 A3
SCL_Fuel_Guage SCL/D3 11 12 A2
AlertLowBat_IN A6/D4 13 14 A1
QuickStart_OUT D5 15 16 A0
ShutDownBot_IN A7/D6 17 18 D15/SCLK
RaspState_IN D7 19 20 D14/MISO SelectBot_IN
PowerOnOff_OUT A8/D8 21 22 D16/MOSI RBatCheck_OUT
RaspOff_OUT A9/D9 23 24 D10/A10 SafeVoltageBat_Out

ShutDownBot_IN Señal que recibe del botón de encendido/apagado.

RaspState_IN Señal de la raspberry que indica HIGH No apagar, LOW Se puede apagar.

PowerOnOff_OUT Señal que enciende el transistor, permitiendo alimentar todo el sistema. HIGH Encendido todo el sistema, LOW Se corta la corriente de todo el sistema (a no ser que se apreiete el botón de encendido).

RaspOff_OUT Señal que indica a la raspberry que comience el proceso de preparación de apagado. (HIGH 0.5 segundos es un reset, por más de 2 segundos es comienzo de proceso de apagado, y por más de 8 segundos es apagado forzado).

SafeVoltageBat_Out Señal que habilita la alimentación de la raspberry una vez que se chequé el voltaje de la batería.

La señal de Boot_IN se baja pero la luz de la raspberry se termina de apagar 8 segundos después.

esquema_bms

Conexión con la Raspberry

SHUTDOWN_IN = 12 conectado a RaspOff_OUT = 8

BOOT_OUT = 16 conectado a RaspState_IN = 6

Medidor de batería

Utilizamos un integrado MAX17043 como medidor de la carga de la batería.

Para poder usarlo en Arduino nos bajamos la librerías de aqui Librerias del MAX 17043 Fuel gauge.

Sobre la programación y funciones de la librería Funciones de libreria.

Display

Para poder usarlo en Arduino nos bajamos la librerías de aqui Librería display. En caso de querer editar las animaciones se pueden realizar imágenes en algun software como Paint y luego se pasan a mapa de bits utilizando un conversor de jpg a bitmap. El convertidor, genera la imagen del tamaño necesario para el display con la siguiente configuración:

-Code format: Hex 0x
-Diplay position X=0  Y=0
-Width 128 , Height 32
-Used for: Black White, for DIM
-Adress in flash: 0x3C