Showing posts with label 3D print. Show all posts
Showing posts with label 3D print. Show all posts

2020/06/14

3D Print - iPAD Holder for Treadmill

Tired of using tape to glue the iPad to the treadmill, my wife asked me to design and print an iPad holder for her. Here it is! 


This is a multiple weekends project, since the 3D design took me many weeks to complete. Hope you could also get some inspiration from this and design your own.


STL file on Thingverse:  https://www.thingiverse.com/thing:4459427




2020/04/24

Smartphone mount for camera tripod [3D Print]

I needed a smartphone mount for my tripod, so I designed this from a sketch using Fusion 360. I know there are relatively cheaper smartphone mounts for tripod out there in the market, but I just can't help to make one myself to learn.

STL file is available here: https://www.thingiverse.com/thing:4309896

In fill: 70% for the middle part and 20% for rest
Nozzle: 0.4 mm
Layer high: 0.2 mm

For people who like to use this STL file, please be aware that not each tripod mount base has the same dimension, so, I highly recommend you to measure the base before 3D print.

Also, for the middle part, please use 70% infill to make the clip part stronger.



After couple of days struggling with Fusion 360, I was able to make the thing!! :)

My draft sketch about the mount design.

For the base, I printed 3-4 times to perfectly match my camera tripod. I think this is due to the precision of my Ender 3 Pro printer or PLA material.
After assembled the 3 parts together

Mount smartphone on the printed mount, perfect!

Place the smartphone mount on the camera tripod

2020/01/08

3D Print; Howto remove broken filament

Problem to solve for 3D printer:

Filament was broken inside the Bowden tube during a print.

My printer is Creality Ender 3s (or Ender 3 Pro). Maybe the tension on the filament spool was so tight caused filament broken inside the tube.

How to remove the broken filament:


  1. Turn on Ender 3s 
  2. Adjust nozzle temperature to 210 degree Celsius (keep it at 210 degree the whole time)

    From main menu -> Control -> Temperature -> Set it to 210
  3. Raise the Z axis to see the nozzle from below
  4. Remove the nozzle with a wrench. Remember the nozzle is heated at 210 degree; it's super hot!  It's better to use a socket wrench to remove the nozzle.


  5. Cut the end of filament flat and then push it through Bowden tube, until the broken filament is pushed out of the Bowden tube.
  6. Use the socket wrench to screw the nozzle back to the printer. 
  7. Be sure the nozzle is really tight and level the bed before try to return nozzle back to home.  Here is what happened to my magnetic bed! (see below)  I forgot to level the bed and hit the HOME command, then the nozzle scratched it badly! (The photo shown was after I cut the scratched part off the bed.)
  8. Readjust the bed with paper method
  9. Done.

References:


==== 中文版 ====

3D印表機要解決的問題:

在3D列印過程中,線材在送料管中間斷掉了

我的3D印表機是 Creality Ender 3s(或Ender 3 Pro)。 可能是我把線材軸上放在地上, 造成它的張力過,導致線材在送料管內斷裂。

如何取出折斷的線材:

  1. 打開 Ender 3s 電源
  2. 將噴嘴溫度調到210度(一直保持在210度)

    從主選單—>控制—>溫度—>設定為210
  3. 用手旋轉Z軸,從下方看噴嘴
  4. 用扳手慢慢的轉下噴嘴。 注意: 噴嘴已加熱到210度,超級熱! 最好使用套筒扳手轉下噴嘴。


  5. 將新的線材剪平,然後將它推入送料管中,用新的線材推出斷的線材,一直到把斷掉的線材從送料管裡面推出來。
  6. 使用套筒扳手將噴嘴擰回到印表機上。
  7. 請確保將噴嘴確實擰緊並請整印表磁床的水平。
    我在還沒有調整水平時, 就去按下HOME 的指令! 然後噴嘴就嚴重刮傷了我的磁床!
    (照片是我從磁床上割下來劃傷的部分,右邊沒受傷的部份繼續用,哈!
  8. 採用紙張的方式重新調整磁床水平
  9. 大功告成

參考資料:

2019/07/21

3D Printer Dampening Feet Noise Test

10 times less noise!


I just purchased my Creality Ender 3 Pro and after modified the HW(will write what I have modified later) and turning, turning, and more turning. It finally worked well after a month.

Many people in the Facebook group discussing what parts could self-print to upgrade.  One of them was the dampening feet to reduce noise. I tested the noise level in dB with Google Science Journal APP. The test duration was 31 seconds with PLA, 0.2 layer high, 100% infill.  Please see the results below.

 My Testing Results

In my test, Dampening feet reduced about 11 dB* about 10 times less noise! This is quite amazing!

However, few people in Facebook groups mentioned that there might be other disadvantages, such as wobbling when printing tall objects and these feet might broken easily.  

* A sound 10 times more powerful is 10 dB.
* A sound 100 times more powerful than near total silence is 20 dB.
Source: How stuff works


Print with Dampening Feet

Test Duration: 31 seconds
Average: 22 dB
Max: 37 dB
Google Science Journal App recorded the noise level



I have printed the same Dampening feet to get the more accurate noise level.



See the printing of a Damping feet in action (With Dampening feet)


Print without Dampening Feet

Test Duration: 31 seconds
Average: 30 dB
Max: 48 dB
Google Science Journal App recorded the noise level

The noise was recorded during printing the Dampening Feet.

Download .STL files

All the .STL file can be downloaded from Thingiverse.com
Original design was from Ender 3 Damping Feet by redmaxver

The one I downloaded  and tested was Ender 3 Complete Dampening Feet by rhin0xx
rhin0xx combined all 8 components together saved me some troubles.

The End

----------------中文版----------------------

大減10倍音量

我剛剛在對岸淘了一台 Creality Ender 3s (和3 Pro是同一機種),參考了網路上建議修改了一些東西(我之後會寫一篇我改了那裡的文章)之後就一直調整,換零件,又換零件,一直不斷的調整。大約一個月之後,它終可以正常的列印了。

Facebook上有許多人都在討論哪些部分可以自行3D列印來升級這台印表機。其中一個討論很多的是減震腳,它可以減少噪音。我用 Google Science Journal APP 測試持續時間31秒再觀查它的噪音值 dB。我是用原廠的 PLA, 0.2 層高, 100% infill。測試結果請參閱下面說明。

我的測試結果

我的測試結果顯示,減震腳減少了大約11分貝(dB, 減了10倍音量)*  !這讓我太訝異了!
不過,Facebook群組中也有不少人提到其他可能缺點,例如在打印較高的物件時,機體可能會搖晃影響到列印結果,還有這些減震腳也可能很容易斷裂。

* 10倍的音量是10分貝(dB)
* 100倍的音量是20分貝(dB)
資料來源: How stuff works

加減震腳裂印測試

測試時間長度: 31秒
平均噪音: 22分貝 dB
最大噪音: 37分貝 dB
Google Science Journal App 來記錄噪音值

加減震腳照片


我列印同一個物件來測試 加減震腳噪音
來讓測結果能更正確



 加減震腳的列印影片 


未加減震腳裂印測試

測試時間長度: 31秒
平均噪音: 30分貝 dB
最大噪音: 48分貝 dB
Google Science Journal App 來記錄噪音值

上方的噪音值是列印減震腳時錄製的

下載 .STL 檔案

全部的 .STL 檔案均由 Thingiverse.com 下載
原始的設計者 Ender 3 Damping Feet by redmaxver

我下載及列印的是 Ender 3 Complete Dampening Feet 由 rhin0xx 所修改的
rhin0xx 把 8 個物件全部放在同一個檔案內,比較方便列印。

全文完


2019/05/25

Light Tracking Gimbal



Preface

Based on my previous project (Joystick Control Gimbal), I slightly modified it into a Light Tracking device.  It took me about two days to fine-tune the Light Tracking Gimbal to move smoothly and hold its position while light source is not moving.

Goal of this tutorial

Let's see the video below to see what's the final result of this tutorial.




Gimbal Panel Area

There are Top Left, Top Right, Bottom Left, and Bottom Right.
In each area, there is a light sensor.



Programming Logic:

  1. Get reading from 4 photo sensors 
    • I sample each sensor 10 times and then get the average value to ensure the readings are more stable
  2. Get average of each side
    • Top side value = (Top left + Top right) / 2
    • Bottom side value = (Bottom left + Bottom right) / 2
    • Left side value = (Top left + Bottom left ) / 2
    • Right side value = (Top right + Bottom right ) / 2
  3. Compare all four sides to see which side has bigger value
  4. Move the servo towards the biggest side among four side
  5. Tolerance variable is in control whether to move or not based on how much differences among four sides. If reading values from four sides were within the range of 100, then keep the Gimbal static(Hold it's position) (default value = 100)
Tolerance variable is the most important variable to ensure the Gimbal holds its position when four light sensors get values within the defined tolerance!

Component Needed for this project

  • Arduino Nano * 1
  • SG90 Servo * 2
  • Light sensors * 4
  • 10K Resistors * 4
  • Prontoboard * 1
  • Many jump wires
  • Extra long wires for photo sensor connect * 4
  • Heat shrink tube 2cm * 4

Tools Needed

  • Soldering gun * 1
  • Diagonal cutting pliers * 1
  • Screw driver * 1
  • Few screws * 10
  • Double sided tape

Schematic: (I use fritzing for this schematic)



Program Code:

*************************************************************
*** Please click subscribe my YouTube Channel before use the code 
*** There is no restriction, but I would be really appreciated 
*** if you did. Thank you!  **************************************************************

*************************************************************
*** 在 Copy 底下程式碼之前,請按下底下按鈕,訂閱我的 YouTube 頻道! 
*** 雖沒有強制規定,不過如果你有訂閱的話,非常感謝你! 
**************************************************************
/**
   Author: Kevin Chen AKA Stonez56 
   My Blog to see more tutorials: https://stonez56.blogspot.com
   Date: 2019/05/11 The day before mother's day

    Program function flow
   1. Reading four light sensor values
   2. Average top two(Top left, Top right), bottom two(Bottom left, Bottom right)
   3. Average left two(Top left, Bottom left), right two (Top right, Bottom right)
   4. Compare 4 averaged value and make servo mave toward the biggest number side
   
   v0 Light traking Gimbal base to get readings
   v1 Write servo code in and move servo accordingly

                    |
         Top left   |     Top right
   -----------------+----------------------
     Bottom left   |  Bottom right
                    |
*/
#include <Servo.h>
Servo servo1_x;
Servo servo2_y;

//Light Sensor Pin definitions
const uint8_t  light_top_left_PIN = A6;
const uint8_t  light_bottom_left_PIN = A5;
const uint8_t  light_top_rigth_PIN = A2;
const uint8_t  light_bottom_right_PIN = A1;
//Potentiometer pin
const  int potPIN = A0;
//Servo pins
const int servo1_x_pin = 2;
const int servo2_y_pin = 4;


//User define variables
// Gimbal movement tolerance 50~255
byte gimbal_movement_tolerance = 100;
//Photo sensor max reading times for average (for more accuracy)
byte max_reading = 10;
// define original servo angle
uint8_t originalAngle = 92;
uint8_t x_last = originalAngle;  // X last postion
uint8_t y_last = originalAngle; // Y last postion
uint8_t moveSpeed = 10;  //How fast show this Servo move
uint8_t maxSpeed = 50; //Max speed
uint8_t minSpeed = 1;
uint8_t y_minAngle = 1;  //Mimum angle
uint8_t y_maxAngle = 180;  //Maximum angle
uint8_t x_minAngle = 90;  //Mimum angle
uint8_t x_maxAngle = 180;  //Maximum angle

void setup() {
  Serial.begin(57600);

  pinMode(light_top_left_PIN, INPUT);
  pinMode(light_bottom_left_PIN, INPUT);
  pinMode(light_top_rigth_PIN, INPUT);
  pinMode(light_bottom_right_PIN, INPUT);

  servo1_x.attach(servo1_x_pin);
  servo1_x.write(originalAngle); //move servo to defined angle
  servo2_y.attach(servo2_y_pin);
  servo2_y.write(originalAngle); //move servo to defined angle

  pinMode(LED_BUILTIN, OUTPUT);
  digitalWrite(LED_BUILTIN, LOW);

}

void loop() {
  char moveTowards = ' ';


  int potValue = analogRead(potPIN);
  Serial.print(F("potValue: "));
  Serial.println(potValue);
  moveSpeed = map(potValue, 0, 500, minSpeed, maxSpeed);
  Serial.print(F("moveSpeed: "));
  Serial.println(moveSpeed);
  moveTowards = getFacingToward(); //find out which side to move


//  Serial.print(F("moveTowards: "));
//  Serial.println(moveTowards);
  moveServo(moveTowards);

  delay(80);
}

void moveServo(char moveTowards) {


  //previous position were stored in x_last, y_last
  switch (moveTowards) {
    case 'T': //Move towards top
      if (x_last - moveSpeed < x_minAngle) {
        x_last = x_minAngle;
        servo1_x.write(x_last);
      } else {
        x_last -= moveSpeed;
        servo1_x.write(x_last);
      }
      break;
    case 'B': //Move towards bottom
      if (x_last + moveSpeed > x_maxAngle) {
        x_last = x_maxAngle;
        servo1_x.write(x_last);
      } else {
        x_last += moveSpeed;
        servo1_x.write(x_last);
      }
      break;
    case 'L': //Move towards left
      if (y_last - moveSpeed < y_minAngle) {
        y_last = y_minAngle;
        servo2_y.write(y_last);
      } else {
        y_last -= moveSpeed;
        servo2_y.write(y_last);
      }
      break;
    case 'R':
      if (y_last + moveSpeed > y_maxAngle) {
        y_last = y_maxAngle;
        servo2_y.write(y_last);
      } else {
        y_last += moveSpeed;
        servo2_y.write(y_last);
      }
      break;
    default:
      //Don't move servo
      break;
  }

}

/**
   This fuction get reading max_reading times and return average
   if it sees an 0, it will skip it
*/
int averageReading(int PIN, byte max_reading) {
  int total = 0;
  int current = 0;

  for (byte i = 0; i <= max_reading; i++) {
    current = analogRead(PIN);
    if (current == 0) {
      current = analogRead(PIN);
    }
    total += current;
  }

  return total / (max_reading);
}

/**


   Parameters: N/A
   Return: char; T, B, R, L to indicate the moving directoin
                       '-' means not moving at all
*/
char getFacingToward() {
  //1. Read each pin max_reading times

  int top_left = averageReading(light_top_left_PIN, max_reading);
  int bottom_left = averageReading(light_bottom_left_PIN, max_reading);
  int top_right = averageReading(light_top_rigth_PIN, max_reading);
  int bottom_right = averageReading(light_bottom_right_PIN, max_reading * 3);

  //Show photo sensor readings...
  Serial.print(F("Top left-A6: "));
  Serial.println(top_left);
  Serial.print(F("Bottom left-A5: "));
  Serial.println(bottom_left);
  Serial.print(F("Top right-A2: "));
  Serial.println(top_right);
  Serial.print(F("Bottom rightA1: "));
  Serial.println(bottom_right);

  //2. Get max value sides(two averaged, see above)
  byte go_direction[4] = {0, 0, 0, 0};
  int toward[4] = {0, 0, 0, 0}; //Top, Bottom, Left, Right
  toward[0] = (top_left + top_right) / 2 ;
  toward[1] = (bottom_left + bottom_right) / 2 ;
  toward[2] = (top_left + bottom_left) / 2;
  toward[3] = (top_right + bottom_right) / 2;

  //3. Add all side and average,
  //    if each side is within the tolerance then don't move Gimbal
  //    average = toward[0] +...toward[3]
  //    average - toward[0] .... toward[3], if all within gimbal_movement_tolerance, then no move
  int total_toward = 0;
  total_toward += toward[0];
  total_toward += toward[1];
  total_toward += toward[2];
  total_toward += toward[3];
  //get average
  int total_average = total_toward / 4; //4 sides
  Serial.print(F("total_average:"));
  Serial.println(total_average);
  //    if each side is within the tolerance then don't move Gimbal
  boolean shouldMove = false;
  //else move the gimbal
  if (total_average - toward[0] > gimbal_movement_tolerance) shouldMove = true;
  if (total_average - toward[1] > gimbal_movement_tolerance) shouldMove = true;
  if (total_average - toward[2] > gimbal_movement_tolerance) shouldMove = true;
  if (total_average - toward[3] > gimbal_movement_tolerance) shouldMove = true;

  Serial.print(F("toward 0 TOP : "));
  Serial.println(toward[0]);
  Serial.print(F("toward 1 BOTTOM: "));
  Serial.println(toward[1]);
  Serial.print(F("toward 2 LEFT: "));
  Serial.println(toward[2]);
  Serial.print(F("toward 3 RIGHT: "));
  Serial.println(toward[3]);

  //Find the biggest number to decide which side to go,
  // but if four values are quite similar, send '-' back to indicate not moving
  char facing = ' ' ;
  if (shouldMove) {
    int max_ = 0;
    if (toward[0] > max_) {
      max_ = toward[0];
      facing = 'T';
    }
    if (toward[1] > max_) {
      max_ = toward[1];
      facing = 'B';
    }
    if (toward[2] > max_) {
      max_ = toward[2];
      facing = 'L';
    }
    if (toward[3] > max_) {
      max_ = toward[3];
      facing = 'R';
    }
  } else {
    facing = '-'; //no need to move
  }
  //  Serial.print(F("shouldMove: "));
  //  Serial.println(shouldMove);
  return facing;
}



References:

  1. Serveo Example: https://www.instructables.com/id/4-Simple-Servo-Project-with-Arduino/ 
  2. Light Sensor Example: https://maker.pro/arduino/tutorial/how-to-use-an-ldr-sensor-with-arduino 
  3. 3D Gimbal base model: https://www.thingiverse.com/thing:2892903
    You probably need slight modification to this model to be able to fix the base... I did
====================THE END============

中文版


前言

根據我之前做的專案(Arduino 用搖桿控制的雙向轉軸的平台),我稍微將它修改為一個光源追蹤裝置。 主要的時間是花在微調在雲台伺服器的控制上,以便它光源不動的情況下,平穩移動並保持其位置。

專案目標

讓我們看一下下面的成果影片,看看本次教學的最終成果:


雲台分區

分為左上角,右上角,左下角,右下角,每一個分區內,各有一顆光敏電阻。


程式邏輯

  1. 從4個光敏電阻讀取訊號數值:
    • 為了得到了更穩定的數值,每個光敏電阻採樣10次,然後取得到平均值。
  2. 取得到每一方向的平均值
    • 上方值=(左上角+右上角)/ 2
    • 下方值=(左下角+右下角)/ 2
    • 左邊值=(左上角+左下角)/ 2
    • 右邊值=(右上角+右下角)/ 2
  3. 比較所有四個方向面,找出更大的值的方向
  4. 將伺服機雲台朝向向大的值方向移動
  5. Tolerance variable 根據四邊之間的差異來控制是否移動。如果四個方向的值大小在 100以內,則伺服機雲台保持不動。(默認值= 100)

所需零件

  • Arduino Nano * 1
  • SG90 伺服馬達 * 2
  • 光敏電阻 * 4
  • 10K 電阻* 4
  • 洞洞板 * 1
  • 許多單蕊線
  • 稍長一些的單蕊線(接光敏電阻用) * 4
  • 熱縮套管 2cm * 4

所需工具

  • 焊鎗工具 * 1
  • 斜口鉗 * 1
  • 縲絲刀 * 1
  • 小縲絲 * 10
  • 雙面膠

線路圖: (我是用 fritzing 工具製作)



程式碼:

請參考英文版上方。

參考資料:

  1. 伺服器: https://www.instructables.com/id/4-Simple-Servo-Project-with-Arduino/ 
  2. 光敏電阻: https://maker.pro/arduino/tutorial/how-to-use-an-ldr-sensor-with-arduino 
  3. 3D 雲台模型: https://www.thingiverse.com/thing:2892903
    個雲台的底座螺絲孔過大,導致 SG90 所附螺絲無法直接鎖緊。要請高手出來修改一下! 

全文完