Entradas

Mostrando entradas de octubre, 2023

Topología de estrella (AP y varios STAs).

Dada la posible conexión de estrella basada en wi-fi, 0 (AP) Clientes: 1 2 3 4 5 6 7 varias posibilidades emergen como posibles ilustraciones de problemas. Problema de simultaneidad: Los clientes intentan ser los primeros en encender un led.  Problema de restricciones: Un cliente tendrá que estar activo para que los demás puedan activarse. Problema de causalidad: similar al anterior, con al menos dos clientes sujetos a causalidad. Problema de calendarización: Mientras un cliente esté activo, otro no puede activarse; pasando un periodo,  éste otro si podría activarse. Problema de colaboración: un cliente puede proceder con independencia en su conexión, pero entonces no puede participar en la conformación de grupos colaborativos, y viceversa (si participa en grupos colaborativos, no puede ser independiente). Problemas específicos, como el de los filósofos comelones, semáforos binarios, adaptaciones del problema de consumidor-productor.

Tres nodos: 1 punto de acceso y dos clientes que se conectan entre sí vía el punto de acceso

Hola. Escribí éste prompt a Bard y parece que interpretó mis intenciones  cabalmente. La idea es tener 3 esp32s, y uno de ellos dar el "soporte" de conexión  para que los otros dos se comuniquen entre sí. De momento no tengo esp32s disponibles pare realizar éste experimento de red local, pero al menos da la información práctica necesaria para las discusiones teóricas acerca de las topologías de conexión, el paso de mensajes y los posibles algoritmos que se basen en  este tipo de tecnologías...   Inicio del prompt en Bard y respuesta, a continuación. Escriba programas en Arduino que, dados tres microcontroladores esp32 (nombrados A, B y C), A sea un punto de acceso wifi, y B y C se conecten al punto de acceso de A, y B y C pueden comunicarse entre sí mediante la técnica de sockets. Claro que sí, aquí tienes tres programas en Arduino que, dados tres microcontroladores ESP32 (nombrados A, B y C), A sea un punto de acceso WiFi, y B y C se conecten al punto de acceso de A...

Origami, solo por compartir el interés

El siguiente video me pareció interesante mostrárselos para  constatar la importancia de las técnicas de origami aplicadas  a algunas ramas de la ciencia y la tecnología.   https://www.youtube.com/watch?v=uFyJykl1O0k En el minuto 36 se menciona algo de las aplicaciones a robótica, por si quieren cortar trecho.

Ejemplo de prompt para obtener programas desde Bard (sockets y esp32)

Prompt (y claro, lo mejor es que experimenten con diversos tipos de lenguaje; i.e. Arduino, digamos: Por favor, escribe un programa en Arduino para que dos microcontroladores esp32 se comuniquen entre sí vía wifi y utilizando la técnica de sockets. ):   Por favor, escribe un programa en MicroPython para que dos microcontroladores esp32 se comuniquen entre sí vía wifi y utilizando la técnica de sockets.   De acuerdo, aquí tienes un programa en MicroPython para que dos microcontroladores ESP32 se comuniquen entre sí vía WiFi y utilizando la técnica de sockets: Ejemplo 1: Servidor Python import usocket as socket def main (): # Crea un socket TCP/IP sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # Se conecta al puerto 8080 sock.connect(( "192.168.1.100" , 8080 )) # Recibe un mensaje del cliente data = sock.recv( 1024 ) # Imprime el mensaje recibido print(data) # Cierra el socket sock.close() if __name__ == "__...

Sockets en MicroPython, genérico, según Bard

Tomado directamente de Bard: Por favor, escribe un programa en MicroPython para que dos microcontroladores se comuniquen entre sí vía wifi y utilizando la técnica de sockets. De acuerdo, aquí tienes un programa en MicroPython para que dos microcontroladores se comuniquen entre sí vía wifi y utilizando la técnica de sockets:   Python import network import socket # Configuración del servidor server = network.WLAN(network.STA_IF) server.active( True ) server.connect( "ssid" , "password" ) # Creación del socket sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.bind(( '' , 8080 )) sock.listen( 1 ) # Espera de una conexión conn, addr = sock.accept() print( "Conexión aceptada de" , addr) # Envío de un mensaje msg = "Hola, mundo!" conn.sendall(msg.encode()) # Cierre de la conexión conn.close() # Configuración del cliente client = network.WLAN(network.STA_IF) client.active( True ) client.connect( "ssid" ,...

Sockets en Python

 De algún lugar tomé unos archivos para experimentar (localmente, en una  sola máquina) con esto de los sockets en Python. He colocado los archivos tales en Drive, socketsPython.zip .  Se trata de un socket de Python ligado a una dirección IP el cual hace el papel de servidor, y otro socket también de Python  que hace el papel de cliente. Ya he verificado su funcionamiento, por si quieren replicar la práctica. Más adelante tal vez los veamos funcionando en clase.

Procesos:

 Un proceso en Erlang: descargar erlang apt-get install erlang Ejecutar erl Cargar el archivo (mostrado a continuación): c(ejemploProceso).   ejemploProceso.erl:  -module ejemploProceso. -export([start/0,cuerpo/0]). start() ->     register(proc, spawn(ejemploProceso,cuerpo,[])).   cuerpo() ->     receive     hola -> io:format("hola :)"),         cuerpo();     adios -> io:format("adios :("),     cuerpo()     end.  (En Ubuntu:)  mh@mh:~$ erl      Erlang/OTP 22 [erts-10.6.4] [source] [64-bit] [smp:8:8] [ds:8:8:10] [async-threads:1] Eshell V10.6.4  (abort with ^G) 1> c(ejemploProceso).   {ok,ejemploProceso}   2> ejemploProceso:start().   true   3>     Para esto de aprender un poquillo de Erlang: www.erlang.org   Para un comienzo de familiarización, ...

De compras

Imagen
 Hace un tiempo encargué esto a Aliexpress, por si ahora o en futuro requieron productos semejantes, y me parecieron excelentes compras. Comparto.

Robotito zeppelin

Imagen
 Buscando novedades en esto de los robots, ¿qué tal un  miniproyecto de un robotito pendiendo de un globo de helio, impulsado por una hélice, manejado por bluetooth o wifi? Habría que ponerle una pila pequeña de esas de botón... Un pequeño motor, un micro servo... Al menos no sigue el patrón común creo. Las imágenes anexas son "diseños" sacados de openart.ai . Ojo: ES SOLO UNA IDEA IMAGINATIVA compartida; NO LA ASIGNACI^ON DE UN PROYECTO FORMAL:

Robotito humanoide

Un robotito humanoide basado en Raspberry Pi (para quienes somos fan): https://www.hiwonder.com/products/ainex?variant=40257678180439

Razón aurea y corrección de programas

 Como se dijo,  fib(n+1)/fib(n)  es la razón áurea 1.6... y es un número que extrañamente aparece en diversos contextos naturales. Artificialmente, explica muchas obras de arte que son  consideradas bellas. Con la versión de los números de Fibonacci en Haskell  (bastante eficiente): flujoFibs = 1:1:[a | a <- zipWith (+) flujoFibs (tail flujoFibs)] la razón áurea se calcula rápidamente, como vimos. Ahora, un argumento a favor del uso de lenguajes de alto nivel como Haskell sería en que hacen asequible la demostración de la corrección de programas. En ocasiones, la claridad de la formulación de los programas (funcionales) en  Haskell ya es bastante razón para suponer que un programa es correcto. Y un programa es correcto si hace lo que se supone debe hacer. No es tan directo  ver que un programa es correcto en Arduino o en Python, pero sin duda es  también parte de las ambiciones de sus proponentes. Que la corrección de un  programa sea un o...

Una función rápida ( O(n) ) de los números de Fibonacci basada en evaluación perezosa y listas infinitas

Detalles por explicar... Prelude> let fibs = 1:1:[a | a <- zipWith (+) fibs (tail (fibs))] in fibs!!1 1 Prelude> let fibs = 1:1:[a | a <- zipWith (+) fibs (tail (fibs))] in fibs!!2 2 Prelude> let fibs = 1:1:[a | a <- zipWith (+) fibs (tail (fibs))] in fibs!!3 3 Prelude> let fibs = 1:1:[a | a <- zipWith (+) fibs (tail (fibs))] in fibs!!4 5 Prelude> let fibs = 1:1:[a | a <- zipWith (+) fibs (tail (fibs))] in fibs!!5 8 Prelude> let fibs = 1:1:[a | a <- zipWith (+) fibs (tail (fibs))] in fibs!!6 13 Prelude> let fibs = 1:1:[a | a <- zipWith (+) fibs (tail (fibs))] in fibs!!7 21 Prelude> let fibs = 1:1:[a | a <- zipWith (+) fibs (tail (fibs))] in fibs!!8 34  

Mejora de programas en máquinas con recursos limitados

Para dispositivos que tengan una memoria y capacidad de procesamiento limitadas,  es necesario que la programación sea realizada con sumo cuidado con respecto a la eficiencia. Algunas técnicas dignas de mencionar para mejorar tal eficiencia son:   a) Técnica de precomputación o memoización.   b) Técnica de evaluación parcial.   c) Técnica de vectorización.   d) Técnica de deforestación (por ejemplificar).   Existe además un método semi-algebraico para mejorar programas, en lo general, llamado desdoblado/doblado (unfold/fold, en inglés), o como decía un amigo mío,  la técnica de origami.  Un amplio tutorial al respecto es el siguiente (pero ojo, no requiero que se vuelvan  expertos al respecto, solo que  conozcan cómo funcionan genéricamente éstas técnicas y que, de hecho, existen):  https://www.researchgate.net/publication/220566101_Rules_and_Strategies_for_Transforming_Functional_and_Logic_Programs/link/09e4150cee9d7ebb8c000000/dow...

Una semana fundamental.

 Hemos visto algunos temas de complejidad. Ya dimos como definición preliminar de ejecución en tiempo real a aquellos programas que se ejecutan en tiempo lineal; otros órdenes de ejecución son significativos para algunas tareas de computación, tales como órdenes n**2 o polinomiales en general, pero no para tareas que requieren dotarse de una interacción con entornos en donde los humanos participamos. Órdenes de complejidad no-polinomiales (por ejemplo, exponenciales), no son adecuadas más que como parte de discusiones teóricas (por ejemplo, si tenemos órdenes factoriales, O(n!), algunos programas con tamaño de entradas modestas, tales como 100, superan a la cantidad de partículas existentes en el Universo conocido --- aprox, 10**110, pues 100! es aprox. 10**152, digamos). Como parte de mejoras ligeras, pero aún así, significativas en el procesamiento otorgado por microcontroladores, destacan: a) De posible recursión a iteración; b) de posible cálculo sobre la marcha a la recuperaci...

Complejidad: Algo de su teoría

Del origen del nombre del blog: https://es.wikipedia.org/wiki/Robot_de_Leonardo https://www.muyinteresante.es/historia/61295.html https://www.leonardo3.net/leonardo/books%20I%20robot%20di%20Leonardo%20-%20Taddei%20Mario%20-%20english%20Leonardo%20robots%201.html La teoría de complejidad intenta medir la ejecución de los programas de computadora desde dos puntos de vista del consumo de recursos: a) De los recursos de espacio, y b) de los recursos de tiempo. Una notación conocida como "O grande" es útil para describir cómo se comporta un programa asintóticamente (conforme la entrada consumida por el programa se hace mayor y mayor, en alguna medida). O(n) son los mejores programas que podemos tener como humanos (y sus primos O(log(n)) y O(n log(n)). Programas que involucran O(n**2), O(n**3)... ya no nos son tan buenos. Programas que involucran O(2**n), O(3**n)... ya nos son, para la práctica robótica, ajenos. Ejemplo de factorial recursivo (O(n) tiempo, O(n) espacio)...

Bienvenidos

Quién sabe que tenemos con esto de los autómatas que desde hace mucho tiempo la Humanidad busca construirlos. Tal vez se trate de un intento de jugar a ser dios. En todo caso, sin la adecuada metodología, nuestros robots no serán lo suficiemente complejos para lograr realizar algunas tareas complicadas.