Calificación:
  • 0 voto(s) - 0 Media
  • 1
  • 2
  • 3
  • 4
  • 5
CONSULTA Modificar Marlin
#1
Hola Buenos dias, soy Javi de Madrid.

Necesito modificar Marlin para conseguir que me funcionen los detectores de filamento en mi Prusa, haber si podeis ayudarme.

Tengo una placa Rumba y una TFT de 3.5 de MKS. El problema me surge al intentar conectar 3 detectores de filamento con esta configuracion de hardware. Esta pantalla de MKS solo tiene entrada para un dedtector de filamento.

Mi idea seria conectar los 3 sensores de filamento a la placa en pines diferentes, y conseguir que estos den señal a la pantalla a traves de otro pin, para poder detectarlo en la pantalla y manejarlo desde ahi.

En resumen, necesito que marlin cuando detecte señal por uno de los 3 pins de la placa a los que estan conectados los sensores de filamento, me de señal en otro pin para que llegue a la TFT y me pause la impresion.En arduino seria muy facil hacerlo, pero la complegidad de Marlin me lia y no me entero de nada.

Un saludo y gracias por buestra colaboracion.
Citar
#2
Voy a añdir informacion, haber si me llega el alma caritativa para solucionar mi problema, El codigo que quiero añadir en arduino seria el siguiente:
Código:
// 3SENSORES DE FILAMENTO A UN PIN DE CONTROL
const int SALIDA=40;
const int SENSOR1=41;
const int SENSOR2=18;
const int SENSOR3=42;
int val;
void setup(){
pinMode(SALIDA,OUTPUT);
pinMode(SENSOR1,INPUT);
pinMode(SENSOR2,INPUT);
pinMode(SENSOR3,INPUT);
}
void loop(){
val=digitalRead(SENSOR1);
if  (val==HIGH){
digitalWrite(SALIDA,HIGH);
}
else { digitalWrite(SALIDA,LOW);
}
}
void loop(){
val=digitalRead(SENSOR2);
if  (val==HIGH){
digitalWrite(SALIDA,HIGH);
}
else { digitalWrite(SALIDA,LOW);
}
}
void loop(){
val=digitalRead(SENSOR3);
if  (val==HIGH){
digitalWrite(SALIDA,HIGH);
}
else { digitalWrite(SALIDA,LOW);
}
}

Bien, este es el codigo en arduino, lo que no se es como adaptarlo y meterlo en el  Marlin. Haber si alguien me hecha una mano.

Un saludo y gracias.
Citar
#3
Hola, no lo indicas pero doy por sentado (por lógica) que los tres sensores serán para utilizarlos en tres filamentos distintos (tres extrusores), uno en cada uno de ellos.
Si es así, no es necesario programar nada pues Marlin soporta varios sensores, uno por cada extrusor.
Solo hay que configurarlo para utilizar ese número de sensores, definiendo el pin que controla cada uno de ellos y el script que debe ejecutarse cuando se dispara el del extrusor activo.
La configuración se encuentra en el archivo Configuration.h, en las siguientes líneas que en tu caso se escribirían así:

/**
* Filament Runout Sensors
* Mechanical or opto endstops are used to check for the presence of filament.
*
* RAMPS-based boards use SERVO3_PIN for the first runout sensor.
* For other boards you may need to define FIL_RUNOUT_PIN, FIL_RUNOUT2_PIN, etc.
* By default the firmware assumes HIGH=FILAMENT PRESENT.
*/
#define FILAMENT_RUNOUT_SENSOR
#if ENABLED(FILAMENT_RUNOUT_SENSOR)
 #define NUM_RUNOUT_SENSORS   3     // Number of sensors, up to one per extruder. Define a FIL_RUNOUT#_PIN for each.
 #define FIL_RUNOUT_PIN 41
 #define FIL_RUNOUT2_PIN 18
 #define FIL_RUNOUT3_PIN 42
 #define FIL_RUNOUT_INVERTING false // set to true to invert the logic of the sensor.
 #define FIL_RUNOUT_PULLUP          // Use internal pullup for filament runout pins.
 #define FILAMENT_RUNOUT_SCRIPT "M42 P40 S255"
#endif


Como indicaba, necesariamente habrá también que configurar el número de extrusores a 3.
En general y respondiendo a la pregunta concreta, Marlin tiene su loop donde se puede colocar el código que se necesite ejecutar contínuamente. Se encuentra al final del archivo Marlin_main.cpp.
Dado que lo que se encuentra en él se ejecuta de forma contínua, conviene que el código que se coloque esté bien optimizado, para que su ejecución sea lo más rápida posible.
Citar
#4
Si, Simemart son 3 sensores con 3 extrusores, lo he configurado como comentas, pero por el tipo de pantalla la TFT me pone la impresion en pausa pero no me envia mensaje a la pantalla con lo cual no me deja reanudar la impresion. Necesito que en ved de configurar el Script, me de salida a un pinout que le diga a mi pantalla que no hay filamento.

El problema radica en que mi pantalla solo tiene entrada para un sensor de filamento y no reibe los mensajes de marlin, va como independiente, si marlin le manda un M600 para cambiar filamento o hace una pausa la pantalla no lo recibe y se queda parada y no deja reanudar la impresion. Sin embargo si le meto señal por la entrada de filamento entonces si se activa la pausa y da opcion a reanudar. Digamos que es una pantalla tonta, no recibe comunicacion de marlin.

Por eso quiero que en ved de que marlin me ejecute un script de pausa o de cambio de filamento, me de señal en un pin para mandarselo a la pantalla.

De todas maneras gracias, voy a mirar lo que me has dicho del archivo de loop haber si puedo meter algo por ahi y funciona.
Citar
#5
No has mirado con detenimiento lo que te he puesto en la respuesta. El script de final de filamento hace que se ponga en HIGH el pin que indicas que quieres conectar a la TFT.
Citar
#6
(28-09-2019, 10:46 PM)Simemart escribió: No has mirado con detenimiento lo que te he puesto en la respuesta. El script de final de filamento hace que se ponga en HIGH el pin que indicas que quieres conectar a la TFT.

Como tengo que indicar ese scrip, a mi por defecto me pone M600 entonces me hace una pausa, que tendria que poner en el scrip para que me diera señal en un pin... con eso me has salvado.

jeje


ok ok ya lo he visto mil perdones por mi torpeza lo unico que no entiendo es el S255, si se supone que es digital, supongo que el S255 es para un analogico no?

Las vueltas que he dado y era mucho mas facil... no habia visto ese comando M42

Te debo una cerveza tio...

Voy ha configurarlo y probarlo en una placa que tengo por aqui suelta.... Haber si soy capaz.
Citar
#7
Pues sí, me colé al poner S255, pero no es por ser digital o analógico. El rango del parámetro S en el comando M42, puede ser 0-1 o 0-255. Este último caso es para los pines con PWM. Como el pin 40 no tiene esa capacidad, habría que escribir M42 P40 S1 para ponerlo HIGH (S0 para LOW).
Si no me equivoco, el nivel de disparo del pin asociado al final de filamento se indica en el archivo de configuración de la TFT, por lo que tendrás que mirar cual tienes en él, si HIGH o LOW.
Citar
#8
(29-09-2019, 01:00 AM)Simemart escribió: Pues sí, me colé al poner S255, pero no es por ser digital o analógico. El rango del parámetro S en el comando M42, puede ser 0-1 o 0-255. Este último caso es para los pines con PWM. Como el pin 40 no tiene esa capacidad, habría que escribir M42 P40 S1 para ponerlo HIGH (S0 para LOW).
Si no me equivoco, el nivel de disparo del pin asociado al final de filamento se indica en el archivo de configuración de la TFT, por lo que tendrás que mirar cual tienes en él, si HIGH o LOW.

No no te colaste, Simemart . Hay que poner S255 si no no activa el pin, me esta volviendo loco. Con M42 P40 S1 el pin se queda en 0.

Ahora mi problema es que se activa el pin, pero cuando reestableces el filamento, deja el pin en alto y no deja reanudar. ¿Alguna idea para bajar el pin de que detecte filamento?. O para añadir un segundo GCODE para que lo baje.

Tambien estoy mirando el M43 T para pulsar el pin, pero todavia no controlo bien como usarlo.

Alguna Ayuda??

Gracias a Todos.
Citar
#9
Hola, como es lógico, si pones a HIGH ese pin, también tendrás que desactivarlo.
Olvídate del comando M43 T pues no va a servirte para este propósito y como hagas una mala configuración de él, puedes llegar a cargarte el pin de la MCU.
Quizá haya una solución a tu problema, pues supongo que el proceso que se desencadena al activarse el pin es: se detiene el envio de comandos del archivo de la pieza a la cola, se envía a la cola el comando de elevación del eje Z y se espera hasta que se pulsa para reanudar la impresión. Entonces se baja el eje Z a su posición y se continúa enviando los comandos del fichero desde el punto donde se interrumpió la impresión.
Si es así (que creo que sí lo es), para solucionar tu problema solo habría que colocar en el FILAMENT_RUNOUT_SCRIPT los dos comandos, primero el de activación y después el de desactivación, pues los dos se van a colocar en la cola de proceso antes de que la TFT tome el control, lo que hará que se procesen antes de que eso suceda.
Quedaría algo así:

#define FILAMENT_RUNOUT_SCRIPT "M42 P40 S255\nM42 P40 S0"

Si por producirse demasiado rápido la activación y desactivación del pin, la TFT no se diese por enterada, habría que poner un comando de pausa (de la duración necesaria) entre ambas ordenes.
Para ello hay que utilizar el comando G4. El parámetro a incluir en él depende de como vayamos a medir la pausa: si es en milisegundos, seria G4 Pms (ms=nº de milisegundos); si es en segundos, G4 Ssg (sg=nº de segundos).
Por ejemplo, supongamos que solo con los comandos de activación y desactivación no se produce la pausa en la TFT, podríamos colocar entre ellos una pausa de medio segundo así:

#define FILAMENT_RUNOUT_SCRIPT "M42 P40 S255\nG4 P500\nM42 P40 S0"
Citar
#10
Fotografía 
Hola.
Quizas mi respuesta es una metedura de pata y no entienda que es lo que quieres conseguir, pero a mi modo de ver la solucion es mucho mas sencilla de lo que estais proponiendo.

Con tres entradas en Marlin y una salida a la TFT que al activarse nos hara saltar el "error por falta de filamento", sin saber exactamento que sensor se activo.


Creo que esto mismo se puede conseguir de una forma mas sencilla y sin tocar el firmware. Conectando los tres sensores en paralelo a la placa TFT cuando alguno de los sensores se active mandara a la pantalla la señal de falta de filamento. Algo asi:
resim

Saludos
Citar
#11
Hola @makoki_63, no es ninguna metedura de pata. Por el contrario, cuestionar con argumentos las respuestas que se ponen en el foro es algo muy necesario y que se ve bastante poco últimamente por aquí, quizá porque algunos se lo toman como un ataque personal. No es mi caso, por lo que te agradezco el comentario.
Efectivamente, el montaje que indicas podría también solucionar el problema que se plantea y creo que es la mejor forma de hacerlo, aunque con algunas salvedades que quizá no hayas tenido en cuenta y que indico más adelante. La verdad es que no me paré a pensar en alternativas, dado que @thepost ya tenia elegida la vía que quería seguir (modificando el firmware).
En relación con tu esquema, he de decir que es algo simplificado, pues tanto la TFT como los sensores tienen 3 conectores y no indicas cuales habría que conectar. Por otro lado, diría que también es muy "eléctrico", entendiendo con ello que refleja lo que suele suceder en circuitos con interruptores que controlan el paso o no de la corriente, pero en este caso las cosas son algo más complejas.
Estos circuitos conectan con los pines de una MCU que están siempre a nivel alto (voltaje máximo) y los cambios de estado que dicha MCU detecta en ellos se realizan conectando el circuito a GND (0V).
Es por esto que el sofware que controla las funciones como la que estamos tratando, incluyen un parámetro que indica como debe tomarse la lógica del circuito. Es decir, qué tiene que considerar el software cuando está a nivel alto el pin y qué cuando está a nivel bajo. Y también por esto, los sensores e interruptores (realmente son conmutadores) que se utilizan tienen 3 puntos de conexión: NC (normalmente abierto), NO (normalmente cerrado) y C (común).
Tal como lo ha hecho @thepost, tiene configurado que la TFT detecte el final del filamento cuando el pin se ponga a nivel alto, por lo que en el funcionamiento normal (presencia de filamento) el pin tiene que estar puesto a GND (0V).
Para que el montaje que indicas le funcione, tendría que cambiar la lógica configurada en el firmware de la pantalla, pues sino cuando se activase un interruptor no se pondría a nivel alto el pin, ya que seguiría conectado a GND por cualquier interruptor no activado.
Realmente, el montaje correcto para esta funcionalidad debe realizarse utilizando los tres pines que integran el conector habilitado en la TFT, con el estado alto del pin como presencia del filamento y el bajo como activación del sensor, cambiando la lógica en el firmware de la pantalla.
Y esto por dos razones: la primera, porque así se asegura que no hay estados indefinidos del pin, ya que lo ponemos expresamente en estado alto o bajo y la segunda y más importante, porque (si no estoy equivocado) la TFT trabaja a 3,3V, mientras que la placa principal de la impresora lo hace a 5V.
Me parece que @thepost no ha caido en esto (yo acabo de verlo al elaborar esta respuesta) y con su montaje le está metiendo 5V al pin de la TFT cuando deberían ser 3,3V, cosa que no sé como le estará sentando.
Si utilizamos el esquema que planteas de conexión directa de los tres sensores a la TFT y son interruptores típicos de final de carrera (que estarán pulsados cuando hay presencia de filamento), las conexiones serían así:

resim

Yo personalmente utilizaría este esquema para este propósito.
Naturalmente, también se puede realizar utilizando solo los conectores PB1 y GND, aunque como digo eso nos hace depender de las resistencias de pullup internas del micro (que son las que mantienen el nivel alto del pin).
Citar
#12
Hola @Simemart

He visto los sensores de filamento conectados con 2 o con 3 pines a la placa TFT y en ambos casos funciona, pero el esquema que pusiste es mas completo con los 3 pines.

Tengo una MKS Sbase y una TFT32 en mi impresora y aun no he puesto el sensor de filamento, por flojo... y porque normalmente no dejo la impresora sola imprimiendo.

Saludos
Citar
#13
(06-10-2019, 09:54 PM)Simemart escribió: Hola @makoki_63, no es ninguna metedura de pata. Por el contrario, cuestionar con argumentos las respuestas que se ponen en el foro es algo muy necesario y que se ve bastante poco últimamente por aquí, quizá porque algunos se lo toman como un ataque personal. No es mi caso, por lo que te agradezco el comentario.
Efectivamente, el montaje que indicas podría también solucionar el problema que se plantea y creo que es la mejor forma de hacerlo, aunque con algunas salvedades que quizá no hayas tenido en cuenta y que indico más adelante. La verdad es que no me paré a pensar en alternativas, dado que @thepost ya tenia elegida la vía que quería seguir (modificando el firmware).
En relación con tu esquema, he de decir que es algo simplificado, pues tanto la TFT como los sensores tienen 3 conectores y no indicas cuales habría que conectar. Por otro lado, diría que también es muy "eléctrico", entendiendo con ello que refleja lo que suele suceder en circuitos con interruptores que controlan el paso o no de la corriente, pero en este caso las cosas son algo más complejas.
Estos circuitos conectan con los pines de una MCU que están siempre a nivel alto (voltaje máximo) y los cambios de estado que dicha MCU detecta en ellos se realizan conectando el circuito a GND (0V).
Es por esto que el sofware que controla las funciones como la que estamos tratando, incluyen un parámetro que indica como debe tomarse la lógica del circuito. Es decir, qué tiene que considerar el software cuando está a nivel alto el pin y qué cuando está a nivel bajo. Y también por esto, los sensores e interruptores (realmente son conmutadores) que se utilizan tienen 3 puntos de conexión: NC (normalmente abierto), NO (normalmente cerrado) y C (común).
Tal como lo ha hecho @thepost, tiene configurado que la TFT detecte el final del filamento cuando el pin se ponga a nivel alto, por lo que en el funcionamiento normal (presencia de filamento) el pin tiene que estar puesto a GND (0V).
Para que el montaje que indicas le funcione, tendría que cambiar la lógica configurada en el firmware de la pantalla, pues sino cuando se activase un interruptor no se pondría a nivel alto el pin, ya que seguiría conectado a GND por cualquier interruptor no activado.
Realmente, el montaje correcto para esta funcionalidad debe realizarse utilizando los tres pines que integran el conector habilitado en la TFT, con el estado alto del pin como presencia del filamento y el bajo como activación del sensor, cambiando la lógica en el firmware de la pantalla.
Y esto por dos razones: la primera, porque así se asegura que no hay estados indefinidos del pin, ya que lo ponemos expresamente en estado alto o bajo y la segunda y más importante, porque (si no estoy equivocado) la TFT trabaja a 3,3V, mientras que la placa principal de la impresora lo hace a 5V.
Me parece que @thepost no ha caido en esto (yo acabo de verlo al elaborar esta respuesta) y con su montaje le está metiendo 5V al pin de la TFT cuando deberían ser 3,3V, cosa que no sé como le estará sentando.
Si utilizamos el esquema que planteas de conexión directa de los tres sensores a la TFT y son interruptores típicos de final de carrera (que estarán pulsados cuando hay presencia de filamento), las conexiones serían así:

resim

Yo personalmente utilizaría este esquema para este propósito.
Naturalmente, también se puede realizar utilizando solo los conectores PB1 y GND, aunque como digo eso nos hace depender de las resistencias de pullup internas del micro (que son las que mantienen el nivel alto del pin).

Ese es el esquema que he usado en un principio, con diferencia de que tenia conectado el voltaje y la masa a la placa. A la pantalla solo mandaba el pin de control. Con un sensor funcionaba bien, pero en cuanto conectaba dos sensores colapsaba la pantalla y se reiniciaba.

Voy a probar el tema del pin y la pausa haber como va con ese nuevo script.

Gracias. os voy contando.
Citar
#14
Te recomiendo que no lo sigas intentando como lo estabas haciendo o es muy posible que te cargues la TFT.
La solución correcta es utilizar lo que indicaba @makoki_63, cablear todo según el esquema que he puesto en mi última respuesta y cambiar en el archivo de configuración de la TFT el parámetro cfg_PB1_trigger_Level al valor apropiado. Con eso te debería funcionar perfectamente.
Citar
#15
(07-10-2019, 11:21 PM)Simemart escribió: Te recomiendo que no lo sigas intentando como lo estabas haciendo o es muy posible que te cargues la TFT.
La solución correcta es utilizar lo que indicaba @makoki_63, cablear todo según el esquema que he puesto en mi última respuesta y cambiar en el archivo de configuración de la TFT el parámetro cfg_PB1_trigger_Level al valor apropiado. Con eso te debería funcionar perfectamente.


Ya lo he puesto y me reinicia la pantalla en cuanto se activa uno de los finales de carrera. se queda la pantalla en blanco y se reinicia. No se que puede pasar... Voy a darle una vuelta haber que veo. En cuanto meto 2 sensores de control en el mismo pin se reinicia.

He visto que la pantalla tiene el PB0,PB1,PB2 Y PB3, el PB0 se usa para apagar la impresora pero los otros 2 no tienen uso. No se si se podran usar para el final de carrera, le voy ha hechar un ojo tambien, haber si puedo instalarlo.

Bueno confirmado, el PB0 y el PB1 se puede usar para final de filamento. El PB4 es para apagar la impresora. Me falta uno y me queda el PB5 para usarlo para el tercer filamento, pero no soy capaz de configurarlo. Lo configuro igual que el PB0 y el PB1 pero no va.

Si alguien tiene informacion detallada del archivo de configuracion de pantalla y hace el fabor de mandarme algo de informacion.

Venga un saludo.
Citar
#16
(07-10-2019, 11:21 PM)Simemart escribió: Te recomiendo que no lo sigas intentando como lo estabas haciendo o es muy posible que te cargues la TFT.
La solución correcta es utilizar lo que indicaba @makoki_63, cablear todo según el esquema que he puesto en mi última respuesta y cambiar en el archivo de configuración de la TFT el parámetro cfg_PB1_trigger_Level al valor apropiado. Con eso te debería funcionar perfectamente.

Bueno chicos ya solucionado, muchas gracias por la ayuda.

Al final he usado el esquema de Sinemart, pero he tenido que añadir 3 Diodos Zener para evitar el reflujo de tension hacia los detectores de filamento que probocaban el reinicio de la pantalla. Ya esta perfecto.

Muchas gracias y un saludo compañeros.

Bueno rectifico, despues de muchas vueltas, no me a quedado otra que poner un octoacoplador. Si alguien esta interesado os hago un diagrama....
Citar
#17
(09-10-2019, 10:15 PM)thepost escribió: Bueno chicos ya solucionado, muchas gracias por la ayuda.

Al final he usado el esquema de Sinemart, pero he tenido que añadir 3 Diodos Zener para evitar el reflujo de tension hacia los detectores de filamento que probocaban el reinicio de la pantalla. Ya esta perfecto.

Muchas gracias y un saludo compañeros.

Bueno rectifico, despues de muchas vueltas, no me a quedado otra que poner un octoacoplador. Si alguien esta interesado os hago un diagrama....

@thepost te agradeceria que pongas el diagrama de como lo has conseguido finalmente.

En el esquema de @Simemart, mirandolo mas detenidamente, lo que veo es que los tres sensores, teniendo filamento,  estan enviando una señal "3.3v" al PB1, cuando uno de los sensores le falta filamento, solo ese sensor envia la señal "ground", uniendose las dos señales a la entrada del PB1.

Saludos
Citar
#18
Hola, efectivamente tengo que pedir disculpas por pasar por alto ese importante detalle.
El esquema que puse es el de un solo sensor, ampliado para utilizar 3 sensores y eso no es correcto. Para este montaje no se puede conectar el pin de 3,3V, pues efectivamente se produce un corto con los sensores que no se activan y que es el motivo del reinicio de la pantalla.
Para solucionarlo hay dos formas: como ha hecho @thepost mediante unos diodos que lo evitan o bien conectando solo los pines PB1 y - del esquema, que en esencia es el que indicaba @makoki_63 .
Siento el despiste.
Citar
#19
Aqui os dejo el esquema @makoki_63 y @Simemart , perdonar que es un poco chapucero.


resim

Yo he conectado los sensores a la placa para no mandar mas cableado hacia la TFT,por esos he puesto alimentado a 5v, asi con un cable en el pb1 de la TFT tengo controlados los 3 sensores. Podeis conectarlo tambien a la pantalla a 3.3v. La resistencia si hace alguien el favor de calcularla, yo creo que es de 220 ohms pero no os fieis mucho que el tema de las resistencias las llevo fatal. Si alguno de los sensores no lo vais a usar con desconectarlo es suficiente para que no mande señal.

resim

Estoy usando este sensor de bigtree-tech.

Venga un saludo.
Citar
#20
Hola, el esquema que indicas es correcto para esos sensores (supongo que tendrás conectados rojo a +5V, negro a GND y verde a los diodos) y la resistencia de 220 Ohms puede valer. Con ella circula por el fotoemisor 23mA y el valor nominal máximo para el optoacoplador PC817 son 50mA.
Pero lo que no entiendo es porqué necesitas los diodos, pues por ahí no puede haber corriente inversa. Es imposible que con ese montaje se te reiniciase la TFT.
El hecho de utilizar esos sensores te está obligando a utilizar el optoacoplador. Si utilizases unos sensores típicos (solo conmutadores) te permitiría prescindir de todo, con este esquema mucho mas sencillo, que funcionaría igual que el que tienes ahora y llevando un solo cable a la TFT:

resim
Citar


Temas similares...
Tema Autor Respuestas Vistas Último mensaje
  Modificar firmeare prusa i3 pro w felitos 2 186 25-07-2019, 01:13 PM
Último mensaje: felitos
  CONSULTA Modificar la lectura de temperatura en display PEKY 0 613 13-04-2018, 09:03 PM
Último mensaje: PEKY
  DUDA COMO MODIFICAR EL FIRMWARE PRUSA I3 fran_buchi 3 1,276 06-11-2017, 06:25 PM
Último mensaje: PrimeraRata
  modificar un archivo stl tognaco 18 12,415 06-06-2017, 06:15 PM
Último mensaje: buratatxo
  Modificar la pantalla de info. Miguel75 10 2,467 06-08-2016, 10:22 AM
Último mensaje: grafisoft