Buenas,
No he creado nunca una librería, más allá de la clase "Morse" que está en casi todos los tutoriales y cursos de Arduino, y ahora quiero crear una clase para manejar un motor paso a paso a través de un driver que ya tiene su propia programación.
El propio driver ya controla las velocidades y las aceleraciones, y tiene automatizada también la búsqueda del origen (el final de carrera se conecta al driver y no al arduino), por lo que la tarea que le queda al Arduino, para los que sois experimentados, debe ser bastante sencilla.
Dicho driver lo he programado de manera que mediante 3 de sus inputs digitales le establezco la nueva posición objetivo. Uno de los inputs se usa para establecer si se incrementa o se decrementa el setpoint, otro input se utiliza para incrementos "finos" y el tercer input se utiliza para incrementos gruesos. Adicionalmente, un 4º input se utiliza para "validar" el nuevo setpoint .
El tiempo de ciclo en el programa del driver es de 1ms según el fabricante. Mi idea es que los trenes de pulsos enviados desde el arduino para establecer la nueva posición sean de 2ms en alto y 2ms en bajo.
Quizás sea una preferencia errónea (dada mi muy-escasa experiencia en programación), pero querría evitar el uso de bucles while (y, por supuesto la función Delay()) para enviar el tren de pulsos y que éstos se envíen mientras corre el bucle principal.
Mis principales dudas están sobre la persistencia de los valores de las variables privadas del objeto entre distintas llamadas en el bucle. ¿Por defecto se conservan o debo definir como "static" las variables que quiero que mantengan el valor del ciclo anterior como si fuera un bloque de función? ¿Una variable privada se puede inicializar en el archivo de cabecera o se inicializa todo en el constructor?
¿Alguna sugerencia de tutorial o artículo sobre la creación de librerías que pueda servirme para este caso?
Otro consejo, ¿Merece la pena, en mi caso, crear por separado el archivo .h y .cpp, meterlo todo en el .h sería correcto?
Gracias y un saludo.
persistencia de los valores de las variables privadas del objeto entre distintas llamadas en el bucle.
El objeto tiene sus variables miembro que persisten mientra el objeto exista, piensa que son variables, se guarda memoria para ellas y mientras no las modifiques seguirán valiendo lo mismo. Una variable "static" es una variable especial: Todos los objetos de una clase la comparten. Por ejemplo clase motor, miembro static velocidad. Si creas dos objetos motor llamados A y B, tanto A como B, comparten la variable velocidad, si modificas la velocidad en A lo haces tambien en B. Si velocidad no es static, la velocidad de A y B podrá ser distinta y si modificas una no lo haras con la otra.
¿Una variable privada se puede inicializar en el archivo de cabecera o se inicializa todo en el constructor?
Se puede iniciar en la definición de clase, pero... no sé si eticamente usarlo o no. Depende de la variable. Por ejemplo, la velocidad del motor, podrias iniciarla a un valor en la cabecera, pero creo que es mejor hacerlo en el constructor.
¿Alguna sugerencia de tutorial o artículo sobre la creación de librerías que pueda servirme para este caso?
No es de Arduino, pero si de C++ : Aprenda C++ como si estuviera en primero
¿Merece la pena, en mi caso, crear por separado el archivo .h y .cpp, meterlo todo en el .h sería correcto?
Hay de todo, gente que te dira que solo el h y gente, como yo, que te dirá que si lo quieres todo organizado, hagas un .h y un .cpp.
Gracias,
Bien pensado, tiene sentido que las variables en los objetos sean persistentes.
Ya estoy peleándome con la librería, y me está costando. De momento he conseguido algo que funciona, pero en determinadas circunstancias falla y no completa el "trabajo".
La verdad es que si los trenes de pulsos los enviara con bucles while (o for) y usara delay() para controlar la duración de los pulsos y los silencios, me resultaría bastante más fácil. Pero para controlarlo con el bucle principal, alguna de las variable auxiliares deben "cruzarse" o cambiar de valor en el momento inoportuno...
Espero aprender con esto y las próximas me cuesten menos...