TODOPIC

Otros Microcontroladores / Dispositivos programables => Arduino => Mensaje iniciado por: hiro2233 en 22 de Agosto de 2016, 11:08:43

Título: Port de la API de Ardupilot a Arduino atmega328p.
Publicado por: hiro2233 en 22 de Agosto de 2016, 11:08:43
CODIGO FUENTE

(http://api.ning.com/files/Bi0TxmsdC7xpP21s11d1PE8v4jQ1P2yAEmu72eXaaTniNB2VqS9OSE7bIcVssZUW8SN3U3-5P7vuLluvwhAUsyuvZJwWuC7t/ardupilotmicro.jpg)
(http://api.ning.com/files/Bi0TxmsdC7y6ljeSHot8PQglc*H0oDwlSp6BXoLIBt*2vQrXIc8Np15lsXh0vTvS4buLGPQUeE42XPT9aHdPNNISijDb0I7e/ardupilottiny.jpg?width=750)

Éste es un port de la API de Ardupilot hacia Arduino con micro AVR atmega328p, pensado exclusivamente para los estudiantes y desarrolladores que deseen investigar y comprender acerca del funcionamiento de procesos de multitarea en microcontroladores utilizando las interrupciones y las APIs de APM.
Con éstas librerías es posible crear aplicaciones que estén enfocadas al desarrollo de Drones, UAV, Vehículos no tripulados, robótica, automatización, etc.

El propósito principal de este port, es que está enfocado en el administrador de multitareas (Scheduler) desarrollado por Andrew Tridgell e introducido a Ardupilot con microcontrolador AVR mega2560.
Actualmente ésta es la estructura que se está utilizando en todas las plataformas de Ardupilot.

Existen dos Ports:

ARDUPILOTMICRO: Port de Libreria completa de APM hacia atmega328p. https://github.com/hiro2233/ArdupilotMicro (https://github.com/hiro2233/ArdupilotMicro)

ARDUPILOTTINY: Port únicamente del organizador de multitareas (Scheduler) de la capa de abstracción de hardware hacia el microcontrolador atmega328p con integración de compatibilidad del entorno de desarrollo de Arduino. https://github.com/hiro2233/ArdupilotTiny (https://github.com/hiro2233/ArdupilotTiny)

Existen dos ejemplos:

- Compass TEST.
- Scheduler TEST.

Cambios Importantes

- STORAGE: Tamaño de eeprom ajustado al tamaño requerido para el 328p. Es seguro trabajar con la librería AP_Param.
- GPIO: Remapeado completo a 328p. Funciona todo perfectamente.
- SPI: Funcionando.
- I2C: Funcionando.
- Scheduler: Trabajando muy bien, ahora ya podemos utilizar multitareas en el 328p.

Cambios sin probar.

- RCOutput.
- RCInput.

No funciona

- Analog input.
- ADC.

Como compilar

- Descargar e instalar Arduino 1.6.6 (Probado con ésta versión).
- Abrir arduino, click en Archivos, Preferencias y seleccionar la carpeta raíz de ArdupilotMicro o ArdupilotTiny respectivamente.
- Abrir uno de los ejemplos incluidos y compilar!.

Disfrutalo!
Título: Re:Port de la API de Ardupilot a Arduino atmega328p.
Publicado por: CompSystems en 22 de Agosto de 2016, 15:40:21
Muy interesante lo de procesos de multitarea en microcontroladores y mas con tarjetas de desarrollo arduino, te pregunto Hiro2233, el arduino mega2560 es una de las tarjetas mas usadas en robotica en la actualidad, tu aplicación, podría adaptarse a esta placa?
Título: Re:Port de la API de Ardupilot a Arduino atmega328p.
Publicado por: hiro2233 en 23 de Agosto de 2016, 00:05:11
Hola CompSystems, así es funciona y está adaptada para el mega2560 también, la HAL fué escrita desde un principio exclusivamente para el mega2560 y el mega1280. Y hoy en día la HAL ya sido extendida para Raspberry, BeagleBone, STM32F4 y Qualcomm QURT.

Dentro de unas semanas más voy a publicar el sistema URUS (Universal Robotics Unmanned System) que estará basado en mega2560 como una capa de extensión de funcionalidades para el RaspBerry PI.
Título: Re:Port de la API de Ardupilot a Arduino atmega328p.
Publicado por: CompSystems en 23 de Agosto de 2016, 01:05:42
Genial lo de URUS,

Sobre la multitarea, nunca he realizado códigos con esta "lógica" pienso que me podría servir para mejorar el control de unos motores paso a paso, proyecto que también lo compartiré en este foro.

El siguiente código sirve para activar las bobinas de un MPP  usando el driver de potencia DVR8825, simplemente en el pin STEP se envía un flanco de bajada a un frecuencia variable


Código: C++
  1. void runMotorX( ) {
  2.     for ( float i = 0; i < final_steps; i++ ) {
  3. // El paso se activa por flanco de bajada
  4. // Each pulse to the STEP input corresponds to one microstep of the stepper motor
  5.         digitalWrite( DRIVER8825_MX0_STEP_PIN, HIGH );
  6.         delayMicroseconds( speedRPS_val );
  7.         digitalWrite( DRIVER8825_MX0_STEP_PIN, LOW );
  8.         delayMicroseconds( speedRPS_val );
  9.     }
  10. }// end run X

El código anterior trabaja bien, el numero de pasos esta determinado por el rango del ciclo for, pero si a este código le colocamos una detección de un final de carrera o endStop, mas una detección de paro de emergencia, hay que introducir un código de verificacion de interrupciones, haciendo que se pierdan microsegundos, afectando por ejemplo la velocidad final del motor

Código: C++
  1. void runX_sensors_X0_eStop( ) {
  2.     for ( float i = 0; i < final_steps; i++ ) {
  3.         if ( MX0_endStopMin_intrFlag == TRUE || emergencyStop_intrFlag == TRUE ) { // Hubo una Interrupción por endStop or EmerStop
  4.             MX0_endStopMin_intrFlag = SET_FALSE;   // Interrupción atendida
  5.             MX0_ENDSTOP_min_flag = SET_TRUE;    // Sensor X0 activo
  6.             break;// sale del for
  7.         }
  8.         digitalWrite( DRIVER8825_MX0_STEP_PIN, HIGH );
  9.         delayMicroseconds( speedRPS_val );
  10.         digitalWrite( DRIVER8825_MX0_STEP_PIN, LOW );
  11.         delayMicroseconds( speedRPS_val );
  12.     }
  13. }// end run X

Pienso que haciendo subrutinas por medio de procesos de multitarea, la verificacion de interrupciones es mas eficiente, por favor me confirman si esto es verdad.

Gracias