Si además quieres enviarnos un Artículo para el Blog y redes sociales, pulsa el siguiente botón:
Hola:
Mi idea es construir un hexapodo con 18 servos.
Me gustaria seber si puedo manejar el controlador de servos SD21 desde una placa de desarrollo BasicX, es decir, en vez de colocar el BasicX-24 en el SD21, lo colocaria en la placa de desarrollo BasicX y a traves de un bus I2C mandar informacion al SD21.
Si no es mucho pedir, me podriais poner un ejemplo para controlar al menos 2 servos a traves del bus I2C con la controladora SD21.
S2.
esto es un prográma muy básico pero te servirá. Lo único que hace es centrar un par de servos. Aunque te he referenciado los 18 servos.
Saludos y suerte.
el programa :
Option Explicit
‘ Los pines 5 y 6 (por ejemplo) de tu placa de desarrollo para basicx se conectan a los pines SCL y SDA del módulo SD21 (el módulo SD21 tiene tres líneas de conectores para comunicación I2C con 4 pines cada uno. Empezando desde fuera hacia dentro: Pin1(+5V), Pin2(SDA), Pin3(SCL), Pin4(tierra))
Const SCL As Byte = 6' I2C clock - SCL
Const SDA As Byte = 5' I2C data - SDA
Const SD21 As Byte = &HC2'SD21 I2C Address
'Configuración de los servos
Const S01 As Byte = 65 'Referencia al servo para SD21
Const S02 As Byte = 66
Const S03 As Byte = 67
Const S04 As Byte = 68
Const S05 As Byte = 69
Const S06 As Byte = 70
Const S07 As Byte = 71
Const S08 As Byte = 72
Const S09 As Byte = 73
Const S10 As Byte = 74 ‘ servo 10
Const S11 As Byte = 75
Const S12 As Byte = 76
Const S13 As Byte = 77
Const S14 As Byte = 78
Const S15 As Byte = 79
Const S16 As Byte = 80
Const S17 As Byte = 81
Const S18 As Byte = 82 ‘ servo 18
'Fin de la configuración
Sub Main() ‘ tu programita lo escribes aquí dentro
Call PutPin(SCL, bxOutputHigh)
Call PutPin(SDA, bxOutputHigh)
Speed = 10
'centrado de los servos S01 y S02
Call I2cByteWrite(SD21, S01, 180) ‘ Esta llamada es la que necesitas manejar para controlar los servos del módulo SD21.
Call I2cByteWrite(SD21, S02, 180)
Delay(0.3)
Do
‘ bucle de registros y acciones. Esto lo pones tu en función de lo que necesites.
Loop
End Sub
'--------------------------------
'I2C Sub Routines by Gerald Coe
'--------------------------------
' writes I2cData to I2cReg at I2cAddr
Sub I2cByteWrite(ByVal I2cAddr As Byte, ByVal I2cReg As Byte, ByVal I2cData As Byte)
Call I2cStart()
Call I2cOutByte(I2cAddr) ' send device address
Call I2cOutByte(I2cReg) ' send register address
Call I2cOutByte(I2cData) ' send the data
Call I2cStop()
End Sub
Sub I2cOutByte(I2cData As Byte)
Call ShiftOut(SDA, SCL, 8, I2cData) ' shift data out
Call PutPin(SDA, bxInputTristate) ' turn SDA around
Call PutPin(SCL, bxOutputHigh) ' and clock in the ack' bit
Call PutPin(SCL, bxOutputLow)
End Sub
Sub I2cStart() ' I2C start bit sequence
Call PutPin(SDA, bxOutputHigh)
Call PutPin(SCL, bxOutputHigh)
Call PutPin(SDA, bxOutputLow)
Call PutPin(SCL, bxOutputLow)
End Sub
Sub I2cStop() ' I2C stop bit sequence
Call PutPin(SDA, bxOutputLow)
Call PutPin(SCL, bxOutputHigh)
Call PutPin(SDA, bxOutputHigh)
End Sub
Muchas gracias, en cuanto termine de montar los servos lo probare.
Tengo algunas dudas:
--Veo que estas llamando al valor de I2cAddr, I2cReg y I2cData:
""Sub I2cByteWrite(ByVal I2cAddr As Byte, ByVal I2cReg As Byte, ByVal I2cData As Byte)""
¿no se deberian declarar antes estos valores, o es un codigo que forman parte del lenguaje del basicx y ya lo interpreta el como sabe?
--Exactamente que quieres decir con: ""speed = 10"", ya que lo nombras peri ni esta declarada la palabra speed ni vuelves a hacer un llamamiento a speed.
--¿para cambiar la posicion del servo tengo que modificar el valor 180?
""Call I2cByteWrite(SD21, S01, 180)""
Nuevamente gracias por responder, lo probare e ire modificando valores para ver como responden los servos.
Otra cosa: es necesario conectar los pines +5v y tierra de las lineas de conexion I2C del SD21, o basta con las alimentaciones del circuito y de los servo. En caso de tener que conectarlo me figuro que seria con los pines 23(VSS) y 24(VIN) del BX-24.
Dios mio cuantas preguntas, espero que no se me quede nada en el tintero, los registros anteriores para los servos, no coinciden con los que vienen en este enlace:
http://www.superrobotica.com/S310180.htm
S2.
No es necesario declarar los parámetros I2cAddr, I2cReg y I2cData.
el parámetro "Speed" efectivamente no sirve para nada, se me coló ya que también puedes calcular las velocidades (pero en este ejemplo no hace nada). Lo puedes borrar.
Para cambiar la posición de los servos sólo tienes que modificar el parámetro "I2cData" y para asignar servos el parámetro "I2cReg"
Las referencias a los servos que te pasé efectivamente no empiezan con la asignación al pin 1. Puedes utilizar la del link que pasaste. Es sólo cuestión de cambiar los pines de conexión a los servos.
Servo - Registro Base
1 - 63
2 - 64
3 - 65
4 - 66
5 - 67
6 - 68
7 - 69
8 - 70
9 - 71
10 - 72
11 - 73
12 - 74
13 - 75
14 - 76
15 - 77
16 - 78
17 - 79
18 - 80
19 - 81
20 - 82
21 - 83
saludos!!!