|
Página 1 de 1
|
Protocolo De Comunicaciones Para Arduino Y Otros
Autor |
Mensaje |
drjuano
Aprendiz
Registrado: Marzo 2011
Mensajes: 69
Edad: 42
|
Protocolo De Comunicaciones Para Arduino Y Otros
Bueno, resulta ser que una vez estuve viendo como se comunica via serial un aparatejo que cayó a mi trabajo y abrí un tema para desguazarlo.
Luego construí una placa Arduino Severino (v3.3) y empezé a jugar con ella. Resulta ser que para que tenga una utilidad neta es importante comunicarse con la placa de manera apropiada. Está bien si yo quisiera encender un led enviando "1", pero para ser realistas se necesita algo más complejo. Entonces pensé en el tema anterior que mencioné y se me ocurrió abrir uno nuevo con el fin de discutir con aquellos que quieran hacer algo abierto para que, luego, podamos hacer un componente o una biblioteca para arduino o lo que fuera.
El protocolo al que hago mención y que pertence a un dispositivo de control de acceso es el siguiente:
0x7E -> CABECERA
0x04 -> LONGITUD DEL COMANDO
0x01 -> UNA ORDEN CUALQUIERA
0x18 -> DATOS DEL COMANDO
0XE5 -> DATOS DEL COMANDO
0xE6 -> XOR
0xFF -> SUM
CABECERA: es siempre la misma, es como una llamada de atención.
LONGITUD DEL COMANDO: cantidad de bytes de la orden. No incluye la CABECERA ni la LONGITUD DEL COMANDO, pero si incluye UNA ORDEN CUALQUIERA, DATOS DEL COMANDO, ETC. hasta XOR y SUM inclusive
UNA ORDEN CUALQUIERA y DATOS DEL COMANDO: dependerían del programa y la instrucción que uno quiera enviar al equipo. Puede ser por ejemplo: Encender la luz del pin 1: 0xE6 0x01 (dónde 0xE6 sería la orden encender y 0x01 es el pin 1.)
XOR -> Realiza la operación lógica XOR (OR exclusiva) de cada byte desde UNA ORDEN CUALQUIERA hasta el final.
SUM -> Suma desde UNA ORDEN CUALQUIERA hasta XOR. Si es mayor que FF, entonces toma el byte más bajo.
Copiarlo sería un poco asqueroso, pero podemos cambiarlo o simplificarlo. Aguardo ideas de aquellos interesados. Saludos.
|
#1 Jueves, 31 May 2012, 00:43 |
|
|
codificador
Analista Programador
Registrado: Junio 2010
Mensajes: 420
Edad: 114 Ubicación:
|
por ejemplo el protocolo udp
como es otro tipo de puerto se elimina la primera linea y quedaría
y para que quede mas simple de programar se agrega la cabecera
cabecera-longitud-datos-checksum
y mas simple
cabecera-datos-checksum ---asi lo implemente una vez sobre tcp
faltaría la forma de definir checksum
|
#2 Jueves, 31 May 2012, 05:53 |
|
|
drjuano
Aprendiz
Registrado: Marzo 2011
Mensajes: 69
Edad: 42
|
Re: Protocolo De Comunicaciones Para Arduino Y Otros
La longitud puede llegar a ser importante para calcular el checksum. Estuve pensando en cómo caclular el checksum, pero está mucho más allá de lo que mis capacidades pueden llegar a hacer. Supongo que hay que pensar en un algoritmo que de un resultado entre 0 y 255 (0 y FF en hexa) como byte final para el checksum. A ver si alguien nos ilumina.
|
#3 Jueves, 31 May 2012, 08:03 |
|
|
willicab
Aprendiz
Registrado: Septiembre 2009
Mensajes: 64
Edad: 39 Ubicación: Caracas, Distrito Capital
|
Re: Protocolo De Comunicaciones Para Arduino Y Otros
Yo tengo por allí un código que usa sockets para comunicarse con pinguino, tal vez sirva de algo, ya me pongo a buscarlo
|
#4 Jueves, 31 May 2012, 14:14 |
|
|
drjuano
Aprendiz
Registrado: Marzo 2011
Mensajes: 69
Edad: 42
|
Re: Protocolo De Comunicaciones Para Arduino Y Otros
Por cierto, se me dio también por armar una Pingüino, pero vi que programar un Microchip requiere un programador muy costoso.
|
#5 Domingo, 03 Junio 2012, 07:01 |
|
|
jsbsan
Analista Programador
Registrado: Septiembre 2009
Mensajes: 4175
Edad: 51 Ubicación: dos hermanas, sevilla
|
Re: Protocolo De Comunicaciones Para Arduino Y Otros
drjuano:
En arduino, (y supongo que tambien pasara con pinguino) , te venden tambien los chip cargados con el Bootloader (el programa encargado de cargar en en el mismo chip los programas que hagas), mirate esta pagina de ebay:
Enlace ebay compra de arduino solo micro..
Ademas tambien se puede "crear" tu propio "programador de chip" con arduino y asi instalar el Bootloader en otros chip.
codificador:
Citar: Protocolo De Comunicaciones Para Arduino
Yo tengo hecho un muy simple, le mando letras, por ejemplo, la primera significa el "sensor: motor,led,etc", la segunda, el nº de sensor, y la 3º la medida (por ejemplo el angulo de giro).
Mas o menos queda asi: M2180 -> Gira el Motor nº 2, 180º grados
Tengo un ejemplo completo, con 2 servomotores, en Enlace
Eso si, lo suyo es añadirle un checksum, para comprobar que toda la orden ha llegado correctamente... pero no se como se hace eso...
Saludos
|
#6 Domingo, 03 Junio 2012, 11:58 |
|
|
codificador
Analista Programador
Registrado: Junio 2010
Mensajes: 420
Edad: 114 Ubicación:
|
Re: Protocolo De Comunicaciones Para Arduino Y Otros
Citar:
Mas o menos queda asi: M2180 -> Gira el Motor nº 2, 180º grados
simple
pero que pasa si se recibe basura
la basura es muy común un cable muy largo unas conexiones sueltas
cualquier pequeña falla
si no comprueba que tu orden este correcta tu programa podría terminar en error o hacer algo que no quieres que haga
|
#7 Domingo, 03 Junio 2012, 19:31 |
|
|
jsbsan
Analista Programador
Registrado: Septiembre 2009
Mensajes: 4175
Edad: 51 Ubicación: dos hermanas, sevilla
|
Re: Protocolo De Comunicaciones Para Arduino Y Otros
codificador:
Citar: recibe basura
Si es verdad, con mi instruccion, arduino no sabe si le ha llegado la orden correctamente, hay que añadirle un checksum, buscare por internet que seguro que debe de haber alguna forma de crearlo....
He visto en la wiki, esto sobre los CRC Enlace
Lo mismo se puede incorporar a gambas una funcion que calcule el CRC de una cadena de caracteres, luego calcule su CRC, se pasa todo esto al arduino, y que arduino sepa que el ultimo valor es el CRC, que lo compruebe y si todo va bien, acepte la parte anterior de lo que ha recibido como correcto y sino que de algun error para que sea reenviada....
Saludos
Nota:
he visto en la documentacion de gambas, que tambien maneja bits: Enlace
Añado:
He encontrado en esta pagina web Enlace, el siguiente codigo para el calculo del CRC
/******************************************************************/
/* */
/* Funcion generica para el calculo del CRC de una secuencia de */
/* bits, suponiendo que el primer bit es el menos significativo */
/* de mensaje[0] y que el ultimo bit es el mas significativo de */
/* mensaje[longitud-1]. De igual manera, en el resultado el bit */
/* menos significativo es el primero del CRC. */
/* */
/* polinomio[i] debe ser igual al coeficiente del termino de */
/* grado i del polinomio generador, para todos los terminos */
/* MENOS el de mayor grado */
/* */
/* Ej.: el polinomio generador del CCITT es 1 + x5 + x12 + x16 */
/* char polinomio[] = {1,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0}; */
/* */
/******************************************************************/
unsigned long CalculaCRC(BYTE *mensaje, unsigned longitud)
{
/* polinomio generador */
char polinomio[] = {1,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0};
/* variables */
unsigned long resultado = -1;
char ctl;
int i,j,k;
/* bucle principal para el calculo del CRC */
for(i = 0; i < longitud; i++)
{
for(j = 0; j <8>> j) & 1);
resultado = (resultado & ~1) >> 1;
for (k = 0; k < sizeof(polinomio); k++)
{
if (ctl && polinomio[sizeof(polinomio) - 1 - k])
resultado ^= (unsigned long) 1 << k;
}
}
}
/* pone a cero los bits del resultado no ocupados por el CRC */
for(i = sizeof(polinomio); i < sizeof(resultado) * 8; i++)
resultado |= (unsigned long) 1 << i;
/* devuelve el CRC de la secuencia*/
return ~resultado;
}
última edición por jsbsan el Lunes, 04 Junio 2012, 18:29; editado 3 veces
|
#8 Lunes, 04 Junio 2012, 18:19 |
|
|
jsbsan
Analista Programador
Registrado: Septiembre 2009
Mensajes: 4175
Edad: 51 Ubicación: dos hermanas, sevilla
|
Re: Protocolo De Comunicaciones Para Arduino Y Otros
He encotrado este interesante pagina, de Armando Acosta ( Una implementación de CRC-16 para Basic Stamp 2 y Windows), donde deja una explicacion de como hacerlo en Basic Stamp 2, ademas comenta tambien, sobre el codigo fuente:
"En este listado hay detalles que se salen un poco del tema, pero vale la pena explicarlos para que el código se pueda entender.
En primer lugar, ya habrá notado el lector que esta función toma y retorna strings. Esto me resulta cómodo por razones que no pueden verse en el listado por encontrarse en otras partes de mi programa. De cualquier manera, la idea de almacenar datos binarios en un string es bastante natural: a fin de cuentas, un string no es más que una secuencia de bytes y, dicho sea de paso, en mis strings, cada carácter constituye un byte del dato, no su representación ASCII sino el contenido binario puro, de ahi que haga uso de la funcion Asc() para leerlos. "
Su programa lo he adaptado a gambas (os lo adjunto), pero no he podido comprobar los datos de salida...(nunca he trabajado con bytes, y me pierdo para intentar comprobar que la solucion en correcta... )
A ver si le podies echar un vistaso.
' gambas class file
' gambas class file
''Fuente principal:
''http://www.armandoacosta.com/txt_edit.php?id=649
'otras url:
'http://www.lammertbies.nl/comm/info/crc-calculation.html
'http://wims.unice.fr/wims/wims.cgi?session=A2A2F8A6CF.1&lang=es&cmd=reply&module=tool%2Fnumber%2Fbaseconv.es&input=D4C1&ibase=8&obase=10&prec=30
Const K_MAX_BYTES As Integer = 5
Public Sub _new()
End
Public Sub Form_Open()
End
Private Function CalculateCRC(ByRef strData As String) As String
'
' Each character in strData represents a byte of the Data (the actual
' value being the ASCII code of that charater). The first character of the
' string is the least significant byte of the Data.
'
' The calculated CRC-16 word returns in same format
'
Dim DataBytes As New Byte[K_MAX_BYTES - 1]
Dim wCRC As New Byte[16] ' Each element represents a bit
Dim strCRC As String ' CRC formated as a string
Dim fb As Byte ' Represents a bit
Dim b As Byte ' Represents a bit
Dim i As Integer
Dim j As Integer
Dim k As Integer
Dim N As Integer
' Check data lenght
'
If Len(strData) > K_MAX_BYTES Then
' ... put your error handling here
Return "Error"
End If
' Initialize variables
'
fb = 0
strCRC = ""
For i = 0 To 15 'codigo inicial ponia 15
wCRC[i] = 0
Next
' Accomodate strData string into DataBytes array
'
N = Len(strData) - 1
For i = 0 To N
DataBytes[i] = Asc(Mid(strData, i + 1, 1))
Next
' For each byte...
For i = 0 To N
' For each bit within the byte...
For j = 0 To 7
' Get the actual bit
If j > 0 Then
DataBytes[i] = Int(DataBytes[i] / 2) ' Shift right
End If
b = DataBytes[i] And 1 ' Get actual bit into b; (b=0000000x)
' Run the entire algorithm againts b;
'
fb = b Xor wCRC[0]
wCRC[0] = fb Xor wCRC[1]
For k = 1 To 12
wCRC[k] = wCRC[k + 1]
Next
wCRC[13] = fb Xor wCRC[14]
wCRC[14] = wCRC[15]
wCRC[15] = fb
Next
Next
' Build return value
'
k = 0
For i = 0 To 7
k = k + wCRC[i] * (2 ^ i)
Next
strCRC = Chr(k)
k = 0
For i = 8 To 15
k = k + wCRC[i] * (2 ^ (i - 8))
Next
strCRC = strCRC & Chr(k)
' Return
'
Return strCRC
End Function
Public Sub ButtonCalcularCRC_Click()
Dim a As Integer
TextLabel1.text = ""
Try LabelCRC.Text = CalculateCRC(TextBoxDato.text)
For a = 1 To Len(LabelCRC.Text)
TextLabel1.text &= Asc(Mid$(LabelCRC.text, a, 1)) & " "
Next
End
Descripción: |
|
Descargar |
Nombre del archivo: |
crc16-0.0.1.tar.gz |
Tamaño: |
5.95 KB |
Descargado: |
32 veces |
Descripción: |
|
Descargar |
Nombre del archivo: |
crc16-0.0.1.tar.gz |
Tamaño: |
5.95 KB |
Descargado: |
32 veces |
Descripción: |
|
Descargar |
Nombre del archivo: |
crc16-0.0.1.tar.gz |
Tamaño: |
5.95 KB |
Descargado: |
32 veces |
|
#9 Lunes, 04 Junio 2012, 19:28 |
|
|
|
Temas parecidos
Temas parecidos
|
Página 1 de 1
|
Usuarios navegando en este tema: 0 registrados, 0 ocultos y 1 invitado Usuarios registrados conectados: Ninguno
|
No puede crear mensajes No puede responder temas No puede editar sus mensajes No puede borrar sus mensajes No puede votar en encuestas No puede adjuntar archivos Puede descargar archivos No puede publicar eventos en el calendario
|
|
|
|
|