Varios "programas" en Arduino

Hola.
Antes que nada, pido disculpas por el título, no sabía cómo sintetizar lo que necesito.
Soy desarrollador en Visual Basic 6.0 y ahora estoy iniciando un proyecto con interacción con Arduino.
Les cuento un poco algo básico para ver si me pueden orientar. Aclaro que nunca siquiera vi un arduino en persona :o
En una primera etapa el dispositivo que se intenta crear debe hacer lo siguiente:

  1. Tendría alrededor de 24 pulsadores.
  2. Recopilar la información de los pulsadores que se van pulsando (perdón por la reiteración) y guardarla en una memoria, de la siguiente manera: se debe dar la orden (con un pulsador determinado) de empezar a recopilar pulsaciones, hasta que se da otra orden (el mismo pulsador que al comienzo u otro también determinado). En ese momento la información de todas las pulsaciones (puede ser el id o número de pulsador) debe guardarse como si fuera en un archivo dentro del dispositivo (debiera tener la capacidad de almacenar más de un archivo). Todo esto, en forma autónoma, es decir, sin conexión a una pc.
  3. Al conectar el Arduino a una pc, desde una apliación VB6 debo poder ver qué archivos hay en la memoria del Arduino, seleccionar los que se quiera y pasarlos a la pc.
    Todo lo inherente a la pc lo haría sin problemas. El tema principal es que, como no sé nada de Arduino desconozco si esto es posible de hacer. En caso afirmativo, iniciaría la investigación correspondiente.
    ¿Es posible hacer esto? Imagino que el Arduino debiera tener un programa para la recopilación de datos y otro para interfasear con la pc, pero eso me lo dirán ustedes, que son los que saben.
    Muchas gracias.

Jerónimo

Vaya cosa rara pero intentemos responder porque tengo tendencia a opinar mas de la cuenta del proyecto y eso tal vez no te importe.
Guardar archivos de pulsaciones en arduino es posible: Cómo? P.ej. usando una microSD en la que pudieras crear archivos con nombre igual a la fecha del día.
El tema es que todo lo que hagas con Arduino se comunica via Serial por el COM Virtual que usarás para comunicar con VB6.0 (dicho sea de paso, aún se usa?)
Entonces en Arduino deberás crear comandos que al ser recibidos por via Serie, devuelvan la información que requieres desde la aplicación en VB6.0.
Supongamos un comando : ‘F’ que al ser recibido lea los archivos de la SD y los envíe de regreso a la apliacación.

también puedes hacer lo mismo en memoria EEPROM (no la del Arduino sino en una externa) pero la opción SD o microSD son alternativas mas fáciles.

Hola, surbyte.
Ante todo, muchas gracias por tu tiempo y tu respuesta.
Conozco mucha gente que, a pesar de la existencia de las nuevas tecnologías (muchos de ellos están "migrando" hacia ellas), siguen usando el VB.
Me gusta la idea de la microSD, sobre todo porque, según infiero, me da una alternativa más, que es quitar la memoria y llevarla a la pc directamente. O sea que podría hacer eso o pasar los archivos de la memoria a través de un cable USB a la pc. ¿Estoy en lo correcto?
Por otro lado, ¿es posible programar el Arduino para hacer esa transferencia cuando la aplicación de VB lo solicite y, además, que haga la recopilación y guradado de pulsaciones en los archivos?
En caso afirmativo, ¿en qué versión de Arduino me conviene comenzar la investigación?
Muchas gracias nuevamente.

Jerónimo

Como bien sabes puedes hacer lo que gustes.
Supongamos: crear un archivo con el nombre que desees que responda a un evento por ejemplo, o a una fecha. Asi acumular la secuencia de pulsaciones que registre el arduino del teclado XY de 64 teclas. 8x8.
8x8 son mas lineas de las que un arduino UNO/NANO/micro puede manejar a menos que uses un shift register o algun integrado dedicado a la operación.

Con cada tecla identificada guardas un log en la SD

Supongamos que fueran eventos tipo EVENTXXX.txt
Luego podias preguntarle con un comando via puerto serie que te liste todos los archivos que encuentre.
Tambien que lea el archivo EVENTYYY.txt y que lo envie por serial, con lo cual puedes recibirlo en tu aplicación VBasic 6.0.
Si esta secuencia la repites entonces podras ver todos los archivos que selecciones simplemente enviando el comando supongamos R EVENTYYY.txt siempre y cuando tu Arduino decodifique eso como leer archivo EVENTYYY.txt.

No digo que sea ni fácil ni dificil, pero todo requiere su tiempo. Hay mucha documentación. En este foro y en Google asi que no tendrás problema.

¡Genial!
Ahora, ¿debieran ser dos programas separados? Me refiero a uno que vaya guardando las pulsaciones y otro que sea el que se comunique con la pc.
Pregunto esto porque me dijeron (si es que entendí bien) que un microcontrolador puede ejecutar un programa secuencialmente de manera indefinida y un microchip puede tener varios procesos.
Basándome en eso, y dado que desconozco cómo funciona Arduino (¡por ahora!), no sé si esas dos funcionalidades podrían ser parte de un mismo programa (no sé si se alojaría en un microcontrolador o en un microchip).
Habiendo visto algunos códigos de sketches creo tener idea de cómo hacer las dos funcionalidades en ese lenguaje, pero lo que no sé es, como decía, si debieran ser dos separados (incluso alojados en diferentes lugares) o uno mismo.
Desde ya, pido perdón si estoy preguntando algo que no tiene sentido.
Muchas gracias.

Jerónimo

No existes dos programas. No hay multitasking en arduino.
Todo lo haces con uno.
creas un programa que por un lado espera comandos por el puerto serie para responder a las peticiones de VB.
Y por otro lado mira y almacena las pulsaciones que se hagan.

Aca me cabe preguntarte como es el hardware que mira las teclas. Si lo vas a hacer con arduino, habría que ver si es posible. En principio creo que si, pero supongamos una situación posible.

Le pides via VB que envie por puerto serie datos de los archivos, como rápido eso demora algunos mseg, tal vez 100mseg, en ese tiempo alguien presiona una tecla y eso se perdió!!!
La solución porque siempre la hay es que uses algun encoder de teclado keyboard encoder y que éste active una interrupción del arduino. Entonces cuando se presiona una tecla se genera una interrupcción de hardware que será la que lea el encoder y haga lo que tenga que hacer, activar un flag por ejemplo para que luego el normal funcionamiento del arduino actualice en el archivo el id correspondiente.

¿Y no se pueden poner dos microcontroladores/microchips y que cada uno tenga y ejecute un programa diferente, de manera que no se interfieran?
Pregunto porque como recién empiezo con Arduino y no tengo mucho conocimiento de electrónica (la pregunta obligada sería: ¡¿entonces qué hacés acá?!) prefiero, si se puede, resolver las cosas programando (en Arduino o en VB6), que es lo que más fácilmente podré hacer.
Lo que pregunto concretamente es si se puede tener un microcontrolador/microchip que contenga el programa que reciba y almacene las pulsaciones y otro que, paralelamente, pueda conectarse con una pc y transferir los datos guardados.
Muchas gracias.

Jerónimo

No has leído mi respuesta si vuelves a preguntar lo mismo.

Con un Arduino puedes hacer todo solo hay que armar bien la estrategia de como hacerlo.
Si se usa un encoder de teclado las cosas se facilitan aún mas, pues el encoder genera un interrupción y entonces no debo estar pendiende de si pierdo o no algo.
Tampoco lo harás si no tienes el enconder pero como ya dije, deberás armar mejor la estrategia del programa

Había leído tu pregunta. Seguramente no me ha quedado claro el tema (producto de mi desconocimiento sobre Arduino) y por eso volví a preguntar.
Leyendo otros mensajes tuyos debo darte la razón, al menos en mi caso. Los proyectos parecen pequeños y se van agrandando.
En este caso no es que se agrande el proyecto sino que pensé en plantearlo de a poco para no confundir y veo que es contraproducente, porque tal vez falte información de mi parte.
¿Te parece bien si expongo el proyecto ideal y me decís si es posible de realizar? Si fuese viable, a lo mejor podría ir dividiéndolo en etapas para ir concretando pasos más pequeños, pero con la visión global.
Muchas gracias.

Jerónimo

Claro.. siempre reclamo exactamente eso.
Es una pregunta que no dejo de hacer. Porque la gente (y no es ofensivo hacia ti ni hacia nadie) viene a un foro publico y esconde información?
hay que explicar TODA la idea porque el contexto de la idea permite a quienes estamos en capacidad de responder hacerlo observando diferentes puntos de vista.
Verás que disímiles pueden ser los enfoques y todos brindarte la ayuda que buscas.
Quedamos a la espera de que expongas toda la idea.

Entiendo y comparto tu punto de vista, solo que no es que esconda información, sino que, por desconocimiento, pensé que al hablar de algo puntual iba a ser más práctico para no embrollar con todo el proyecto. Pero es cierto que para que los que saben puedan ayudar deben tener la información contextualizada.
Tengo claro que si necesito ayuda debo brindar todo antes de pedir nada, así que no va por ahí el tema.
También aclaro que no es que vengo y tiro dudas para esperar soluciones, sino que, paralelamente, estoy leyendo mucho para poder preguntar lo menos posible (me gusta arreglármelas y molestar lo indispensable).

Lo que tengo en mente es lo siguiente.
Armar una especie de teclado (ahí es donde mencioné los pulsadores) de alrededor de 32 teclas que deben ser mostradas en una pantalla (esto podría estar en una instancia posterior y, en lo posible, debiera ser una de esas TFT). Las teclas deben poder ser presionadas en conjunto (todas a la vez, aunque siempre existirá una mínima diferencia de milisegundos), es decir, como si apoyara la mano entera en un teclado de computadora, y no deben ser mostradas en la pantalla sino hasta que se presiona una en particular o se dejen de presionar todas (es decir, cuando no se detecte pulsación). Ejemplo: si las teclas correspondieran a letras, podría presionar “A”, “R”, “D”, “U”, “I”, “N”, “O” (incluso, simultáneamente), pero no deben ser mostradas hasta que presione la “X” o hasta que levante todos los dedos de las teclas. Una vez presionada la “X” o sensado que no hay pulsaciones, se debieran mostrar en pantalla y se debiera vaciar el buffer donde se fueron acumulando. Pero al mismo tiempo que se presentan en pantalla, deben ser guardadas en una memoria (ahí sí que entiendo menos, no sé si puede ser EEPROM, SD u otra). En la memoria debieran ser guardadas en un archivo hasta que se presione otra tecla para cerrar el archivo (por ejemplo, Z). Una vez cerrado el archivo, al presionar una tecla cualquiera debiera abrirse otro archivo para empezar a guardar pulsaciones (se inicia el ciclo nuevamente) hasta que se presione “Z”, momento en el que se cerraría.
Por otro lado, si conecto el dispositivo a una PC, desde una aplicación debiera poder ver el listado de archivos y descargar el que me interese.
Casi nada, ¿no? jejeje
En cuanto a la aplicación para PC no voy a tener problema. En lo que respecta a la programación para Arduino, imagino que no tendré mayores inconvenientes. Pero donde hago agua completamente es en la parte electrónica. Estoy leyendo sobre los distintos módulos para Arduino, pero hay cosas básicas de electrónica que desconozco, como lo que mencionaste acerca del coder de teclado (para poner solo un ejemplo).
¿Cómo lo ves?
Muchas gracias.

Jerónimo

Como lo veo. Mejor que antes. Que bueno que presentaras toda la idea porque mi sugerencia no creo que sirva.

Un enconder de teclado es lo que usas en tu teclado de PC, pero como bien sabes, el teclado común no esta preparado para que se presionen 6 teclas juntas y luego detecte otra.
Asi que vuelta a pensar en como hacerlo.

Debemos revaluar lo que pretendes y la única manera que veo es ya sea usando un 74HC165 como expansor de entradas y se requiere uno cada 8 teclas o sea 4 de ellos detectarían las 32 teclas y entonces no importaría si presionas una o 20 simultáneas.
Otro enfoque sería un 595 y un 165 formando una matriz 8x8

La idea sería asi


Este post te dará alguna guía. Presta atención al programa que yo postee porque lo demás son cosas sin terminar.

A ver si entendí... Por favor, corregime si estoy mal orientado.
Con el circuito y el código que referenciaste, podría tomar constantemente los estados de 64 pulsadores ("teclas").
De ahí en más, teniendo este circuito podría agregar al código las funciones pertinentes para guardar en un buffer lo que se va pulsando hasta que no se detecte pulsación alguna y luego lo guardado se muestre en pantalla, se grabe en la memoria y se vacíe el buffer.
Si es así, podría ir probando esto y el circuito para la conexión de la pantalla y el módulo de memoria, así como el código correspondiente, quedarían para la segunda etapa.
¿Estoy en lo cierto?
Muchas gracias nuevamente.

Jerónimo

El circuito a través del 595 activa una fila completa y el 165 lee cada columna, asi que puedes leer hasta 8 bits o teclas simultáneas por fila, incluso presionar todas.
Tu secuencia “A”, “R”, “D”, “U”, “I”, “N”, “O” no es problema, y seguirás leyendo hata que “X” sea presionada.

Olvidé decir esto: toda la secuencia es muy rápida. tanto que si mal recuerdo creo que en 1mseg se completa o menos. Los Shift Registers van al clock SPI y eso era 250khz porque por defecto la velocidad SPI es de 4Mhz
Asi que un barrido de 64 bits ocurre en 1/250khz*64 = 256 mseg mas algunas useg mas de las instrucciones involucradas.

Con eso quiero decirte que tomando un margen de que en 1 mseg barres las teclas, te da margen de sobra para responder a la petición de tu VB y acá es donde comenzó la cuestión.

¡Excelente!
Voy a probarlo así como decís, a ver si me sale, y luego comentaré cómo me fue. Si salgo airoso, continuaré con la pantalla y la memoria.
¡Muchas gracias, surbyte!

Jerónimo

Ahora te lo complico... pero no en esta fase de tu aprendizaje de arduino.
Si montas una rutina de timer tal que cada 1 mseg scannee en background (acepta esta licencia) el teclado, tu solo te ocuparías de las respuesta a los comandos de VB.
Como ves todo termina siendo como si fueran varios arduinos.
Solo hay que usar los recursos y el micro hace o puede hacer mucho mas de lo imaginable justamente por desconocimiento. Pero en realidad todos los micros pueden hacer estas cosas.

Eso suena muy bien.
De esa manera creo que estaría todo un poco más prolijo y separado, lo cual me facilitaría el mantenimiento.
Voy a tratar de armar todo durante la semana que viene, así empiezo con las pruebas. ¡Estoy ansioso!
Muchas gracias.

Jerónimo

Bueno, primero como ya sabes, armar el teclado, y que funcione.
Luego podrás ver como hacer que un servicio de timer haga la tarea y cuelgue los resultados en algun vector para que sepas que teclas fueron presionadas.

Así lo haré.
Mientras tanto, te hago una pregunta (sé que me estoy adelantando, pero a lo mejor cambia el punto de partida). Si es algo complejo y amerita que abra otro hilo, por favor, avisame y lo hago.
Una vez terminado este proyecto con Arduino quisiera meter todo en una cajita y dejar solo los conectores a la vista. Imagino que deberé crear una placa final con el circuito y los componentes correspondientes que reemplacen la Arduino. ¿Es así?
En caso afirmativo, ¿me conviene usar una Arduino UNO para este desarrollo, o una Arduino Due?
Pregunto esto porque entiendo que la Due viene con más prestaciones que la Uno y tal vez se necesiten menos componentes a la hora del ensayo, pero que al momento de crear la placa final deberé incorporar.
Muchas gracias.

Jerónimo

Como yo lo veo no necesitas DUE.
Es mas, si quieres que todo quede en una caja puedes bien usar un NANO.
El NANO es ideal para ello porque tiene el tamaño de una memoria GRANDE pero ya esta listo para insertarlo en un PCB. Luego le sumas los demas elementos y tienes todo disponible.
El teclado puedes mandarlo hacer y te quedaría algo bien terminado de aspecto semi o profesional.
Me olvidaba que requieres el controlador SD pero eso no es problema porque sumas un módulo SD por pocos euros/dolares/pesos.
Puedes usar uno de estos como módulo SD para el NANO

Esto es un ejemplo de lo que te estoy comentando. Claro que esta es otra aplicación pero se ve la idea


otro

EDITO: estaba viendo que necesitas 32 teclas y los módulos que se suelen vender son de 4x4 = 16. Si sumas dos módulos bien puedes obtener tus teclas. Los hay de tipo micro switch y tambien membrana (aunque estos no daran un buen aspecto al quedar repetidos)