Portal    Foro    Buscar    FAQ    Registrarse    Conectarse


Publicar nuevo tema  Responder al tema 
Página 1 de 1
 
 
Protocolo De Comunicaciones Para Arduino Y Otros
Autor Mensaje
Responder citando   Descargar mensaje  
Mensaje 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.
 



 
drjuano - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje  
 
por ejemplo el protocolo udp
 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
 



 
codificador - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje 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.
 



 
drjuano - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje 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
 




===================
William Cabrera
Mi Blog
Mi Twitter
IRC de Gambas en Español
 
willicab - Ver perfil del usuarioEnviar mensaje privadoVisitar sitio web del usuario 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje 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.
 



 
drjuano - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje 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
 




===================
Blog personal
Web: SoloGambas seleccion de articulos dedicados a Gambas
Visita el Curso de Gambas3 ¡¡¡Gratuito!!!
 
jsbsan - Ver perfil del usuarioEnviar mensaje privadoVisitar sitio web del usuario 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje 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
 



 
codificador - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje 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;
}

 




===================
Blog personal
Web: SoloGambas seleccion de articulos dedicados a Gambas
Visita el Curso de Gambas3 ¡¡¡Gratuito!!!
 
última edición por jsbsan el Lunes, 04 Junio 2012, 18:29; editado 3 veces 
jsbsan - Ver perfil del usuarioEnviar mensaje privadoVisitar sitio web del usuario 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje 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
 


crc16-0.0.1.tar.gz
Descripción:  
Descargar
Nombre del archivo: crc16-0.0.1.tar.gz
Tamaño: 5.95 KB
Descargado: 31 veces
crc16-0.0.1.tar.gz
Descripción:  
Descargar
Nombre del archivo: crc16-0.0.1.tar.gz
Tamaño: 5.95 KB
Descargado: 31 veces
crc16-0.0.1.tar.gz
Descripción:  
Descargar
Nombre del archivo: crc16-0.0.1.tar.gz
Tamaño: 5.95 KB
Descargado: 31 veces

 




===================
Blog personal
Web: SoloGambas seleccion de articulos dedicados a Gambas
Visita el Curso de Gambas3 ¡¡¡Gratuito!!!
 
jsbsan - Ver perfil del usuarioEnviar mensaje privadoVisitar sitio web del usuario 
Volver arribaPágina inferior
Mostrar mensajes anteriores:    
 
OcultarTemas parecidos
Tema Autor Foro Respuestas último mensaje
No hay nuevos mensajes Ideas Para La Creación De Otros Retos Shell Retos de programación 0 Domingo, 05 Octobre 2014, 20:23 Ver último mensaje
Shell
No hay nuevos mensajes Arduino Comunicaciones Y Protocolos. tincho General 6 Martes, 13 Diciembre 2016, 01:33 Ver último mensaje
tincho
No hay nuevos mensajes Creador De Programas Para Arduino Con Inte... seta43 Aplicaciones/Fragmentos de Código 5 Viernes, 10 Noviembre 2017, 11:42 Ver último mensaje
tincho
No hay nuevos mensajes MOC Y Otros - Programas Para Reproducir Mu... tincho Mundo Linux 0 Martes, 16 Octobre 2018, 20:57 Ver último mensaje
tincho
 

Publicar nuevo tema  Responder al tema  Página 1 de 1
 

Usuarios navegando en este tema: 0 registrados, 0 ocultos y 1 invitado
Usuarios registrados conectados: Ninguno


 
Lista de permisos
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



  

 

cron