|     Inicio    |   |         |  |   FOROS      |  |      |      
   Elastix - VoIP B4A (Basic4Android) App inventor 2 PHP - MySQL
  Estación meteorológica B4J (Basic4Java) ADB Shell - Android Arduino
   AutoIt (Programación) Visual Basic Script (VBS) FireBase (BD autoactualizable) NodeMCU como Arduino
  Teleco - Emisora de A.M. Visual Basic Cosas de Windows Webs interesantes
Translate:
Búsqueda en este sitio:


Nuevo concurso para España, Argentina, Brasil, Chile, Colombia, Ecuador, México, Perú y Portugal.

B4A en español - Juan Antonio Villalpando
(BASIC4Android)

-- Tutorial de B4A --

Volver al índice del tutorial

____________________________

29.- Bluetooth. Visual Basic controla a LEGO mediante Bluetooth

- Tutoriales. Bluetooth. Visual Basic controla a LEGO mediante Bluetooth.
- Basado en est
e tutorial, más adelante pondré otro para controlar el LEGO mediante Bluetooth programado con Basic4Android.

- Presentación.

- Guía del usuario en inglés

- Vamos a controlar un ROBOT de LEGO, concretamente el LEGO Mindstorms education NXT. Es un ROBOT programable educativo, algo caro, tiene un precio de unos 350 €

- Aquí lo tienes: http://ro-botica.com/mindstorms_pack.asp

- En muchos institutos españoles, los cursos de 4º de E.S.O. y Bachilleratos disponen de estos recursos de aprendizaje para iniciar a los alumnos en la robótica y en la programación.

- El Robot consta de una central al que se le puede conectar varios dispositivos. Tres motores y 4 sensores.
- De los tres motores dos son para ruedas y el otro se suele poner en un brazo motor..
- Los sensores son de: contacto, sonido, luz y ultrasónico.

Montaje típico:
- Los "ojos" son sensores de proximidad por ultrasonido. Al acercarse a una pared, podemos programar para que se pare a los 50 cm de distancia, por ejemplo.
- El brazo derecho en un sensor de sonido. Al tocar una palmada podemos hacer que gire, por ejemplo.
- En la parte delantera tiene un sensor de luz. Podemos dibujar una linea curva, negra y gruesa en el suelo y programar al robot para que la siga.
- En la parte de atrás tiene un sensor de contacto, cuando choca con algo se activa un contacto y el robot puede dar marcha atrás.
- Las dos ruedas son motores independientes.
- El brazo izquierdo también es un motor.

- Funciona con pilas o bateria de unos 8 V aprox.
- Tiene Bluetooth.
- Se puede controlar mediante el Bluetooth del Arduino, Visual Basic 2010, Teléfonos con Android programados con Basic4Android, App Inventor, ,...

- Se programa con un software que se instala en el ordenador. Mediante bloque, bricks, ... se crea una secuencia de operaciones que representan a las instrucciones de Visual Basic: IF... Then... Else, Until, Loop...

Luego mediante un cable USB se carga el programa realizado al módulo del Robot.

Aquí tenemos varios vídeos de youtube:

http://www.youtube.com/watch?v=l0vqZQMF0A4&feature=channel&list=UL

http://www.youtube.com/watch?v=AzRRulYvVdY&feature=channel&list=UL

http://www.youtube.com/watch?v=V6-o2jWmdIQ&feature=related

http://www.youtube.com/watch?v=bGKUJdtLRP0&feature=related

http://www.youtube.com/watch?v=BO-uFcClRTA&feature=related

En Internet o en la misma ayuda del programa podemos encontra muchos ejemplos de programación.
Este tutorial no trata de programar directamente el Robot, solo trata de controlarlo a distancia mediante Bluetooth.

- Configuración del Bluetooth en nuestro ordenador

Necesitamos en nuestro ordenador algún dispositivo Bluetooth. En nuestro caso he puesto un pendrive Bluetooth, también se suele llama Dongle Bluetooth

Esto es un típico dongle bluetooth. Se inserta en un conector USB del ordenador y ya podemos recibir y emitir mediante bluetooth. Es barato, se puede encontrar por menos de 15 €. Con este dongle Bluetooth, hemos conseguido conectar y controlar el Robot LEGO a una distancia mayor de 80 metros diáfanos y 20 metros con paredes.

Cuando introducimos el dongle bluetooth en el puerto USB, nuestro Windows nos indicará que ha encontrado un nuevo elemento USB y que va a instalar sus driver. Normalmente Windows 7 suele encontrar e instalar los driver necesarios, en caso que no lo encuentre debemos instalarlo manualmente.

Cuando ya se ha instalado completamente el bluetooth, en el área de notificación saldrá un icono que corresponde a su configuración.

Pulsamos en ese icono con el botón derecho del ratón. Agregar un dispositivo,al cabo de unos segundos localizará los dispositivos Bluetooth cercanos, entre ellos nuestro ntx5


Pulsamos el botón Siguiente


Entonces, en la pantalla del LEGO aparecerá un mensaje indicando su clave. Pulsamos el botón naranja del LEGO para aceptar la conexión.


En el ordenador nos saldrá un casillero solicitando la clave que estableció el LEGO. Normalmente es 1234


Cuando escribimos la clave el ordenador nos informa de que estamos conectado por Bluetooth con el LEGO.

A partir de ahora si entramos mediante el icono de Bluetooth en la configuración de Mostrar dispositivos de Bluetooth, saldrá nuestro nxt5.

Si pulsamos con el botón derecho sobre nxt5 y luego en Propiedades, obtendremos esta ventana que nos indica que nuestro nxt5 está vinculado al puerto serie COM6.
Este número de puerto lo debemos tener en cuenta en nuestro programa de Visual Basic, concretamente en la línea:
With SerialPort1
.PortName = "COM6" '<<<< Tal vez debas cambiar el número de puerto

Además debemos tener en cuenta que cuando cambiamos de ordenador o cuando lo conectamos a otro puerto USB, nos cambiará el número del puerto COM.

Fíjate que nuestro Bluetooth, puede estar conectado a un puerto USB, pero es vínculado a un puerto serie COM. Así que las comunicaciones Bluetooth las debemos hacer como si estuvieramos trabajando con un puerto Serie COM. (COMmunication)

 

_________________________________________________________________________________

- Vamos a controlar el Robot mediante Bluetooh y un programa en Visual Basic 2010 instalado en nuestro ordenador.

- Bajamos el Visual Basic 2010 Expresss gratis del sitio de Microsoft. Es gratuito, solo necesitamos dar nuestro correo para registrarnos, si no lo hacemos caducará en 30 días.

http://www.microsoft.com/visualstudio/en-us/products/2010-editions/visual-basic-express

- Lo instalamos. Para crear un Proyecto (un programa) vamos a Archivo / Nuevo proyecto...
- Luego Aplicación de Windows Forms.
- Arrastramos desde el Cuadro de herramientas al Form1
- 7 Button
- 2 Label
- 1 NumericUpDown
- 1 InputBox
- 1 SerialPort

Pulsando dos veces sobre el Form1, vamos a la ventana del código que es donde se escribe el programa en Visual Basic 2010.

En nuestro caso vamos a seguir el tutorial: http://www.extremenxt.com/vbpart1.htm

- Vamos a realizar el siguiente programa:

- El Button1 conecta el Visual Basic de nuestro ordenador con el Robot LEGO mediante Bluetooh. Cuando conecta en el Label1 aparece la palabra Connected.

- El Button2 lee el estado de la batería del Robot LEGO y su valor lo presentará en el Lable2. Por ejemplo si leemos 8145 significa que en la batería tenemos 8,145 V

- El Button3 cuando lo pulsamos, suene un sonido en el Robot LEGO. Podemos elegir su frecuencia mediante un CounterUpDown.

- Cuando escribrimos algo en el TextBox1 y luego pulsamos el Button4, el texto escrito se pasa el Robot de LEGO y se visualiza en su pantallita.

Código en Visual Basic 2010

Public Class Form1

Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
Try
With SerialPort1
.PortName = "COM6" ' <<<< Tal vez debas cambiar el número de puerto
.BaudRate = 96000
.Parity = IO.Ports.Parity.None
.DataBits = 8
.StopBits = IO.Ports.StopBits.One
.ReadTimeout = 300 '300ms
.WriteTimeout = 300 '300ms
End With
SerialPort1.Open()
Label1.Text = "Connected"
Catch ex As Exception
MsgBox(ex.ToString)
End Try
End Sub

Private Sub Button2_Click(sender As System.Object, e As System.EventArgs) Handles Button2.Click
Dim byteOut(5) As Byte
Dim byteIn(6) As Byte
Dim Voltage, i As Integer
Try
byteOut(0) = &H2 '2 bytes in output message
byteOut(1) = &H0 'should be 0 for NXT
byteOut(2) = &H0 '&H0 = reply expected &H80 = no reply expected
byteOut(3) = &HB '$HB = read battery command
SerialPort1.Write(byteOut, 0, 4) '0 = offset into byteOut and 4 = number of bytes
'now read the reply
byteIn(0) = SerialPort1.ReadByte ' number of bytes in message
byteIn(1) = SerialPort1.ReadByte ' should be 0 for NXT
For i = 2 To 1 + byteIn(0) ' read rest of message
byteIn(i) = SerialPort1.ReadByte()
Next
Voltage = byteIn(5) + byteIn(6) * 256 ' the voltage has low byte in 5 and high in 6
Label2.Text = Voltage 'display voltage
Catch ex As Exception
MsgBox(ex.ToString)
End Try
End Sub

Private Sub Button3_Click(sender As System.Object, e As System.EventArgs) Handles Button3.Click
Dim byteOut(8) As Byte
Dim freq As Int16
Try
byteOut(0) = &H6 '6 bytes in output message
byteOut(1) = &H0 'should be 0 for NXT
byteOut(2) = &H80 '&H0 = reply expected &H80 = no reply expected
byteOut(3) = &H3 'PLAYTONE
freq = NumericUpDown1.Value
byteOut(4) = freq - (freq / 256) * 256 'low byte of freq
byteOut(5) = freq / 256 'high byte of freq
byteOut(6) = &H64 'low byte of duration = 100 ms
byteOut(7) = &H0 'high byte of duration
SerialPort1.Write(byteOut, 0, 8)
Catch ex As Exception
MsgBox(ex.ToString)
End Try
End Sub

Private Sub Button4_Click(sender As System.Object, e As System.EventArgs) Handles Button4.Click

Dim byteOut(64) As Byte
Dim i As Integer
Try
byteOut(0) = Len(TextBox1.Text) + 5 'number bytes in output message
byteOut(1) = &H0 'should be 0 for NXT
byteOut(2) = &H80 '&H0 = reply expected &H80 = no reply expected
byteOut(3) = &H9 'Send Bluetooth
byteOut(4) = &H0 'Box Number - 1
byteOut(5) = Len(TextBox1.Text) + 1 'message size with null terminator
For i = 1 To Len(TextBox1.Text) 'copy bytes into output array
byteOut(i + 5) = Asc(Mid(TextBox1.Text, i, 1))
Next
byteOut(Len(TextBox1.Text) + 6) = &H0 'add null terminator
SerialPort1.Write(byteOut, 0, Len(TextBox1.Text) + 7) 'send message
Catch ex As Exception
MsgBox(ex.ToString)
End Try

End Sub


End Class

 

Este es el programa que debemos cargar en el LEGO.


Se utiliza con el Button4, para que cuando escribamos algo en el casillero y pulsemos el Button4, se envíe por Bluetooth y el LEGO lo muestre en su pantalla.

 

 

 

- Añadimos un botón de izquierda, otro de derecha y otro de paro.

- Cuando pulsamos el Button5 el Robot girará a la izquierda.

- Cuando pulsamos el Button6 el Robot girará a la derecha.

- Cuando pulsamos el Button7 el Robot se parará.

Código en Visual Bacic 2010

 

Podemos añadir tres botones más, el Button5. el Button6 y el Button7, y el siguiente código, para que al pulsar un botón envíe la palabra "izquierda", al pulsar el otro envíe la palabra "derecha" y al pulsar el botón Parar se envíe la palabra "parar".

También debemos añadir la declaracion de la variable orden:


Dim orden As String

 

Private Sub Button5_Click(sender As System.Object, e As System.EventArgs) Handles Button5.Click
orden = "izquierda"
Dim byteOut(64) As Byte
Dim i As Integer
Try
byteOut(0) = Len(orden) + 5 'number bytes in output message
byteOut(1) = &H0 'should be 0 for NXT
byteOut(2) = &H80 '&H0 = reply expected &H80 = no reply expected
byteOut(3) = &H9 'Send Bluetooth
byteOut(4) = &H0 'Box Number - 1
byteOut(5) = Len(orden) + 1 'message size with null terminator
For i = 1 To Len(orden) 'copy bytes into output array
byteOut(i + 5) = Asc(Mid(orden, i, 1))
Next
byteOut(Len(orden) + 6) = &H0 'add null terminator
SerialPort1.Write(byteOut, 0, Len(orden) + 7) 'send message
Catch ex As Exception
MsgBox(ex.ToString)
End Try
End Sub

Private Sub Button6_Click(sender As System.Object, e As System.EventArgs) Handles Button6.Click
orden = "derecha"
Dim byteOut(64) As Byte
Dim i As Integer
Try
byteOut(0) = Len(orden) + 5 'number bytes in output message
byteOut(1) = &H0 'should be 0 for NXT
byteOut(2) = &H80 '&H0 = reply expected &H80 = no reply expected
byteOut(3) = &H9 'Send Bluetooth
byteOut(4) = &H0 'Box Number - 1
byteOut(5) = Len(orden) + 1 'message size with null terminator
For i = 1 To Len(orden) 'copy bytes into output array
byteOut(i + 5) = Asc(Mid(orden, i, 1))
Next
byteOut(Len(orden) + 6) = &H0 'add null terminator
SerialPort1.Write(byteOut, 0, Len(orden) + 7) 'send message
Catch ex As Exception
MsgBox(ex.ToString)
End Try
End Sub

Private Sub Button7_Click(sender As System.Object, e As System.EventArgs) Handles Button7.Click
orden = "parar"
Dim byteOut(64) As Byte
Dim i As Integer
Try
byteOut(0) = Len(orden) + 5 'number bytes in output message
byteOut(1) = &H0 'should be 0 for NXT
byteOut(2) = &H80 '&H0 = reply expected &H80 = no reply expected
byteOut(3) = &H9 'Send Bluetooth
byteOut(4) = &H0 'Box Number - 1
byteOut(5) = Len(orden) + 1 'message size with null terminator
For i = 1 To Len(orden) 'copy bytes into output array
byteOut(i + 5) = Asc(Mid(orden, i, 1))
Next
byteOut(Len(orden) + 6) = &H0 'add null terminator
SerialPort1.Write(byteOut, 0, Len(orden) + 7) 'send message
Catch ex As Exception
MsgBox(ex.ToString)
End Try
End Sub

' NOTA: El código anterior se podría haber simplificado creando una Subrutina del envío de señal por Bluetooth.

 

 

- Programa para el Robot LEGO

Código del programa para el Robot LEGO

El Robot está continuamente, en lazo, observando el Texto que se envía mediante Bluetooth.
Si el texto enviado es "izquierda", gira el motor B y el C permanece parado.
Si el texto enviado es "derecha", gira el motor C y el B permanece parado.
Si el texto enviado es "parar", los dos motores se paran.

' NOTA: He quitado el código del LEGO donde aparecía el valor del TextBox en la pantalla.


__________________________________

 

- Ahora se trata de lo contrario, se acciona un sensor del LEGO y lo detecta el Visual Basic mediante Bluetooth.

Ahora pretendemos lo siguiente, accionar el sensor de contacto (switch) del LEGO y que esa acción llegue por Bluetootn al Visual Basic.

Nos basamos en este tutorial: http://www.forum.nxt-roboter.de/viewtopic.php?f=79&t=2971&p=24377

Var también http://beta.appinventor.mit.edu/learn/reference/components/legomindstorms.html#NxtTouchSensor

- Los códigos están sacados de Appendix 2-LEGO MINDSTORMS NXT Direct commands.pdf

- Pulsamos el Button1 para conectar. Esperamos que conecte.
- Pulsamos el Button2
- Debemos iniciar el sensor mediante SETINPUTMODE
- Luego leemos el sensor mediante GETINPUTVALUES

Código del programa en Visual Basic

' Creamos un formulario con 2 Buttons, 23 Label y 1 SerialPort

Public Class Form1
' http://ebookbrowse.com/lego-mindstorms-nxt-direct-commands-pdf-d279099991

Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
Try
With SerialPort1
.PortName = "COM6" '<<<< Change this number for your computer
.BaudRate = 96000
.Parity = IO.Ports.Parity.None
.DataBits = 8
.StopBits = IO.Ports.StopBits.One
.ReadTimeout = 300 '300ms
.WriteTimeout = 300 '300ms
End With
SerialPort1.Open()
Label1.Text = "Conectado"
Catch ex As Exception
MsgBox(ex.ToString)
End Try
End Sub

Private Sub Button2_Click(sender As System.Object, e As System.EventArgs) Handles Button2.Click
Dim byteOut(9) As Byte
Dim byteIn(9) As Byte
Try
' Primero establecemos el SETINPUTMODE
byteOut(0) = &H5 ' Cantidad de bytes que va a enviar - 2
byteOut(1) = &H0 ' Siempre 0

byteOut(2) = &H0 ' &H0 = reply expected &H80 = no reply expected
' Si ponemos 80 obtenemos 18 valores, empezando por 16-0-2-7.... (En este caso anular los Label19 a Label23)
' Si ponemos 00 obtenemos 23 valores, empezando por 3-0-2-5-0-16-0-2-7-...

byteOut(3) = &H5 ' Comando de SETINPUTMODE
byteOut(4) = &H3 ' El puerto 3, es el marcado como 4, es el último.
byteOut(5) = &H1 ' Tipo de sensor SWITCH. Prueba con otros sensores
byteOut(6) = &H20 ' Modo BOOL
SerialPort1.Write(byteOut, 0, 7) ' El último número es la cantidad de bytes que se envía

' Después lee mediante el GETINPUTVALUES
byteOut(0) = &H3 ' Cantidad de bytes que va a enviar - 2
byteOut(1) = &H0 ' Siempre 0

byteOut(2) = &H0 ' &H0 = reply expected &H80 = no reply expected
byteOut(3) = &H7 ' Comando a enviar (GETINPUTVALUES)
byteOut(4) = &H3 ' Puerto 3 (Los puertos son 0, 1, 2 y 3 pero están marcados 1, 2, 3 y 4)
SerialPort1.Write(byteOut, 0, 5) ' El último número es la cantidad de bytes que se envía

' Lee todos los bytes y los presenta en Label

Label1.Text = SerialPort1.ReadByte
Label2.Text = SerialPort1.ReadByte
Label3.Text = SerialPort1.ReadByte
Label4.Text = SerialPort1.ReadByte
Label5.Text = SerialPort1.ReadByte
Label6.Text = SerialPort1.ReadByte
Label7.Text = SerialPort1.ReadByte
Label8.Text = SerialPort1.ReadByte
Label9.Text = SerialPort1.ReadByte
Label10.Text = SerialPort1.ReadByte
Label11.Text = SerialPort1.ReadByte
Label12.Text = SerialPort1.ReadByte
Label13.Text = SerialPort1.ReadByte
Label14.Text = SerialPort1.ReadByte
Label15.Text = SerialPort1.ReadByte
Label16.Text = SerialPort1.ReadByte
Label17.Text = SerialPort1.ReadByte
Label18.Text = SerialPort1.ReadByte
Label19.Text = SerialPort1.ReadByte
Label20.Text = SerialPort1.ReadByte
Label21.Text = SerialPort1.ReadByte
Label22.Text = SerialPort1.ReadByte
Label23.Text = SerialPort1.ReadByte

Catch ex As Exception
MsgBox(ex.ToString)
End Try
End Sub
End Class

NOTAS:

byteOut(2) = &H0 ' &H0 = reply expected &H80 = no reply expected
' Si ponemos 80 obtenemos 18 valores, empezando por 16-0-2-7.... (En este caso anular los Label19 a Label23)
' Si ponemos 00 obtenemos 23 valores, empezando por 3-0-2-5-0-16-0-2-7-...

Los puertos se enumeran en el código como 0, 1, 2 y 3. En cambio en el LEGO están grabados como 1, 2 , 3 y 4.

- Aquí puedes obtener información sobre el protocolo de envío y los códigos de los sensores:
Los códigos están sacados de Appendix 2-LEGO MINDSTORMS NXT Direct commands.pdf


- Observamos que cuando pulsamos el sensor de contacto en el LEGO, varios Label cambian su valor del 185 a 255.
- Podemos probar con otros tipos de sensores.

Se podría haber puesto un Timer con un Interval de 100, por ejemplo para que lea automáticamente la señal, en vez de pulsar el botón.

- Ahora con un HScrollBar que cambia el valor de la velocidad del motor.

En este ejemplo he importado un bloque llamado de Texto a número que lo puedes bajar de aquí: textoanumero
- Lo bajas, lo descomprimes. Luego vas al Programador de LEGO / Tools (Herramientas) / Importar o Exportar bloques / Importar y localizas la carpeta donde lo has descomprimido.
- A partir de ahora contarás con un bloque llamado de texto a número. (Distinto de otro que ya tenía por defecto llamado de número a texto).

Código del programa para el Robot LEGO

Primero lo intento con este sencillo código pero no funciona...

Luego creo este otro código, en este caso solo funciona cuando ponemos que el motor gire durante un determinado tiempo,
en cambio si pongo las opciones de tiempo ilimitado, grados o giro, no funciona.
He importado y utilizado un bloque personalizado bajado de internet llamado de Texto a Número.

Cuando cambia el valor del Scroll, se envía su valor mediante Bluetooth al LEGO.
El valor se presenta en pantalla, se convierte a número y controla la velocidad del motor.

Private Sub HScrollBar1_Scroll(sender As System.Object, e As System.Windows.Forms.ScrollEventArgs) Handles HScrollBar1.Scroll
orden = HScrollBar1.Value
Dim byteOut(64) As Byte
Dim i As Integer
Try
byteOut(0) = Len(orden) + 5 'number bytes in output message
byteOut(1) = &H0 'should be 0 for NXT
byteOut(2) = &H80 '&H0 = reply expected &H80 = no reply expected
byteOut(3) = &H9 'Send Bluetooth
byteOut(4) = &H0 'Box Number - 1
byteOut(5) = Len(orden) + 1 'message size with null terminator
For i = 1 To Len(orden) 'copy bytes into output array
byteOut(i + 5) = Asc(Mid(orden, i, 1))
Next
byteOut(Len(orden) + 6) = &H0 'add null terminator
SerialPort1.Write(byteOut, 0, Len(orden) + 7) 'send message
Catch ex As Exception
MsgBox(ex.ToString)
End Try
End Sub

__________________________________

- Control del Robot mindstorms LEGO mediante un programa para los teléfonos móviles con Android, realizado mediante APP inventor.

- Ver un tutorial de iniciación a Appinventor

Basado en el siguiente tutorial: NXTRemoteControl

Bajar el proyecto: Bluetooth_LEGO.zip

El apk: Bluetooth_LEGO.apk

En el NxDrive1 y en el NxtUltrasonicSensor1 poner la propiedad BluetoothClient en BluetoothClient1

________________________________

- Mi correo:
juana1991@yahoo.com
- KIO4.COM - Política de cookies. Textos e imágenes propiedad del autor:
© Juan A. Villalpando
No se permite la copia de información ni imágenes.
Usamos cookies propias y de terceros que entre otras cosas recogen datos sobre sus hábitos de navegación y realizan análisis de uso de nuestro sitio.
Si continúa navegando consideramos que acepta su uso. Acepto    Más información