Calificación:
  • 2 voto(s) - 4 Media
  • 1
  • 2
  • 3
  • 4
  • 5

Proyecto low cost pylot

(04-05-2022, 03:47 PM)Tehani escribió:  Sigo con el tema:
Empecé a parir este piloto como recambio para los computadores de rumbo de Raymarine que se averiaban. En los smartpilots frecuentemente se sulfatan las pistas de las placas, ya que no tienen una caja hermética.
Pero no lo limité al bus seatalk. Este piloto se entiende con todo el mundo. Tiene 2 canales nmea0183, nmea2000 y WiFi.
Si hago otra versión de placa, añadiré USB, ya que también lo estoy incorporando a otros dispositivos. De hecho, el gyro tiene ya USB.

Bueno, como lo prometido es deuda, aquí va el fichero fuente del núcleo principal del piloto.

Hay líneas con // y trozos entre /* y */ que son pruebas que he ido haciendo y aún no están descartadas del todo.

Por orden de aparición en el fichero:

- Las funciones previas "void ServoReset(void), void AP_ParAdjust(void) y void PilotChangeMode(uint8_t Newmode)" sirven para inicializar variables en los cambios de estado del piloto.
- La tarea "void SeaState(void *pvParameters)" no está pulida aún. Sirve para controlar los parámetros de funcionamiento del piloto en función del estado de la mar, velocidad del barco, ángulo y velocidad del viento, etc. Aquí puede hacerse mucho aún.
- La tarea "void NavControl(void *pvParameters)" sirve para controlar el rumbo en todos los modos de funcionamiento del piloto. Usa ángulos de referencia iniciales cuando se activan dichos modos (El establecimiento de esas referencias está en otro fichero), y compara esas diferencias con los diferenciales de heading. También controla los cambios de rumbo introducidos por el usuario, de manera que se limita la velocidad de rotación y establece en varios pasos las maniobras con grandes variaciones de ángulo. Los intervalos de tiempo de activación de esta tarea son variables según varias condiciones (velocidad del barco, rotación, etc).
- La tarea "void HdgControl(void *pvParameters)" es básicamente un PID modificado para evitar sobreamortiguamientos de la parte integral. Es decir, es una "pseudointegral". Esta función se activa cuando llega información de Heading, que en el caso de NMEA2000 es 10 veces por segundo.
- La función "void ServoPosition(void)" se ejecuta cada 20 milisegundos a golpe de interrupción de timer. Sirve para controlar tanto el Clutch (embrague) como el motor principal. Aquí se controla todo: Corrientes de motor y clutch, zona muerta y aceleraciones de arranque y frenado del PWM principal. Básicamente es una máquina de estados.
- La función "int32_t JoystickRD()" sirve, omo su nombre indica, para leer y promediar los valores del potenciómetro o Joystick de control de timón cuando el piloto funciona en modo NON FOLLOW UP.
- La función "int32_t RudderLimits(int32_t preq)" sirve para limitar el recorrido máximo de la pala del timón, y puede ser por cantidad de energía enviada al motor cuando no hay sensor de rudder, o bien por valores máximo y mínimo del sensor.
- Al final encontraréis las funciones de inicialización del hardware de los controles PWM tanto del motor principal como del clutch.

NOTA: He tenido que cambiar la extensión del archivo a "servo_pwm.pdf" porque esta web no me permitía con la extensión original (servo_pwm.c). Si lo descargáis, cambiad .pdf por .c.


Archivos adjuntos
.pdf servo_pwm.pdf Tamaño: 28,26 KB  Descargas: 13
Responder
Agradecido por:

Fantastico JoseLuis.
Aclarar que una función es como un subprograma dentro del programa principal que se encarga de una tarea o más tareas concretas. Lo bueno de las funciones es que se las puede llamar de cualquier parte del programa incluso por otras funciones. También se le pueden mandar parámetros o datos y por otra parte pueden devolver también los parámetros o datos elaborados. Incluso los parámetros que se le mandan puede ser otra función.
Las ventajas de las funciones son muchas, la más importante es que nos evita repetir escribir sentencias en el programa u subprogramas, haciendo el programa más comprensible.
También un conjunto de funciones se pueden recopilar en un grupo formando una biblioteca. Estas bibliotecas se dejan compiladas. Esto reduce el tiempo de compilación del programa.

Hablando de compilación, tendría que explicar queces esto.
Un programa ejecutable está en formato binario. Pero un programa se escribe en texto. Cada tipo de programa , como C o visual Básic o Fortram... tiene sus propias sentencias y reglas aunque la estructura de los diferentes programas es básicamente igual.
Un compilador traduce las sentencias de texto del programa escrito en un código binario para que el ordenador lo pueda ejecutar.

Hay otro tipo de programas llamados interpretados , como el famoso Basic  o el que se usa en la taspi Python . En este tipo de programas un programa intermedio traduce las sentencias escritas en texto mientras se va ejecutando el programa.

La diferenciacentre ambos sistemas, compilado e interpretado es abismal. El compilado es muchísimo más rápido que el interpretado. Por otra parte el interpretado gasta más recursos del procesador.

La ventaja de los interpretados es que son algo más fáciles de programar y también de depurar( detectar y corregir errores).

Si hay interés se puede ir ampliando las explicaciones sobre el programa.

Al publicar Tehani el código fuente se puede decir que el autopiloto lowcost es un proyecto de plataforma Open.
A ver si salen también comentarios de programadores , como Jiauka.
Responder
Agradecido por:

Las tareas son programas que se ejecutan secuencialmente y podríamos decir que son "independientes".
El sistema operativo, en este caso FreeRTOS, conmuta de tarea en tarea cada 2mS en este proyecto. Eso hace que parezca que todas se ejecuten a la vez.
He borrado el resto del mensaje porque incluso a mí me parece un tostón...
No obstante, os animo a preguntar lo que queráis.
Responder
Agradecido por:


Posibles temas similares…
Tema / Autor Respuestas Vistas Último mensaje

Salto de foro:


Usuarios navegando en este tema: 1 invitado(s)