# What next?

This project has a lot of remaining possible ToDo's which could be done. While doing the project a lot of ideas came up and even more ideas were found by other creative heads on the web. This page contains a collection of unfinished things and good ideas for general Hangprinter and Trikarus improvements. This site might not be complete and it can happen that you find the one or the other additional idea / information on some of project's sub pages.

## Recent ToDo's

### <span class="placeholder-inline-tasks">Software / Firmware / Hardware  
</span>

- <span class="placeholder-inline-tasks">finish IMU 9250 monitoring and trigger routines (alerting) for unwanted effector tilts  
    </span>
- <span class="placeholder-inline-tasks">finish MPU 6250 monitoring of vibrations</span>
- <span class="placeholder-inline-tasks">fix the filament feed encoder at the tool head (not working mechanically right now)  
    </span>
- <span class="placeholder-inline-tasks">test out the Z limit switch and try to measure maximum movable Z height with it</span><span class="placeholder-inline-tasks">  
    </span>
- <span class="placeholder-inline-tasks">create some script to perform dry-run movements within the build envelope to validate the reachable coordinates (generate dryrun gcode to move circles with different diameter in different heights)</span>
- <span class="placeholder-inline-tasks">monitoring / statistics</span>
    - <span class="placeholder-inline-tasks">create dashboard from datasources to collect information about total print time, finished print jobs, printed filament amount (we can use information like Feed Encoder and Repetier Server job management). Add statistics for per day/week/month</span>
    - <span class="placeholder-inline-tasks">make influxdb aggregation files to reduce the process load (push sets of data instead of single data lines)</span>
    - <span class="placeholder-inline-tasks">add some alert for non-moving filament while printer is printing - compare feed encoder data (time between pulse, length, ...) with targeted extrusion value from Repetier or Duet API</span>
    - Add bluetooth connection monitoring
    - Add I2C monitoring
- <span class="placeholder-inline-tasks">make more convenient scripts using less bash and more python / keep it consistent</span>
- <span class="placeholder-inline-tasks">create some horizontal cable holder to force main cable movement (protect cable to collide with print object below effector in case the cable falls down the effector)</span>
- <span class="placeholder-inline-tasks">Grafana: fix line buildup formula for calculation of position</span>
- <span class="placeholder-inline-tasks">Fix possible python USB serial write timeouts</span>
- <span class="placeholder-inline-tasks">Add some physical buffer between webcam and machine frame to reduce wobbling while making snapshot images (time lapse)</span>
- <span class="placeholder-inline-tasks">Repetier Server 1.0.4 - add GPIO operations</span>

### <span class="placeholder-inline-tasks">Calibration</span><span class="placeholder-inline-tasks">/documentation</span>

- <span class="placeholder-inline-tasks">document the anchor point measurement methods  
    </span>
- <span class="placeholder-inline-tasks">document how to find best line buildup compensation (Q and R factors)</span>

### <span class="placeholder-inline-tasks">Slicing</span>

- <span class="placeholder-inline-tasks">Build volume</span>
    - <span class="placeholder-inline-tasks">Make a parametric OpenSCAD 3D model which displays the maximum theoretical build volume shape of Hangprinter, based on the entered anchor point locations (kind of (hyperbolic) tetrahedron). </span>
    - <span class="placeholder-inline-tasks">Add some cutoffs for the existing bed shape + the slicer shape (cylinder) + effector/transportation height cut off (dead height)  
        </span>
    - <span class="placeholder-inline-tasks">make a feature request for PrusaSlicer (and other slicers) to support Hangprinter build volume shape</span>
- Check out [ 3doptimizer.com](https://3doptimizer.com/)
- adjust MVS (max. volumetric speed)   
    
    - [https://grabcad.com/tutorials/dialing-in-a-filament-and-specifying-the-max-volumetric-e-xtrusion-value](https://grabcad.com/tutorials/dialing-in-a-filament-and-specifying-the-max-volumetric-e-xtrusion-value)
    - [https://help.prusa3d.com/en/article/max-volumetric-speed\_127176](https://help.prusa3d.com/en/article/max-volumetric-speed_127176)
    - [https://projects.ttlexceeded.com/3dprinting\_techniques\_calibrating\_volumetric\_rate.html](https://projects.ttlexceeded.com/3dprinting_techniques_calibrating_volumetric_rate.html)

### <span class="placeholder-inline-tasks">Printing</span>

- <span class="placeholder-inline-tasks">Check out the recover print functions and the different possibilities using Repetier Server and DWC</span>
- <span class="placeholder-inline-tasks">Check out filament changing routine</span>
- <span class="placeholder-inline-tasks">add some heating for print (higher layer might warp excessively)</span>

### <span class="placeholder-inline-tasks">Testing/monitoring</span>

- <span class="placeholder-inline-tasks">check out how long lines live until they have to be replaced  
    </span>
- <span class="placeholder-inline-tasks">long-term monitoring of prints and correlating values (Smart Stepper errors, vibrations, tilts, room temperature, ...)</span>

### <span class="placeholder-inline-tasks">Recent hardware</span>

- find out life time of UPS batteries

---

### <span class="placeholder-inline-tasks">Ideas for better prototype h</span><span class="placeholder-inline-tasks">ardware/ electronics</span>

<span class="placeholder-inline-tasks">Because Trikarus is installed at a public place we cannot change most things now ("never touch a running system") but we can think about some generic things. Things listed below are topics to be done in future and hopefully by a large bunch of people</span>

- <span class="placeholder-inline-tasks">Measuring / calibration</span>
    - <span class="placeholder-inline-tasks"><s>check out the</s> integrate auto calibration routine<s> and what's wrong with it</s> → [use tobben's hp-mark implementation](https://www.youtube.com/watch?v=As3Y5J2NTGA)  
        </span>
    - <span class="placeholder-inline-tasks">Make it easier to get anchor point coordinates manually (might require new anchor hardware)</span>
- <span class="placeholder-inline-tasks">Wifi / Switch / Router</span>
    - <span class="placeholder-inline-tasks">use a smaller router or some FritzBox. Those can be used to repeat Freifunk network or any other SSID with total ease  
        </span>
    - <span class="placeholder-inline-tasks">buy one with SIM card slot → maybe use </span>[Freenet Funk](https://www.lte-anbieter.info/lte-news/freenet-funk-unlimited-vorteile-und-grenzen) or [netzclub.net](https://www.netzclub.net/sim-karte-bestellen/)
    - <span class="placeholder-inline-tasks">do not use Freifunk as main network because it is limited to the city</span>
    - <span class="placeholder-inline-tasks">use one with 2.4G + 5G or 5G only</span>
    - <span class="placeholder-inline-tasks">use one with more than 2 meters Wifi range (when a lot of other nets are around) than the used TP-Link - connection between LifeTab Tablet und Router is nearly impossible and unstable  
        </span>
    - <span class="placeholder-inline-tasks">add a more recent Android tablet to Trikarus which allows to attach [a USB LAN Interface.](https://www.strahlend-gesund.de/tipp/aus-der-praxis/37-smartphone-tablet-lan) So we can switch off the second SSID created at our top Freifunk router</span>
- <span class="placeholder-inline-tasks">Line guiding</span>
    - <span class="placeholder-inline-tasks">omit self-twisting lines while installing them on spools and anchors</span>
    - <span class="placeholder-inline-tasks">reduce the maximum wrap-around length of the line over V shape bearing</span>
    - <span class="placeholder-inline-tasks">generally switch from V shape bearings to U shaped ones (better for life time)</span>
    - <span class="placeholder-inline-tasks">search for smaller ceramic inlets (or make some custom parts using PTFE sticks)</span>
    - <span class="placeholder-inline-tasks">reduce friction to let it behave more smooth like in [https://vimeo.com/227891846](https://vimeo.com/227891846) (maybe it has to be stronger because we use doubled line feature and a lot of ceramic inserts and bearings)</span>
- <span class="placeholder-inline-tasks">Drives and spools</span>
    - <span class="placeholder-inline-tasks">monitor temperatures of Smart Steppers</span>
    - <span class="placeholder-inline-tasks">monitor temperatures of Nema 17 motors</span><span class="placeholder-inline-tasks">  
        </span>
    - <span class="placeholder-inline-tasks">add some small protection frame for the connected wires at the terminals at Smart Steppers</span>
    - <span class="placeholder-inline-tasks">add thin grooves on the spool surface so line buildup is more controlled</span>
    - <span class="placeholder-inline-tasks">make spools wider so the line cannot buildup on each other but only next to each other (only deviation: line is switching from left to right → angle must be calculated)</span>
    - <span class="placeholder-inline-tasks">make drives with brakes → [Drive motor brakes](https://old.stadtfabrikanten.org/display/HAN/Drive+motor+brakes)</span>
    - <span class="placeholder-inline-tasks">redesign the spools to have coils which can be charged with line independently (gives better control over tension). We could install one motor per line and mirror the step signals. Would be a heavy printer ceiling module we but could control all motors precisely regarding to line errors (tension)</span>
    - <span class="placeholder-inline-tasks">another idea: design coils which are so thin that the line cannot lay over each other with criss-cross (0.55 mm thin spool - just 0.05 mm thicker than the line) → large buildup but maybe more exact</span>
    - <span class="placeholder-inline-tasks">another idea: make drive which does not require buildup compensation because we store the line on a separate spool with retraction system (like draw wire encoders or VR retraction system for main cable). Let the line move over a well shaped spiral on a shaft which exists to transmit the line straight forward (line must we tensioned all the time so the winding on the spiral does not get lost. maybe some buffer (sleeving) could be pushed over the spiral)</span>
- <span class="placeholder-inline-tasks">Filament feed system</span>
    - <span class="placeholder-inline-tasks">make some active filament feed system for large spools (&gt; 5 kg) for the ground (because mounting over head is not nice) → [Bluetooth Arduino Filament Feeder, Weigh and Monitor](https://old.stadtfabrikanten.org/display/HAN/Bluetooth+Arduino+Filament+Feeder%2C+Weigh+and+Monitor)</span>
        - <span class="placeholder-inline-tasks">make all known spools compatible</span>
            - <span class="placeholder-inline-tasks">Redline Filament spool 8.5 kg → 335 x 168 mm, 13 mm thick border, inner diameter 36 mm</span>
            - <span class="placeholder-inline-tasks">Das Filament spool 2.6 kg → 300 x 100 mm, ?? mm thick border, inner diameter 50 mm</span>
            - <span class="placeholder-inline-tasks">Prusa Filament spool 1 kg → 200 x 90 x 4.5 mm thick border, inner diameter 50 mm</span>
- <span class="placeholder-inline-tasks">General electronics / cable management</span>
    - <span class="placeholder-inline-tasks">do some well prepared cabling system</span>
    - <span class="placeholder-inline-tasks">reduce system to basic machine requirements (remove LED stripes and spots) or if installed LED things we could use PWM stuff to dim the light</span>
    - <span class="placeholder-inline-tasks">add a better emergency halt wiring for portable use</span>
    - <span class="placeholder-inline-tasks">replace relays to 3.3 V optocouplers (better compability with Raspberry Pi GPIO)</span>
    - rethink the situation with long cables and data synchronization using I2C → see this [hackaday.com](https://hackaday.com/2017/02/08/taking-the-leap-off-board-an-introduction-to-i2c-over-long-wires/) post
    - use fans with tacho signal to monitor fan speed (security feature)
- <span class="placeholder-inline-tasks">Portable machine frame</span>
    - <span class="placeholder-inline-tasks">fix tolerances in steel construction</span>
    - <span class="placeholder-inline-tasks">change gas compression spring (lost their pressure)</span>
    - <span class="placeholder-inline-tasks">add additional springs to the gas springs to have some force at the lower positions</span>
    - <span class="placeholder-inline-tasks">replace quick releases with some mechanism to fold the frame without needing a ladder - current quick releases can easily be destroyed by folding frame without releasing them first (shear-off)  
        </span>
    - <span class="placeholder-inline-tasks">use less different neodymium magnets for clips</span>
- <span class="placeholder-inline-tasks">Raspberry Pi's</span>
    - <span class="placeholder-inline-tasks">add second Raspberry Pi which only handles monitoring (InfluxDB). This will reduce the load on the print server Raspberry Pi and this reduces overload peaks which result in halted printed (for some seconds)</span>
    - <span class="placeholder-inline-tasks">upgrade to use Raspberry Pi 4 with more performance (recent Pi has much system load when rendering time lapse videos. This makes the system unresponsible for longer time)  
        </span>
    - <span class="placeholder-inline-tasks">add active cooling fans (temperature &gt; 60°C reached really often)</span>
    - <span class="placeholder-inline-tasks">add active (fans) or passing cooling (air slots in ceiling plate) for stepper motors which get hot after time</span>
    - <span class="placeholder-inline-tasks">add remote Reset/Power Down of Raspberry Pi using PEN/RUN pins  
        </span>
    - use a non-backfeeding USB hub for connected devices → [https://elinux.org/RPi\_Powered\_USB\_Hubs](https://elinux.org/RPi_Powered_USB_Hubs)
- <span class="placeholder-inline-tasks">UPS and USB wiring</span>
    - <span class="placeholder-inline-tasks">omit undervoltage events using appopriate thick short cables and well rated UPS (we were not possible to suck out the required power from the recent UPS)</span>
- <span class="placeholder-inline-tasks">Extruder</span>
    - <span class="placeholder-inline-tasks">add better cooling. When printing quick (60 mm/s and more) with SuperVolcano the cooling is unsuffiecent. 2 or more fans should help to get better surface quality</span>
    - <span class="placeholder-inline-tasks">add system for quick tool changing (e.g. magnetic) → + </span><span class="placeholder-inline-tasks">make pluggable wiring for extruder</span>
    - add redundant PT100 sensor (second)
- <span class="placeholder-inline-tasks">Effector</span>
    - <span class="placeholder-inline-tasks">change amount of fixing screws from 2 to 1 thumb screws for "felt fixators" (easier installation)</span>
    - <span class="placeholder-inline-tasks">add rubber buffers at the corners which secure effector in case it's in free fall (tearing lines)</span>
    - <span class="placeholder-inline-tasks">add system for quicker line changing</span>
- <span class="placeholder-inline-tasks">Bottom anchors</span>
    - <span class="placeholder-inline-tasks">add spirit levels to each fork for quick leveling at the ground</span>
    - <span class="placeholder-inline-tasks">add one guitar tuner per anchor (directory to the anchor) instead of wiring A1/A2, B1/B2 and C1/C2 to a common tuner. That would give better manual tension control and helps to easier adjust rotation of effector around Z axis.</span>
    - avoid lines jumping off the bearing when untensioned (fixate using another ceramic inlet for example)
    - <span class="placeholder-inline-tasks">we should test out what could better: one or two fixed tuners for the lines or "floating tuner" which has a combined knot for A1/A2, B1/B2 and C1/C2. Guessing the last would decrease accuracy because lines per pair will normalize their tension but that might reduce positioning exactness.</span>
- <span class="placeholder-inline-tasks">Heated bed</span>
    - <span class="placeholder-inline-tasks">design one. Maybe use underfloor heating of the building itself or use something with hot water circulatory</span>
- <span class="placeholder-inline-tasks">Laser pointers</span>
    - <span class="placeholder-inline-tasks">make the beam adjustable remotely using deflection mirros instead of screwing down with set screws</span>
- <span class="placeholder-inline-tasks">Z limit switch</span>
    - <span class="placeholder-inline-tasks">simulate switch using Smart Stepper (sensorless homing using error +/-) or perform contactless using IR for example</span>
- <span class="placeholder-inline-tasks">Security</span>
    - <span class="placeholder-inline-tasks">add PIR sensor or laser sensors to react on people entering the working area (build volume) - e.g. halt print, make some sound or print slower for example</span>
- <span class="placeholder-inline-tasks">Duet / RepRapFirmware</span>
    - <span class="placeholder-inline-tasks">add some routine to RepRapFirmware to disallow movements which are not in the build volume. At the moment we can try to reach unreachable coordinates. This results in line mess on spools)</span>
    - make I2C/TWI compatible with Duet + Smart Steppers → use TWI support of Duet (TWD0, TWCK0 pins on expansion header) and send and receive I2C commands with [M260](https://duet3d.dozuki.com/Wiki/Gcode#Section_M260_i2c_Send_and_or_request_Data) see also ([forum.duet3d.com)](https://forum.duet3d.com/topic/14517/i2c-baud-rate/5)
        - M114 S1 should work then which would help a lot for [Building basics, checks, maintenance](https://old.stadtfabrikanten.org/display/TH/Building+basics%2C+checks%2C+maintenance) - we could convert the Repetier Server Smart Stepper control mode scripts into GCode aliases (see [Smart Stepper - calibration and control modes (sPID mode, pPID mode and torque mode)](https://old.stadtfabrikanten.org/pages/viewpage.action?pageId=70811759)
    - Udapte to RRF 3 → see [https://forum.duet3d.com/topic/14215/hangprinter-help-on-duet-3/10](https://forum.duet3d.com/topic/14215/hangprinter-help-on-duet-3/10)
    - have a look into Klipper Firmware which seems to support cable winch driven printers too → [https://github.com/KevinOConnor/klipper](https://github.com/KevinOConnor/klipper/)
    - upgrade hardware to HangPrinter v4 which supports native stock firmware soon instead custom firmware → "Later on, HP4 support will hopefully stabilize and be merged into all major firmwares, and this directory can simply contain instructions and configuration recommendations." ([https://gitlab.com/tobben/hangprinter/-/tree/version\_4/firmware](https://gitlab.com/tobben/hangprinter/-/tree/version_4/firmware))
    - <span class="placeholder-inline-tasks">wire Gyro/IMU directly with Duet and implement algorithms to control the printer using I2C data (real time data)  
        </span>
    - **<span class="mw-headline">Home position using IMU (idea from [https://www.appropedia.org/Clerck,\_a\_RepRap\_3D\_printer\_hanging\_from\_the\_ceiling](https://www.appropedia.org/Clerck,_a_RepRap_3D_printer_hanging_from_the_ceiling))</span>**
        
        
        1. If printer is not horizontal, tighten D-lines until it is **(even if the effector was configured to be horizontal it could change its levelness while printing because the D spool spools up the 3 D lines unevenly)**
        2. Lower printer (extend D-lines) until hot end crashes into print surface
        3. Set D-length. D-axis is now calibrated
        4. Extend D-lines an additional 2 mm
        5. While not horizontal: 
            1. Calculate direction of inclination
            2. Tighten A, B or C to counteract inclination
        6. Tighten D-lines 2 mm
        7. We are now at home position, all axes calibrated
    - **<span class="mw-headline">Automatic slack line compensation idea using IMU (idea from [https://www.appropedia.org/Clerck,\_a\_RepRap\_3D\_printer\_hanging\_from\_the\_ceiling](https://www.appropedia.org/Clerck,_a_RepRap_3D_printer_hanging_from_the_ceiling))</span>**
        
        
        1. Compute some quantity describing "expected jerk" from gcode (Marlin and other firmware already does this. In Marlin the value would be tucked into the block\_t struct)
        2. Use IMU to record "observed jerk" (again tucking it into block\_t in Marlin)
        3. Write a function `F(expected jerk, observed jerk)` → `Move_to_tighten_strings`, and call it once in a while
        4. since cheap 6-axis IMUs are really good at recording rotation, I expect the notion of "jerk" to include rotation (with expected rotation always 0). Timing will be really important, but Hangprinter-Marlin already has five `nop` operations in the middle of the stepping code (see the workhorse function in `stepper.cpp`), that could be utilized for IMU readings at precisely the right times. The `nop`s are just there to wait for drv8825 stepper driver chips anyways.
- <span class="placeholder-inline-tasks">Force / tension sensing</span>
    - <span class="placeholder-inline-tasks">add some kind of tension sensing system for all nine ABCD lines. The information can be used to do emergency halt if force exceeds limits (like line tripping) or to compensate the error</span>
    - <span class="placeholder-inline-tasks">add some constant force springs to the ABC lines to create better tension</span>
    - <span class="placeholder-inline-tasks">we cannot use the Smart stepper torque for this because we cannot guarantee the root cause of that event (e.g. line jumped off the bearing). We can u</span>se error pin of smart steppers for emergency halt. default errorlimit is 1.8 degrees. exceeding the configured limit will turn the yellow LED lighting on the PCB and the error pin will be set to 1
    - maybe add some encoders at each pivot bearing. We could sync the measurement values and could detect issues in motion system like teared lines, greater offsets, etc.
- <span class="placeholder-inline-tasks">Absolute positioning</span>
    - <s><span class="placeholder-inline-tasks">integrate draw wire encoder per drive for absolute positioning (in case the bottom anchors are rigid we can use this for absolute XYZ positioning maybe)</span></s>
    - <s>["April Tag" Localization System](https://www.youtube.com/watch?v=Y8WEGGbLWlA)</s>
    - <s><span class="placeholder-inline-tasks">[libsurvive (Open Source Lighthouse Tracking System)](https://github.com/cntools/libsurvive#lists-of-components)</span></s>
    - <s><span class="placeholder-inline-tasks">[vivetracker ](https://github.com/ashtuchkin/vive-diy-position-sensor)</span></s>
    - <s>[hivetracker](https://medium.com/hacksters-blog/sub-millimeter-3d-positioning-with-hivetracker-ed213b1ea0c1)</s>
    - <s>[pozyx.io](https://www.pozyx.io/shop/product/creator-kit-65)</s>
    - <s>camera tracking system with LEDs on the effector</s>
    - [tobben's hp-mark implementation](https://www.youtube.com/watch?v=As3Y5J2NTGA)