?>/script>'; } ?> [Proyecto] Impresora 2D y 3D con WiFi usando GPIOs en Routers con OpenWRT (x 2€) Widgets Magazine

Autor Tema: [Proyecto] Impresora 2D y 3D con WiFi usando GPIOs en Routers con OpenWRT (x 2€)  (Leído 4631 veces)

0 Usuarios y 1 Visitante están viendo este tema.

edudi

  • Visitante
Buenas a todos, ya está todo inventado y funcionando, la idea es portarlo y hacerlo funcional en OpenWRT.

También como objetivo es reautilizar todo lo posible, como en este caso que costó sólo 2 €, por lo que ya sólo falta mejorar el driver/software.

Hace 2 semanas hice esta "mini-impresora 2D con WiFi y sin necesidad de PC" con motores bipolares paso a paso "4 hilos" y un bolígrafo (aprovechando 2 mecanismos de unidades DVD de PC). Por suerte con todo el tiempo que llevaba pa lante y patrás con los motores paso a paso, los scripts hechos y demás, el script mini-driver básico que hice, montarlo todo y dejarlo funcionando en sus primeras fases no alcanzó a las 8 horas (madrugada del domingo). Así que quien quiera hacérselo, le ocupará muy poco tiempo.

De momento es 2D (sólo eje X e Y): tiene puesto un bolígrafo, aunque la idea principal es ponerle un láser para quemar superficies y hacer logos, dibujos, guías, etc...

Obviamente el siguiente pasó será hacerla 3D (X, Y, Z) para ponerle x ej: un taladro, fresas, un lápiz 3D, un Hotend, etc..



 

Link de la imagen de las impresiones en HD --> http://i65.tinypic.com/161ants.jpg



A continuación pongo el enlace con todos los scripts hechos para las figuras geométricas de prueba. Lo propio es poder realizar dibujos en cualquier programa de edición, exportarlos en el formato adecuado (G-CODE u otro) e importarlo por cable o wifi al router, y lanzarlo a imprimir. En esto último es donde reside el problema con el que llevo 2 semanas luchando, y que me gustaría resolver, a ver si entre todos podemos adaptar/crear un "driver" o la forma en que por ejemplo los G-CODE puedan ser interpretados y llevados a acabo, al menos de momento por los ejes X e Y.

Enlace con los scripts para las pruebas: https://goo.gl/SQaZmz



================
Materiales empleados:
================

- Driver L293D (1€/u = 2 €)
- Router con OpenWRT y GPIOs operativos (4 GPIOs por motor. Poniendo un transistor se reducen a la mitad. Se usó el HG556a Ver.C Atheros con la 14.07 RC3)
- Unidad de CD/DVD de un PC, portátil, reproductor, etc... (1 unidad por eje, en este caso 2)
- Base para fijar los ejes en la misma superficie (en este caso se reutilizó el metacrilato de una pantalla LCD despiezada)
- Tornillería


========
Software:
========

Arranque local --> Contenido de /etc/rc.local

# -------------------------------------------------------------------------------------------------------------------
# Configuración de GPIO's para motor paso a paso: 4, 5, 24, 25, 29 y 32 como salidas
# -------------------------------------------------------------------------------------------------------------------

echo 4 > /sys/class/gpio/export
echo "out" > /sys/class/gpio/gpio4/direction

echo 5 > /sys/class/gpio/export
echo "out" > /sys/class/gpio/gpio5/direction

echo 24 > /sys/class/gpio/export
echo "out" > /sys/class/gpio/gpio24/direction

echo 25 > /sys/class/gpio/export
echo "out" > /sys/class/gpio/gpio25/direction

echo 29 > /sys/class/gpio/export
echo "out" > /sys/class/gpio/gpio29/direction

echo 32 > /sys/class/gpio/export
echo "out" > /sys/class/gpio/gpio32/direction

# ---------------------------------------------------------------------------------------------------------------------


==============================
GPIO's usados para cada Eje (X e Y):
==============================

Motor eje X

LAN1="/sys/class/gpio/gpio24/value"
LAN2="/sys/class/gpio/gpio25/value"
LAN3="/sys/class/gpio/gpio29/value"
LAN4="/sys/class/gpio/gpio32/value"


Motor eje Y

LAN5="/sys/class/gpio/gpio4/value"
LAN6="/sys/class/gpio/gpio5/value"
LAN7="/sys/class/leds/HW556:red:hspa/brightness"
LAN8="/sys/class/leds/HW556:red:message/brightness"



============
Driver/software:
============

Para realizar el montaje y probar las funciones básicas de los motores de los ejes X e Y, están los scripts del enlace de arriba. Sin embargo me estoy viendo en la problemática desde hace 2 semanas de tratar de convertir los dibujos de cualquier programa que están en G-CODE a un formato que lo pueda interpretar para que lo imprima el router. He estado mirando como lo hace Arduino y usa la librería: "customstepper.h", pero me falta saber integrarla en todo esto más lo que hiciera falta.

Enlace de customstepper.h y algunos dibujos exportados https://goo.gl/SQaZmz


¿Les gustaría ayudar a llevar este proyecto adelante? Yo voy a seguir documentándome, pero la verdad que se me está haciendo cuesta arriba, llevo 2 semanas a saco empezando desde 0 y no conocía el mundo 3D.


Un saludo y muchas gracias a todos



===========
Modificaciones:
===========

Añadida foto de impresiones hasta la fecha (07/06/17 a la 1:34 am)
« Última modificación: 15-07-2017, 05:32 (Sábado) por edudi »

Desconectado Tki2000

  • Moderador
  • *
  • Mensajes: 2247
En la biblioteca que pones, sólo veo una actuación directa de los pines del arduino, sobre los polos del motor, dependiente de una constante de tiempo, que es derivada del reloj del arduino.
No hay interpretación del código G-CODE, por lo que supongo que esta interpretación estará hecha, por algún programa, que le mande los datos al arduino.
Si no me equivoco, hace tiempo miré algo de esto, y el programa que interpreta los G-CODE para arduino, se llama GRBL.

edudi

  • Visitante
Raspberry Pi imprimiendo imágenes en GCODE  (usando GPIO's para los drivers L293D)


Vídeo             -=  Pincha Aquí para verlo  =-   


El formato para guardar con GCodeTools del Inkscape es: *.ngc    (Linux CNC GCode)


=========================================================================================
Autor del proyecto: Ian D. Miller --> iandouglas96

engravR --> Raspberry Pi Powered Laser Engraver   (grabador láser)    (2D)

piPrint ----> Raspberry Pi 3D Printer Firmware (impresora 3D)              (3D)

Link al vídeo del proyecto original



Y aquí los códigos para cargar en la Raspberry Pi y poder usar los GCODE (a mi me funcionó con la Pi 3 y el Raspbian).

https://github.com/iandouglas96             (proyecto engravR)

=========================================================================================



OpenWRT imprimiendo imágenes exportadas a *.C y convertidas a scripts   (usando GPIO's para los drivers L293D)


Vídeo              -=  Pincha Aquí para verlo  =-   




Haber encontrado este proyecto "engravR" supone la clave para tratar de portarlo a OpenWRT y hacerlo funcional.

El programa principal "laserengraver" nos da la opción de configurar los pines a usar por cada motor y para cada bobina, el pin para el laser, en nuestro caso el Servo (GPIO 14 x ej) controlado por PWM ó en el peor de los casos por el script que hice, que siempre se puede mejorar, aunque no consigo tiempos exactos ni sé su duración con los que crear un PWM bueno, y por último da la resolución, que es importante, tuve que poner 0.025 en ambos ejes, porque si no Bart salía en modo chapita pa la camisa (minúsculo).

MX=Bipolar_Stepper_Motor(22,18,24,26);     #pin number for a1,a2,b1,b2.  a1 and a2 form coil A; b1 and b2 form coil B

MY=Bipolar_Stepper_Motor(10,8,12,16);       

Laser_switch=3;

dx=0.075; #resolution in x direction. Unit: mm
dy=0.075; #resolution in y direction. Unit: mm


El código está escrito en Python, así que instalé el Python en el router y me dispuse a ejecutar el programa del engraver, aunque ya suponía que no iba a funcionar con la misma. El programa se ejecuta pero obviamente, las librerías incluidas no coinciden con el sistema OpenWRT      https://www.dropbox.com/sh/alc6mwpio8y5ab3/AAAJ8Ms8msGJBxoeJ6_YIE4Aa?dl=0


import RPi.GPIO as GPIO
import Motor_control
from Bipolar_Stepper_Motor_Class import Bipolar_Stepper_Motor
import time
from numpy import pi, sin, cos, sqrt, arccos, arcsin
import argparse


He visto los códigos de las librerías y dentro de lo que puedo llegar a entender de programación (que es poco), creo que se pueden sustituir muchos de ellos por scripts "en principio" y luego en python.

RPi.GPIO --> Me bajé esta librería y el código es bien largo (está en el enlace de arriba), con los scripts de arriba mejorados no habría problema, ya que una vez los GPIO's está exportados al igual que los leds que ni hay que exportarlos, los podemos usar con echo > 1 y echo > 0 como siempre, no hay que comprobar si están libres, etc, como me parece que hace esa librería.

import time --> Tengo una duda sobre esta librería y OpenWRT, ya instalé el sleep, pero cómo se usan los timer del sistema? Sleep no es constante en el tiempo, ....con los triggers del kernel como comentó danitool o se puede hacer de otra forma

from numpy import pi, sin, cos, sqrt, arccos, arcsin import argparse --> Estas desconozco si son del python ¿?¿?


Para el control de los motores están estos 2 scripts sencillos que hice (están en el 1º mensaje):

3_pasos_gpio_der_e_izq_X    (faltaría mejorarlos para que guarden en que bobina/s está situado para cuando retome el movimiento)
3_pasos_gpio_der_e_izq_Y


El láser es sólo 1 pin para activar o desactivarlo, hay que sustituirlo por el servo y manejarlo por PWM, el cual conseguí semi-controlarlo, aunque no es fiable al 100% y a veces gira al revés. Por lo que buscando en el repositorio "PWM" encontré esto:

Install    kmod-pwm    3.10.49-1    Kernel module that implement a generic PWM API
Install    kmod-pwm-gpio    3.10.49-1    Kernel module to models a single-channel PWM device using a timer and a GPIO pin

https://wiki.openwrt.org/doc/hardware/port.gpio/pwm

Sigo los pasos, instalo el "configfs":

Install    kmod-fs-configfs    3.10.49-1    Kernel module for configfs support

Pero me da fallo y no aparece la carpeta pwm en SYS/CLASS/PWM

root@OpenWrt:/# mkdir /config
root@OpenWrt:/# mount -t configfs none /config
root@OpenWrt:/# mkdir /config/gpio_pwm/14
mkdir: can't create directory '/config/gpio_pwm/14': No such file or directory
root@OpenWrt:/# mkdir /config/gpio_pwm
mkdir: can't create directory '/config/gpio_pwm': Operation not permitted



El servo por lo que estoy mirando, al usar sólo 1 PIN y funcionar por PWM, se comporta así en función del movimiento que queramos:


Lo que hice para el servo, fué un simulacro del PWM, que no sé que combinación hice al principio que estaba descontrolado pero se movía bastante y con fuerza, pero modificando el código perdí esa combinación y ya sólo consigo que suba tal como se ve en el vídeo (pocos grados y tuve que hacer un bucle de 3), y bajando si que siempre ha sido igual, más rápido o más lento pero no da un salto brusco, el ruido que se oye, es porque lo controlo con el GPIO 14 que va conectado al relé de ADSL y se pone a toda pastilla.

LAN4="/sys/class/gpio/gpio14/value"

echo 0 > $LAN4

VUELTAS=`expr $1`
TIME=`expr $2`
DIRECCION=`expr $3`
COUNTER=$VUELTAS


if [ $DIRECCION -eq 1 ]
then

# ========== BAJAR BOLÍGRAFO ================

until [  $COUNTER -lt 1 ]; do

#LAN4

echo 0 > $LAN4
sleep $TIME
echo 1 > $LAN4
sleep 0.0001
             
let COUNTER-=1

done

fi

# ========== FIN BAJAR BOLIGRAFO ================




if [ $DIRECCION -eq 0 ]
then

# ========== SUBIR BOLÍGRAFO ================

until [  $COUNTER -lt 1 ]; do


#LAN4

echo 1 > $LAN4
sleep $TIME
echo 0 > $LAN4
sleep 0.018
echo 1 > $LAN4
sleep 0.001

             
let COUNTER-=1

echo 0 > $LAN4



Por otra parte, siempre quedó en la PCB del HG556a el GPIO 14 un pin donde soldar, lo que trabaja a 5v (con un divisor de tensión listo) y no a 3,3 v que es lo típico de los GPIOs, y por lo que he visto el servo trabaja con el pin de señal a 5v (aunque me parece que tb lo hace a 3,3v o en la Raspi no hubiera funcionado si no)

Bueno de momento, esto es todo, si alguien puede dar luz a las sombras se lo agradecería

Sombras:

- Tratar de sustituir las librerías o aclarar la función de cada una, o si el python las tiene y no hay que añadirla (time,
from numpy import pi, sin, cos, sqrt, arccos, arcsin,       import argparse)

- PWM en OpenWRT para controlar el servo. Actualmente uso la 14.07 RC3

- Saber usar el timer sin tener que recompilar el kernel, por si hicieran falta hacer retardos exactos para crear el PWM o por si el "time" importado al código de python no fuera correcto.



En la biblioteca que pones, sólo veo una actuación directa de los pines del arduino, sobre los polos del motor,

dependiente de una constante de tiempo, que es derivada del reloj del arduino.
No hay interpretación del código G-CODE, por lo que supongo que esta interpretación estará hecha, por algún

programa, que le mande los datos al arduino.
Si no me equivoco, hace tiempo miré algo de esto, y el programa que interpreta los G-CODE para arduino, se llama

GRBL.

Buenas, tienes razón en todo, me da que con el overbooking que tenía en mi cabeza no asimiliba más conceptos y el código se vuelve matrix para mi (vaya que no me entero ni de lo que tengo delante).

edudi

  • Visitante
Buenas, he estado trasteando en Python (primera vez in my life), y ya hice lo básico con GPIOS:

- Encender un led
- Hacer bucles con retardos, etc..

Bucle de led encendido y apagado:


import sys
import time

print "Blinking User LED"
print "Enter CTRL+C to exit"

def ledon():
        value = open("/sys/class/gpio/gpio497/value","w")
        value.write(str(1))
        value.close()

def ledoff():
        value = open("/sys/class/gpio/gpio497/value","w")
        value.write(str(0))
        value.close()

while True:
        ledon()
        time.sleep(0.05)
        ledoff()
        time.sleep(0.05)



Quise ir adaptando mi código para poder controlar el motor paso a paso sin importar la librería "import RPi.GPIO as GPIO":

- Movimiento del motor en las dos direcciones pero con programas diferentes (falta que al mismo programa se le pase por argumento el nº de pasos, velocidad y dirección)

Movimiento de motor paso a paso en 1 dirección (debajo está el mismo programa con el bucle invertido para la otra dirección)

import sys
import time

print "Motor se mueve 1 vuelta"
print "Enter CTRL+C to exit"

delay = 0.00055

def LAN3on():
        value = open("/sys/class/gpio/gpio496/value","w")
        value.write(str(1))
        value.close()

def LAN3off():
        value = open("/sys/class/gpio/gpio496/value","w")
        value.write(str(0))
        value.close()

def LAN2on():
        value = open("/sys/class/gpio/gpio497/value","w")
        value.write(str(1))
        value.close()

def LAN2off():
        value = open("/sys/class/gpio/gpio497/value","w")
        value.write(str(0))
        value.close()

def LAN1on():
        value = open("/sys/class/gpio/gpio501/value","w")
        value.write(str(1))
        value.close()

def LAN1off():
        value = open("/sys/class/gpio/gpio501/value","w")
        value.write(str(0))
        value.close()

def LAN4on():
        value = open("/sys/class/gpio/gpio504/value","w")
        value.write(str(1))
        value.close()

def LAN4off():
        value = open("/sys/class/gpio/gpio504/value","w")
        value.write(str(0))
        value.close()

while True:

   time.sleep(delay)
   LAN4on()
   time.sleep(delay)
   LAN3on()
   time.sleep(delay)
   LAN4off()
   time.sleep(delay)
   LAN2on()
   time.sleep(delay)
   LAN3off()
   time.sleep(delay)
   LAN1on()
   time.sleep(delay)
   LAN2off()
   time.sleep(delay)
   LAN4on()
   time.sleep(delay)
   LAN1off()


Este es el bucle para el otro sentido:

while True:
   time.sleep(delay)
   LAN1on()
   time.sleep(delay)
   LAN2on()
   time.sleep(delay)
   LAN1off()
   time.sleep(delay)
   LAN3on()
   time.sleep(delay)
   LAN2off()
   time.sleep(delay)
   LAN4on()
   time.sleep(delay)
   LAN3off()
   time.sleep(delay)
   LAN1on()
   time.sleep(delay)
   LAN4off()


Control de un servo:

- Movimiento del servo con movimientos "precisos", de 90º grados hacia la izquierda y retorno al centro.
- Bucles, etc...
- Falta hacerlo fino fino, para que nunca falle, de momento va cuasi perfecto, sólo 1 vez no subió al centro del todo.

Bucle de Servo: desde los 90º de la izquierda hacia el centro y al revés (parte redonda del microservo mirando hacia ti)

import sys
import time

print "Enter CTRL+C to exit"

bucle = 0
vueltas1 = 0
vueltas2 = 0


def ledon():
        value = open("/sys/class/gpio/gpio486/value","w")
        value.write(str(1))
        value.close()

def ledoff():
        value = open("/sys/class/gpio/gpio486/value","w")
        value.write(str(0))
        value.close()


while bucle < 9:
   while vueltas1 < 9:
      ledoff()
           time.sleep(0.0015)
             ledon()
           time.sleep(0.01)
      ledoff()
      vueltas1 = vueltas1 + 1

   time.sleep(1)
   print 'Vuelta n = %d' % bucle
      
   
   while vueltas2 < 9:
      ledoff()
           time.sleep(0.00025)
           ledon()
           time.sleep(0.01)
      vueltas2 = vueltas2 + 1

   time.sleep(0.5)
   print "Bucle 2"

   vueltas1 = 0
   vueltas2 = 0
   bucle = bucle + 1


Esto es el comicio queriendo convertir el programa que hice en scripts a Python, principalmente el que lo quiera era evitar la librería RPi.GPIO que hará falta para el programa python "engraver". Y evitar la inexactitud y la limitación de un retardo muy pequeño usando tanto el "sleep $TIME" como el "seq $TIME >/dev/null". Ahora la bandeja del motor se mueve a la velocidad adecuada.

========================================== ____________ =============================================


Por tanto, RPi.GPIO ya se podría decir que está solucionada, faltaría meterla como una librería o algo así, pero vaya que ya se sabía que era fácil de sustituir el método de exportación de los GPIOs.

Ahora bien, sigo por donde lo dejé planteado:


import RPi.GPIO as GPIO
import Motor_control
from Bipolar_Stepper_Motor_Class import Bipolar_Stepper_Motor
import time
from numpy import pi, sin, cos, sqrt, arccos, arcsin
import argparse

He visto los códigos de las librerías y dentro de lo que puedo llegar a entender de programación (que es poco), creo que se pueden sustituir muchos de ellos por scripts "en principio" y luego en python.

RPi.GPIO --> Me bajé esta librería y el código es bien largo (está en el enlace de arriba), con los scripts de arriba mejorados no habría problema, ya que una vez los GPIO's está exportados al igual que los leds que ni hay que exportarlos, los podemos usar con echo > 1 y echo > 0 como siempre, no hay que comprobar si están libres, etc, como me parece que hace esa librería  --> SOLUCIONADO

import time --> Tengo una duda sobre esta librería y OpenWRT, ya instalé el sleep, pero cómo se usan los timer del sistema? Sleep no es constante en el tiempo, ....con los triggers del kernel como comentó danitool o se puede hacer de otra forma  --> SOLUCIONADO

from numpy import pi, sin, cos, sqrt, arccos, arcsin import argparse --> Estas, estoy tratando de importar numpy en OpenWRT y me las estoy viendo muy negras porque me da fallo o lo hago mal. Si he visto en un compañero que tiene esto:

https://github.com/allaudet/openwrt-extra-packages

Donde está el numpy lang, pero no sé si sólo es el lenguaje o es el resto.


Si se consigue tener estas librerías, ya se puede portar el programa engraver a OpenWRT y ver como un santo router es capaz de realizar la función de cortar con un láser una hoja de papel (si se relentiza un poco los retardos), marcar la superficie en cartón/madera/plástico, etc...

Un manita por favor.......

Saludos a todos

edudi

  • Visitante
Buenas, estoy tratando de instalar la librería NUMPY para que la use el python, pero me da este error usando dos métodos diferentes, con el PIP y con el numpy descargado y trantando de instalarlo mediante Python.

Alguien sabe a que se refieren estos errores en las dos opciones usadas? O si podrían intentar instalar el numpy a ver si pueden, porque yo no lo consigo:




root@OpenWrt:/Edu_pruebas/numpy# python setup.py install
Running from numpy source directory.

Note: if you need reliable uninstall behavior, then install
with pip instead of using `setup.py install`:

  - `pip install .`       (from a git repo or downloaded source
                           release)
  - `pip install numpy`   (last NumPy release on PyPi)


Cythonizing sources
numpy/random/mtrand/randint_helpers.pxi.in has not changed
Processing numpy/random/mtrand/mtrand.pyx
Traceback (most recent call last):
  File "<string>", line 1, in <module>
ImportError: No module named Cython.Compiler.Main
Traceback (most recent call last):
  File "/Edu_pruebas/numpy/tools/cythonize.py", line 220, in <module>
    main()
  File "/Edu_pruebas/numpy/tools/cythonize.py", line 216, in main
    find_process_files(root_dir)
  File "/Edu_pruebas/numpy/tools/cythonize.py", line 208, in find_process_files
    process(cur_dir, fromfile, tofile, function, hash_db)
  File "/Edu_pruebas/numpy/tools/cythonize.py", line 167, in process
    processor_function(fromfile, tofile)
  File "/Edu_pruebas/numpy/tools/cythonize.py", line 81, in process_pyx
    raise Exception('Cython failed')
Exception: Cython failed
Traceback (most recent call last):
  File "setup.py", line 393, in <module>
    setup_package()
  File "setup.py", line 376, in setup_package
    generate_cython()
  File "setup.py", line 212, in generate_cython
    raise RuntimeError("Running cythonize failed!")
RuntimeError: Running cythonize failed!
root@OpenWrt:/Edu_pruebas/numpy#





root@OpenWrt:/Edu_pruebas/numpy# pip install  numpy
Collecting numpy
  Downloading numpy-1.13.3.zip (5.0MB)
    99% |############################### | 5.0MB 261kB/s eta 0:00:01Exception:
Traceback (most recent call last):
  File "/usr/lib/python2.7/site-packages/pip/basecommand.py", line 215, in main
    status = self.run(options, args)
  File "/usr/lib/python2.7/site-packages/pip/commands/install.py", line 324, in run
    requirement_set.prepare_files(finder)
  File "/usr/lib/python2.7/site-packages/pip/req/req_set.py", line 380, in prepare_files
    ignore_dependencies=self.ignore_dependencies))
  File "/usr/lib/python2.7/site-packages/pip/req/req_set.py", line 620, in _prepare_file
    session=self.session, hashes=hashes)
  File "/usr/lib/python2.7/site-packages/pip/download.py", line 821, in unpack_url
    hashes=hashes
  File "/usr/lib/python2.7/site-packages/pip/download.py", line 659, in unpack_http_url
    hashes)
  File "/usr/lib/python2.7/site-packages/pip/download.py", line 882, in _download_http_url
    _download_url(resp, link, content_file, hashes)
  File "/usr/lib/python2.7/site-packages/pip/download.py", line 603, in _download_url
    hashes.check_against_chunks(downloaded_chunks)
  File "/usr/lib/python2.7/site-packages/pip/utils/hashes.py", line 46, in check_against_chunks
    for chunk in chunks:
  File "/usr/lib/python2.7/site-packages/pip/download.py", line 571, in written_chunks
    for chunk in chunks:
  File "/usr/lib/python2.7/site-packages/pip/utils/ui.py", line 139, in iter
    for x in it:
  File "/usr/lib/python2.7/site-packages/pip/download.py", line 560, in resp_read
    decode_content=False):
  File "/usr/lib/python2.7/site-packages/pip/_vendor/requests/packages/urllib3/response.py", line 357, in stream
    data = self.read(amt=amt, decode_content=decode_content)
  File "/usr/lib/python2.7/site-packages/pip/_vendor/requests/packages/urllib3/response.py", line 314, in read
    data = self._fp.read(amt)
  File "/usr/lib/python2.7/site-packages/pip/_vendor/cachecontrol/filewrapper.py", line 63, in read
    self._close()
  File "/usr/lib/python2.7/site-packages/pip/_vendor/cachecontrol/filewrapper.py", line 50, in _close
    self.__callback(self.__buf.getvalue())
  File "/usr/lib/python2.7/site-packages/pip/_vendor/cachecontrol/controller.py", line 275, in cache_response
    self.serializer.dumps(request, response, body=body),
  File "/usr/lib/python2.7/site-packages/pip/_vendor/cachecontrol/serialize.py", line 55, in dumps
    "body": _b64_encode_bytes(body),
  File "/usr/lib/python2.7/site-packages/pip/_vendor/cachecontrol/serialize.py", line 12, in _b64_encode_bytes
    return base64.b64encode(b).decode("ascii")
  File "/usr/lib/python2.7/base64.py", line 53, in b64encode
    encoded = binascii.b2a_base64(s)[:-1]
MemoryError

root@OpenWrt:/Edu_pruebas/numpy#


Sale por último MemoryError, pero tiene memoria de sobra tanto en SD, tmp, com interna.



Un saludo
« Última modificación: 25-10-2017, 04:31 (Miércoles) por edudi »