Archivo de la etiqueta: Serial

Comunicación Serie Arduino

La comunicación serie es muy importante porque gran parte de los protocolos utilizados actualmente son serie y además muchos dispositivos de comunicación inalámbrica usan la comunicación serie para hablar con Arduino como los módulos bluetooth y los módulos Xbee. También la comunicación serie es la que se usa para comunicar el Arduino con el Ordenador a través del cable USB.

Para manejar el puerto serie en Arduino, debemos leer a fondo la referencia de Arduino:  http://arduino.cc/en/Reference/Serial que son las funciones que tenemos disponibles para trabajar con el puerto serie.

Todas las placas Arduino tienen al menos un puerto serie disponible en los pines digitales 0 (RX) y 1 (TX) compartido con el USB. Por lo tanto no es posible usar estos pines como entradas/salidas digitales.

El Arduino mega dispone de tres puertos adicionales Serial1 on pins 19 (RX) and 18 (TX), Serial2 on pins 17 (RX) and 16 (TX), Serial3 on pins 15 (RX) and 14 (TX). Estos pines no están conectados al interfaz USB del Arduino.

El Arduino Due tiene tres puertos adicionales pero con niveles de 3.3V TTL.

Comunicación serie:

La funciones más importantes que debemos conocer para manejar el puerto serie son: begin(), read(), write(), print() y available())

El código de la librería Serial se encuentra en el core del IDE de Arduino: https://github.com/arduino/Arduino/tree/master/hardware/arduino/avr/cores/arduino. Puede verse en el  código el tamaño del buffer de entrada y salida.

Otra técnica en lugar de usar las funciones “until” o similares, es almacenar en una variable String lo recibido como si fuera un buffer y luego analizarlo con las funciones de String.

Resto de funciones disponible para usar con el puerto serie y ejemplos de uso pueden verse en: https://www.arduino.cc/en/Reference/Serial

En el playground de Arduino tenemos más explicaciones y ejemplos de como funcional el puerto serie en Arduino: http://playground.arduino.cc/ArduinoNotebookTraduccion/Serial

Buffer Serial: los puertos serie de los microcontroladores tienen un buffer que se va llenando hasta que nosotros lo vamos leyendo con la función read() que lo vamos vaciando, es una pila FIFO. El tamaño del buffer serie en el Arduino Uno es de 64 bytes, cuando se llena ese buffer el resto de elementos recibidos se pierden.

Toda la información del puerto seríe del microcontrolador del arduino UNO la tenemos en la página 170 de http://www.atmel.com/images/Atmel-8271-8-bit-AVR-Microcontroller-ATmega48A-48PA-88A-88PA-168A-168PA-328-328P_datasheet_Complete.pdf

Para ampliar información:

Software Serial

¿Y si necesitas más puertos serie que los disponibles en un Arduino? Cada microcontrolador tiene un número de puertos serie hardware (UART), pero se ha desarrollado la librería SoftwareSerial para permitir la comunicación serie sobre otros pines digitales de Arduino, usando software para replicar las funcionalidades de la comunicación serie. Es posible tener varios puertos software serial con velocidades de hasta 115200 bps.

Ver funciones, limitaciones y ejemplos de la librería software serial en: http://arduino.cc/en/Reference/SoftwareSerial

Ejemplo de comunicación serie para comunicar con un shield GSM y mandar SMSs, usando el hw serial sin usar librerías o el sw serial usando librerías: http://arduinoguruji.blogspot.com.es/p/blog-page.html

Terminal Serie

Una vez visto cómo manejar el puerto serie en Arduino, si queremos comunicarnos con Arduino a través del puerto serie desde un ordenador debemos usar un emulador de terminal, el propio IDE de Arduino trae uno, pero existen otros más completos.

Terminales serie:

Otras alternativas al monitor serie: https://www.baldengineer.com/alternatives-to-arduinos-serial-monitor.html

En MAC usando el terminal con la utilidad screen:

ls /dev/tty.* (note the .*at the end) command to list all connected devices

screen /dev/xx.usbserial-XXXXXXXX 115200 –L

Anuncios

Ejemplos con Arrays, strings y Strings

Efectos con leds mejorado

El ejemplo anterior de las luces con el efecto del coche fantástico puede hacerse de una forma más eficiente con el uso de los arrays y la estructura de control for. Además hacer otros efectos de luces o cambios en el realizado es mucho más sencillo usando arrays.

Tutorial: https://www.arduino.cc/en/Tutorial/KnightRider

Solución:

Añadir el cambio de velocidad dentro del código al leer de un potenciómetro de forma que no haya que esperar a un ciclo de loop para cambiar la velocidad: “timer = analogRead(A0);”

O un LDR:

Probar a hacer otros efectos como: https://github.com/jecrespo/Aprendiendo-Arduino/tree/master/Ejercicio48-Efectos_Led

Manejar Strings

Aprender a manejar cadenas de caracteres es muy importante, a lo largo del curso se va a usar muy a menudo para comunicaciones y para interaccionar con el usuario.

Tutoriales para aprender a usar los Strings:

Ejercicio Strings_vs_strings: Partiendo de la base del ejercicio StringsComparisonOperators intentar hacer las operaciones de comparación de igualdad y distinto de los StringOne y StringTwo con string en lugar de String. Ver como es más complicado y para iniciarse en la programación es mejor usar String (objeto) que string (char array).

Solución: https://github.com/jecrespo/Aprendiendo-Arduino/tree/master/Ejercicio18-strings/_5-String_vs_string

Ejercicio String Interactivo: Hacer un programa donde al iniciar Arduino pregunta que introduzca un string cualquiera y lo mando por puerto serie. Luego lo almacena en una variable y muestra lo leído por el puerto serie.

No olvidar poner en el setup() la inicialización del puerto serie: Serial.begin(9600);

Para leer por el puerto serie:

while (Serial.available() == 0){

   //Ho hago nada

 }

 do{

   caracter_leido = Serial.read();

   cadena_Leida += caracter_leido;

   delay(5);

 }  while (Serial.available() > 0);

Solución: https://github.com/jecrespo/Aprendiendo-Arduino/tree/master/Ejercicio18-strings/_6-interactivo

Ejercicio String Numeros: Hacer otra versión del ejercicio anterior donde me pide un número al iniciar Arduino y lo paso por el puerto serie. Luego multiplicar por 15 ese número y sacar por el puerto serie el resultado. En caso que lo introducido no sea un número sacar por pantalla el error.

Esto lo aplicaremos en la práctica de dimmer para manejar la luminosidad de un led con un valor que paso por el puerto serie más adelante.

Recordar que es necesario usar la función toInt(): http://arduino.cc/en/Reference/StringToInt

Solución: https://github.com/jecrespo/Aprendiendo-Arduino/tree/master/Ejercicio18-strings/_7-String_Numeros

Ejercicio coche fantástico 4: Sobre la versión 2 del coche fantástico, modificar el código para que el valor del tiempo que está encendido el led se pase por puerto serie y Arduino lo recoja y lo modifique para cambiar la velocidad a la que lucen los leds.

NOTA: Al igual que modificamos un valor con lo recibido por el puerto serie, la forma de trabajar si la comunicación es por wifi, bluetooth, XBee, etc… es la misma, Arduino está escuchando por el puerto de comunicación y cuando recibe una petición válida ejecuta una acción.

Solución: https://github.com/jecrespo/Aprendiendo-Arduino/tree/master/Ejercicio17-CocheFantastico_4