AUTOMATIZACION DE TAREAS EN WINDOWS


Quienes utilizamos el ordenador como herramienta de trabajo, probablemente repitamos ciertas acciones a diario, o incluso varias veces a lo largo del mismo día. Y quienes lo utilizan para otros fines, probablemente también, por ejemplo, abrir dos o tres -o más- páginas web para consultar las noticias en diferentes portales, o acceder a los servicios web de nuestro banco, o cualquier otra acción, en definitiva, que se repite con alta frecuencia, pues bien rescato desde estas líneas un breve post que resume algunas herramientas que nos pueden ayudar  precisamente a eso: automatizar tareas repetitivas.

IMACROS

Esta extensión para Google Chrome  ( pero que también se puede ejecutar en Microsoft Edge), permite que todas estas acciones habituales se automaticen, y se hagan todas ellas sin necesidad de interacción por parte del usuario, cuando nosotros queramos. Es por tanto  una extensión para nuestro  navegador web   (Google Chrome o Edge ) que automatiza cualquier acción y tarea  que podamos hacer en la web para ahorrar tiempo frente al ordenador.

La extensión en cuestión se llama «iMacros» y se puede descargar gratis desde la Chrome Web Store. Una vez descargada e instalada, abriéndola desde la parte superior derecha del navegador web se despliega como una pequeña pestaña independiente en la que encontramos funciones como ‘Play’, ‘Record’ y ‘Manage’. Las dos primeras, como es evidente, sirven para reproducir acciones automatizadas ya guardadas y para empezar a grabar cualquiera de estas acciones que queramos dejar almacenada para su posterior ejecución.

Se pueden automatizar tareas como la apertura de páginas web en una misma pestaña o en pestañas independientes, así como el cierre de las mismas, y también se incluyen otras opciones más avanzadas como la introducción de información en los formularios que corresponda. Así, por ejemplo, para estudiantes a distancia es posible abrir el portal de la universidad, introducir el usuario y la contraseña, y que esté todo disponible para ponerse a ‘trabajar’ desde el primer momento.

Esto es extensible a otros ámbitos. En redes sociales, por ejemplo, se puede programar la apertura de los perfiles de una compañía en todas ellas, de forma que cuando nos sentemos a trabajar todo esté preparado. Y para este tipo de tareas, únicamente hay que darle a ‘record’ y actuar según lo que queramos automatizar. Una vez terminado, pulsaremos de nuevo este botón para parar la grabación, y ya podremos guardar en la sección ‘Bookmarks’ la tarea automatizada con el nombre deseado. Y al pulsar sobre ella, todo el flujo de trabajo anterior se reproducirá de forma exacta.

siKULI

Sikuli automatiza todo lo que vea en la pantalla utilizando el reconocimiento de imágenes para identificar y controlar los componentes de la GUI. Es útil cuando no hay un acceso fácil al código fuente o interno de una GUI. Sikuli  por cierto era un proyecto de investigación de código abierto en el Grupo de Diseño de Interfaz de Usuario en el MIT . La línea de paquete SikuliX ahora se mantiene y se desarrolla aún más mediante Raimund Hocke (también conocido como RaiMan) junto con la comunidad de código abiertoSikuli Slides es desarrollado por Sikuli Lab en la Universidad de Colorado Boulder . Es apoyado en parte por la National Science Foundation con el número de adjudicación IIS-0447800 y por Quanta Computer como parte del proyecto TParty. Los paquetes de software Sikuli y SikuliX se publican bajo la licencia MIT.

Para obtener una primera impresión sobre SikuliX , Hello World Example es un buen punto de partida. Puede continuar siguiendo los ejemplos en los tutoriales y los videos . Puede aprender más sobre SikuliX leyendo la documentación .

SikuliX actualmente usa Python como lenguaje de scripting.  El script de Python es bien soportado por el Sikuli-IDE (JRuby está disponible con la versión 1.1.0 y hay más lenguajes de scripting por venir). Puede usar las características de Sikuli en sus programas Java, así como también usar la API SikuliX y en muchos otros lenguajes y entornos de scripts Java (más información: comience aquí ). Para Sikuli Slides , puede encontrar todo lo que necesita en la página de inicio .

AUTOIT

Realizar actividades reiterativas, como rellenar formularios, lanzar aplicaciones o interactuar con diferentes programas, a veces resulta desesperante. Veremos cómo automatizarlas mediante AutoIt.

AutoIt es un programa con el que podrá automatizar tareas en su PC. Funciona mediante la creación de unos ficheros basados en macros (conjunto de comandos para realizar una determinada tarea), y utiliza un lenguaje de instrucciones parecido al C#, mediante el cual es posible definir las acciones a realizar cuando la macro sea ejecutada. Así, puede resultar muy útil para acceder al correo electrónico web, crear un programa que copie datos de Excel y los vuelque en Word o automatizar rutinas en SAP; así como crear utilidades que rellenen formularios web.

Para usar esta aplicación lo ,lo primero que tiene que hacer es acceder a la página oficial. Allí encontrará distintos tipos de instaladores, documentación, versiones beta, e incluso iteraciones anteriores del programa. Dependiendo del tipo de instalación que desee, le interesará descargar una u otra opción , pero sin duda  la mas interesante es bajar la ultima versión (en el momento de escribir este post es la v 3.3 ), pulsando para ello sobre Download AutoIt V3. A continuación, guarde el programa instalador en su PC, que posteriormente ejecutará para proceder con su instalación.

Automatiza tareas AutoIt 1

Para lanzar el instalador de AutoIt, deberá pulsar sobre el programa de Setup denominado autoit-v3-setup.exe. Verás abrirse el Wizard que le guiará a lo largo de todo el proceso. Para comenzarlo, pulse sobre el botón Next. En la ventana que se abre a continuación, debe aceptar los términos de uso pulsando sobre el botón I Agree; mientras que, en el siguiente paso, el asistente le pedirá que seleccione la acción que quiere realizar, tras hacer doble clic sobre los ficheros con código fuente *.au3 de Autoit.

Es posible elegir entre Run the script, que por defecto ejecutará los ficheros *.au3al pulsar sobre ellos; o Edit the script, que abrirá el editor de scripts cuando haga doble clic sobre el fichero. Por defecto, es  mejor  dejarlo en la opción Run the script y pulsar sobre el botón Next.

Automatiza tareas AutoIt 2

A continuación, llega el momento de instalar o no los ejemplos, lo cual es interesante por lo que recomendamos dejar las opciones que encuentras por defecto, que los instalarán. Tras pulsar sobre Next, en la ventana que se abre, deja la ruta que se encuentra marcada por defecto para el programa instalador y pulsar sobre el botón Install para lanzar la instalación.

Verá una ventana y una barra de progreso con información sobre el proceso de instalación. Concluida con éxito la instalación, pulse sobre el botón Finish. Si ha dejado marcada la opción Show release notes (check for script breaking changes), al finalizar, verá abrirse una ventana con información sobre las mejoras añadidas en la revisión que acabas de instalar.

Una vez instalado el programa, la mejor forma de comenzar a utilizarlo es ejecutando AU3Record.exe, que graba las pulsaciones de teclado y ratón, y las convierte en comandos script de AutoIt. Encontrarásel programa en la ruta C:\Program Files\AutoIt3\Extras\Au3Record.exe. Una vez ejecutado, verá abrirse una ventana en la que deberás configurar el funcionamiento del grabador de acciones de teclado y ratón. Pulsando en Click to record, comenzará la grabación de acciones, que se irá registrando en la ventana inferior.

La opción Shrink Window During Record minimiza la ventana durante la grabación de la macro, dejando únicamente abierto el botón para iniciar/detener la grabación. Además, mediante la opción Record Mouse, podrás registrar o descartar el registro de pulsaciones del ratón. Por su parte, con Record Window Text, activará o descartará las pulsaciones de teclado. Finalmente, puede lanzar la aplicación sobre la que va a interactuar escribiendo el nombre del ejecutable del programa en Run.

Automatiza tareas AutoIt 3

Para terminar , los botones SaveSave As y Exit se corresponden con las opciones de salvar, salvar como y salir del programa, respectivamente. Después podrá ejecutar la macro con tan solo hacer doble clic sobre el programa *.au3. Cabe destacar que, antes de salvar el script para ejecutarlo, deberá quitar el carácter _ del comando inicial _Au3RecordSetup() y dejarlo como Au3RecordSetup().

AutoIt  también dispone de un editor de texto propio, denominado SciTE.exe, ubicado en la ruta C:\Program Files\AutoIt3\SciTE, muy cómodo de utilizar, porque muestra en distintos colores las instrucciones que componen el programa. Asimismo, dispone de las típicas opciones de los editoresFile (gestión de archivos); Edit (edición); Search (búsqueda); View (formato de la ventana); Options (opciones de visualización); Language (idioma); Buffers (selección del programa sobre el que trabajar, en caso de haber múltiples abiertos); y Help (ayuda).

La diferencia se encuentra en la pestaña Tools. Allí encontrará las herramientas Compilar, para hacer lo propio con el script de la aplicación; Build, que crea un fichero independiente ejecutable .exeGo, para ejecutar un script; Tidy Autoit Source, destinado a organizar el código fuente; MsgBox(‘4096’,debug,…), que da acceso a la ventana de debugCtrl+ F Insert Bookmarked Line(s), para insertar líneas previamente; Stop executing, para detener la ejecución del script; Next message y Previous Message, para saltar al siguiente mensaje de error o al anterior mostrado en la ventana de comandos; Clear Output, que limpia la ventana de comandos; mientras que Switch Pane permite conmutar activando la ventana de comandos o la de código.

Automatiza tareas AutoIt 5

Disponemos de muchos programas de ejemplo y ayuda acerca de cada instrucción en la web del diseñador y en la ayuda del programa, e ! incluso hay un foro disponible para desarrolladores! . Se trata de un programa muy completo, con el que se puede hacer de todo con el PC. Así, cuanto más lo uses, más comandos nuevos descubrirá. Existen editores en Internet para crear GUIs (interfaces gráficas de usuario) y generar el código para AutoIt. Puede encontrar más información en esta dirección.

Otras Herramientas

Hay  asimismo  otros  programas para automatizar tareas en Windows  aparte de las que ya se ha comentado. Algunas otras interesantes  y  más populares son las siguientes:

  1. Task Scheduler: Es una herramienta incorporada en Windows que le permite programar tareas para que se ejecuten automáticamente en fechas y horas específicas.
  2. AutoHotkey: Es un programa gratuito y de código abierto que te permite crear macros y automatizar tareas en Windows. Puede grabar sus propias macros o escribirlas desde cero utilizando un lenguaje de programación fácil de aprender.
  3. RoboTask: Es un programa de pago que le permite automatizar tareas en Windows utilizando una interfaz gráfica de usuario. Puede crear tareas que involucren la manipulación de archivos, el lanzamiento de aplicaciones, la gestión de ventanas y más.
  4. Zapier: Es un servicio en línea que le permite automatizar tareas en Windows (y en otros sistemas operativos) mediante la integración de diferentes aplicaciones y servicios en línea. Puede crear flujos de trabajo que involucren el envío de correos electrónicos, la publicación de contenido en redes sociales y más.
  5. IFTTT: Es otro servicio en línea que le permite automatizar tareas en Windows mediante la integración de diferentes aplicaciones y servicios en línea. Puede crear «recetas» que involucren la automatización de tareas como la copia de archivos, la sincronización de contactos y más.

Asimismo, para suprimir tareas repetitivas en nuestro  PC, podemos utilizar otros programas de automatización que  permiten programar tareas para que se ejecuten automáticamente en fechas y horas específicas, o en respuesta a eventos específicos. Además de los programas que  hemos visto anteriormente, hay otros que también podrían ayudarnos a eliminar tareas repetitivas en nuestro PC:

  1. WinAutomation: Es un programa de automatización de tareas de Windows que nos permite crear flujos de trabajo automatizados y personalizados. Puede automatizar tareas como la captura de pantallas, la descarga de archivos, la gestión de archivos y más.
  2. Macro Recorder: Es un programa que  permite grabar sus acciones en el PC y luego reproducirlas automáticamente en respuesta a eventos específicos. Puede grabar acciones como la apertura de aplicaciones, la navegación por la web y más.
  3. Advanced Task Scheduler: Es un programa de planificación de tareas que le permite programar tareas para que se ejecuten en fechas y horas específicas, así como en respuesta a eventos específicos. Puedesprogramar tareas como la ejecución de aplicaciones, la copia de archivos y más.
  4. Automation Anywhere: Es una herramienta de automatización de procesos robóticos (RPA) que le permite automatizar tareas repetitivas en su PC. Puede automatizar tareas como la entrada de datos, la generación de informes y más.

Amigo lector si conoce alguna herramienta que no este incluida en este post no dude en añadirla en los comentarios, y sin duda la iremos añadiendo en aras de que a todos podamos disfrutar  de una interacción con nuestro ordenador menos repetitiva.

Anuncio publicitario

Tiny11 para Arm en una Raspberry Pi 4


La reciente versión de Windows 11, Tiny11, ha reducido el sistema operativo estrella de Microsoft a lo esencial y lo ha hecho utilizable en hardware antiguo y de baja especificación. Tiny11 ya está disponible para su descarga en https://archive.org/details/tiny-11_202302. La ISO puede descargarse directamente o a través del protocolo BitTorrent. Sea cual sea la opción elegida, la ISO descargada tendrá un tamaño aproximado de 3 GB.

Por tanto Tiny11 es un sistema operativo que hace honor a su nombre al reducir una instalación estándar de Windows 11 de más de 20 GB en disco a aproximadamente 8 GB y «funciona de maravilla» en un sistema con sólo 2 GB de RAM. Además, la ISO de instalación, ya disponible, ocupa sólo 3 GB. Sin embargo, hay algunas cosas que se debe tener en cuenta antes de configurar un sistema Tiny11. Pero las cosas no acaban aquí pues una nueva versión del desarrollador NTDev ofrece a los usuarios de Arm de 64 bits, como la Raspberry Pi 4, la oportunidad de probar Windows 11 en sus placas.

El desarrollador NTDev explica que Tiny11 puede reducirse aún más aplicando compresión de disco. El «mínimo» de aplicaciones incluye la carga estándar de herramientas de accesibilidad intactas, y se mantienen los elementos básicos de Windows como Calc, Bloc de notas, Paint, etcétera. Además, la Microsoft Store sigue ahí, para que pueda instalar varias aplicaciones y herramientas de Windows que echemos de menos.

Sin embargo, faltan algunas cosas medianamente importantes. Esta instalación del sistema operativo «no es reparable», señala NTDev. «NET, los controladores y las actualizaciones de las definiciones de seguridad pueden instalarse desde Windows Update», por lo que no se trata de una instalación de la que pueda olvidarte. Además, la eliminación del almacén de componentes de Windows (WinSxS), responsable en gran medida de la compacidad de Tiny11, significa que no es posible instalar nuevas funciones o idiomas. Si instala y disfrutamos de Tiny11, suponemos que tendremos que estar atentos a las actualizaciones ISO a medida que lleguen las revisiones de las principales características de Windows 11

La versión original afirmaba que podía ejecutar Windows 11 en hardware con sólo 2 GB de RAM y utilizar sólo 8 GB de espacio en disco (frente a una instalación típica de 20 GB) ¿Qué tal funcionaría una Raspberry Pi 4 a 1,5 GHz y con sólo 2 GB de RAM con Tiny11? Pues desde la pagina de Tomshardware.com lo han probado y desde luego no tiene mala pinta los resultados obtenidos.

El archivo viene como una imagen ISO de 4GB. A diferencia de las típicas imágenes ISO, tenemos que hacer algo más que copiar el archivo a una unidad USB utilizando Rufus o Raspberry Pi Imager. En su lugar tenemos que utilizar Windows en Raspberry (WoR) herramienta para instalar la imagen en una tarjeta micro SD / USB 3 unidad flash. El proceso de instalación no es el más rápido, así que lo ideal es configurar su Raspberry Pi para arrancar desde USB y utilizar una unidad flash USB 3 o SSD caddy. Como Microsft nos tiene acostumbrados, la instalación es casi una instalación típica de Windows, siendo la única parte que falta iniciar sesión en su cuenta de Microsoft ya que en su lugar el instalador nos dirige a configurar una cuenta de usuario local (pero en ningún momento se piden datos de activación).

Con la instalación y configuración realizadas, el rendimiento de Windows 11 en una Raspberry Pi 4 es pobre a través de micro SD, confirmando una vez más que una solución basada en USB 3 es el camino a seguir. Dicho esto, el menú principal responde bien y se pueden utilizar las aplicaciones y la bandeja del sistema sin muchos problemas.Navegar por la web a través de Edge no es la mejor experiencia, pero funciona lentamente (por ejemplo la web de Tom’s Hardware tardó mucho en renderizarse porque las imágenes aparecían aquí y allá).

¿Qué pasa con Wi-Fi y Bluetooth? Las malas noticias primero, Tiny11 no detecta el Wi-Fi de la Raspberry Pi 4 pero una conexión Ethernet funciona muy bien. Asimismo Bluetooth también esta operativo a medias ( en las pruebas encontró y se conectó con éxito a un smartphone pero sin embargo, el éxito duró poco, ya que no pudimos enviar ningún archivo entre los dispositivos conectados por Bluetooth).

Tiny11 viene con Microsoft Store y Microsoft Edge preinstalados, lo que significa que podemos instalar aplicaciones y navegar por Internet utilizando herramientas familiares. Es muy probable que el software disponible en Microsoft Store funcione, pero la experiencia puede variar. Lo que no funcionará son los ejecutables hechos para x86 y x86_64, que arrojarán un error, asía que a menos que se pueda encontrar aplicaciones compatibles, sólo queda lo que ofrece la tienda.

Ejemplo de w11 en raspberrypi

El sistema es funcional a la velocidad máxima disponible de 1,5 GHz utilizando en las pruebas 1,2 GB de los 2 GB disponibles (con todas probabilidad con más RAM y un overclock beneficiarían ). Por ejemplo desde la pagina de Tom han probado un pequeño overclock de 1,8 GHz, una velocidad que ahora se considera el valor predeterminado para Pi 4 y Pi 400 por Raspberry Pi. La velocidad extra mejoró en gran medida la experiencia y con un poco más de memoria RAM y almacenamiento USB 3 podría ser una máquina viable, si usted maneja sus expectativas en consecuencia. El overclock se consiguió entrando en la BIOS en el arranque, pero como todos los casos de overclok, se aconseja que elija una de las mejores carcasas para refrigeración activa o pasiva antes de aumentar demasiado el overclock.

Estamos sin duda en los inicios de Tiny11 para Arm 64 (de hecho, en ese tiempo hemos visto dos versiones, una de las cuales solucionaba un problema de instalación fallida) , así que seguramente habrá errores, pero a medida que este proyecto madure podría llegar a ser tan bueno como Windows 10 para Raspberry Pi, que demostró ser muy prometedor. Por ahora, tratémoslo más como una curiosidad que como un programa de uso diario con la seguridad que muy seguro desde la propia Microsoft sacarán una versión final también para Raspberry.

Tiny11 para Arm64 está disponible actualmente a través de Internet Archive:https://archive.org/details/tiny11a64

Imagen del sitio de descarga de tiny11 para ARM64

Tiny11 también incluye algunos cambios de bajo nivel popularizados por herramientas como Rufus. Por ejemplo, por defecto, Tiny11 utiliza una cuenta local, aunque se mantiene la opción de configurar una cuenta en línea. Sin embargo, tenga en cuenta que características como los Widgets en Windows 11 siguen necesitando una cuenta Microsoft para funcionar.

Otro cambio que puede atraer a los aficionados a los cacharros, sobre todo a los de gama baja y hardware antiguo, es la eliminación de varias restricciones de hardware. En las pruebas realizadas, NTDev afirmó que Tiny11 podía «funcionar de maravilla» en un sistema con sólo 2 GB de RAM. Además, quienes no puedan actualizar sus instalaciones de Windows 10 debido a la generación del procesador o a problemas con el TPM podrán utilizar la ISO de Tiny11 para incorporarse al nuevo sistema operativo de Microsoft.

Memoria de w11 en RPI4

Al desglosar la cifra de instalación de 8 GB, NTDev revela que los archivos del sistema operativo ocupan 6,34 GB de espacio, mientras que las aplicaciones que han sobrevivido al recorte ocupan 1,59 GB.

Gestion de tarjetas SD con ESP32


Es obvio que las SD se han convertido en algo indispensable en nuestra vida digital , estando presentes en infinidad de dispositivos electrónicos como smartphones, cámaras digitales, cámaras de seguridad, reproductores multimedia, ordenadores, microcontroladores, y un larguísimo etcétera.

Por otro lado, de vez en cuando nos encontramos con proyectos basados en ESP32 ( y todas sus variantes) que necesitan una forma de almacenar una gran cantidad de datos de forma escalable y eficiente (es decir, necesitamos construir lo que viene a llamarse un registrador de datos o en ingle «datalogger»), siendo lo ideal por tanto usar con nuestro microntrolador precisamente estas tarjetas SD o micro SD, dada su gran capacidad para empaquetar GigaBytes de datos en un espacio más pequeño que una moneda.

SPI es un acrónimo que significa «Serial Peripheral Interface». Es un protocolo de comunicación serie que se utiliza para transferir datos entre dispositivos electrónicos, como microcontroladores, sensores, dispositivos de almacenamiento, etc. SPI permite a varios dispositivos compartir un canal de comunicación y cada dispositivo puede actuar como esclavo o maestro. El protocolo SPI es conocido por ser rápido y flexible, y por tener una arquitectura sencilla que permite una fácil integración en una amplia gama de aplicaciones electrónicas. Además, el protocolo SPI es compatible con una amplia gama de velocidades de transmisión de datos, lo que lo hace adecuado para una variedad de aplicaciones con diferentes requisitos de velocidad y capacidad de procesamiento.

Esp32

El ESP32 es un microcontrolador que incluye una interfaz de comunicación SPI, lo que significa que puede utilizar el protocolo SPI para comunicarse con otros dispositivos electrónicos. Aquí hay algunos de los usos más comunes de la interfaz SPI en el ESP32:

  1. Comunicación con sensores: El ESP32 puede utilizar la interfaz SPI para comunicarse con sensores, como acelerómetros, giroscopios, sensores de temperatura, etc.
  2. Comunicación con dispositivos de almacenamiento: El ESP32 puede utilizar la interfaz SPI para comunicarse con dispositivos de almacenamiento, como tarjetas SD o dispositivos Flash, para leer y escribir datos.
  3. Comunicación con pantallas táctiles: El ESP32 puede utilizar la interfaz SPI para comunicarse con pantallas táctiles y controlar la visualización y la entrada de datos.
  4. Comunicación con dispositivos de radiofrecuencia: El ESP32 puede utilizar la interfaz SPI para comunicarse con dispositivos de radiofrecuencia, como módulos Bluetooth o Wi-Fi, para transferir datos a larga distancia.

En resumen, la interfaz SPI en el ESP32 se puede utilizar para una amplia gama de aplicaciones, lo que lo hace una herramienta valiosa para desarrollar proyectos electrónicos y de Internet de las cosas.

En este post vamos a ver que en realidad leer o escribir datos en una SD ( o micro-sd) en el entorno de la familia Arduino es en realidad muy sencillo gracias a las librería SD y también al protocolo SPI para la comunicación con el lector de SD.

Descripción general del hardware.

Para este proyecto se ha probado el lector de sd de AZDelivery el cual nos proporciona una expansión fácil y económica del espacio de almacenamiento mediante la ranura SD. La comunicación es muy fácil con el microcontrolador a través del protocolo SPI (como vamos a ver ) y soporta tarjetas Micro SD (2G), tarjetas Micro SDHC (32G) (tarjeta de alta velocidad). Además el módulo lee todos los datos contenidos en la tarjeta SD y se puede conectar fácilmente a varios tipos de microcontroladores ( además si lo compramos a este fabricante incluye un E-Book que proporciona información útil sobre cómo comenzar su proyecto, ayuda con una configuración rápida y ahorra tiempo en el proceso de configuración proporcionándonos una serie de ejemplos de aplicación, guías de instalación completas y bibliotecas, etc.).

aspecto lector sd

El módulo de la tarjeta micro SD contiene dos componentes principales que, sin duda, hacen que sea fácil agregar el registro de datos a su próximo proyecto Arduino:

  • El voltaje de funcionamiento de cualquier tarjeta micro SD estándar es de 3,3 V. Por lo tanto, no podemos conectarlo directamente a circuitos que usan lógica de 5V. De hecho, cualquier voltaje que supere los 3,6 V dañará permanentemente la tarjeta micro SD. Es por eso; el módulo tiene un regulador de caída ultrabaja incorporado que convertirá los voltajes de 3,3 V a 6 V a ~3,3 V.
  • También hay un chip 74LVC125A en el módulo que convierte la lógica de la interfaz de 3,3 V-5 V a 3,3 V. Esto se llama cambio de nivel lógico. Eso significa que puede usar esta placa para interactuar con microcontroladores de 3,3 V y 5 V como Arduino.

En realidad, hay dos formas de interactuar con tarjetas micro SD: modo SPI y modo SDIO. El modo SDIO es mucho más rápido y se usa en teléfonos móviles, cámaras digitales, etc, pero desgraciadamente este modo es más complejo y requiere la firma de documentos de confidencialidad( por esa razón, es probable que los aficionados como nosotros nunca encuentren el código de interfaz del modo SDIO). En su lugar, cada módulo de tarjeta SD se basa en el modo SPI de «menor velocidad y menos sobrecarga» que es fácil de usar para cualquier microcontrolador (como Arduino).

Asignación de pines del módulo de la tarjeta Micro SD

El módulo de la tarjeta micro SD que vamos a usar es bastante simple de conectar. Tiene seis pines:

parte atras lector sd
  • VCC :El pin que suministra energía para el módulo y debe conectarse al pin de 5V en el Arduino.
  • GND (TIERRA): debe estar conectado a tierra de Arduino.
  • MISO (Master In Slave Out): es la salida SPI del módulo de tarjeta Micro SD.
  • MOSI (Salida maestra Entrada esclava): es la entrada SPI al módulo de tarjeta Micro SD.
  • SCK (reloj serie): pin acepta pulsos de reloj que sincronizan la transmisión de datos generada por Arduino.
  • CS (Selección de esclavo): es utilizado por Arduino (Master) para habilitar y deshabilitar dispositivos específicos en el bus SPI.

Preparación de la tarjeta micro SD

Antes de insertar la tarjeta micro SD en el módulo y conectarla al Arduino, debe formatear correctamente la tarjeta. Para la biblioteca Arduino que discutiremos, y casi todas las demás bibliotecas SD, la tarjeta debe estar formateada FAT16 o FAT32.

Si tiene una tarjeta SD nueva, es probable que ya esté formateada previamente con un sistema de archivos FAT. Sin embargo, es posible que tenga problemas con el formato de fábrica de la tarjeta o, si es una tarjeta antigua, debe reformatearse. De cualquier manera, siempre es una buena idea formatear la tarjeta antes de usarla, ¡incluso si es nueva!

Es recomendable utilizar la utilidad oficial de formateo de tarjetas SD : escrita por la asociación SD , ¡resuelve muchos problemas que surgen con un mal formateo! Descargue el formateador y ejecútelo en su ordenador, simplemente seleccione la unidad correcta y haga clic en FORMATEAR.

Captura de pantalla del formateador SD

Cableado: conexión del módulo de tarjeta Micro SD a Arduino

Ahora que su tarjeta está lista para usar, ¡podemos conectar la placa de conexión micro SD!

Para empezar, inserte el módulo de la tarjeta micro SD en una placa de pruebas. Conecte el pin VCC en el módulo a 5V en el pin Arduino y GND a tierra. Ahora nos quedamos con los pines que se usan para la comunicación SPI. Como las tarjetas micro SD requieren una gran cantidad de transferencia de datos, brindarán el mejor rendimiento cuando se conecten a los pines SPI del hardware en un microcontrolador. Los pines SPI del hardware son mucho más rápidos que «bit-banging» del código de la interfaz usando otro conjunto de pines.

Tenga en cuenta que cada placa Arduino tiene diferentes pines SPI que deben conectarse en consecuencia. Para placas ESP32 (En el ejemplo DOIT ESP32 DEVKIT1) esos pines son digitales 18 (SCK), 19 (MISO) y 23 (MOSI). También necesitará un cuarto pin para la línea ‘chip/slave select’ (SS). Por lo general, este es el pin 5, pero en realidad puede usar cualquier pin que desee (siempre que lo inicialize en el código).

Si tiene una placa Mega, ¡los pines son diferentes! Querrá usar digital 50 (MISO), 51 (MOSI), 52 (SCK) y 53 (SS). Consulte la siguiente tabla para una comprensión rápida.

MicroSD card moduleESP32
VCC+5v
CSGPIO 5
MOSIGPIO 23
CLKGPIO 18
MISOGPIO 19
GNDGND

En caso de que esté utilizando una placa Arduino diferente a la mencionada anteriormente, es recomendable consultar la documentación oficial de Arduino antes de continuar.

Para cablear el módulo de la tarjeta microSD a la placa ESP32, puede seguir el siguiente diagrama esquemático (para los pines SPI por defecto de ESP32):

esquema conexiones lector sd

Realmente dadas las poquísimas conexiones necesarias, el montaje se puede hacer directamente con un cable de cinta de 6 hilos como podemos ver en la imagen .

aspecto del montaje del lector de sd

Código Arduino: prueba del módulo de la tarjeta SD con CardInfo

Existen dos librerías diferentes para el ESP32 (incluidas en el núcleo de Arduino para el ESP32): la librería SD y la librería SDD_MMC.h.

Si utiliza la biblioteca SD, está utilizando el controlador SPI. Si usa la librería SDD_MMC estás usando el controlador SD/SDIO/MMC del ESP32.

Hay varios ejemplos en Arduino IDE que muestran cómo manejar archivos en la tarjeta microSD usando el ESP32. En el IDE de Arduino, vaya a Archivo > Ejemplos > SD(esp32) > SD_Test, o copie el siguiente código:


/*
    This sketch can be found at: Examples > SD(esp32) > SD_Test
*/

#include "FS.h"
#include "SD.h"
#include "SPI.h"

void listDir(fs::FS &fs, const char * dirname, uint8_t levels){
  Serial.printf("Listing directory: %s\n", dirname);

  File root = fs.open(dirname);
  if(!root){
    Serial.println("Failed to open directory");
    return;
  }
  if(!root.isDirectory()){
    Serial.println("Not a directory");
    return;
  }

  File file = root.openNextFile();
  while(file){
    if(file.isDirectory()){
      Serial.print("  DIR : ");
      Serial.println(file.name());
      if(levels){
        listDir(fs, file.name(), levels -1);
      }
    } else {
      Serial.print("  FILE: ");
      Serial.print(file.name());
      Serial.print("  SIZE: ");
      Serial.println(file.size());
    }
    file = root.openNextFile();
  }
}

void createDir(fs::FS &fs, const char * path){
  Serial.printf("Creating Dir: %s\n", path);
  if(fs.mkdir(path)){
    Serial.println("Dir created");
  } else {
    Serial.println("mkdir failed");
  }
}

void removeDir(fs::FS &fs, const char * path){
  Serial.printf("Removing Dir: %s\n", path);
  if(fs.rmdir(path)){
    Serial.println("Dir removed");
  } else {
    Serial.println("rmdir failed");
  }
}

void readFile(fs::FS &fs, const char * path){
  Serial.printf("Reading file: %s\n", path);

  File file = fs.open(path);
  if(!file){
    Serial.println("Failed to open file for reading");
    return;
  }

  Serial.print("Read from file: ");
  while(file.available()){
    Serial.write(file.read());
  }
  file.close();
}

void writeFile(fs::FS &fs, const char * path, const char * message){
  Serial.printf("Writing file: %s\n", path);

  File file = fs.open(path, FILE_WRITE);
  if(!file){
    Serial.println("Failed to open file for writing");
    return;
  }
  if(file.print(message)){
    Serial.println("File written");
  } else {
    Serial.println("Write failed");
  }
  file.close();
}

void appendFile(fs::FS &fs, const char * path, const char * message){
  Serial.printf("Appending to file: %s\n", path);

  File file = fs.open(path, FILE_APPEND);
  if(!file){
    Serial.println("Failed to open file for appending");
    return;
  }
  if(file.print(message)){
      Serial.println("Message appended");
  } else {
    Serial.println("Append failed");
  }
  file.close();
}

void renameFile(fs::FS &fs, const char * path1, const char * path2){
  Serial.printf("Renaming file %s to %s\n", path1, path2);
  if (fs.rename(path1, path2)) {
    Serial.println("File renamed");
  } else {
    Serial.println("Rename failed");
  }
}

void deleteFile(fs::FS &fs, const char * path){
  Serial.printf("Deleting file: %s\n", path);
  if(fs.remove(path)){
    Serial.println("File deleted");
  } else {
    Serial.println("Delete failed");
  }
}

void testFileIO(fs::FS &fs, const char * path){
  File file = fs.open(path);
  static uint8_t buf[512];
  size_t len = 0;
  uint32_t start = millis();
  uint32_t end = start;
  if(file){
    len = file.size();
    size_t flen = len;
    start = millis();
    while(len){
      size_t toRead = len;
      if(toRead > 512){
        toRead = 512;
      }
      file.read(buf, toRead);
      len -= toRead;
    }
    end = millis() - start;
    Serial.printf("%u bytes read for %u ms\n", flen, end);
    file.close();
  } else {
    Serial.println("Failed to open file for reading");
  }


  file = fs.open(path, FILE_WRITE);
  if(!file){
    Serial.println("Failed to open file for writing");
    return;
  }

  size_t i;
  start = millis();
  for(i=0; i<2048; i++){
    file.write(buf, 512);
  }
  end = millis() - start;
  Serial.printf("%u bytes written for %u ms\n", 2048 * 512, end);
  file.close();
}

void setup(){
  Serial.begin(115200);
  if(!SD.begin(5)){
    Serial.println("Card Mount Failed");
    return;
  }
  uint8_t cardType = SD.cardType();

  if(cardType == CARD_NONE){
    Serial.println("No SD card attached");
    return;
  }

  Serial.print("SD Card Type: ");
  if(cardType == CARD_MMC){
    Serial.println("MMC");
  } else if(cardType == CARD_SD){
    Serial.println("SDSC");
  } else if(cardType == CARD_SDHC){
    Serial.println("SDHC");
  } else {
    Serial.println("UNKNOWN");
  }

  uint64_t cardSize = SD.cardSize() / (1024 * 1024);
  Serial.printf("SD Card Size: %lluMB\n", cardSize);

  listDir(SD, "/", 0);
  createDir(SD, "/mydir");
  listDir(SD, "/", 0);
  removeDir(SD, "/mydir");
  listDir(SD, "/", 2);
  writeFile(SD, "/hello.txt", "Hello ");
  appendFile(SD, "/hello.txt", "World!\n");
  readFile(SD, "/hello.txt");
  deleteFile(SD, "/foo.txt");
  renameFile(SD, "/hello.txt", "/foo.txt");
  readFile(SD, "/foo.txt");
  testFileIO(SD, "/test.txt");
  Serial.printf("Total space: %lluMB\n", SD.totalBytes() / (1024 * 1024));
  Serial.printf("Used space: %lluMB\n", SD.usedBytes() / (1024 * 1024));
}

void loop(){

}

Este ejemplo muestra cómo realizar casi cualquier tarea que pueda necesitar con la tarjeta microSD:

  • Listar un directorio;
  • Crear un directorio;
  • Eliminar un directorio;
  • Leer el contenido de un archivo;
  • Escribir contenido en un archivo
  • Añadir contenido a un archivo;
  • Renombrar un fichero;
  • Eliminar un archivo;
  • Inicializar tarjeta microSD;
  • Obtener tipo de tarjeta microSD;
  • Obtener el tamaño de la tarjeta microSD;


Alternativamente, puede utilizar los ejemplos SD_MMC – son similares a los ejemplos SD, pero utilizan el controlador SDMMC. Para el controlador SDMMC, necesita un módulo de tarjeta microSD compatible. El módulo que utilizamos en este post no es compatible con SDMMC.

Todos los ejemplos que vamos a a ver por tanto proporciona varias funciones para manejar archivos en la tarjeta microSD.

Listar un directorio


La función listDir() lista los directorios de la tarjeta SD. Esta función acepta como argumentos el sistema de archivos (SD), el nombre del directorio principal y los niveles para entrar en el directorio.

void listDir(fs::FS &fs, const char * dirname, uint8_t levels){
  Serial.printf("Listing directory: %s\n", dirname);

  File root = fs.open(dirname);
  if(!root){
    Serial.println("Failed to open directory");
    return;
  }
  if(!root.isDirectory()){
    Serial.println("Not a directory");
    return;
  }

  File file = root.openNextFile();
  while(file){
    if(file.isDirectory()){
      Serial.print("  DIR : ");
      Serial.println(file.name());
      if(levels){
        listDir(fs, file.name(), levels -1);
      }
    } else {
      Serial.print("  FILE: ");
      Serial.print(file.name());
      Serial.print("  SIZE: ");
      Serial.println(file.size());
    }
     file = root.openNextFile();
  }
}

He aquí un ejemplo de cómo llamar a esta función .

listDir(SD, "/", 0);

Obsérvese que es muy importante la barra invertida antes del directorio pues eso indica que el directorio esta en el directorio raiz .

Crear un directorio
La función createDir() crea un nuevo directorio. Pasa como argumento el sistema de ficheros SD y la ruta del nombre del directorio.

void createDir(fs::FS &fs, const char * path){
  Serial.printf("Creating Dir: %s\n", path);
  if(fs.mkdir(path)){
    Serial.println("Dir created");
  } else {
    Serial.println("mkdir failed");
  }
}

Por ejemplo, el siguiente comando crea un nuevo directorio en la raíz llamado mydir

createDir(SD, "/mydir");

Obsérvese que es muy importante la barra invertida antes del directorio pues eso indica que el directorio esta en el directorio raiz (y se llama mydir).

Eliminar un directorio
Para eliminar un directorio de la tarjeta microSD, utilice la función removeDir() y pase como argumento el sistema de archivos de la SD y la ruta del nombre del directorio.

void removeDir(fs::FS &fs, const char * path){
  Serial.printf("Removing Dir: %s\n", path);
  if(fs.rmdir(path)){
    Serial.println("Dir removed");
  } else {
    Serial.println("rmdir failed");
  }
}

He aquí un ejemplo:

removeDir(SD, "/mydir");

Obsérvese que es muy importante la barra invertida antes del directorio pues eso indica que el directorio esta en el directorio raiz (y se llama mydir).

Leer el contenido de un archivo
La función readFile() lee el contenido de un archivo e imprime el contenido en el Monitor Serial. Como en las funciones anteriores, pase como argumento el sistema de ficheros SD y la ruta del fichero.

void readFile(fs::FS &fs, const char * path){
  Serial.printf("Reading file: %s\n", path);

  File file = fs.open(path);
  if(!file){
    Serial.println("Failed to open file for reading");
    return;
  }

  Serial.print("Read from file: ");
  while(file.available()){
    Serial.write(file.read());
  }
  file.close();
}

Por ejemplo, la siguiente línea lee el contenido del archivo hello.txt.

readFile(SD, "/hello.txt")

Obsérvese que es muy importante la barra invertidas antes del fichero pues eso indica que el fichero esta en el directorio raiz (y se llama hello.txt).

Escribir contenido en un archivo
Para escribir contenido en un fichero, puede utilizar la función writeFile(). Pase como argumento el sistema de ficheros SD, la ruta del fichero y el mensaje.

void writeFile(fs::FS &fs, const char * path, const char * message){
  Serial.printf("Writing file: %s\n", path);

  File file = fs.open(path, FILE_WRITE);
  if(!file){
    Serial.println("Failed to open file for writing");
    return;
  }
  if(file.print(message)){
    Serial.println("File written");
  } else {
    Serial.println("Write failed");
  }
  file.close();
}

La siguiente línea escribe Hola en el archivo hola.txt.

writeFile(SD, "/hello.txt", "Hello ");

Obsérvese que es muy importante la barra invertidas antes del fichero pues eso indica que el fichero esta en el directorio raiz (y se llama hello.txt).

Añadir contenido a un archivo
Del mismo modo, puede añadir contenido a un archivo (sin sobrescribir el contenido anterior) utilizando la función appendFile().

void appendFile(fs::FS &fs, const char * path, const char * message){
  Serial.printf("Appending to file: %s\n", path);

  File file = fs.open(path, FILE_APPEND);
  if(!file){
    Serial.println("Failed to open file for appending");
    return;
  }
  if(file.print(message)){
    Serial.println("Message appended");
  } else {
    Serial.println("Append failed");
  }
  file.close();
}

La siguiente línea añade el mensaje ¡Mundo!\n en el archivo hola.txt. El \n significa que la próxima vez que escriba algo en el archivo, se escribirá en una nueva línea.

appendFile(SD, "/hello.txt", "World!\n");

Cambiar el nombre de un archivo
Puede renombrar un fichero utilizando la función renameFile(). Pasa como argumentos el sistema de ficheros SD, el nombre original del fichero y el nuevo nombre.

void renameFile(fs::FS &fs, const char * path1, const char * path2){
  Serial.printf("Renaming file %s to %s\n", path1, path2);
  if (fs.rename(path1, path2)) {
    Serial.println("File renamed");
  } else {
    Serial.println("Rename failed");
  }
}

La siguiente línea cambia el nombre del archivo hello.txt a foo.txt.

renameFile(SD, "/hello.txt", "/foo.txt");

Borrar un fichero
Utilice la función deleteFile() para borrar un fichero. Pase como argumento el sistema de ficheros SD y la ruta del fichero que desea borrar.

void deleteFile(fs::FS &fs, const char * path){
  Serial.printf("Deleting file: %s\n", path);
  if(fs.remove(path)){
    Serial.println("File deleted");
  } else {
    Serial.println("Delete failed");
  }
}

La siguiente línea borra el archivo foo.txt de la tarjeta microSD.

deleteFile(SD, "/foo.txt");

Probar un archivo
Por último la función testFileIO() muestra el tiempo que se tarda en leer el contenido de un fichero.

void testFileIO(fs::FS &fs, const char * path){
  File file = fs.open(path);
  static uint8_t buf[512];
  size_t len = 0;
  uint32_t start = millis();
  uint32_t end = start;
  if(file){
    len = file.size();
    size_t flen = len;
    start = millis();
    while(len){
      size_t toRead = len;
      if(toRead > 512){
        toRead = 512;
      }
      file.read(buf, toRead);
      len -= toRead;
    }
    end = millis() - start;
    Serial.printf("%u bytes read for %u ms\n", flen, end);
    file.close();
  } 
  else {
    Serial.println("Failed to open file for reading");
  }

  file = fs.open(path, FILE_WRITE);
  if(!file){
    Serial.println("Failed to open file for writing");
    return;
  }

  size_t i;
  start = millis();
  for(i=0; i<2048; i++){
    file.write(buf, 512);
  }
  end = millis() - start;
  Serial.printf("%u bytes written for %u ms\n", 2048 * 512, end);
  file.close();
}

La siguiente función comprueba el archivo test.txt.

testFileIO(SD, "/test.txt");

Inicializar la tarjeta microSD
En setup(), las siguientes líneas inicializan la tarjeta microSD con SD.begin().

Serial.begin(115200);
if(!SD.begin()){
  Serial.println("Card Mount Failed");
  return;
}
uint8_t cardType = SD.cardType();

if(cardType == CARD_NONE){
  Serial.println("No SD card attached");
  return;
}

Si no pasa ningún argumento a la función begin(), intentará inicializar la comunicación SPI con la tarjeta microSD en el pin por defecto de selección de chip (CS). Si desea utilizar otro pin CS, puede pasarlo como argumento a la función begin(). Por ejemplo, si quiere usar GPIO 17 como pin CS, debería usar las siguientes líneas de código:

Serial.begin(115200);
if(!SD.begin(17)){
  Serial.println("Card Mount Failed");
  return;
}
uint8_t cardType = SD.cardType();

Obtener el tipo de tarjeta microSD
Las siguientes líneas imprimen el tipo de tarjeta microSD en el Monitor Serial.

Serial.print("SD Card Type: ");
if(cardType == CARD_MMC){
  Serial.println("MMC");
} else if(cardType == CARD_SD){
  Serial.println("SDSC");
} else if(cardType == CARD_SDHC){
  Serial.println("SDHC");
} else {
  Serial.println("UNKNOWN");
}

Obtener el tamaño de la tarjeta microSD
Puedes obtener el tamaño de la tarjeta microSD llamando al método cardSize():

uint64_t cardSize = SD.cardSize() / (1024 * 1024);
Serial.printf("SD Card Size: %lluMB\n", cardSize);

Para probar las funciones de la tarjeta MicroSD,las siguientes líneas llaman a las funciones que hemos visto anteriormente:

listDir(SD, "/", 0);
createDir(SD, "/mydir");
listDir(SD, "/", 0);
removeDir(SD, "/mydir");
listDir(SD, "/", 2);
writeFile(SD, "/hello.txt", "Hello ");
appendFile(SD, "/hello.txt", "World!\n");
readFile(SD, "/hello.txt");
deleteFile(SD, "/foo.txt");
renameFile(SD, "/hello.txt", "/foo.txt");
readFile(SD, "/foo.txt");
testFileIO(SD, "/test.txt");
Serial.printf("Total space: %lluMB\n", SD.totalBytes() / (1024 * 1024));
Serial.printf("Used space: %lluMB\n", SD.usedBytes() / (1024 * 1024));


Suba el sketch anterior a tu placa ESP32. Después de eso, abra el Monitor Serie y pulse el botón RST de la placa ESP32. Si la inicialización tiene éxito, obtendrá mensajes similares a los siguientes en el Monitor Serie.

Funciones utilizadas con el objeto Archivo

Además, hay algunas funciones que puede usar con objetos de archivo :

  • Puede  usar seek()en un archivo. Esto moverá el cursor de lectura/escritura a una nueva ubicación. Por ejemplo seek(0) , lo llevará al principio del archivo, ¡lo cual puede ser muy útil!
  • Así mismo puedes llamar al position()que te indicará en qué parte del expediente te encuentras.
  • Si desea saber el tamaño de un archivo, llame size() para obtener la cantidad de bytes en el archivo.
  • Los directorios/carpetas son archivos especiales, puede determinar si un archivo es un directorio llamando isDirectory()
  • Una vez que tenga un directorio, puede comenzar a revisar todos los archivos en el directorio llamando openNextFile()
  • Puede terminar necesitando saber el nombre de un archivo, por ejemplo, si llamó openNextFile()a un directorio. En este caso, llame al name()que devolverá un puntero a la matriz de caracteres con formato 8.3 que puede hacer directamente Serial.print() si lo desea.
Por cierto , aunque pueda parecer extraño, es más económico comprar varios módulos que un único ( por unos 2€ en Amazon )

Sistema de automatización del hogar Tasmota usando ESP8266


En este proyecto, vamos a construir un sistema de automatización del hogar mediante el usop Tasmota con funciones controladas por Alexa. 

Tasmota es un firmware de código abierto que se utiliza para controlar dispositivos IoT (Internet de las cosas), como interruptores inteligentes, sensores, luces y otros dispositivos conectados. Permite a los usuarios controlar estos dispositivos a través de una conexión Wi-Fi y ofrece una interfaz web para configurar y personalizar su funcionamiento.

Tasmota también es compatible con muchos servicios y protocolos de terceros, como Amazon Alexa y Google Assistant, y permite la integración con sistemas de automatización del hogar como Home Assistant y Node-RED. Esto permite a los usuarios controlar y automatizar sus dispositivos de manera más eficiente y flexible.

En este ejemplo usaremos el módulo ESP8266 NodeMCU ya que es más económico que ESP32. Con la ayuda de este proyecto, podemos operar 4 electrodomésticos a través del tablero Tasmota, el dispositivo Alexa y también los interruptores físicos. También podemos operar este sistema controlando los relés desde la app de Alexa desde cualquier parte del mundo. El problema de Internet es común en las zonas rurales. Entonces, si no hay Internet, puede operar esos electrodomésticos con interruptores manuales.

Solo necesitamos seguir todos los pasos cuidadosamente. Después de esto, puede crear fácilmente un sistema de automatización del hogar inteligente Alexa usando Tasmota y Alexa para controlar los electrodomésticos usando solo sus comandos de voz.

foto del prototipo

El circuito

El circuito es bastante simple pues usa un modulo de relés conectados a los GPIO junto a 4 pulsadores normalmente abiertos para activar estos relés de forma manual.

Los relés 1, 2, 3, 4 están conectados a los pines D1, D2, D5 y D6 respectivamente y los interruptores están conectados a los pines SD3, D3, D7 y RX respectivamente.

El corazón del circuito (o mejor el «cerebro») es un económico ES8266 , porque como hemos comentado para esta aplicación donde únicamente hay señales de E/S binarias no necesitamos usar nada mas potente.

Este es el esquema de del circuito, donde como vemos no hay nada complejo.

esquema electrico

Estos son los componentes involucrados:

  • Tablero NodeMCU ESP8266
  • Optoacoplador PC817C (x4)
  • Módulo de relé de 5 voltios (x4)
  • Resistencia 1K (x4)
  • 1N4007 Diodo (x4)
  • LED (x4)
  • Pulsadores (x4)
  • Fuente de alimentación de 5 voltios
  • Veroboard

Instalando Tasmota

Tasmota es un firmware personalizado de código abierto que se puede ejecutar en placas de desarrollo ESP8266 y ESP32. Podemos conectar dispositivos como control local a través de MQTT, HTTP, etc. Al principio, Tasmota está hecho para dispositivos inteligentes Sonoff, pero en la actualidad se ha modificado para proyectos de código libre. Ahora es un software muy efectivo y fácil para controlar los chips ESP. Podemos controlar muchos sensores con solo usarlos. La principal ventaja de Tasmota es que puede agregar o eliminar dispositivos en cualquier momento que no aparezcan en la lista de dispositivos integrados.

Hay dos formas de flashear Tasmota. El primer proceso es OTA (Over the Air) y el segundo es FTDI o Arduino IDE. En este proyecto, usamos Arduino IDE para flashear Tasmota en la placa de desarrollo ESP8266.

Ahora comenzamos con la conexión de todos los componentes utilizados en este proyecto. Puede conectar ESP8266-01 con Arduino Uno como se muestra en el diagrama.

Ahora conecte VCC y GND de ESP-01 a 3.3V y GND de Arduino. Luego conecte CH_PD a 3.3V. Conecte el pin GPIO_0 al GND de Arduino.

Ahora conecte RX y TX del ESP-01 al RX y TX del Arduino UNO. Después de conectar ESP8266-01, conecte el pin de reinicio de Arduino a GND para omitirlo. Esta técnica deshabilitó Arduino y el firmware se cargó directamente en la placa ESP8266. Cuando el LED azul se ilumina, puede quitar el pin RST del pin GND.

¿Cómo descargar e instalar el firmware de Tasmota?

Ahora la pregunta es cómo descargar el firmware de Tasmota. Puede hacer clic en este enlace: http://ota.tasmota.com/tasmota/release/. En este enlace, puede ver una lista de archivos de firmware. Todos los archivos tienen diferentes controladores integrados para diferentes sensores. Puedes usar ‘tasmota.bin’. Este archivo tiene todas las características del hardware compatible. Después de visitar el enlace, solo necesita desplazarse hacia abajo y hacer clic en la primera opción y luego hacer clic en Tasmotizer-1.2.exe.

descargar tasmotizador

tasmotizador

El Tasmotizer es una herramienta para flashear Tasmota. Tienes que descargar la “última versión de Tasmota” en tu plataforma. Ahora simplemente haga doble clic en él y se iniciará.

Proceso para Flashear Tasmota

Ahora estamos en la parte final para flashear Tasmota. Seleccione el puerto donde está conectado Arduino UNO. Explore el binario de firmware de Tasmota que descargó. Luego haz clic en Tasmotizar. Después de un par de veces, se hará.

¿Cómo configurar Wi-Fi?

Después de flashear Tasmota, tenemos que configurar WiFi para controlar los dispositivos mediante la aplicación Amazon Alexa. Después de parpadear, puede ver un botón ‘enviar configuración’. Haz click en eso. Ahora ingrese su nombre y contraseña de WiFi y guárdelo y ahora haga clic en Aceptar. Guardar el proceso puede llevar algún tiempo.

Después de 5 a 10 segundos más tarde, puede continuar con el siguiente paso. Ahora haga clic en ‘obtener IP‘. Aquí puede ver la dirección IP del WiFi. Cópialo y pégalo en Google o en cualquier navegador. Allí puede ver el tablero donde puede editar su proyecto.

Tasmota Sistema de domótica Tasmotizer
Haga clic en Tasmotize
Configuración de envío de Tasmotizer
Haga clic en Enviar configuración
Tasmotizer wifi nombre y contraseña
Escriba el nombre y el pase de WiFi.
Tasmotizer envía notificación de configuración
Notificación de configuración enviada.
Dirección IP de Tasmotizer
Dirección IP mostrada

Configurar relés e interruptores para el sistema de automatización del hogar Tasmota

Ahora haga clic en ‘Configuración‘ y luego haga clic en ‘Configurar módulo’. Ahora seleccione el ‘Genérico (0)’ y guárdelo. Luego regrese al menú principal y haga clic en ‘Configuración’. Aquí puede ver que está seleccionado ‘Genérico (0)’. Tiene que configurar todos los pines GPIO conectados a los relés.

Configuración del sistema de automatización del hogar Tasmota

Los relés 1, 2, 3, 4 están conectados a los pines D1, D2, D5 y D6 respectivamente y los interruptores están conectados a los pines SD3, D3, D7 y RX respectivamente. Luego abra el navegador y seleccione el relé 1 en el GPIO5 para el relé 1. Luego haga lo mismo para GPIO4 y seleccione el relé 2. El mismo proceso es para los relés 3 y 4 respectivamente.

Ahora es el momento de conectar los interruptores. Al principio, podemos ver que el pin SD3 o GPIO10 está conectado al interruptor 1. Ahora, como le muestro en la técnica de selección anterior, seleccione el interruptor para el GPIO10 si usa interruptores manuales o seleccione botones si usa botones pulsadores. Mediante este proceso, seleccione los cuatro interruptores respectivamente.

Ahora guárdalo y vuelve al menú principal. En el tablero, puede ver cuatro botones. Con estos botones, puede controlar estos cuatro relés.

Configurar Amazon Alexa para el sistema de automatización del hogar Tasmota

Para configurar la aplicación Alexa, debe volver al menú principal. Seleccione ‘Configuración‘ y luego ‘Configurar otros‘. Ahora nombre este proyecto y nombre los cuatro canales. Por estos nombres, Alexa identificará este dispositivo. Por último, seleccione ‘Hue bridge multi device‘ y guárdelo.

Paso para configurar la aplicación móvil Amazon Alexa

  • En la aplicación Alexa, inicie sesión con el correo electrónico y la contraseña.
  • Luego ciérralo.
  • Haga clic en Descubrir dispositivos. El nombre de su dispositivo es visible allí en unos segundos.
  • Luego haga clic en su dispositivo. A continuación, seleccione todos los interruptores.
  • Si ESP8266 está conectado con su WiFi, puede controlar todos los dispositivos desde la aplicación Alexa.
  • Ahora solo tienes que decir «Alexa, enciende la luz». La luz esta encendida. Con este comando de voz, puede controlar los electrodomésticos usando su voz.
Configuración de la aplicación alexa del sistema de automatización del hogar Tasmota

El principio de funcionamiento es muy fácil para este proyecto. Solo necesita decir «Alexa enciende el interruptor 1» y el interruptor se enciende. Mediante este proceso, puede controlar cuatro interruptores. También puede controlarlo con la aplicación Alexa.

Cuando no tiene conexiones WiFi, este proyecto puede controlarse manualmente mediante interruptores. Cuando el WiFi esté conectado, la aplicación Alexa mostrará la notificación de tus electrodomésticos.

Como gestionar un LCD con Arduino


Tradicionalmente para visualizar información con microcontroladores se han usado leds, displays de leds de 7segmentos, «tubos nixie!,LCD , pantallas OLED, etc

Hay varias ventajas para usar pantallas LCD frente a otros medios:

  1. Fácil visualización de datos: La pantalla LCD permite una fácil visualización de los datos generados o recibidos por el Arduino, lo que simplifica la tarea de monitoreo y análisis.
  2. Interfaz de usuario: Las pantallas LCD pueden ser utilizadas para crear interfaces de usuario amigables para proyectos con Arduino, lo que hace más fácil para los usuarios interactuar con el sistema.
  3. Versatilidad: Las pantallas LCD pueden ser utilizadas en una amplia variedad de proyectos, desde monitoreo de sensores hasta juegos y aplicaciones de tiempo real.
  4. Ahorro de espacio: Las pantallas LCD son más compactas y requieren menos espacio que otras opciones de visualización, lo que las hace ideales para proyectos con restricciones de espacio.
  5. Fácil conexión: La conexión de una pantalla LCD con una placa Arduino es generalmente sencilla y requiere pocos componentes adicionales.
  6. Bajo consumo de energía: Las pantallas LCD utilizan poca energía y son adecuadas para proyectos con restricciones de energía o con requisitos de larga duración.

El principio detrás de las pantallas LCD para Arduino es el uso de la tecnología de cristal líquido para desplegar información en una pantalla. Una pantalla LCD para Arduino funciona mediante la aplicación de una tensión a los cristales líquidos en la pantalla, lo que los hace inclinarse y permitir o bloquear la luz detrás de ellos. De esta manera, se pueden crear diferentes patrones de luz y oscuridad en la pantalla para formar caracteres o gráficos.

Una placa Arduino (o cualquier variante) controla la tensión aplicada a los cristales líquidos a través de un controlador LCD específico, que envía señales a los pines de la pantalla LCD. El controlador recibe y procesa los datos enviados por el Arduino y los convierte en una señal que controla la tensión aplicada a los cristales líquidos. De esta manera, se puede desplegar información en tiempo real en la pantalla LCD.

Una pantalla LCD con una placa Arduino puede ser utilizada para desplegar información o datos en tiempo real que sean generados o recibidos por el Arduino. Esto permite una visualización más clara y accesible de los datos y puede ser utilizado en una amplia variedad de proyectos, como monitoreo de sensores, interfaces de usuario, juegos, entre otros.

La placa GeekPi ( LCD1602)

Para que sirva de ejemplo, vamos a estudiar la placa GeekPi que puede comprarse en Amazon por unos 5€/unidad aqui. Esta placa utiliza el protocolo I2C para reducir la ocupación de los puertos de E / S , lo que facilita la adición al proyecto y menos cableado lo cual es fantástico ya que tradicionalmente se usaban en función del bus de 4 o 8 bits al menos 7 pines de E/S. Esta placa es comúnmente utilizado en IoT, proyectos de bricolaje, animación doméstica, construcción inteligente, proyecto de bricolaje del fabricante, etc.

Asimismo esta placa es compatible con todas las placas de desarrollo actuales, como Arduino (y todas sus variantes incluyendo ESP32, ESP8266, ECT ) , Raspberry pi, Tinkerboard, Nano pi, Banana pi, stm32, etc.

Respecto a ajustes, tan solo necesita un potenciómetro que hay detrás del lcd donde podemos ajustar la retroiluminación (color: azul) y el contraste.

La alimentación: 5v y la dirección I2C es: 0x27 y sus dimensiones son : 80 mm x 35 mm x 11 mm

En caso de conectar este lcd a una placa Arduino (o similares como ESP32, ESP8266, etc. ), las conexiones son las siguientes

Para otras placas como la Raspberry, como vemos en la imagen la conexión es similar:

Como vemos el LCD1602 usa I²C utilizando sólo dos líneas bidireccionales open-drain, Serial Data Line (SDA) y Serial Clock Line (SCL),con resistencias. Los voltajes típicos utilizados son +5 V o +3,3 V, aunque se permiten sistemas con otros voltajes. Puede funcionar siempre que sea compatible con la placa de desarrollo I2C como ya se ha comentado (las comunes Arduino, Raspberry pi, Stm32, etc.).

Este es un resumen de sus características:

  • Ocupa menos puertos de E/S.
  • Soporta el protocolo IIC.
  • La biblioteca I2C LCD1602 es fácil de conseguir
  • Con un potenciómetro para ajustar la retroiluminación y el contraste
  • Retroiluminación azul
  • uente de alimentación 5v
  • La dirección I2C es: la nueva versión es 0x3F, la versión antigua es 0x27

Cómo conectarlo a Arduino


Conecte el módulo LCD1602 a la placa Arduino Uno como se muestra en la siguiente imagen:
I2C LCD1602 placa Arduino Uno
GND GND
VCC 5V
SDA A4 /pin 20 mega2560
SCL A5 /pin 21 mega2560

Cómo programarlo en Arduino


1.Descarga la librería LiquidCrystal_I2C
2.Abre el IDE de Arduino,Selecciona Sketch -> Include Library -> Add ZIP Library
3.Encuentra el archivo LiquidCrystal_I2C que acabas de descargar.
4.Haga clic en abrir y, a continuación, se le pedirá por «Biblioteca añadido a sus bibliotecas.
5.Marque ‘Importar bibliotecas'».
6.Abra el archivo ->Sketch->Include Library->LiquidCrystal_I2C.
7.Copia el siguiente código en el IDE de Arduino, haz click en el icono upload para subir el código a la placa de control:

#include <Wire.h>
#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x27, 16, 2); // set the LCD address to 0x27, if new version please use 0x3F instead.

void setup()
{
  lcd.init();  //initialize the lcd
  lcd.backlight();  //open the backlight
}

void loop()
{
  lcd.setCursor(3, 0); // set the cursor to column 3, line 0
  lcd.print("Hello GeeekPi");  // Print a message to the LCD
  
  lcd.setCursor(2, 1); // set the cursor to column 2, line 1
  lcd.print("hello world");  // Print a message to the LCD.
}

POSICIONAR EL TEXTO
La función mylcd.lcd_display_string() imprime texto en la pantalla y también permite elegir dónde posicionarlo.
La función se usa como mylcd.lcd_display_string(«TEXTO A IMPRIMIR», FILA, COLUMNA).
El siguiente código imprime «¡Hola Mundo!» en la fila 2, columna 3:
En un LCD de 16×2, las filas están numeradas del 1 al 2, mientras que las columnas están numeradas del 0 al 15. Por lo tanto, para imprimir «¡Hola Mundo!
Así que para imprimir «¡Hola Mundo!» en la primera columna de la fila superior, usted usaría

mylcd.lcd_display_string(“Hello World!”, 1, 0)

BORRAR LA PANTALLA
La función mylcd.lcd_clear() borra la pantalla

import I2C_LCD_driver
from time import *
mylcd = I2C_LCD_driver.lcd()
mylcd.lcd_display_string("This is how you", 1)
sleep(1)
mylcd.lcd_clear()
mylcd.lcd_display_string("clear the screen", 1)
sleep(1)
mylcd.lcd_clear()

TEXTO PARPADEANTE
Podemos utilizar un simple bucle while con las funciones mylcd.lcd_display_string() y mylcd.lcd_clear() para crear un efecto de texto parpadeante continuo:

import time
import I2C_LCD_driver
mylcd = I2C_LCD_driver.lcd()

while True:
    mylcd.lcd_display_string(u"Hello world!")
    time.sleep(1)
    mylcd.lcd_clear()
    time.sleep(1)


Puede usar la función time.sleep() en la línea 7 para cambiar el tiempo (en segundos) que el texto permanece encendido.
El tiempo que el texto permanece apagado se puede cambiar en la función time.sleep() en la línea 9.
Para finalizar el programa, pulse Ctrl-C.

IMPRIMIR LA FECHA Y LA HORA
El siguiente programa imprime la fecha y hora actual en la pantalla LCD:

import I2C_LCD_driver
import time
mylcd = I2C_LCD_driver.lcd()


while True:
    mylcd.lcd_display_string("Time: %s" %time.strftime("%H:%M:%S"), 1)
    
    mylcd.lcd_display_string("Date: %s" %time.strftime("%m/%d/%Y"), 2)

IMPRIME TU DIRECCIÓN IP
Este código imprime la dirección IP de tu conexión ethernet (eth0).
Para imprimir la IP de tu conexión WiFi, cambia eth0 por wlan0 en la línea 18:

import I2C_LCD_driver
import socket
import fcntl
import struct

mylcd = I2C_LCD_driver.lcd()

def get_ip_address(ifname):
    s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    return socket.inet_ntoa(fcntl.ioctl(
        s.fileno(),
        0x8915, 
        struct.pack('256s', ifname[:15])
    )[20:24])

mylcd.lcd_display_string("IP Address:", 1) 

mylcd.lcd_display_string(get_ip_address('eth0'), 2)

DESPLAZAR TEXTO DE DERECHA A IZQUIERDA CONTINUAMENTE
Este programa desplazará una cadena de texto desde el lado derecho de la pantalla LCD hacia el lado izquierdo y hará un bucle continuo:

import I2C_LCD_driver
from time import *

mylcd = I2C_LCD_driver.lcd()

str_pad = " " * 16
my_long_string = "This is a string that needs to scroll"
my_long_string = str_pad + my_long_string

while True:
    for i in range (0, len(my_long_string)):
        lcd_text = my_long_string[i:(i+16)]
        mylcd.lcd_display_string(lcd_text,1)
        sleep(0.4)
        mylcd.lcd_display_string(str_pad,1)

DESPLAZAR TEXTO DE DERECHA A IZQUIERDA UNA VEZ


El siguiente código desliza texto en la pantalla de derecha a izquierda una vez, luego se detiene y deja una pantalla limpia.

import I2C_LCD_driver
from time import *

mylcd = I2C_LCD_driver.lcd()

str_pad = " " * 16
my_long_string = "This is a string that needs to scroll"
my_long_string = str_pad + my_long_string

for i in range (0, len(my_long_string)):
    lcd_text = my_long_string[i:(i+16)]
    mylcd.lcd_display_string(lcd_text,1)
    sleep(0.4)
    mylcd.lcd_display_string(str_pad,1)

DESPLAZAR TEXTO DE IZQUIERDA A DERECHA UNA VEZ
Este programa desliza texto en la pantalla de izquierda a derecha una vez, luego se detiene y deja los primeros 16 caracteres de la cadena de texto en la pantalla.

import I2C_LCD_driver
from time import *

mylcd = I2C_LCD_driver.lcd()

padding = " " * 16
my_long_string = "This is a string that needs to scroll"
padded_string = my_long_string + padding

for i in range (0, len(my_long_string)):
   lcd_text = padded_string[((len(my_long_string)-1)-i):-i]
   mylcd.lcd_display_string(lcd_text,1)
   sleep(0.4)
   mylcd.lcd_display_string(padding[(15+i):i], 1)

CARACTERES PERSONALIZADOS
Puede crear cualquier patrón que desee e imprimirlo en la pantalla como un carácter personalizado.
Cada carácter es una matriz de 5 x 8 píxeles.
Hasta 8 caracteres personalizados pueden ser definidos y almacenados en la memoria del LCD.
Este generador de caracteres personalizados le ayudará a crear la matriz de bits necesaria para definir los caracteres en la memoria de la LCD.
enlace: [ https://omerk.github.io/lcdchargen/ |generador de caracteres personalizados ]


IMPRIMIENDO UN CARACTER PERSONALIZADO
El siguiente código genera un caracter «<«:

import I2C_LCD_driver
from time import *

mylcd = I2C_LCD_driver.lcd()

fontdata1 = [      
        [ 0b00010, 
          0b00100, 
          0b01000, 
          0b10000, 
          0b01000, 
          0b00100, 
          0b00010, 
          0b00000 ],
]

mylcd.lcd_load_custom_chars(fontdata1)
mylcd.lcd_write(0x80)
mylcd.lcd_write_char(0)

IMPRIMIR VARIOS CARACTERES PERSONALIZADOS
Este programa imprime una flecha grande hacia la derecha (→) en la pantalla:

import I2C_LCD_driver
from time import *

mylcd = I2C_LCD_driver.lcd()

fontdata1 = [
        # char(0) - Upper-left character
        [ 0b00000, 
          0b00000, 
          0b00000, 
          0b00000, 
          0b00000, 
          0b00000, 
          0b11111, 
          0b11111 ],

        # char(1) - Upper-middle character
        [ 0b00000, 
          0b00000, 
          0b00100, 
          0b00110, 
          0b00111, 
          0b00111, 
          0b11111, 
          0b11111 ],
        
        # char(2) - Upper-right character
        [ 0b00000, 
          0b00000, 
          0b00000, 
          0b00000, 
          0b00000, 
          0b00000, 
          0b10000, 
          0b11000 ],
        
        # char(3) - Lower-left character
        [ 0b11111, 
          0b11111, 
          0b00000, 
          0b00000, 
          0b00000, 
          0b00000, 
          0b00000, 
          0b00000 ],
       
        # char(4) - Lower-middle character
        [ 0b11111, 
          0b11111, 
          0b00111, 
          0b00111, 
          0b00110, 
          0b00100, 
          0b00000, 
          0b00000 ],
        
        # char(5) - Lower-right character
        [ 0b11000, 
          0b10000, 
          0b00000, 
          0b00000, 
          0b00000, 
          0b00000, 
          0b00000, 
          0b00000 ],
]

mylcd.lcd_load_custom_chars(fontdata1)

mylcd.lcd_write(0x80)
mylcd.lcd_write_char(0)
mylcd.lcd_write_char(1)
mylcd.lcd_write_char(2)

mylcd.lcd_write(0xC0)
mylcd.lcd_write_char(3)
mylcd.lcd_write_char(4)
mylcd.lcd_write_char(5)

Fuente https://wiki.52pi.com/index.php?title=Z-0234

Solucionar problema diskpart Clean Error del servicio de disco virtual


Usando Windows 11 (o versiones anteriores), en ocasiones puede que conectemos una unidad de memoria USB y su contenido no aparezca en el explorador de archivos. A veces, el dispositivo aparece en la Administración de discos con una casilla vacía, pero no aparece en el Explorador de archivos. Además, el «dispositivo» es diverso porque puede obtener «No hay medios en el dispositivo» en HP USB Flash, tarjeta SanDisk SD, Transcend StoreJet, DVD/CD, Pen Drive, Tarjeta de Memoria, incluso SSD/HDD bajo diferentes situaciones. En estos casos, aunque la memoria perfectamente puede estar dañada ( y esto debemos entender que pueda suceder), podemos hacer uso del administrador de discos o lo mas normal el comando diskpart para intentar solucionar el problema.

Dependiendo del estado del pendrive es posible que nos encontremos con algún error durante el proceso de intentar restaurar una unidad usb dañada utilizando el comando diskpart (ejecutados en la herramienta Símbolo como Administrador) y tras ejecutar todos estos comandos en el orden que aquí vemos mas abajo, formateará por completo nuestra memoria USB o lo que es lo mismo, lo mas normal es que solucionemos el problema (consejo: No escriba ningún dato nuevo en el dispositivo que tiene el problema de «no media» hasta que lo resuelva).

 -DISKPART> list disk //(Discos encontrados en el PC)
- DISKPART> select disk Nº del disco //(Seleccionar el disco/Pendrive deseado. Ejemplo: select disk 2)
- DISKPART> attributes disk clear readonly// (Para borrar el atributo de sólo lectura para el disco seleccionado)
- DISKPART> clean //(Borrar todo el disco)
- DISKPART> convert mbr o gpt// (Convierte al tipo de particiones mbr o gpt)
- DISKPART> create partition primary //(crear una partición primaria)
- DISKPART> select part Nº de partición //(Seleccionar la partición deseada. En caso de querer seleccionar la partición primaria: select part 1)
- DISKPART> active //(Para activar la partición seleccionada)
- DISKPART> format fs=Fat32 o Format fs=NTFS //(Formatear la USB en formato Fat32 o NTFS)
- DISKPART> assign letter Letra //(asignación de una letra en la memoria USB. Ejemplo: assign letter H)
- DISKPART> list volume //(ver como ha quedado la memoria USB tras el formateado: Volúmenes, letras, formato, etc.)

No obstante, en ocasiones, la ejecución de estos comandos no puede llevarse a cabo, debido a diversos errores que se pueden producir durante la ejecución de alguno de estos comandos citados anteriormente, lo cual hará que nos quedemos atascados en uno de los pasos a llevar a cabo, impidiéndonos continuar con el siguiente comando y por lo tanto terminar el proceso.

Ahora intentaremos recoger todos esos problemas comunes que nos puede dar el usb de la utilidad Diskpart, describiendo los errores mas habituales, junto a su posible solución.

Empecemos comentando segun la gravedad de mayor a menor los errores mas habituales:

ERROR 1:»Error del servicio de disco virtual»

Dentro de los fallos de error del servicio de disco virtual podemos encontrar unas cuantas variantes:

  • «Error del Servicio de disco virtual: No hay medios en el dispositivo«. Este fallo significa que el sistema no es capaz de comunicarse con la memoria USB. Para el PC es una unidad vacía. Como consecuencia, no puede acceder a los datos almacenados en la unidad (este es el error más grave y por ello lo trataremos al final de este post dado que muchas veces es achacable a un problema fisico).
  • «Error del Servicio de disco virtual: Se agotó el tiempo de espera para la operación«. Este mensaje lo que nos dice es que se ha intentado contactar con la unidad, pero ésta no responde.
  • «Error diskpart ha encontrado un error: no se puede realizar la solicitud por un error del dispositivo de E/S«. Al igual que en los casos anteriores, estamos ante un error de comunicación entre la memoria USB y el ordenador.
  • «DiskPart ha encontrado un error: El dispositivo no está listo«. Una vez más, este error nos indica que el sistema de Windows no puede ponerse en contacto con la unidad USB.

Estos 4 errores relacionados con el disco virtual muchas veces significan que el pendrive tiene una avería de hardware:

  • Si el USB se ha mojado podemos intentar ponerlo en una bolsita de arroz durante un par de días. Dejamos que absorba bien la humedad y volvemos a intentar conectarlo.
  • Si el caso es que se ha dado un golpe o simplemente hace mucho tiempo que no lo utilizamos, es posible que se haya deteriorado o estropeado para siempre.

Ante esta situación, poco podemos hacer, la verdad. Queda la posibilidad de que todo esto venga de un error a la hora de asignar una letra a la unidad, aunque es poco probable. Es un fallo que surge cuando conectamos un USB con una letra que ya está asignada a otro disco en el PC (otro pendrive, el propio disco duro del equipo, etc.). Podemos intentar solucionarlo cambiando la letra asignada al pendrive:

  • Abrimos el panel de «Administración de discos» (desde el panel de control o desde Cortana).
  • Seleccionamos nuestro pendrive y haciendo clic derecho pulsamos sobre «Cambiar la letra y rutas de acceso de la unidad«. Asignamos una nueva letra (que esté libre y sin usar) y guardamos los cambios.

ERROR 2 :»Error de servicio de disco virtual: El medio está protegido contra escritura. Consulte el registro de eventos del sistema para obtener más información o Acceso Denegado«

Este error nos indica que el pendrive o memoria USB solo tiene permisos de lectura. Normalmente podemos solucionarlo moviendo la pestaña de bloqueo contra escritura que suelen incorporar la mayoría de USBs del mercado.

En caso de no disponer de ninguna pestaña también podemos obtener permisos de escritura ejecutando el comando «attributes disk clear readonly» (sin comillas) en MS-DOS, justo antes de borrar el USB mediante el comando Clean. Una vez que haya eliminado la protección contra escritura, ya podrá llevar a cabo el formateado.

ERROR 3 :»Error del servicio de disco virtual: el volumen es demasiado pequeño»

Este error ocurre cuando ejecutamos el comando DISKPART> format fs=Fat32. Es otro fallo con el disco virtual, pero que esta vez podemos solucionar sin demasiados dramas. Lo único que tenemos que hacer es formatear el USB en formato NTFS en lugar de FAT32.

En este caso pues lo que tendremos que hacer será formatear nuestra memoria USB en el formato NTFS, para lo cual, cuando estemos realizando el formateo mediante comandos, en lugar de utilizar el comando «format fs=FAT32» utilizaremos «format fs=NTFS«.

Si esto no funciona, realizaremos la siguiente serie de comandos:

  • diskpart
  • clean
  • convert gpt
  • format fs=NTFS

ERROR 4 :»Error del servicio de disco virtual:«El volumen es demasiado grande»

Seguimos con otro fallo del disco virtual al intentar formatear nuestro pendrive. En este caso el problema está en que Windows no es capaz de formatear ningún disco a FAT32 con un tamaño superior a 32GB. Un dato bastante curioso teniendo en cuenta que el sistema sí que es capaz de montar y leer unidades de mayor tamaño.

En cualquier caso, para poder formatear una unidad USB que tenga un tamaño de 1TB, 500GB o similar, tendremos que utilizar una aplicación de terceros que sí esté habilitada para formatear este tipo de discos. Una buena herramienta gratuita para llevar a cabo este proceso es FAT32 Format (disponible AQUÍ).

ERROR 5 :»chkdsk no está disponible para archivos RAW»

Este error nos saltará al intentar reparar los fallos en disco con el comando chkdsk. Cuando una unidad está en formato RAW significa que ha perdido su formato de archivos. Por tanto, para poder ejecutar la herramienta de chequeo de disco primero tendremos que darle formato (tal y como explicamos en los métodos #2 y #3).

ERROR 6 : «Acceso denegado porque no tiene privilegios suficientes»

Si no ejecutamos la ventana de MS-DOS con permisos de administrador el comando diskpart, obtendremos este error. Lo podemos solucionar simplemente haciendo esto:

  • Si utilizamos Cortana: Escribimos «cmd«, y cuando aparezca el icono del símbolo del sistema, en lugar de pulsar sobre él hacemos clic derecho y seleccionamos «Ejecutar como administrador«.
  • En versiones anteriores a Windows 10: Nos desplazamos hasta la carpeta C:\Windows\System32 y buscamos el ejecutable «cmd.exe». Hacemos clic derecho sobre el archivo mientras presionamos la tecla «shift» y seleccionamos «Ejecutar como administrador«.

Error del Servicio de disco virtual:No hay medios en el dispositivo.

ERROR 7: «Error del Servicio de disco virtual: No se puede convertir el disco especificado. Los CDs y DVDs son ejemplos de discos no convertibles».

Este error ocurre tras ejecutar el comando: DISKPART> convert mbr . Si ha recibido este mensaje de error, se debe a que su memoria USB contiene archivos almacenados en su interior, por lo que deberemos borrar todo su contenido antes de convertir las particiones.

Esto podrá hacerlo gracias al comando: DISKPART> clean. Tras este comando ya puede realizar la conversión

ERROR 8 :» No se encontró ninguna extensión disponible utilizable. Es posible que no haya suficiente espacio disponible para crear una partición con el tamaño y desplazamiento especificados. Especifique valores de tamaño y desplazamiento distintos o no especifique ninguno de estos valores para crear la partición con el tamaño máximo. Es posible que las particiones del disco se crearán con el formato de particiones de disco MBR y que el disco contenga cuatro particiones principales (ya no pueden crearse más particiones) o tres particiones principales y una extendida (solo pueden crearse unidades lógicas)

Este error ocurre tras haber ejecutado el comando DISKPART> create partition primary

En este caso tendrás que ejecutar el comando: DISKPART> clean para justo despues volver a ejecutar el comando DISKPART> convert gpt. Una vez que halla ejecutado los comandos anteriores, ya podrá ejecutar el comando DISKPART> create partition primary para continuar con el proceso.

ERROR 9: Error del Servicio de disco virtual: El volumen no está en línea.

Este error ocurre cuando ejecutamos el comando DISKPART> format fs=Fat32.

En este caso si recibimos este error tendremos que ejecutar los siguientes comandos antes de realizar el formateado en el orden especificado: DISKPART> online diskDISKPART>create partition primaryDISKPART> convert mbr.

ERROR 10: « Error del Servicio de disco virtual:No hay medios en el dispositivo«

Por qué aparece el error «No hay medios en el dispositivo»? Cuando se obtiene el error, se sugiere desconectar la unidad USB y volver a conectarlo a otra máquina para ver si es el problema con su unidad flash. Si lo es, los siguientes factores pueden explicar el error:

  • La unidad USB está fallando o ha fallado. Al igual que un disco duro, una unidad flash tiene una vida útil. Si la memoria USB nos puede servir para un par de años, puede llegar al final y fallar gradualmente. Los daños físicos como estampidas, caídas de altura o golpes frecuentes también pueden dañar la unidad USB.
  • El MBR o PBR del dispositivo está dañado. MBR es la abreviatura de Master Boot Record, que también se conoce como sector de arranque maestro. Es el primer sector que debe leerse cuando se enciende el PC para acceder al disco duro.El MBR recoge el tamaño y la ubicación de cada partición en el disco duro.El MBR consta de tres partes  El código de arranque maestro (ocupa 466Bytes), la tabla de particiones del disco (ocupa 648Bytes) y la firma de arranque. El uso inadecuado de la unidad, como desenchufar la unidad flash mientras está en funcionamiento, es probable que dañe las tablas de búsqueda internas de la unidad e invocar la corrupción en Master Boot Record (MBR) o Partition Boot Record (PBR).
  • El error también puede ser causado por otras razones desconocidas que no se han encontrado hasta ahora. Sin embargo, lo que cuenta a continuación es encontrar soluciones que resuelvan el problema de «No hay medios en el dispositivo».

Por tanto para reparar el error «No hay medios en el dispositivo», primero puede cambiar el puerto USB o desenchufar y enchufar la unidad varias veces, o conectar la unidad a otros ordenadores, tal vez con diferentes sistemas operativos como Linux, para probar si funciona. Si el problema persiste, AOMEI Partition Assistant Professional puede INTENTAR realizar la recuperación de particiones de unidades USB, tarjetas SD, discos duros y SSD ( por cierto no siempre con éxito). Este software viene con una versión Demo para una prueba gratuita.

  1. Conecte el dispositivo a un ordenador. 2. Inicie AOMEI Partition Assistant y haga clic en Partition Recovery Wizard en el lado izquierdo.
  2. Seleccione el dispositivo. Puede distinguirlo por la capacidad del disco y la marca.
  3. Elija el modo de búsqueda, Búsqueda rápida o Búsqueda completa. Seleccione la partición que desea recuperar y haga clic en Continuar para empezar. 5. Espere a que finalice el proceso.

Nota: si los datos de ese dispositivo son muy vitales para usted, y el método anterior no funciona, se sugiere recurrir a un software profesional de recuperación de datos.