Secuenciador aleatorio con Arduino


Arduino Uno es una placa de microcontrolador basada en el microcontrolador ATmega328P de la compañía Atmel (ahora adquirida por Microchip Technology). Fue lanzada en 2010 y se convirtió en una de las placas más populares en la plataforma Arduino.

La placa Arduino Uno es una plataforma de hardware de código abierto que permite a los usuarios crear proyectos electrónicos interactivos y controlar dispositivos electrónicos usando software y hardware personalizado.

La placa Arduino Uno incluye pines de entrada y salida digitales y analógicos que permiten a los usuarios conectar sensores, actuadores y otros componentes electrónicos para crear proyectos personalizados. La placa se puede programar utilizando el entorno de desarrollo integrado (IDE) de Arduino, que se puede descargar gratuitamente desde el sitio web de Arduino, pero actualmente ya existen otras herramientas de desarrollo.

Vamos a ver una simple aplicación de una placa Arduino Uno conectada una placa de relés, lo cual puede servir como secuenciador por ejemplo para maquetas , juegos de luces, medidas eléctricas, escaparates , escenarios , SIMULAR LA ACTIVIDAD EN UNA VIVIENDA cuando estamos fuera, y un largo etc.

El aspecto del conjunto es el siguiente:

Como vemos en la iamgen anterior, solo usaremos 5 salidas binarias correspondientes a los pines d2, d3, d4, d5 las cuales conectaremos directaemente a las entradas de la placa de relés ( no olvidar la masa ).

Las conexiones no pueden ser mas simples ,porque se conectan las salidas binarias de la placa Arduino pin a pin a la placa de relés sin olvidar la masa o GND.

No recomendamos para nada alimentar desde la propia placa Arduino la placa de relés, porque esta puede consumir según el modelo de placa de relés mas energia de la que puede aportar la salida de Arduino de 5v y además casi todas las placas de relés de cierta calidad se alimentan a 12V, por lo que se recomienda alimentar la placa de relés externamente.

Y ahora presentamos el código Arduino del ejemplo , donde también sacamos por consola los nombres de las cargas que vamos encendiendo y el tiempo de conexión total.

Por supuesto los nombre de los aplicativos a conectar se deberían cambiar con el nombre de los dispositivos eléctricos que conectemos

Es de interes destacar que calculamos cualquier combinación de 5 bits , la cual sacamos por los puertos binarios.

Además del combinación de salidas activadas que es aleatoria, también permanece en un estado de tiempo aleatorio entre 6000 y 100.000 ( la variable se llama tiempoEncendido) así como también hay una breve pausa de todo apagado entre 10.000 y 60000 ( la variable se llama tiempo_pausa), ambas por supuesto que debemos cambiar en función de la utilidad que se desee.

El resto de la funcionalidad del programa es sacar por consola el / o los electrodomésticos a encender , el tiempo que se va a encender y luego apagar así como el tiempo total de funcionamiento

El código completo de todo el programa es el siguiente, el cual se debería adaptar y personalizar a las necesidades de cada caso concreto:




int soldador = 2;
int luz_led = 3;
int luz_halogena = 4;
int ordenador = 5;
int ventilador = 6;

unsigned long tiempoEncendidoTotal = 0; // tiempo total que se va invirtiendo en milisegundos

void setup() {
  Serial.begin(115200);
  Serial.println("Iniciando ..");
 
  pinMode(soldador, OUTPUT);
  pinMode(luz_led, OUTPUT);
  pinMode(luz_halogena, OUTPUT);
  pinMode(ordenador, OUTPUT);
  pinMode(ventilador, OUTPUT);
  
  randomSeed(analogRead(A0));


  digitalWrite(soldador, HIGH); // apaga el soldador
    digitalWrite(luz_led, HIGH); // apaga la luz LED
 digitalWrite(luz_halogena, HIGH); // apaga la luz halógena
   digitalWrite(ordenador, HIGH); // apaga el ordenador
digitalWrite(ventilador, HIGH); // apaga el ventilador


 delay (1000);
}

void loop() {
  long tiempo_pausa = random(10000, 60000); // tiempo aleatorio entre 10 y 60 segundos en milisegundos
  int dispositivo = random(0, 33); // número aleatorio entre 0 y 32
  Serial.print("Numero generado: ");
  Serial.println(dispositivo);
  String binaryString = String(dispositivo, BIN);
     Serial.print("Cadena:");
      Serial.println(binaryString);
      
  

   

  if (dispositivo & (1 << 0)) { // verifica si el bit 0 está activado
    digitalWrite(soldador, LOW); // enciende el soldador
    Serial.println("Soldador encendido");
  } else {
    digitalWrite(soldador, HIGH); // apaga el soldador
  }

  if (dispositivo & (1 << 1)) { // verifica si el bit 1 está activado
    digitalWrite(luz_led, LOW); // enciende la luz LED
    Serial.println("Luz LED encendida");
  } else {
    digitalWrite(luz_led, HIGH); // apaga la luz LED
  }

  if (dispositivo & (1 << 2)) { // verifica si el bit 2 está activado
    digitalWrite(luz_halogena, LOW); // enciende la luz halógena
    Serial.println("Luz halógena encendida");
  } else {
    digitalWrite(luz_halogena, HIGH); // apaga la luz halógena
  }

  if (dispositivo & (1 << 3)) { // verifica si el bit 3 está activado
    digitalWrite(ordenador, LOW); // enciende el ordenador
        Serial.println("Ordenador encendido");
  } else {
    digitalWrite(ordenador, HIGH); // apaga el ordenador
  }

  if (dispositivo & (1 << 4)) { // verifica si el bit 4 está activado
    digitalWrite(ventilador, LOW); // enciende el ventilador
       Serial.println("Ventilador encendido");
  } else {
    digitalWrite(ventilador, HIGH); // apaga el ventilador
  }



 
long tiempoEncendido = random(6000, 300000); //genera un número aleatorio entre 1 minuto (60000ms) y 5 minutos (300000ms)
  
Serial.print("Tiempo encendido nuevo estado: ");
Serial.println(tiempoEncendido/1000);


 Serial.print(" Tiempo de pausa tras nuevo estado: ");
  Serial.print(tiempo_pausa/1000); // muestra el tiempo en segundos
  Serial.println(" segundos");

  tiempoEncendidoTotal += tiempoEncendido;
  unsigned long tiempoAcumulado = tiempoEncendidoTotal / 1000;
  unsigned int horas = tiempoAcumulado / 3600;
  unsigned int minutos = (tiempoAcumulado % 3600) / 60;
  unsigned int segundos = tiempoAcumulado % 60;

 

delay(tiempoEncendido); //espera el tiempo aleatorio generado


  

  
  digitalWrite(soldador, HIGH);
  digitalWrite(luz_led, HIGH);
  digitalWrite(luz_halogena, HIGH);
  digitalWrite(ordenador, HIGH);
  digitalWrite(ventilador, HIGH);

  




  delay(tiempo_pausa);
   Serial.print("Tiempo encendido total: ");
  Serial.print(horas);
  Serial.print(":");
  if (minutos < 10) {
    Serial.print("0");
  }
  Serial.print(minutos);
  Serial.print(":");
  if (segundos < 10) {
    Serial.print("0");
  }
  Serial.println(segundos);
}

Extracto

Este código, escrito en el IDE de Arduino , controla el estado de encendido/apagado de varios dispositivos (soldador, luz_led, luz_halogena, ordenador, ventilador) basándose en números binarios generados aleatoriamente. Los dispositivos están conectados a pines digitales específicos de la placa Arduino y se encienden/apagan cambiando la señal digital de estos pines de alta a baja (encendido) o de baja a alta (apagado).

El programa también realiza un seguimiento del tiempo total de encendido de todos los dispositivos en segundos y lo muestra en horas, minutos y segundos. El tiempo de encendido de cada dispositivo se genera aleatoriamente y varía entre 1 minuto (6000ms) y 5 minutos (300000ms), mientras que el tiempo de pausa entre los tiempos de encendido de cada dispositivo también se genera aleatoriamente entre 10 y 60 segundos.

El programa comienza inicializando todos los dispositivos en el estado de apagado, luego entra en un bucle infinito que genera un nuevo número binario y enciende/apaga los dispositivos en consecuencia, basándose en el estado de cada bit en el número binario. Después de cada período de encendido, todos los dispositivos se apagan y se inserta un tiempo de pausa antes de que comience el siguiente ciclo.

Anuncio publicitario

Proliferan los videos falsos de electrónica


Desgraciadamente la picaresca para atraer visitas a los sitios no para de crecer aunque sea a base de abusar de la buena fe de las personas.

Hay varias razones por las que se pueden publicar videos «fake» o falsos de electrónica. Aquí hay algunas posibles razones:

  • Sensacionalismo: los videos falsos a menudo se crean para atraer la atención y el interés de los espectadores. Pueden presentar dispositivos o experimentos que parecen impresionantes o novedosos, pero que en realidad no funcionan o no son prácticos.
  • Engaño: algunos creadores de contenido pueden publicar videos falsos con la intención de engañar a los espectadores y hacerles creer que han descubierto algo nuevo o revolucionario. Esto puede ser parte de un intento de promocionar productos o servicios falsos.
  • Experimentación: en algunos casos, los creadores de contenido pueden publicar videos falsos como una forma de experimentar o probar teorías. Esto puede ser para ver cómo reaccionan los espectadores o para intentar entender mejor cómo funcionan los dispositivos electrónicos.
  • Diversión: algunos creadores de contenido simplemente disfrutan de la creación de videos falsos como una forma de entretenimiento y para ver cómo reaccionan los espectadores.

En cualquier caso, es importante tener en cuenta que los videos falsos pueden ser engañosos de modo que es importante verificar la información y los hechos presentados en un video antes de tomarlos como verdaderos.

En este post cubriremos algunos tutoriales de electrónica falsos y les daré algunas ideas para que especialmente los aficionados principiantes eviten caer en la trampa de estos tipos de videos en YouTube.

El problema que se está presentando en YouTube últimamente, especialmente con el crecimiento de la comunidad de makers, son los tutoriales de electrónica falsos. Cuando buscamos algo tan simple como una bombilla con suciedad, aparecen imanes con dos pernos encendiendo una bombilla, una llave inglesa sobre un imán encendiendo una bombilla, e incluso un generador de energía libre 100% usando un imán y una bombilla.

Debemos evitar estos tipos de proyectos porque algunos de ellos pueden ser peligrosos, especialmente cuando se trata de voltajes altos. No querrá experimentar con su suministro principal utilizando solo un transistor o una resistencia. Estas son cosas que deberíamos evitar.

Para evitar estos tipos de videos, hay dos cosas en las que debemos fijarnos:

  • La primera es la miniatura del video. Si la miniatura parece demasiado buena para ser verdad, si muestran uno o dos componentes haciendo algo que normalmente requiere muchos componentes para lograr, es probable que el tutorial sea falso.
  • La segunda cosa que debemos buscar es que tienden a utilizar muchos componentes comunes que los principiantes pueden tener en su caja de herramientas, como el irfc 44m. No caigamos en esta trampa. Si parece demasiado bueno para ser verdad, probablemente lo sea.

GENERADORES DE ENERGIA INFINITOS

Está en todas partes con una pistolita encoladora, pegan dos motorcitos, los unen con una bandita y uno hace girar al otro, y se supone que al girar generen energía, lo cual es cierto, porque generan algo de energía. Le sacan de un sitio, lo vuelven a conectar a otro, y esa misma energía hace girar a esto, y después sacan un cable de ahí y encienden un led, encienden algo, y «tienen la energía infinita». Bueno, decirles que esto es falso, creo que está de más. Les cuento más o menos cómo se hace normalmente uno de estos motores falsos, el eje adentro, no tiene nada, lo desarman, le meten una pila botón, por ejemplo, a uno de ellos, esas pilas del reloj que son de 3 voltios, ponen dos pilas de esas, suficientes ara hacer girar este motor y hacer la energía infinita.

Otro ejemplo : si tomamos dos motores reales de lavadoras, motores de 15.000 vueltas, exactamente iguales los dos y los unimos con una correa si empujamos uno ¿lograriamos la generación infinita?. Bueno no exactamente…ciertamente estos motores tienen la particularidad que funcionan con ambas corrientes, es decir, pueden andar con corriente continua o pueden andar con alterna, por tanto la idea es traer un motor, ponerles unas soportes para fijarlo, separarlo y poder ponerles una correa entre ambos para que uno haga girar al otro y ver si aquí logramos hacer la retroalimentación conectando simplemente dos cables de un motor al otro. Antes de nada saber que estos motores generan algo de energía al mover su eje siempre, en cualquier parte que uno le saque, siempre van a estar generando algo cada vez que uno lo mueva. Si lo hacemos girar vamos a ver, para un lado para él genera continua, para el otro lado genera el negativo porque está al revés, y para el otro lado genera bien. O sea que cualquiera de los dos va a ser el mismo trabajo, porque siempre generan algo de corriente. Al girar cualquiera de los dos, porque son iguales, muchos videos nos intentan engañar intentando hacer el móvil perpetuo.. pero nada lejos de la realidad porque normalmente escondido hay un condensador de gran capacidad y un interruptor sujeto a uno de los ejes del que porsupuesto no se habla y que hace de bateria para permitir el giro de ambos ejes .

El concepto de un motor o dispositivo de movimiento perpetuo que puede funcionar indefinidamente sin necesidad de energía externa va en contra de las leyes de la termodinámica y la conservación de la energía. Es imposible crear una máquina que pueda producir energía infinita sin consumir ningún tipo de combustible o energía externa.

A pesar de esto, se han propagado muchos bulos y engaños a lo largo de los años que afirman haber descubierto un motor perpetuo o una fuente de energía ilimitada. Estos engaños pueden incluir videos falsos, imágenes manipuladas y declaraciones falsas de supuestos «inventores».

En algunos casos, estas afirmaciones pueden ser el resultado de una mala comprensión de los principios de la física y la termodinámica. En otros casos, pueden ser parte de un intento de engañar a las personas con fines de lucro o notoriedad.

Es importante tener en cuenta que la ciencia y la tecnología avanzan gracias a la experimentación y la prueba rigurosa de nuevas ideas y conceptos. Sin embargo, es igualmente importante mantener un escepticismo saludable y no aceptar afirmaciones sin evidencia sólida y verificable.

En resumen, los bulos sobre el motor perpetuo y la energía ilimitada que violan las leyes de la termodinámica son falsos y no tienen base científica. Es importante tener en cuenta que la ciencia y la tecnología avanzan gracias a la experimentación y la prueba rigurosa de nuevas ideas y conceptos. Sin embargo, es igualmente importante mantener un escepticismo saludable y no aceptar afirmaciones sin evidencia sólida y verificable.

PLACAS SOLARES FALSAS

Hace poco, uno de esos vídeos de bricolaje apareció en una de mis redes sociales. En él, el creador afirmaba: «Convierto un CD/DVD en un panel solar«, lo que parecía interesante pero improbable. Así que empecé a ver el vídeo y pensé que era imposible que esto funcionara, ¿o no? Entiendo, básicamente, cómo funcionan las células solares o fotovoltaicas. Y, realmente dudaba de que este truco que se proponía pudiera funcionar, a pesar de que el vídeo mostraba un multímetro conectado a la célula solar improvisada que indicaba que sí.

faked video showing a functioning cd solar cell

El área resaltada en esta imagen capturada del vídeo parece mostrar la salida de corriente del dispositivo solar casero, pero no creas todo lo que ves.

Es importante entender cómo funciona una célula fotovoltaica: en realidad son bastante sencillas y constan de tres partes intercaladas. La parte superior e inferior son contactos conductores, mientras que la central es un semiconductor. Los semiconductores son materiales que permiten que la electricidad fluya a través de ellos a una velocidad intermedia entre la de un aislante, que no lo permite, y la de un metal, que lo hace de forma eficiente.

Uno de los semiconductores más comunes es el silicio, que es el que se utiliza en las células fotovoltaicas. Cuando se bombardea el silicio con fotones -esencialmente la energía de la luz- se liberan electrones. Recogiendo estos electrones libres es como obtenemos electricidad de la célula fotovoltaica, aunque es un poco más complicado que eso. El silicio se manipula para liberar los electrones libres en una dirección, hacia una capa exterior de la célula que se convierte en la pata negativa del circuito eléctrico. A medida que los electrones libres abandonan ese lado de la capa de silicona, se crea un déficit en la otra capa exterior, que se convierte en la pata positiva.

Volviendo al vídeo, muestra a alguien enrollando un cable de cobre alrededor de un CD o DVD, pasando por el orificio central y rodeándolo hasta cubrirlo por ambos lados. Esto deja los dos extremos del cable uno al lado del otro. Para mantener los cables anclados y aislados entre sí, presumiblemente, cada uno de ellos ha sido pasado a través de agujeros taladrados en el CD.

Este es el primer problema que veo en el vídeo. Hay un cable enrollado alrededor de los lados superior e inferior del CD, por lo que los terminales o extremos de los cables superior e inferior no están aislados entre sí. Y, aunque eso funcionara, hay un segundo problema. El cable parece ser de cobre liso, que se toca donde está agrupado alrededor del orificio central, lo que provocaría un cortocircuito.

testing the functionality of a cd solar cell

Construimos y probamos una célula solar de CD utilizando los mismos materiales y métodos del vídeo: generó cero voltios.

BRADLEY FORD ha construido una de estas «células», para probar- generó cero corriente como esperaba. Sólo se puede adivinar por qué alguien crearía un vídeo de bricolaje para la electricidad libre que no funciona. Y no son los únicos. Haciendo una búsqueda de «DIY CD células solares» produce una gran cantidad de videos. Algunos imitan el original, otros utilizan un diseño ligeramente diferente, pero son igualmente ineficaces.

cd solar cell with zener diodes

Las tres áreas resaltadas muestran diodos Zener soldados en el bucle de alambre de cobre.

En el video, «Free Energy 100% , How make solar cell from CD» utilizan 3 diodos Zener en línea, en un bucle de cobre en un lado de un CD. Hacer esto puede generar algún voltaje medible, pero tiene más que ver con el diodo que con el CD o la elaborada disposición del cable de cobre. Cuando es excitado por la energía, ya sea electricidad o calor de la luz solar, el silicio del diodo puede liberar electrones, de forma similar a una célula fotovoltaica, pero no a un voltaje o amperaje que sea realmente útil. Se necesitaría un número absurdo de diodos Zener para crear una corriente eléctrica útil.

faulty circuit on fake cd solar cell

Las zonas resaltadas muestran los lugares donde el circuito haría cortocircuito, si fuera realmente viable.

En un tercer vídeo llamado «Panel solar fotovoltaico casero de 30W» el creador propone construir un panel utilizando 15 CDs. Este diseño parece tratar de imitar una célula fotovoltaica tradicional, con los CD cumpliendo el papel del semiconductor de silicio, y papel de aluminio como los contactos en las capas superior e inferior. Hay una gran razón por la que este diseño no funcionará, aparte de que el CD no es un semiconductor que pueda dirigir sus electrones liberados: El papel de aluminio utilizado para conectar la cara superior de los CD está pegado con cinta adhesiva para mantenerlo en su sitio y, al hacerlo, entra en contacto con la lámina inferior de papel de aluminio, lo que cortocircuitaría cualquier circuito que pudiera haberse creado.

Estos trucos, demasiado buenos para ser verdad, son sólo eso. Este tipo de vídeos pueden ser interesantes o, al menos, entretenidos, como demuestra el número de reproducciones que han recibido. Pero, investiga antes de gastar tu tiempo y dinero en un proyecto destinado a desperdiciar ambos. Intentar reproducir los resultados de estos vídeos es inútil.

En resumen, evite estos tutoriales de electrónica falsos y asegúrese de estar atento a estas señales de advertencia.

Cómo leer un disco formateado con Linux desde Windows11


Si ha recuperado algún viejo disco duro de algun sistema multimedia, de un viejo NAS , etc. probablemente éste este formateado en ext2,ext3 o ext4 ,sistema de ficheros que desde W11 no es posible leer su contenido (de hecho ni siquiera vera las particiones de disco), lo cual puede sorprender porque desde cualquier equipo con Linux verá que no hay problemas para leer su contenido .

Estas son las principales características de estos sistemas de ficheros:

  • Ext2 es la versión original de este sistema de archivos, que fue lanzado en 1993. Es un sistema de archivos muy simple y confiable, pero no tiene muchas características avanzadas, como registro de diario o soporte para archivos grandes.
  • Ext3 es una versión mejorada de Ext2 que se lanzó en 2001. Introduce un registro de diario, lo que significa que todas las operaciones del sistema de archivos se registran en un diario antes de ser escritas en el disco. Esto aumenta la fiabilidad y la velocidad de recuperación en caso de fallos del sistema. Además, Ext3 es compatible con archivos grandes y es más rápido que Ext2.
  • Ext4 es la versión más reciente de este sistema de archivos, que se lanzó en 2008. Es una actualización importante de Ext3 y presenta mejoras significativas en cuanto a escalabilidad, fiabilidad y rendimiento. Ext4 tiene un diario más sofisticado que Ext3 y también admite características avanzadas, como el soporte para sistemas de archivos de hasta 1 exabyte de tamaño y la capacidad de asignar bloques de manera más eficiente.

Afortunadamente no hace falta buscar un ordenador con Linux para leerlo porque existen numerosos programas para poderlos leer. Uno de los programas mas fáciles de usar es Linux Reader , con el que podemos acceder a archivos y carpetas en sistemas de archivos Ext, UFS, HFS, ReiserFS o APFS desde Windows 11.

Linux Reader™ es un producto de software popular y gratuito, y sigue siendo un software gratuito no comercial. Desde la versión 4.0, hay funciones adicionales que están disponibles como Linux Reader Pro™.

Con Linux Reader Pro™, puede leer archivos de incluso más sistemas de archivos, obtener acceso remoto a través de una conexión SSH, crear una unidad virtual, exportar archivos a través de FTP y más.

Todas las funciones importantes de Linux Reader™ siguen siendo gratuitas: sin publicidad molesta, sin modo de prueba, sin restricciones.

Tanto Linux Reader™ como Linux Reader Pro™ le brindan acceso seguro de solo lectura a la unidad de origen. Además, Linux Reader™ y Linux Reader Pro™ eluden las políticas de seguridad de archivos, por lo que puede acceder a cualquier archivo en un disco de Linux.Esta herramienta fácil de usar se ejecuta en Windows y le permite explorar los sistemas de archivos Ext2/3/4, HFS y ReiserFS

A continuación veamos las diferencias que hay en los dos programas para Linux Reader™ y Linux Reader Pro™: Windows 7, 8, 10 u 11.

Especificaciones de Linux Reader™

Linux Reader™ y Linux Reader Pro™ le brindan acceso a archivos en los siguientes sistemas de archivos:

  • Ext2/3/4
  • ReiserFS, Reiser4
  • HFS, HFS+(lector)
  • GRASA, exFAT
  • NTFS, ReFS
  • UFS2
  • RomFS (lector)
  • RAID 0, 1, 4, 5, 50, 10 y JBOD
  • APFS (modo lector)
  • ZFS (solo versión preliminar*)
  • XFS (solo versión preliminar*)
  • Hikvision NAS y DVR (solo vista previa*)

* Se requiere una licencia de Linux Reader Pro™ para obtener acceso completo a los archivos.

En general podemos ver que con la versión gratuita es mas que suficiente para nuestro propósito como leer la mayoría de sistemas de ficheros usados en sistemas Linux.

Especificaciones de Linux Reader Pro™

Además de los sistemas de archivos mencionados anteriormente, Linux Reader Pro™ brinda acceso total a estos sistemas de archivos adicionales:

  • ZFS
  • APFS cifrado
  • XFS
  • Hikvision NAS y DVR
  • Discos BitLocker cifrados

Con Linux Reader Pro™, también puede acceder de forma remota a archivos a través de SSH en Linux, FreeBSD, NetBSD, QNX, Mac OS y otros sistemas de archivos similares a Unix.

Las brillantes funciones de Linux Reader Pro™ le permiten:

  • Asigne cualquier disco o archivo a una nueva letra de unidad .
  • Exportar archivos a un servidor FTP .

Asigne cualquier disco o archivo a una nueva letra de unidad

Tanto Linux Reader™ como Linux Reader Pro™ tienen las siguientes características:

  • Lea archivos de todo tipo de discos duros, incluidos SSD, HDD, unidades flash, tarjetas de memoria y otros.
  • Acceso de solo lectura a archivos en unidades Linux, dejando intactos los archivos originales.
  • Vista previa gratuita del contenido de los archivos para garantizar la integridad.
  • Acceda a cualquier archivo en el sistema Linux, sin pasar por las políticas de seguridad.
  • Cree una imagen de disco de las unidades a las que tiene acceso. En caso de pérdida de datos, puede restaurar todo el disco a partir de esta imagen. Esta es la función más popular y la forma más fácil de restaurar una unidad, según los usuarios de Linux Reader™.

Por el momento, DiskInternals Linux Reader™ es la principal herramienta de software del mercado, que le brinda acceso desde Windows a varios sistemas de archivos de Linux como Ext2/Ext3/Ext4, HFS, ReiserFS y otros.

Le invitamos a descargar la versión gratuita de Linux Reader™ ahora mismo. Esta versión le permite actualizar a Linux Reader Pro™.

Cómo leer archivos de Linux en Windows

Instrucciones paso a paso:

  1. 1. Primero, debe descargar e instalar Linux Reader™ .

Lector de Linux - ventana de configuración

  1. 2. Luego, ejecute Linux Reader™ y elija la unidad que desea abrir.

Linux Reader - seleccione el disco

  1. 3. Linux Reader™ le muestra todos los archivos disponibles, incluidas imágenes, videos, documentos y otros archivos. Seleccione cualquier archivo para obtener una vista previa de su contenido haciendo clic con el botón derecho del ratón y seleccionando «Vista previa en ventana nueva». La vista previa es totalmente gratuita y no le obliga a pagar nada.
Linux Reader: abra el disco para obtener una vista previa de los archivos
Linux Reader - archivos de vista previa
  1. 4. Puede guardar archivos de Linux a Windows:
Paso 1: cómo guardar archivos de Linux en una computadora con Windows
Paso 2: cómo guardar archivos de Linux en una computadora con Windows
Paso 3: cómo guardar archivos de Linux en una computadora con Windows
Paso 4: archivos de Linux guardados en una computadora con Windows
  1. 5. Para acceder a archivos de forma remota a través del protocolo SSH, para exportar archivos desde sistemas de archivos compatibles solo con Linux Reader Pro™, para asignar archivos como una unidad virtual o para exportar archivos al servidor FTP, necesitará una licencia de Linux Reader Pro™. , que puede comprar fácilmente en línea. La licencia también le brinda actualizaciones gratuitas del software Linux Reader Pro™ durante 12 meses y prioridad en el soporte técnico.

Como ejemplo vemos un disco de 1TB SAMSUMG formateado con ext2 conectado a nuestro equipo con un adaptador SATA a USB, apareciendo el volumen en «phisical drives» y en «volumes» su tren particiones ( observe que aparecen dos como Linux ext y una tercera reservada para la partición de swapping).

También destacar que como estamos leyendo el disco desde un equipo con W11 podemos ver las tres particiones en NTFS (la partición principal, la partición del sistema y la partición de recovery )

Ciertamente en una instalación típica de Windows 11, es común encontrar al menos dos particiones: una partición de sistema reservada y la partición principal de Windows.

  • La partición de sistema reservada es una pequeña partición oculta que se utiliza para almacenar archivos de arranque y otros archivos necesarios para iniciar el sistema operativo. Esta partición generalmente tiene un tamaño de 100 MB a 500 MB.
  • La partición principal de Windows es donde se instala el sistema operativo y donde se almacenan los programas y los datos del usuario. Esta partición generalmente ocupa la mayor parte del espacio en disco y suele ser la unidad C: en el sistema.

Además de estas dos particiones, es posible que se creen particiones adicionales para almacenar datos, realizar copias de seguridad o para otras necesidades específicas. Por ejemplo, un usuario podría crear una partición adicional para instalar un segundo sistema operativo o para crear una partición de recuperación de Windows.

En resumen, el número de particiones en un disco con Windows 11 puede variar dependiendo de cómo se haya configurado el sistema y las necesidades del usuario, pero lo más común es encontrar al menos dos particiones: una partición de sistema reservada y la partición principal de Windows.

El programa se puede descargar gratis desde https://www.diskinternals.com/linux-reader/

Como dar una segunda vida a un NAS Verbatim


Los servidores NAS domésticos fueron en su día toda una revolución, al poder disponer de un dispositivo independiente con datos accesibles desde cualquier equipo que tuviésemos en casa o en el trabajo.

El Verbatim Gigabit NAS 500 era una solución que nos ofrecía el afamado fabricante Alemán para entornos domésticos. Contaba con varias versiones de un disco duro integrado de 5 1/4″SATA ( de 500 GB y de 1GB) y conectividad Gigabit destacando su facilidad de configuración y uso, incluyendo una aplicación libre para descarga de torrents, acceso ftp, NFS, Samba, gestión de usuarios y grupos, cuota de disco, servidor de impresión, iTunes y DHCP.

Este es un resumen de las principales características del equipo:

FabricanteVerbatim
ModeloNAS Gigabit 500
Dimensiones (Alto x Largo x Ancho)50 mm x 200 mm x 115 mm
Peso1 kg
MaterialAluminio
Interfaz1 x Ethernet RJ-45 Gigabit (cable incluido)
Conectividad2 x USB 2.0 (soporta impresoras, unidad flash, disco duro y lector de tarjetas de memorias)
Disco duro incluido500 GB
Sistema de ficheros soportadosEXT2, EXT3 y FAT32
Sistemas operativos soportadosWindows 2000 /XP / Vista (32-64 bits) /7 (32-64 bits) / 2003 Server / 2008 Server
Mac OS X 10.1 ó superior
Linux 2.54 ó superior
VentilaciónVentilador trasero de 4 cm
Nivel sonoroStandby: 34,1 dBA (con cuatro discos instalados)
Funcionamiento: 36,8 dBA (con cuatro discos instalados)
Fuente de alimentación100-240 VAC
ServiciosServidor FTP
Servidor de archivos (Samba)
Servidor NFS
Servidor de iTunes
Apple Bonjour
Servidor de impresión
Servidor/Cliente DHCP
Servidor de medios
TorrentFlux
CaracterísticasGestión de usuarios y grupos con sistema de cuotas de disco
Software de backup Nero
Soporte iTunes Server
Panel de administración compatible con los navegadores Internet Explorer 7/8, Safari 3/4, Firefox 3 (y posteriores) y Google Chrome

El aspecto de esta unidad difiere poco de un disco externo USB de formato 5 1/4″ , y tan solo verlo por atrás nos puede dar la pista de que estamos ante un NAS.

El equipo es muy minimalista como vemos en la imagen pues en el frontal solo cuenta con un led indicador de estado de la actividad del disco y en la parte trasera como ya adelantábamos es donde se entiende que es un NAS al incluir el conector ethernet, el conector de alimentación , el pulsador de encendido y dos puertos USB 2.0 que pueden soportar impresoras para utilizar el servicio de impresión en red, unidades flash, discos duros y lectores de tarjetas de memoria.

La imagen tiene un atributo ALT vacío; su nombre de archivo es image-55.png

El CD de software que acompañaba en su dia a este NAS incluía 3 aplicaciones, Finder.exe, software de copia de seguridad Nero y Torrent Flux, además de las guías de usuario en pdf (español incluido).

Para conectar el NAS a nuestra red sólo tenemos que enchufar el cable de red (de categoría 6, apto para redes Gigabit) a nuestro router o switch, teniendo el servicio DHCP activado y posteriormente, configurar el NAS vía navegador Web.

Finder.exe es una aplicación para Windows que puede localizar todas las unidades NAS Verbatim de nuestra red, mostrando así su IP pero lo normal es con el nombre ( verbatimnas) podemos acceder al interfaz web.  Después de que la unidad configure su IP, podremos ver la unidad en nuestro equipo como «verbatimnas» con 3 carpetas predefinidas, «admin», «invitado-recurso compartido» y «publico». Aunque ya se puede almacenar datos en estas carpetas, podemos configurar más cuentas de usuario en su panel de administración, que veremos a continuación.

Para acceder al administrador del NAS de Verbatim mediante navegador web, podemos escribir http://verbatimnas o http://IP-NAS entrando con el user/pass por defecto, admin/admin.

Si nos dan esta unidad por lo que sea o la hemos adquirido de segunda mano es interesante llevarla a fabrica así como formatear el disco.

Si lo llevamos a fábrica estos son los pasos a seguir:

  • Realizaremos una configuración rápida inicial para ajustar parámetros como el idioma, contraseña, nombre de host , dirección IP y hora.
  • Podemos dejar el modo DHCP activado (el NAS tomará automáticamente la IP que le otorgue nuestro router) o utilizar una IP fija; es aconsejable utilizar este último método, ya que, según el número de dispositivos que conectemos, el NAS puede cambiar de IP frecuentemente.
  • Al concluir la configuración rápida, se nos presentará un resumen con todos los parámetros básicos que hemos cambiado.
  • Es aconsejable crear un nuevo usuario, dejando el «admin» sólo para tareas de administración. Para ello vamos, mediante el botón de configuración rápida, a «Añadir usuario». Añadiremos el nombre, contraseña, pudiendo crear una carpeta privada y una cuota de disco.
  • Podemos introducir al usuario en un grupo; por defecto sólo viene «guest-share» o «recurso invitado»; después crearemos un grupo nuevo mediante el mismo método pero con la opción «Añadir grupo». Una vez realizado esto, podemos bien añadir ficheros en la carpeta «guest-share» (accesible para todos) o crear un recurso compartido (o carpeta compartida) a la cual solo podrá acceder el/los usuario/s (o grupo/s) que le hayamos indicado, con permisos de lectura y/o escritura. También podemos habilitar el acceso ftp, NFS y Samba.
  • Además de todo esto, el servidor NAS de Verbatim dispone de dos puertos USB mediante el cual podemos conectar una impresora, teniendo así un servidor de impresión. Una vez conectada la impresora, dentro del entorno «red» podemos ver la impresora. Cuando cliquemos en ella, el sistema debería pedir instalar los controladores necesarios, pudiéndose usar desde cualquier equipo de la red.
  • Como ya hemos comentado, este NAS ofrece acceso ftp, que ofrece un control total sobre los recursos de cada usuario, pero ojo usar como protoclo ftp ya que ftps no esta soportado.
  • Pasando al apartado de administración, podemos desde formatear el disco (viene por defecto formateado en ext2) en ext3 ó FAT32 (recordamos que este último no soporta las cuotas de disco), hasta actualizar firmware, importar y exportar la configuración del NAS, así como instalar nuevos servicios.
  • Por cierto, en el apartado de «Registro» disponemos de completos logs sobre registros Samba, FTP, DHCP, sistema y administración, con alertas de notificación vía email.

MEJORAS:

Aunque el disco incluido en el NAS es de calidad, con el paso del tiempo estos se convierten en en muy ruidosos y grandes consumidores de energia, por lo lo ideal es sustituirlo por otro en formato 3 1/2″ ( los de de portátil) o incluso uno del tipo SSD. Puede que piense que el sistema arranca desde aquel disco original, pero en absoluto es así y podemos cambiarlo perfectamente sin ningun problema ya que el sistema arrancara desde su memoria interna gracias a su propio firmware configurado de fabrica. Veamos los pasos a seguir para cambiar el disco original por otro mas moderno.

Empezaremos desde la parte posterior, desconectando todo lo que tengamos en el conector ethernet, el conector de alimentación o los dos puertos USB 2.0.

El desmontaje de este equipo no implica grandes complicaciones no necesitando nada especial excepto una herramienta afilada o un desmontador de plástico (o en su defecto un simple navaja). Empezaremos pues quitando el plástico trasero con una herramienta afilada.

La imagen tiene un atributo ALT vacío; su nombre de archivo es image-51.png

Haremos lo mismo con la parte frontal ( la del led central) , y con esto ya podemos desplazar la carcasa de aluminio con cuidado ( lleva unas esponjillas para que precisamente no se mueva ) para finalmente descubrir ya el interior de la unidad donde queda claramente visible el gran disco de 500GB o 1 TB.

Tanto a los lados, como en la parte superior de la estructura interna, se hallan unas esponjas cuya misión es evitar en todo momento cualquier tipo de vibración y fijar el disco en el interior correctamente.

La imagen tiene un atributo ALT vacío; su nombre de archivo es image-53.png

Ahora lo que toca es quitar los 4 tornillos que fijan el disco a la carcasa y soltar los conectores SATA.

Como podemos ver los cables sata son extremadamente cortos así que debemos tener mucho cuidado a la hora de desconectarlos.

Ahora toca quitar definitivamente el viejo disco de 5 1/4″ y reemplazarlo por el disco de formato 3 1/2″.Como solo hay posibilidad de fijar el nuevo disco de 3 1/2″ por un tornillo no esta de mas colocar algun aislante (por ejemplo un papel ) entre la parte inferior del disco y la placa del NAS

Cerraremos la carcasa y será el momento de probar si es disco nuevo y es reconocido por el NAS, para lo cual nos validaremos y en la pestaña de avanzado nos iremos a Mantenimiento–> Utilidad de disco y ahí debería aparecer el disco ,y la opción de formatearlo en ext2, ext3 o fat32s.

Una vez formateado el disco para saber el tamaño y el nivel de ocupación nos iremos en la pestaña de Avanzado a Sistema–>Uso del disco.

Obviamente si el disco quitado de la unidad es funcional una vez lo quitemos se puede adquirir una carcasa barata para darle una segunda vida como disco de backup, al tiempo que el hemos dado una nueva vida al NAS con un disco mas fiable y usándolo como servidor de impresión, servidor de ficheros , etc.

En este ultimo apartado no olvidemos que desde la pestaña Avanzado en el menú de Archivar e imprimir –>Servidor de impresora podemos activar el servidor de impresión como podemos ver en la siguiente imagen como resultado de conectar una impresora Brother directamente a unos de los puertos USB del NAS , siendo reconocida perfectamente estas por el fw del NAS

Llega la revolución de los porteros automáticos


No siempre estamos cerca para oir la señal de llamada procedente del clásico telefono analógico del intercomunicador de una instalación comunitaria de portero automático (!y mucho menos por supuesto si estamos fuera de casa!). Además quizás sepa que hay nuevos sistemas de videoporteros de nueva generación, pero si hablamos de una instalación comunitaria no siempre es fácil convencer a los vecinos para cambiar el clásico portero automático con soporte de audio por uno nuevo con video y llamada por wifi, pues eso conlleva cambiar la red troncal , la placa de la centralita y por supuesto sustituir los porterillos por los nuevos videoporteros.

Es cierto que existen soluciones para reenviar el audio o el timbre de un porterillo o un interfono (como hemos visto en este blog) , siendo básicamente la mas popular la que se compone de un altavoz que hay que cablear hasta donde deseemos o otra muy común compuesta de un transmisor/receptor de RF (que tampoco es muy eficiente), pero la solución que vamos a ver ( Ring Interfono) , que acaba de salir al mercado, realmente «está a otro nivel» porque permite una serie de facilidades nunca vistas, y eso sin tener que cambiar la instalación comunitaria:

  • Contestar al interfono estés donde esté: da igual quién llegue a su portal, un amigo o el paquete que esperaba pues con el Ring Intercom, estará en casa aunque esté lejos. Reciba notificaciones en tiempo real cuando llamen al interfono de su edificio, hable con la persona que esté al otro lado y dele acceso al edificio, todo desde su móvil ( además todas las funcionalidades del Ring Intercom están disponibles sin suscripción, así que no tendrá que pagar ningún coste adicional ni comprometerse a nada).
  • Añadir funcionalidades a su interfono: hable con las personas que se encuentren en la entrada de su edificio permitiendo abrirles el portal desde su teléfono usando la app de Ring.
  • Conceda acceso a personas de confianza: La funcionalidad de verificación automática de invitados le permite enviar llaves de invitado a través de la app de Ring a los amigos y familiares que elija para que ellos mismos se abran el portal de tu edificio usando sus propios móviles. El propietario siempre tendrá el control sobre quién tiene acceso al edificio y cuándo. Defina si la llave de invitado es válida solo ciertos días u horas o haga que funcione de manera ininterrumpida, gestione el horario de acceso de cada persona, o revoque un permiso de acceso que haya concedido: todo esto en cualquier momento desde la app de Ring.
  • Verificación automática para entregas de Amazon: en efecto puede dejar que Amazon se ocupe de comprobar quién le lleva los paquetes de Amazon a su edificio. Si activa la verificación automática para las entregas de Amazon, el personal de reparto verificará su identidad a través de la app de entrega de Amazon antes de que se le conceda acceso temporal al edificio. El acceso temporal les permitirá entrar al edificio y dejar los paquetes dentro (Amazon trabaja con varios transportistas para garantizar que recibes tus pedidos lo más rápido posible y sólo los artículos enviados por Amazon son compatibles con la verificación automática).

Antes de continuar, destacar nuevamente que esta solución es perfecta para complementar el porterillo tradicional conectado a una instalación comunitaria pero quizás no sea la mas optima por ejemplo si vive en una vivienda unifamiliar con una instalación de audio porque quizás le convenga cambiar la instalación completa por el ring «normal » ( Ring Video Doorbell de Amazon), dispositivo destinado a sustituir al pulsador de timbre exterior, pero que tiene todas las mismas características comentadas anteriormente del Ring Intercom añadiendo soporte de video, resaltando además de requerir una instalación muchísimo més sencilla pues simplemente hay que fijarlo a la pared) .

La instalación

Antes de nada vamos a ver como se realiza  la instalación usando como base un viejo interfono de la marca Fermax 6201 tipo kit   que se vende en Amazon con el modelo de teléfono 80447 (la página web de ring dice que está soportado y compatible  por este dispositivo ring). El interfono solo cuenta con un solo pulsador  de llamada y es típicamente usado en edificios de apartamentos con un panel de muchos vecinos con muchos timbres y compartidos. Otros telefonillo similar a 5 hilos son los  Fermax 3391,pero existen infinidad de modelos similares cuya principal característica es el soporte de los mínimos hilos (Transmisión, Recepción y Timbre).

Lo primero a tener en cuenta, antes de lanzarnos a instalar este nuevo dispositivo es buscar el modelo instalado en la web del Ring Intercom donde citan una lista de compatibilidad. Dentro de los porteros automáticos hay multitud de tecnologías y formas. Si tiene un portero analógico de varios hilos, casí seguro que podrá hacer todas las funciones. Esto es abrir y atender la llamada remotamente, que cuando este cerca y llame, se abra automáticamente, incluso silenciar el timbre y que solo le llegue la notificación al telefono (muy útil por la noche o en barrios con jaleo nocturno).Pero….si tienes uno digital, o mixto como el Tegui M72, probablemente, no pueda disfrutar de todas las funciones.


Básicamente el punto de «mayor complejidad » por tanto es conectar el Ring intercom al telefonillo existente , pero lo bueno es que SOLO hay que conectar el ring intercom al telefonillo que hay dentro de casa , no hay que hacer nada en la placa que esta en la calle.

Lo primero que tiene que hacer al recibir el producto es dejar cargando la bateria pues el equipo se alimentara de esta. Como vemos en la foto la bateria tiene un indicador con luz verde y naranja . Cuando se apaga la luz naranja y se queda la de color verde esta completamente cargada ( puede tardar  más de 5 horas según como venga la bateria de cargada).


Una vez introducida la batería, necesitara descargar la aplicación ring en el teléfono explicando que quiere añadir un dispositivo. En este punto necesitara configurar los credenciales de su red wifi mas cercana y seguir el proceso.
Una vez introducidas dichas credenciales nos pide que digamos que dispositivo o modelo de telefonillo tenemos instalado y con esto, la app nos dirá el mazo de cables que tenemos que elegir  de los tres disponibles.

Procederemos en este punto a desmontar la tapa del porterillo ( según el modelo solo llevara un tornillo ) para conectar un pequeño mazo de cable que incluye que servirá para interconectarlo con el ring . Obviamente destacar que estos nuevos cables del mazo se conectan en paralelo con los antiguos manteniendo por tanto el cableado original .

Como ejemplo veremos el fermax 80447 ( uno de los mas usados ) y que usa el mazo de cables tipo A,que suele ser el mas usado, así que en ese caso los otros dos mas que son el B y el C  ya no los utilizaremos (puede ser que incluso que le sobre algun otro cable ,  pero eso no importa pues se lo dice el guiado de la aplicación).

Una vez conectados los colores del cable de ring suministrado con los números de telefonillo, pasa a un test de funcionamiento y de verificación de que puede llamar al timbre , establecer comunicación verbal y finalmente abrir la puerta.


Tenga en cuenta que NO nos debemos , en ningún caso que guiarnos por unir colores iguales ( los del mazo con los existentes en la instalación) . Solo haga caso a los colores del mazo enviado por ring y los números a los que tiene que conectarse pues no tienen el porque coincidir con los colores que utilizó el instalador del interfono en su dia.
En el caso del modelo fermax solo hay 5 cables importantes que son:

  • 4 llamada
  • 6 altavoz
  • 3 tierra/masa/ground
  • 2 micrófono
  • 1 apertura

Estos hilos como vemos en la imagen ya están numerados como 1,2,3 ,4 y 6 en la placa

Como vemos en la imagen los cablezilllos del mazo se conectan en paralelo observando con mucho cuiado el sentido de cada hilo: altavoz, microfono , llamada y tierrra:

Asi es como queda la instalación , donde podemos apreciar como se superpone los cablecillos del interfono con los cablecillos del mazo ( ojo por cierto con le orden de los hilos del mazo qeu puede variar segun el modelo del porterillo)

En las imágenes podemos ver los colores y a los números que tienen que ir (por supuesto deje puestos los que había originalmente).

Una vez hecho esto , conectaremos el mazo al ring, le añadiremos la bateria y ya podemos fijarlo a la pared

!Terminado!

Hemos visto pues que solo hemos tenido que retirar la cubierta frontal del auricular, introducir la marca y seguir las instrucciones de la app de Ring para conectar su Ring Intercom a nuestro interfono existente, de modo que cuando esté conectado, simplemente fijamos el Ring Intercom a la pared y volvemos a colocar la cubierta frontal del auricular y ya solo seguir las indicaciones de la app de Ring para comprobar que todo funciona correctamente. ¡Y listo! Ya podemos disfrutar de todas las ventajas de Ring partiendo de su viejo interfono.

El resultado final , bajo el punto de vista del que suscribe estas líneas es espectacular pues como comentábamos al principio tiene muchas funcionalidades «extra» como la llamada y apertura remota asi como incluso el poder autorizar a el repartidor de Amazon para que abra automáticamente cuando nos vaya a dejar un paquete

La aplicación en resumen está muy bien diseñada y robusta pues convierte un equipo analógico antiguo en un moderno interfono IP remoto.


Por cierto dado la evidente relación de la marca Ring con Amazon, este nuevo dispositivo se puede comprar desde la web al 50% de su valor inicial desde aqui

Una introducción a la programación con Python


En el mundo moderno, donde casi todos los dispositivos tienen una funcionalidad inteligente, ser programador es una herramienta importante en el conjunto de habilidades de un ingeniero. Python es un lenguaje de programación popular tanto para programadores principiantes como avanzados debido a su simplicidad, legibilidad y versatilidad. En este post, exploraremos los conceptos fundamentales de la programación y le presentaremos la sintaxis y las estructuras básicas de Python.

Hoy en día, Python se usa ampliamente en todo el mundo para una variedad de aplicaciones. Es popular en ciencia de datos, aprendizaje automático e inteligencia artificial, debido a sus extensas bibliotecas para computación numérica y científica. Python también se usa en desarrollo web, desarrollo de juegos, automatización y otras aplicaciones. Muchos sitios web populares, incluidos Instagram, Pinterest y Dropbox, se crean con Python. Además, Python es un lenguaje popular para sistemas integrados, donde se usa para programar dispositivos como microcontroladores, computadoras de placa única (SBC) y otros dispositivos.

Python es por tanto un lenguaje de programación interpretado, lo que significa que los programas se ejecutan directamente desde el código fuente, sin necesidad de un paso de compilación. En otras palabras, un intérprete lee y ejecuta el código línea por línea en tiempo de ejecución, convirtiéndolo en código de máquina a medida que avanza. Esto contrasta con un lenguaje compilado, como C++, donde un compilador traduce el código fuente a código de máquina antes de la ejecución.

Python también se escribe dinámicamente. Un lenguaje tipado dinámicamente es un lenguaje de programación en el que el tipo de datos de una variable se determina en tiempo de ejecución, en lugar de en tiempo de compilación. En un lenguaje de tipado dinámico, no es necesario declarar el tipo de datos de una variable antes de usarla, porque el tipo se infiere en función del valor asignado a la variable. Esto simplifica la programación y hace que el código sea más conciso, pero también puede hacer que los programas sean más difíciles de depurar.

Python es un lenguaje de programación orientado a objetos (POO) y utiliza el concepto de objetos para representar y manipular datos. Los objetos tienen tanto propiedades (datos) como métodos (comportamiento), y el foco está en las interacciones entre objetos más que en los procedimientos o funciones de un programa. Nos sumergiremos en OOP en un módulo de aprendizaje futuro.

Hello world con Python

Para comenzar a aprender a codificar en Python, necesitará algunas cosas básicas:

  1. Un ordenador: Python puede ejecutarse en una variedad de sistemas operativos, incluidos Windows, macOS y Linux. También puede ejecutarse en computadoras de placa única (SBC), como Raspberry Pi.
  2. Intérprete de Python: El intérprete es el programa que lee y ejecuta el código. Puede descargar la última versión del intérprete de Python desde el sitio web oficial de Python .
  3. Editor de texto o entorno de desarrollo integrado (IDE): necesitará un editor de texto o un IDE para escribir su código Python. Hay muchas opciones disponibles, incluidos editores de texto populares como Visual Studio Code , Sublime Text y Notepad++ . Los IDE como PyCharm y Spyder ofrecen funciones más avanzadas y herramientas de depuración integradas.

Después de terminar este post, probablemente querrá buscar más recursos de aprendizaje. Hay muchos recursos en línea gratuitos disponibles, incluida la documentación oficial de Python, tutoriales de YouTube y sitios web de codificación interactiva como Codecademy y DataCamp .

Por cierto, si no quiere instalar nada en su equipo, una opción interesante es ejecutar Python en la nube como por ejemplo con Google Colab.

Google Colab (abreviatura de «Google Colaboratory») es un entorno de desarrollo en línea que permite a los usuarios escribir y ejecutar código en lenguaje Python. Es una plataforma gratuita que se ejecuta en la nube de Google y ofrece acceso a recursos informáticos como CPU, GPU y TPU para ejecutar códigos de manera rápida y eficiente. Google Colab es especialmente útil para la investigación en inteligencia artificial, aprendizaje automático y análisis de datos, ya que los usuarios pueden cargar y analizar grandes conjuntos de datos sin tener que preocuparse por los recursos de hardware o el tiempo de ejecución. Además, Google Colab permite a los usuarios colaborar en tiempo real en el mismo documento, lo que lo convierte en una herramienta popular para la enseñanza y la colaboración en proyectos de código.

¡Hola Mundo!

Crear un simple aplicación en local «¡Hola mundo!»  es también muy sencillo . Veamos la creación de un programa de Python:

  1. Descargue e instale la última versión de Python desde el sitio web oficial de Python .
  2. Abra un editor de texto simple como el Bloc de notas (en Windows), TextEdit (en macOS) o Gedit (en Linux) para crear su programa de Python.
  3. Escriba el siguiente código en tu editor de texto: print(«¡Hola mundo!»)
  4. Guarde el archivo con el nombre «helloworld.py». La extensión «.py» significa que es un archivo de Python.
  5. Abra una terminal o símbolo del sistema en su computadora.
  6. Use el comando «cd» para navegar a la carpeta donde guardó el archivo. Si guardó el archivo en su escritorio, puede navegar hasta él usando el comando: cd ~/Desktop
  7. Escriba el siguiente comando para ejecutar el programa: python holamundo.py

El programa emitirá «¡Hola mundo!»

Tabulaciones o espacios

En Python, las tabulaciones o los espacios se utilizan para marcar bloques de código que se agrupan, como el cuerpo de un bucle o una función. Python usa la sangría como una forma de agrupar declaraciones, en lugar de usar caracteres como corchetes o paréntesis, así que es muy importante donde colocamos todas las sentencias

La sangría adecuada es esencial en Python, ya que afecta la forma en que se interpreta y ejecuta el código. Si la sangría es incorrecta, el código generará un error de sintaxis. El código de Python usa convencionalmente cuatro espacios para la sangría, pero es posible usar tabulaciones o una combinación de tabulaciones y espacios, siempre que sea consistente en todo el programa.

Por ejemplo, en el siguiente código, las líneas con sangría se agrupan como parte de la instrucción if:

if i == 0:
  result = i + 10
  print(i)

El siguiente código daría como resultado un error de sintaxis porque la sangría es incorrecta:

if i == 0:
   result = i + 10
   print(i)

La sangría adecuada también hace que el código sea más legible, una cualidad importante cuando se trata de estructuras lógicas o anidadas complejas.

Comentando en Python

Un comentario es un fragmento de texto que el intérprete ignora y se utiliza para proporcionar información o contexto sobre el código. Los comentarios pueden ayudar a explicar el propósito del código, cómo funciona o proporcionar otros detalles importantes. Para escribir un comentario en Python, comience con el símbolo #. Todo lo que sigue al símbolo # en una línea se trata como un comentario y el intérprete lo ignora. Por ejemplo:

# Este es un comentario en Python
print("¡Hola, mundo!")

Sintaxis de Python

Tipos de variables

Una variable es una referencia con nombre a un valor almacenado en la memoria de la computadora. Las variables pueden contener varios tipos de datos, incluidos números, cadenas, listas, diccionarios y más. Para asignar un valor a una variable en Python, se utiliza el operador de asignación =. Por ejemplo, el siguiente código asigna el valor 10 a una variable llamada x, que puede usar más adelante en el código:

x = 10
print(x) # Esto imprimirá “10”

El valor de una variable se puede reasignar a un nuevo valor.

x = 20
print(x) # Ahora esto imprimirá “20”

Debido a que Python es un lenguaje de tipo dinámico, los tipos de datos de las variables no tienen que declararse explícitamente. El tipo de una variable se determina automáticamente en función del valor que se le asigna. Algunos de los tipos de datos incorporados en Python incluyen:

  • Entero:  representa un número entero (por ejemplo, 5, -3, 0)
  • Flotante: representa un número de punto flotante (p. ej., 3,14, -2,5, 0,0)
  • Cadena: representa una secuencia de caracteres (por ejemplo, «hola», «gato», «42»)
  • Booleano: representa un valor lógico (Verdadero o Falso)
  • Lista: representa una secuencia mutable de elementos (por ejemplo, [1, 2, 3], [«coche», «barco», «avión»])
  • Diccionario: representa una colección de pares clave-valor (por ejemplo, {«nombre»: «Mike», «edad»: 30})

si las declaraciones

Una instrucción if es una estructura de control que le permite ejecutar código en función de las condiciones. Cierto código se puede ejecutar si una condición es Verdadera, con otro código ejecutándose si la condición es Falsa.

En Python, una instrucción if va seguida de dos puntos (:). El código que se ejecutará si la condición es verdadera se sangra debajo de la instrucción if .

x = 10
if x > 5:
   print("x es mayor que 5")

En este ejemplo, la condición x > 5 es verdadera, porque el valor de x es 10, que es mayor que 5. El código dentro de la declaración if se ejecutará y generará el texto «x es mayor que 5». Si x se establece en 3, la declaración de impresión no se ejecutará y el programa pasará a la siguiente línea de código.

Una declaración else especifica el código que se ejecutará si la condición es falsa.

x = 3
if x > 5:
   print("x es mayor que 5")
else:
   print("x es menor o igual a 5")

En este ejemplo, la condición x > 5 es falsa, por lo que el código dentro de la instrucción if no se ejecutará; en su lugar, se ejecuta el código dentro de la declaración else , generando el texto «x es menor o igual a 5».

Las cadenas también se pueden comparar con sentencias if . Al igual que los números, verificar si las cadenas son iguales usa el comparador ==, mientras que verificar si no son iguales usa el comparador !=. Los métodos de cadena incorporados de Python se pueden usar para comparar cadenas de formas más complejas. Por ejemplo, el método getswith() se puede usar para probar si una cadena comienza con una subcadena determinada, mientras que el método closureswith() se puede usar para probar si una cadena termina con una subcadena determinada. El operador in se puede usar para probar si una cadena contiene una determinada subcadena. Por ejemplo, «hola» en «hola mundo» se evaluaría como Verdadero, mientras que «hola» en «hola mundo» se evaluaría como Falso.

Tenga en cuenta que Python distingue entre mayúsculas y minúsculas. Para ignorar la distinción entre mayúsculas y minúsculas, las cadenas se pueden convertir a minúsculas o mayúsculas usando las funciones lower() o upper() antes de la comparación.

Trabajar con listas

Los elementos de datos a menudo se agrupan en una colección. En muchos idiomas, esto se hace usando un tipo de datos llamado matriz , que son colecciones de elementos de un tipo de datos similar.

Python no tiene una matriz integrada, sino un tipo de datos integrado conocido como lista que se puede usar de manera similar. Las listas, sin embargo, pueden contener elementos de diferentes tipos de datos. Este ejemplo muestra cómo crear una lista en Python que incluye números y una cadena.

mi_lista = [1, 2, 3, "cuatro", 5.0] #Una lista usa corchetes []

Se puede acceder a los elementos individuales de una lista por su índice . El índice comienza en 0. Para acceder al primer elemento de my_list :

print(my_list[0]) #Esto genera un 1

Los elementos de una lista se pueden modificar asignando nuevos valores a su índice. Para cambiar el segundo elemento de my_list a 10:

mi_lista[1] = 10 #mi_lista ahora es [1, 10, 3, “cuatro”, 5.0]

Se pueden agregar nuevos elementos a una lista usando el método append() . Para agregar el número 6 al final de my_list :

my_list.append(6) #my_list ahora es [1, 10, 3, “four”, 5.0, 6]

¿Qué es un diccionario?

Otra forma de agrupar datos es con un diccionario . Un diccionario es una colección de pares clave-valor. Este ejemplo muestra cómo crear un diccionario en Python:

my_dict = {"coche": 1, "tren": 2, "avión": 3} #Un diccionario usa corchetes {}

En este ejemplo, my_dict es un diccionario con tres pares clave-valor. Las claves son «coche», «tren» y «avión», y sus valores respectivos son 1, 2 y 3. Se puede acceder a los valores individuales de un diccionario mediante su clave.

print(my_dict["car"]) #Esto genera 1

El valor asociado a una clave se puede modificar.

my_dict["tren"] = 10 #my_dict ahora es {"auto": 1, "tren": 10, "avión": 3}

Se pueden agregar nuevos pares clave-valor a un diccionario asignando un valor a una nueva clave.

my_dict["barco"] = 4 #my_dict ahora es {"coche": 1, "tren": 10, "avión": 3, “barco”: 4}

Recorriendo datos: bucles for y while

Una de las capacidades más útiles de la programación es poder recorrer rápidamente grandes colecciones de datos, repitiendo un conjunto de instrucciones con cada iteración. En Python, hay dos tipos de bucles, el bucle for y el bucle while .

El ciclo for se usa cuando se itera sobre una secuencia de elementos.

vehículos = ["coche", "tren", "avión"]
for vehículo in vehículos:
print(v)

El ciclo for itera sobre la lista de vehículos , asignando cada elemento a la variable vehículo . La declaración de impresión luego imprime el vehículo en la consola. La salida de este código sería:

carro
tren
avion

El ciclo while se usa cuando desea repetir un bloque de código siempre que se cumpla una determinada condición.

i = 0
while i < 5:
print(i)
i += 1

El bucle while repite el bloque de código siempre que i sea menor que 5. El bloque de código primero imprime el valor de i y luego incrementa i en 1. La salida de este código sería:

0
1
2
3
4

¿Qué es una función y por qué debo usarla?

Una función es un bloque de código que realiza una tarea específica que se puede llamar desde otras partes de un programa. Las funciones son una parte esencial de la escritura de código limpio, reutilizable y modular. Las ventajas de usar funciones incluyen:

Reutilización: las funciones se pueden usar en diferentes partes de un programa sin tener que reescribir el mismo código una y otra vez.

Modularidad: las funciones le permiten dividir un programa en partes más pequeñas y manejables.

Abstracción: las funciones se pueden usar para ocultar detalles de implementación y proporcionar una interfaz de alto nivel para otras partes de un programa.

Capacidad de mantenimiento: las funciones hacen que el código sea más organizado, más fácil de leer y comprender, y más fácil de mantener a lo largo del tiempo.

Pruebas: las funciones se pueden probar de forma aislada del resto de un programa, lo que facilita la búsqueda y corrección de errores.

En Python, las funciones se definen con la palabra clave def , seguida del nombre de la función y los parámetros entre paréntesis. La siguiente función toma dos números como argumentos, los suma y devuelve el resultado:

def sumar_números(x, y):
resultado = x + y
return resultado

Una vez que haya definido una función, puede llamarla desde otras partes de su programa. Este ejemplo llama a nuestra función add_numbers , pasando 3 y 5 como argumentos.

sum = add_numbers(3, 5)
print(sum) #Este código genera 8

Ingresando datos

La función input() es una función integrada en Python que solicita la entrada de un usuario. Cuando se llama, el programa espera a que el usuario ingrese un valor a través de la consola.

nombre = input ("¿Cuál es su nombre de pila?")
# formatee el nombre con la primera letra en mayúscula y el resto en minúsculas
formatted_name = nombre.capitalize()
# imprime el mensaje de bienvenida con el nombre formateado
print("Hola " + formatted_name + "! ¡Bienvenido !")

Cuando ejecute el programa, le pedirá al usuario que ingrese su nombre:

¿Cuál es tu primer nombre?

Si el usuario ingresa "Mary" y presiona enter, el programa generará:

¡Hola María! ¡Bienvenido!

Si el usuario ingresa "mARY" en su lugar, el programa aún generará:

¡Hola María! ¡Bienvenido!

La función capitalize() formatea el nombre con la primera letra en mayúsculas y el resto en minúsculas, independientemente de cómo haya ingresado el nombre el usuario.

¡Hola Mundo! en la Raspberry pi

Requisitos de hardware y software
Para seguir este tutorial, necesitará lo siguiente:

  • Raspberry Pi (cualquier modelo)
  • Tarjeta MicroSD con Raspbian instalado
  • Teclado y ratón
  • Supervisar con un cable HDMI o una aplicación de escritorio remoto
  • Conexión a Internet (si desea acceder a su Pi de forma remota)

Paso 1: Configure la Raspberry Pi
Antes de comenzar a codificar, debemos configurar nuestra Raspberry Pi.

  1. Inserte la tarjeta microSD con Raspbian instalado en la Raspberry Pi.
  2. Conecte un teclado, un mouse y un monitor a la Raspberry Pi.
  3. Encienda la Raspberry Pi y espere a que se inicie Raspbian.

En lugar de usar un monitor, también puede conectarse a la Raspberry Pi de forma remota a través de SSH o VNC.

Paso 2: Abra una terminal
Usaremos la terminal para escribir nuestro código. Para abrir la terminal, haga clic en el icono de la terminal en el escritorio.

Paso 3: Cree un archivo de Python
En la terminal, escriba el siguiente comando:

nano hola.py

Esto crea un nuevo archivo llamado hello.py y lo abre en el editor de texto Nano.

Paso 4: Escriba el código
Escriba el siguiente código en Nano:

print("¡Hola mundo!")

Paso 5: Guarde el archivo
Presione Ctrl+X (cerrar y salir), luego Y (Sí, para guardar), luego Enter.

Paso 6: Ejecute el script
Para ejecutar el script, escriba el siguiente comando en la terminal:

python3 hola.py

Esto ejecutará el script de Python e imprimirá «¡Hola mundo!» a la consola.

Por cierto la Raspberry Pi Foundation ha lanzado un nuevo editor de código en línea para ayudar a jóvenes de 7 años en adelante a aprender a escribir código. El editor de código es gratuito y está diseñado para aquellos jóvenes que asisten a clubes de código, a CoderDojos, estudiantes en escuelas y aquellos que quieran aprender en casa. Permite a los aprendices escribir y ejecutar código Python en su navegador sin necesidad de configuración previa. El editor de código es seguro, accesible y adecuado para la edad, y permite a los jóvenes guardar sus proyectos en su cuenta de Raspberry Pi Foundation para continuar trabajando en ellos en la escuela o en casa y llevarlos a los clubes de código.

La Fundación Raspberry Pi agregará soporte para lenguajes de desarrollo web como HTML, CSS y JavaScript al editor de código en el futuro, así como características de colaboración y compartir proyectos. La Fundación Raspberry Pi es una organización sin fines de lucro que fabrica y vende la Raspberry Pi, una computadora de placa única y asequible, y promueve la educación en informática y tecnología a través de recursos y programas educativos gratuitos.

Este curso gratis se encuentra disponible en la plataforma de FutureLearn y puede acceder gratuitamente a él usando la opción FREE.

Para esto, debe unirse al curso y seleccionar la opción correspondiente, justo como en la siguiente imagen:

Puede acceder al curso usando este enlace.

Ejemplos de Python

Encuentra el primer número par en una lista

números = [3, 5, 7, 4, 9, 11, 8, 2]
i = 0
while i < len(números) and numeros[i] % 2 != 0:
i  += 1

if i < len(números):
    print("El primer número par es:", números[i])
else:
    print("No hay números pares en la matriz").

Primero, inicializamos una lista llamada números . Luego creamos la variable i y la establecemos en 0. Almacenaré el índice del elemento que contiene el primer número par. Nuestro ciclo while verifica dos condiciones: que i sea menor que la longitud de la matriz de números (para evitar un error de índice fuera de los límites) y que el número actual en la matriz en el índice i no sea par. Si ambas condiciones son verdaderas, incrementamos i y continuamos el bucle. La comprobación de si el número es par se realiza con mod (%), que devuelve el resto de una operación de división. Si el número dividido por 2 da un resto de 0, ese número es par y el bucle se detiene.

Después de salir del ciclo while , usamos una declaración if para verificar si encontramos un número par en la matriz. Si i es menor que la longitud de la matriz, imprimimos el número en el índice i (el índice donde se detuvo el ciclo). De lo contrario, imprimimos un mensaje que dice que no hay números pares en la matriz.

La salida del código debe ser:

El primer número par es: 4

Encuentra el promedio de una lista de números

numeros = [10, 20, 30, 40, 50]
suma = 0
cuenta = 0

for  num in numeros:
        sum += num
        count += 1

promedio = suma / cuenta

print("El promedio es ", promedio)

La lista inicial de enteros se llama números . Inicializamos dos variables, suma y cuenta , y las establecemos en 0. Usamos un ciclo for para iterar sobre cada elemento en números . Durante cada iteración, agregamos el elemento actual a sum e incrementamos count en 1. Después del ciclo, el promedio se puede calcular dividiendo sum por count .

La salida del código debe ser:

El promedio es 30.0

Leer/escribir en un archivo de texto

# abrir un archivo de texto para escribir. La instrucción 'with' cierra automáticamente el archivo después de completar la lectura (o escritura)
with open('example.txt', 'w') as f:
    # escribir algo de texto en el archivo
    f.write('¡Hola, mundo!\ n')     #El carácter '\n' se usa para crear una nueva línea en el archivo.
    f.write('Este es un archivo de texto de ejemplo.\n')
# abrir el mismo archivo de texto para lectura
with open('example.txt', 'r') as f:
    # leer el contenido del archivo
    contenido = f.read()

# imprime el contenido del archivo
print(contenido)

Los programas a menudo necesitan leer y escribir en archivos de texto. Los ejemplos incluyen la lectura de un archivo de configuración o JSON, o la escritura en un archivo de registro. En este ejemplo, abrimos un archivo de texto ( ejemplo.txt ) en el que queremos escribir, usando la función abrir y el modo w (escribir). Luego escribimos algo de texto en el archivo usando el método de escritura .

A continuación, abrimos el mismo archivo de texto usando la función abrir y el modo r (leer). Luego leemos el contenido del archivo en una variable llamada contenido usando el método de lectura .

Finalmente, imprimimos el contenido del archivo a la consola usando la función de impresión . Cuando ejecute este código, debería ver el siguiente resultado:

¡Hola Mundo!
Este es un archivo de texto de ejemplo.

Leer/Actualizar un archivo JSON

JSON (Notación de objetos de JavaScript) es un formato de intercambio de datos liviano que es fácil de leer y escribir para los humanos, y fácil de analizar y generar para las máquinas. En Python, el módulo json incorporado nos permite trabajar con datos JSON. Este ejemplo lee un archivo JSON, actualiza uno de sus campos y vuelve a escribir los datos modificados en un nuevo archivo JSON. Primero, supongamos que tenemos un archivo JSON llamado data.json con el siguiente contenido:

{
"nombre": "Alice",
"edad": 30,
"ciudad": "Nueva York"
}

El archivo se puede leer usando el método json.load() :

import json

with open('data.json', 'r') as f:
data = json.load(f)

print (datos)

Esto genera el contenido del archivo JSON:

{'nombre': 'Alice', 'edad': 30, 'ciudad': 'Nueva York'}

Si necesitamos actualizar la edad de este usuario a 31, simplemente asignamos un nuevo valor a la clave correspondiente en el diccionario de datos:

datos['edad'] = 31

print (datos)

Esto generará el diccionario actualizado:

{'nombre': 'Alice', 'edad': 31, 'ciudad': 'Nueva York'}

Ahora volvemos a escribir los datos modificados en un nuevo archivo JSON usando el método json.dump() :

with open('new_data.json', 'w') as f
json.dump(data, f)

Esto crea un nuevo archivo JSON (new_data.json) con el siguiente contenido:

{
"nombre": "Alice",
"edad": 31,
"ciudad": "Nueva York"
}

Conexión a una base de datos MySQL con Python

import mysql.conector

# Conéctese a la base de datos
conn = mysql.connector.connect(user='usuario', password='contraseña', host='host',database='base de datos')
#usuario, contraseña, host y base de datos son las credenciales de la base de datos MySQL a la que se está conectando

# Ejecutar una consulta
cursor = conn.cursor() 
#Un cursor es un objeto de acceso a datos que puede iterar o actualizar el conjunto de filas en una tabla consulta
query= "SELECT * FROM my_table"
#Este comando SQL recupera todas las filas de un tabla llamada my_table
cursor.execute(query)

# Obtener los resultados
de la fila en cursor.fetchall():
print(fila)

# Cerrar la conexión
cursor.close()
conn.close()

Este ejemplo se conecta a una base de datos MySQL y ejecuta una consulta SELECT en una tabla llamada my_table . Los resultados se obtienen y se imprimen en la consola.

Para conectarse a una base de datos MySQL, se requiere la biblioteca mysql-connector-python . La biblioteca se puede instalar usando pip :

pip install mysql-conector-python

Lectura de un sensor de temperatura con Python integrado

import machine
import time
# configurar sensor de temperatura

sensor = máquina.ADC(0)

# configurar el control del ventilador
fan_pin = machine.Pin(2, machine.Pin.OUT)

# leer la temperatura y controlar el ventilador 
while True:
temp = sensor.read()
if temp > 100:
   fan_pin.on()
else:
   fan_pin.off()
time.sleep(0.1)

El código importa el módulo de la máquina, que proporciona acceso al hardware en el microcontrolador. Configura un convertidor de analógico a digital (ADC) para leer desde un sensor de temperatura conectado al pin 0 del microcontrolador, y un pin de salida digital para controlar el ventilador conectado al pin 2 del microcontrolador.

Luego, el código ingresa a un ciclo while donde lee el sensor de temperatura y enciende o apaga el ventilador según la lectura. Si la lectura de temperatura es superior a 100, enciende el ventilador al configurar el pin del ventilador en ON. De lo contrario, apaga el ventilador colocando el pin del ventilador en APAGADO. Luego, el código espera 0,1 segundos antes de volver a leer el sensor de temperatura. La línea while True: le dice al bucle que se repita indefinidamente.

Otras formas de Python

Se han creado varios tipos diferentes de Python, cada uno con sus propias ventajas. Si bien la sintaxis es similar, muchas de las implementaciones se diseñaron para su uso en casos de uso específicos.

  • CPython: esta es la implementación predeterminada de Python, escrita en C. CPython es la más utilizada y es la implementación de referencia para Python.
  • Jython: Jython compila el código de Python en el código de bytes de Java, lo que permite que el código de Python se ejecute en la máquina virtual de Java (JVM).
  • IronPython: IronPython se ejecuta en el marco .NET. Está diseñado para integrarse a la perfección con el entorno .NET y permitir la interoperabilidad del código Python y .NET.
  • PyPy: PyPy es una implementación de alto rendimiento de Python, con un compilador justo a tiempo (JIT) que puede proporcionar mejoras de velocidad sobre CPython en muchos casos.
  • MicroPython: MicroPython es una versión de Python que está diseñada para ejecutarse en microcontroladores y otros sistemas integrados. Incluye un subconjunto reducido de la biblioteca estándar de Python y está optimizado para poca memoria y recursos informáticos limitados.
  • CircuitPython: CircuitPython es una variante de MicroPython que está optimizada para su uso con microcontroladores en circuitos y robótica. Proporciona una serie de bibliotecas y herramientas integradas, lo que facilita la integración con la electrónica y los sensores.

Plotter casero con Raspberry pi


Muchos de nosotros recordamos que nos enseñaron, o incluso fabricamos, trazadores de pantógrafos antes de que las herramientas gráficas formaran parte del conjunto de características informáticas estándar en el hogar o la oficina. Daniele Procida, gurú de la informática de código abierto, se acordó de un dispositivo de este tipo cuando, durante la planificación de la conferencia PyCon Namibia, pensó en un ejemplo de baja tecnología de las posibilidades de Raspberry Pi. El resultado, BrachioGraph, que dibuja retratos y reproduce imágenes de objetos, fue un éxito instantáneo, inspirando a un grupo de entusiastas creadores.

Daniele señala el contraste entre los recursos que suelen estar disponibles en las conferencias del Reino Unido y Europa y los de los países africanos anfitriones: «Una cosa es hacer cosas con robótica si tienes acceso a impresoras 3D, cortadoras láser y piezas y componentes disponibles en el mercado, y otra muy distinta si eres un estudiante universitario de la Universidad de Namibia, o un estudiante de secundaria y probablemente tienes que compartir un portátil o un ordenador». Combinado con el propio interés de Daniele, pero su falta de experiencia en robótica, decidió «hacer algo que fuera lo más asequible posible, pero también significativo y también accesible, que no requiriera un mínimo absoluto de materiales y conocimientos e instalaciones».

Captura de movimiento


Jugar con servos y Raspberry Pi fue el punto de partida del proyecto del dispositivo de trazado de Daniele. Moverlos era bastante fácil, pero él estaba ansioso por ver un resultado práctico: «¿Qué podemos hacer realmente?». Con la nostalgia de los pantógrafos y los trazadores aéreos XY en común, Daniele explica que encontró «su capacidad para reproducir algo que hacemos con las manos intrínsecamente fascinante. Cuando ves un bolígrafo moviéndose, parece que tiene un propósito».

Aunque los servomotores pueden utilizarse para accionar un dispositivo a lo largo de líneas rectas, traducir los movimientos y las líneas dibujadas a mano en una página es más una cuestión de ángulos. La cuestión, dice Daniele, era si podía convertir los movimientos en líneas sobre una página. «Claro que se puede, porque tu propio brazo, si estás dibujando con un bolígrafo, tampoco tiene motores que vayan en línea recta. Sólo utiliza ángulos». Empezó modelando el diseño a partir del de un pantógrafo, que imita fielmente el movimiento del brazo humano. Un BrachioGraph, por su parte, es un «trazador de brazo».

Se anima a los imitadores


El BrachioGraph se puede configurar para que funcione solo, lo que lo convierte en un expositor ideal para conferencias. «En una conferencia, pasé mucha vergüenza porque cogí prestada una mesa en la sala de los patrocinadores y dejé algo funcionando, trazando». Cuando volvió, había tres o cuatro personas alrededor de la mesa en la que estaba el BrachioGraph, acaparando toda la atención de los patrocinadores que habían comprado mesas.

Dada una imagen para copiar, el BrachioGraph es capaz de reproducirla. Daniele dice que, tras muchos borradores de diseño y experimentación, lo más importante no es que «haya construido esta cosa y funcione», sino que sea reproducible por otras personas y con materiales domésticos como palitos de helado, o cartón y lápiz, o ropa.

«Lo más bonito para mí es que, de vez en cuando, alguien me envía un correo electrónico y me dice: ‘Oh, era el cumpleaños de mi sobrina de 12 años y, cuando estaba de visita, cogí una Raspberry Pi y tres servomotores, y nos pasamos el fin de semana ‘haciendo un BrachioGraph'».

Construir el trazador


Este tutorial te lleva a través del proceso de construcción de un plotter con brazos de 8cm. Los brazos de 8 cm son adecuados para dibujar un área de aproximadamente 14 cm de ancho por 9 cm de alto. Esto se ajusta bien a una hoja de papel A5.

Componentes y materiales

Necesitaremos:

  • una Raspberry Pi
  • tres servomotores (modelo recomendado: TowerPro SG90 – ver servomotores para más información)
  • palos o cartulina rígida para hacer dos brazos de unos 10 cm de largo cada uno
  • cables de puente y conector GPIO para conectar la Pi a los servos
  • una pinza de la ropa
  • un tablero o una hoja de cartulina, de tamaño A4 aproximadamente
  • pegamento fuerte o pistola de pegamento caliente

. Montaje
La siguiente imagen muestra la construcción básica del trazador BrachioGraph y los nombres de algunas piezas clave. En este ejemplo, la hoja de dibujo es de tamaño A5.

El motor de hombro
El motor de hombro debe colocarse en la posición correcta. Puedes encontrar una posición adecuada utilizando la imagen de arriba como guía, pero mejor aún, imprime la plantilla suministrada. Fíjala a la placa. El eje del motor deberá colocarse en la posición 0, 0 según la cuadrícula, como se muestra a continuación:

El servomotor debe elevarse unos milímetros (entre 4 y 6 mm debería estar bien), por ejemplo con algunas capas de cartulina. Pégalo en su sitio.

El brazo interior
Pega los servocuernos -los pequeños brazos de plástico que se fijan a los husillos del motor- al brazo interior, de modo que los centros de rotación estén separados exactamente 8 cm.

El brazo exterior, la pinza y los servos
Pega un servo y una pinza de la ropa al brazo exterior, de modo que un bolígrafo en la pinza y el centro de rotación del brazo estén también exactamente a 8 cm de distancia.

Pega el servo final en una posición tal que su cuerno pueda girar con seguridad, y sea capaz de levantar el bolígrafo del papel – mira el primer plano de arriba.

Instalar el software


El siguiente paso es instalar el software. La biblioteca BrachioGraph requiere algunos componentes adicionales. Necesita ejecutarse en un entorno Python 3, utilizando Python 3.6 o posterior.

Instalar los paquetes del sistema

Es posible que ya tengas instalados algunos de ellos, pero eso no debería importar. Los paquetes incluyen:

  • venv, para gestionar entornos virtuales bajo Python 3
  • PIGPIO, una excelente librería que proporciona control por hardware de los pines GPIO de la Pi – importante para la sincronización precisa de los pulsos. Viene con una interfaz Python para el código de bajo nivel.
  • varias librerías de sistema requeridas por la librería de imágenes Pillow Python
  • libatlas3-base y libgfortran5, requeridas por la librería matemática Numpy Python
  • python3-tk, para la integración gráfica de Turtle
  • Git

Si su SO es Raspberry PiOS ejecutaremos los siguintes comandos en nuestra Pi:

sudo apt install -y python3-venv python3-tk pigpiod libjbig0 libjpeg-dev liblcms2-2 libopenjp2-7 libtiff5 libwebp6 libwebpdemux2 libwebpmux3 libzstd1 libatlas3-base libgfortran5 git

Configurar un entorno virtual
Crea y activa un entorno virtual Python en el que trabajar:

python3 -m venv env
source env/bin/activate

El entorno debe estar activo siempre que utilices el trazador. Puede saber cuando el entorno virtual está activo desde el prompt de bash:

(env) [email protected]:~ $


Si necesita reactivar el entorno, ejecuta source env/bin/activate una vez más, en este directorio,

Clonar el repositorio BrachioGraph
Utiliza Git para clonar el repositorio BrachioGraph desde https://github.com/evildmp/brachiograph:

git clone https://github.com/evildmp/BrachioGraph.git


O, si ya ha configurado una clave pública usando ssh-keygen y ha añadido su clave pública a su cuenta de GitHub, puede usar SSH en su lugar:

git clone [email protected]:evildmp/BrachioGraph.git

Instalar paquetes Python
Las versiones fijas de los paquetes Python están listadas en requirements.txt en el directorio BrachioGraph. Instálelos ejecutando

cd BrachioGraph
pip install -r requirements.txt


Esto instalará:

  • Numpy, una biblioteca matemática de Python
  • La biblioteca Python de PIGPIO
  • Pillow, la biblioteca de imágenes de Python más utilizada.
  • tqdm, para el indicador de progreso mientras se dibuja
  • readchar, para permitir que los métodos BrachioGraph.drive() acepten entradas del usuario
  • pytest, para ejecutar el conjunto de pruebas

Sólo tiene que instalarlos una vez en tu entorno virtual. La próxima vez que actives el entorno virtual, verás que siguen ahí.

Cablear el plóter


Asegúrese de que la Raspberry Pi está apagada mientras la conecta. Aunque las Raspberry Pis pueden soportar una cantidad francamente asombrosa de abuso, corre el riesgo de causar daños si se equivoca en el cableado. Hazlo con la alimentación apagada, tómese su tiempo y compruebe dos veces tu trabajo.

Hay que conectar los tres servos a la Raspberry Pi. Cada servo tiene tres cables:

  • 5V (alimentación) – normalmente naranja o rojo
  • Tierra – normalmente marrón
  • Señal – normalmente amarillo

5V y tierra son necesarios para alimentar el servo; el cable de señal lleva un pulso, cuya anchura (su longitud en microsegundos) determina la posición del motor.

Al menos dos de los servos tendrán que compartir una conexión de 5V, ya que la Raspberry Pi sólo tiene dos disponibles. La forma de conseguirlo dependerá de lo que tengas disponible.


Este es el listado de cada conexión desde el servo hasta la Raspberry Pi:

Es decir usamos la alimentación de 5v DC para alimentar los tres servos , y luego como cables de señal usamos los GPIO 14,15 y 18.

Poner en marcha el BrachioGraph

Antes de hacer nada, separe el brazo interior de los servos; de lo contrario, corre el riesgo de que la áquina se agite salvajemente cuando se activen los servos.

Crear una instancia de BrachioGraph
Encienda la Raspberry Pi. Ejecúte:

sudo pigpiod
source env/bin/activate
cd BrachioGraph
python

Y a continuación, en la shell de Python, importa la clase BrachioGraph del módulo brachiograph:

from brachiograph import BrachioGraph


Cree una instancia de BrachioGraph a partir de la clase:

bg = BrachioGraph()


Esto inicializa una instancia de BrachioGraph bg con la que puedes interactuar. Oirá el zumbido de los motores mientras los coloca en su posición por defecto, aparcados.

Colocación y prueba del brazo interior
Ahora vuelva a colocar el brazo interior, de modo que la máquina tenga más o menos este aspecto.

Debe estar lo más cerca posible de -90˚ (como se marca en la cuadrícula), pero no te preocupes si no lo está, lo ajustaremos más tarde.

Haga una prueba rápida:

bg.set_angles(0, 90)


El primer valor es el ángulo del brazo interior, el segundo el ángulo del brazo exterior. El brazo interior debería girar en el sentido de las agujas del reloj hasta aproximadamente 0˚. Devuélvelo a su punto inicial con:

bg.park()

Colocación y prueba del brazo exterior

Ahora vuelve a colocar el brazo exterior. Debe estar en una posición lo más cercana posible a 90˚ respecto al brazo interior:

Pruébas:

bg.set_angles(-90, 120)


El brazo debería girar en el sentido de las agujas del reloj desde su posición de 90˚ unos 30˚. Vuelve a aparcar los brazos con bg.park().

Ajuste el mecanismo de elevación de la pluma

Prueba a bajar y subir el motor de la pluma:

bg.pen.abajo()
bg.pen.up()


Ajuste la bocina del motor y la posición de la pluma en la pinza de la ropa para que en la posición baja la pluma toque firmemente el papel, y en la posición alta lo despeje uno o dos milímetros.

Comprobación del estado


Ejecutar:

bg.status()


El BrachioGraph informará de su estado:

Iniciar el trazado

Mover los brazos


El método set_pulse_widths() es una forma manual de establecer los anchos de pulso que determinan la posición de un servo. Prueba esto:

bg.set_pulse_widths(1500, 1500)


No debería pasar nada, porque esos ya son los anchos de pulso que está aplicando. Pero intenta incrementar el ancho de pulso del primer servo en 100 (microsegundos) – asegúrate de que los números son correctos, porque un valor erróneo puede hacer que los brazos vuelen:

bg.set_pulse_widths(1400, 1500)


Esto debería mover el brazo interior unos pocos grados en el sentido de las agujas del reloj. El primer valor controla el ancho de pulso del servo del hombro, y el segundo el ancho de pulso del servo del codo. Prueba diferentes valores para los dos servos, cambiándolos no más de 100 cada vez, hasta que los brazos parezcan perpendiculares entre sí y al área de dibujo.

Anote esos dos valores en un trozo de papel; los utilizaremos en el siguiente paso.

Servo

ancho de pulso en ángulo estacionado

Hombro (estacionado a -90˚)

Codo (estacionado a 90˚)

Inicializar un BrachioGraph personalizado

Por defecto, un BrachioGraph se inicializa con valores de 1500 para ambos servos (para la mayoría de los servos, 1500 µs los sitúa en el centro de su movimiento). Sin embargo, es probable que hayas encontrado que se necesitan valores ligeramente diferentes para alinear los brazos en los ángulos correctos. Digamos que los dos valores que anotaste en el paso anterior fueron:

1570 para el motor del hombro

1450 para el motor del codo.

En ese caso, reinicie el BrachioGraph utilizando los valores que has descubierto:

bg=BrachioGraph(servo_1_parked_pw=1570, servo_2_parked_pw=1450)

Empieze a dibujar
Ahora debería ser capaz de dibujar una caja:

bg.box(bounds=[-2, 7, 2, 11])


Esto significa: dibuja un rectángulo definido por las coordenadas -2, 7 en la esquina inferior izquierda y 2, 11 en la esquina superior derecha. Todo es siempre relativo al eje del motor del hombro en 0,0):

El BrachioGraph dibujará tu cuadrado. Será un cuadrado tambaleante e imperfecto, pero debería ser un cuadrado reconocible, de unos 4 cm de ancho y alto.Pruebe a aumentar progresivamente las dimensiones del recuadro, por ejemplo:

bg.box(bounds=[-3, 6, 3, 12])

Si tiene suerte, debería poder dibujar una caja que tenga el tamaño completo del área de dibujo por defecto. El comando status() que usaste arriba lo muestra:

abajo a la izquierda: (-8, 4) arriba a la derecha: (6, 13)
Para dibujar una caja alrededor de esta área, utilice el comando box() sin ningún parámetro:

bg.box()


Pruebe algunos patrones de prueba

Y ahora dibuja un patrón de prueba:

bg.test_pattern()


¿Qué ocurre si dibuja el patrón de prueba al revés?

bg.test_pattern(inverso=Verdadero)


Verá que los patrones se alinean de forma muy imperfecta. Esto se debe a la holgura y la fricción del sistema. En la próxima sección trataremos de mitigar esto, y en general mejorar la exactitud y precisión del trazador. Mientras tanto, vamos a dibujar una imagen de prueba.

Haga un dibujo

En el directorio de imágenes, encontrarás un archivo llamado demo.json. Éste contiene las líneas y los puntos a lo largo de ellas, representados como coordenadas en formato JSON, y es lo que el trazador utiliza para dibujar

Traze el archivo:

bg.plot_file("images/demo.json")

Mas información en https://www.brachiograph.art

Mejorar una impresora 3d


No todos los dispositivos electrónicos que adquirimos son «perfectos» ,admitiendo sin duda casi siempre mejoras ( algunas muy simples y otras bastante complejas) , las cuales a veces pueden significar llegar a superar características de otros productos con precios mucho mas elevados pertenecientes a otros rangos de calidad y características.

Si nos centramos en las impresoras 3d, es evidente que, dado el gran abanico de precios y opciones disponibles, partiendo de un modelo genérico tenemos un gran margen de mejora. A continuación presentamos algunas ideas:

  1. Actualizar el firmware: Actualizar el firmware de la impresora 3D puede mejorar su rendimiento y corregir posibles errores.
  2. Calibración: Asegurarse de que la impresora 3D esté correctamente calibrada es esencial para lograr impresiones precisas y de alta calidad.
  3. Actualización de software: Actualizar el software de la impresora 3D, como el software de control de impresión y el software de diseño de modelos 3D, puede mejorar su funcionalidad y capacidad.
  4. Cambio de boquilla: Cambiar la boquilla de la impresora 3D puede mejorar la calidad de impresión y permitir la impresión con diferentes materiales.
  5. Mejora de la cama de impresión: Mejorar la cama de impresión, por ejemplo, utilizando una superficie de vidrio o una base magnética, puede mejorar la adherencia del filamento y la calidad de la impresión.
  6. Mejora del extrusor: La extrusora es un componente clave en la impresora 3D, por lo que actualizarla o reemplazarla por una más avanzada puede mejorar la velocidad y la calidad de impresión.
  7. Mejora de la fuente de alimentación: Actualizar la fuente de alimentación de la impresora 3D puede mejorar su estabilidad y la calidad de la impresión.
  8. Utilización de ventiladores de enfriamiento: Agregar ventiladores de enfriamiento para enfriar el filamento durante la impresión puede mejorar la calidad de la impresión y prevenir el pandeo.
  9. Añadir nuevas características, como por ejemplo el «autolevel» , proteger con carcasas impresas en 3d partes muy expuestas, mejorar el guiado del filamento , cerrar el volumen ocupado por la impresora ,etc.

Es importante recordar que cualquier modificación o mejora realizada en una impresora 3D debe realizarse con cuidado y siguiendo las instrucciones del fabricante para evitar dañar la impresora o poner en riesgo la seguridad del usuario.

Cómo está definido el sistema de posicionamiento de la impresora.

Las impresoras son de tipo cartesiano, lo que significa que la impresión se realiza mediante movimientos en los tres ejes de un sistema de ese tipo. Este sistema conforma lo que se denomina el volumen de impresión, que para una A8 tiene un tamaño de 220x220x240 mm.

La pieza impresa se compone de varias capas apiladas en la dirección positiva del eje vertical (Z). Dichas capas se conforman mediante movimientos en el plano que definen los otros dos ejes (X e Y). El X va de izquierda a derecha y el Y de delante a atrás.

El origen de este plano (punto 0,0), se encuentra situado en la esquina delantera izquierda del soporte de impresión y se extiende (para la A8 de serie) 220 mm en cada eje, siendo el punto más alejado en el que se puede imprimir por tanto el (220,220).

El firmware, que es el software que controla la impresión, sabe dónde se encuentra en cada momento gracias a que, antes de comenzar a imprimir, comprueba donde se encuentra el punto (0,0,0) del espacio de trabajo. Esto lo realiza mediante los interruptores de fin de carrera, de los cuales existe uno para cada eje. Esta comprobación es lo que se denomina “hacer home”.

Los interruptores de los ejes X e Y (el del Z es caso aparte, ya que es ajustable) podrían estar colocados de forma que, al activarse, el centro de la boquilla del extrusor estuviese en el origen del plano de impresión (0,0), pero en la A8 no es así. Por ello, hay que indicarle al firmware a que distancia se queda de dicho punto en cada uno de esos ejes, para que lo tenga en cuenta y sepa dónde está realmente. Es lo que se denomina el desfase (offset, en inglés). Los desfases siempre son negativos o 0, ya que si no fuese así se perdería área de impresión.

Debido a estos desfases, la boquilla del extrusor puede moverse en un área mayor que el área de impresión, ya que a esta se le añaden aquellos en cada eje. A este área ampliada podemos denominarla el área de desplazamiento.

Esta es con la que realmente trabaja el firmware y, por defecto, está configurado para que la boquilla del extrusor no pueda exceder sus límites. Aunque, como veremos más adelante, eso se puede cambiar.

Con un esquema quedará más claro:

AutoLevel

El autonivel o autonivelado en una impresora 3D es una función que permite a la impresora ajustar automáticamente la posición de la cama de impresión para asegurarse de que la distancia entre la boquilla y la superficie de impresión sea constante en toda la superficie de impresión.

El proceso de nivelación manual de la cama de impresión puede ser complicado y requiere cierta habilidad y paciencia. Con la función de autonivelado, se utiliza un sensor o sonda para medir la distancia entre la boquilla y la superficie de impresión en diferentes puntos de la cama de impresión. Una vez que se mide la altura de la cama en diferentes puntos, la impresora ajusta automáticamente la altura de la boquilla para asegurarse de que esté a la misma distancia de la superficie de impresión en toda la superficie de impresión.

El autonivelado es especialmente útil en impresoras 3D con una cama de impresión grande o curva, ya que la superficie de impresión puede ser irregular y difícil de nivelar manualmente. El autonivelado también puede ayudar a mejorar la calidad de impresión y evitar que la boquilla se dañe si se encuentra con una superficie desigual.

Implementar el autolevel es un proceso laborioso, que incluye el cambio del firmware original y en algunos casos, realizar algún pequeño montaje eléctrico. Por lo que, si decide hacerlo, será por su cuenta y riesgo. En este post como ejemplo lo vamos a ver para la A8, pero es evidente que para otros modelos es una operación muy similar

Actualización del Firmware de la impresora

Marlin es un firmware de código abierto para impresoras 3D que se utiliza comúnmente en impresoras 3D de escritorio y de código abierto siendo por tanto uno de los firmware más populares y utilizados en la comunidad de impresión 3D debido a su flexibilidad, capacidad de personalización y estabilidad.

Marlin se puede personalizar para adaptarse a las necesidades específicas de cada impresora 3D, lo que significa que es compatible con una amplia gama de hardware y componentes. El firmware proporciona una variedad de funciones avanzadas para la impresión 3D, como el autonivelado, el control de temperatura y la protección contra fallas de energía. Además, Marlin también admite una variedad de características avanzadas, como la impresión de varias piezas al mismo tiempo, la detección de filamentos y la impresión en múltiples extrusoras.

El firmware Marlin se ejecuta en la placa controladora de la impresora 3D y se comunica con el software de host de la impresora a través de una conexión USB. Marlin se puede configurar y personalizar utilizando un archivo de configuración, que es un archivo de texto que contiene información sobre las características de hardware y las opciones de configuración para la impresora 3D.

Marlin es un proyecto de código abierto, lo que significa que cualquier persona puede contribuir a su desarrollo y mejora. La comunidad de impresión 3D ha creado muchas versiones personalizadas de Marlin que incluyen características específicas, como la compatibilidad con diferentes sensores y componentes.

Antes de nada decir que el cambio de firmware tiene una repercusión mínima, si es que tiene alguna, en la calidad de impresión. El firmware se limita a controlar el hardware para realizar las ordenes que se le pasan en formato gcode, por lo que por ahí hay poco margen para la mejora.

Las ventajas de ir a un firmware abierto son:

  • Permitir un control total sobre todos los parámetros de la configuración del mismo.
  • Da la posibilidad de implementar funciones que no permite el original como por ejemplo, el autolevel.

Como se ha comentado el firmware más interesante actualmente es Marlin, tanto por características como por la gran comunidad que tiene detrás. Hasta hace poco, no soportaba las placas Anet y por ello había que utilizar una versión preparada para ellas denominada Skynet3D. Pero la última versión de Marlin ya las soporta y parece ser que han abandonado el desarrollo de Skynet.

La última versión de Marlin (en el momento de escribir esto) es la 1.1.6, se puede descargar de aquí. Para configurar y cargar el firmware utilizaremos el IDE de Arduino. En versiones anteriores venía incluido en Marlin, pero en esta última versión ya no viene, por lo que hay que descargarlo directamente de su página aquí.Al contrario que Marlin, el IDE de Arduino no trae configurada la placa Anet. Para poder utilizarla, hay que descargar los datos de la placa y colocarlos en él. Se pueden descargar de aquí.
Una vez descargados y descomprimidos los tres zip, tendremos todo lo necesario para configurar y cargar el firmware en la impresora. Conviene ponerlos juntos en una misma carpeta, para no andar dando vueltas. Por ejemplo, nos quedaría así:

resim

Ahora, copiamos la carpeta anet-board-master\hardware\Anet y la pegamos dentro de la carpeta arduino-1.8.5\hardware\. Así tendremos la placa Anet 1.0 en el IDE de Arduino.

Marlin trae, en la carpeta Marlin-1.1.x\Marlin\example_configurations\Anet\, dos carpetas (A8 y A6) que tienen dentro los archivos Configuration.h y Configuration_adv.h, ya preconfigurados para esas máquinas.
Copiaremos los dos archivos correspondientes (dependiendo de la máquina que tengamos), en la carpeta Marlin-1.1.x\Marlin\, indicando que sustituyan a los que ya existen en ella con el mismo nombre.

A partir de aquí en este post asumiremos que la máquina es una A8 ( obviamente amigo lector si tiene una impresora distinta, tendra que cambiar los datos que varían de una máquina a otra donde corresponda).

Ejecutamos el archivo arduino.exe, que se encuentra en la carpeta arduino-1.8.5:

resim

En el menú Archivo, seleccionamos Abrir y buscamos el archivo Marlin.ino que se encuentra en la ruta Marlin-1.1.x\Marlin\. Pulsamos Abrir.

En la parte superior de la ventana aparecen una serie de pestañas, que se corresponden con todos los archivos que forman Marlin. Dado que hay muchos y no caben todas sus pestañas en la pantalla, a la derecha de ellas hay una flecha que despliega todas las que hay.

Normalmente, la configuración suele ser desactivar o activar unos parámetros concretos o bien darles un valor. Lo primero se hace poniendo o quitando (comentando o descomentando), delante del parámetro de que se trate, una doble barra hacia la derecha (//).

Los valores se indican después del parámetro, con uno o varios espacios entre ellos. 

Seleccionamos la pestaña configuration.h. En este fichero vamos a personalizar algunos parámetros que se acomoden a nuestra impresora. Antes de continuar mencionar que hay muchas personas que se desespera buscando un parámetro concreto de configuración en un fichero tan extenso. Para que no le pase esto, puede usar la utilidad de búsqueda: en el menú Editar, seleccione Buscar, en el cuadro de diálogo se pone el parámetro que esta buscando como por ejemplo, LCD_LANGUAGE y desmarque la opción Buscar en todas las Pestañas de Sketchs, para que solo busque en la pestaña que estamos y al pulsar Buscar, se posicionará en el primer punto donde se encuentre ese parámetro.

resim

Como era de esperar , si no es el que buscamos, pulsando de nuevo buscará el siguiente y así hasta que no encuentre más.

Este archivo ya está preparado para utilizarlo directamente con la A8, pero podemos cambiar un par de cosas para que quede mejor: la lengua en que se muestran los mensajes de la pantalla de la impresora y el nombre que se muestra en la pantalla de inicio.

  • Para lo primero, hay que buscar la línea #define LCD_LANGUAGE en y cambiar el en por el código de la que nos interese. Hay un listado con los disponibles, justo encima de esa línea.
  • Para lo segundo, al principio del configuration.h debera descomentar (quitar la // del principio) la línea //#define CUSTOM_MACHINE_NAME «3D Printer», sustituyendo lo que hay entre las comillas por el nombre que quiera que aparezca. Tenga en cuenta que la línea de la pantalla original tiene un tamaño de 19 caracteres y que el nombre que ponga se mostrará así: nombre lista.. .Por cierto las palabras que aparecen en la pantalla se pueden cambiar por las que nosotros queramos, siempre teniendo en cuenta lo comentado para el tamaño de las líneas.Para ello, tenemos que buscar la pestaña correspondiente a la lengua de que se trate, que tendrá el nombre language_código.h. En este archivo se encuentran las palabras que pueden aparecer en la pantalla y se pueden cambiar por lo que se quiera (sin perder de vista de qué se trata o tendréis después problemas para interpretar la pantalla).

Con lo realizado hasta ahora, el firmware es operativo y puede sustituir ya al original, imprimiendo la impresora con él sin ningún problema. Pero aún no está configurado para realizar el autolevel ni para controlar el sensor, por lo que si se utiliza ya, hay que hacerlo con el interruptor de fin de carrera mecánico en Z.

Ahora vamos al menú Archivo y seleccionamos Salvar para guardar los cambios. Ya podemos cargarlo en la impresora.

Para hacerlo, necesitamos tener la impresora conectada por USB al ordenador y tener instalado el driver CH340. Si no se instala automáticamente al conectar y encender la impresora, se puede hacer manualmente utilizando el driver que se encuentra en la tarjeta de memoria que viene con ella.

Una vez instalado el driver y conectada la impresora, al encenderla se le asigna un puerto COMx (donde x es un número). Hay que mirar cual es este número. Se puede ver en el Administrador de Dispositivos, en el apartado Puertos COM y LPT:

resim

En el menú Herramientas, seleccionaremos en el apartado Placa:”Anet V1.0“, en el apartado Puerto:”COMx” el que tenga asignado la impresora y en Programador:” USBasp“.

Quedará tal que así (cambiar el COM3 por el que corresponda):

resim

Ahora, pulsando sobre el botón circular con una flecha dentro (Subir), se compilará y se cargará en la impresora el firmware.

resim

Cuando termine (pondrá Subido), se reiniciará la impresora y aparecerá el nuevo mensaje de bienvenida. Y ya tendremos operativa la impresora con el nuevo firmware cargado, pero aún sin autolevel.

ELECTRONICA NECESARIA PARA IMPLEMENTAR EL AUTOLEVEL


Lo primero que hay que hacer es decidir qué tipo de sensor vamos a utilizar. A grandes rasgos, los sensores se dividen en dos tipos: de proximidad y de contacto. Los primeros detectan la cama a distancia, mientras que los segundos necesitan tocarla para realizar la detección. Lógicamente, estos últimos son algo más complejos, ya que tienen que implementar un sistema para desplegar la sonda de contacto antes de medir y para retraerla una vez hecha la medición, ya que sino esta entraría en contacto con la pieza durante la impresión.De este tipo son los BLTouch y similares. Los de proximidad pueden ser de muchos tipos, pero los que más se utilizan en las impresoras 3D suelen ser dos: inductivos o capacitivos. La diferencia entre ellos es el tipo de material que pueden detectar: los inductivos solo detectan metal, mientras que los capacitivos pueden detectar una gama más amplia, incluyendo vidrio y plásticos.

A efectos prácticos, los dos funcionan perfectamente, por lo que la decisión de usar uno u otro depende de sobre qué vamos a imprimir: si es sobre la cama directamente o con cinta, nos valen los dos; si vamos a poner un vidrio, por ejemplo, es conveniente poner uno capacitivo ya que, aunque hay algunos sensores inductivos que funcionan a través del vidrio, la mayoría no lo hacen.

Una vez hemos decidido que sensor utilizar, tenemos que fijarlo en el conjunto del extrusor, ya que tienen que moverse juntos. Naturalmente, habrá que implementar un soporte que se pueda anclar en algún punto de aquel, lo suficientemente robusto para que el sensor no se mueva una vez fijado en él.

Dos cosas hay que tener en cuenta:

  • Debemos procurar que el eje vertical que pasa por el centro del sensor, quede lo más cerca posible del eje vertical que pasa por el centro del agujero de la boquilla del extrusor
  • Hay que colocarlo de forma que se pueda regular su distancia a la superficie a detectar.


Si no diseñamos nuestras propias piezas, por ejemplo en thingiverse.com hay muchos modelos, tendremos que buscar el que sirva para nuestro conjunto máquina-sensor y que mejor cumpla con las dos condiciones anteriores.


El aspecto de la adición del nuevo sensor y el de configuración (extraido de la página de spainlabs.com ), es evidente que son las partes que más problemas pueden presentar.

A la hora del conexionado, hay que tener en cuenta dos aspectos: la alimentación del sensor y la forma en que entrega la señal de detección. Veamos primero la alimentación.

Los sensores de proximidad, ya sean inductivos o capacitivos, se suelen conectar a la placa de la impresora de la forma más sencilla: sustituyendo al interruptor mecánico de fin de carrera del eje Z y utilizando su conector en la placa. Esto presenta un problema: en los conectores de final de carrera solo hay 5V y no todos los sensores pueden trabajar con tan poco voltaje. Además, saber si un sensor funciona o no directamente conectado al conector de fin de carrera, no es fácil sin probarlo. Externamente, los de un mismo modelo son todos iguales, ya que hay una infinidad de fabricantes para las mismas referencias. Pero la construcción interna varía mucho de unos a otros y unos sí funcionan y otros no.

Todos los sensores de proximidad que se venden para este fin, en sus características indican una corriente de funcionamiento superior a 5V, normalmente entre 6-36V o 10-30V (pero, a pesar de ello, algunos pueden hacerlo solo con 5V). Parece ser que el tipo SN04 de tipo inductivo es uno de ellos, a pesar de poner en sus características diga que hay que alimentarlo con entre 10V y 30V.

Entre los capacitivos, el más utilizado es el tipo LJC18A3-H-Z/BX, que, aunque haya algunas personas que digan que funcionan a 5V parece ser que no es asi

El conexionado de estos sensores (suponiendo que funcionen a 5V) es muy sencillo e incluso algunos ya traen colocado el conector. Todos los que conozco utilizan un convenio estándar de colores para los cables: marrón, negro y azul:

  • El marrón es el positivo de alimentación del sensor (+VCC)
  • El azul el negativo (GND)
  • El negro el de señal.

La asignación de colores en el conector de la placa es el siguiente:

resim

La señal es el otro aspecto a tener en cuenta. Atendiendo a como entregan esa señal de activación, los sensores pueden ser de cuatro tipos: NPN-NO, NPN-NC, PNP-NO y PNP-NC.

Las siglas antes del guion, nos indican que tipo de señal da el sensor. Estos sensores son como interruptores electrónicos que, al activarse, conectan el cable de señal (negro) con uno de los otros dos (marrón o azul). Los NPN son los que lo hacen con el azul, los PNP los que lo hacen con el marrón. Las siglas después del guion, indican el estado del sensor cuando está inactivo: el NO indica que está abierto (es decir, no da señal) y el NC que está cerrado (da señal).

Para las Anet se necesita un sensor del tipo NPN-NO, ya que la placa interpreta como activado el fin de carrera, cuando el pin de señal del conector se pone a 0V (GND).

En el caso de que nuestro sensor funcione con los 5V del conector, ya lo tenemos resuelto. Pero si no lo hace (y queremos usarlo de todas formas), tendremos que alimentarlo con un voltaje en su rango de funcionamiento.

En las placas Anet solo tenemos accesibles dos voltajes en CC: uno el ya mencionado de 5V y otro el general de 12V.

Por suerte, este último se encuentra dentro de los límites de todos los sensores, por lo que nos sirve perfectamente, salvo por un aspecto: cuando el sensor NPN-NO no está activado (no da señal), por el cable de señal da un voltaje ligeramente menor que el de alimentación, es decir, más cercano a los 12V con los que lo estamos alimentando, que a los 5V que admite la placa por el conector de fin de carrera. Para solucionar esto, podemos usar un regulador de tension de 5v ( por ejemplo el 7805 genérico o el 78L05 para baja corriente) o bien implementar un divisor de voltaje usando un diodo Zener en polarización inversa. Es decir, con el cátodo a positivo y el ánodo a negativo.

El esquema de conexión sería este:

resim


Una vez colocado y conectado el sensor, antes de seguir adelante, habrá que probar que funciona. Para ello, colocaremos el carro del extrusor suficientemente alto para tener margen de maniobra y le daremos una orden de movimiento hacia abajo en el eje Z. Colocando un objeto apropiado delante del sensor, este tiene que actuar como si fuese el interruptor de fin de carrera, deteniendo el avance. Si no sucede así, apagaremos la impresora antes de que la boquilla choque con algo (para eso el margen de maniobra) y comprobaremos qué es lo que está mal.

Una vez tengamos colocado, conectado y funcionando el sensor, solo nos queda regular su altura. Para ello, deberemos tener la superficie de impresión tal y como la vayamos a usar. Todos los sensores tienen una sensibilidad que fija la distancia máxima de detección. En algunos esta sensibilidad es variable y se puede ajustar mediante un potenciómetro. Si nuestro sensor es de sensibilidad regulable, conviene regularlo para obtener la distancia máxima posible de detección.

Para medirla, movemos el eje Z con la mano hasta que se active el sensor (enciende la luz) y medimos la altura a la que queda de la superficie detectada.

Una solución sencilla para la regulación de la altura del sensor, es dejarlo a una tal que cuando se active, la boquilla del extrusor se encuentre a una distancia de la cama igual a la mitad de la distancia de detección aproximadamente. Tal que así:

resim

Con ello, nos aseguramos que el sensor no choque con nada durante la impresión y que, en caso de fallo en la detección (que ocurre algunas veces, no tengo claro el porqué), tengamos algo de margen para parar todo antes de que choque la boquilla con la cama.

Una vez colocado probaremos, moviendo a mano el eje Z, que la luz del sensor se activa en el lugar adecuado.

Un punto importante a tener en cuenta es que, una vez montado el sensor y hasta que se configure adecuadamente el firmware, hay que tener cuidado de no hacer home al eje Z, ya que podría hacerlo con el sensor fuera de la cama y al no activarse el fin de carrera, podrían producirse daños.

Con esto quedaría lista la parte física, quedando solo ya la configuración del firmware para que controle correctamente el sensor y el proceso de autolevel.

Configuración del firmware

El software que crea el archivo que incluye los comandos gcode que definen la pieza (el fileteador o “slicer”), posiciona los puntos referidos al área de impresión, por lo que el firmware realiza una conversión al área de desplazamiento, que es la que él maneja, simplemente restando el desfase que tenga programado. Por eso es importante tener bien configurados esos desfases.

Teniendo todo esto en cuenta, vamos a configurar el firmware.

Para empezar, ejecutamos el IDE de Arduino y nos colocamos en la pestaña configuration.h, como vimos en el cambio del firmware.

Lo primero que vamos a hacer, por si se nos va la mano y hacemos un home all, es configurar lo que se denomina en inglés Z Safe Homing, que es definir un punto seguro para que el eje Z haga home o, lo que es lo mismo, un punto donde el sensor esté sobre la superficie a detectar.

Se realiza en las siguientes líneas (recordad lo que indiqué para encontrar parámetros):

//#define Z_SAFE_HOMING
#if ENABLED(Z_SAFE_HOMING)
  #define Z_SAFE_HOMING_X_POINT ((X_BED_SIZE) / 2)    // X point for Z homing when homing all axis (G28).
  #define Z_SAFE_HOMING_Y_POINT ((Y_BED_SIZE) / 2)    // Y point for Z homing when homing all axis (G28).
#endif

y para activarlo, descomentamos la primera línea.

Por defecto, el punto que trae configurado es el centro de la cama (X_BED_SIZE / 2, Y_BED_SIZE/ 2), ya que ahí es casi completamente seguro que el sensor estará sobre la superficie de impresión, pero podemos indicar el que queramos siempre que se cumpla para él ese requisito.

Aprovechando que estamos aquí, justo debajo se encuentran las líneas que definen la velocidad con que se hace el home en los distintos ejes.

Son las líneas:

#define HOMING_FEEDRATE_XY (100*60)
#define HOMING_FEEDRATE_Z  (4*60)


La primera define la de los ejes X e Y. Por defecto viene a 100 mm/s.
La segunda define la del eje Z. Por defecto está a 4 mm/s, lo que para mi gusto es un poco lento. Yo la tengo a 6 mm/s:

#define HOMING_FEEDRATE_Z  (6*60)

Con estos cambios, ya podemos volver a subir el firmware a la impresora y a partir de este momento, ya podemos hacer un home all con seguridad.

La primera vez conviene tener una mano sobre el interruptor para que, en caso de que no se active el sensor (cosa que pasa alguna vez, aún no sé muy bien porqué), parar la impresora rápidamente.

Lo primero que tenemos que comprobar es que estén bien los desfases para nuestra máquina. Son los valores de los parámetros X_MIN_POS e Y_MIN_POS.

Como vimos al realizar el cambio a Marlin, este trae unos archivos para la A8 ya configurados con los valores que suele tener el montaje original (-33 para el X y -10 para el Y).

Para comprobarlos no podemos emplear el home all, dado que tenemos activado el Z Safe Homing y este nos lleva el extrusor al centro de la cama. Hay que hacer un home solo de X e Y, enviando el comando gcode G28 X0 Y0.

Tendremos que conectar la impresora al ordenador mediante el cable USB y utilizar una aplicación que permita enviar comandos gcode. Yo utilizo Pronterface, que podeis descargar de aquí. Después de descomprimir el archivo zip, tendremos una carpeta con la aplicación Pronterface.exe en su interior.

Al ejecutarla, nos sale esta pantalla:

resim

En la parte superior izquierda de la ventana, configuramos el puerto COMx asignado a la impresora y la velocidad de conexión a 115200 baudios. Pulsamos Conectar.

Nos aparecerá la información con la configuración actual de algunos parámetros de la impresora.

Para enviar el comando, escribimos en el campo de texto de abajo a la derecha G28 X0 Y0 y luego pulsamos Send (o la tecla Intro). El extrusor se colocará en el punto de activación de los finales de carrera de X e Y. Después conviene pulsar en Motors off, que está debajo del puerto, para desactivar los motores.

Una vez en esa posición, tenemos que medir a que distancia está el centro del agujero de la boquilla del extrusor de los bordes izquierdo y delantero de la superficie de impresión. Esos serán los desfases para nuestra máquina.

También tenemos que medir la distancia (en X y en Y), a la que se encuentra el centro del sensor del centro del agujero de la boquilla del extrusor.

Si son hacia la izquierda o hacia delante, se toman como negativas (porque van en el sentido negativo de los ejes X e Y, como vimos).

Anotamos esos cuatro valores para usarlos más tarde. Serían los valores A, B, C y D del siguiente esquema:

resim

En este ejemplo A, B y D serían negativas y C positiva.

Una vez tengamos esas medidas, comenzamos la configuración.

Cargamos el configuration.h en el IDE de Arduino y bajamos hasta la sección Z Probe Options.

Dado que estamos usando para el sensor la conexión del final de carrera del eje Z, descomentamos la línea:

#define Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN

Como utilizamos un sensor fijo, descomentamos la línea:

#define FIX_MOUNTED_PROBE

Más abajo, en la línea:

#define X_PROBE_OFFSET_FROM_EXTRUDER 0   // X offset: -left  +right  [of the nozzle]

en lugar del 0 pondremos el valor medido para C (positivo o negativo).

En la línea:

#define Y_PROBE_OFFSET_FROM_EXTRUDER 0   // Y offset: -front +behind [the nozzle]

en lugar del 0 pondremos el valor medido para D (positivo o negativo).

La línea:

#define Z_PROBE_OFFSET_FROM_EXTRUDER 0   // Z offset: -below +above  [the nozzle]

la dejamos como está. El Z Probe Offset lo definiremos más tarde.

Más abajo, en la línea:

#define X_MIN_POS 0

en lugar del 0 pondremos el valor medido para A (debería ser siempre negativo o 0).

En la línea siguiente:

#define Y_MIN_POS 0

en lugar del 0 pondremos el valor medido para B (debería ser siempre negativo o 0).

Ahora viene un punto importante.
 
Como vimos cuando comentamos el sistema de posicionamiento, el firmware viene configurado por defecto para impedir los movimientos más allá de la activación de los finales de carrera.
 
Pero, dado que el sensor se activa mucho antes de que la boquilla del extrusor esté a la distancia correcta para comenzar la impresión, hay que sobrepasar ese punto de activación del sensor para llegar a ella, por lo que hay que eliminar esa limitación.
 
Se encuentra aquí:

// If enabled, axes won’t move below MIN_POS in response to movement commands.
#define MIN_SOFTWARE_ENDSTOPS
 
Para evitar la limitación, hay que comentar esa línea. Pero es una cosa que no me gusta mucho, ya que afecta a todos los ejes y al estar fijos los interruptores de fin de carrera para los ejes X e Y, se podrían producir desperfectos en caso de órdenes de movimiento incorrectas.
 
Marlin no lo tiene por separado para el eje Z, pero vamos a solucionarlo pues en la versión 1.1.8 han separado por ejes la desactivación de los límites. Si se utiliza ya esta última versión, ya no es necesario realizar lo que viene después :

Para ello, vamos a definir un nuevo parámetro que llamaremos MIN_SOFTWARE_ENDSTOP_Z, quedaría así:
 
// If enabled, axes won’t move below MIN_POS in response to movement commands.
#define MIN_SOFTWARE_ENDSTOPS

// Si está activado, el eje Z no se podrá mover por debajo de su MIN_POS en respuesta a comandos de movimiento.
//#define MIN_SOFTWARE_ENDSTOP_Z

// If enabled, axes won’t move above MAX_POS in response to movement commands.
#define MAX_SOFTWARE_ENDSTOPS
 
Ahora vamos a la pestaña Marlin_main.cpp y buscamos las líneas:

#if ENABLED(MIN_SOFTWARE_ENDSTOPS)
      #if DISABLED(DELTA)
        NOLESS(target[X_AXIS], soft_endstop_min[X_AXIS]);
        NOLESS(target[Y_AXIS], soft_endstop_min[Y_AXIS]);
      #endif
      NOLESS(target[Z_AXIS], soft_endstop_min[Z_AXIS]);

y lo dejamos así:

#if ENABLED(MIN_SOFTWARE_ENDSTOPS)
      #if DISABLED(DELTA)
        NOLESS(target[X_AXIS], soft_endstop_min[X_AXIS]);
        NOLESS(target[Y_AXIS], soft_endstop_min[Y_AXIS]);
      #endif
      #if ENABLED(MIN_SOFTWARE_ENDSTOP_Z)
        NOLESS(target[Z_AXIS], soft_endstop_min[Z_AXIS]);
      #endif
 

Ahora el código viene así:

#define MIN_SOFTWARE_ENDSTOPS
#if ENABLED(MIN_SOFTWARE_ENDSTOPS)
  #define MIN_SOFTWARE_ENDSTOP_X
  #define MIN_SOFTWARE_ENDSTOP_Y
  #define MIN_SOFTWARE_ENDSTOP_Z
#endif

Y solo tendremos que comentar la línea del eje Z para deshabilitar la limitación de ese eje.

Dado que han denominado igual que yo el nuevo parámetro, el texto puede seguir igual a partir de aquí.

Con eso ya tendremos desactivada la limitación únicamente para el eje Z. Si queremos activarla, solo tendremos que des-comentar la línea //#define MIN_SOFTWARE_ENDSTOP_Z en configuration.h.

Volvemos a la pestaña configuration.h.

Más abajo, en la sección Bed Leveling, debemos seleccionar el tipo de autolevel que queremos utilizar. Si utilizamos el LINEAR, por descomentaremos este, quedando así:

//#define AUTO_BED_LEVELING_3POINT
#define AUTO_BED_LEVELING_LINEAR
//#define AUTO_BED_LEVELING_BILINEAR
//#define AUTO_BED_LEVELING_UBL
//#define MESH_BED_LEVELING


Más abajo, definimos el número de puntos de medición que tendrá la rejilla del autolevel.

En las siguientes líneas:

#define GRID_MAX_POINTS_X 3
#define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X

se definen las filas y columnas de la rejilla.

Por defecto está configurada una de 3×3=9 puntos. Se puede probar otras configuraciones con más puntos, pero no parecen mejoras apreciable, así que la dejaremos así. A continuación vamos a ver un ultimo ajuste con el que muchas persona tiene problemas: los límites de la rejilla de medición.

DEFINIR LA REJILLA DE MEDICION

La forma de definir la rejilla de medición del autolevel es posible gracias a que se ha incorporado un nuevo parámetro, con la línea:

#define  MIN_PROBE_EDGE 10

Lo cual indica lo que puede acercarse el sensor a los bordes de la cama definida. Por otro lado, por defecto vienen comentadas las líneas donde se definen los límites de la rejilla, ya que ahora si no se definen de forma explícita, se calculan de forma automática para conseguir la rejilla máxima, por lo que no es necesario configurarlos a no ser que se quiera centrar la rejilla.
Las líneas de definición de la rejilla, ahora vienen así:

//#define LEFT_PROBE_BED_POSITION MIN_PROBE_EDGE
//#define RIGHT_PROBE_BED_POSITION (X_BED_SIZE – MIN_PROBE_EDGE)
//#define FRONT_PROBE_BED_POSITION MIN_PROBE_EDGE
//#define BACK_PROBE_BED_POSITION (Y_BED_SIZE – MIN_PROBE_EDGE)


Por todo ello, ahora se puede configurar este tema de dos maneras: dejarlo como viene por defecto y que sea él mismo quien calcule la rejilla máxima o bien haciéndolo como hasta ahora, pero teniendo en cuenta el valor que se configure para MIN_PROBE_EDGE.
Si le damos el valor 0, estaríamos en la situación que teníamos hasta esta modificación y el cálculo sería como se indicaba hasta ahora en el tutorial.
Si tiene un valor mayor que 0, hay que aplicárselo a los valores que calculábamos hasta ahora, si estos están más cerca del borde de la cama que dicho valor.

Se configura en las siguientes líneas:

#define LEFT_PROBE_BED_POSITION
#define RIGHT_PROBE_BED_POSITION
#define FRONT_PROBE_BED_POSITION
#define BACK_PROBE_BED_POSITION


Y los problemas vienen porque a los valores que se indiquen ahí, tiene que poder llegar el sensor. Si no es así, nos dará un error al compilar el firmware.

Esos valores están referidos al área de desplazamiento por lo que, para llegar a ellos, la boquilla del extrusor no puede salirse de ella.

Dado que el sensor tiene que detectar la cama, tampoco deben estar fuera del área de impresión o no habrá nada debajo de él que pueda detectar.

Los límites máximos para una rejilla funcional son (recordad que los valores A, B, C y D pueden ser positivos o negativos):

Para #define LEFT_PROBE_BED_POSITION, con el sensor a la izquierda de la boquilla, 0. Con el sensor a la derecha de la boquilla, A+C si es mayor o igual que 0. Sino, 0.

Para #define RIGHT_PROBE_BED_POSITION, con el sensor a la izquierda de la boquilla, 220+C. Con el sensor a la derecha de la boquilla, 220.

Para #define FRONT_PROBE_BED_POSITION, con el sensor hacia delante de la boquilla, 0. Con el sensor hacia atrás de la boquilla, B+D si es mayor o igual que 0. Sino, 0.

Para #define BACK_PROBE_BED_POSITION, con el sensor hacia delante de la boquilla, 220+D. Con el sensor hacia atrás de la boquilla, 220.

Por esto es conviene colocar el sensor lo más cercano que se pueda a la boquilla, ya que así maximizamos el tamaño de la rejilla que se puede usar. Veámoslo con un ejemplo.

Supongamos que tenemos el sensor situado como vimos en el esquema de las medidas. Es decir, a la derecha y por delante de la boquilla, por lo que A, B y D serán negativas y C, positiva. Y que hemos obtenido para las mediciones los siguientes valores: A=-33 mm, B=-10 mm, C=30 mm y D=-10 mm.

Con esos valores, los límites de la rejilla de medición máxima serían:

#define LEFT_PROBE_BED_POSITION 0 –> (A+C=-33+30=-3, menor que cero, luego 0).
#define RIGHT_PROBE_BED_POSITION 220 –> (sensor a la derecha, luego 220).
#define FRONT_PROBE_BED_POSITION 0 –> (sensor hacia delante de la boquilla, luego 0).
#define BACK_PROBE_BED_POSITION 210 –> (220+D=220+(-10)=210, luego 210).

Esa sería la rejilla máxima que se podría configurar en esta máquina sin que diese error al compilar y con el sensor siempre dentro del área de impresión.

Pero es conveniente que la rejilla esté centrada y esta no lo está.

Para centrarla maximizando su tamaño, hay que mirar cual es la mayor distancia a la que está del borde en cada eje e igualarla en el otro lado.
En este caso, solo hay que cambiar el eje Y, ya que está a 10 milímetros por la parte de atrás.

Por lo tanto, la rejilla máxima centrada quedaría así:

#define LEFT_PROBE_BED_POSITION 0
#define RIGHT_PROBE_BED_POSITION 220
#define FRONT_PROBE_BED_POSITION 10
#define BACK_PROBE_BED_POSITION 210


Si queremos, a partir de esta, podremos reducirla aumentando por igual la distancia a los distintos bordes de la cama.
En este caso sería conveniente reducirla en el eje X para que el centro del sensor no quede justo en el borde de la cama.

Con los valores de los límites de la rejilla de medición, quedaría completa toda la configuración. Ya se puede salvar y subir a la impresora el firmware.

Con esto, para poder utilizar el autolevel, ya solo nos queda configurar el desfase del sensor en el eje Z (Z Probe Offset), que habíamos dejado pendiente.

Hay varias formas de hacerlo, pero la más sencilla es mediante comandos gcode.Para ello, tenemos que conectar con la impresora como vimos antes y realizar el siguiente proceso:

  • 1º Calentar cama y fusor a sus temperaturas de impresión, esperando unos minutos para que se estabilicen las dilataciones que se producen.
  • 2º Fijamos el desfase a 0 con un comando M851 Z0 y lo guardamos en la EEPROM con un M500.
  • 3º Mandamos un comando G28 para hacer home a todos los ejes.
  • 4º Dado que existe una limitación en el firmware que impide los movimientos hacia posiciones negativas, hay que desactivarla mientras realizamos este ajuste. Para ello enviamos el comando M211 S0. (¡Cuidado!, que desactiva las limitaciones de todos los ejes).
  • 5º Con los controles de movimiento del eje Z, tenemos que ajustar la altura de la boquilla del extrusor para que roce ligeramente un folio de papel de 80 gr/m2 (lo que viene a ser una décima de milímetro).  Se pueden utilizar los movimientos de 10 mm y 1 mm (si está aún lejos) y terminar con el de 0,1 mm para ajustarlo de forma precisa.
  • 6º Fijamos el valor del desfase con un comando M851  Z-X.XX, siendo –X.XX el valor que indica en este momento la pantalla para el eje Z. Guardamos el valor en la EEPROM con un comando M500.
  • 7º Volvemos a activar la limitación de movimientos negativos de los ejes, enviando un comando M211 S1.
  • Y con esto la impresora está preparada para utilizar el autolevel.



Para probarlo, mandamos un comando G28 y cuando termine de hacer el home all, mandamos un comando G29. Si todo está correcto, veremos cómo realiza la medición el autolevel. Como siempre, la primera vez con la mano en el interruptor, por si acaso.

Ahora, para comenzar a imprimir solo queda configurar el fileteador (slicer) que utilicemos, para que incluya el autolevel en los archivos gcode generados. Para ello, tendremos que incluir en el script de inicio, una línea con un comando G29 justo después de la última línea que tengamos con un G28.

En resumen, Marlin es un firmware de código abierto muy popular y flexible para impresoras 3D que proporciona muchas funciones avanzadas para mejorar la calidad de impresión y la estabilidad de la impresora. Además, debido a su capacidad de personalización, es compatible con una amplia gama de hardware y componentes, lo que lo convierte en una opción popular en la comunidad de impresión 3D sobre todo a la hora de implementar ciertas mejoras como el autolevel. Como hemos visto en este post el proceso no es una tarea sencilla pero tampoc imposible.

El futuro de la programación


Muchas nuevas herramientas de IA serán capaces de escribir y depurar código de forma más rápida y eficiente que los humanos y a un coste menor. Si le preocupa la pérdida de puestos de trabajo y el fin de la profesión de programador, esperemos que no tenga razón , pues no estamos aqui para hacer predicciones catastrofistas, sino para intentar comprender la transcendencia de lo que la evolución de la tecnologia puede suponer , entre otras cosas porque dicen, que si no puedes contra tu enemigo, !Aliate con el! así que quizás sea el momento, querido lector, de explorar como podemos hacer nuestro aliada la IA ,puesto que las herramientas basadas en IA ya están listas para tomar el relevo, y las formas tradicionales de escribir código serán menos populares.

Según un estudio de OpenAI y la Universidad de Pensilvania, algunas profesiones corren el riesgo de verse afectadas por herramientas como ChatGPT. Según el estudio, aproximadamente el 80% de la mano de obra estadounidense podría ver afectado al menos el 10% de sus tareas laborales por la introducción de las GPT, mientras que alrededor del 19% de los trabajadores podría ver afectado al menos el 50% de sus tareas.

De hecho, las profesiones con mayor riesgo de verse afectadas por herramientas como ChatGPT por el momento no son profesionales que necesitan realizar labores artesanes, sino en realidad profesiones bien renumeradas por lo general con relativo alto nivel académico, como pueden ser:

  • Matemáticos.
  • Contables (calculadoras fiscales).
  • Analistas financieros cuantitativos.
  • Escritores y autores.
  • Diseñadores web y de interfaces digitales.
  • Taquígrafos judiciales.
  • Subtituladores simultáneos.
  • Correctores de redacción y estilo.

ChatGPT puede ser una herramienta valiosa para los programadores. Puede ayudar con tareas como añadir contenido de marcador de posición y contenido de relleno en varios formatos, generar algoritmos eficientes, traducir código a otro lenguaje de programación, formatear datos, optimizar bloques de código y escribir pruebas para el código.

Por ejemplo, ChatGPT puede generar contenido de relleno en SQL, JSON, CSV y docenas de formatos más. También puede crear matrices y listas en cualquier lenguaje de programación. Además, puede ayudar a los programadores a generar algoritmos eficientes diseñando un algoritmo con el menor número de operaciones para completar una función dada1.

¿Que puede hacer chatgbt por un programador?

En primer lugar, veamos todo lo que hacemos en nombre de la codificación, y luego veremos cómo todo ello se volverá irrelevante. Empecemos por el principio, porque cuando se esta aprendiendo a codificar en un lenguaje nos centramos en escribir código funcional , pero tal vez no hayamos aprendido a leerlo o entenderlo sobre todo cuando no lo hemos escrito nosotros. Y eso no es todo, a veces desde el esbozo al código final esta al tarea , ¿no?

Imagine que está en medio de un montón de trabajo, y quiere identificar rápidamente lo que hace esta función:

No se cargue: Lo único que hace esta función es:

  • Duplica una hoja de cálculo.
  • Lanza un error si no se guarda la hoja de cálculo original.
  • Añade «Copia de» al título de la nueva hoja de cálculo.
  • ¿Y ya está?

Bueno, hay una cosa más de la que puede que no se haya dado cuenta (¡buen trabajo si lo has hecho!) y es que esta función también cambia accidentalmente el título de la hoja de cálculo original. Errores como este ocurren todos los días.

La depuración es una habilidad infravalorada. Los programadores que son buenos depuradores trabajan más rápido, hacen más cosas y están menos estresados.

No se preocupe si no ha podido encontrar el error, ¡sólo significa que sacará el máximo partido a herramientas basadas en IA como chatGPT pues como se puede ver en la imagen el propio chatgbt ha encontrado el bug y nos da una forma de solucionar el problema!

Entendiendo el código ajeno

La mayoría de los desarrolladores trabajan en una base de código que normalmente no ha sido escrita por ellos. Es común que los desarrolladores empujen hacia fuera el código rápidamente que escribiendo limpio, código mantenible. Mientras tanto, a las pobres almas que vienen detrás de ellos les toca recoger los pedazos y tratar de dar sentido al desorden. Pasarían incontables horas intentando desenredar la retorcida telaraña de código, tratando de corregir errores y añadir nuevas funciones.Un ciclo interminable de frustración y desesperación.

Veamos un ejemplo de código escrito en C y la idea de cómo diablos alguien podría llegar a leer y entender este código (pero ya no).

En la vida real, es posible que no se encuentre con un código como este (si lo hace, vaya a buscar a la persona que lo escribió). Usar ChatGPT es mucho más rápido que intentar descifrar código enrevesado.

Imagínese cuánto más rápido se podría avanzar generando resúmenes de bases de código.

¿Qué más puede hacer ? Pues como vemos abajo podemos pedirle que mejore el código existente (o añadir funcionalidades)

¿Añadir funciones? Pues simplemente es cuestión de pedirlo:

Ahora que ha añadido algunas funciones y mejorado el código existente, decide ir un paso más allá y hacer que el código sea más legible.

El primer paso sería alinear el desorden de código existente con las convenciones de codificación, pues nuevamente es solo cuestión de pedírselo a chatgbt:

Además quien escribiera el código anterior venía de un entorno C y no puso interés en ser declarativo, así que es hora de corregirlo, ¿no?

Si sigue sin estar satisfecho, sobre todo después de descubrir que algunas partes del código son excesivamente complicadas, también podemos pedirle a chatgbt que simplifique esas partes del código :

Bueno ¿ y su hablamos del código nuevo? Quizás no este seguro de si el código que ha escrito duramente sea realmente eficaz..asi ¿Por qué no preguntárselo a chatgbt?.

Quizás no haya tenido tiempo para documentar el código así que ¿porque no pedirle a chatgbt que documente el código?.

Y para terminar , hay que asegurarse de que el código no sólo funcione, sino que funcione bien por lo que ante cualquier problema podemos pedirle a la IA que nos genere el código autoamticaemente con el lenguaje o tecnologia que deseemos

Y por cierto amigo lector , si es un entusiasta de Arduino sepa que también chatgbt puede generar todo el código que necesite automáticamente según los requisitos de la aplicación que tenga en mente. Por ejemplo pidamos a chat gbt que no cree el código para esp32 con el que hacer una carrera de luces de 8 leds (como las que llevaba el coche fantástico).

Esta es su repuesta:

Para hacer una carrera de luces de 8 LEDs con un ESP32, puedes utilizar el siguiente código:

C++Copy code// Incluye la librería de ESP32
#include <Arduino.h>

// Define las conexiones de los LEDS
#define LED1_PIN 2
#define LED2_PIN 4
#define LED3_PIN 5
#define LED4_PIN 12
#define LED5_PIN 13
#define LED6_PIN 14
#define LED7_PIN 15
#define LED8_PIN 16

// Define el tiempo de espera entre cada cambio de LED
#define DELAY_TIME 100

// Define la secuencia de encendido de los LEDs
int led_sequence[] = {LED1_PIN, LED2_PIN, LED3_PIN, LED4_PIN, LED5_PIN, LED6_PIN, LED7_PIN, LED8_PIN};

// Define el número de LEDs
int led_count = sizeof(led_sequence) / sizeof(int);

void setup() {
  // Configura los pines de los LEDS como salidas
  pinMode(LED1_PIN, OUTPUT);
  pinMode(LED2_PIN, OUTPUT);
  pinMode(LED3_PIN, OUTPUT);
  pinMode(LED4_PIN, OUTPUT);
  pinMode(LED5_PIN, OUTPUT);
  pinMode(LED6_PIN, OUTPUT);
  pinMode(LED7_PIN, OUTPUT);
  pinMode(LED8_PIN, OUTPUT);
}

void loop() {
  // Recorre la secuencia de encendido de los LEDS
  for (int i = 0; i < led_count; i++) {
    // Enciende el LED correspondiente
    digitalWrite(led_sequence[i], HIGH);
    // Espera un tiempo
    delay(DELAY_TIME);
    // Apaga el LED correspondiente
    digitalWrite(led_sequence[i], LOW);
  }
}

Este código configura los pines de los 8 LEDs como salidas, define una secuencia de encendido para los LEDs y luego recorre esta secuencia, encendiendo y apagando los LEDs en orden. También hay un tiempo de espera entre cada cambio de LED para que se vea la «carrera» de luces. Puedes ajustar el tiempo de espera cambiando el valor de DELAY_TIME.

Ideas finales

Nos guste o no, con herramientas como chatGPT, escribir código y los que sólo saben escribir código no servirán de nada. Sin embargo, al igual que los artesanos fueron capaces de adaptarse y aprender nuevas habilidades para seguir siendo competitivos, los programadores podrán hacer lo mismo aprendiendo más sobre cómo utilizar estas herramientas en su beneficio. Una vez que escribir código quede obsoleto, los solucionadores de problemas serán más valiosos. Los programadores del futuro serán mucho más productivos que los actuales, capaces de hazañas con las que sólo podemos soñar. Es fantástico que las tecnologías que utilizamos sean cada vez más inteligentes. Las herramientas que utilizamos están evolucionando a una velocidad de vértigo, asi que es hora de que también evolucionemos. Sí. Adaptarse a nuevas formas es doloroso, pero sólo los vivos pueden sentir el dolor – Los muertos ni siquiera sienten el fuego crematorio.

Fuente https://javascript.plainenglish.io/coding-wont-exist-in-5-years-this-is-why-6da748ba676c

Problemas con unidades flash


Las unidades flash extraíbles funcionan mediante el uso de la tecnología de memoria flash, tecnología de almacenamiento de datos basada en memorias de alta velocidad que se programan eléctricamente y que utiliza un tipo de memoria no volátil que se denomina precisamente «memoria flash». Este tipo de memorias no volátil no requieren alimentación para mantener la integridad de los datos almacenados con lo que, si se interrumpe el suministro, no se pierde nada. El almacenamiento flash utiliza celdas de memoria para almacenar datos con la peculiaridad de que aquellas que tengan datos escritos anteriormente se tienen que borrar antes de poder escribir datos nuevos en ellas .

Es bastante común ver que su unidad USB no puede mostrarse y abrirse con la aparición de todo tipo de errores en su escritorio como «Unidad flash USB no reconocida«, «Por favor, inserte un disco en disco extraíble«, «Necesita formatear el disco antes de poder utilizarlo» y «Unidad USB RAW«, etc. ¿Qué son estos errores y qué está fallando en tu unidad USB? ¿Cómo podemos recuperar datos de una unidad USB inaccesible o formateada? Averigüémoslo.

¿Por qué la unidad flash no funciona o no se reconoce?

Hay varias ventajas en el uso de una unidad flash extraíble siendo su principal ventaja su portabilidad pues las unidades flash son pequeñas y ligeras, lo que las hace fáciles de transportar y almacenar. Además, las unidades flash utilizan tecnología de estado sólido, lo que significa que no tienen piezas móviles y son más resistentes a golpes y vibraciones que los discos duros tradicionales. Otra ventaja es que las unidades flash utilizan memoria no volátil, lo que significa que los datos no se pierden cuando se desconecta la electricidad. Sin embargo aunque hay varias ventajas en el uso de una unidad flash extraíble hay algunas desventajas, siendo una de las principales su limitado ciclo de escritura y borrado pues una unidad flash solo puede escribirse y borrarse unas 100.000 veces . Además, las unidades flash suelen tener hasta 128 GB de almacenamiento (desconfié amigo lector si le ofrecen capacidades mayores a precios bajos). Por cierto también pueden ser susceptibles a la electricidad estática e incluso la carga eléctrica más pequeña puede provocar la pérdida de datos y daños irreversibles.

Los problemas de los pendrive o unidades flash, se pueden resumir en dos categorías de errores: lógicos y físicos. Los errores lógicos se pueden corregir con algunos algunos trucos de bricolaje de los que vamos a ver en este post, mientras que los físicos normalmente , excepto que haya problemas con el conector y podamos solucionalo, no se pueden resolver sin conocimientos profesionales.

Errores físicos

La estructura interna de una unidad flash extraíble se basa en la tecnología de memoria flash. La memoria flash es un tipo de EEPROM que contiene una matriz de celdas con un transistor evolucionado con dos puertas en cada intersección. Todo esta matriz de celdas se suele integrar en un único chip, que suele ocupar la mayoría del espacio del dispositivo , tal y como podemos ver en la siguiente imagen.

El circuito de memoria flash normalmente lleva asociado un controlador aparte que cumple también la función de controlador USB , normalmente integrado en otro chip que suele ser un microcontrolador al que por cierto según el fabricante podemos actualizar su firmware ( precisamente porque puede fallar).

Este importante componente va normalmente ubicado justo en el lado opuesto el pcb donde esta la flash. En la imagen podemos ver imagen del controlador de una memoria Kingston.

Como se puede deducir, dados los relativos pocos componentes que consta una unidad flash, las principales partes susceptibles a dar problemas son las siguientes :

  • Vástagos y conectores rotos.
  • Unidades muertas (sin alimentación)
  • Circuito o puerta NAND rotos,
  • Software del controlador de la unidad flash dañado a causa de una memoria NAND genérica o de baja calidad

Los cuatro errores anteriores están relacionados con daños en el hardware y la desconexión física de la unidad flash. La reparación de la unidad con estos errores pueden requerir una soldadura precisa y fundente con lupa. Sin experiencia y equipo especializado, es casi imposible reparar la unidad flash con daños de hardware por su cuenta. Quizás , lo mejor es que busque ayuda de profesionales sobre todo si los datos de la unidad son muy importantes.

Errores lógicos

Un error muy típico es la corrupción de datos después de que la unidad se haya desmontado incorrectamente del puerto que puede ocurrir cuando usted desconecta su unidad flash sin hacer clic en «expulsar» la última vez, lo que conduce a la corrupción de datos en la unidad. Por lo tanto, cuando se conecta de nuevo a su PC, la unidad flash no puede ser reconocida por el sistema operativo.

Otro error típico es el de «Datos no válidos en el Master Boot Record (MBR) o Partition Boot Record (PBR) o en la estructura de directorios de la unidad USB» , lo cual ocurre cuando los datos almacenados en MBR, PBR o sobre la estructura de directorios estan mal, lo que puede causar que la unidad no pueda funcionar ya que llevan la información sobre cómo y dónde el sistema operativo encuentra y lee los datos almacenados en cada sector.

Ambos errores pueden a conducir a que la unidad flash no sea reconocida por el sistema operativo, asi que nos iremos al interfaz de comandos y lanzaremos Disskpart. Si en la utilidad de Diskpart en Windows 11 aparece una unidad en estado «No hay medios», esto significa que el sistema operativo no puede detectar correctamente la unidad o que la unidad tiene un problema de hardware.

DISKPART> list disk
Núm Disco Estado Tamaño Disp Din Gpt
---------- ---------- ------- ------- --- ---
Disco 0 En línea 476 GB 2048 KB *
Disco 1 No hay medios 0 B 0 B

Para solucionar este problema, puede intentar los siguientes pasos:

  1. Verifique que la unidad esté conectada correctamente: Si la unidad es un disco duro interno, verifique las conexiones SATA o de alimentación para asegurarse de que estén bien conectadas. Si es una unidad externa, asegúrese de que el cable USB o el adaptador de corriente estén conectados correctamente y funcionando. Asegúrese de que el cable USB ( si lo hay) esté conectado correctamente y que la unidad esté enchufada en un puerto USB que funcione correctamente.
  2. Comprobar el administrador de dispositivos: Abra el Administrador de dispositivos en Windows y busque la unidad en la lista de dispositivos. Si la unidad tiene un signo de exclamación o un símbolo de error, intente actualizar los controladores o reinstalarlos.
  3. Ejecutar CHKDSK: Utilice la utilidad CHKDSK de Windows para comprobar si hay errores en la unidad y repararlos. Abra una ventana de CMD en modo administrador y ejecute el comando «chkdsk /f X:», donde «X» es la letra de la unidad afectada. Esto verificará y reparará cualquier error en la unidad.
  4. Verificar el estado de la unidad: Si los pasos anteriores no resuelven el problema, es posible que la unidad tenga un problema de hardware. Descargue una herramienta de diagnóstico de la unidad desde el sitio web del fabricante de la unidad y ejecute una prueba para verificar el estado de la unidad ( esto lo veremos mas adelante).
  5. Verifique que la unidad esté formateada correctamente. Si la unidad está formateada en un sistema de archivos que no es compatible con su sistema operativo, puede causar problemas. Verifique la compatibilidad del sistema de archivos de la unidad con su sistema operativo.
  6. Use otra herramienta para formatear la unidad. Si DiskPart sigue sin poder limpiar la unidad, puede probar otras herramientas de formateo de disco como Rufus o HP USB Disk Storage Format Tool.
  7. Reemplazar la unidad: Si la unidad tiene un problema de hardware irreparable, es posible que deba reemplazarla con una unidad nueva.

Este error que nos puede mostrar diskpart, podemos verlo también desde el administrador de discos para comprobar como esta ese disco ( en la imagen el disco 1):

Si desde el Administrador de discos en Windows aparece una unidad extraíble con el estado «No hay medios«, esto es indicativo de un problema en la conexión o en la unidad en sí. Si hemos seguidos los pasos anteriores con la utilidad Diskpart , una herramienta de diagnóstico genérica para unidades USB que puede identificar problemas de hardware y proporcionar recomendaciones para solucionarlos es la herramienta CrystalDiskInfo. Esta herramienta es gratuita y fácil de usar.

Aquí hay algunos pasos para usar CrystalDiskInfo para diagnosticar problemas con una unidad USB:

  1. Descargue e instale CrystalDiskInfo en su ordenador.
  2. Conecte la unidad USB y abra CrystalDiskInfo.
  3. Seleccione la unidad USB en la lista de unidades disponibles.
  4. CrystalDiskInfo mostrará información detallada sobre la unidad USB, incluyendo su estado de salud, temperatura, velocidad de transferencia y más.
  5. Si la herramienta detecta algún problema con la unidad USB, se mostrará una alerta y se proporcionarán recomendaciones para solucionar el problema.
  6. Si es posible, siga las recomendaciones para solucionar el problema.
  7. Si el problema no se puede solucionar, es posible que deba reemplazar la unidad USB.

Recuerde que esta herramienta es una herramienta de diagnóstico genérica y no puede detectar todos los problemas de hardware. Si sigue experimentando problemas con la unidad USB después de usar CrystalDiskInfo, es posible que deba comunicarse con el fabricante de la unidad para obtener asistencia adicional.

También es posible que el problema sea causado por un error de hardware en su ordenador por lo que puede intentar actualizar los controladores de USB o ejecutar una herramienta de diagnóstico de hardware para determinar si hay algún problema con su computadora. Hay varias herramientas de recuperación de firmware disponibles en línea que pueden ayudar a recuperar unidades flash dañadas o con firmware corrupto.

En el caso de que su unidad flash sea Kingston y no responde puede intentar actualizar el firmware de una unidad flash Kingston, para lo cual puede descargar e instalar Kingston SSD Manager (KSM) desde el sitio web de Kingston . Una vez que haya instalado KSM, puede ejecutar la aplicación y seleccionar su unidad flash Kingston. Si hay una actualización de firmware disponible para su unidad específica, podrás hacer clic en el botón de actualizar firmware para comenzar la actualización que pueda ayudarte

A continuación, se mencionan algunas otras herramientas genéricas:

  1. HP USB Disk Storage Format Tool: Esta herramienta es una solución de formateo de bajo nivel que también puede restaurar una unidad flash a su estado original de fábrica. Está diseñada específicamente para trabajar con unidades flash USB de marca HP, pero también funciona con otros fabricantes.
  2. USB Repair Tool: Esta herramienta puede reparar problemas de firmware y hardware en unidades flash USB. Puede solucionar errores de lectura y escritura, reparar sectores defectuosos y recuperar archivos perdidos.
  3. ChipGenius: Esta herramienta puede identificar el controlador de memoria flash utilizado en una unidad flash y proporcionar información sobre su fabricante, modelo, capacidad y firmware. También puede verificar la integridad del firmware de la unidad y proporcionar una lista de herramientas de recuperación de firmware compatibles.
  4. Flash Drive Repair: Esta herramienta es una solución integral de reparación de unidades flash que puede recuperar unidades corruptas, dañadas o inaccesibles. Puede formatear la unidad, reinstalar el firmware y reparar errores de partición.

Es importante tener en cuenta que el uso de herramientas de recuperación de firmware puede ser arriesgado y puede causar daños permanentes a la unidad. Es importante seguir cuidadosamente las instrucciones y utilizar estas herramientas con precaución. En caso de duda, es recomendable buscar asesoramiento profesional antes de intentar reparar una unidad flash dañada o con firmware corrupto.

Esperamos que estos pasos le ayuden a solucionar el problema con la unidad extraíble con el estado «No hay medios» en el Administrador de discos de Windows.