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互換の突起がついたサーボモーター固定台を作る
※こちらは、サーボモーターをブロックで囲むのではなく、そのまま固定する部品です。

0 件のコメント:

コメントを投稿