El Arduino Yun tiene un procesador Atheros AR9331, lo que le otorga la capacidad de utilizar el sistema operativo Linux, específicamente una distribución OpenWRT llamada Linino. El Yun cuenta con 16 MB de memoria flash, donde se pueden instalar programas y aplicaciones para diversos propósitos.
Como podrán imaginar, esta memoria se agota a medida que instalamos diversos programas, por lo que se hace necesario contar con más espacio en disco para llevar a cabo las operaciones que se requieran en un momento dado. Afortunadamente es posible expandir la memoria del Arduino Yun con una memoria MicroSD.
El espacio disponible en memoria lo podemos ver si entramos al panel web del Arduino Yun. Luego de haber configurado nuestro Arduino, teceleamos la IP del Yun en un buscador (yo utilizo Google Chrome) y nos aparece la siguiente interfaz:
Entramos y veremos el siguiente panel:
Vamos a la opción «Configure». Veremos lo siguiente:
Accedemos al panel avanzado y veremos la interfaz Luci. Dentro vamos a la pestaña System/Software y veremos los programas instalados en el Yun, con el espacio en memoria disponible.
Hoy voy a explicar cómo podemos utilizar una tarjeta microSD como «disco duro» para expandir la memoria del Arduino Yun. Lo primero que necesitaremos será une memoria microSD de más de 2 GB. No debe exceder los 32 GB.
Necesitamos tener en cuenta las siguientes consideraciones:
- El Arduino debe estar conectado a Internet, preferiblemente por cable de red
- La memoria microSD perderá todos los datos dentro de ella y la capacidad de la misma se verá reducida a una porción del total de la capacidad de ella ya que un espacio será reservado exclusivamente para su uso con el Arduino Yun.
Necesitamos formatear la memoria como FAT32. Para ello la introducimos en la computadora por medio de un adaptador y en Equipo seleccionamos la unidad con el clic derecho y le damos en la opción Formatear.
Luego de ello, insertamos la microSD en el Arduino Yun. Necesitaremos subir un código a nuestro Arduino para poder ejecutar la operación. Este código lo podemos descargar desde el siguiente enlace:
Descargamos el fichero y lo descomprimimos. Veremos un archivo de extensión .ino el cual contiene el siguiente código:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 |
/* Yún Disk Space Expander Requirements: * micro SD card * internet connection This sketch configure the SD card to expand the disk space of the Yún. Upload, open the Serial Monitor and follow the interactive procedure. Warning: your SD card will be formatted and you will lose the files it contains. Be sure you have backed it up before using it for expanding Yún’s disk space. created Apr 2014 by Federico Fissore & Federico Vanzati This code is in the public domain. http://arduino.cc/en/Tutorial/ExtendingYunDiskSpace */ #include <Process.h> #define DEBUG 0 #define SUCCESSFUL_EXIT_CODE 0 void setup() { Serial.begin(115200); while (!Serial); Serial.print(F("This sketch will format your micro SD card and use it as additional disk space for your Arduino Yun.\nPlease ensure you have ONLY your micro SD card plugged in: no pen drives, hard drives or whatever.\nDo you wish to proceed (yes/no)?")); expectYesBeforeProceeding(); Serial.println(F("\nStarting Bridge...")); Bridge.begin(); haltIfSDAlreadyOnOverlay(); haltIfInternalFlashIsFull(); haltIfSDCardIsNotPresent(); installSoftware(); partitionAndFormatSDCard(); createArduinoFolder(); copySystemFilesFromYunToSD(); enableExtRoot(); Serial.print(F("\nWe are done! Yeah! Now press the YUN RST button to apply the changes.")); } void loop() { // This turns the sketch into a YunSerialTerminal if (Serial.available()) { char c = (char)Serial.read(); Serial1.write(c); } if (Serial1.available()) { char c = (char)Serial1.read(); Serial.write(c); } } void halt() { Serial.flush(); while (true); } void expectYesBeforeProceeding() { Serial.flush(); while (!Serial.available()); String answer = Serial.readStringUntil('\n'); Serial.print(F(" ")); Serial.println(answer); if (answer != "yes") { Serial.println(F("\nGoodbye")); halt(); } } int readPartitionSize() { int partitionSize = 0; while (!partitionSize) { Serial.print(F("Enter the size of the data partition in MB: ")); while (Serial.available() == 0); String answer = Serial.readStringUntil('\n'); partitionSize = answer.toInt(); Serial.println(partitionSize); if (!partitionSize) Serial.println(F("Invalid input, retry")); } return partitionSize; } void debugProcess(Process p) { #if DEBUG == 1 while (p.running()); while (p.available() > 0) { char c = p.read(); Serial.print(c); } Serial.flush(); #endif } void haltIfSDAlreadyOnOverlay() { Process grep; grep.runShellCommand(F("mount | grep ^/dev/sda | grep 'on /overlay'")); String output = grep.readString(); if (output != "") { Serial.println(F("\nMicro SD card is already used as additional Arduino Yun disk space. Nothing to do.")); halt(); } } void haltIfSDCardIsNotPresent() { Process ls; int exitCode = ls.runShellCommand("ls /mnt/sda1"); if (exitCode != 0) { Serial.println(F("\nThe micro SD card is not available")); halt(); } } void haltIfInternalFlashIsFull() { Process awk; awk.runShellCommand(F("df / | awk '/rootfs/ {print $4}'")); int output = awk.parseInt(); if (output < 1000) { Serial.println(F("\nYou don't have enough disk space to install the utility software. You need to free at least 1MB of Flash memory.\nRetry!")); halt(); } } void installSoftware() { Serial.print(F("\nReady to install utility software. Please ensure your Arduino Yun is connected to internet.\nReady to proceed (yes/no)?")); expectYesBeforeProceeding(); Serial.println(F("Updating software list...")); Process opkg; // update the packages list int exitCode = opkg.runShellCommand("opkg update"); // if the exitCode of the process is OK the package has been installed correctly if (exitCode != SUCCESSFUL_EXIT_CODE) { Serial.println(F("err. with opkg, check internet connection")); debugProcess(opkg); halt(); } Serial.println(F("Software list updated. Installing software (this will take a while)...")); // install the utility to format in EXT4 exitCode = opkg.runShellCommand(F("opkg install e2fsprogs mkdosfs fdisk rsync")); if (exitCode != SUCCESSFUL_EXIT_CODE) { Serial.println(F("err. installing e2fsprogs mkdosfs fdisk")); debugProcess(opkg); halt(); } Serial.println(F("e2fsprogs mkdosfs fdisk rsync installed")); } void partitionAndFormatSDCard() { Serial.print(F("\nProceed with partitioning micro SD card (yes/no)?")); expectYesBeforeProceeding(); unmount(); Process format; //clears partition table format.runShellCommand("dd if=/dev/zero of=/dev/sda bs=4096 count=10"); debugProcess(format); // create the first partition int dataPartitionSize = readPartitionSize(); Serial.println(F("Partitioning (this will take a while)...")); String firstPartition = "(echo n; echo p; echo 1; echo; echo +"; firstPartition += dataPartitionSize; firstPartition += "M; echo w) | fdisk /dev/sda"; format.runShellCommand(firstPartition); debugProcess(format); unmount(); // create the second partition format.runShellCommand(F("(echo n; echo p; echo 2; echo; echo; echo w) | fdisk /dev/sda")); debugProcess(format); unmount(); // specify first partition is FAT32 format.runShellCommand(F("(echo t; echo 1; echo c; echo w) | fdisk /dev/sda")); unmount(); delay(5000); unmount(); // format the first partition to FAT32 int exitCode = format.runShellCommand(F("mkfs.vfat /dev/sda1")); debugProcess(format); if (exitCode != SUCCESSFUL_EXIT_CODE) { Serial.println(F("\nerr. formatting to FAT32")); halt(); } delay(100); // format the second partition to Linux EXT4 exitCode = format.runShellCommand(F("mkfs.ext4 /dev/sda2")); debugProcess(format); if (exitCode != SUCCESSFUL_EXIT_CODE) { Serial.println(F("\nerr. formatting to EXT4")); halt(); } Serial.println(F("Micro SD card correctly partitioned")); } void createArduinoFolder() { Serial.print(F("\nCreating 'arduino' folder structure...")); Process folder; folder.runShellCommand(F("mkdir -p /mnt/sda1")); folder.runShellCommand(F("mount /dev/sda1 /mnt/sda1")); folder.runShellCommand(F("mkdir -p /mnt/sda1/arduino/www")); unmount(); } void copySystemFilesFromYunToSD() { Serial.print(F("\nCopying files from Arduino Yun flash to micro SD card...")); Process copy; copy.runShellCommand(F("mkdir -p /mnt/sda2")); copy.runShellCommand(F("mount /dev/sda2 /mnt/sda2")); copy.runShellCommand(F("rsync -a --exclude=/mnt/ --exclude=/www/sd /overlay/ /mnt/sda2/")); unmount(); } void unmount() { Process format; format.runShellCommand(F("umount /dev/sda?")); debugProcess(format); format.runShellCommand(F("rm -rf /mnt/sda?")); debugProcess(format); } void enableExtRoot() { Serial.print(F("\nEnabling micro SD as additional disk space... ")); Process fstab; fstab.runShellCommand(F("uci add fstab mount")); fstab.runShellCommand(F("uci set fstab.@mount[0].target=/overlay")); fstab.runShellCommand(F("uci set fstab.@mount[0].device=/dev/sda2")); fstab.runShellCommand(F("uci set fstab.@mount[0].fstype=ext4")); fstab.runShellCommand(F("uci set fstab.@mount[0].enabled=1")); fstab.runShellCommand(F("uci set fstab.@mount[0].enabled_fsck=0")); fstab.runShellCommand(F("uci set fstab.@mount[0].options=rw,sync,noatime,nodiratime")); fstab.runShellCommand(F("uci commit")); Serial.println(F("enabled")); } |
Debemos subir este código al Arduino Yun. Como ya dijimos, es importante que el Arduino Yun se encuentre conectado a Internet, preferiblemente a través de el puerto Ethernet. Una vez subido el código vamos al Monitor Serie y veremos lo siguiente: Debemos tomar en cuenta que es necesario seleccionar la opción «Nueva línea» en la parte inferior del Monitor Serie. Tecleamos «yes» y le damos Enter. Volvemos a teclear «yes» (asegurándonos de que el Arduino esté conectado a Internet). Hasta este punto el Arduino se ha actualizado desde Internet y ha instalado los programas que son necesarios para esta operación y que no han sido instalados hasta ahora. Ahora tenemos que escoger un tamaño para la partición que crearemos. Yo estoy utilizando una memoria de 4GB y he designado 2GB para la partición, por lo que escribiré 2048 MB (2GB). Esto significa que podré utilizar efectivamente 2GB para almacenamiento de datos y el resto del espacio (casi 2GB) será usado por el Arduino Yun como disco duro. Al final veremos lo siguiente: Presionamos el botón de Reset del Arduino (el blanco con la incripción YUN RST). EL Yun se reseteará y veremos una serie de instrucciones en la pantalla. Luego de un minuto estará listo. Entramos a la interfaz web avanzada y ahora en la parte donde vemos el espacio de memoria disponible encontraremos que la memoria de nuestro Arduino es mucho más grande que los 16MB iniciales que habíamos visto al principio de esta guía. Ahora es posible instalar toda clase de programas sin tener que preocuparnos por el espacio disponible en el disco. Esto es todo por ahora. Saludos.
Hola!
Después de realizar la partición, mi pc dejó de reconocer el arduino. Aún puedo conectarme con el por wifi, pero no puedo cargarle nada más ya que no me da ningún puerto. ¿Qué puedo hacer?
Posiblemente el bootloader de tu Arduino se averió. Hay que repararlo desde la consola SSH
Debes tratar de quemar el bootloader nuevamente desde una consola en SSH
Saludos amigo!
Ya realicé todo el proceso y fue satisfactorio.
Pero cuando intento cargarle un programa que anteriormente no cabía en la memoria del YUN, sigue indicándome que la memoria es insuficiente.
Utilicé una memoria SD de 8Gb, e hice una partición de 2Gb.
Algún otro procedimiento que se tenga que hacer?
Saludos
Amigo, la memoria que expandiste fue la memoria Flash del lado del microprocesador. La que tu utilizas para almacenar los programas en el Arduino es la memoria flash del lado del microcontrolador. Son dos memorias completamente distintas. La memoria flash del lado del microcontrolador no se puede expandir. En vez de buscar hacerla más grande deberías tratar de hacer tu código más corto o más eficiente
Hola. Ya habia realizado este proceso sin problemas con una memoria de 2GB, pero esta vez realicé el proceso despues de un tiempo y lo hice con una memoria de 8GB y me lanza un error
You don’t have enough disk space to install the utility software. You need to free at least 1MB of Flash memory.
Retry!
Resetea el Arduino