{"id":904,"date":"2019-12-30T22:55:03","date_gmt":"2019-12-30T22:55:03","guid":{"rendered":"http:\/\/robots-argentina.com.ar\/didactica\/?p=904"},"modified":"2020-11-02T01:00:58","modified_gmt":"2020-11-02T01:00:58","slug":"arduino-bibliotecas-de-funciones-personales","status":"publish","type":"post","link":"https:\/\/robots-argentina.com.ar\/didactica\/arduino-bibliotecas-de-funciones-personales\/","title":{"rendered":"Arduino: bibliotecas de funciones personales"},"content":{"rendered":"
A menudo tenemos fragmentos de c\u00f3digo con funciones que podemos reutilizar en muchos programas. Algo muy habitual en programaci\u00f3n. Creamos una funci\u00f3n que resuelve una necesidad concreta y queremos tenerla disponible para reutilizarla en cualquier otro programa en el que debamos resolver la misma necesidad.<\/p>\n
Lo habitual \u2014pero no lo m\u00e1s pr\u00e1ctico\u2014 es copiar el c\u00f3digo de esa funci\u00f3n especial dentro de cada nuevo programa. Pero conviene tenerla en un formato reutilizable con facilidad, sobre todo si la funci\u00f3n es muy extensa.<\/p>\n
Para lograrlo, guardamos esa funci\u00f3n (y todas las variables y constantes que incluya) en un archivo .ino separado, pero no debemos cargarlo individualmente en una placa Arduino, sino que luego lo incluiremos en cada programa que necesitemos, de al modo que siempre lo tendremos disponible.<\/p>\n
( Nota: no le llamamos \u201csketch\u201d sino \u201cprograma\u201d para Arduino. )<\/small><\/p>\n
<\/a><\/p>\n \u00bfC\u00f3mo incluimos un trozo de programa en otro?<\/strong><\/p>\n Vamos a crear un c\u00f3digo reutilizable, y lo guardaremos en una ubicaci\u00f3n conocida del disco, un \u201creservorio\u201d de funciones \u00fatiles que llevan un nombre que nos recuerde qu\u00e9 es y lo que hace.<\/p>\n Quedar\u00e1 con la extensi\u00f3n .INO<\/strong>, pero no es un programa para cargar al Arduino y ejecutarlo. Queda con esa extensi\u00f3n porque todos los programas editados en la IDE de Arduino se graban siempre con la extensi\u00f3n .ino<\/strong>.<\/p>\n El c\u00f3digo es uno que hayamos creado como funci\u00f3n o grupo de funciones dentro de un programa mayor.<\/p>\n Tomaremos como ejemplo una cantidad de funciones creadas para los distintos movimientos de los motores en un programa para un robot navegador.<\/p>\n El circuito que este programa mueve, para mejor comprensi\u00f3n de los ejemplos, es este:<\/p>\n <\/a><\/p>\n Veamos el programa original con las funciones incluidas dentro de \u00e9l:<\/p>\n Ahora vamos a escribir un programa diferente, con otra serie de movimientos. Suponemos que estamos editando en el IDE de Arduino, como sigue:<\/p>\n <\/a><\/p>\n Pero as\u00ed no funcionar\u00eda, ya que tiene llamados a funciones (como adelanteDerecho<\/strong>, atrasIzquierdo<\/strong>, etc.) que est\u00e1n en otro lugar.<\/p>\n De modo que abrimos el programa que las tiene, copiamos las funciones que necesitamos\u2026<\/p>\n <\/a><\/p>\n \u2026 y las pegamos en una ventana vac\u00eda del IDE. Luego las guardamos con Guardar como\u2026<\/strong> en la carpeta que deseemos. A esta carpeta podemos llamarla, por ejemplo: \/FuncionesUtiles\/<\/strong><\/p>\n\/*\r\nControl de motores CC usando el modulo L298N.\r\nEl programa activa los motores en un sentido por \r\n4 segundos, los detiene 500 ms, activa los \r\nmotores en sentido inverso por 4 segundos y \r\npor ultimo se detiene por 5 segundos. \r\nLuego repite la accion indefinidamente. *\/\r\n\r\nint IN1 = 9;\r\nint IN2 = 8;\r\nint IN3 = 5;\r\nint IN4 = 4;\r\n\r\nvoid setup()\r\n{\r\npinMode (IN2, OUTPUT); \/\/ Input2 conectada al pin 2\r\npinMode (IN1, OUTPUT); \/\/ Input1 conectada al pin 3\r\npinMode (IN4, OUTPUT); \/\/ Input4 conectada al pin 4\r\npinMode (IN3, OUTPUT); \/\/ Input3 conectada al pin 5\r\n}\r\n\r\nvoid loop()\r\n{\r\n\/\/ Motor gira adelante\r\nadelanteDerecho();\r\nadelanteIzquierdo();\r\nretardo(4000);\r\n\r\n\/\/ Motor no gira\r\npararDerecho();\r\npararIzquierdo();\r\nretardo(500);\r\n\r\n\/\/ Motor gira atras\r\natrasDerecho();\r\natrasIzquierdo();\r\nretardo(4000);\r\n\r\n\/\/ Motor no gira\r\npararDerecho();\r\npararIzquierdo();\r\nretardo(5000);\r\n}\r\n\r\n\/* FUNCIONES DE MANEJO DE MOTOR *\/\r\n\r\nvoid adelanteDerecho()\r\n{\r\ndigitalWrite (IN4, LOW);\r\ndigitalWrite (IN3, HIGH);\r\n}\r\nvoid adelanteIzquierdo()\r\n{\r\ndigitalWrite (IN2, LOW);\r\ndigitalWrite (IN1, HIGH);\r\n}\r\n\r\nvoid atrasDerecho()\r\n{\r\ndigitalWrite (IN4, HIGH);\r\ndigitalWrite (IN3, LOW);\r\n}\r\nvoid atrasIzquierdo()\r\n{\r\ndigitalWrite (IN2, HIGH);\r\ndigitalWrite (IN1, LOW);\r\n}\r\n\r\nvoid pararDerecho()\r\n{\r\ndigitalWrite (IN4, LOW);\r\ndigitalWrite (IN3, LOW);\r\n}\r\nvoid pararIzquierdo()\r\n{\r\ndigitalWrite (IN2, LOW);\r\ndigitalWrite (IN1, LOW);\r\n}\r\nvoid retardo(int valor)\r\n{\r\n delay(valor);\r\n}\r\n<\/pre>\n
int IN1 = 9;\r\nint IN2 = 8;\r\nint IN3 = 5;\r\nint IN4 = 4;\r\n\r\nvoid setup()\r\n{\r\npinMode (IN2, OUTPUT); \/\/ Input2 conectada al pin 2\r\npinMode (IN1, OUTPUT); \/\/ Input1 conectada al pin 3\r\npinMode (IN4, OUTPUT); \/\/ Input4 conectada al pin 4\r\npinMode (IN3, OUTPUT); \/\/ Input3 conectada al pin 5\r\n}\r\n\r\nvoid loop()\r\n{\r\nadelanteDerecho(); \/\/ Motores giran adelante\r\nadelanteIzquierdo();\r\nretardo(1000);\r\n\r\natrasDerecho(); \/\/ Motores giran atras\r\natrasIzquierdo();\r\nretardo(1000);\r\n}<\/pre>\n