Archivo mensual: Noviembre 2016

VirtualBox (configurando la red)

Hoy vamos a ver todas las posibilidades que tenemos en la configuración de redes de VirtualBox, que nos son pocas, según nuestras necesidades.

Antes de nada comentar en pocas palabras que es VirtualBox, y es tan sencillo como decir que es un software de virtualización del tipo hosted (debe instalarse sobre un sistema operativo que llamaremos anfitrion)  con muchas características de configuración ya sean RAM, vCPU, USB, audio, puerto serie y el tema que nos ocupa hoy las tarjetas de red con sus redes asociadas y con licencia GPL.

Y como esta bien conocer los origenes diremos que VirtualBox nació de la empresa Innotek como un producto de pago y una versión reducida gratuita, en el 2.008 Sun Microsystems la compro y dos años más tarde SUN es comprada por Oracle. Oracle paso el producto a licencia GPL a excepción de los componentes (USB, VRDP, PXE y PCI) que se deben instalar con el paquete extension Pack

Antes de empezar vamos a definir una serie de términos que nos ayudaran a comprender el resto del articulo.

  • SO anfitrión o maquina anfitrión: Es la maquina donde se ejecuta el VirtualBox .
  • SO o maquina invitada o huesped: es la maquina que se virtualiza.
  • Maquina virtual “MV: La maquina virtualizada en el VirtualBox.
  • Red Publica: La red que saldrá a internet.
  • Red Local: La red donde se encuentro anfitrion, y estará cableada o por WIFI.
  • Red Interna: Es una red que se crea dentro de nustras maquinas virtuales.
  • NIC: Tarjeta de red Ethernet virtual de las que disponen las maquinas virtuales.

La configuración de VirtualBox se puede realizar con su interfaz gráfico, es el que comentaremos por su facilidad ya que hoy nos interesa quedarnos con los conceptos de lo que podemos hacer en lo que a redes de comunicación se refiere, o por comando “VBoxManage”.

Una MV puede tener hasta 8 NIC (Tarjetas de red Ethernet) aunque con el interfaz gráfico solo podremos definir 4, pudiendo indicar por separado el tipo de Hardware a emular y la red a la que se conecta. Para configurar la red nos vamos a configuración y luego a red.

red

Como vemos disponemos de 4 adaptadores (NICs) aunque en realidad podamos definir 8, estas tarjetas se conectaran a una red especifica (modos de red) que hablaremos más adelante pues es el grueso de este POST y son: No conectado, NAT, Red NAT, Adaptador puente, Red interna, solo anfitrión, controlador genérico.

Una vez que hemos definido el modo de red(más adelante los comentamos y ponemos ejemplos) pondremos el adaptador de red o hardware de red que simulara VirtualBox y por lo tanto vera la MV y pueden ser:

  • AMD PCNet PCI II (Am79C970A)
  • AMD PCNet FAST III (Am79C973) Es el valor por defecto ya que es el más compatible, si el SO invitado no soporta este hardware seguro que podremos usar Intel PRO / 1000
  • Intel PRO/1000 MT de Desktop (82540EM), Intel PRO/1000 T Server (82543GC),  Intel PRO/1000 MT Server (82545EM);
  • Red paravirtualizada (virtio-net). En este caso VirtualBox no virtualiza el hardware (lo que puede mejorar el rendimiento) y se usa un interfaz por Software que es parte del proyecto KVM. Esta opción se usa en entornos virtualizados.

Modo promiscuo, nos permite ver por ese adaptador de red todo el trafico que circula por la red no solo el que va a la tarjeta, debe activarse si vamos a poner un sniffer, y salvo en los modos de red NAT y controlador generico lo podemos activar en los otros. Las opciones son denegar, MV o todo el trafico.

Direcciones MAC: Esta claro como en una misma red no podemos tener tarjetas con la misma MAC la cambiaremos para que no se repita.

Cable conectado: Nos permite emular la desconexión del cable de la maquina virtual.

Y pasamos a lo realmente interesante que es los

Modos de red

No conectado: Es lo mismo que no tener conectado el cable, esto lo tendremos cuando no sepamos el modo en el que pondremos la tarjeta, ya que una vez que lo tengamos y lo configuremos si queremos desconectar el cable lo mejor es la opción anterior.

NAT: No permite el modo promiscuo y es la opción más sencilla y logramos que nuestra MV se pueda conectar a Internet, siempre que el anfitrión pueda, pero no se podrá conectar al anfitrión ni a otras maquinas. La visión a nivel red seria como si pusiéramos un router entre la maquina virtual y la salida a internet.

nat

cada MV tendra su propio router con router NAT tendrá la dirección de red y por defecto sera 10.0.X.2 la del router y 10.0.X.15 la de la MV, DHCP en la 10.0.X.3 y la 10.0.X.4 un servidor TFTP que usa VirtualBox , dependiendo X del NIC al que se asocie siendo la primera tarjeta el 2, la segunda el 3 y así sucesivamente, esto nos indica que este router NAT es tambien un servidor DHCP.

Si se quisiera cambiar este direccionamiento, no lo podriamos realizar por el interfaz gráfico y se realizaría por comando “VBoxManage modifyvm “nombre de máquina virtual” –natnet1 “Direccionamiento / Rang“.

Aunque la MV en modo NAT decimos que es una isla y ni el anfitrión puede verla, no es del todo cierto pues podemos hacerla visible por maquinas de la red publica gracias al router NAT y la redirección de puertos que realizaremos esta vez si por el interfaz gráfico u”Reenvío de puertos” del adaptador correspondiente.

redireccion

Esto permitirá que VirtualBox escuche estos puertos y reenvié estos paquetes a la dirección del invitado e incluso a un puerto diferente, ojo no ejecutar mismos servicios en el anfitrión y la MV o entre distintas MV. Esta opción podría ser interesante para que un servicio que se ejecuta en una MV no comprometa la seguridad del anfitrión, así podría tener un telnet abierto pero no en el anfitrión sino en una MV aislada.

Red NAT: Es más avanzada que la anterior ya que este router NAT nos permite conectar a el otras maquinas de forma que todas las MV que estén en esta red se podrán ver. Este router seria similar al que tenemos en casa pero para una red de VirtualBox

Por lo tanto lo primero que deberemos crear son estas redes y para eso vamos a “Archivos->Preferencias” y en esa ventana Red y definimos las redes NAT.

redprefeencias

Dando al “+” nos crea una red y en la llave podemos configurarla incluso inhabilitarla.

  • Nombre de la red.
  • Red CIDR: Tan simple como la red que asignamos por ejemplo 192.50.0.0/16
  • Soporte DHP
  • Soporte de IPV6
  • Reenvió de puertos

La puerta de enlace o router sera sera 192.50.0.1,

rednat

Luego tan sencillo como indicar que es una red NAT y decidir a que red NAT se conecta ese NIC.

Adaptador Puente: En este caso se crea un Switch virtual de forma que tanto la tarjeta virtual (NIC) de la MV y la tarjeta física del anfitrión se conectan a el de forma que tanto las MV como el anfitrión estan en la misma red. Los paquete se intercambian directamente sin pasar por la pila de red del sistema operativo.

adaptadorpuente

Si en el anfitrión disponemos de varias tarjetas de red fisicas, ya sean de cable o WIFI, se deberá indicar a cual de ellas se conecta de forma que si nos conectamos a la tarjeta de WIFI y cortamos esta la MV también se quedara sin conexión.

La configuración en la MV debera de ser una configuración igual a la realizada en el anfitrión y deberemos darle una dirección de la red del anfitrión que este libre.

Red interna: Nos permite crear una red en la que solo son visibles las MVirtuales que están en esa red. Cuando definimos una tarjeta como red interna nos pedirá el nombre de esta red, que seleccionaremos en el desplegable y que por defecto es “intnet”.

Si queremos que esta red interna tenga salida a internet alguno de las MV deberán tener una de las NIC configurada como NAT o como adaptador puente y así servirá de  router.

ri_nat

RedInterna – NAT

ri_puente

Red Interna con Puente

Solo anfitrión: Podemos que decir que es un hibrido en el que tenemos una red interna en la cual las MVs se ven entre ellas y a la vez podemos tener acceso al anfitrión, la ventaja es que no es necesario un puente el cual obliga a la red a estar conectada en el anfitrión ya que se crea una tarjeta virtual en el anfitrión.

 

Lo próximo es poner un ejemplo con diversas maquinas (físicas y virtuales) y distintas redes con sus router y FW físicos y virtuales, pero esto lo dejamos para otro momento.

Realizar los comentarios que queráis y  que os gustaría que apareciese en el Ejemplo que desarrollaremos otro día.

Uso modulo bluetooth (HC-05) en Arduino

El primer  POST recuperado del anterior servidor creemos que debía ser  uno más de Arduino y exactamente el uso de un modulo Bluetooth (CZ-HC-05) y un ejemplo de uso de señales digitales y analógicas.

Empezamos con un circuito que nos permite conectarnos a un dispositivo (móvil android en nuestro caso) por Bluetooth, explicando no solo la forma en la que podemos usar el modulo de bluetooth (en nuestro caso CZ-HC-05 gomcu) en modo comando y comunicación sino también ya de paso el uso de señales digitales y analógicas con arduino.

El circuito y programa que vamos a explicar esta en “http://fritzing.org/projects/uso-de-bluetooth-modulo-hc-05”.

montajebluetooch

Necesitaremos para este montaje
Modulo bluetooth HC-05 que se puede comportar como maestro, yo he utilizado el CZ-HC-05)

  • Un arduino, he utilizado un arduino UNO.
  • Potenciómetro 100K
  • 2 Led normales y uno RGB
  • 5 resistencias (10K, 100Ω (2), 470Ω y 220Ω)

Pequeñas nociones de Bluetooth

El Bluetooth es una comunicación inalámbrica en la banda de 2,4 GHz. Existen dos modelos de módulos Bluetooth: el HC-05 que puede ser maestro/esclavo (master/slave), y el HC-06 que solo puede actuar como esclavo (slave). El maestro es el que conecta a los esclavos ya que no solo puede conectarse a uno sino puede tener una red de dispositivos, hasta 7 esclavos, los esclavos solo pueden hablar con el maestro y este con todos sus esclavos.

El dispositivo bluetooth tienen una dirección de dispositivo única de 48-bits “BD_ADDR”, como también puede tener un nombre que definimos nosotros esto es lo que usaremos “AT+NAME” ya que nos facilitara sus localización. Cuando un maestro lanza una búsqueda de dispositivos estos contestan con su dirección y nombre. Si dos dispositivos están vinculados no lanzan esta búsqueda cuando se encuentra en rango se conectan.

Los protocolos de comunicación de los dispositivos bluetooth, les llamamos perfile(https://es.wikipedia.org/wiki/Perfil_Bluetooth) y los más importantes son:

  • SPP (Serial Port Protocol) Como si fuera una conexión serie y es el ideal para ráfagas de datos.
  • HSP (Headset Profile ) Para comunicación con auriculares.
  • HID (Human Interface Device Profile) Ratones y teclados.

Descripción de nuestro modulo HC-05

Como hemos dicho este modulo nos permite trabajar como esclavo o maestro, HC-05 podemos decir que es el integrado que usa nuestro modulo CZ-HC-05, esto permite poner 5v en VCC cuando en realidad el integrado HC05 trabaja con 3v.

El patillaje es el siguiente:

  1. VCC – 3,6-6v
  2. GND – Masa
  3. TXD – Va a la recepción del arduino
  4. RXD – Va a la transmisión del arduino 3,3v
  5. KEY – En alto se pone en modo comando. Para poder introducir comandos ATs.
  6. LED – Se conecta un led para ver cuando tiene comunicación.

Para poner el modo comando cortaremos la alimentación, pondremos en alto el pin KEY y volveremos alimentar. Para pasar a modulo de comunicación realizamos lo mismo pero con el KEY en bajo.

En modo comando podremos configurar mediante comandos ATs el modulo, recordar entre comando y comando deberemos esperar un segundo, y debemos terminar estos con un retorno de carro (\r código 13) y un fin de linea (\n código 10) y los comando más interesantes son:

  1. AT (es un test) la respuesta sera OK si la comunicación ha sido correcta.
  2. AT+VERSION Nos da la versión del modulo.
  3. AT+ORGL Que pone los parámetros de fabrica.
  4. AT+NAME? Da el nombre del dispositivo.
  5. AT+NAME= Ponemos un nuevo nombre al dispositivo.
  6. AT+ROLE=0 Nos ponemos en modo esclavo (podría se 1 maestro)
  7. AT+PSWD? Nos da la clave del dispositivo
  8. AT+PSWD= Ponemos una nueva clave
  9. AT+UART? Configuración de conexión
  10. AT+UART=<baudios>,<stop>,<paridad> Configuramos los parámetros de comunicación.

 

bluetooth_board

 

Explicación del código

Una vez que tenemos el circuito echo y programado pasamos a explicar partes del código que nos puede interesar.

Lo primero es indicar que partes del código nos permiten comunicarnos con el modulo, este se programa vía serie pero para no utilizar los pines (0 y 1) y así poder seguir usando la consola serie para depuración usaremos los pines (10 y 11)

#include <SoftwareSerial.h> // Comunicación serie en otros pins

SoftwareSerial BT(10,11); //10 RX, 11 TX. // Así tendremos el objeto BT que es por el que nos comunicamos.

Definimos la velocidad de comunicación, de la misma manera que se realizar el uso de la consola, ya que trabajaremos igual con la diferencia que en este caso la comunicación va por los pines definidos anteriormente.

BT.begin(38400); // Velocidad del equipo HC-05

Para poder pasar de modo comando a comunicación hemos creado la función modo_Comando que según se pase como parámetro 1 o 0 pondremos el modulo en una u otra forma de trabajo.

//////////////////////////////////////////////////////////////////////////////////////////////////////

// Modo_Comando(HIGH-Comamdo, LOW-Transmisión)

//

// Reinicia el modulo en modo comando o transmisión

/////////////////////////////////////////////////////////////////////////////////////////////////////

void modo_Comando(boolean modo)

{

   digitalWrite(Pvcc, LOW); // Apaga el modulo

   delay (500) ;

   digitalWrite(Pkey, modo); // Pone el modo

   delay (500) ;

   digitalWrite(Pvcc, HIGH); // Enciendo el modulo en el estado.

   if (modo) Serial.println(“Activamos el modo comando del HC-05”);

   else Serial.println(“Activamos el modo transmisión”);

}

Vemos como con las funciones “digitalWrite” eliminamos la alimentación que se realiza por el pin 8, ya que el consumo del modulo es muy pequeño, y cambiamos el estado de la pata KEY que se conecta al pin 9.

Luego tenemos la función “comando” que envía una transmisión mediante la función “escribe” y espera una respuesta mediante la función “lee”. Estas dos funciones son las mismas que usamos en modo comunicación y la hemos aprovechador tanto que la escritura a otro dispositivo va con el retorno de carro y nueva linea necesario para los comando ATs, no estorban pero si nuestro protocolo no lo necesitara deberíamos retocar estas funciones.

Y así se trabaja con el modulo como podéis ver es muy sencillo, ya que el arduino espera datos de otro dispositivo y también los envía yo he utilizado una aplicación de android ya echa que es “Bluetooth Terminal” muy sencilla y nos permite depurar nuestros protocolos de comunicaciones, para luego poner los dispositivos adecuados. En nuestro caso el protocolo es sencillo ya que la aplicación es sencilla ya que una vez que hemos introducido todos los comandos de configuración necesarios, esto valdría una vez pues los guarda en memoria, por eso muchas veces esta la aplicación de configuración de módulos bluetooth y la de trabajo, pero en nuestro caso es para aprender y ver que podemos tener todo en uno y así justo después pasamos a modo comunicación y ya entramos en la función “loop” que se repite hasta que se apaga el arduino.

Lo primero que se hace en cada ciclo loop, es mirar si el boton que se controla en el pin digital 2 esta pulsado en este caso leemos el valor que tenemos en el potenciómetro conectado al pin analogico A0.

lectura = analogRead(PA0); // Leemos el valor de la entrada analógica A0

para escalar este valor con la función “map”, entre los valores de 100 a 1.000 y enviar ambos valores al dispositivo móvil que tiene la aplicación terminal.

Luego tenemos las pequeñas lineas de código que realizan el parpadeo del led conectado al pin 7, aquí lo que hacemos es usar la función “millis” que recoge los milisegundos que se lleva encendido el arduino (esta función nos aguanta 50 días que son los milisegundos que aguantaría el unsigned long, después se pone a 0) y mira si paso el tiempo especificado para cambiar su estado.

Y luego mira a ver llega algún comando del dispositivo móvil y solo pueden ser 2:

  • L <tiempo> que lo que hace es que cambiaremos el tiempo de parpadeo, que se gestiona en el código anterior,  que se encuentra en la variable “parpadeo“, la conversión a entero se realiza muy fácilmente con la función “toInt”
  • C <rojo>,<verde>,<azul> que pasa los valores que pondremos en el led RGB que esta conectado a los pines 3,5 y 6. La conversión con la función que hemos comentado antes “toInt” y las funciones “substring” y “indexOf” nos permite de forma muy sencilla extraer cada uno de los tres parámetros.

Y ya finalizamos pero y para que era el otro led pues solo para ver como funciona la patilla LED del modulo bluetooth y así tener el chivato de cuando el otros dispositivo se ha conectado a nuestro modulo ya que se encenderá el led.

Os dejo el esquema eléctrico que puede servir de chuleta para ver como conectar sensores, en nuestro caso un potenciometro, a nuestro arduino, o botones.

 

bluetooth_esquema

 

Motores paso a paso en Arduino (MPaP_LIB)

Cambiamos de servidor y por lo tanto un poco de imagen.

La  inauguramos con la publicación de la librería MPaP_lib que he programado para el uso de motores paso a paso (Unipolares) y ya de paso contamos algo de estos maravillosos motores.

motores

Las posibilidades de la librería las puedes ver e “Liberia MPaP_lib” y ahora contaremos algunas cosas de los Motores Paso a Paso que  podrás ver ampliado en el documento PDF que se ha realizado junto a la librería.

Motores paso a paso
Un motor paso a paso es un motor que permite dar pasos precisos tenemos varios modelos ya sean por redundancia variable o los más tipicos y que son los que vamos a tratar los de iman permanente.

  • Estátor: bobina generalmente circular y fija. Por lo general dos bobinados y cuatro polos.
    Rotor: Es la bobina localizada en el centro del estátor, que es móvil y buscara el equilibrio según la polaridad que se aplique a las bobinas del estátor.

Hay dos tipos básicos de motores paso a paso, motores paso a paso unipolares y bipolares motores paso a paso, los primeros de 5 o 6 cables y solo necesitamos activar las bobina, y los otros que son los bipolares que tienen 4 cables ya que no cuentan con el común y su activación debe ser cambiando las polaridades entre las bobinas.

En el documento descriptivo de la librería podemos leer más sobre las característica de los motores paso a paso para saber cual elegimos como son: pasos por vuelta, máxima velocidad, angulo de paso, etc.

Para poder mover el motor es necesario utilizar un circuito llamado Driver Motor que permitirá que aumentar la sencilla potencia que nos da el arduino a la necesaria para poder excitar las bobinas del motor. Sistemas son muchos por transistor, puente H, etc. Nosotros planteamos el uso de un puente H L293.

 

Os dejo la librería y el documento descriptivo de la librería MPaP_lib donde se amplia esta información.

mpapzipDescarga de la librería MPaP_lib

mpap_pdfDescarga del Documento de la librería  con la definición de los motores paso a paso, conexión de estos a un arduino, y uso de la librería MPaP_lib.