Duplicator i3 Mini Add-ons

There are three add-ons that have improved the ease of use and quality of prints on my PowerSpec branded Wanhao Duplicator i3 Mini. The first is setting up OctoPi. My second upgrade was a filament guide that helps protect the printer. Lastly, the bed stabilizers make prints more reliable.

OctoPi

The Pi Zero W isn’t recommended if you’re planning to do any time-lapse photos, streaming or other bandwidth heavy tasks. You’ll need the Pi 3B for that.

Raspberry Pi Zero W

OctoPi allows you to send gcode files to the printer wirelessly. If you’re on a budget and don’t need time-lapse photos, the Pi Zero W works to send prints wirelessly. You must be on the same wifi as the Raspberry Pi for this to work. You won’t be able to access OctoPi remotely without additional setup.

– Raspberry Pi Zero W link ($10)
– Power Cable link ($7.95)
– Micro Usb to USB adapter link ($6.85)
– 16GB micro sd card link ($7.49)
– USB cable (use the cable provided with the printer)
– Mount link
– Four M2.5 or M3 10mm Screws

pi zero w enclosure

Pi 3B Mount

If you’re planning to hook up a web camera to monitor progress or take-time lapse photos, you’ll need the Pi 3B or better.This enclosure mount can be used with a 3B.

Filament Guide

The filament will quickly scratch the surface of your printer as it drags along the edge. This filament guide can be installed using the existing screws and will help protect the exterior of your printer.

filament guide

Bed Stabilizers

The bed of the i3 mini is prone to minor shifts during the printing process leaving lines in your prints. I noticed this more at higher speeds than lower speeds. Adding these bed stabilizers will help prevent the bed from shifting during a print. You will need to re-level the bed after adding these.

bed stabilizer

Next Steps

The next mod that I plan to do to my printer is adding a fan duct.

3D Printer Bed Leveling: Duplicator i3 Mini

Being new to 3D printing, I felt like the instructions relating to bed leveling were very vague. My first few prints did not stick to the bed and when I finally got my prints to adhere, the edges would peel up half way into the print. After some troubleshooting, my prints are now adhering to the bed without any issues.

Disclaimer: Each 3D printer is a little bit different. Even printers of the same model my behave differently. The following steps helped me but won’t necessarily help everyone. Read your printers provided instruction manual and get familiar with your printer before making any adjustments. Monitor your print after making adjustments to ensure everything is working as expected. Incorrect adjustments can cause damage to your printer. Make adjustments at your own risk.

PowerSpec Duplicator i3 Mini

The printer I’m using is the PowerSpec branded Wanhao Duplicator i3 Mini. It came fully assembled but has required a number of adjustments to get everything working.

PowerSpec i3 Mini

Bed Leveling

The instructions said to use the provided bed leveling gauge when going to through the bed leveling wizard. After doing this a number of times to get it just right, my prints were not sticking to the bed. The filament would lift off almost immediately. It was clear there was no adhesion to the plate. I went through the bed leveling again, this time making it so that I could barely get the gauge under the nozzle. This worked better but I still got some edges peeling up after a couple of layers were printed.

Solution

The solution that worked for me was to make a number of minor adjustments. First, slow down the brim speed to 10 mm / s. You can do this by enabling the advanced settings in Cura. Second, increase the temperature of the initial layer. My filament has a maximum temperature of 225 degrees C and I set the initial layer temperature at 220 degrees C. All other layers, I’ve been using 214 degrees C. Third, add a brim to all prints. This helps with adhesion. I’ve been using between 4 mm and 10 mm of brim. Lastly, use a standard 8.5 by 11 sheet of paper to level the bed instead of the provided gauge. Complete the bed leveling process multiple times and make sure there isn’t any filament on the tip of the nozzle when you do the leveling. After making sure there was no residue on the nozzle, I completed the bed leveling process with a cold nozzle.

After completing the above steps, I’ve had adhesion on all of my prints. Some resources online have suggested masking tape or glue sticks but I haven’t needed to use either of those. At one point my nozzle was a little bit too close to the bed and my brim was semi-transparent (using white filament). It was very difficult to get the print off. Leveling the bed again resolved this.

Summary

  • Slow the brim print speed to 10 mm / s
  • Increase the initial layer temperature closer to your filament max temp
  • Include a brim width of 6 mm to 10 mm
  • Use a sheet of standard printer paper for leveling instead of the provided gauge
  • Keep overall print speed at 50 mm / s or slower
  • Keep initial layer print speed at 25 mm / s or slower

Bed Leveling Gauge

Next Steps

The advanced settings in Cura make a huge difference in the quality of prints. Slowing the initial layer print speed and overall print speed have had a big impact on the quality and success of my prints. In a future post, I plan to provide details on which settings have worked well for various types of prints.

App Shortcuts API for Android

Provide quick access to the most used features of your app using the new App Shortcuts API for Android. Unlike many features found in the support library, this API is only available for devices running Android 7.1+ and will not appear on older devices. The good news is that shortcuts are quick to implement and users with compatible devices will appreciate the time savings. You can even pin shortcuts to the home screen making them even easier to use.

Shortcut API animation

Add a Static Shortcut

Step 1: Target Android API 25+

In order to test this feature out, you must be targeting API 25+ and running an emulator or device with Android 7.1 or higher.

Step 2: Update Your AndroidManifest.xml

Add the path to your XML definition for your shortcuts in your main activity.

<activity
    android:name="com.blackcj.fitdata.activity.MainActivity"
    android:label="@string/app_name">
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
    <!-- App Shortcuts -->
    <meta-data android:name="android.app.shortcuts" android:resource="@xml/shortcuts" />
</activity>

Step 3: Create Your shorcuts.xml File

Add a resource folder for XML that targets API 25+ (xml-v25) inside your res folder. Add the corresponding label and icon files to your project. Update the package name to match your project.

<?xml version="1.0" encoding="utf-8"?>
<shortcuts xmlns:android="http://schemas.android.com/apk/res/android" >
    <shortcut
        android:shortcutId="add_activity"
        android:icon="@drawable/add"
        android:enabled="true"
        android:shortcutShortLabel="@string/add_new_activity_short"
        android:shortcutLongLabel="@string/add_new_activity"
        >
        <intent
            android:action="com.blackcj.fitdata.ADD_ACTIVITY"
            android:targetPackage="com.blackcj.fitdata"
            android:targetClass="com.blackcj.fitdata.activity.MainActivity"
            />
    </shortcut>
</shortcuts>

Step 4: Update Your Main Activity

Check the intent in the onCreate function of your Main Activity. If it matches the intent of the shortcut, navigate to the corresponding area within your application.

public static final String ACTION_ADD_ACTIVITY = "com.blackcj.fitdata.ADD_ACTIVITY";

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    ...

    if (ACTION_ADD_ACTIVITY.equals(getIntent().getAction())) {
        // Invoked via the manifest shortcut.
        AddEntryActivity.launch(MainActivity.this, 3);
    }
}

Summary:

This is a great new feature but will take time from both an OS adoption and user education perspective. If you’re running Android 7.1+ and app shortcuts don’t appear, make sure your default launcher supports this feature. In addition to static shortcuts, you can also create dynamic user selectable shortcuts using the ShortcutManager.

Additional Resources:

https://developer.android.com/guide/topics/ui/shortcuts.html

Building a Custom Android Keyboard

Problem

Google’s sample keyboard project is a little out of date. It’s a very helpful starting point but requires some minor changes to get it working as expected. On top of that, many of the common customizations are spread out across a wide array of stack overflow posts.

Solution

I’ve made some minor updates to Google’s base keyboard example and applied some of the common customizations to the keyboard. This only took a couple of hours to put together but required a number of different resources including blogs, documentation and Stackoverflow. This keyboard contains styling, predictive complete spell check and alternate keys. There is still a lot of room for improvement but this is a much better starting point.

Keyboard animation

Source Code

Overview

There are already resources that walk through aspects of the keyboard code in great detail. At a high level you have a class that extends Keyboard, a KeyboardView and a KeyboardService that extends InputMethodService. On top of that it’s really just adding your icons, layout and XML files. Most of the styling can be done in the input.xml file.

Popup Keyboard Layout:

When you add pop-up keys (alternate keys that appear on long press) you’re actually creating a new keyboard for the pop-up. It was a bit confusing at first but makes sense after you take a look at the code. The new keyboard is automatically created and displayed as a modal above your existing keyboard.

Popup Keyboard

Snipet from original keyboard XML template:

...
<Key android:codes="46,44" android:keyLabel=". ,"
     android:keyWidth="15%p" android:popupCharacters=".,?!#@" 
     android:popupKeyboard="@xml/keyboard_popup_template"/>
...

Popup keyboard XML template:

<?xml version="1.0" encoding="utf-8"?>
<Keyboard xmlns:android="http://schemas.android.com/apk/res/android"
    android:keyWidth="10%p"
    android:horizontalGap="0px"
    android:verticalGap="0px"
    android:keyHeight="56dp">
</Keyboard>

Popup keyboard layout file (set in the input.xml keyboard layout):

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal"
    android:background="@color/colorPrimaryDark">
    <android.inputmethodservice.KeyboardView
        android:id="@android:id/keyboardView"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:keyPreviewLayout="@layout/preview"
        android:popupLayout="@layout/keyboard_popup_layout"
        android:keyBackground="@drawable/key_background"
        android:keyTextColor="#333"
        android:background="@color/colorPrimaryDark"
        android:keyTextSize="22sp"/>
    <ImageButton android:id="@android:id/closeButton"
        android:background="@android:color/transparent"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:layout_marginStart="8dp"
        android:layout_marginEnd="8dp"
        android:clickable="true"
        android:src="@drawable/ic_close_black" />
</LinearLayout>

Next Steps

The predictive text appears over the top of content on the screen. I’ve been reading that it’s easier to manage by including it in the keyboard layout instead of using the candidates view. This would give more control over the behavior and prevent content on the screen from being covered up. In addition to that, predictive text doesn’t work correctly if you hit backspace half way through a word. The text selection position should be updated to check for white space and more intelligently select the word. This implementation uses the dictionary which seemed like a reasonable predictive text option but it could be updated to include a app specific dictionary of words that builds up over time.

I’ve removed the preview text in this example (the semi-transparent pop-up that appears just above the letter as you type). The pop-up was animating around the screen and not behaving like the new Android material keyboard. It didn’t look easy to modify this in the KeyboardView, it would probably be better to write this logic from scratch if you need it.

Resources

Getting Started:
https://developer.android.com/guide/topics/text/creating-input-method.html
http://www.fampennings.nl/maarten/android/09keyboard/index.htm

Sample Code:
https://android.googlesource.com/platform/development/+/master/samples/SoftKeyboard/
https://github.com/blackcj/AndroidCustomKeyboard

Spell Checker:
https://android.googlesource.com/platform/development/+/master/samples/SpellChecker/HelloSpellChecker/src/com/example/android/hellospellchecker/HelloSpellCheckerActivity.java
https://developer.android.com/guide/topics/text/spell-checker-framework.html

Other:
https://github.com/zeuxisoo/android-emoji-keyboard
https://stackoverflow.com/questions/7752580/creating-a-softkeyboard-with-multiple-alternate-characters-per-key

Stackoverflow Posts:
https://stackoverflow.com/questions/30654687/how-can-i-show-the-candidates-view-under-the-android-soft-keyboard
https://stackoverflow.com/questions/18180136/how-to-change-background-color-or-theme-of-keys-dynamically-in-custom-keyboard-a
https://stackoverflow.com/questions/17714172/how-to-change-key-background-of-any-key-in-android-soft-keyboard
https://stackoverflow.com/questions/9996968/hide-android-keyboard-key-preview
https://stackoverflow.com/questions/2888896/add-words-to-androids-userdictionary