aplicación de un sistema operativo de tiempo real (rtos) en un robot arduino
DESCRIPTION
Trabajo Final para la cátedra Diseño de Sistemas de Tiempo Real. En este trabajo se muestra desde cómo armar el robot con las piezas compradas hasta cómo modificar y adaptar RTuinOS (un SO de Tiempo Real) para que funcione en nuestro Arduino.TRANSCRIPT
Aplicacion de un Sistema Operativo de TiempoReal (RTOS) en un robot Arduino
Charnelli, Marıa Emilia
Catedra: Diseno de Sistemas de Tiempo Real // Facultad de Informatica - UNLP
13 de noviembre de 2013
¿Que es Arduino?
Arduino es una plataforma electronica abierta y libre para lacreacion de prototipos basada en software y hardware flexibles yfaciles de usar.
El hardware consiste en una placa con un microcontroladorAtmel AVR y puertos de E/S.
Los microcontroladores mas usados son elAtmega168,328,1280,8 por su sencillez y su bajo costo.
El microcontrolador en la placa Arduino se programamediante el lenguaje de programacion Arduino (basado enWiring) y el entorno de desarrollo Arduino (basado enProcessing).
El Lenguaje de programacion Arduino se basa en C/C++.
Piezas del robot adquiridas
El kit de piezas utilizadas para armar nuestro robot fue el 2WDUltrasonic Smart Car Kits.
Piezas del robot adquiridas
Este kit traıa las siguientes piezas:
2 x Motores
2 x Ruedas
1 x Rueda omni-direccional
1 x L298N motor driver
1 x Atmega328
1 x Funduino Keyes Duemilanove
1 x Modulo ultrasonico. Sensor de Distancia HC-SR04
1 x Mini protoboard
1 x Soporte para baterıa ( AA y de 9V)
1 x Cable USB
Fuera del kit, se compro una placa JY-MCU Bluetooth WirelessSerial
Funduino Keyes Duemilanove
clon del Arduino Duemilanove
basada en el ATmega168 o el ATmega328
14 pines con E/S digitales (6 pueden ser salidas PWM)
6 entradas analogicas
un cristal oscilador a 16Mhz
una cabecera ISCP
Se puede conectar a una computadora a traves del cable USB oalimentandolo con un transformador o una baterıa.
Funduino Keyes DuemilanoveMemorias
ATmega328 tiene 32KB (el ATmega168 tiene 16 KB) dememoria flash
ATmega328 tiene 2 KB (Atmega168 1 KB) de memoriaSRAM
ATmega328 tiene 1KB (ATmega168 512 bytes) de EEPROM
Funduino Keyes DuemilanoveEntradas y Salidas
14 pines digitales como entradas o como salidas usando lasfunciones pinMode(), digitalWrite(), y digitalRead()
Las E/S operan a 5 voltios
Cada pin puede proporcionar o recibir una intensidad maximade 40mA y tiene una resistencia interna (desconectada pordefecto)de 20-50kOhms
Funduino Keyes DuemilanoveEntradas y Salidas
Ademas, algunos pines tienen funciones especializadas:
Serie: 0 (RX) y 1 (TX). Usado para recibir (RX) y transmitir(TX) datos a traves de puerto serie TTL.
Interrupciones Externas: 2 y 3. Estos pines se puedenconfigurar para lanzar una interrupcion en un valor LOW(0V),en flancos de subida o bajada, o en cambios de valor.
PWM: 3, 5, 6, 9, 10, y 11. Proporciona una salida PWM(Pulse Wave Modulation, modulacion de onda por pulsos) de8 bits de resolucion (valores de 0 a 255).
LED: 13.
ATmega328
El ATmega328 es un chip microprocesador creado por Atmel y queforma parte de la serie megaAVR.
Conjunto reducido de instrucciones (RISC)
Bus de datos de 8 bits.
Basado en la arquitectura AVR
Microcontrolador simple, de baja potencia y bajo costo.
ATmega328Componentes principales
32 KB de memoria flash ISP con capacidades de lectura yescritura,
Una memoria no volatil EEPROM de un 1KB,
Una memoria volatil SRAM de 2KB,
23 lıneas de E/S de proposito general,
32 registros de proposito general,
Tres temporizadoradores/contadores,
Interrupciones internas y externas,
Un modulo USART que recibe y transmite datos por el puertoserie,
Una interfaz serie de 2 cables (TWI) orientada a bytes,
Un puerto serie SPI,
Un conversor A/D de 10 bits,
Un timer programable con oscilador interno.
Modulo ultrasonico. Sensor de Distancia HC-SR04
Mide las distancias de algun objeto cercano desde 2cm hasta450cm.Angulo eficaz del sensor: no mas de 15o gradosPrecision: cerca de los 2mmModulo de muy bajo costoCompatible con Arduino y otras plataformas demicrocontroladores.Pin trig (emite el pulso de ultrasonido)Pin echo (captura el pulso reflejado por el objeto)
Modulo JY-MCU Bluetooth Wireless Serial Port
Dispositivo puerto serie bluetooth inalambrico
Distancia maxima de transmision: 10 metros
Velocidad de transmision: 9600bps (standard)
Barato y facil de usar.
Como armar el Robot con las piezas compradas
Armar el robot con las piezas compradas requiere un poco deingenio, ya que el kit comprado no trae un manual para armarlo.Algunas problematicas encontradas fueron:
Conjunto de piezas que no encastraban.
Tornillos que no alcanzaban.
Cables dupont que solo eran hembra-hembra.
En internet se pueden ver diferentes estrategias de armado.
Implementacion de las funcionalidades del robot
Diseno orientado a objetos.
Clase Brillo representa al robot.
Compuesto por un Sensor, una instancia de SoftwareSerial ydos instancias MotorProvee metodos de inicializacion y manipulacion del robot
Clase SensorUtiliza la librerıa Servo para controlar el rotor del sensor.Utiliza la librerıa NewPing que permite la medicion dedistancias
Implementacion de las funcionalidades del robot
Figura : Diagrama de Clases
Instalar un SO de Tiempo Real. RTuinOS¿Que es RTuinOS?
RTuinOS es un pequeno Sistema de Tiempo Real (RTOS eningles) para Arduino.El funcionamiento del Arduino tradicional tiene dos puntos deentrada:
funcion de configuracion, que es el lugar para poner elcodigo de inicializacion necesario para ejecutar el programa
bucle de la funcion, que se llama periodicamente. Lafrecuencia del bucle no es determinista sino que depende deltiempo de ejecucion del codigo dentro del bucle.
Usando RTuinOS, las dos funciones mencionadas arriba siguenexistiendo y siguen teniendo el mismo significado. Sin embargo,como parte de la configuracion se pueden definir una serie detareas que tengan propiedades distintas.
Instalar un SO de Tiempo Real. RTuinOS
Las tareas se ejecutan de forma semiparalela
RTuinOS brinda primitivas de sincronizacion y exclusionmutua.
Las tareas se ejecutan repetidamente dentro del bucle de lafuncion principal.
La funcion loop() se convierte en la tarea ociosa de RTOS.
Las tareas pueden ser:
comunescontroladas por tiempocontroladas por eventospueden tener diferentes prioridades
El scheduling puede ser preemptive o cooperativo, utilizandoslices de tiempo y/o un patron round robin.
Instalar un SO de Tiempo Real. RTuinOS
Por defecto, la distribucion se compila para Arduino 1.0.1, y solosoporta el AtMega 2560. De forma que funcione en otrosmicroprocesadores se debe adaptar el codigo, tal comomostraremos en las siguientes diapositivas.
Este SO se puede descargar desde dehttps://github.com/PeterVranken/RTuinOS
Instalar un SO de Tiempo Real. RTuinOSTareas de Tiempo Real
una tarea esta representada por un objeto task
los objetos task se alocan estaticamente, no hay creacion oeliminacion dinamica
los objetos se configuran en la funcion setup de Arduino.
las prioridades de las tareas se determinan en tiempo decompilacion de la aplicacion.
Instalar un SO de Tiempo Real. RTuinOSImplementacion de un Aplicacion RTuinOS
Para crear una aplicacion RTuinOS se debe crear una carpetavacıa en la carpeta /src/applications.
Basicamente se tendran dos archivos:programa.c que definira funciones:
setup,loop,y las tareas
Archivo rtos.config.c con las configuraciones de RTuinOS.
Se podran definir todas las clases que sean necesarias.
Instalar un SO de Tiempo Real. RTuinOSConfiguracion de RTuinOS
La creacion de una aplicacion RTuinOS comienza con laconfiguracion del sistema.
Copiar plantilla rtos.config.template.h y cambiar el nombre artos.config.h
Definir no de tareas (ademas de la tarea ociosa)
Definir el no de clases de prioridad
Habilitar o no la estrategia round robin (por defectodesactivada)
Establecer la resolucion del temporizador del sistema
Definir eventos
etc
Instalar un SO de Tiempo Real. RTuinOSInicializacion de RTuinOS: setup
La aplicacion RTuinOS comienza con una llamada a la funcionsetup().
funcion invocada desde el codigo de inicio Arduino (y tambiendesde el codigo de inicializacion de RTuinOS)
sin esta funcion no se podra construir el ejecutable
definira todo el codigo de inicializacion de las tareas.
por cada tarea definida se debera llamar a la funcionrtos initializeTask()
funcion que especifica las propiedades de una tareano retorna nada.recibe el conjunto de eventos por los que la tarea esperara paraejecutarse la primera vez.
Instalar un SO de Tiempo Real. RTuinOSLa tarea de inactividad: loop
La tarea de inactividad de RTuinOS consiste en invocarrepetidamente a la funcion void loop.
la ejecucion de este codigo se realiza solo si ninguna otratarea requiere utilizar la CPU.
tipicamente, contiene codigo que no tiene restricciones detiempo real.
un uso tıpico es la de realizar tareas diagnosticas.
si no se requiere una tarea de inactividad, o no hay tiempoinactivo simplemente se puede dejar la funcion loop con uncuerpo vacıo.
Instalar un SO de Tiempo Real. RTuinOSCompilar una aplicacion RTuinOS
El Makefile provisto por RTuinOS esta realizado para Windows,por lo que para poder compilarlo en Linux -distribucion utilizada-se utilizo Inotool. Para ello, se debe:
Crear una carpeta vacıa e inicializar un proyecto ino (ino init)
Copiar en esta carpeta nuestra aplicacion ubicada enRTuinOS/code/applications en la carpeta /src
Copiar en esta carpeta textbfRTuinOS/code/RTOS
Cambiar los path relativos
Cambiar los archivos con extension .c por .cpp
Borrar sketch.ino, ya que los metodos setup y loop estan en elprograma realizado utilizando RTuinOS.
Tener en cuenta que cuando se trabaja con Linux este escase-sensitive
Instalar un SO de Tiempo Real. RTuinOSBrillo. Caso de Estudio
Para que funcione para el ATmega328 se debieron hacer algunasmodificaciones:
Modificacion en la interface global de RTuinOS: rtos.c Lo quevarıa entre ambos microprocesadores es el manejo de las pilas,ya que el atmega328p utiliza 8 bits y no 16 bits como elATmega2560. Esto se puede verificar viendo las hojas dedatos de ambas arquitecturas en la pagina oficial de Atmel.Por lo tanto se debe modificar la macro que prepara el area dela pila todavıa no utilizada de una nueva tarea.
Instalar un SO de Tiempo Real. RTuinOSBrillo. Caso de Estudio
1 static void TareaMovilidad(uint16_t initCondition)
2 {
3 do {
4 switch(estado) {
5 case NORMAL:
6 b.setVelocidad (4);
7 break;
8 case CUIDADO:
9 b.setVelocidad (0);
10 break;
11 case FIN_BARRIDO:
12 if (muestras [0] < muestras [2]) {
13 b.doblarDerecha ();
14 } else {
15 b.doblarIzquierda ();
16 }
17 estado = NORMAL;
18 break;
19 }
20 } while(rtos_suspendTaskTillTime(TIME_IN_MS (100)));
21 }
Instalar un SO de Tiempo Real. RTuinOSBrillo. Caso de Estudio
1 static void TareaSensor(uint16_t initCondition)
2 {
3 do {
4 switch (estado) {
5 case NORMAL:
6 if ( b.sensar (90) < minDistanciaFrente ) {
7 estado = CUIDADO;
8 }
9 break;
10 case CUIDADO:
11 barrido ();
12 estado = FIN_BARRIDO;
13 break;
14 }
15 } while(rtos_suspendTaskTillTime(TIME_IN_MS (50)));
16 }
Instalar un SO de Tiempo Real. RTuinOSBrillo. Caso de Estudio
1 void setup(void)
2 {
3 (...)
4 /* Inicializaci n de las tareas */
5 rtos_initializeTask( /* idxTask */ 0
6 , /* taskFunction */
TareaMovilidad
7 , /* prioClass */ 1
8 , /* pStackArea */ &
_taskStack00_C0 [0]
9 , /* stackSize */ sizeof(
_taskStack00_C0)
10 , /* startEventMask */
RTOS_EVT_DELAY_TIMER
11 , /* startByAllEvents */ false
12 , /* startTimeout */ 1
13 );
14
15 }
Instalar un SO de Tiempo Real. RTuinOSBrillo. Caso de Estudio
1 void loop(void)
2 {
3 switch(estado)
4 {
5 case NORMAL:
6 b.escribirBluetooth("estado normal");
7 break;
8 case CUIDADO:
9 b.escribirBluetooth("hay objetos cercanos");
10 break;
11 case FIN_BARRIDO:
12 b.escribirBluetooth("fin de barrido");
13 break;
14 }
15 }
Documentacion
Toda la documentacion de este trabajo se encuentra en:https://drive.google.com/folderview?id=0B_
4zu6280L9fV0VpZzBuNHg4eHM&usp=sharing
Se encuentra el informe completo de este trabajo, lasimplementaciones, fotos con todo el armado del robot, y un videoque muestra su funcionamiento.