Recien estoy empezando a escribir ese articulo, asi que trabajo en progreso...
Mi placa usa un micro atmega644p, por lo que tuve que modificar boards.txt para setear los fusibles y que se desactivara el JTAG interno. Esto impedia el uso de los pines destinados a los sensores de inicio de recorrido y el de direccion del eje X. Se cambia el valor hexadecimal "0x9A" por "0xDA" y listo, lo mismo pero con JTAG deshabilitado. Mas info al respecto en: http://www.engbedded.com/fusecalc/
vi ~/arduino-1.0.1/hardware/sanguino/boards.txt
# atmega644.bootloader.high_fuses=0x9A
atmega644.bootloader.high_fuses=0xDA
Para poder utilizar Arduino como interface de desarrollo, primero hay que cargar un bootloader en el microcontrolador de la Sanguinololu. En teoria Sanguino y Gen7 deberian funcionar, pero en la practica Gen7 no respondia y solo Sanguino funciono.
En este caso se usa el protocolo ISP por lo que es necesario un programador que sera un clasico Arduino duemilanove.
Se empieza iniciando el entorno de desarrollo Arduino 1.1
cd ~/arduino-1.0.1
./arduino
Preparacion del Arduino como ISP
Se enchufa el arduino duemilanove al USB y se lo selecciona:
Tools -> Serial Port -> /dev/ttyUSB0
Se carga el ejemplo ArduinoISP:
File -> Examples -> ArduinoISP
Se selecciona la placa correcta:
Tools -> Board -> Arduino Duemilanove w/ ATmega328
Se compila y se sube:
Upload
Se desenchufa del USB y se cablea a la Sanguinololu de la siguiente manera:
Carga de Bootload en Sanguinololu
Se vuelve a enchufar el arduino al USB y se selecciona el programador:
Tools -> Programmer -> Arduino as ISP
Se selecciona la placa correcta, en este caso la Sanguinololu:
Tools -> Board -> Sanguino W/ ATmega644P
Se quema el bootloader:
Tools -> Burn Bootloader
Finalizado esto, se desenchufa el Arduino del USB y las conexiones al puerto ISP de la Sanguinololu. La placa esta lista para recibir un firmware.
Primero hay que elegir la plantilla correcta para nuestra electronica y copiarla.
cd ~/sketchbook/Teacup_Firmware
Makefile
Este archivo contiene los parametros necesarios para que el compilador pueda hacer su trabajo en una maquina i386/x64 teniendo como destino una arquitectura avr. Lo unico que se tiene que editar es una linea para seleccionar el microcontrolador de la Sanguinololu.
cp Makefile-AVR Makefile
vi Makefile
MCU_TARGET = atmega644p
config.h
Primero hay que copiar el template acorde a la placa que se esta usando.
cp config.sanguinololu-v1.2.h config.h
vi config.h
Motores
El Gcode envia una codigo para el movimiento de un eje, en donde se indica una cantidad de milimetros y direccion a mover. Para que esto funcione, hay que definir en el firmware la cantidad de pasos que se necesita para que se mueva un metro. Dependiendo de eje se usan distintas formulas para llegar al numero teorico ideal.
Correas
En los ejes X e Y que son movidos por una correa y un eje dentado, se usa el siguiente calculo en milimetros, que se debe multiplicar * 1000 para usar la unidad metro que espera el firmware:
Cantidad de pasos del motor en una vuelta * Micropasos de la controladora del motor / Cantidad de dientes del eje / Distancia de dientes en correa * 1000 para pasar milimetros a metros.
Cantidad de Pasos: Se calcula a partir de que ese motor particular en cada paso avanza 1.8 grados de los 360 que son una vuelta, por lo que necesitara 200 pasos para completrla.
Micropasos: La controladora del motor como la Pololu que se usa en este proyecto, permiten fraccionar 1 paso de motor en hasta 16 micropasos, que es la configuracion por defecto. Esto significa que en realidad necesitamos 16 micropasos para completar 1 paso del motor, por ende en este caso en particular 200 * 16 para completar una vuelta.
Cantidad de dientes: Es el numero de dientes que tiene el eje que se monta en el vastago del motor. En la practica, uno de 13 dientes para polea T5 (5mm)como esta en el listado de partes obtuvo mejores resultados con menos saltos de correa.
Distancia de dientes: Para la correa T5 es de 5mm.
Entonces, pasos por metro en X e y queda como:
// 200 * 16 / 13 / 5 * 1000
#define STEPS_PER_M_X 49230
#define STEPS_PER_M_Y 49230
Sinfin
Para el eje Z se usa una formula similar:
Cantidad de pasos del motor en una vuelta * Micropasos de la controladora del motor / Distancia de rosca * 1000 (se pasa a metros)
Distancia de rosca: En una varilla de 8mm es de 1.25 mm.
// 200 * 16 / 1.25 * 1000
#define STEPS_PER_M_Z 2560000
Extruder
// 140000 <- Calibrador reprap calculator
#define STEPS_PER_M_E 140000
Aceleracion
#define ACCELERATION_RAMPING
#define ACCELERATION 1000
#define MAXIMUM_FEEDRATE_X 5200
#define MAXIMUM_FEEDRATE_Y 5200
#define MAXIMUM_FEEDRATE_Z 260
#define MAXIMUM_FEEDRATE_E 2000
#define SEARCH_FEEDRATE_X 50
#define SEARCH_FEEDRATE_Y 50
#define SEARCH_FEEDRATE_Z 50
#define E_STARTSTOP_STEPS 0
Sensores Recorrido
#define USE_INTERNAL_PULLUPS
#define X_INVERT_MIN
#define X_INVERT_MAX
#define Y_INVERT_MIN
#define Y_INVERT_MAX
#define Z_INVERT_MIN
#define Z_INVERT_MAX
#define X_MIN 0.0
#define X_MAX 180.0
#define Y_MIN 0.0
#define Y_MAX 180.0
#define Z_MIN 0.0
#define Z_MAX 90.0
Sensores Temperatura
DEFINE_TEMP_SENSOR(extruder, TT_THERMISTOR, AIO7, THERMISTOR_EXTRUDER)
DEFINE_TEMP_SENSOR(bed, TT_THERMISTOR, AIO6, THERMISTOR_BED)
#define TEMP_RESIDENCY_TIME 0
#define TEMP_THERMISTOR
Calentadores
#define HEATER_EXTRUDER HEATER_extruder #define HEATER_BED HEATER_bed
Comunicacion
#define BAUD 115200
ThermistorTable.h
Esta plantilla es para usar dos tablas, una para el termistor del extruder y otro para la cama. Por defecto vienen preparadas para los Epoc 100k.
cp ThermistorTable.double.h ThermistorTable.h
Arrancamos el IDE
cd ~/arduino-1.0.1
./arduino
Abrir el proyecto
File -> Sketchbook -> Teacup_Firmware
Compilar y cargar
Upload