Ejecutando Múltiples Tareas de Forma Simultánea con Arduino y ProtoThreads
HTML-код
- Опубликовано: 6 сен 2024
- En el mundo actual estamos muy acostumbrados a que nuestras computadoras ejecuten múltiples tareas de manera simultánea. Sin embargo, en Arduino muchas veces nos toca escribir código que ejecuta una sola cosa de forma secuencial. ProtoThreads es una biblioteca de C que permite generar de forma automática autómatas finitos que facilitan la ejecución de código multi-tarea, es decir código que aparenta ejecutarse de forma simultánea en nuestro Sketch de Arduino. En este video exploraremos las bases de la biblioteca ProtoThreads y cómo podemos hacer uso de ella para lograr que nuestro Arduino ejecute tareas de forma simultánea.
Encuentra el código de los ejemplos en nuestro repositorio de GitHub: github.com/hac...
Un detalle, para los curiosos. Alla por el minuto 14:00 Mario menciona que la condicion de PT_WAIT_UNTIL es diferente de PT_WAIT_WHILE, lo cual es correcto, pero me gustaria añadir que es exactamente opuesta (literalmente son el mismo macro con una condicion NOT añadida), sin embargo nuestro querido Mario olvida que el opuesto de menor que (=) y no mayor que (>), lo que causa que su retardo sea efectivamente de 1001 milisegundos y no exactamente 1000.
Como los tiempos de los LEDs son conmensurables entre si (son multiplos/submultiplos exactos), cuando el echar a andar el programa con los 3 LEDs, los mismos parpadean en sincronia (parecen un contador binario descendente). Sin embargo Mario propaga la omision de la comparacion a las otras 2 funciones, lo que causa que los LEDs eventualmente salgan de sincronia (los tiempos no son exactamente conmensurables despues de todo), lo cual notaran mas adelante, alla por el minuto 25:00.
Asi que gente, ojo con sus condiciones :-). Y el animo no es achacar errores sino estimular la curiosidad y la atencion al detalle. Que por cierto, excelente video Mario! me encanto.
y si no quiero bloquearla y no mas quiero que se repita el ciclo usando todo lo demas
un detalle de 1 ms :v que diferencia tan notoria :v
Muchas gracias por la aclaración, nunca lo había notado y para mi caso, es importante pues no hago programas que duran unos minutos funcionando y esto podría significar un error importante en el tiempo (tengo proyectos operando por más de un año sin desconexión gracias a UPS's y bueno, he ahí esta importancia). Muhcas gracias por el video!!, comparto la opnión, me encantan estas modalidades de ejecución!!
Hola Joskan, esto lleva demasiado tiempo. Queria consultarte que hace la instruccion PT_YIELD(pt) la cual no se explica....
@Zeke Jorge Bot
Muchas gracias, estoy iniciando en ardruino, pero había programado hace 30 años en main frames, como IBM ,WANG, UNISYS, luego Cobol y Fortran, SQL. Debido a la situación actual decidí aprender a unir esos conocimientos con mi afición a la electrónica básica y encontré el lugar perfecto . Animo!, con disciplina y tolerancia salimos de esta.
No hermano y ud donde estaba, ufff esto que enseñas es de lo mejor, igual no entiendo mucho pero estoy seguro que con ud podre ejecutar mis proyectos de una mejor manera, por ahora debo decir que su forma de enseñar es de lo mejor, muchas pero muchas gracias por este tutorial.
Fantástico!!! Mi proyecto acaba de ver la luz. Ahora si va a parecer una auténtica máquina
Saludos desde Cuba. Eres mi profesor preferido. Baja el volumen de la música de fondo. Gracias por enseñarme tanto, te entiendo perfectamente.
Primeramente muchar gracias por tu atencion de compartirnos un poco de tu tiempo y de una manera muy sencilla, lo cual demuestras lo mucho que sabes. En el ejercicio que nos hicistes el favor de compartir falta hacer unos pequeños ajustes parpadeo2(&hilo2);// Se corrigio el nombre de la funcion, parpadeo3(&hilo3);// Se corrigio el nombre de la funcion, PT_WAIT_UNTIL(pt, (millis()-t)>=500);// 1000 para que sea de la mitad del periodo de la primera, PT_WAIT_UNTIL(pt, (millis()-t)>=250);//1000 igual que la anterior.
Mario. te agradezco mucho tu video. La verdad que esto dara mayor calidad a los desarrollos que tengo en mente. Saluidos
Exelente. Es lo que buscaba , multitarea, para manejar un pinball (que estoy haciendo) con arduino. Pensaba que la unica solucion seria agregar multiples tarjetas R3 hasta que vi este video. Les paso un dato interesante: en la app Banggood se consiguen productos arduinos a muy bajo costo.
buen video, comento para informar para los que tengan problemas (fecha 2020 junio) en la misma version 1.4 de pt aveces 3 archivos de ejemplo en la libreria de pt dan error por falta de librerias por que tambien los compila aun siendo ejemplos. aveces puede ser solo por o otras librerias mas. los ejemplos son: example-buffer... example-codelock... example-small... estan dentro de la libreria pt-1.4 descargada.
Excelente video y explicación. Hará falta un par de visionados, paro entender los detalles por su densidad, pero merece la pena.
Felicitaciones.
Lo felicito. Estoy empezando cor arduíno y con este video aprendí mucho.
yo estaba tratando de ver para aprender freertos pero esto es mas simple y permite lo q buscaba , multitareas aprovechando los espacios de tiempos de esperas buenísimo!!!!!!
amigo buen video.
oye una pregunta como podría parar un motor ya sea con un tiempo o con un sensor .
si se cumple el tiempo y no recibió la señal del sensor que se detenga.
y si esta en movimiento y recibe la señal del sensor que se detenga.
gracias por tu respuesta de antemano
Hola Mario, me parece increíble este vídeo... desde que eh que empece a usar esta librería, mis proyectos han mejorado bastante...lo que me gustaría saber, es que si se puede adaptar a un esp8266 o un esp32..saludos Mario y de nuevo gracias por el video
Estoy iniciando en Arduino, y ésto es una maravilla! ! Gracias por compartir!!!
Hola Mario, me ha gustado este vídeo como otros de los tuyos. He puesto en práctica tus ejemplos y me están funcionando bien. Los entendidos en C (sin ánimo de ofender), deben hacer su trabajo y mejorar los posibles deslices que uno hace cuando presenta un vídeo técnico con esmero, pues siempre es posible tener un error bien de dicción o de código, no se debe tomar por negativo una corrección y es bueno que participen el máximo de los que vean estos vídeos. A otros les enseñas a desarrollar sus primeros pasos y a otros les estimulas con tus conocimientos. Echo de menos un esquemático de las conexiones, por lo demás muy bien.
Sigue así y gracias por compartir.
ERES LA RIATA! MUCHAS GRACIAS POR TU TIEMPO Y CONOCIMIENTOS
hola buenas tardes soy novato en este mundo de programación, y ya hice dos códigos uno para controlar un servo desde un mando a distancia y otro para controlar el mismo servo desde una app por bluetooth , pero no he podido unirlos y que funcione con ambos dispositivos, claro que no al tiempo pero que sea capas de recibir ordenes de cualquiera de los dos controles , esta funcion que estas enseñando lo podria hacer gracias
Gracias Mario, excelente video, la explicación nos amplia mucho más las aplicaciones de arduino, sobre todo a nosotros los principiantes.
Excelente explicación Mario. creo que con esto solucionaré la programación de varios proyectos que tengo en mente. abrazos desde Bolivia.
que buen video el delay me rompia la cabeza tratando de que no interrumpa otra ejecución.
Tio.... FABULOSO..... y con una explicacion MAGNIFICA.... muuuuchas gracias
Muchas gracias por tu aporte me ayudo mucho.
Solo una consulta si tu pones solo un led y le quitas el do - while sigue el ciclo, como si estuvieran 😬🤭
Genio!!!! me has abierto un mundo de posibilidades jaja funciona perfectamente en mi código
Mario ya quedo ok funcionando el cronometro, es muy interesante tu explicacion. En el caso del archivo del cronometro que descargue faltaron declarar las variables pin1 y pin2, y lo mismo ajustar pin1 dentro de la funcion del boton 1 y pin2 para la funcion del boton 2. Por mi parte te agradezco tu atencion me parecen muy interesantes tus videos y ayudan a capacitarnos.
Saludos.
El mejor vídeo de arduino que he visto en toda mi perra y corta vida; excelente trabajo!
por fin logré hacer funcionar los pt, tengo tres tareas, cada una debe ejecutarse por un periodo de tiempo, lo cual hice independientemente con un delay pero para usar pt cambie los delay por millis() y continuan sin funcionar en simultaneo, parece que al igual como sucede con delay el programa no avanza hasta no acabar con la tarea, luego no puedo iniciar una tarea a menos que termine la otra. si alguien tiene alguna idea que anda mal, agradezco su respuesta. los estaré actualizando de mi experiencia en otro comentario. Hasta entonces
Hola! Mario. De nuevo por aquí. He observado que el ejemplo que describes en este vídeo da errores al compilarlo para la tarjeta nodeMCU8266, no se si se trata de un error debido a mi sistema (W10) o si le ocurre a otros. Cuando lo compilo para Arduino UNO, no de problemas. Saludos.
¡Justo lo que necesitaba! ¡Gracias!
genial facil y sencillo de usar muchisimas gracias a pesar que sea hace muchos años atras te lo agradesco me sacastes de apuros
De lo mejor he visto hacer tareas simultaneas
Excelente video mario, estaremos esperando mas videos para aprender a usar mas esta interesante herramienta
Extraordinario, no obstante se mencionan conceptos muy avanzados, sería posible que me puedas decir en donde encontraste esta información sobre estos conceptos?
mi querido amigo, dejame decirte que te has ganado mi suscripción
por qué inicializa la función del pin dentro de la función Paralelo y dentro Setup General????
hola. Gracias por el vídeo. Intenté correrlo en Arduino nano pero no funciona... que crees que me hace falta?
Sou do Brasil, e esse foi o melhor vídeo que eu achei sobre o assunto... Obrigado, você me ajudou muito 👍
Só um conselho meu querido mano, aprenda o linguagem c++ e vc vai poder conseguir melhores códigos no arduino!
Exelente! Podria ayudarme en un proyecto, estoy haciendo un contador de revoluciones x minuto,con sensor infrarrojo y un display de 7 seg 4 dígitos; y un control de velocidad con pwm para un motor , todo eso con un arduino uno , podria darme una ayuda?
Muy buen video y la explicación de lujo!!
Quiero saber cómo abordar el trabajo con el puerto serie.
Tengo que leer 2 mensajes, para prender un led con una secuencia X (mensaje A) y que en cualquier momento se pueda detener (mensaje B)
Un abrazo y Gracias!!
Me acabas de salvar la vida, estare agradecido por siempre. Saludos desde Argentina :D
Justo lo que buscaba para mis incubadoras. muchas gracias mano.
jaajjajajajaja
esto multiplica todo el potenciar de arduino!!! que bueno muchachos !!
Hola cordial saludo desde Colombia-Nariño, felicitaciones que buen tutorial de mucha ayuda Gracias¡ Mario utilizo la ejecución de múltiples tareas para hacer un monitorio de una puerta y una temperatura todo marcha bien con proto threads hasta los 5 minutos después de el mi código se queda estático. me podrias ayudar soy nuevo en el mundo de la programación
Uff genial lo que necesitaba para mi proyecto, necesito leer dos modulos bluetooth a la vez, espero me funcione
Hola: excelente video. Te quiero preguntar que función cumple la instruccion While(TRUE) al final de la funcion parpadeo.
Gracias mano justo lo que necesitaba saludos desde Lima Peru
Excelente video muy biien explicado, era justo lo que necesitaba para un proyecto que estoy haciendo mil gracias!!!
Excelente vídeo Mario, gracias por compartir la información.
Que buen video, bien explicado y muy útil. Pensaba que existiría alguna función de arduino vanilla que resolviera este problema, pero al parecer no la hay.
Saludos.
Que interesante video y muy bueno sigue compartiendo tus conocimientos .nos ayudas a varios
Genio justo lo que buscaba!!!
¿Qué tal, Mario? He estudiado tu código final para el manejo del LCD y la secuencia de leds y todo está genial. Es muy interesante el código para generar multihilos, pero tengo una duda que no he resuelto: no encuentro sentido al parámetro "int &is_running" en la declaración de la función "reloj". Al momento de ser llamada dicha función se le pasa como argumento una variable entera ("is_running"). Algo similar ocurre con la variable "tth_sec". Esto en lenguaje C no es válido porque debería hacerse uso de punteros, ¿hay algo que me he perdido del uso de la librería "pt.h"? Gracias y saludos.
Diablos, llegue muy tarde a este vídeo.
La semana pasada tuve que creer varias funciones matemáticas junto con millis() para similar el multiproceso en un proyecto que tenía.
Para la próxima usaré esa librería xD
Alguien sabe cómo reproducir sonido (Buzzer) (tones) claro con ProtoThreads, quisiera que este emita unos tonos mientras unos leds brillas intermitentemente, necesito ayuda con este código
Muchísimas gracias por compartir esta información!!!!!! Me funciono de maravilla 👍👍👍
eres el mejor, lo practique y me dio resultados muy positivos, me gustaría hacerte una pregunta como en visual c, puedo aumentar o disminuir el parpadeo de un led con trakbar si puedes responderme seria de mucha ayuda.
¿No es mucho más sencillo realizar esos parpadeos empleando la interrupción de unos de los tóner que el Atmega 328P, lo digo porque he hecho lo mismo simplemente usando la empleando una variable que cuenta cada desborde del timer y con ella ejecuto lo mismo que por ejemplo has hecho.
Excelente Video Estimado Mario.
Y ya que sos un Genio... me gustaría si podes hacer un video de como leer el número de identificación de la Placa de Arduino para usarlo como reconocedor de la placa y ejecutar el código o si no es la placa con el número programado que no ejecute el código.
Ya sé que es fácilmente alterable y salteable el código resultante pero es una curiosidad que poseo.
Saludos desde Argentina y que sigan los Exitos Estimado Mario.
Charles
Estoy tratando de realizar un código para encender un led mediante una app de reconocimiento de voz con Bluetooth pero al mismo tiempo quiero encender otro led con pulso en la misma app, tengo los códigos por separado y funcionando pero al momento de unirlos tiene prioridad el código que coloque primero y el otro deja de Funcionar.. Ayuda!!
Cual es el límite de tareas que se puedan ejecutar de forma simultánea? Quiero hacer un rover (auto) que se desplace, recopile información de su entorno con varios sensores y que envíe esa información a una pantalla Led.
Antes que nada muchas muchas gracias por el tiempo y dedicación! quería preguntarte como reemplazo los delay^s para controlar un servo en uno de los hilos? Muchas gracias de nuevo!!
Hola! Soy hiperprincipiante con arduino, solo por afición. El caso es que necesito hacer un código que nada mas iniciarse me encienda y apague un led intermitente y que continue así mientras corre el resto del programa. Como el resto del programa lleva delays, esto me interfiere con la intermitencia del led. Podrías guiarme o darme alguna pista de como hacerlo? Muchas gracias.
Hola Mario, Felicidades por tus videos, me han ayudado bastante en el proyecto que estoy realizando, pero me gustaria saber si es posible utilizar esta libreria para usarlo con el I2c agregando en el hilo una memoria EEPROM externa, una LCD, unos botones y el arduino obviamente, la idea es basicamente como muestras el video, ya que cada uno de los elementos en el bus hara algo diferente pero que se vea que lo realiza al mismo tiempo, como mostrar un menu de tareas en la LCD y al mismo tiempo ejecutando tareas guardadas en memoria EEPROM, para controlar motores PAP, todo el conjunto es para un robot Arm.
Hola....es posible hacer subrutinas dentro de esta liberia? Es q quisiera correr secuencias de leds y algunas se repiten
Alguien sabe si ademas de los ejemplos que borra en la librería hay que hacer algo mas?? Descargue la versión 1.4 y tengo instalada la versión (1.8.6 de Arduino) sin embargo me marca errores de compilación. De antemano les agradezco su ayuda.
Yo estoy haciendo un proyecto en el cual necesito controlar varios hilos al mismo tiempo, el problema es que el arduino solamente se ocupa del primero que pongo y los demás parece ignorarlos, no entiendo porqué, ayuda por favor
Amigo eres genial gracias por el vídeo👍👍👍👍
Muchas gracias profesor
esto lo puedo utilizar para mover dos servomotores a diferentes direcciones?
Amigo si yo quiero que al momento de pulsar el azul comienze a contar 30 minutos y cuándo llege encienda los leds y con el amarillo se apage como seria? Arduino tiene la capacidad de hacerlo sin nesesidad de pantalla LCD??
Realmente da error al compilar, la razon es que Mario no separo en el ejemplo,que nos dejo parpadeo1(&hilo1);
parpadeo2(&hilo2);
parpadeo3(&hilo3);.
al igual en cada voi() hay que cambiar a su correspondiente 1,2,o 3 ejemplo void parpadeo1(struct pt *pt) {
Buenas noches ing ! Estoy usando la libreria ProtoThereads con tu ejemplo pero solo me sirve una hilo con una función básica como las del video pero en el segundo hilo ocupo lo que es la detección de un mensaje de texto entrante( modulo SIM )cuando mi serial es habilitado solo que no funciona el ejemplo es tal cual lo explica en su video, sabe usted si la función de comunicación en serie tx rx sea mucho trabajo para la librería ProtoThreads ?
si me funciono la libreria y code , ahun estoy en desarrollo de mi proyecto y tengo dudas de como acomodarlos..
saludos
excelente vídeo, me ha servido un montón, le agradezco por tomarse el tiempo de compartir la información :)
Muy buenas noches, estaba buscando todo lo relacionado con Arduino que pueda aplicar para mi pesebre, me gustaría, pero soy autodidacta en este tema y quería saber si tienes un código que me permita semejar el parpadeo de una llama con un led, he intentado muchas opciones pero me queda muy falso.
con esto podria monitorear dos flujometros al mismo tiempo?? y si es asi como seria por que confundi con las nuevas lineas de codigo
Perfecto aporte.
Me sirvió de mucho, muchas veces.
Lo estaba intentando aplicar en un ESP8266 ESP-01S.
En ardu uno y mega ok. Como digo es una solución buenísima.
Al intentar implantarlo en el código de un ESP8266 ESP-01S, me nada este error al compilar:
“Error compilando para la tarjeta Generic ESP8266 Module.”
Hay algún modo de utilizar pt.h en este módulo?
Hay algo semejante para este módulo?
Muchas gracias de antemano.
Juan
hola. tengo una duda. estoy intentando controlar una tira de luces LED RGB de las que permiten controlar cada led. Mi duda es como puedo hacer para controlar varias transiciones de color al mismo tiempo en diferentes LEDs, ya que de la manera tradicional debo esperar a que el loop termine antes de que se ejecute la siguiente orden. Gracias
fantástico!!!!! y con tan poco código!!! ademas si no me equivoco también estamos ahorrando espacio en memoria o me equivoco? que bueno con este sistema se podría mejorar hasta el firmware de la 3d printer como me gustaría aprender son Fernando de argentina
Disculpen, una pregunta. Entonces... Podría usar varias librerias "simultaneamente" sin que haya problema entre ellas? Digamos para usar distintos tipos de modulos a la vez en una sola placa de arduino??? Desde ya muchas gracias!
excelente ,me sirvió perfectamente en mi proyecto. muchas gracias
Que buen vídeo, aclaraste unas dudas que tenia, muchas gracias
Estoy trabajando en un modelo de respirador en el cual quiero trabajar dos programas qeu tengo para correr en arduino uno. cerre cada uno de ellos en un void distintos y al compilar tengo errores tales como que no encuentra la libreria sys/Time.h o no me reconoce variables. Te consulto por las dudas: "tengo que tener en cuenta alguna limitacion de esta libreria?" Muchas gracias
Gracias por la información de los hilos, me sirvió muchisimo
hola.mario !!! exelente video, es complicado pero esta bien explicado!!
mi pregunta es, se puede haces este programa para un arduino uno?? el ATMEGA 328
si el atmega que utiliza la redboard es exacmen al de un arduino uno ATMEGA 328
Hola que tal a todos. Como podría hacer el código para aumentar o disminuir frecuencia de encendido de un led usando un potenciómetro, pero no con delay sino por medio de Proto Threads? Muchas gracias...
hola, soy novato en el tema pero me resulto muy clara tu explicacion, pregunta hay alguna forma de controlar la cantidad de veces que en este caso encienda el led..? yo trate de hacerlo modificando la sentencia while, inclusive poniendo una sentencia for. Pero no trabaja solo lo hace con while(1)
Hola ,muy interesante el video.Me puedes indicar como puedo utilzar solo una funcion para que un solo led parpadee de tres maneras distinctas.Yo necesito llamar a esta funcion parpadeo(&hilo); pero que los tiempos se puedan cambiar independemente atravez de un menu por ejemplo.
Un saludo.
Hola muy buen vídeo excelente explicación ¡¡¡ pregunto si podrías poner los códigos de ejemplo por que el link que dejaron no tiene la información. Muchas gracias
Muchisimas Gracias por tu vídeo!!!!
neta, me salvaste la vida eres un genio
Es perfectamente lo que estoy buscando
Mario eres un buenazo en esto de la programación. saludos
Yo tengo una duda, como puedo utilizar la función attachInterrupt mediante el uso de ProtoThreads, sabiendo que las interrupciones requieren de otra función void.
Como "anidar" los diferentes hilos?
Justo lo que necesitaba para mi proyecto hacer funcionar sensores simultáneamente gracias. Es la única forma de hacer que funcionen de manera simultánea?
y esta librería funciona con bucles dentro de cada hilo?????
yo quiero hacer un código donde haga varios bucles a la ves (al mismo tiempo)
como aria ese código le agradecería por la ayuda
Muy bueno Mario!!!! Excelente aporte!! Pregunta, ¿se podría en el ejemplo utilizar una única función "parpadeo" y se le pasa además del parámetro del puntero al objeto PT el valor de de espera para PT_WAIT_WHILE y el pin a utilizar? Lo interesante de esta librería es que te permite modularizar el código en forma más eficiente y coherente que tener todo amontonado secuencialmente en el void loop() Sería muy útil cuando se tienen un grupo de sensores, display con la info recibida, etc.
muy buen video y educativo, justo loq ue andaba buscando
gracias
ahora a aprender a usarlo jejeje!!!
muy bueno la explicación y muy interesante, pero tengo una duda que pasa con los delaymicroseconds ?
Hola me estoy haciendo una diana de entramiento con un servo gira 90ª cada 7 seg, el caso que necesito variar ese tiempo mediante bluetooth pulsar y que sean 20 segundos etc..se puede hacer con un solo arduino. Saludos.