Mostrando entradas con la etiqueta Arduino. Mostrar todas las entradas
Mostrando entradas con la etiqueta Arduino. Mostrar todas las entradas
sábado, 30 de abril de 2016
HMI y control de brazo robótico con Labview y Arduino
Con esta interface controlo 5 servo-motores y puedo visualizar un animación en 3D del brazo robótico.
Código: descarar programa
jueves, 19 de marzo de 2015
Detectar colores con Color Sensor (SKU:SEN0101)
Este proyecto esta basado en un sensor de dfrobot tcs3200, el cual mediante 4 entradas digitales seleccionamos unos filtros. El sensor produce una salida de onda cuadrada cuya frecuencia es proporcional a la intensidad del filtro elegido.
Mas información: http://www.dfrobot.com/wiki/index.php?title=TCS3200_Color_Sensor_%28SKU:SEN0101%29
Para esto es importante, la iluminación. Por defecto el sensor tiene leds blancos, pero hay que recordar que la luz blanca tiene color rojo, verde y azul, por lo que contamina los datos, además el tipo de material también afectará al resultado.
Importante la luz no debe incidir directamente en el sensor, también contamina el resultado.
Además en VB al intentar reconstruir el color, siempre habrá un error. En la mayoría de los casos el color será muy diferente al color reconstruido y será mejor guiarse por un canal (por ejemplo el rojo) que por la suma de los tres.
El programa que hecho servir es el mismo programa que hay en la web del fabricante, pero le hecho unos pequeños cambios para poder comunicarme con VB.
Código Arduino modificado:
int s0=3,s1=4,s2=5,s3=6;
int out=2;
int flag=0;
byte counter=0;
byte countR=0,countG=0,countB=0;
void setup()
{
Serial.begin(9600);
pinMode(s0,OUTPUT);
pinMode(s1,OUTPUT);
pinMode(s2,OUTPUT);
pinMode(s3,OUTPUT);
}
void TCS()
{
flag=0;
digitalWrite(s1,HIGH);
digitalWrite(s0,HIGH);
digitalWrite(s2,LOW);
digitalWrite(s3,LOW);
attachInterrupt(0, ISR_INTO, CHANGE);
timer0_init();
}
void ISR_INTO()
{
counter++;
}
void timer0_init(void)
{
TCCR2A=0x00;
TCCR2B=0x07; //the clock frequency source 1024 points
TCNT2= 100; //10 ms overflow again
TIMSK2 = 0x01; //allow interrupt
}
int i=0;
ISR(TIMER2_OVF_vect)//the timer 2, 10ms interrupt overflow again. Internal overflow interrupt executive function
{
TCNT2=100;
flag++;
if(flag==1)
{
countR=counter;
Serial.print("R");
if (counter < 100) { Serial.print (0); }
if (counter < 10) {Serial.print (0); }
Serial.print(countR,DEC);
digitalWrite(s2,HIGH);
digitalWrite(s3,HIGH);
}
else if(flag==2)
{
countG=counter;
Serial.print("G");
if (counter < 100) { Serial.print (0); }
if (counter < 10) {Serial.print (0); }
Serial.print(countG,DEC);
digitalWrite(s2,LOW);
digitalWrite(s3,HIGH);
}
else if(flag==3)
{
countB=counter;
Serial.print("B");
if (counter < 100) { Serial.print (0); }
if (counter < 10) {Serial.print (0); }
Serial.print(countB,DEC);
digitalWrite(s2,LOW);
digitalWrite(s3,LOW);
}
else if(flag==4)
{
Serial.print("\n");
flag=0;
}
counter=0;
}
void loop()
{
TCS();
while(1);
}
En el visual basic leo los datos recibidos, un ejemplo:
R122G131B107
R121G130B106
R121G130B106
R120G131B107
R121G130B106
R121G ----Trama incompleta
Mediante las letras R, G y B identifico los valores de cada canal. Para evitar que los valores cambien para cada trama hago servir un timer de 500ms donde cada vez muestro la media de las tramas de cada canal. Para eso hago servir 3 arrays, en este caso la array del canal R tendría 6 valores, mientras que el array del canal G y B 5 valores.
Rojo=(122+121+121+120+121+121)/6= 121
Verde=(131+130+130+131+130)/5= 130
Azul=(107+106+106+107+106)/5= 106
Código del Timer1 de visual basic:
Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
Dim cuenta As Integer
Dim textin As String
Dim max_muestras As Integer = 100
Dim roig(max_muestras) As Integer 'Red
Dim cnt_r As Integer = 0
Dim verd(max_muestras) As Integer 'Green
Dim cnt_g As Integer = 0
Dim blau(max_muestras) As Integer 'blue
Dim cnt_b As Integer = 0
textin = SerialPort1.ReadExisting() 'guardo todos los datos del puerto
cuenta = textin.Length
TextBox1.Text = TextBox1.Text + textin
'ejemplo puedo recibir:
' R005G200B255
' R006G199B255
' R006G201
'Tengo 3 datos del canal rojo, 3 del verde y dos del azul
For i As Integer = 0 To (cuenta - 1) 'leo los datos
If (textin(i) = "R") And ((i + 3) <= (cuenta - 1)) Then
roig(cnt_r) = CInt(textin(i + 1) + textin(i + 2) + textin(i + 3))
'guardo en un array los datos del canal rojo
cnt_r = cnt_r + 1 'cuento los datos que tengo en el canal rojo
End If
If (textin(i) = "B") And ((i + 3) <= (cuenta - 1)) Then
verd(cnt_g) = CInt(textin(i + 1) + textin(i + 2) + textin(i + 3))
cnt_g = cnt_g + 1
End If
If (textin(i) = "G") And ((i + 3) <= (cuenta - 1)) Then
blau(cnt_b) = CInt(textin(i + 1) + textin(i + 2) + textin(i + 3))
cnt_b = cnt_b + 1
End If
Next
If (cnt_r > 0) Then
For i As Integer = 0 To cnt_r - 1
Red = Red + roig(i) ' 5+5+6 =16
Next
Red = Red / cnt_r 'Hago una media 16/3= 5
If Red >= 0 And Red <= 255 Then 'Compruebo qu el resultado es coherente
lRed.Text = Red
ProgressBarRed.Value = Red '5
End If
cnt_r = 0
End If
If (cnt_g > 0) Then
For i As Integer = 0 To cnt_g - 1
Green = Green + verd(i)
Next
Green = Green / cnt_g 'Hago una media
If Green >= 0 And Green <= 255 Then
lGreen.Text = Green
ProgressBarGreen.Value = Green
End If
cnt_g = 0
End If
If (cnt_b > 0) Then
For i As Integer = 0 To cnt_b - 1
Blue = Blue + blau(i)
Next
Blue = Blue / cnt_b 'Hago una media
If Blue >= 0 And Blue <= 255 Then
lBlue.Text = Blue
ProgressBarBlue.Value = Blue
End If
cnt_b = 0
End If
If Red >= 0 And Red <= 255 And Green >= 0 And Green <= 255 And Blue >= 0 And Blue <= 255 Then
colormuestra.BackColor = Color.FromArgb(Red, Green, Blue)
End If
End Sub
Descargar proyecto: http://www.4shared.com/zip/ucIrUOIm/Control_LedRGB.html
martes, 22 de abril de 2014
Arduino controlado por Twitter
Este proyecto es un pequeño desafió que tenia pendiente. Consiste en un programa en Visual Basic que lee datos de una Web y los envía al Arduino. Aunque funciona en cualquier Web (que no haya usuarios y contraseñas), lo he enfocado a Twitter, porque me ha gustado la idea de controlar con tweets una placa de Arduino.
Esta es la placa a controlar, un Arduino Nano,
tiene 4 salidas digitales con un led en cada una.
Para poder filtrar los tweets, he creado una "palabra a buscar" (una especie de hashtag), en este caso he escogido la palabra "PruebaComunicacionTA". El último tweet que contenga esta palabra, es el que enviara la información al Arduino.
Para este caso he enviado el siguiente tweet:
PruebaComunicacionTA + 0101 + T +005
Palabra a Buscar + Estados leds + T Si se quiere temporizar + tiempo en segundos (El segundo y cuarto led permanecerán 5 segundos encendidos)
Código Arduino:
Aquí la Interfaz:
Los números de caracteres a enviar están limitados a 140 como es en un tweet.
El Timer es el tiempo que tardara en leer el último tweet con la palabra a buscar.
Código Visual Basic:
Descargar proyecto: http://www.4shared.com/zip/ICVVXetfce/Arduino_controlado_por_twitter.html
Esta es la placa a controlar, un Arduino Nano,
tiene 4 salidas digitales con un led en cada una.
Para poder filtrar los tweets, he creado una "palabra a buscar" (una especie de hashtag), en este caso he escogido la palabra "PruebaComunicacionTA". El último tweet que contenga esta palabra, es el que enviara la información al Arduino.
Para este caso he enviado el siguiente tweet:
PruebaComunicacionTA + 0101 + T +005
Palabra a Buscar + Estados leds + T Si se quiere temporizar + tiempo en segundos (El segundo y cuarto led permanecerán 5 segundos encendidos)
Código Arduino:
// By: jsslxs
// 21 de Abrl del 2014
int led1= 12;
int led2= 10;
int led3= 8;
int led4= 6;
void setup()
{
pinMode(led1,OUTPUT);
pinMode(led2,OUTPUT);
pinMode(led3,OUTPUT);
pinMode(led4,OUTPUT);
Serial.begin(9600); //Inicio puerto serie
}
void loop()
{
if (Serial.available())
{
delay(100); //Espera 100ms
while (Serial.available()>0) // ejemplo datos recibidos: 0101
{
int cuenta=Serial.available();
int numser[cuenta]; //matriz de bytes
for (int i = 0; i < cuenta; i = i++)
{
numser[i]= Serial.read();
//Serial.println(i);
//Serial.write(numser[i]);
}
if (numser[0]== '1'){ digitalWrite( led1, HIGH);} else { digitalWrite( led1, LOW);}
if (numser[1]== '1'){ digitalWrite( led2, HIGH);} else { digitalWrite( led2, LOW);}
if (numser[2]== '1'){ digitalWrite( led3, HIGH);} else { digitalWrite( led3, LOW);}
if (numser[3]== '1'){ digitalWrite( led4, HIGH);} else { digitalWrite( led4, LOW);}
if (numser[4]== 'T') // Timer, si se introduce una T, al cabo de un tiempo la salidas se podran LOW
{
int num0 = numser[5]-'0';
int num1 = numser[6]-'0';
int num2 = numser[7]-'0';
int tiempo= (num0*100+ num1*10 + num2) *1000; // en segundos
delay(tiempo);
digitalWrite( led1, LOW);
digitalWrite( led2, LOW);
digitalWrite( led3, LOW);
digitalWrite( led4, LOW);
}
}
Serial.flush();
}
}
Aquí la Interfaz:
Los números de caracteres a enviar están limitados a 140 como es en un tweet.
El Timer es el tiempo que tardara en leer el último tweet con la palabra a buscar.
Código Visual Basic:
Imports System.Net
Public Class Form1
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
End Sub
Private Sub button_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
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 ComboBox4.Text = "None" Then 'stopbits
SerialPort1.Parity = IO.Ports.StopBits.None
ElseIf ComboBox4.Text = "OnePointFive" Then
SerialPort1.Parity = IO.Ports.StopBits.OnePointFive
ElseIf ComboBox4.Text = "One" Then
SerialPort1.Parity = IO.Ports.StopBits.One
ElseIf ComboBox4.Text = "Two" Then
SerialPort1.Parity = IO.Ports.StopBits.Two
End If
SerialPort1.PortName = ComboBox1.SelectedItem
SerialPort1.Open()
Timer1.Interval = Tiempo.Value * 1000
Timer1.Start()
End Sub
Private Sub Habilitar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Habilitar.Click
ComboBox1.Items.Clear()
For Each PuertoDisponible As String In My.Computer.Ports.SerialPortNames
ComboBox1.Items.Add(PuertoDisponible)
Next
If ComboBox1.Items.Count > 0 Then
ComboBox1.Text = ComboBox1.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 n As Integer = 0
Dim m As Integer = 140
Dim i As Integer = 0
n = Len(PalabraAbuscar.Text)
m = m - n
NumeroCarac.Maximum = m
Dim url As WebRequest = WebRequest.Create(Seturl.Text)
Dim response As WebResponse = url.GetResponse()
Dim stream As New IO.StreamReader(response.GetResponseStream())
Urlmostrar.Text = stream.ReadToEnd()
Dim SearchForThis As String = PalabraAbuscar.Text
Dim FirstCharacter As Integer = Urlmostrar.Text.IndexOf(SearchForThis)
num.Text = ""
While NumeroCarac.Value > i
num.Text = num.Text & Urlmostrar.Text(FirstCharacter + n + i)
i = i + 1
End While
SerialPort1.Write(num.Text)
End Sub
Private Sub Desconectar_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
SerialPort1.Close()
Timer1.Stop()
End Sub
End Class
Descargar proyecto: http://www.4shared.com/zip/ICVVXetfce/Arduino_controlado_por_twitter.html
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:
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.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
5>4>3>2>0>
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.
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...
Descargar proyecto: http://www.4shared.com/zip/GAjVk6yJ/Comunicacin_Arduino_Hojadecalc.html
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:
Código Arduino:
Descargar proyecto: http://www.4shared.com/zip/ucIrUOIm/Control_LedRGB.html
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 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();
}
}
}
}
sábado, 14 de julio de 2012
Servo-controlador para motores paso a paso
Control de motores paso a paso a través del protocolo Modbus ASCII, con dos Arduinos Mega 2560 (uno para Maestro y el otro para Esclavo). Para la conexión Esclavo/Motores se utilizan los chips BEDs (Big Easy Driver).
Al principio el programa pide que se le asigne una velocidad a los motores (X e Y) y envía una trama con esta información al Esclavo. A continuación pregunta si se desea iniciar un proceso de calibración, si se pulsa 1, se envía esta solicitud. Mientras el Esclavo hace el proceso de calibración (primero para el motor X y luego para el motor Y), el Maestro comprueba cada cierto tiempo (aprox. 500ms) si éste ha finalizado, a la misma vez que comprueba esto, también lee otros estados y sensores del Esclavo.
Cuando ha finalizado el proceso de calibración, el Maestro pide los valores del rango de calibración, por defecto el inicio se ha considerado 0 tanto para el motor X, como par el Y, por lo tanto solo pide los valores finales. Todo es esta dentro de un bucle, pero las peticiones anteriores ya no se volverán a pedir. A continuación se pide una coordenada (en micropasos) para el motor X y otro para motor Y, este valor que se introduce debe de estar entre 0 y el valor final de la calibración. Si se ha introducido un número que no cumpla este valor o un carácter incorrecto, lo volverá a pedir, si es correcto envía una trama al Esclavo la cual ara mover los motores a las posiciones deseadas. Por último comprueba los diferentes estados y posiciones del Esclavo, y a lo ultimo de este bucle lee las posiciones de los motores.
Conexión Maestro
Conexión Esclavo
Suscribirse a:
Entradas (Atom)

























