ラベル LEGO の投稿を表示しています。 すべての投稿を表示
ラベル LEGO の投稿を表示しています。 すべての投稿を表示

2022年5月15日日曜日

Ubuntu Desktop 22.04にLeoCADをインストールする

LeoCADで、LEGOブロックをコンピュータ内で組み立てることができます。

〇LeoCADの画面(Ubuntu 22.04)

Ubuntu Softwareによるインストール方法

1. Ubuntu Softwareを起動して、leocadを検索します。

2.LeoCADのインストールボタンをクリックします

コマンドでのインストール方法

以下のコマンド実行します
sudo apt-get update

sudo apt-get -y install snapd

sudo snap install leocad

2021年9月7日火曜日

OpenSCADとUltimaker Curaを使用して、Instax mini用写真フレームを差し込む事のできるLEGOブロックを作る

OpenSCADとUltimaker Curaを使用して、Instax mini用写真フレームを差し込む事のできるLEGOブロックを作るには以下の手順を実行します。差し込むInstax mini用フレームは「OpenSCADとUltimaker Curaを使用して、Instax miniの写真が収まるフレームを作る」を参照してください。

〇Instax mini用写真フレームを差し込む事のできるLEGOブロックの写真
写真フレームの下の部分が今回作成したブロックです。

〇スリットのあるLEGOブロックの写真

作成手順

1. OpenSCADで以下のコードを実行して形状を調整し、STLファイルにエクスポートします。
SLIT_Dパラメータでスリットの幅が調整できます。

・Instax mini用写真フレームを差し込む事のできるLEGOブロックのソースコード
// プレートの厚さ
PLATE_THICK=5;

// LEGOの1ブロック
LEGO_SQUARE=7.95;
// LEGOの側面の厚さ
LEGO_WALL=1.5;
// LEGOの底面の円の直径
LEGO_BOTTOM_CIRCLE=6.4;
// 底の側面の高さ
LEGO_BOTTOM_H=2.6;

// プレートのサイズ(ブロック単位)
NUM_HOLE_W=8;
NUM_HOLE_D=2;

// Instax mini用写真フレームを差し込むスリット
SLIT_W=LEGO_SQUARE*NUM_HOLE_W;
SLIT_D=3.3;
SLIT_H=3.1;

//rotate([-180,0,0])
difference(){
    union(){
        // 天板
        translate([0, 0, 0])
        linear_extrude(height=PLATE_THICK){
            square([LEGO_SQUARE*NUM_HOLE_W, LEGO_SQUARE*NUM_HOLE_D]);
        }

        // 側面
        translate([0, 0, -LEGO_BOTTOM_H])
        linear_extrude(height=LEGO_BOTTOM_H){
            square([LEGO_SQUARE*NUM_HOLE_W, LEGO_WALL]);
        }

        translate([0, LEGO_SQUARE*NUM_HOLE_D-LEGO_WALL, -LEGO_BOTTOM_H])
        linear_extrude(height=LEGO_BOTTOM_H){
            square([LEGO_SQUARE*NUM_HOLE_W, LEGO_WALL]);
        }

        translate([0, 0, -LEGO_BOTTOM_H])
        linear_extrude(height=LEGO_BOTTOM_H){
            square([LEGO_WALL, LEGO_SQUARE*NUM_HOLE_D]);
        }

        translate([LEGO_SQUARE*NUM_HOLE_W-LEGO_WALL, 0, -LEGO_BOTTOM_H])
        linear_extrude(height=LEGO_BOTTOM_H){
            square([LEGO_WALL, LEGO_SQUARE*NUM_HOLE_D]);
        }

        // 下の円柱
        for( lw = [0 : NUM_HOLE_W-2] ){
            for( ld = [0 : NUM_HOLE_D-2] ){
                translate([LEGO_SQUARE*(lw+1), LEGO_SQUARE*(ld+1), -LEGO_BOTTOM_H])
                linear_extrude(height=LEGO_BOTTOM_H){
                    circle(LEGO_BOTTOM_CIRCLE/2, $fn=50);
                }
            }
        }
    }
    union()
    {
        // Instax mini用写真フレームを差し込むスリット
        translate([0, (LEGO_SQUARE*NUM_HOLE_D)/2-SLIT_D/2, PLATE_THICK-SLIT_H])
        linear_extrude(height=SLIT_H){
                square([SLIT_W, SLIT_D]);
        }
    }

}

・OpenSCADの画面

2. Ultimaker CuraでSTLファイルを読み込み、スライスしてgcodeを保存します。

3. 3Dプリンターで印刷します

関連情報

・そのほかの3Dプリンターで作成したモデルについては、以下のページを参照してください。
OpenSCADまとめ

2021年8月25日水曜日

OpenSCADとUltimaker Curaを使用して、LEGO互換の突起が付いたUSBタイプAのキャップを作る

OpenSCADとUltimaker Curaを使用して、LEGO互換の突起が付いたUSBタイプAのキャップを作るには以下の手順を実行します。USB端子から埃などが入ることなどを防止することができます。

〇LEGO互換の突起が付いたUSBタイプAのキャップの写真
・USBタイプAのキャップとLEGO人形の写真

・USBバッテリーに差し込んだキャップとLEGO人形

作成手順

1. OpenSCADで以下のコードを実行して形状を調整し、STLファイルにエクスポートします。
USBタイプAのキャップとLEGO互換の突起2つを別々に印刷します。
穴の半径など3Dプリンタや設定によって微調整してください。

・USBタイプAのキャップのソース
// USBタイプAのサイズ
USB_A_W=12.1;
USB_A_D=8.5;
USB_A_H=4.6;
// 端子のサイズ
USB_A_TERMINAL_H=2.2;
TERMINAL_EDGE=0.5;
TERMINAL_DISTANCE=1.5;
TERMINAL_TOP_H=1;
TERMINAL_TOP_W=1.5;
// キャップ部分
CAP_W=7.95*2;
CAP_D=7.95*2;
CAP_H=5;

rotate([90, 0, 0])
union(){
    translate([-USB_A_W/2, 0, 0])
    linear_extrude(height=USB_A_TERMINAL_H){
        square([USB_A_W, USB_A_D]);
    }
    translate([-USB_A_W/2, 0, USB_A_TERMINAL_H])
    linear_extrude(height=TERMINAL_EDGE){
        square([TERMINAL_EDGE, USB_A_D]);
    }
    translate([USB_A_W/2-TERMINAL_EDGE, 0, USB_A_TERMINAL_H])
    linear_extrude(height=TERMINAL_EDGE){
        square([TERMINAL_EDGE, USB_A_D]);
    }
    translate([-CAP_W/2, -CAP_D, 0])
    linear_extrude(height=CAP_H){
        square([CAP_W, CAP_D]);
    }
    translate([-USB_A_W/2, 0, USB_A_TERMINAL_H+TERMINAL_DISTANCE])
    linear_extrude(height=TERMINAL_TOP_H){
        square([USB_A_W, TERMINAL_TOP_W]);
    }

}

・OpenSCADの画面(USBタイプAのキャップ)

・LEGO互換の突起のソース
// プレートの厚さ
PLATE_THICK=1;

// LEGOの1ブロック
LEGO_SQUARE=7.95;
// 突起の直径
LEGO_PEG=4.9;
LEGO_PEG_R=LEGO_PEG/2;
LEGO_PEG_H=1.8;

// プレートのサイズ(ブロック単位)
NUM_HOLE_W=2;
NUM_HOLE_D=2;

translate([0, 0, 0])
linear_extrude(height=PLATE_THICK){
    square([LEGO_SQUARE*NUM_HOLE_W, LEGO_SQUARE*NUM_HOLE_D]);
}

for( lw = [0 : NUM_HOLE_W-1] ){
    for( ld = [0 : NUM_HOLE_D-1] ){
        translate([LEGO_SQUARE*lw+LEGO_SQUARE/2, LEGO_SQUARE*ld+LEGO_SQUARE/2, PLATE_THICK])
        linear_extrude(height=LEGO_PEG_H){
            circle(LEGO_PEG_R, $fn=50);
        }
    }
}

・OpenSCADの画面(LEGO互換の突起)

2. Ultimaker CuraでSTLファイルを読み込み、スライスしてgcodeを保存します。

3. 3Dプリンターで印刷します
LEGO互換の突起は2つ分印刷します。

4. USBタイプAのキャップとLEGO互換突起の接着
キャプの正方形部分の上下にLEGO互換突起を、タミヤセメントなどの接着剤で、それぞれ接着します。接着時にはクリップなどで固定すると良く接着できます。

関連情報

OpenSCADまとめ

・LEGOに関する他の記事は、こちらを参照してください。

OpenSCADとUltimaker Curaを使用して、LEGO互換の2x4ブロックを作る

OpenSCADとUltimaker Curaを使用して、LEGOブロック上に固定できるLEDキューブを作成する

2021年8月19日木曜日

OpenSCADとUltimaker Curaを使用して、LEGO互換の1x2ブロックを作る

OpenSCADとUltimaker Curaを使用して、LEGO互換の1x2ブロックを作るには以下の手順を実行します。

〇LEGO互換の1x2ブロックの写真
※白色ブロックが今回作った物、赤色のブロックは純正のLEGOブロックです。

作成手順

1. OpenSCADで以下のコードを実行して形状を調整し、STLファイルにエクスポートします。
穴の半径など3Dプリンタや設定によって微調整してください。
NUM_HOLE_Wの値を4に変えれば1x4のブロックも作成することができます。

・LEGO互換の1x2ブロックのソース
// プレートの厚さ
PLATE_THICK=7;

// LEGOの1ブロック
LEGO_SQUARE=7.95;
// 突起の直径
LEGO_PEG=4.9;
LEGO_PEG_R=LEGO_PEG/2;
LEGO_PEG_H=1.8;
// LEGOの側面の厚さ
LEGO_WALL=1.5;
// LEGOの底面の円の直径
LEGO_BOTTOM_CIRCLE_S=3;
// 底の側面の高さ
LEGO_BOTTOM_H=2.6;

// プレートのサイズ(ブロック単位)
NUM_HOLE_W=2;

// 上面プレート
translate([0, 0, 0])
linear_extrude(height=PLATE_THICK){
    square([LEGO_SQUARE*NUM_HOLE_W, LEGO_SQUARE]);
}

// 突起
for( lw = [0 : NUM_HOLE_W-1] ){
    translate([LEGO_SQUARE*lw+LEGO_SQUARE/2, LEGO_SQUARE/2, PLATE_THICK])
    linear_extrude(height=LEGO_PEG_H){
        circle(LEGO_PEG_R, $fn=50);
    }
}

// 側面
translate([0, 0, -LEGO_BOTTOM_H])
linear_extrude(height=LEGO_BOTTOM_H){
    square([LEGO_SQUARE*NUM_HOLE_W, LEGO_WALL]);
}

translate([0, LEGO_SQUARE-LEGO_WALL, -LEGO_BOTTOM_H])
linear_extrude(height=LEGO_BOTTOM_H){
    square([LEGO_SQUARE*NUM_HOLE_W, LEGO_WALL]);
}

translate([0, 0, -LEGO_BOTTOM_H])
linear_extrude(height=LEGO_BOTTOM_H){
    square([LEGO_WALL, LEGO_SQUARE]);
}

translate([LEGO_SQUARE*NUM_HOLE_W-LEGO_WALL, 0, -LEGO_BOTTOM_H])
linear_extrude(height=LEGO_BOTTOM_H){
    square([LEGO_WALL, LEGO_SQUARE]);
}

// 下の円柱
for( lw = [0 : NUM_HOLE_W-2] ){
    translate([LEGO_SQUARE*(lw+1), LEGO_SQUARE/2, -LEGO_BOTTOM_H])
    linear_extrude(height=LEGO_BOTTOM_H){
        circle(LEGO_BOTTOM_CIRCLE_S/2, $fn=50);
    }
}

・OpenSCADの画面

2. Ultimaker CuraでSTLファイルを読み込み、スライスしてgcodeを保存します。

3. 3Dプリンターで印刷します

関連情報

OpenSCADまとめ

・LEGOに関する他の記事は、こちらを参照してください。

OpenSCADとUltimaker Curaを使用して、LEGO互換の2x4ブロックを作る

OpenSCADとUltimaker Curaを使用して、micro:bitをLEGOブロック上に縦置きできるホルダーを作成する

2021年8月18日水曜日

OpenSCADとUltimaker Curaを使用して、SG90サーボモーターを固定できるLEGO互換ブロックを作成する

OpenSCADとUltimaker Curaを使用して、SG90サーボモーターを固定できるLEGO互換ブロックを作成するには以下の手順を実行します。

〇SG90サーボを固定できるLEGO互換ブロックの写真
SG90を格納できるブロックは上から見て突起4x5のサイズで高さは2ブロック分です。白いブロックが今回作成したサーボモーター固定ブロックで、赤・黄色・黒のブロックは純正LEGOブロックです。

作成手順

1. OpenSCADで以下のコードを実行して形状を調整し、STLファイルにエクスポートします。
3Dプリンタの種類や設定によって、パラメータを微調整してください。

1-1. ブロック下側のサーボモーター固定パーツ
// LEGOの1ブロック
LEGO_SQUARE=7.95;

// プレートのサイズ(ブロック単位)
NUM_HOLE_W=5;
NUM_HOLE_D=4;
// 壁の厚さ
WALL_THICK=2;
// 左右の壁の厚さ
SIDE_THICK=3.5;
// 上側の厚み
TOP_THICK=4;
// 下側の厚み
BOTTOM_THICK=4;

// サーボ固定アーム下
MOUNTER_HANDLE_D=8;
MOUNTER_HANDLE_H=12.2;
MOUNTER_HANDLE_W=5.15;
// サーボ固定アーム上
MOUNTER_HANDLE_D2=8.4;

// サーボ固定アームオフセット
ARM_OFFSET_D=11.4;
ARM_OFFSET_W=7.0/2;

// サーボ固定アーム間距離
ARM_DISTANCE=22.5;

// サーボモーターの円形部分
LARGE_CIRCLE=11.7+0.2;
SMALL_CIRCLE=5.6+0.2;

// ケーブル用の穴
CABLE_D=2.5;
CABLE_W=6;


// 突起の直径
LEGO_PEG=4.9;
LEGO_PEG_R=LEGO_PEG/2;
LEGO_PEG_H=1.8;
// LEGOの側面の厚さ
LEGO_WALL=1.5;
// LEGOの底面の円の直径
LEGO_BOTTOM_CIRCLE=6.4;
// 底の側面の高さ
LEGO_BOTTOM_H=2.6;



difference(){
    union(){
        // ベース
        translate([0, 0, 0])
        linear_extrude(height=WALL_THICK){
            square([LEGO_SQUARE*NUM_HOLE_W, LEGO_SQUARE*NUM_HOLE_D]);
        }
        // 壁上側
        translate([0, 0, WALL_THICK])
        linear_extrude(height=MOUNTER_HANDLE_H/2){
            square([LEGO_SQUARE*NUM_HOLE_W, TOP_THICK]);
        }
        // 壁下側
        translate([0, LEGO_SQUARE*NUM_HOLE_D-BOTTOM_THICK, WALL_THICK])
        linear_extrude(height=MOUNTER_HANDLE_H/2){
            square([LEGO_SQUARE*NUM_HOLE_W, BOTTOM_THICK]);
        }

        // 壁右側
        translate([0, 0, WALL_THICK])
        linear_extrude(height=MOUNTER_HANDLE_H/2){
            square([SIDE_THICK, LEGO_SQUARE*NUM_HOLE_D]);
        }
        // 壁左側
        translate([LEGO_SQUARE*NUM_HOLE_W-SIDE_THICK, 0, WALL_THICK])
        linear_extrude(height=MOUNTER_HANDLE_H/2){
            square([SIDE_THICK, LEGO_SQUARE*NUM_HOLE_D]);
        }


        // アーム右上
        translate([ARM_OFFSET_W, 0, WALL_THICK])
        linear_extrude(height=MOUNTER_HANDLE_H/2){
            square([MOUNTER_HANDLE_W, MOUNTER_HANDLE_D2]);
        }
        // アーム左上
        translate([ARM_OFFSET_W+ARM_DISTANCE+MOUNTER_HANDLE_W, 0, WALL_THICK])
        linear_extrude(height=MOUNTER_HANDLE_H/2){
            square([MOUNTER_HANDLE_W, MOUNTER_HANDLE_D2]);
        }

        // アーム右下
        translate([ARM_OFFSET_W, ARM_OFFSET_D, WALL_THICK])
        linear_extrude(height=MOUNTER_HANDLE_H/2){
            square([MOUNTER_HANDLE_W, MOUNTER_HANDLE_D]);
        }
        // アーム左下
        translate([ARM_OFFSET_W+ARM_DISTANCE+MOUNTER_HANDLE_W, ARM_OFFSET_D, WALL_THICK])
        linear_extrude(height=MOUNTER_HANDLE_H/2){
            square([MOUNTER_HANDLE_W, MOUNTER_HANDLE_D]);
        }

        // 側面
        translate([0, 0, -LEGO_BOTTOM_H])
        linear_extrude(height=LEGO_BOTTOM_H){
            square([LEGO_SQUARE*NUM_HOLE_W, LEGO_WALL]);
        }

        translate([0, LEGO_SQUARE*NUM_HOLE_D-LEGO_WALL, -LEGO_BOTTOM_H])
        linear_extrude(height=LEGO_BOTTOM_H){
            square([LEGO_SQUARE*NUM_HOLE_W, LEGO_WALL]);
        }

        translate([0, 0, -LEGO_BOTTOM_H])
        linear_extrude(height=LEGO_BOTTOM_H){
            square([LEGO_WALL, LEGO_SQUARE*NUM_HOLE_D]);
        }

        translate([LEGO_SQUARE*NUM_HOLE_W-LEGO_WALL, 0, -LEGO_BOTTOM_H])
        linear_extrude(height=LEGO_BOTTOM_H){
            square([LEGO_WALL, LEGO_SQUARE*NUM_HOLE_D]);
        }

        // 下の円柱
        for( lw = [0 : NUM_HOLE_W-2] ){
            for( ld = [0 : NUM_HOLE_D-2] ){
                translate([LEGO_SQUARE*(lw+1), LEGO_SQUARE*(ld+1), -LEGO_BOTTOM_H])
                linear_extrude(height=LEGO_BOTTOM_H){
                    circle(LEGO_BOTTOM_CIRCLE/2, $fn=50);
                }
            }
        }

    }
    union(){
        // 大きな円の穴
        translate([ARM_OFFSET_W+MOUNTER_HANDLE_W+LARGE_CIRCLE/2, 0, WALL_THICK+MOUNTER_HANDLE_H/2])
        rotate([-90, 0, 0])
        linear_extrude(height=TOP_THICK){
            circle(LARGE_CIRCLE/2, $fn=50);
        }        
        // 小さな円の穴
        translate([ARM_OFFSET_W+MOUNTER_HANDLE_W+LARGE_CIRCLE, 0, WALL_THICK+MOUNTER_HANDLE_H/2])
        rotate([-90, 0, 0])
        linear_extrude(height=TOP_THICK){
            circle(SMALL_CIRCLE/2, $fn=50);
        }        
        // ケーブル穴
        translate([0, ARM_OFFSET_D+MOUNTER_HANDLE_D, WALL_THICK+MOUNTER_HANDLE_H/2-CABLE_W/2])
        linear_extrude(height=CABLE_W){
            square([MOUNTER_HANDLE_H, CABLE_D]);
        }
    }
}

・OpenSCADの画面

1-2. ブロック上側のサーボモーター固定パーツ
// LEGOの1ブロック
LEGO_SQUARE=7.95;

// プレートのサイズ(ブロック単位)
NUM_HOLE_W=5;
NUM_HOLE_D=4;
// 壁の厚さ
WALL_THICK=1;
// 左右の壁の厚さ
SIDE_THICK=3.5;
// 上側の厚み
TOP_THICK=4;
// 下側の厚み
BOTTOM_THICK=4;

// サーボ固定アーム下
MOUNTER_HANDLE_D=8;
MOUNTER_HANDLE_H=12.2;
MOUNTER_HANDLE_W=5.15;
// サーボ固定アーム上
MOUNTER_HANDLE_D2=8.4;

// サーボ固定アームオフセット
ARM_OFFSET_D=11.4;
ARM_OFFSET_W=7.0/2;

// サーボ固定アーム間距離
ARM_DISTANCE=22.5;

// サーボモーターの円形部分
LARGE_CIRCLE=11.7+0.2;
SMALL_CIRCLE=5.6+0.2;

// ケーブル用の穴
CABLE_D=2.5;
CABLE_W=6;

module lego_servo_case(){
    difference(){
        union(){
            // ベース
            translate([0, 0, 0])
            linear_extrude(height=WALL_THICK){
                square([LEGO_SQUARE*NUM_HOLE_W, LEGO_SQUARE*NUM_HOLE_D]);
            }
            // 壁上側
            translate([0, 0, WALL_THICK])
            linear_extrude(height=MOUNTER_HANDLE_H/2){
                square([LEGO_SQUARE*NUM_HOLE_W, TOP_THICK]);
            }
            // 壁下側
            translate([0, LEGO_SQUARE*NUM_HOLE_D-BOTTOM_THICK, WALL_THICK])
            linear_extrude(height=MOUNTER_HANDLE_H/2){
                square([LEGO_SQUARE*NUM_HOLE_W, BOTTOM_THICK]);
            }

            // 壁右側
            translate([0, 0, WALL_THICK])
            linear_extrude(height=MOUNTER_HANDLE_H/2){
                square([SIDE_THICK, LEGO_SQUARE*NUM_HOLE_D]);
            }
            // 壁左側
            translate([LEGO_SQUARE*NUM_HOLE_W-SIDE_THICK, 0, WALL_THICK])
            linear_extrude(height=MOUNTER_HANDLE_H/2){
                square([SIDE_THICK, LEGO_SQUARE*NUM_HOLE_D]);
            }


            // アーム右上
            translate([ARM_OFFSET_W, 0, WALL_THICK])
            linear_extrude(height=MOUNTER_HANDLE_H/2){
                square([MOUNTER_HANDLE_W, MOUNTER_HANDLE_D2]);
            }
            // アーム左上
            translate([ARM_OFFSET_W+ARM_DISTANCE+MOUNTER_HANDLE_W, 0, WALL_THICK])
            linear_extrude(height=MOUNTER_HANDLE_H/2){
                square([MOUNTER_HANDLE_W, MOUNTER_HANDLE_D2]);
            }

            // アーム右下
            translate([ARM_OFFSET_W, ARM_OFFSET_D, WALL_THICK])
            linear_extrude(height=MOUNTER_HANDLE_H/2){
                square([MOUNTER_HANDLE_W, MOUNTER_HANDLE_D]);
            }
            // アーム左下
            translate([ARM_OFFSET_W+ARM_DISTANCE+MOUNTER_HANDLE_W, ARM_OFFSET_D, WALL_THICK])
            linear_extrude(height=MOUNTER_HANDLE_H/2){
                square([MOUNTER_HANDLE_W, MOUNTER_HANDLE_D]);
            }

        }
        union(){
            // 大きな円の穴
            translate([ARM_OFFSET_W+MOUNTER_HANDLE_W+LARGE_CIRCLE/2, 0, WALL_THICK+MOUNTER_HANDLE_H/2])
            rotate([-90, 0, 0])
            linear_extrude(height=TOP_THICK){
                circle(LARGE_CIRCLE/2, $fn=50);
            }        
            // 小さな円の穴
            translate([ARM_OFFSET_W+MOUNTER_HANDLE_W+LARGE_CIRCLE, 0, WALL_THICK+MOUNTER_HANDLE_H/2])
            rotate([-90, 0, 0])
            linear_extrude(height=TOP_THICK){
                circle(SMALL_CIRCLE/2, $fn=50);
            }        
            // ケーブル穴
            translate([0, ARM_OFFSET_D+MOUNTER_HANDLE_D, WALL_THICK+MOUNTER_HANDLE_H/2-CABLE_W/2])
            linear_extrude(height=CABLE_W){
                square([MOUNTER_HANDLE_H, CABLE_D]);
            }
        }
    }
}
mirror([0, 180, 0])
lego_servo_case();

・OpenSCADの画面

1-3. ブロック上側の突起部分パーツ
// プレートの厚さ
PLATE_THICK=1;

// LEGOの1ブロック
LEGO_SQUARE=7.95;
// 突起の直径
LEGO_PEG=4.9;
LEGO_PEG_R=LEGO_PEG/2;
LEGO_PEG_H=1.8;

// プレートのサイズ(ブロック単位)
NUM_HOLE_W=5;
NUM_HOLE_D=4;

translate([0, 0, 0])
linear_extrude(height=PLATE_THICK){
    square([LEGO_SQUARE*NUM_HOLE_W, LEGO_SQUARE*NUM_HOLE_D]);
}

for( lw = [0 : NUM_HOLE_W-1] ){
    for( ld = [0 : NUM_HOLE_D-1] ){
        translate([LEGO_SQUARE*lw+LEGO_SQUARE/2, LEGO_SQUARE*ld+LEGO_SQUARE/2, PLATE_THICK])
        linear_extrude(height=LEGO_PEG_H){
            circle(LEGO_PEG_R, $fn=50);
        }
    }
}

・OpenSCADの画面

2. Ultimaker CuraでSTLファイルを読み込み、スライスしてgcodeを保存します。

3. 3Dプリンターで印刷します

4. 1-2で作成した「ブロック上側のサーボモーター固定パーツ」と1-3で作成した「ブロック上側の突起部分パーツ」部分をタミヤセメントなどの接着剤で接着します。
そのあと、サーボモーターの上側と下側にパーツをはめ込みます。

関連情報

OpenSCADまとめ

OpenSCADとUltimaker Curaを使用して、LEGO Technic互換の穴とSG90ギアに対応する穴がついたアームを作る


OpenSCADとUltimaker Curaを使用して、LEGO互換の突起がついたサーボモーター固定台を作る
※こちらは、サーボモーターをブロックで囲むのではなく、そのまま固定する部品です。

2021年8月17日火曜日

OpenSCADとUltimaker Curaを使用して、micro:bitをLEGOブロック上に縦置きできるホルダーを作成する

OpenSCADとUltimaker Curaを使用して、micro:bitをLEGOブロック上に縦置きできるホルダーを作成するには以下の手順を実行します。

〇micro:bitをLEGOブロック上に縦置きできるホルダーの写真
白い部分が3Dプリンターで作成したmicro:bitを縦置きできるホルダーです。そのほかは純正のLEGOブロックです。ホルダーの上下にLEGO互換の突起・穴がついています。
ブロックの中央に溝がついているので、そこにmicro:bitを差し込みます。

作成手順

1. OpenSCADで以下のコードを実行して形状を調整し、STLファイルにエクスポートします。
3Dプリンタの種類や設定によって、パラメータを微調整してください。

// プレートの厚さ
PLATE_THICK=7;

// LEGOの1ブロック
LEGO_SQUARE=7.95;
// 突起の直径
LEGO_PEG=4.9;
LEGO_PEG_R=LEGO_PEG/2;
LEGO_PEG_H=1.8;
// LEGOの側面の厚さ
LEGO_WALL=1.5;
// LEGOの底面の円の直径
LEGO_BOTTOM_CIRCLE=6.4;
// 底の側面の高さ
LEGO_BOTTOM_H=2.6;

// プレートのサイズ(ブロック単位)
NUM_HOLE_W=8;
NUM_HOLE_D=2;

// 柱の高さ
PILLAR_H=38.5;

// レールの厚さ
RAIL_THICK=2.2;
RAIL_DEPTH=3;

difference(){
    union(){
        // 上面プレート
        translate([0, 0, 0])
        linear_extrude(height=PLATE_THICK){
            square([LEGO_SQUARE*NUM_HOLE_W, LEGO_SQUARE*NUM_HOLE_D]);
        }

        // 左側柱
        translate([0, 0, PLATE_THICK])
        linear_extrude(height=PILLAR_H){
            square([LEGO_SQUARE, LEGO_SQUARE*NUM_HOLE_D]);
        }
        // 左側突起
        for( ld = [0 : NUM_HOLE_D-1] ){
            translate([LEGO_SQUARE/2, LEGO_SQUARE*ld+LEGO_SQUARE/2, PLATE_THICK+PILLAR_H])
            linear_extrude(height=LEGO_PEG_H){
                circle(LEGO_PEG_R, $fn=50);
            }
        }

        // 右側柱
        translate([LEGO_SQUARE*(NUM_HOLE_W-1), 0, PLATE_THICK])
        linear_extrude(height=PILLAR_H){
            square([LEGO_SQUARE, LEGO_SQUARE*NUM_HOLE_D]);
        }

        // 右側突起
        for( ld = [0 : NUM_HOLE_D-1] ){
            translate([LEGO_SQUARE*(NUM_HOLE_W-1)+LEGO_SQUARE/2, LEGO_SQUARE*ld+LEGO_SQUARE/2, PLATE_THICK+PILLAR_H])
            linear_extrude(height=LEGO_PEG_H){
                circle(LEGO_PEG_R, $fn=50);
            }
        }

        // 側面
        translate([0, 0, -LEGO_BOTTOM_H])
        linear_extrude(height=LEGO_BOTTOM_H){
            square([LEGO_SQUARE*NUM_HOLE_W, LEGO_WALL]);
        }

        translate([0, LEGO_SQUARE*NUM_HOLE_D-LEGO_WALL, -LEGO_BOTTOM_H])
        linear_extrude(height=LEGO_BOTTOM_H){
            square([LEGO_SQUARE*NUM_HOLE_W, LEGO_WALL]);
        }

        translate([0, 0, -LEGO_BOTTOM_H])
        linear_extrude(height=LEGO_BOTTOM_H){
            square([LEGO_WALL, LEGO_SQUARE*NUM_HOLE_D]);
        }

        translate([LEGO_SQUARE*NUM_HOLE_W-LEGO_WALL, 0, -LEGO_BOTTOM_H])
        linear_extrude(height=LEGO_BOTTOM_H){
            square([LEGO_WALL, LEGO_SQUARE*NUM_HOLE_D]);
        }

        // 下の円柱
        for( lw = [0 : NUM_HOLE_W-2] ){
            for( ld = [0 : NUM_HOLE_D-2] ){
                translate([LEGO_SQUARE*(lw+1), LEGO_SQUARE*(ld+1), -LEGO_BOTTOM_H])
                linear_extrude(height=LEGO_BOTTOM_H){
                    circle(LEGO_BOTTOM_CIRCLE/2, $fn=50);
                }
            }
        }
    }
    translate([LEGO_SQUARE-RAIL_DEPTH, LEGO_SQUARE-RAIL_THICK/2, PLATE_THICK-RAIL_DEPTH])
    linear_extrude(height=PILLAR_H+RAIL_DEPTH){
        square([LEGO_SQUARE*(NUM_HOLE_W-2)+RAIL_DEPTH*2, RAIL_THICK]);
    }
}

・OpenSCADの画面

2. Ultimaker CuraでSTLファイルを読み込み、スライスしてgcodeを保存します。

3. 3Dプリンターで印刷します

関連情報

OpenSCADまとめ

OpenSCADとUltimaker Curaを使用してRaspberry Pi Picoのケースを作成する

2021年8月14日土曜日

OpenSCADとUltimaker Curaを使用して、Raspberry Pi PicoをLEGOブロック上に固定できるマウンタを作成する

OpenSCADとUltimaker Curaを使用して、Raspberry Pi PicoをLEGOブロック上に固定できるマウンタを作成するには以下の手順を実行します。

〇Raspberry Pi PicoをLEGOブロック上に固定できるマウンタの写真1
マウンタとRaspberry Pi PicoはM2のネジで固定しています。

〇Raspberry Pi PicoをLEGOブロック上に固定できるマウンタの写真2
Raspberry Pi Picoを固定していない状態です。

作成手順

1. OpenSCADで以下のコードを実行して形状を調整し、STLファイルにエクスポートします。
3Dプリンタの種類や設定によって、LEG_HOLE_DIAMETERで穴の半径のパラメータを微調整してください。

// Raspberry Pi Picoのベースサイズ
PICO_W=51;
PICO_D=22;

// Raspberry Pi Picoを支える足の部分
LEG_HEIGHT=4;
LEG_DISTANCE=8.2;
LEG_SIZE=4;
LEG_HOLE_DIAMETER=1.5+0.5;

// Raspberry Pi Pico固定用足のオフセット
LEG_OFFSET_W=1;
LEG_OFFSET_D=0.8;

// プレートの厚さ
PLATE_THICK=2;

// LEGOの1ブロック
LEGO_SQUARE=7.95;
// LEGOの側面の厚さ
LEGO_WALL=1.5;
// 突起の直径
LEGO_PEG=4.8;
LEGO_PEG_R=LEGO_PEG/2;
LEGO_PEG_H=2.8;
// LEGOの底面の円の直径
LEGO_BOTTOM_CIRCLE=6.4;

// プレートのサイズ(ブロック単位)
NUM_HOLE_W=7;
NUM_HOLE_D=3;

module pico_mounter_lego()
{
    // ベースプレート
    translate([0, 0, 0])
    linear_extrude(height=PLATE_THICK){
        square([LEGO_SQUARE*NUM_HOLE_W, LEGO_SQUARE*NUM_HOLE_D]);
    }

    //壁
    translate([0, 0, -LEGO_PEG_H])
    linear_extrude(height=LEGO_PEG_H){
        square([LEGO_SQUARE*NUM_HOLE_W, LEGO_WALL]);
    }

    translate([0, LEGO_SQUARE*NUM_HOLE_D-LEGO_WALL, -LEGO_PEG_H])
    linear_extrude(height=LEGO_PEG_H){
        square([LEGO_SQUARE*NUM_HOLE_W, LEGO_WALL]);
    }

    translate([0, 0, -LEGO_PEG_H])
    linear_extrude(height=LEGO_PEG_H){
        square([LEGO_WALL, LEGO_SQUARE*NUM_HOLE_D]);
    }

    translate([LEGO_SQUARE*NUM_HOLE_W-LEGO_WALL, 0, -LEGO_PEG_H])
    linear_extrude(height=LEGO_PEG_H){
        square([LEGO_WALL, LEGO_SQUARE*NUM_HOLE_D]);
    }


    for( lw = [0 : NUM_HOLE_W-2] ){
        for( ld = [0 : NUM_HOLE_D-2] ){
            translate([LEGO_SQUARE*(lw+1), LEGO_SQUARE*(ld+1), -LEGO_PEG_H])
            linear_extrude(height=LEGO_PEG_H){
                circle(LEGO_BOTTOM_CIRCLE/2, $fn=50);
            }
        }
    }
}

module pico_mounter()
{
    difference(){
        union(){
            // 底面
            translate([0, 0, 0])
            linear_extrude(height=PLATE_THICK){
                square([PICO_W, PICO_D]);
            }

            translate([LEG_OFFSET_W, PICO_D/2-LEG_DISTANCE/2-LEG_SIZE, PLATE_THICK])
            linear_extrude(height=LEG_HEIGHT){
                square([LEG_SIZE, LEG_SIZE]);
            }
            translate([LEG_OFFSET_W, PICO_D/2+LEG_DISTANCE/2, PLATE_THICK])
            linear_extrude(height=LEG_HEIGHT){
                square([LEG_SIZE, LEG_SIZE]);
            }    
            translate([PICO_W-LEG_SIZE+LEG_OFFSET_W, PICO_D/2-LEG_DISTANCE/2-LEG_SIZE, PLATE_THICK])
            linear_extrude(height=LEG_HEIGHT){
                square([LEG_SIZE, LEG_SIZE]);
            }
            translate([PICO_W-LEG_SIZE+LEG_OFFSET_W, PICO_D/2+LEG_DISTANCE/2, PLATE_THICK])
            linear_extrude(height=LEG_HEIGHT){
                square([LEG_SIZE, LEG_SIZE]);
            }
        }
        union(){
            translate([LEG_SIZE/2+LEG_OFFSET_W, PICO_D/2-LEG_DISTANCE/2-LEG_SIZE/2, 0])
            linear_extrude(height=LEG_HEIGHT+PLATE_THICK){
                circle(LEG_HOLE_DIAMETER/2, $fn=50);
            }
            translate([LEG_SIZE/2+LEG_OFFSET_W, PICO_D/2+LEG_DISTANCE/2+LEG_SIZE/2, 0])
            linear_extrude(height=LEG_HEIGHT+PLATE_THICK){
                circle(LEG_HOLE_DIAMETER/2, $fn=50);
            }
            translate([PICO_W-LEG_SIZE/2+LEG_OFFSET_W, PICO_D/2-LEG_DISTANCE/2-LEG_SIZE/2, 0])
            linear_extrude(height=LEG_HEIGHT+PLATE_THICK){
                circle(LEG_HOLE_DIAMETER/2, $fn=50);
            }
            translate([PICO_W-LEG_SIZE/2+LEG_OFFSET_W, PICO_D/2+LEG_DISTANCE/2+LEG_SIZE/2, 0])
            linear_extrude(height=LEG_HEIGHT+PLATE_THICK){
                circle(LEG_HOLE_DIAMETER/2, $fn=50);
            }
        }
    }
}

pico_mounter_lego();
translate([LEG_OFFSET_W, LEG_OFFSET_D, 0])
pico_mounter();

・OpenSCADの画面

2. Ultimaker CuraでSTLファイルを読み込み、スライスしてgcodeを保存します。

3. 3Dプリンターで印刷します

関連情報

OpenSCADまとめ

OpenSCADとUltimaker Curaを使用してRaspberry Pi Picoのケースを作成する

OpenSCADとUltimaker Curaを使用して、LEGO Technic互換の穴とSG92Rギアに対応する穴がついた十字アームを作る

OpenSCADとUltimaker Curaを使用して、LEGO Technic互換の穴とSG92Rギアに対応する穴がついた十字アームを作るには以下の手順を実行します。

〇LEGO Technic互換の穴とSG92Rギアに対応する穴がついた十字アームの写真
※十字アームに付けられている灰色の部品は純正のLEGOブロックです。

作成手順

1. OpenSCADで以下のコードを実行して形状を調整し、STLファイルにエクスポートします。
・穴の半径など3Dプリンタや設定によって微調整してください。
・ギアの歯の半径サイズはSMALL_RADIUS/LARGE_RADIUSで変更できます。ギアが緩かったり、はまらなかった場合は増減して調整してください。
・アームのサイズは穴・ギアの数を表すNUM_HOLE_Wで調整できます。奇数を指定してください。

〇LEGO Technic互換の穴とSG92Rギアに対応する穴がついた十字アームのソースコード
// アームの厚さ
PLATE_THICK=4;

// LEGOの1ブロック
LEGO_SQUARE=7.95;
// 突起の直径
HOLE_MARGIN=0.5;
LEGO_HOLE=4.8+HOLE_MARGIN;
LEGO_HOLE_R=LEGO_HOLE/2;
LEGO_HOLE_H=1.8;
LEGO_HOLE_L=6.2+HOLE_MARGIN;
LEGO_HOLE_LR=LEGO_HOLE_L/2;
LEGO_HOLE_LH=0.5;

// プレートのサイズ(ブロック単位)
NUM_HOLE_W=7; // 奇数を指定してください
NUM_HOLE_D=1;

// SG92Rのギアのサイズ
SMALL_RADIUS=4.70/2;
LARGE_RADIUS=4.82/2;
NUM_POINTS=20;
GEAR_HEIGHT=3;
ANGLE = 360/NUM_POINTS/2;

module lego_servo_arm()
{
    difference()
    {
        union(){
            translate([-(LEGO_SQUARE*(NUM_HOLE_W-1))/2, -LEGO_SQUARE/2, 0])
            linear_extrude(height=PLATE_THICK){
                square([LEGO_SQUARE*(NUM_HOLE_W-1), LEGO_SQUARE*NUM_HOLE_D]);
            }
            translate([-(LEGO_SQUARE*NUM_HOLE_W)/2+LEGO_SQUARE/2, 0, 0])
            linear_extrude(height=PLATE_THICK){
                circle(LEGO_SQUARE/2, $fn=50);
            }
            translate([(LEGO_SQUARE*NUM_HOLE_W)/2-LEGO_SQUARE/2, 0, 0])
            linear_extrude(height=PLATE_THICK){
                circle(LEGO_SQUARE/2, $fn=50);
            }
        }
        union(){
            for( lw = [0 : NUM_HOLE_W-1] ){
                for( ld = [0 : NUM_HOLE_D-1] ){
                    if( floor(NUM_HOLE_W/2) != lw ){

                        translate([-(LEGO_SQUARE*NUM_HOLE_W)/2+LEGO_SQUARE*lw+LEGO_SQUARE/2, LEGO_SQUARE*ld+LEGO_SQUARE/2-LEGO_SQUARE/2, 0])
                        linear_extrude(height=PLATE_THICK){
                            circle(LEGO_HOLE_R, $fn=50);
                        }
                        translate([-(LEGO_SQUARE*NUM_HOLE_W)/2+LEGO_SQUARE*lw+LEGO_SQUARE/2, LEGO_SQUARE*ld+LEGO_SQUARE/2-LEGO_SQUARE/2, 0])
                        linear_extrude(height=LEGO_HOLE_LH){
                            circle(LEGO_HOLE_LR, $fn=50);
                        }
                        translate([-(LEGO_SQUARE*NUM_HOLE_W)/2+LEGO_SQUARE*lw+LEGO_SQUARE/2, LEGO_SQUARE*ld+LEGO_SQUARE/2-LEGO_SQUARE/2, PLATE_THICK-LEGO_HOLE_LH])
                        linear_extrude(height=LEGO_HOLE_LH){
                            circle(LEGO_HOLE_LR, $fn=50);
                        }
                    }
                }
            }

        }
    }
}
difference(){
    union(){
        lego_servo_arm();
        rotate([0, 0, 90])
        lego_servo_arm();
    }
    union()
    {
        translate([0, 0, 0])
        linear_extrude(height=PLATE_THICK){
            for( pt = [0 : NUM_POINTS-1]) {
                l_px = cos(pt*ANGLE*2)*LARGE_RADIUS;
                l_py = sin(pt*ANGLE*2)*LARGE_RADIUS;
                s_px = cos(pt*ANGLE*2+ANGLE)*SMALL_RADIUS;
                s_py = sin(pt*ANGLE*2+ANGLE)*SMALL_RADIUS;
                l_px2 = cos(pt*ANGLE*2+ANGLE*2)*LARGE_RADIUS;
                l_py2 = sin(pt*ANGLE*2+ANGLE*2)*LARGE_RADIUS;
                polygon(points=[[0, 0], [l_px, l_py], [s_px, s_py], [l_px2,  l_py2]], paths  = [[0, 1, 2, 3]]);
            }
        }
    }
}

〇OpenSCADの画面

2. Ultimaker CuraでSTLファイルを読み込み、スライスしてgcodeを保存します。

3. 3Dプリンターで印刷します

関連情報

OpenSCADまとめ

OpenSCADとUltimaker Curaを使用して、LEGOブロック上に固定できるLEDキューブを作成する

OpenSCADとUltimaker Curaを使用して、LEGO Technic互換の穴とSG92Rギアに対応する穴が端についたアームを作る

2021年8月13日金曜日

OpenSCADとUltimaker Curaを使用して、LEGO Technic互換の穴とSG92Rギアに対応する穴が中央についたアームを作る

OpenSCADとUltimaker Curaを使用して、LEGO Technic互換の穴とSG92Rサーボモータのギアに対応する穴が中央についたアームを作るには以下の手順を実行します。

〇LEGO Technic互換の穴とSG92Rギアに対応する穴が中央についたアームの写真
※ギアに対応する穴が中央に配置されています。灰色の部品は純正のLEGOブロックです。

作成手順

1. OpenSCADで以下のコードを実行して形状を調整し、STLファイルにエクスポートします。
穴の半径など3Dプリンタや設定によって微調整してください。
ギアの歯の半径サイズはSMALL_RADIUS/LARGE_RADIUSで変更できます。ギアが緩かったり、はまらなかった場合は増減して調整してください。

・LEGO Technic互換の穴とSG92Rギアに対応する穴が中央についたアームのソースコード
// アームの厚さ
PLATE_THICK=4;

// LEGOの1ブロック
LEGO_SQUARE=7.95;
// 突起の直径
HOLE_MARGIN=0.5;
LEGO_HOLE=4.8+HOLE_MARGIN;
LEGO_HOLE_R=LEGO_HOLE/2;
LEGO_HOLE_H=1.8;
LEGO_HOLE_L=6.2+HOLE_MARGIN;
LEGO_HOLE_LR=LEGO_HOLE_L/2;
LEGO_HOLE_LH=0.5;

// プレートのサイズ(ブロック単位)
NUM_HOLE_W=5; // 奇数を指定してください
NUM_HOLE_D=1;

// SG92Rのギアのサイズ
SMALL_RADIUS=4.76/2;
LARGE_RADIUS=4.86/2;
NUM_POINTS=20;
GEAR_HEIGHT=3;
ANGLE = 360/NUM_POINTS/2;

difference()
{
    union(){
        translate([-(LEGO_SQUARE*(NUM_HOLE_W-1))/2, 0, 0])
        linear_extrude(height=PLATE_THICK){
            square([LEGO_SQUARE*(NUM_HOLE_W-1), LEGO_SQUARE*NUM_HOLE_D]);
        }
        translate([-(LEGO_SQUARE*NUM_HOLE_W)/2+LEGO_SQUARE/2, LEGO_SQUARE/2, 0])
        linear_extrude(height=PLATE_THICK){
            circle(LEGO_SQUARE/2, $fn=50);
        }
        translate([(LEGO_SQUARE*NUM_HOLE_W)/2-LEGO_SQUARE/2, LEGO_SQUARE/2, 0])
        linear_extrude(height=PLATE_THICK){
            circle(LEGO_SQUARE/2, $fn=50);
        }
    }
    union(){
        for( lw = [0 : NUM_HOLE_W-1] ){
            for( ld = [0 : NUM_HOLE_D-1] ){
                if( floor(NUM_HOLE_W/2) != lw ){

                    translate([-(LEGO_SQUARE*NUM_HOLE_W)/2+LEGO_SQUARE*lw+LEGO_SQUARE/2, LEGO_SQUARE*ld+LEGO_SQUARE/2, 0])
                    linear_extrude(height=PLATE_THICK){
                        circle(LEGO_HOLE_R, $fn=50);
                    }
                    translate([-(LEGO_SQUARE*NUM_HOLE_W)/2+LEGO_SQUARE*lw+LEGO_SQUARE/2, LEGO_SQUARE*ld+LEGO_SQUARE/2, 0])
                    linear_extrude(height=LEGO_HOLE_LH){
                        circle(LEGO_HOLE_LR, $fn=50);
                    }
                    translate([-(LEGO_SQUARE*NUM_HOLE_W)/2+LEGO_SQUARE*lw+LEGO_SQUARE/2, LEGO_SQUARE*ld+LEGO_SQUARE/2, PLATE_THICK-LEGO_HOLE_LH])
                    linear_extrude(height=LEGO_HOLE_LH){
                        circle(LEGO_HOLE_LR, $fn=50);
                    }
                }
            }
        }

        translate([0, LEGO_SQUARE/2, 0])
        linear_extrude(height=PLATE_THICK){
            for( pt = [0 : NUM_POINTS-1]) {
                l_px = cos(pt*ANGLE*2)*LARGE_RADIUS;
                l_py = sin(pt*ANGLE*2)*LARGE_RADIUS;
                s_px = cos(pt*ANGLE*2+ANGLE)*SMALL_RADIUS;
                s_py = sin(pt*ANGLE*2+ANGLE)*SMALL_RADIUS;
                l_px2 = cos(pt*ANGLE*2+ANGLE*2)*LARGE_RADIUS;
                l_py2 = sin(pt*ANGLE*2+ANGLE*2)*LARGE_RADIUS;
                polygon(points=[[0, 0], [l_px, l_py], [s_px, s_py], [l_px2,  l_py2]], paths  = [[0, 1, 2, 3]]);
            }
        }

    }
}

・OpenSCADの画面

2. Ultimaker CuraでSTLファイルを読み込み、スライスしてgcodeを保存します。

3. 3Dプリンターで印刷します

関連情報

OpenSCADまとめ

OpenSCADとUltimaker Curaを使用して、LEGOブロック上に固定できるLEDキューブを作成する

OpenSCADとUltimaker Curaを使用して、LEGO互換の凹みがついたサーボモーター固定台を作る

OpenSCADとUltimaker Curaを使用して、LEGO Technic互換の穴とSG92Rギアに対応する穴が端についたアームを作る

OpenSCADとUltimaker Curaを使用して、LEGO Technic互換の穴とSG92Rギアに対応する穴が端についたアームを作るには以下の手順を実行します。

〇LEGO Technic互換の穴とSG92Rギアに対応する穴が端についたアームの写真
※白色のアームが今回作った物、灰色の部品は純正のLEGOブロックです。片方の端の穴がSG92Rギアに対応する穴になっています。

作成手順

1. OpenSCADで以下のコードを実行して形状を調整し、STLファイルにエクスポートします。
穴の半径など3Dプリンタや設定によって微調整してください。
ギアの歯の半径サイズはSMALL_RADIUS/LARGE_RADIUSで変更できます。ギアが緩かったり、はまらなかった場合は増減して調整してください。

・LEGO Technic互換の穴とSG92Rギアに対応する穴がついたアームのソースコード
// アームの厚さ
PLATE_THICK=4;

// LEGOの1ブロック
LEGO_SQUARE=7.95;
// 突起の直径
HOLE_MARGIN=0.5;
LEGO_HOLE=4.8+HOLE_MARGIN;
LEGO_HOLE_R=LEGO_HOLE/2;
LEGO_HOLE_H=1.8;
LEGO_HOLE_L=6.2+HOLE_MARGIN;
LEGO_HOLE_LR=LEGO_HOLE_L/2;
LEGO_HOLE_LH=0.5;

// プレートのサイズ(ブロック単位)
NUM_HOLE_W=4;
NUM_HOLE_D=1;

// SG92Rのギアのサイズ
SMALL_RADIUS=4.76/2;
LARGE_RADIUS=4.86/2;
NUM_POINTS=20;
GEAR_HEIGHT=3;
ANGLE = 360/NUM_POINTS/2;

difference()
{
    union(){
        translate([-LEGO_SQUARE/2, 0, 0])
        linear_extrude(height=PLATE_THICK){
            square([LEGO_SQUARE*NUM_HOLE_W, LEGO_SQUARE*NUM_HOLE_D]);
        }
        translate([LEGO_SQUARE*NUM_HOLE_W-LEGO_SQUARE/2, LEGO_SQUARE/2, 0])
        linear_extrude(height=PLATE_THICK){
            circle(LEGO_SQUARE/2, $fn=50);
        }
        translate([-LEGO_SQUARE/2, LEGO_SQUARE/2, 0])
        linear_extrude(height=PLATE_THICK){
            circle(LEGO_SQUARE/2, $fn=50);
        }
    }
    union(){
        for( lw = [0 : NUM_HOLE_W-1] ){
            for( ld = [0 : NUM_HOLE_D-1] ){
                translate([LEGO_SQUARE*lw+LEGO_SQUARE/2, LEGO_SQUARE*ld+LEGO_SQUARE/2, 0])
                linear_extrude(height=PLATE_THICK){
                    circle(LEGO_HOLE_R, $fn=50);
                }
                translate([LEGO_SQUARE*lw+LEGO_SQUARE/2, LEGO_SQUARE*ld+LEGO_SQUARE/2, 0])
                linear_extrude(height=LEGO_HOLE_LH){
                    circle(LEGO_HOLE_LR, $fn=50);
                }
                translate([LEGO_SQUARE*lw+LEGO_SQUARE/2, LEGO_SQUARE*ld+LEGO_SQUARE/2, PLATE_THICK-LEGO_HOLE_LH])
                linear_extrude(height=LEGO_HOLE_LH){
                    circle(LEGO_HOLE_LR, $fn=50);
                }

            }
        }

        translate([-LEGO_SQUARE/2, LEGO_SQUARE/2, 0])
        linear_extrude(height=PLATE_THICK){
            for( pt = [0 : NUM_POINTS-1]) {
                l_px = cos(pt*ANGLE*2)*LARGE_RADIUS;
                l_py = sin(pt*ANGLE*2)*LARGE_RADIUS;
                s_px = cos(pt*ANGLE*2+ANGLE)*SMALL_RADIUS;
                s_py = sin(pt*ANGLE*2+ANGLE)*SMALL_RADIUS;
                l_px2 = cos(pt*ANGLE*2+ANGLE*2)*LARGE_RADIUS;
                l_py2 = sin(pt*ANGLE*2+ANGLE*2)*LARGE_RADIUS;
                polygon(points=[[0, 0], [l_px, l_py], [s_px, s_py], [l_px2,  l_py2]], paths  = [[0, 1, 2, 3]]);
            }
        }

    }
}

・OpenSCADの画面

2. Ultimaker CuraでSTLファイルを読み込み、スライスしてgcodeを保存します。

3. 3Dプリンターで印刷します

関連情報

OpenSCADまとめ

OpenSCADとUltimaker Curaを使用して、LEGO Technic互換の穴とSG92Rギアに対応する穴がついた十字アームを作る
OpenSCADとUltimaker Curaを使用して、LEGO互換の凹みがついたサーボモーター固定台を作る

OpenSCADとUltimaker Curaを使用して、LEGO互換の垂直方向サーボモーター固定台を作る

OpenSCADとUltimaker Curaを使用して、LEGO互換の垂直方向サーボモーター固定台を作るには以下の手順を実行します。

〇LEGO互換の垂直方向サーボモーター固定台の写真
※白色の垂直方向サーボモーター固定台が今回作った物、黒色のプレート・赤ブロックは純正のLEGOブロックです。

作成手順

1. OpenSCADで以下のコードを実行して形状を調整し、STLファイルにエクスポートします。
穴の半径など3Dプリンタや設定によって微調整してください。

・LEGO互換の垂直方向サーボモーター固定台の上位部分
// サーボモーター固定台
MOUNTER_THICK=2;
MOUNTER_BOTTOM_THICK=1;
BOX_W=7.95*5;
BOX_H=7.95*2;
SERVO_BOTTOM=7;

// アーム部分
MOUNTER_W=23;
MOUNTER_D=9;
HOLE_RADIUS=0.6;
HANDLE_W = 5;
HANDLE_H=12.2;

module lego_vert_mounter()
{
    difference()
    {
        union()
        {

            translate([-HANDLE_W, 0, 0])
            linear_extrude(height=MOUNTER_THICK){
                square([MOUNTER_W+HANDLE_W*2, MOUNTER_D]);
            }
            translate([-HANDLE_W, 0, MOUNTER_THICK])
            linear_extrude(height=HANDLE_H){
                square([HANDLE_W, MOUNTER_D]);
            }
            translate([MOUNTER_W, 0, MOUNTER_THICK])
            linear_extrude(height=HANDLE_H){
                square([HANDLE_W, MOUNTER_D]);
            }

        }
        // サーボモーター固定用穴
        rotate([-90,0,0])
        translate([-HANDLE_W/2, -MOUNTER_THICK-HANDLE_H/2, 0])
        linear_extrude(height=MOUNTER_D){
            circle(HOLE_RADIUS, $fn=50);
        }

        rotate([-90,0,0])
        translate([MOUNTER_W+HANDLE_W/2, -MOUNTER_THICK-HANDLE_H/2, 0])
        linear_extrude(height=MOUNTER_D){
            circle(HOLE_RADIUS, $fn=50);
        }

    }   

    // servo motor直下
    translate([-HANDLE_W, MOUNTER_D, 0])
    linear_extrude(height=MOUNTER_THICK){
        square([BOX_W, SERVO_BOTTOM]);
    }
    translate([-HANDLE_W, MOUNTER_D+SERVO_BOTTOM, 0])
        linear_extrude(height=BOX_H){
            square([BOX_W, MOUNTER_BOTTOM_THICK]);
    }

}
lego_vert_mounter();

・OpenSCADの画面(上位部分)

・LEGO互換の垂直方向サーボモーター固定台の下位部分
// プレートの厚さ
PLATE_THICK=1;

// LEGOの1ブロック
LEGO_SQUARE=7.95;
// LEGOの側面の厚さ
LEGO_WALL=1.5;
// 突起の直径
LEGO_PEG=4.8;
LEGO_PEG_R=LEGO_PEG/2;
LEGO_PEG_H=1.8;
// LEGOの底面の円の直径
LEGO_BOTTOM_CIRCLE=6.4;

// プレートのサイズ(ブロック単位)
NUM_HOLE_W=5;
NUM_HOLE_D=2;

translate([0, 0, 0])
linear_extrude(height=PLATE_THICK){
    square([LEGO_SQUARE*NUM_HOLE_W, LEGO_SQUARE*NUM_HOLE_D]);
}

translate([0, 0, PLATE_THICK])
linear_extrude(height=LEGO_PEG_H){
    square([LEGO_SQUARE*NUM_HOLE_W, LEGO_WALL]);
}

translate([0, LEGO_SQUARE*NUM_HOLE_D-LEGO_WALL, PLATE_THICK])
linear_extrude(height=LEGO_PEG_H){
    square([LEGO_SQUARE*NUM_HOLE_W, LEGO_WALL]);
}

translate([0, 0, PLATE_THICK])
linear_extrude(height=LEGO_PEG_H){
    square([LEGO_WALL, LEGO_SQUARE*NUM_HOLE_D]);
}

translate([LEGO_SQUARE*NUM_HOLE_W-LEGO_WALL, 0, PLATE_THICK])
linear_extrude(height=LEGO_PEG_H){
    square([LEGO_WALL, LEGO_SQUARE*NUM_HOLE_D]);
}


for( lw = [0 : NUM_HOLE_W-2] ){
    for( ld = [0 : NUM_HOLE_D-2] ){
        translate([LEGO_SQUARE*(lw+1), LEGO_SQUARE*(ld+1), PLATE_THICK])
        linear_extrude(height=LEGO_PEG_H){
            circle(LEGO_BOTTOM_CIRCLE/2, $fn=50);
        }
    }
}

・OpenSCADの画面(下位部分)

2. Ultimaker CuraでSTLファイルを読み込み、スライスしてgcodeを保存します。

3. 3Dプリンターで印刷します
固定台と突起部分の2つのパーツを印刷します。

4. タミヤセメントなどの接着剤で上位部分と下位部分を接着します。クリップなどで固定するとより強固に接着できます。

関連情報

OpenSCADまとめ

OpenSCADとUltimaker Curaを使用して、LEGO Technic互換の穴とSG90ギアに対応する穴がついた十字アームを作る

OpenSCADとUltimaker Curaを使用して、LEGOブロック上に固定できるLEDキューブを作成する