fbpx

Expresate

Si además quieres enviarnos un Artículo para el Blog y redes sociales, pulsa el siguiente botón:

Avisos
Vaciar todo

Alimentación de controlador de Servos SD21

12 Respuestas
3 Usuarios
0 Reactions
8,087 Visitas
isotopo
Respuestas: 113
Topic starter
(@isotopo)
Estimable Member
Registrado: hace 18 años

Quiero hacer pruebas mecánicas con diferentes tipos de estructuras de servos con el fin de practicar. Para lo cual he adquirido la controladora SD21. Y hasta que tenga mayores conocimientos la usaré conectada directamente al PC mediante este adaptador USB a I2C

Debido a mis insuficientes conocimientos de electrónica tengo dudas sobre el tipo de alimentación que deberé realizar y no quiero hacer ninguna prueba de momento porque no quiero meter la gamba y cargarme algo.

Disponemos de dor formas de alimentar al Driver para servos SD21. La primera consiste en emplear una tensión de +5Vcc para alimentar a toda la lógica de control y otras tensión de entre 6 – 7,2V para la alimentación de los servos. A tal efecto se dispone de una regleta con 4 bornas o clemas. Las señales de GND para la lógica y para los servos son comunes.

Otra forma típica de alimentación es mediante el empleo de un packs de baterías que suministran una única tensión de 7.2V. En este caso se cierra el jumper puesto al efecto y la tensión de +5Vcc se obtiene a partir de esos 7,2V gracias al regulador que incorpora el propio módulo SD21.

Tengo pensado usar alimentación independiente. Por un lado con un adaptador AC/DC con salida a 6V para los servos. Y para el circuito como funciona a 5V desearía poder usar los que proporciona el Conversor USB (70mA).
The +5v supply from the USB-I2C module can supply up to 70mA to external devices. If your I2C device requires more than this, or has its own supply, then leave the +5v pin unconnected. Do not apply your own 5v supply to this pin.

¿Usar el adaptador a 7,5V para una alimentación común en lugar la batería sería posible?

Especificaciones técnicas USB-I2C
Especificaciones técnicas Controladora Servos SD21

sd21usbi2cpe0

A ver si me podéis echar un cable, ¿Qué pensáis que debería hacer?. Mi intención es evitar el uso de baterias, pero si tengo que usar el adaptador para los servos y pilas para el circuito casi me vendría mejor comprar una bateria de 7,2V para alimentar todo.

Responder
11 respuestas
isotopo
Respuestas: 113
Topic starter
(@isotopo)
Estimable Member
Registrado: hace 18 años

Pues vaya cabronada que siempre tengan que estar haciendo fuerza 👿

supongo que mejor que desconectar el de la alimentación sería el de los pulsos, porque cuando giro los servos a traves del puerto paralelo, en el momento que dejo de enviar la señal dejan de hacer fuerza aunque estén alimentados. No entiendo cómo no lo hace la placa.

¿Alguien conoce algún invento para hacerlo?, imagino que este problema ya se habrá planteado en más de una ocasión.

Responder
folken20xx
Respuestas: 22
(@folken20xx)
Eminent Member
Registrado: hace 18 años

listo pa tirar solo cambia COM3 por el numero de puerto com que uses

#include <iostream>;
#include <windows>;

bool IniciarUSB_I2C(char *Puerto);
void EnviarPosicionServo(int numServo, int Posicion, int Velocidad);

int main()
{
IniciarUSB_I2C("COM3");

EnviarPosicionServo(0, 2000, 20);
Sleep(1000);

EnviarPosicionServo(0, 1000, 20);
Sleep(2000);

EnviarPosicionServo(0, 1500, 20);

return 0;
}

//---------------------------------------------------------- -----------------
HANDLE hCom;
DCB dcb;

bool IniciarUSB_I2C(char *Puerto)
{
DCB dcb;
COMMTIMEOUTS ct;

CloseHandle(hCom);
hCom = CreateFile( Puerto, GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING, 0, 0);
if (hCom == INVALID_HANDLE_VALUE) {
std::cout <<"ERROR!!!, no se pudo iniciar el dispositivo en el puerto"<< Puerto<<std::endl;

return false;
}

GetCommState(hCom, &dcb);
dcb.BaudRate = CBR_19200;
dcb.fParity = FALSE;
dcb.fOutxCtsFlow = FALSE;
dcb.fOutxDsrFlow = FALSE;
dcb.fDtrControl = DTR_CONTROL_DISABLE;
dcb.fDsrSensitivity = FALSE;
dcb.fOutX = FALSE;
dcb.fInX = FALSE;
dcb.fRtsControl = RTS_CONTROL_DISABLE;
dcb.fAbortOnError = FALSE;
dcb.ByteSize = 8;
dcb.Parity = NOPARITY;
dcb.StopBits = TWOSTOPBITS;
SetCommState(hCom, &dcb);

GetCommTimeouts(hCom, &ct);
ct.ReadIntervalTimeout = 500;
ct.ReadTotalTimeoutMultiplier =500;
ct.ReadTotalTimeoutConstant = 500;
SetCommTimeouts(hCom, &ct);

SetCommMask(hCom, EV_RXCHAR);

std::cout<<"Dispositivo USB-I2C iniciado"<<std::endl;

return true;
}

//---------------------------------------------------------- -----------------
void EnviarPosicionServo(int numServo, int Posicion, int Velocidad)
{
const BYTE I2C_CMD = 0x55;
BYTE buffer[7] = {
I2C_CMD, 0xC2, numServo*3, 3, Velocidad, LOBYTE(Posicion), HIBYTE(Posicion) };
DWORD n;
if (!WriteFile(hCom, &buffer, 7, &n, NULL)) {
std::cout<<"ERROR!!!, fallo de comunicación al enviar posición"<<std::endl;
return;
}
ReadFile(hCom, &buffer, 1, &n, NULL);
}

mira a ver si esto te aclara las dudas, es el codigo con el que yo travajo 😉 😆 😆

Responder
Página 3 / 3
Compartir: