diff --git a/3Dmodels/STL/Ingegno Enclosure Changes/3D simo part 1 finaal.stl b/3Dmodels/STL/Ingegno Enclosure Changes/3D simo part 1 finaal.stl new file mode 100644 index 0000000..2db3a67 Binary files /dev/null and b/3Dmodels/STL/Ingegno Enclosure Changes/3D simo part 1 finaal.stl differ diff --git a/3Dmodels/STL/Ingegno Enclosure Changes/3D simo part 2 finaal.stl b/3Dmodels/STL/Ingegno Enclosure Changes/3D simo part 2 finaal.stl new file mode 100644 index 0000000..4eeaa2c Binary files /dev/null and b/3Dmodels/STL/Ingegno Enclosure Changes/3D simo part 2 finaal.stl differ diff --git a/3Dmodels/STL/Ingegno Enclosure Changes/3D simo part 3 finaal.stl b/3Dmodels/STL/Ingegno Enclosure Changes/3D simo part 3 finaal.stl new file mode 100644 index 0000000..4de9b03 Binary files /dev/null and b/3Dmodels/STL/Ingegno Enclosure Changes/3D simo part 3 finaal.stl differ diff --git a/3Dmodels/STL/Ingegno Enclosure Changes/3D simo part 4 finaal.stl b/3Dmodels/STL/Ingegno Enclosure Changes/3D simo part 4 finaal.stl new file mode 100644 index 0000000..36c423d Binary files /dev/null and b/3Dmodels/STL/Ingegno Enclosure Changes/3D simo part 4 finaal.stl differ diff --git a/3Dmodels/STL/Ingegno Enclosure Changes/IngegnoEnclosure.jpg b/3Dmodels/STL/Ingegno Enclosure Changes/IngegnoEnclosure.jpg new file mode 100644 index 0000000..8eddb81 Binary files /dev/null and b/3Dmodels/STL/Ingegno Enclosure Changes/IngegnoEnclosure.jpg differ diff --git a/3Dmodels/STL/Ingegno Enclosure Changes/README.md b/3Dmodels/STL/Ingegno Enclosure Changes/README.md new file mode 100644 index 0000000..5a4215f --- /dev/null +++ b/3Dmodels/STL/Ingegno Enclosure Changes/README.md @@ -0,0 +1,12 @@ + # Ingegno 3DSimo Enclosure +Here some adaptations to the enclosure by Ingegno (Amy) + +You can see it in the red parts in following image: + +![Ingegno 3DSimo Enclosure](IngegnoEnclosure.jpg?raw=true "Ingegno 3DSimo Enclosure") + +Changes: + +* fix the screen with an enclosure +* different UP/DOWN button tops + diff --git a/FW/3DsimoKit/3DsimoKit.ino b/FW/3DsimoKit/3DsimoKit.ino index c13909b..4da21a3 100644 --- a/FW/3DsimoKit/3DsimoKit.ino +++ b/FW/3DsimoKit/3DsimoKit.ino @@ -1,6 +1,10 @@ -#include "ssd1306.h" -#include "nano_gfx.h" -#include +/* + * ssd1306 128x32 Alexey Dinda Library + * Install via package manager + */ +#include "ssd1306.h" // ssd1306 Alexey Dynda v 1.7.12 +#include "nano_gfx.h" // ssd1306 Alexey Dynda +#include // EveryTimer by Alessio Leoncini v 1.1.1 /* * define Input/Outputs @@ -8,8 +12,8 @@ #define LED_NANO 13 // LED placed on Arduino Nano board -#define BTN_UP 11 // controlling button UP/PLUS -#define BTN_DOWN 12 // controlling button DOWN/MINUS +#define BTN_UP 12 // controlling button UP/PLUS /* changed for right hand - default 11 */ +#define BTN_DOWN 11 // controlling button DOWN/MINUS /* changed for right hand - default 12 */ #define BTN_EXT 8 // button for material extrusion #define BTN_REV 7 // button for material reverse @@ -20,6 +24,9 @@ #define TEMP_IN A0 // temperature measure ADC input +#define MAXCURRENTDRAW 255 // PWM max value on Heater to avoid high current draw (if wanted) + +bool righthanded = true; // default on is righthanded display /* * define heating states */ @@ -51,18 +58,27 @@ typedef struct { */ const profile_t materials[] PROGMEM = { // {temperature (deg. C), motorSpeed (%), materialName} - {225, 25, "ABS"}, - {210, 40, "PLA"} + {0, 0, "OFF"}, /* NEW! BEGIN OFF - BUT IF YOU SELECT THIS AFTER PETG, 3DPEN COOLS TO 153º PRIOR TO SHUTDOWN*/ + {210, 40, "PLA"}, + {210, 60, "PLA"}, + {210, 80, "PLA"}, + {230, 30, "ABS"}, + {230, 50, "ABS"}, + {230, 70, "ABS"}, + {235, 30, "PETG"}, + {235, 50, "PETG"}, + {235, 70, "PETG"} }; /* * define number of materials in list and variables */ -#define MATERIAL_COUNT 2 +#define MATERIAL_COUNT 10 -int materialID = 0; // chosen material profile -int setTemperature = 225; // set heater temperature +int materialID = 1; // chosen material profile on startup +int setTemperature = 210; // set heater temperature int setMotorSpeed = 60; // set motor speed in % +bool pressUPDOWNhandled = false; /* * create timer for main loop @@ -189,7 +205,7 @@ int heating(){ // resolve PID value for heater PWM int temperature = getTemperature(); - int valuePID = getPIDoutput(setTemperature, temperature, 255, 0); + int valuePID = getPIDoutput(setTemperature, temperature, MAXCURRENTDRAW, 0); analogWrite(HEATER_EN, valuePID); @@ -231,7 +247,7 @@ int heating(){ */ void timerAction(){ static int elapsedTime = 0; - static char statusHeating = STATE_HEATING; + static char statusHeating = STATE_HEATING; static char stateMotor = MOTOR_STOP, lastMotorState = MOTOR_STOP; static int timeMotorReverse = 0; @@ -274,7 +290,7 @@ void timerAction(){ // button REVERSE is pressed, retract material else if(digitalRead(BTN_EXT) && !digitalRead(BTN_REV)){ stateMotor = MOTOR_REVERSE; - timeMotorReverse = 400; // reverse time is 50ms * timeMotorReverse (400 = 20s) + timeMotorReverse = 100; // reverse time is 50ms * timeMotorReverse (100 = 5s) } // both buttons are pressed, motor stopped @@ -282,7 +298,7 @@ void timerAction(){ stateMotor = MOTOR_STOP; } - // not buttons are pressed + // no buttons are pressed else{ if(lastMotorState == MOTOR_EXTRUSION){ stateMotor = MOTOR_REVERSE_AFTER_EXTRUSION; @@ -342,9 +358,28 @@ void timerAction(){ // one time action, mainly for material change static char buttonsPressed = 0; + + +// button UP & DOWN pressed: change display + if(!digitalRead(BTN_UP) and !digitalRead(BTN_DOWN) ){ + if (! pressUPDOWNhandled) { + righthanded = ! righthanded; + pressUPDOWNhandled = true; + + ssd1306_clearScreen(); + if (righthanded) { + ssd1306_flipHorizontal(1); /* rotate screen in X */ + ssd1306_flipVertical(1); /* rotate screen in Y */ + } else { + ssd1306_flipHorizontal(0); + ssd1306_flipVertical(0); + } + loadMaterial(materialID); + } + } // button UP pressed - if(!digitalRead(BTN_UP) && digitalRead(BTN_DOWN)){ - if(!(buttonsPressed & 0x01)){ + else if(!digitalRead(BTN_UP) ){ + if (! pressUPDOWNhandled) { if(materialID < MATERIAL_COUNT-1){ ++materialID; } @@ -352,18 +387,12 @@ void timerAction(){ materialID = 0; } loadMaterial(materialID); + pressUPDOWNhandled = true; } - // save that this button UP was already pressed and used - buttonsPressed |= 0x01; - } - else{ - // save that this button UP was released - buttonsPressed &= 0xFE; } - // button DOWN pressed - if(digitalRead(BTN_UP) && !digitalRead(BTN_DOWN)){ - if(!(buttonsPressed & 0x02)){ + else if( !digitalRead(BTN_DOWN)){ + if(! pressUPDOWNhandled){ if(materialID > 0){ --materialID; } @@ -371,13 +400,12 @@ void timerAction(){ materialID = MATERIAL_COUNT-1; } loadMaterial(materialID); + pressUPDOWNhandled = true; } - // save that this button DOWN was already pressed and used - buttonsPressed |= 0x02; } else{ - // save that this button DOWN was released - buttonsPressed &= 0xFD; + // save that this button was released + pressUPDOWNhandled = false; } } @@ -392,6 +420,11 @@ void setup() { // initialize OLED display ssd1306_128x32_i2c_init(); ssd1306_clearScreen(); + if (righthanded) { + ssd1306_flipHorizontal(1); /* rotate screen in X */ + ssd1306_flipVertical(1); /* rotate screen in Y */ + } + // initialize outputs pinMode(LED_NANO, OUTPUT); diff --git a/FW/3DsimoKit/3DsimoKit_JC3D.ino b/FW/3DsimoKit/3DsimoKit_JC3D.ino deleted file mode 100644 index 1e734f0..0000000 --- a/FW/3DsimoKit/3DsimoKit_JC3D.ino +++ /dev/null @@ -1,437 +0,0 @@ -/* - * ssd1306 128x32 Alexey Dinda Library - */ -#include "ssd1306.h" -#include "nano_gfx.h" -#include - -/* - * define Input/Outputs - */ - -#define LED_NANO 13 // LED placed on Arduino Nano board - -#define BTN_UP 12 // controlling button UP/PLUS /* NEW! changed for right hand - default 11 */ -#define BTN_DOWN 11 // controlling button DOWN/MINUS /* NEW! changed for right hand - default 12 */ -#define BTN_EXT 8 // button for material extrusion -#define BTN_REV 7 // button for material reverse - -#define MOTOR_DIR 6 // motor direction output -#define MOTOR_PWM 10 // motor PWM output for power driving -#define MOTOR_SLEEP 5 -#define HEATER_EN 9 // heater/power output - -#define TEMP_IN A0 // temperature measure ADC input - -/* - * define heating states - */ -enum { - STATE_HEATING, - STATE_COOLING, - STATE_READY, -} STATE_e; - -enum { - MOTOR_STOP, - MOTOR_EXTRUSION, - MOTOR_REVERSE, - MOTOR_CONTINUOUS, - MOTOR_REVERSE_AFTER_EXTRUSION -} MOTOR_STATE_e; - -/* - * define structure for the material list - */ -typedef struct { - int temperature; - int motorSpeed; - char* materialName; -} profile_t; - -/* - * define material profiles - */ -const profile_t materials[] PROGMEM = { - // {temperature (deg. C), motorSpeed (%), materialName} - {0, 0, "OFF"}, /* NEW! BEGIN OFF - BUT IF YOU SELECT THIS AFTER PETG, 3DPEN COOLS TO 153º PRIOR TO SHUTDOWN*/ - {210, 40, "PLA"}, - {230, 30, "ABS"}, - {235, 40, "PETG"} -}; - -/* - * define number of materials in list and variables - */ -#define MATERIAL_COUNT 4 - -int materialID = 0; // chosen material profile -int setTemperature = 210; // set heater temperature -int setMotorSpeed = 60; // set motor speed in % - -/* - * create timer for main loop - */ -EveryTimer timer; - -/* - * function for measuring temperature of the tip - */ -int getTemperature(){ // get temperature in deg. Celsius from ADU value - // set reference for ADC to power supply (5V) - analogReference(DEFAULT); - - int avgTemp = 0; - for(int i = 0; i<16; i++){ - avgTemp += analogRead(TEMP_IN); - } - - // read averaged analog value of temperature - long tempADU = avgTemp >> 4; - - // convert ADU into temperature - // constants could slightly change for different ceramic tip - tempADU -= 1692; // increase this value when temperature is too high and vice versa - tempADU <<= 7; - tempADU /= (-557); - - return tempADU; -} - -/* - * load actual material profile - */ -void loadMaterial(int id){ - profile_t profile; - char text[10]; - - // load material profile from PROGMEM and assign variables - memcpy_P(&profile, &materials[id], sizeof(profile_t)); - setTemperature = profile.temperature; - setMotorSpeed = profile.motorSpeed; - - // clear display and show all information - sprintf(text, "%d %%", setMotorSpeed); - ssd1306_clearScreen(); - ssd1306_setFixedFont(ssd1306xled_font6x8); - ssd1306_printFixedN(0, 0, profile.materialName, STYLE_NORMAL, FONT_SIZE_2X); - ssd1306_printFixedN(80, 0, text, STYLE_NORMAL, FONT_SIZE_2X); -} - -/* - * PID variables and constants for tuning - */ -float Kp=15, Ki=1, Kd=1.0, dT = 0.1, Hz=10; - -/* - * basic PID routine to get output value - */ -int getPIDoutput(int setPoint, int actualValue, int maxValue, int minValue){ - static float sumE = 0; - static int16_t error, previousError = 0; - float outputValue; - static int pidAvg[4] = {0,0,0,0}; - static int pidAvgIndex = 0; - - - // reset sumE when actualValue exceed setPoint by 5 - static int noWaitCycles = 0; - if(actualValue > setPoint + 5){ - ++noWaitCycles; - if(noWaitCycles >= 30){ - sumE = 100; - noWaitCycles = 0; - } - } - else{ - noWaitCycles = 0; - } - - // PID implementation - error = setPoint - actualValue; - sumE += (float) error * dT; - outputValue = Kp*error + Ki*sumE + Kd*(error - previousError)/dT; - previousError = error; - - // restrict output PID value into range between minValue and maxValue - if(outputValue > maxValue) - outputValue = maxValue; - else if(outputValue < minValue) - outputValue = minValue; - - // store n output values for averaging - pidAvg[pidAvgIndex] = outputValue; - ++pidAvgIndex; - if(pidAvgIndex >= 4) - pidAvgIndex = 0; - - // average last n output values - int sumPIDavg = 0; - for(int i = 0; i<4; i++){ - sumPIDavg += pidAvg[i]; - } - sumPIDavg >>= 2; - - return sumPIDavg; -} - -#define NO_AVERAGES_VALUES 64 - -/* - * heating function for heater driving by PID regulator - */ -int heating(){ - static int tempAvg[NO_AVERAGES_VALUES]; // temperature array for averaging it - static int tempAvgIter = 0; // current index in temperature array - static char firstTime = 0; // if is 1, this function ran at least one time - char text[30]; // buffer for text - - // variables initialization - if(!firstTime){ - memset(tempAvg, 0, sizeof(tempAvg)*sizeof(int)); - firstTime = 1; - } - - // resolve PID value for heater PWM - int temperature = getTemperature(); - int valuePID = getPIDoutput(setTemperature, temperature, 255, 0); - - analogWrite(HEATER_EN, valuePID); - - // save actual temperature for averaging - tempAvg[tempAvgIter] = temperature; - if(++tempAvgIter>=NO_AVERAGES_VALUES) - tempAvgIter = 0; - - // make temperature average from NO_AVERAGES_VALUES - int sumTemp = 0; - for(int i = 0; i setTemperature + 10){ - statusHeating = STATE_COOLING; - ssd1306_printFixedN(116, 16, "C", STYLE_NORMAL, FONT_SIZE_2X); - } - - // tolerant zone where temperature is OK for extrusion/reverse - else if(actualTemperature > setTemperature - 10){ - statusHeating = STATE_READY; - ssd1306_printFixedN(116, 16, "R", STYLE_NORMAL, FONT_SIZE_2X); - digitalWrite(LED_NANO, HIGH); // turn the LED on (HIGH is the voltage level) - } - - // tolerant zone where temperature is LOW for extrusion/reverse - else{ - statusHeating = STATE_HEATING; - ssd1306_printFixedN(116, 16, "H", STYLE_NORMAL, FONT_SIZE_2X); - digitalWrite(LED_NANO, !digitalRead(LED_NANO)); // turn the LED on (HIGH is the voltage level) - } - } - - // assing functions according to heating state (mainly button function) - switch(statusHeating){ - case STATE_COOLING: - case STATE_READY:{ - // button EXTRUSION is pressed, extrude material - if(!digitalRead(BTN_EXT) && digitalRead(BTN_REV)){ - stateMotor = MOTOR_EXTRUSION; - } - - // button REVERSE is pressed, retract material - else if(digitalRead(BTN_EXT) && !digitalRead(BTN_REV)){ - stateMotor = MOTOR_REVERSE; - timeMotorReverse = 400; // reverse time is 50ms * timeMotorReverse (400 = 20s) - } - - // both buttons are pressed, motor stopped - else if(!digitalRead(BTN_EXT) && !digitalRead(BTN_REV)){ - stateMotor = MOTOR_STOP; - } - - // not buttons are pressed - else{ - if(lastMotorState == MOTOR_EXTRUSION){ - stateMotor = MOTOR_REVERSE_AFTER_EXTRUSION; - timeMotorReverse = 20; // reverse time is 50ms * timeMotorReverse (20 = 1s) - } - } - break; - } - - case STATE_HEATING: - // if happened that heater has so low temperature, motor stop - digitalWrite(MOTOR_DIR, LOW); - analogWrite(MOTOR_PWM, 0); - stateMotor = MOTOR_STOP; - break; - } - - // resolve motor states (Extrusion, Reverse, Stop, ...) - switch(stateMotor){ - case MOTOR_STOP: - digitalWrite(MOTOR_DIR, LOW); - analogWrite(MOTOR_PWM, 0); - break; - - case MOTOR_EXTRUSION:{ - int pwmSpeed = setMotorSpeed*255; - digitalWrite(MOTOR_DIR, LOW); - analogWrite(MOTOR_PWM, pwmSpeed/100); - break; - } - - case MOTOR_REVERSE: - --timeMotorReverse; - if(timeMotorReverse > 0){ - digitalWrite(MOTOR_DIR, HIGH); - analogWrite(MOTOR_PWM, 0); - } - else{ - stateMotor = MOTOR_STOP; - } - break; - - case MOTOR_REVERSE_AFTER_EXTRUSION: - --timeMotorReverse; - if(timeMotorReverse > 0){ - int pwmSpeed = (100-setMotorSpeed)*255; - digitalWrite(MOTOR_DIR, HIGH); - analogWrite(MOTOR_PWM, pwmSpeed/100); - } - else{ - stateMotor = MOTOR_STOP; - } - break; - } - lastMotorState = stateMotor; - - // one time action, mainly for material change - static char buttonsPressed = 0; - - - -// button UP pressed - if(!digitalRead(BTN_UP) && digitalRead(BTN_DOWN)){ - if(!(buttonsPressed & 0x01)){ - if(materialID < MATERIAL_COUNT-1){ - ++materialID; - } - else{ - materialID = 0; - } - loadMaterial(materialID); - } - // save that this button UP was already pressed and used - buttonsPressed |= 0x01; - } - else{ - // save that this button UP was released - buttonsPressed &= 0xFE; - } - - // button DOWN pressed - if(digitalRead(BTN_UP) && !digitalRead(BTN_DOWN)){ - if(!(buttonsPressed & 0x02)){ - if(materialID > 0){ - --materialID; - } - else{ - materialID = MATERIAL_COUNT-1; - } - loadMaterial(materialID); - } - // save that this button DOWN was already pressed and used - buttonsPressed |= 0x02; - } - else{ - // save that this button DOWN was released - buttonsPressed &= 0xFD; - } - -} - -/* - * GPIO, OLED initialize - * load material profile - * preset timer - */ -void setup() { - - // initialize OLED display - ssd1306_128x32_i2c_init(); - ssd1306_clearScreen(); - ssd1306_flipHorizontal(1); /* oled_ssd1306.h NEW! rotate screen in X */ - ssd1306_flipVertical(1); /* oled_ssd1306.h NEW! rotate screen in Y */ - - - // initialize outputs - pinMode(LED_NANO, OUTPUT); - pinMode(MOTOR_DIR, OUTPUT); - pinMode(MOTOR_PWM, OUTPUT); - pinMode(MOTOR_SLEEP, OUTPUT); - pinMode(HEATER_EN, OUTPUT); - - // initialize inputs - pinMode(BTN_UP, INPUT_PULLUP); - pinMode(BTN_DOWN, INPUT_PULLUP); - pinMode(BTN_EXT, INPUT_PULLUP); - pinMode(BTN_REV, INPUT_PULLUP); - - // load material profile - loadMaterial(materialID); - - // preset timer period every 50 ms and call timerAction function when time expire - timer.Every(50, timerAction); - - // initialize outputs - digitalWrite(MOTOR_SLEEP, HIGH); - - Serial.begin(9600); -} - -/* - * main loop - */ -void loop() { - // call timer each preset period - timer.Update(); -} diff --git a/README.md b/README.md index fa574ad..1e772ef 100644 --- a/README.md +++ b/README.md @@ -1,9 +1,8 @@ # 3Dsimo Kit -Sections - 1. [3D print](documents/3Dprint.md) - 2. [Arduino nano](documents/ArduinoNano.md) - 3. [FW 3Dsimo Kit](documents/Firmware.md) - 4. [Material profiles](documents/MaterialProfiles.md) - 5. [HW 3Dsimo Kit](documents/Hardware.md) - 6. [Manual](documents/Manual.md) \ No newline at end of file + 1. [3D print](documents/3Dprint.md) The 3Dsimo parts + 2. [Arduino nano](documents/ArduinoNano.md) The brain of the 3D pen + 3. [FW 3Dsimo Kit](documents/Firmware.md) The firmware or code and how to upload it + 4. [Material profiles](documents/MaterialProfiles.md) Add profiles for custom plastics/speeds + 5. [HW 3Dsimo Kit](documents/Hardware.md) Hardware included: OLED, extension board, ... + 6. [Manual](documents/Manual.md) How to use, tips, pdf manuals diff --git a/documents/3Dprint.md b/documents/3Dprint.md index d61250a..ba5b22b 100644 --- a/documents/3Dprint.md +++ b/documents/3Dprint.md @@ -1,2 +1,12 @@ # 3D print -Plastic parts of 3Dsimo KIT are printed on FDM printers and can be easily swapped. We intend to add new parts and new designs all the time. All 3D models are of course available, so you can modify them as you please. IF you have an interesting model don't hesitate to share it with us. +Plastic parts of 3Dsimo KIT are printed on FDM printers and can be easily swapped out for other parts. We intend to add new parts and new designs all the time. +All 3D models are of course available, so you can modify them as you please. If you have an interesting model don't hesitate to share it with us. + +### 3D models folder +You can find all 3D models of the parts in [the 3Dmodels Folder](../3Dmodels/) + +### 3Dsimo respins +The pen is 3D hardware, so people tweak the design of the files. You can print these different designs to change your 3Dsimo pen. + +Following designs are available: +* [Ingegno Enclosure](../3Dmodels/STL/Ingegno%20Enclosure%20Changes/) diff --git a/documents/ArduinoNano.md b/documents/ArduinoNano.md index 813b2cc..bd458cb 100644 --- a/documents/ArduinoNano.md +++ b/documents/ArduinoNano.md @@ -1,2 +1,14 @@ # Arduino nano -3Dsimo Kit is based on very popular Arduino Nano. It is very likely that you already come across it but in case you haven't yet here are some things you might find useful. +3Dsimo Kit is based on very popular Arduino Nano. However, to allow the current draw needed for heating, **customization is REQUIRED** + +Specifically, to allow heating of the nozzle with enough power, the diode at the miniUSB input must be replaced +with interconnect (0 Ohm resistor). The placement of the diode is shown (red) in the following picture. +If this modification is not performed, the diode will overload and burn and the device would become +non-functional. The board, which is included in the 3Dsimo Kit, already has this modification. + +**Pic: Placement of the input diode, shown already replaced with a 0 Ohm resistor** +![Customized Nano](img/customized_nano.png?raw=true "Customized Nano") + +The Nano used in the kit has processor **ATmega 168**, which will need to be selected in the Arduino IDE. + +To change and upload the code, see the [FW 3Dsimo Kit](Firmware.md) Section diff --git a/documents/Firmware.md b/documents/Firmware.md index 48628a0..b2a2416 100644 --- a/documents/Firmware.md +++ b/documents/Firmware.md @@ -1,2 +1,36 @@ # Firmware for 3Dsimo Kit -Firmware for the open source pen. If you want to learn how the pen works or you want to add your own material profiles, or you want to make some changes and tweaks, you are on the right address. The code is fully available and commented so you don't have trouble finding your way around. +The firmware for the open source 3D pen, is available in [this repository](../FW/3DsimoKit). + +Download from there the *3DsimoKit.ino* file and open it with the [Arduino IDE](https://www.arduino.cc/en/Main/Software). The code is fully available and commented so you don't have trouble finding your way around. + +## Installing necessary libraries +The code uses 2 libraries you need to install. You can do that from menu Sketch => Include Library => Manage Libraries. + +A dialog opens in which you can search libraries. + + 1. search for ssd1306, and select the *ssd1306* library from *Alexey Dynda*. We installed version 1.7.12 in our tests + ![ssd1306 lib](img/ssd_lib.png?raw=true "ssd1306 lib") + 2. do the same with library *EveryTimer* by *Alessio Leoncini*. We installed version 1.1.1 in our tests + +## Uploading the code +**WARNING:** the nano used is customized. If you use another nano, **you** need to customize it, see [Arduino nano](documents/ArduinoNano.md) Section + +If you have the code open in the Arduino IDE, connect the Nano device via a usb cable to your PC. Select in Tools, Board *Arduino Nano*: +![Select Nano](img/ard_ide_01.png?raw=true "Select Nano") + +The processor of our nano is the *ATmega168*, so select this in the processor part of Tools menu: +![Select Processor](img/ard_ide_02.png?raw=true "Select Processor") + +Compile the code. All should work without errors. Then upload the code to the nano. + +## Troubleshooting + +1. Your PC does not connect to the nano, or uploading keeps failing. + +This should not happen. Use google to search for your error and possible solutions. One possibility is a damaged Nano, a new one will need to be used then. + +2. The Nano resets all the time + +You can verify this by changing the profile. If the profile switches back to the start up profile, the nano has reset. The cause of this is too high current draw which the power source cannot provide, causing a voltage drop and a reset. + +**Solution:** use a usb power source which can provide 2A of current (eg from tablet, or dedicated usb power source). diff --git a/documents/Hardware.md b/documents/Hardware.md index c8c157c..4e018a2 100644 --- a/documents/Hardware.md +++ b/documents/Hardware.md @@ -1,3 +1,15 @@ # Hardware for 3Dsimo Kit Here you can find all the parts 3Dsimo kit is made of. The pen is based on popular Arduino Nano, it has OLED display and the cover is made from plastic parts printed on 3D printers. All the documentation can be find here and thanks to its open-source nature and available documentation every part can be easily upgraded or modified by the user. + +## 3Dsimo Kit Assembly Tips +- It should be possible to assemble the 3Dsimo KIT pen "out of the box". +But it is still a good idea to have some tools nearby: cutter knife, soldering iron, insulating tape, small screw driver. +- First read the entire instructions to visualize the process. +- Before you start the assembly: Inspect and test the interlocking parts like the nozzle cover and the space for the motor. Try to fit them together one by one and if you notice blocks then clean up the parts until they fit without force: + - e.g. You might need to bend the contacts of the motor more to the side. The bottom of the motor should rest loosely on the contact of the screen. + - Take extra care with the nozzle parts and the body cover. Look if the leads and contacts on the nozzle are flat enough to fit in the grove. +- The nozzle cover has distinct up- and down-sides. If your cover does not line up with the rest of the body: rotate 180°. +- The nozzle itself can slide forward and backward on the contacts. Adjust it for best fit. You probably need to bend the contacts slightly until they line up good. +- Check from time to time if all boards are still nicely connected to each other. +- If your motor moves the wrong way: Rotate the plug. diff --git a/documents/Manual.md b/documents/Manual.md index d74fbcc..eae1c32 100644 --- a/documents/Manual.md +++ b/documents/Manual.md @@ -1,7 +1,72 @@ # 3Dsimo Kit manual -Want to learn more about 3Dsimo KIT? Everything you should know about it can be find here. Steps how to assemble the pen, how to power it, how to program it, what types of filament to use. + +## Meaning of the display +The display has two rows with following information + +1. Line 1: Material - Motor speed for the material (in %) +2. Line 2: Current temperature / Required temperature for the material / Heating code C (Cooling), H (Heating) or R (Ready) + +![Display](img/display.jpg?raw=true "The display") + +## Operation of the 3D Pen +The pen has 4 buttons. The base at the usb cable inlet has two buttons, the UP and DOWN button. Function is: + +1. UP: switch material profile to next one. Default on switch on is PLA at 40% motor speed +2. DOWN: switch material profile to previous one. +3. press UP and DOWN at the same time: switch display from righthanded to lefthanded, and back + +One profile is 0 degrees, this is the cooldown position. The pen will not work and will go to 153 degrees + +Next there are 2 buttons in the middle. These are for extrusion and retraction of the fillamenet + +1. Extrude button: as long as you press the material is extruded. When you stop pressing, the filament retracts for 1second +2. Retract button: when this button is pressed, the filament is retracted for 5 seconds. Press 3 to 4 times for full retration to change filament +3. press Extrude and Retract at the same time: stop motor movement. + +If a press is not recognized, press again, but not too fast after each other! + +## General 3D drawing Tips +- Rest your thumb on the Extrude-Button. It is easier to operate it with the thumb, instead of the index finger. +- If some buttons behave very glitchy: Try to press them without touching the Nano pins on the bottom of the pen. If the pins annoy you: cover them with insulating tape. +- There are different firmwares available for right- and left-handed use. + +### Filament loading and ejecting + +- ALWAYS use filament with an even tip! Cut your strand to get one. +- You don't neccessarily need straightened filament. The bend, however, can make the loading process a bit harder. +- Let the pen heat up, then feed in the 1.75mm filament. It takes a bit of time to travel through the whole pen. Touch the filament to confirm that the motor is wired the right way. Then you can gently(!) push the filament strand in. Push until the motor grips the strand and then you can stop poushing (or push only slightly). +- Ejecting filament: Hit the Revert button and wait until the filament gets ejected. You can slightly pull the strand out. You might need to hit the button a second time. You will notice the strand getting loose, pull it out now. The tip of the filament strand is now molten and uneven. Cut it clean and right angled. +- Changing filament color: It is normal that some filament stays in the nozzle. If you change the color you will see a slow gradient from the the old to the new color. If you change the type of filament make sure to set the temperature correctly to melt the old filament first. +- Avoid to let the end of your filament string to go fully into the pen. If the motor looses grip you need to disassemble the pen to remove the filament. Never just stick another strand in! +- If your pen gets clogged: Disassemble (carefully, might be hot!), get some thin scissors to cut the filament inside the pen where it is exposed. Disassemble further. Remove all filament strands and cut it close to the nozzle. It is normal for the rest of the filament to stay inside the nozzle. +- Place your roll of filament in a way that allows easy feeding. Make sure it does not get tight or tangled. Some people wrap it around their arm... +- It is possible for small amounts of filament to come out of the tip, even when the pen is idle. Make sure to cover the surface under your pen. If a lot of material comes out during idle: Lowering the temperature might help. + +### Drawing tips + +- Take your time to get a feeling for your pen and your material. Temperature and speed both change the behaviour of the material. +- With a low temperature and a steady hand you can actually draw in the air. +- ... it is, of course, easier to build up your shapes or to assemble single pieces. +- You will probably need a surface to draw on. [You can find a perfect Drawing Pad in the 3Dsimo Shop](https://3dsimo.com/eshop/kit/accessories/drawing-pad). As a makeshift surface for doodling you can even use paper, cardboard or something covered with adhesive tape. Just don't use anything that melts in high temperatures... +- You can use a transparent surface to draw "on" a sketch or template below. +- You can also use common household-items covered in adhesive tape as a base for a shape. +- [3Dsimo offers a Silicone Pad that helps you to draw perfect circles and lines.](https://3dsimo.com/eshop/kit/accessories/silicone-drawing-pad) +- When drawing curves it is sometimes easier to rotate the surface, instead of rotating your pen and arm. +- Filament will be extruded as long as you hold the extrude button. Release the button to stop the flow. Release the button between two strokes that are not supposed to be connected. +- After you release the extrude button the motor will pull back the filament into the pen. This helps to prevent strings and hairs of material after every stroke. Make sure to hold the pen at the end of each stroke. If you pull it away before releasing the button, you will pull the material along, creating thin "hairs". +- Depending on your type of filament you might need multiple layers for a solid and stable shape. +- There are a couple of techniques to build up shapes: + - Draw flat 2D forms and connect them at the sides. + - Build up layers and walls. To save material you can also build up walls and ridges and then "fill" them in the air. Generally it is easiest to "ground" a line of material on already existing material. + - Slowly drawing lines in the air. + - Use a base shape to draw on. You can cover it with clear tape for a better grip. Make sure the material of the base is heat resistant. +- The filament cools down fairly fast after extrusion. With a bit of practice you can correct and bend it before it cools down completely. +- After you finish your piece of art, you probably need scissors or a clipper to remove thin hairs of filament. Get used to them, it's hard to avoid it completely. Alternatively you can hold the hot tip to the filament hairs to melt them away. +- Depending on your type of material you might be able to melt, bend and shape it with a hot hair dryer. e.g. you can draw a flat rectangle and bend it into a ring. +- Depending on your material you might also be able to file, clip, cut or polish the piece. Careful: Some type of filament tends to break. ## English Manuals +Want to learn more about 3Dsimo KIT? Everything you should know about it can be find here. Steps how to assemble the pen, how to power it, how to program it, what types of filament to use. [Assembly Manual](pdf/manualEN.pdf) diff --git a/documents/MaterialProfiles.md b/documents/MaterialProfiles.md index 8bb003b..00007eb 100644 --- a/documents/MaterialProfiles.md +++ b/documents/MaterialProfiles.md @@ -1,2 +1,27 @@ # Material profiles 3Dsimo KIT already contains profiles for ABS and PLA of the box, but thanks to its nature, it can handle other materials easily as well. You can even add them yourself by changing our available code and adding your own material profiles. + +See the [Firmware](Firmware.md) section on how to upload code. To add materials, look for the code *materials[]*, and add lines as you need them: + +```C + const profile_t materials[] PROGMEM = { + // {temperature (deg. C), motorSpeed (%), materialName} + {0, 0, "OFF"}, /* BEGIN OFF - 3DPEN COOLS TO 153º */ + {210, 40, "PLA"}, + {210, 60, "PLA"}, + {210, 80, "PLA"}, + {230, 30, "ABS"}, + {230, 50, "ABS"}, + {230, 70, "ABS"}, + {235, 30, "PETG"}, + {235, 50, "PETG"}, + {235, 70, "PETG"} + }; + /* + * define number of materials in list and variables + */ + #define MATERIAL_COUNT 10 +``` + +You can add lines to accomodate your plastics. **Carefull:** all lines, except the last, must end with a comma (,). Also, you need to give how many lines there are in the **MATERIAL_COUNT** variable. So if you add 2 lines, increase this variable by 2! + diff --git a/documents/img/ard_ide_01.png b/documents/img/ard_ide_01.png new file mode 100644 index 0000000..ebdba13 Binary files /dev/null and b/documents/img/ard_ide_01.png differ diff --git a/documents/img/ard_ide_02.png b/documents/img/ard_ide_02.png new file mode 100644 index 0000000..f6ad447 Binary files /dev/null and b/documents/img/ard_ide_02.png differ diff --git a/documents/img/customized_nano.png b/documents/img/customized_nano.png new file mode 100644 index 0000000..32b23ba Binary files /dev/null and b/documents/img/customized_nano.png differ diff --git a/documents/img/display.jpg b/documents/img/display.jpg new file mode 100644 index 0000000..7f6a705 Binary files /dev/null and b/documents/img/display.jpg differ diff --git a/documents/img/ssd_lib.png b/documents/img/ssd_lib.png new file mode 100644 index 0000000..30f1e30 Binary files /dev/null and b/documents/img/ssd_lib.png differ diff --git a/documents/pdf/manualNL.pdf b/documents/pdf/manualNL.pdf new file mode 100644 index 0000000..d202c7a Binary files /dev/null and b/documents/pdf/manualNL.pdf differ