viernes, 27 de diciembre de 2013

Generador de tabla html por Puerto Serie V1.0

Este programa esta hecho, pensando en la comunicación Arduino con la Hoja de Cálculo del Open/Libre Office.
Como últimamente  estoy graficando en Calc muchos datos (temperatura, potenciometros...) procedentes de Arduinos, he decidido hacer un programa que simplifique el código en el Arduino para crear una tabla Html.

Descargar proyecto: http://www.4shared.com/zip/yIezN8Dk/Proyecto_generador_tabla_html.html

Las instrucciones en el Arduino son fáciles:
- Con "(" Abro una fila y con ")" la cierro.
- Con "<" abro una celda y con ">" la cierro
- No hay que preocuparse que un número tenga decimales, el Generador tabla html convierte los puntos en comas, para que este en el correcto formato de la hoja de cálculos.
- Se pueden introducir letras y "_".
- Cualquier otro carácter es ignorado.
- Para crear una nueva tabla se crea desde el Generador tabla html.

Ejemplo si el Arduino envia por el puerto serie: (<1><2><3><4>)(<5><6><7><8>)(<9><10><11><12>)

El Generador tabla html crea:
1  2  3  4
 5  6  7  8
9 10 11 12

Ejemplo cógido Arduino:

El Generador tabla html es fácil de usar:
- Al ejecutar crea una tabla "tabla1" vacia.
- Primeo se pulsa habilitar puertos, en port saldrán los puertos disponibles.
- Configurar: velocidad, datos...
- Al pulsar "Conectar", en la pantalla se verán los datos recibidos y los guardara automáticamente en la tabla.
- Al pulsar "Abrir" tabla Html se verán los datos recibidos traducidos a html.
-  "Desconectar" se desconecta el puerto
- " Guardar como: " permite crear una tabla nueva con el nombre del texto que hay a la derecha.





Para importar la tabla  a la hoja de cálculo: insertar / vincular con datos externos , buscar la tabla y después pulsar en actualizar.

                                                        Ejemplo comunicación Arduino Nano-  OpenOffice




Código Visual Basic:


Public Class Arduino_HojaCalculo

    Dim textin As String

    Dim textin2 As String

    Dim Direccion As String

    Dim Tipo As Object

    Dim Archivo As Object

    Dim Archivo2 As Object

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        Conectar.Enabled = False

        Conectar.Visible = True

        Desconectar.Enabled = False

        Desconectar.Visible = False

        guardar.Enabled = True

        Tipo = CreateObject("Scripting.FileSystemObject")

        Direccion = "Tabla1.html"

        Archivo = Tipo.CreateTextFile(Direccion, True)

      

    End Sub

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Conectar.Click

        Conectar.Enabled = False

        Conectar.Visible = False

        Desconectar.Enabled = True

        Desconectar.Visible = True

        guardar.Enabled = False

        SerialPort1.BaudRate = ComboBox2.SelectedItem 'Velocidad

        SerialPort1.DataBits = ComboBox5.SelectedItem

        If ComboBox3.Text = "None" Then                 'paridad

            SerialPort1.Parity = IO.Ports.Parity.None

        ElseIf ComboBox3.Text = "Odd" Then

            SerialPort1.Parity = IO.Ports.Parity.Odd

        ElseIf ComboBox3.Text = "Even" Then

            SerialPort1.Parity = IO.Ports.Parity.Even

        ElseIf ComboBox3.Text = "Mark" Then

            SerialPort1.Parity = IO.Ports.Parity.Mark

        ElseIf ComboBox3.Text = "Space" Then

            SerialPort1.Parity = IO.Ports.Parity.Space

        End If

        If ComboBox1.Text = "None" Then                 'stopbits

            SerialPort1.Parity = IO.Ports.StopBits.None

        ElseIf ComboBox1.Text = "OnePointFive" Then

            SerialPort1.Parity = IO.Ports.StopBits.OnePointFive

        ElseIf ComboBox1.Text = "One" Then

            SerialPort1.Parity = IO.Ports.StopBits.One

        ElseIf ComboBox1.Text = "Two" Then

            SerialPort1.Parity = IO.Ports.StopBits.Two

        End If

        SerialPort1.PortName = ComPuertos.SelectedItem 'puerto

        Archivo.writeLine("")

        Archivo.Write("")

        Archivo.Write(Direc.Text)

        Archivo.WriteLine("")

        Archivo.WriteLine("")

        Archivo.WriteLine("")

        Archivo.WriteLine("")

        SerialPort1.Open()

        Timer1.Start()

    End Sub

    Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Desconectar.Click

        Conectar.Enabled = True

        Conectar.Visible = True

        Desconectar.Enabled = False

        Desconectar.Visible = False

        guardar.Enabled = True

        textrecibir.Text = ""

        SerialPort1.Close()

        Timer1.Stop()

    End Sub

    Private Sub Button1_Click_1(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        Process.Start(Direccion)

    End Sub

    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Habilitar.Click

        ComPuertos.items.clear()

        For Each PuertoDisponible As String In My.Computer.Ports.SerialPortNames

            ComPuertos.Items.Add(PuertoDisponible)

        Next

        If ComPuertos.Items.Count > 0 Then

            ComPuertos.Text = ComPuertos.Items(0)

            Conectar.Enabled = True

            Conectar.Visible = True

        Else

            MessageBox.Show("Ningún puerto encontrado")

            Conectar.Enabled = False

            Conectar.Visible = True

        End If

    End Sub

    Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick

        Dim cuenta As Integer

        textin = SerialPort1.ReadExisting() '(<0><2><3><4><5>)

        ' System.Threading.Thread.Sleep(300)

        textrecibir.Text = textrecibir.Text + textin

        cuenta = textin.Length

        For i As Integer = 0 To (cuenta - 1)

            If textin(i) = "(" Then

                Archivo.WriteLine("
")

            ElseIf textin(i) = ")" Then

                Archivo.WriteLine("
")

            ElseIf textin(i) = "<" Then

                Archivo.WriteLine("")

            ElseIf textin(i) = "." Then

                Archivo.Write(",")

            ElseIf textin(i) = "0" Then

                Archivo.Write("0")

            ElseIf textin(i) = "1" Then

                Archivo.Write("1")

            ElseIf textin(i) = "2" Then

                Archivo.Write("2")

            ElseIf textin(i) = "3" Then

                Archivo.Write("3")

            ElseIf textin(i) = "4" Then

                Archivo.Write("4")

            ElseIf textin(i) = "5" Then

                Archivo.Write("5")

            ElseIf textin(i) = "6" Then

                Archivo.Write("6")

            ElseIf textin(i) = "7" Then

                Archivo.Write("7")

            ElseIf textin(i) = "8" Then

                Archivo.Write("8")

            ElseIf textin(i) = "9" Then

                Archivo.Write("9")

            ElseIf textin(i) = "A" Or textin(i) = "a" Then

                Archivo.Write("A")

            ElseIf textin(i) = "B" Or textin(i) = "b" Then

                Archivo.Write("B")

            ElseIf textin(i) = "C" Or textin(i) = "c" Then

                Archivo.Write("C")

            ElseIf textin(i) = "D" Or textin(i) = "d" Then

                Archivo.Write("D")

            ElseIf textin(i) = "E" Or textin(i) = "e" Then

                Archivo.Write("E")

            ElseIf textin(i) = "F" Or textin(i) = "f" Then

                Archivo.Write("F")

            ElseIf textin(i) = "G" Or textin(i) = "g" Then

                Archivo.Write("G")

            ElseIf textin(i) = "H" Or textin(i) = "h" Then

                Archivo.Write("H")

            ElseIf textin(i) = "I" Or textin(i) = "i" Then

                Archivo.Write("I")

            ElseIf textin(i) = "J" Or textin(i) = "j" Then

                Archivo.Write("J")

            ElseIf textin(i) = "K" Or textin(i) = "k" Then

                Archivo.Write("K")

            ElseIf textin(i) = "L" Or textin(i) = "l" Then

                Archivo.Write("L")

            ElseIf textin(i) = "M" Or textin(i) = "m" Then

                Archivo.Write("M")

            ElseIf textin(i) = "N" Or textin(i) = "n" Then

                Archivo.Write("N")

            ElseIf textin(i) = "O" Or textin(i) = "o" Then

                Archivo.Write("O")

            ElseIf textin(i) = "P" Or textin(i) = "p" Then

                Archivo.Write("P")

            ElseIf textin(i) = "Q" Or textin(i) = "q" Then

                Archivo.Write("Q")

            ElseIf textin(i) = "R" Or textin(i) = "r" Then

                Archivo.Write("R")

            ElseIf textin(i) = "S" Or textin(i) = "s" Then

                Archivo.Write("S")

            ElseIf textin(i) = "T" Or textin(i) = "t" Then

                Archivo.Write("T")

            ElseIf textin(i) = "U" Or textin(i) = "u" Then

                Archivo.Write("U")

            ElseIf textin(i) = "V" Or textin(i) = "v" Then

                Archivo.Write("V")

            ElseIf textin(i) = "W" Or textin(i) = "w" Then

                Archivo.Write("W")

            ElseIf textin(i) = "Y" Or textin(i) = "y" Then

                Archivo.Write("Y")

            ElseIf textin(i) = "Z" Or textin(i) = "z" Then

                Archivo.Write("z")

            ElseIf textin(i) = "_" Then

                Archivo.Write("_")

            ElseIf textin(i) = "-" Then

                Archivo.Write("-")

            End If

        Next

    End Sub

   

    Private Sub guardar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles guardar.Click

        Direccion = Direc.Text + ".html" '"C:\Users\jsslxs\Desktop\"

        Archivo = Tipo.CreateTextFile(Direccion, True)

        Archivo = Tipo.CreateTextFile(Direccion, True)

    End Sub

    Private Sub jsslxs_LinkClicked(ByVal sender As System.Object, ByVal e As System.Windows.Forms.LinkLabelLinkClickedEventArgs) Handles jsslxs.LinkClicked

        'jsslxs.url = "jsslxs.blogspot.com"

        System.Diagnostics.Process.Start("http://jsslxs.blogspot.com")

    End Sub

End Class

 


") ElseIf textin(i) = ">" Then Archivo.WriteLine("


viernes, 20 de diciembre de 2013

Comunicacíón de Arduino con hoja de cálculo de Openoffice / Libreoffice

Vea también (Versión mejorada): http://autron.blogspot.com.es/2013/12/generador-de-tabla-html-por-puerto.html 

Me imagino que muchos usuarios de Openoffice y Libreoffice habrán tenido el mismo problema que tuve yo al intentar conectar el Arduino con la hoja de cálculo "Excel". Busque en muchos foros y casi todos los blogs iban encarados para Microsof. Así que os presento mi alternativa.

He conseguido, conectar el Arduino Mega 2560 con "tiempo real" (hay un pequeño retraso que no es importante) a la hoja de cálculo, esto es interesante porque permite ver las gráficas según se van enviando valores y lo más importante es muy sencillo de crear graficos, hacer estadísticas...

                           En este caso el Arduino está enviando dos datos  X y Y=sin(X).


Para conseguir esto, me he descargado el realterm este captura todo lo recibido en el puerto y crea un documento TXT o HTML.

La configuración es sencilla:
 1-Se cambia la velocidad por la que trabaja el Arduino, en mi caso 9600 Baud
 2-Los mismo para el puerto


3-Por último en la pestaña capture, en la ventana File cambiamos el txt por html, esto es importante, ya que nos interesa crear un fichero html

El ralterm ya esta configurado.

Como he dicho, nos interesa crear un documento html, este tendrá una tabla con los datos que queremos enviar. Buscando por Internet, he conseguido un ejemplo sencillo del código html de una tabla


Ahora es el turno del Arduino, este debe enviar por el puerto todo el código en html, imitando el código de la imagen anterior.

La primera parte, el Setup, envió parte del código hmtl que no se volverá a repetir. Esto incluye el nombre de la tabla y su creación como tal.


 La segunda parte, el loop, es donde envió las celdas con los datos de la tabla

La tercera parte es un poco más complicada, en mi caso al enviar valores del sin(X) hay decimales y negativos, el Arduino utiliza su formato de número (0.00 con punto) y el Open/Libreoffice otro (0,00 con coma). Esta función corrige esto, si no hay decimales esta función es innecesaria.



Ahora si ejecutamos, y le damos Star al Realterm crea el documento html.


Por último hay que preparar el Open/Libreoffice

Vamos a vincular datos con externos.


 Se abrirá un ventana, insertamos la tabla, le damos a actualizar con 1 segundo.
Cada segundo se actualizara los datos de las celdas.

Con estos pasos ya, esta todo! Ahora con los datos que se reciben, ya se puede graficar.


Aquí,  sólo he representado funciones, pero con anolog.write se puede mostrar temperatura, voltaje, posición...

domingo, 15 de diciembre de 2013

Control de Led RGB con Visual Basic y Arduino

Los valores de cada canal están comprendidos entre 0-255 por tanto en decimal tienen 3 cifras.
Por medio del puerto serie, esta interfaz enviá un número de 10 cifras  al Arduino ( 1Cifra simbólica, 3 cifras Rojo, 3 cifras Verde y 3 cifras Azul), cuando este lo recibe identifica cada cifra  y escribe su correspondiente  valor de cada color en su  pin.

El número que enviá se calcula de esta manera ( 1.000.000.000 + Canal R* 1.000.000 + Canal G* 1.000 + Canal B)



                                                                             


 Código Visual Basic:

Public Class Form1

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        SerialPort1.BaudRate = 9600
        SerialPort1.DataBits = 8
        SerialPort1.Parity = IO.Ports.Parity.None
        SerialPort1.StopBits = IO.Ports.StopBits.One
        SerialPort1.PortName = "COM3"
        SerialPort1.Open()

        TextBox_R.Text = 0  'Valor inicial canal R (entre 0-255)
        TextBox_G.Text = 0  'Valor inicial canal G (entre 0-255)
        TextBox_B.Text = 0  'Valor inicial canal B (entre 0-255)
        TextBox_RGB.Text = 0    'Valor inicial RGB ( 1000000000 + R*1000000 + G*1000 + B)
        'El 1000000000 es para forzar a RGB a que tenga una cifra constante (por si el canal R es menor de 100 0 10)

    End Sub

    Private Sub TrackBar1_Scroll(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TrackBar_R.Scroll
        TextBox_R.Text = TrackBar_R.Value
    End Sub

    Private Sub TrackBar2_Scroll(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TrackBar_G.Scroll
        TextBox_G.Text = TrackBar_G.Value
    End Sub

    Private Sub TrackBar3_Scroll(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TrackBar_B.Scroll
        TextBox_B.Text = TrackBar_B.Value
    End Sub

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles EnviarDatos.Click
        TextBox_RGB.Text = 1000000000 + TextBox_R.Text * 1000000 + TextBox_G.Text * 1000 + TextBox_B.Text
        SerialPort1.Write(TextBox_RGB.Text)
    End Sub
End Class





Código Arduino:

 
// By: jsslxs 
// 15 de Desembre 2013

int ledR= 8; //Led rojo
int ledG= 9; //Led verde
int ledB= 10; //Led azul

void setup()
{
   pinMode(ledR,OUTPUT); 
   pinMode(ledG,OUTPUT); 
   pinMode(ledB,OUTPUT);
   
   Serial.begin(9600); //Inicio puerto serie
}

void loop()
{
  int val, r, g, b;
  
  if (Serial.available())
  {
    delay(100);  //Espera 100ms
    while  (Serial.available ()>9) // ejemplo datos recibidos:  1 255 166 094
    {
      val=Serial.read();
      int numser[8] = {0,0,0,0,0,0,0,0}; //matriz de bytes 
      
    for (int i = 0; i < 9; i = i++)   // El primer dato es un 1 simbólico, no lo guardo
    {
      numser[i]= Serial.read();
    }
    
    int num0 = numser[0]-'0';    //Rojo 255
    int num1 = numser[1]-'0';
    int num2 = numser[2]-'0'; 
    r= num0*100+ num1*10 + num2;
    
    int num3=  numser[3]-'0';     //Verde 166
    int num4 = numser[4]-'0';
    int num5 = numser[5]-'0'; 
    g= num3*100+ num4*10 + num5;
    
    int num6 = numser[6]-'0';    //Azul 094
    int num7=  numser[7]-'0'; 
    int num8=  numser[8]-'0';   
    b= num6*100+ num7*10 + num8;
    
    color( r, g, b); //Llamo a la función color
      
    //Serial.write(num3+'0');   
    //Serial.write(num4+'0');   
    //Serial.write(num5+'0');       
     
    }
    Serial.flush();
  }
}   

 
void color(int rojo, int verde, int azul)
{
 
    //Escritura de PWM del color Rojo
    analogWrite(ledR, rojo);
 
    //Escritura de PWM del color Verde
    analogWrite(ledG, verde);
 
    //Escritura de PWM del color Azul
    analogWrite(ledB, azul);
}


Descargar proyecto: http://www.4shared.com/zip/ucIrUOIm/Control_LedRGB.html

sábado, 7 de diciembre de 2013

Enviar y Recibir datos al Arduino con VisualBasic

En esta Interfaz, al pulsar el botón On se envía un 1 (o un 0 si se pulsa Off) al Arduino mediante puerto serie. Según los datos recibidos, el Arduino enciende o apaga un led situado en el pin 13 y envía una cadena de datos al PC, la Interfaz recibe la cadena de datos y la muestra en el recuadro de Datos recibidos.



Código VisualBasic




Código Arduino:

void setup()
{
  pinMode(13, OUTPUT);
  Serial.begin(9600);
}

void loop()
{
  int val;
  if (Serial.available())
  {
    delay(100);    
    while  (Serial.available ()>0) 
    {
      val=Serial.read();
      if (val=='0')
      {
        digitalWrite(13,LOW); 
        Serial.write("El led esta apagado");      
      }
      else if (val=='1')
      {  
        digitalWrite(13, HIGH);
        Serial.write("El led esta encendido");           
      }
      Serial.flush();
    }
  }
}   
       
}






domingo, 9 de junio de 2013

Soluciones para el joystick NGS Maverick Vs

Hace un tiempo me compre un mando para jugar en el ordenador, el NGS Maverick Vs, éste lleva en la caja un CD con los drivers, pero si estás conectado a internet, al conectar el mando se instala automáticamente. Mi problema es que ningún juego reconocía el mando, no si es un problema de compatibilidad con el W7 de 4 bits,  el caso es que si voy a dispositivos e impresoras  aparece el mando y si entro a Configuración del dispositivo de juego y aprieto los botones, los reconoce.
 
Por internet he buscado la causa del problema y sólo he encontrado alternativas para solucionar esto. Estas dos son las que más me han gustado.


Alternativa 1. XPADDER

Lo que nos propone Daniel SZ en su canal de youtube http://youtu.be/61QerTR4iho
Básicamente lo que hace este programa es emular el teclado y el ratón con un joystick. 
Esta solución es muy buena para olvidarse de jugar en el teclado en los juegos que no tienen la opción de joystick. En la imagen que veis abajo lo he configurado para jugar con el emulador de la Play Sation pSX V.13

Los inconvenientes que le encuentro a esta alternativa, es que para cada juego hay que configurar el mando, por lo que he buscado otra alternativa.


Alternativa 2. Convertirlo en un mando de la XBOX

En esta página http://www.taringa.net/posts/juegos/2195798/Jugar-todos-los-juegos-de-PC-con-un-joystick-generico.html#pagina-3 el autor nos recomienda descargar unos archivos y pegarlos en unas carpetas.
He probado a jugar y el mando contestaba, pero la palanca derecha iba mal, tenia los ejes al revés. He abierto el archivo xbox360cemu y le he dado un vistazo a el código. En las primeras lineas aparecia:

Right Analog X=3 #axis index; use - to invert; precede with 's' for a slider eg; s-1; 7 to disable
Right Analog Y=-6 #axis index; use - to invert; precede with 's' for a slider eg; s-1; 7 to disable


La solución ha sido fácil, he cambiado el 3 por el 6 y el 6 por el 3, siendo la Y siempre negativa.
He probado a jugar al juego de Game of Thrones y ahora ya funciona correctamente!



Os subo los archivos ya corregidos: http://www.4shared.com/rar/K52UR8yu/mando_xbox.html
Pasos a seguir:
1-Descargar y descomprimir
2-Abrir el XInputTest y comprobar que el mando responde correctamente
3-Si un botón responde mal prueba a modificar el código de el archivo xbox360cemu
4-Copia y pega el xbox360cemu y los 3 dll en la carpeta de los ejecutables del juego
5-Disfruta del juego!