Hola a todos, después de dos días comprobando que puedo estar mal no consigo dar con el problema ni buscando en otros idiomas.
La intención es controlar nueve motores lineales LRA usando la ondas o waves que incluye el driver2605L.
El montaje se compone de 9 drivers que quiero controlar por i2C porque en un futuro puede que sean más.
El primer obstáculo que encontré es que las placas que compré de Sparkfun tienen adress inmutable por lo que tuve que añadir los multiplexores que crearan una adress para cada driver. Al principio no conseguía nada y es porque cada multiplexor inluye una resistencia de pull up de 20kohms y a su vez cada driver una resistencia de pull up de 4,4komhs que vistas desde la conexión en paralelo daban un Rpullup muy baja no pudiéndose diferenciar el flanco de subida con el de bajada, así que desoldé el jumper de los drivers para solo tener las resistencias de los multiplexores que darían una R resultante paralelo de 10k que por lo que he leído es una resistencia de pull up con la que se suele trabajar a la frecuencia por defecto de la librería Wire.h.
Ahora con mi código tampoco consigo controlarlos, la output que tengo es que funcionan unos sí y otros no (estoy poniendo en mi montaje led en vez de motores para tener una señal luminosa apreciable y así estar seguro de que les está llegando corriente).
El conexionado lo he comprobado muchas veces y está como en la imagen adjunta comprobando continuidad con polímetro.
Os adjunto el código que estoy usando de testeo para comprobar que funcionan todos los drivers y sus respectivos motores.
#include <Wire.h>
#include <Sparkfun_DRV2605L.h> //SparkFun Haptic Motor Driver Library
#define MODE_REG 0X00 //define el modo de disparo como internal trigger cambioando el 0X00 por otros cambia el modo de disparo
//se supone que es el que me interesa para el protocolo I2C
//including LRA from 0x70
SFE_HMD_DRV2605L LRA;
//SFE_HMD_DRV2605L LRA2;
//SFE_HMD_DRV2605L LRA3;
//SFE_HMD_DRV2605L LRA4;
//SFE_HMD_DRV2605L LRA5;
//SFE_HMD_DRV2605L LRA6;
//SFE_HMD_DRV2605L LRA7;
//se supone que con declararlo una vez no es necesario el resto
// contants to pin
int drv1 = 1;
int drv2 = 2;
int drv3 = 3;
int drv4 = 4;
int drv5 = 5;
int drv6 = 6;
int drv7 = 7;
//Para seleccionar los drivers he modificado el subprograma de los ejemplos de multiplexor
//que se usa para seleccionar el driver que queremos usar.
#define TCAADDR1 0x70
#define TCAADDR2 0x71
void tcaselect(uint8_t i)
{
if (i<=7) { //aquí selecciono los drivers conectados al multiplexor1
Wire.beginTransmission(TCAADDR1);
Wire.write(1<<i);
Wire.endTransmission();
Serial.println("port 0x70 #"); Serial.println(i);
}
else {//aquí selecciono el driver conectado al multiplexor 2
int j;
//comienzo cerrando la transmisión establecida en el driver 1 por
//posible problema de superposición de flancos
Wire.beginTransmission(TCAADDR1);
Wire.write(0);
Wire.endTransmission();
j=1;
Wire.beginTransmission(TCAADDR2);
Wire.write(1<<j);
Wire.endTransmission();
Serial.println("port 0x71 #"); Serial.println(j);Serial.println("igual al driver 8");
}
}
void setup(void)
{
LRA.begin();
Serial.begin(9600);
//Lo mismo, supone que con declarar un LRA me vale par todos los drivers
LRA.Library(6); //LRA2.Library(6);LRA3.Library(6);LRA4.Library(6);LRA5.Library(6);LRA6.Library(6);LRA7.Library(6); //1-5 & 7 for ERM motors, 6 for LRA motors
//Aquí selecciono el modo de disparo inernal trigger
LRA.Mode(0);// LRA2.Mode(uint8_t MODE_REG); LRA3.Mode(uint8_t MODE_REG); LRA4.Mode(uint8_t MODE_REG); LRA5.Mode(uint8_t MODE_REG); LRA6.Mode(uint8_t MODE_REG); LRA7.Mode(uint8_t MODE_REG); // Internal trigger input mode -- Must use the GO() function to trigger playback.
//LRA.MotorSelect viene en el ejemplo pero no sé muy bien para que sirve
LRA.MotorSelect(0x36);// ERM motor, 4x Braking, Medium loop gain, 1.365x back EMF gain
//Posibles output para método de disparo analógico
//pinMode(drv1, OUTPUT); pinMode(drv2, OUTPUT); pinMode(drv3, OUTPUT); pinMode(drv4, OUTPUT); pinMode(drv5, OUTPUT); pinMode(drv6, OUTPUT); pinMode(drv7, OUTPUT);
}
void loop(void)
{
int speed=1000;
//este test lo he recorrido para recorrer cada una de las adress
//de los multiplexores, en la consola de arduino parece que los recorre
//correctamente cuando ejecuto, pero en la realida no veo
//encenderse el led o moverse el motor por lo que algo falla
//he comprobado todos los drivers 1 a 1 y me han funcionado bien
//si los compruebo a través del multiplexor usando tcaselect no consigo
//que funcione bien, solamente cuando los compruebo sin multiplexor.
Serial.println("the test start");
tcaselect(0);
LRA.Waveform(0, 2);
LRA.go();
delay(speed); //give enough time to play effect
tcaselect(1);
LRA.Waveform(1, 2);
LRA.go();
delay(speed); //give enough time to play effect
tcaselect(2);
LRA.Waveform(1, 1);
LRA.go();
delay(speed); //give enough time to play effect
tcaselect(3);
LRA.Waveform(1, 1);
LRA.go();
delay(speed); //give enough time to play effect
tcaselect(4);
LRA.Waveform(1, 1);
LRA.go();
delay(speed); //give enough time to play effect
tcaselect(5);
LRA.Waveform(1, 1);
LRA.go();
delay(speed); //give enough time to play effect
tcaselect(6);
LRA.Waveform(1, 1);
LRA.go();
delay(speed); //give enough time to play effect
tcaselect(7);
LRA.Waveform(1, 1);
LRA.go();
delay(speed); //give enough time to play effect
tcaselect(8);
LRA.Waveform(1, 1);
LRA.go();
delay(speed); //give enough time to play effect
delay(500);
}
delay (1500);
}
A ver si podéis ayudarme, estoy muy ilusionado con el proyecto pero no consigo solucionarlo solo.
Saludos y espero que el mensaje esté redactado a vuestro gusto y se entienda.
Enlaces de interés:
Github con las funciones de la librería
P.D. En el esquema se me olvidó conectar A0 del multiplexor 2 a 5V para modificar su adress a 0x71 pero en la realidad está conectado.
Un cordial saludo