2020年9月30日水曜日

OpenSCADとUltimaker Curaを使用して2x4の断面が長いほうの面に穴を開ける治具を作成する

2x4規格の木材に、正確な位置でキリやドリルで穴をあけるための治具を3Dプリンタで作成します。
OpenSCADとUltimaker Curaを使用して、2x4の断面が長いほうの面に穴を開ける治具を作成するには以下の手順を実行します。
穴は中心と左右3cm離れた位置の3つの穴を作ります。

〇2x4規格の木材に治具をつけたところ(穴の大きさを変更した2つの治具)

作成手順

1. OpenSCADで以下のコードを実行して形状を調整し、STLファイルにエクスポートします。

・治具のOpenSCADコード
※JIG_HANDLE_Rで穴の半径を変えることができ、JIG_HOLE_DISTANCEで中心から左右の穴の距離を指定します。
JIG_BODY_W=89;
JIG_BODY_H=10;
JIG_HANDLE_W=10;
JIG_HANDLE_D=10;
JIG_HANDLE_H=30;
JIG_W = JIG_BODY_W + JIG_HANDLE_W*2;
JIG_HOLE_R=2;
JIG_HOLE_DISTANCE=30;
// プリンタの最大サイズに収まるようにするために回転
rotate(45){
difference(){
    union(){
        translate([-JIG_BODY_W/2, -JIG_HANDLE_D/2, 0])
        linear_extrude(height=JIG_BODY_H){
            square([JIG_BODY_W, JIG_HANDLE_D]);
        }
        translate([-JIG_W/2, -JIG_HANDLE_D/2, 0])
        linear_extrude(height=JIG_HANDLE_H){
            square([JIG_HANDLE_W, JIG_HANDLE_D]);
        }
        translate([JIG_BODY_W/2, -JIG_HANDLE_D/2, 0])
        linear_extrude(height=JIG_HANDLE_H){
            square([JIG_HANDLE_W, JIG_HANDLE_D]);
        }
    }
    union(){
        translate([0, 0, 0])
        linear_extrude(height=JIG_BODY_H){
            circle(JIG_HOLE_R, $fn=100);
        }
        translate([JIG_HOLE_DISTANCE, 0, 0])
        linear_extrude(height=JIG_BODY_H){
            circle(JIG_HOLE_R, $fn=100);
        }
        translate([-JIG_HOLE_DISTANCE, 0, 0])
        linear_extrude(height=JIG_BODY_H){
            circle(JIG_HOLE_R, $fn=100);
        }
    }
}
}

・OpenSCADの画面

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

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

関連情報

・そのほかの3Dプリンターを活用した記事は以下を参照してください。
OpenSCADまとめ

2020年9月29日火曜日

OpenSCADとUltimaker Curaを使用して2x4の断面が長いほうの面の中心にしるしを付ける治具を作成する

OpenSCADとUltimaker Curaを使用して、2x4の断面が長いほうの面の中心にしるしを付ける治具を作成するには以下の手順を実行します。
2x4規格の木材は、比較的柔らかい材質で出来ているので、治具を押し付けると中央に窪みがつきます。

〇2x4規格の木材に治具をつけたところ

〇治具にできた窪み

作成手順

1. OpenSCADで以下のコードを実行して形状を調整し、STLファイルにエクスポートします。

・治具のOpenSCADコード
※JIG_HANDLE_Hを小さくすれば1x4にも対応できます。
JIG_BODY_W=89;
JIG_BODY_H=10;
JIG_HANDLE_W=10;
JIG_HANDLE_D=10;
JIG_HANDLE_H=30;
JIG_W = JIG_BODY_W + JIG_HANDLE_W*2;
JIG_CONE_R=3;
JIG_CONE_H=4;
// プリンタの最大サイズに収まるようにするために回転
rotate(45){
translate([-JIG_BODY_W/2, -JIG_HANDLE_D/2, 0])
linear_extrude(height=JIG_BODY_H){
    square([JIG_BODY_W, JIG_HANDLE_D]);
}
translate([-JIG_W/2, -JIG_HANDLE_D/2, 0])
linear_extrude(height=JIG_HANDLE_H){
    square([JIG_HANDLE_W, JIG_HANDLE_D]);
}
translate([JIG_BODY_W/2, -JIG_HANDLE_D/2, 0])
linear_extrude(height=JIG_HANDLE_H){
    square([JIG_HANDLE_W, JIG_HANDLE_D]);
}
translate([0, 0, JIG_BODY_H])
cylinder(h=JIG_CONE_H, r1=JIG_CONE_R, r2=0, center=true, $fn=100);
}

・OpenSCADの画面

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

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

関連情報

・そのほかの3Dプリンターを活用した記事は以下を参照してください。
OpenSCADまとめ

2020年9月28日月曜日

OpenSCADとUltimaker Curaを使用してGrove Sound Sensorのケースを作成する

OpenSCADとUltimaker Curaを使用して、Grove Sound Sensorのケースを作成するには以下の手順を実行します。

〇Grove Sound Sensorのケース/フタ
フタの部分にはGroveコネクタ用の穴と音センサー用の穴があります。ケースは温度センサーとサイズが同じなので流用します。

〇ケースにGrove Sound Sensorを収納した状態

作成手順

1. OpenSCADで以下のコードを実行して形状を調整し、STLファイルにエクスポートします。

・ケース部分のOpenSCADコード
ケースは温度センサーのコードを使用します。
// Grove Temperature Sensor
WALL_MARGIN=0.4;
GROVE_TEMP_SENSOR_W=20;
GROVE_TEMP_SENSOR_D=20+WALL_MARGIN;
GROVE_TEMP_SENSOR_SPACE_RADIUS=2;
GROVE_TEMP_SENSOR_HOLE_RADIUS=1.2; // 1.5
GROVE_TEMP_SENSOR_H=10;

SHELL_THICK=2;

module grove_temp_sensor()
{
    difference()
    {
        union()
        {
            translate([-GROVE_TEMP_SENSOR_SPACE_RADIUS, 0, 0])
            linear_extrude(height=SHELL_THICK){
                square([GROVE_TEMP_SENSOR_W+GROVE_TEMP_SENSOR_SPACE_RADIUS*2, GROVE_TEMP_SENSOR_D]);
            }

            // left wall
            translate([-GROVE_TEMP_SENSOR_SPACE_RADIUS-SHELL_THICK, -SHELL_THICK, 0])
            linear_extrude(height=GROVE_TEMP_SENSOR_H-SHELL_THICK){
                square([SHELL_THICK, GROVE_TEMP_SENSOR_D+SHELL_THICK*2]);
            }

            // right wall
            translate([GROVE_TEMP_SENSOR_W+GROVE_TEMP_SENSOR_SPACE_RADIUS, -SHELL_THICK, 0])
            linear_extrude(height=GROVE_TEMP_SENSOR_H-SHELL_THICK){
                square([SHELL_THICK, GROVE_TEMP_SENSOR_D+SHELL_THICK*2]);
            }

            // top wall
            translate([-GROVE_TEMP_SENSOR_SPACE_RADIUS, GROVE_TEMP_SENSOR_D, 0])
            linear_extrude(height=GROVE_TEMP_SENSOR_H-SHELL_THICK){
                square([GROVE_TEMP_SENSOR_D+GROVE_TEMP_SENSOR_SPACE_RADIUS*2, SHELL_THICK]);
            }

            // bottom wall
            translate([-GROVE_TEMP_SENSOR_SPACE_RADIUS, -SHELL_THICK, 0])
            linear_extrude(height=GROVE_TEMP_SENSOR_H-SHELL_THICK){
                square([GROVE_TEMP_SENSOR_D+GROVE_TEMP_SENSOR_SPACE_RADIUS*2, SHELL_THICK]);
            }

        }
        union(){
            translate([0, GROVE_TEMP_SENSOR_D/2, 0])
            linear_extrude(height=SHELL_THICK){
                circle(GROVE_TEMP_SENSOR_HOLE_RADIUS, $fn=100);
            }
            translate([GROVE_TEMP_SENSOR_W, GROVE_TEMP_SENSOR_D/2, 0])
            linear_extrude(height=SHELL_THICK){
                circle(GROVE_TEMP_SENSOR_HOLE_RADIUS, $fn=100);
            }
        }

    }   


}
grove_temp_sensor();

・フタ部分のOpenSCADコード
音センサー用の穴の直径はSOUND_SENSOR_DIAMETERで調整できます。
// grove sound sensor lid

GROVE_SOUND_SENSOR_W=20;
GROVE_SOUND_SENSOR_D=20;
GROVE_SOUND_SENSOR_SPACE_RADIUS=2;
GROVE_SOUND_SENSOR_HOLE_RADIUS=1.5;
GROVE_SOUND_SENSOR_H=10;

SHELL_THICK=2;

CONNECTOR_OFFEST_D=1;
CONNECTOR_OFFSET_W=4;
CONNECTOR_W=12+0.8;
CONNECTOR_D=5+1; // 0.8

SOUND_SENSOR_OFFSET_W=4;
SOUND_SENSOR_OFFSET_D=1;
SOUND_SENSOR_DIAMETER=11;


module grove_sound_sensor_case()
{
    difference()
    {
        union()
        {
            translate([-GROVE_SOUND_SENSOR_SPACE_RADIUS-SHELL_THICK, -SHELL_THICK, 0])
            linear_extrude(height=SHELL_THICK){
                square([GROVE_SOUND_SENSOR_W+GROVE_SOUND_SENSOR_SPACE_RADIUS*2+SHELL_THICK*2, GROVE_SOUND_SENSOR_D+SHELL_THICK*2]);
            }

            translate([-GROVE_SOUND_SENSOR_SPACE_RADIUS, 0, SHELL_THICK])
            linear_extrude(height=SHELL_THICK){
                square([GROVE_SOUND_SENSOR_W+GROVE_SOUND_SENSOR_SPACE_RADIUS*2, GROVE_SOUND_SENSOR_D]);
            }
        }

       translate([CONNECTOR_OFFSET_W, CONNECTOR_OFFEST_D, 0])
       linear_extrude(height=SHELL_THICK*2){
            square([CONNECTOR_W, CONNECTOR_D]);
       }

       translate([GROVE_SOUND_SENSOR_W-SOUND_SENSOR_OFFSET_W, GROVE_SOUND_SENSOR_D-SOUND_SENSOR_OFFSET_D-SOUND_SENSOR_DIAMETER/2, 0])
       linear_extrude(height=SHELL_THICK*2){
            circle(SOUND_SENSOR_DIAMETER/2, $fn=100);
       }
    }
}
grove_sound_sensor_case();

〇OpenSCADの画面(フタ)

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

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

関連情報

Groveデバイスまとめ

・そのほかの3Dプリンターを活用した記事は以下を参照してください。
OpenSCADまとめ

2020年9月27日日曜日

OpenSCADとUltimaker Curaを使用してGrove Light Sensorのケースを作成する

OpenSCADとUltimaker Curaを使用して、Grove Light Sensorのケースを作成するには以下の手順を実行します。

〇Grove Light Sensorのケース/フタ
フタの部分にはGroveコネクタ用の穴と光センサー用の穴があります。

〇ケースにGrove 部分 Sensorを収納した状態

作成手順

1. OpenSCADで以下のコードを実行して形状を調整し、STLファイルにエクスポートします。

・ケース部分のOpenSCADコード
ケース部分のネジ穴のサイズはGROVE_TEMP_SENSOR_HOLE_RADIUSで調整します。
// Grove Light Sensor
WALL_MARGIN=0.4;
GROVE_LIGHT_SENSOR_W=20;
GROVE_LIGHT_SENSOR_D=20+WALL_MARGIN;
GROVE_LIGHT_SENSOR_SPACE_RADIUS=2;
GROVE_LIGHT_SENSOR_HOLE_RADIUS=1.2; // 1.5
GROVE_LIGHT_SENSOR_H=12;

SHELL_THICK=2;

module grove_light_sensor_case()
{
    difference()
    {
        union()
        {
            translate([-GROVE_LIGHT_SENSOR_SPACE_RADIUS, 0, 0])
            linear_extrude(height=SHELL_THICK){
                square([GROVE_LIGHT_SENSOR_W+GROVE_LIGHT_SENSOR_SPACE_RADIUS*2, GROVE_LIGHT_SENSOR_D]);
            }

            // left wall
            translate([-GROVE_LIGHT_SENSOR_SPACE_RADIUS-SHELL_THICK, -SHELL_THICK, 0])
            linear_extrude(height=GROVE_LIGHT_SENSOR_H-SHELL_THICK){
                square([SHELL_THICK, GROVE_LIGHT_SENSOR_D+SHELL_THICK*2]);
            }

            // right wall
            translate([GROVE_LIGHT_SENSOR_W+GROVE_LIGHT_SENSOR_SPACE_RADIUS, -SHELL_THICK, 0])
            linear_extrude(height=GROVE_LIGHT_SENSOR_H-SHELL_THICK){
                square([SHELL_THICK, GROVE_LIGHT_SENSOR_D+SHELL_THICK*2]);
            }

            // top wall
            translate([-GROVE_LIGHT_SENSOR_SPACE_RADIUS, GROVE_LIGHT_SENSOR_D, 0])
            linear_extrude(height=GROVE_LIGHT_SENSOR_H-SHELL_THICK){
                square([GROVE_LIGHT_SENSOR_D+GROVE_LIGHT_SENSOR_SPACE_RADIUS*2, SHELL_THICK]);
            }

            // bottom wall
            translate([-GROVE_LIGHT_SENSOR_SPACE_RADIUS, -SHELL_THICK, 0])
            linear_extrude(height=GROVE_LIGHT_SENSOR_H-SHELL_THICK){
                square([GROVE_LIGHT_SENSOR_D+GROVE_LIGHT_SENSOR_SPACE_RADIUS*2, SHELL_THICK]);
            }

        }
        union(){
            translate([0, GROVE_LIGHT_SENSOR_D/2, 0])
            linear_extrude(height=SHELL_THICK){
                circle(GROVE_LIGHT_SENSOR_HOLE_RADIUS, $fn=100);
            }
            translate([GROVE_LIGHT_SENSOR_W, GROVE_LIGHT_SENSOR_D/2, 0])
            linear_extrude(height=SHELL_THICK){
                circle(GROVE_LIGHT_SENSOR_HOLE_RADIUS, $fn=100);
            }
        }

    }   

}
grove_light_sensor_case();

・フタ部分のOpenSCADコード
光センサーの穴の直径はLIGHT_SENSOR_DIAMETERで微調整してください。
// grove light sensor lid
GROVE_LIGHT_SENSOR_W=20;
GROVE_LIGHT_SENSOR_D=20;
GROVE_LIGHT_SENSOR_SPACE_RADIUS=2;
GROVE_LIGHT_SENSOR_HOLE_RADIUS=1.5;
GROVE_LIGHT_SENSOR_H=10;

SHELL_THICK=2;

CONNECTOR_OFFEST_D=1;
CONNECTOR_OFFSET_W=4;
CONNECTOR_W=12+0.8;
CONNECTOR_D=5+1; //0.8;

LIGHT_SENSOR_OFFSET_D=4;
LIGHT_SENSOR_DIAMETER=6.5;


module grove_light_sensor_lid()
{
    difference()
    {
        union()
        {
            translate([-GROVE_LIGHT_SENSOR_SPACE_RADIUS-SHELL_THICK, -SHELL_THICK, 0])
            linear_extrude(height=SHELL_THICK){
                square([GROVE_LIGHT_SENSOR_W+GROVE_LIGHT_SENSOR_SPACE_RADIUS*2+SHELL_THICK*2, GROVE_LIGHT_SENSOR_D+SHELL_THICK*2]);
            }

            translate([-GROVE_LIGHT_SENSOR_SPACE_RADIUS, 0, SHELL_THICK])
            linear_extrude(height=SHELL_THICK){
                square([GROVE_LIGHT_SENSOR_W+GROVE_LIGHT_SENSOR_SPACE_RADIUS*2, GROVE_LIGHT_SENSOR_D]);
            }
        }

       translate([CONNECTOR_OFFSET_W, CONNECTOR_OFFEST_D, 0])
       linear_extrude(height=SHELL_THICK*2){
            square([CONNECTOR_W, CONNECTOR_D]);
       }

       translate([GROVE_LIGHT_SENSOR_W-CONNECTOR_OFFSET_W-LIGHT_SENSOR_DIAMETER/2+GROVE_LIGHT_SENSOR_SPACE_RADIUS/2, LIGHT_SENSOR_OFFSET_D+CONNECTOR_D+CONNECTOR_OFFEST_D++LIGHT_SENSOR_DIAMETER/2, 0])
       linear_extrude(height=SHELL_THICK*2){
            circle(LIGHT_SENSOR_DIAMETER/2, $fn=100);
       }
    }
}
grove_light_sensor_lid();


〇OpenSCADの画面(ケース)
 


〇OpenSCADの画面(フタ)
 


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

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


関連情報

・Raspberry Pi ZeroとGrove Base HATを利用してGrove Light Sensorを接続する場合は、以下の記事を参照してください。
Raspberry Pi ZeroとGrove Base HAT for Raspberry Piと光センサーで、明るさを取得する

Groveデバイスまとめ

・そのほかの3Dプリンターを活用した記事は以下を参照してください。
OpenSCADまとめ

2020年9月26日土曜日

OpenSCADとUltimaker Curaを使用してGrove温度センサー(Grove Temperature Sensor)のケースを作成する

OpenSCADとUltimaker Curaを使用して、Grove温度センサー(Grove Temperature Sensor)のケースを作成するには以下の手順を実行します。

〇Grove Temperature Sensorのケース/フタ
フタの部分にはGroveコネクタ用の穴とスリットがあります。

〇ケースにGrove Temperature Sensorを収納した状態

作成手順

1. OpenSCADで以下のコードを実行して形状を調整し、STLファイルにエクスポートします。
・ケース部分のOpenSCADコード
ケース部分のネジ穴のサイズはGROVE_TEMP_SENSOR_HOLE_RADIUSで調整します。
// Grove Temperature Sensor
WALL_MARGIN=0.4;
GROVE_TEMP_SENSOR_W=20;
GROVE_TEMP_SENSOR_D=20+WALL_MARGIN;
GROVE_TEMP_SENSOR_SPACE_RADIUS=2;
GROVE_TEMP_SENSOR_HOLE_RADIUS=1.2; // 1.5
GROVE_TEMP_SENSOR_H=10;

SHELL_THICK=2;

module grove_temp_sensor()
{
    difference()
    {
        union()
        {
            translate([-GROVE_TEMP_SENSOR_SPACE_RADIUS, 0, 0])
            linear_extrude(height=SHELL_THICK){
                square([GROVE_TEMP_SENSOR_W+GROVE_TEMP_SENSOR_SPACE_RADIUS*2, GROVE_TEMP_SENSOR_D]);
            }

            // left wall
            translate([-GROVE_TEMP_SENSOR_SPACE_RADIUS-SHELL_THICK, -SHELL_THICK, 0])
            linear_extrude(height=GROVE_TEMP_SENSOR_H-SHELL_THICK){
                square([SHELL_THICK, GROVE_TEMP_SENSOR_D+SHELL_THICK*2]);
            }

            // right wall
            translate([GROVE_TEMP_SENSOR_W+GROVE_TEMP_SENSOR_SPACE_RADIUS, -SHELL_THICK, 0])
            linear_extrude(height=GROVE_TEMP_SENSOR_H-SHELL_THICK){
                square([SHELL_THICK, GROVE_TEMP_SENSOR_D+SHELL_THICK*2]);
            }

            // top wall
            translate([-GROVE_TEMP_SENSOR_SPACE_RADIUS, GROVE_TEMP_SENSOR_D, 0])
            linear_extrude(height=GROVE_TEMP_SENSOR_H-SHELL_THICK){
                square([GROVE_TEMP_SENSOR_D+GROVE_TEMP_SENSOR_SPACE_RADIUS*2, SHELL_THICK]);
            }

            // bottom wall
            translate([-GROVE_TEMP_SENSOR_SPACE_RADIUS, -SHELL_THICK, 0])
            linear_extrude(height=GROVE_TEMP_SENSOR_H-SHELL_THICK){
                square([GROVE_TEMP_SENSOR_D+GROVE_TEMP_SENSOR_SPACE_RADIUS*2, SHELL_THICK]);
            }

        }
        union(){
            translate([0, GROVE_TEMP_SENSOR_D/2, 0])
            linear_extrude(height=SHELL_THICK){
                circle(GROVE_TEMP_SENSOR_HOLE_RADIUS, $fn=100);
            }
            translate([GROVE_TEMP_SENSOR_W, GROVE_TEMP_SENSOR_D/2, 0])
            linear_extrude(height=SHELL_THICK){
                circle(GROVE_TEMP_SENSOR_HOLE_RADIUS, $fn=100);
            }
        }

    }   


}
grove_temp_sensor();

・フタ部分のOpenSCADコード
スリットの奥行はSLIT_Dで調整できます。
// grove temperature sensor lid

GROVE_TEMP_SENSOR_W=20;
GROVE_TEMP_SENSOR_D=20;
GROVE_TEMP_SENSOR_SPACE_RADIUS=2;
GROVE_TEMP_SENSOR_HOLE_RADIUS=1.5;
GROVE_TEMP_SENSOR_H=10;

SHELL_THICK=2;

CONNECTOR_OFFEST_D=1;
CONNECTOR_OFFSET_W=4;
CONNECTOR_W=12+0.8;
CONNECTOR_D=5+0.8;

SLIT_D=2;


module grove_temp_sensor()
{
    difference()
    {
        union()
        {
            translate([-GROVE_TEMP_SENSOR_SPACE_RADIUS-SHELL_THICK, -SHELL_THICK, 0])
            linear_extrude(height=SHELL_THICK){
                square([GROVE_TEMP_SENSOR_W+GROVE_TEMP_SENSOR_SPACE_RADIUS*2+SHELL_THICK*2, GROVE_TEMP_SENSOR_D+SHELL_THICK*2]);
            }

            translate([-GROVE_TEMP_SENSOR_SPACE_RADIUS, 0, SHELL_THICK])
            linear_extrude(height=SHELL_THICK){
                square([GROVE_TEMP_SENSOR_W+GROVE_TEMP_SENSOR_SPACE_RADIUS*2, GROVE_TEMP_SENSOR_D]);
            }
        }

       translate([CONNECTOR_OFFSET_W, CONNECTOR_OFFEST_D, 0])
       linear_extrude(height=SHELL_THICK*2){
            square([CONNECTOR_W, CONNECTOR_D]);
       }

       translate([0, CONNECTOR_OFFEST_D+CONNECTOR_D+SLIT_D, 0])
       linear_extrude(height=SHELL_THICK*2){
            square([GROVE_TEMP_SENSOR_W, SLIT_D]);
       }
       translate([0, CONNECTOR_OFFEST_D+CONNECTOR_D+SLIT_D*3, 0])
       linear_extrude(height=SHELL_THICK*2){
            square([GROVE_TEMP_SENSOR_W, SLIT_D]);
       }
       translate([0, CONNECTOR_OFFEST_D+CONNECTOR_D+SLIT_D*5, 0])
       linear_extrude(height=SHELL_THICK*2){
            square([GROVE_TEMP_SENSOR_W, SLIT_D]);
       }
    }
}
grove_temp_sensor();

〇OpenSCADの画面(ケース)

〇OpenSCADの画面(フタ)

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

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

関連情報

Groveデバイスまとめ

2020年9月25日金曜日

OpenSCADとUltimaker Curaを使用して棚ダボを作成する

OpenSCADとUltimaker Curaを使用して、棚ダボを作成するには以下の手順を実行します。

〇3Dプリンタで作成した棚ダボ

作成手順

1. OpenSCADで以下のコードを実行して形状を調整し、STLファイルにエクスポートします。
ダボの形はパラメータで制御する事ができます。
・ヘッド半径
PIN_HEAD_RADIUS
・ヘッドの高さ
PIN_HEAD_H
・軸の半径
PIN_SHANK_RADIUS
・軸の高さ
PIN_SHANK_H

・OpenSCADコード
// 棚ダボ
// ヘッド半径
PIN_HEAD_RADIUS = 3.5;
// ヘッドの高さ
PIN_HEAD_H = 7;
// 軸の半径
PIN_SHANK_RADIUS= 2.5;
// 軸の高さ
PIN_SHANK_H = 7;

linear_extrude(height=PIN_HEAD_H){
    circle(PIN_HEAD_RADIUS, $fn=50);
}
translate([0, 0, PIN_HEAD_H])
linear_extrude(height=PIN_SHANK_H){
    circle(PIN_SHANK_RADIUS, $fn=50);
}

〇OpenSCADでの棚ダボデザイン画面

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

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

関連情報

・そのほかの3Dプリンターを活用した記事は以下を参照してください。
OpenSCADまとめ

2020年9月24日木曜日

OpenSCADとUltimaker Curaを使用してArduino Nano Everyのケースを作成する

OpenSCADとUltimaker Curaを使用して、Arduino Nano Everyのケースを作成するには以下の手順を実行します。

〇Arduino Nano Everyのケース/フタ
ピン用の足の部分は穴あきにしています。

〇ケースにArduino Nano Everyを収納した状態

〇作成手順
1. OpenSCADで以下のコードを実行して形状を調整し、STLファイルにエクスポートします。
・ケース部分のOpenSCADコード
// Arduino Nanoのベースサイズ
NANO_W=45;
NANO_D=18;

NANO_PIN_D=3;
NANO_PIN_H=9;

HOLE_SPACE_W = 2;
HOLE_SPACE_D = 3.5;

WALL_THICK=2;

WALL_H=16;

MICROUSB_D=8;

BOARD_THICK=1;

module nano_base()
{
    translate([0, 0, 0])
    linear_extrude(height=NANO_PIN_H){
        square([HOLE_SPACE_W, NANO_D]);
    }

    translate([HOLE_SPACE_W, HOLE_SPACE_D, 0])
    linear_extrude(height=NANO_PIN_H){
        square([NANO_W-HOLE_SPACE_W*2, NANO_D-HOLE_SPACE_D*2]);
    }

    translate([NANO_W-HOLE_SPACE_W, 0, 0])
    linear_extrude(height=NANO_PIN_H){
        square([HOLE_SPACE_W, NANO_D]);
    }

}

module nano_wall()
{
    // microusb
    translate([-WALL_THICK, -WALL_THICK, 0])
    linear_extrude(height=WALL_H){
        square([WALL_THICK, (NANO_D-MICROUSB_D)/2+WALL_THICK]);
    }
    translate([-WALL_THICK, (NANO_D-MICROUSB_D)/2, 0])
    linear_extrude(height=NANO_PIN_H+BOARD_THICK){
        square([WALL_THICK, MICROUSB_D]);
    }
    translate([-WALL_THICK, (NANO_D-MICROUSB_D)/2+MICROUSB_D, 0])
    linear_extrude(height=WALL_H){
        square([WALL_THICK, (NANO_D-MICROUSB_D)/2+WALL_THICK]);
    }

    translate([0, -WALL_THICK, 0])
    linear_extrude(height=WALL_H){
        square([NANO_W, WALL_THICK]);
    }

    translate([0, NANO_D, 0])
    linear_extrude(height=WALL_H){
        square([NANO_W, WALL_THICK]);
    }

    translate([NANO_W, -WALL_THICK, 0])
    linear_extrude(height=WALL_H){
        square([WALL_THICK, NANO_D+WALL_THICK*2]);
    }

}

nano_base();
nano_wall();

・フタ部分のOpenSCADコード
// Arduino Nanoのベースサイズ
NANO_W=45;
NANO_D=18;

WALL_THICK=2;
WALL_H=2;

module nano_lid()
{
    translate([-WALL_THICK, -WALL_THICK, 0])
    linear_extrude(height=WALL_H){
        square([NANO_W+WALL_THICK*2, NANO_D+WALL_THICK*2]);
    }

    translate([0, 0, WALL_H])
    linear_extrude(height=WALL_H){
        square([NANO_W, NANO_D]);
    }

}

nano_lid();

〇OpenSCADの画面(ケース)

〇OpenSCADの画面(フタ)

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

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

関連情報

・そのほかの3Dプリンターを活用した記事は以下を参照してください。
OpenSCADまとめ

2020年9月23日水曜日

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

OpenSCADとUltimaker Curaを使用して、Raspberry Pi Zero WHのケースを作成するには以下の手順を実行します。

〇Raspberry Pi Zero WHのケース/フタ

〇ケースにRapberry Pi Zeroを収納した状態

作成手順

1. OpenSCADで以下のコードを実行して形状を調整し、STLファイルにエクスポートします。
・ケース部分のOpenSCADコード
// Raspberry Pi Zeroのベースサイズ
PIZERO_W=65;
PIZERO_D=30;
PIZERO_H=9;

HOLE_OFFSET = 3.5;
// 四隅の穴の半径: ネジの大きさやプリンタの設定により適宜変更してください。
// HOLE_RADIUS = 1.4;
HOLE_RADIUS = 1.45;

// 底の厚さ
BOTTOM_THICK=2;
// 四隅のスペーサーの高さ
SPACER_H=3;
CAMERA_MARGIN=2;

WALL_THICK=2;
WALL_CONNECTOR_H=14;
WALL_CONNECTOR_HL=6;
MINI_HDMI_W=12;
WALL_BETWEEN_MINI_HDMI_AND_USB=18.5;
MICRO_USB_X2_W=20.5;
SDCARD_D=12;

module pizero_base()
{
    difference(){
        union(){
            linear_extrude(height=BOTTOM_THICK){
                square([PIZERO_W+CAMERA_MARGIN, PIZERO_D]);
            }

            translate([0, 0, BOTTOM_THICK])
            linear_extrude(height=SPACER_H){
                square([HOLE_OFFSET*2, HOLE_OFFSET*2]);
            }
            translate([PIZERO_W-HOLE_OFFSET*2, 0, BOTTOM_THICK])
            linear_extrude(height=SPACER_H){
                square([HOLE_OFFSET*2, HOLE_OFFSET*2]);
            }
            translate([0, PIZERO_D-HOLE_OFFSET*2, BOTTOM_THICK])
            linear_extrude(height=SPACER_H){
                square([HOLE_OFFSET*2, HOLE_OFFSET*2]);
            }
            translate([PIZERO_W-HOLE_OFFSET*2, PIZERO_D-HOLE_OFFSET*2, BOTTOM_THICK])
            linear_extrude(height=SPACER_H){
                square([HOLE_OFFSET*2, HOLE_OFFSET*2]);
            }
        }
        translate([HOLE_OFFSET, HOLE_OFFSET, 0])
        linear_extrude(height=SPACER_H+BOTTOM_THICK){
            circle(HOLE_RADIUS, $fn=50);
        }
        translate([PIZERO_W-HOLE_OFFSET, HOLE_OFFSET, 0])
        linear_extrude(height=SPACER_H+BOTTOM_THICK){
            circle(HOLE_RADIUS, $fn=50);
        }
        translate([HOLE_OFFSET, PIZERO_D-HOLE_OFFSET, 0])
        linear_extrude(height=SPACER_H+BOTTOM_THICK){
            circle(HOLE_RADIUS, $fn=50);
        }

        translate([PIZERO_W-HOLE_OFFSET, PIZERO_D-HOLE_OFFSET, 0])
        linear_extrude(height=SPACER_H+BOTTOM_THICK){
            circle(HOLE_RADIUS, $fn=50);
        }
    }
}

module wall_connector()
{
    translate([-WALL_THICK, -WALL_THICK, 0])
    linear_extrude(height=WALL_CONNECTOR_H){
        square([HOLE_OFFSET*2+WALL_THICK, WALL_THICK]);
    }

    translate([HOLE_OFFSET*2, -WALL_THICK, 0])
    linear_extrude(height=WALL_CONNECTOR_HL){
        square([MINI_HDMI_W, WALL_THICK]);
    }

    translate([HOLE_OFFSET*2+MINI_HDMI_W, -WALL_THICK, 0])
    linear_extrude(height=WALL_CONNECTOR_H){
        square([WALL_BETWEEN_MINI_HDMI_AND_USB, WALL_THICK]);
    }

    translate([HOLE_OFFSET*2+MINI_HDMI_W+WALL_BETWEEN_MINI_HDMI_AND_USB, -WALL_THICK, 0])
    linear_extrude(height=WALL_CONNECTOR_HL){
        square([MICRO_USB_X2_W, WALL_THICK]);
    }

    translate([HOLE_OFFSET*2+MINI_HDMI_W+WALL_BETWEEN_MINI_HDMI_AND_USB+MICRO_USB_X2_W, -WALL_THICK, 0])
    linear_extrude(height=WALL_CONNECTOR_H){
        square([HOLE_OFFSET*2+WALL_THICK+CAMERA_MARGIN, WALL_THICK]);
    }

}

module wall_pins()
{
    translate([-WALL_THICK, PIZERO_D, 0])
    linear_extrude(height=WALL_CONNECTOR_H){
        square([WALL_THICK*2+CAMERA_MARGIN+PIZERO_W, WALL_THICK]);
    }
}

module wall_sdcard()
{
    translate([-WALL_THICK, 0, 0])
    linear_extrude(height=WALL_CONNECTOR_H){
        square([WALL_THICK, PIZERO_D-HOLE_OFFSET*2-SDCARD_D]);
    }

    translate([-WALL_THICK, PIZERO_D-HOLE_OFFSET*2-SDCARD_D, 0])
    linear_extrude(height=WALL_CONNECTOR_HL){
        square([WALL_THICK, SDCARD_D]);
    }

    translate([-WALL_THICK, PIZERO_D-HOLE_OFFSET*2, 0])
    linear_extrude(height=WALL_CONNECTOR_H){
        square([WALL_THICK, HOLE_OFFSET*2]);
    }

}

module wall_camera()
{
    translate([PIZERO_W+CAMERA_MARGIN, 0, 0])
    linear_extrude(height=WALL_CONNECTOR_H){
        square([WALL_THICK, PIZERO_D]);
    }
}

pizero_base();
wall_connector();
wall_pins();
wall_sdcard();
wall_camera();

・フタ部分のOpenSCADコード
// Raspberry Pi Zeroのベースサイズ
PIZERO_W=65;
PIZERO_D=30;
PIZERO_H=9;

HOLE_OFFSET = 3.5;
// 四隅の穴の半径: ネジの大きさやプリンタの設定により適宜変更してください。
// HOLE_RADIUS = 1.4;
HOLE_RADIUS = 1.45;

// 底(天井)の厚さ
BOTTOM_THICK=2;
SPACER_H=7;
CAMERA_MARGIN=2;

WALL_THICK=2;

LID_WALL_H=6;

WALL_CONNECTOR_H=12;
MINI_HDMI_W=12;
WALL_BETWEEN_MINI_HDMI_AND_USB=18.5;
MICRO_USB_X2_W=20.5;
SDCARD_D=12;

// 12 - 2 -2 -3 = 5
module pizero_lid()
{
    difference(){
        union(){
            translate([-WALL_THICK, -WALL_THICK, 0])
            linear_extrude(height=BOTTOM_THICK){
                square([PIZERO_W+CAMERA_MARGIN+WALL_THICK*2, PIZERO_D+WALL_THICK*2]);
            }

            translate([0, 0, BOTTOM_THICK])
            linear_extrude(height=SPACER_H){
                square([HOLE_OFFSET*2, HOLE_OFFSET*2]);
            }
            translate([PIZERO_W-HOLE_OFFSET*2, 0, BOTTOM_THICK])
            linear_extrude(height=SPACER_H){
                square([HOLE_OFFSET*2, HOLE_OFFSET*2]);
            }
            translate([0, PIZERO_D-HOLE_OFFSET*2, BOTTOM_THICK])
            linear_extrude(height=SPACER_H){
                square([HOLE_OFFSET*2, HOLE_OFFSET*2]);
            }
            translate([PIZERO_W-HOLE_OFFSET*2, PIZERO_D-HOLE_OFFSET*2, BOTTOM_THICK])
            linear_extrude(height=SPACER_H){
                square([HOLE_OFFSET*2, HOLE_OFFSET*2]);
            }
        }
        translate([HOLE_OFFSET, HOLE_OFFSET, 0])
        linear_extrude(height=SPACER_H+BOTTOM_THICK){
            circle(HOLE_RADIUS, $fn=50);
        }
        translate([PIZERO_W-HOLE_OFFSET, HOLE_OFFSET, 0])
        linear_extrude(height=SPACER_H+BOTTOM_THICK){
            circle(HOLE_RADIUS, $fn=50);
        }
        translate([HOLE_OFFSET, PIZERO_D-HOLE_OFFSET, 0])
        linear_extrude(height=SPACER_H+BOTTOM_THICK){
            circle(HOLE_RADIUS, $fn=50);
        }

        translate([PIZERO_W-HOLE_OFFSET, PIZERO_D-HOLE_OFFSET, 0])
        linear_extrude(height=SPACER_H+BOTTOM_THICK){
            circle(HOLE_RADIUS, $fn=50);
        }

        translate([HOLE_OFFSET*2, 0, 0])
        linear_extrude(height=SPACER_H){
            square([PIZERO_W-HOLE_OFFSET*4, HOLE_OFFSET*2]);
        }

    }
}

module lid_sdcard()
{
    translate([-WALL_THICK, HOLE_OFFSET*2, 0])
    linear_extrude(height=LID_WALL_H){
        square([WALL_THICK, SDCARD_D]);
    }    
}

module lid_connector()
{
    translate([HOLE_OFFSET*2, PIZERO_D, 0])
    linear_extrude(height=LID_WALL_H){
        square([MINI_HDMI_W, WALL_THICK]);
    }    
    translate([HOLE_OFFSET*2+MINI_HDMI_W+WALL_BETWEEN_MINI_HDMI_AND_USB, PIZERO_D, 0])
    linear_extrude(height=LID_WALL_H){
        square([MICRO_USB_X2_W, WALL_THICK]);
    }    
}

pizero_lid();
lid_sdcard();
lid_connector();

〇OpenSCADの画面(ケース)

〇OpenSCADの画面(フタ)

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

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

関連情報

・そのほかの3Dプリンターを活用した記事は以下を参照してください。
OpenSCADまとめ

Raspberry Pi Zeroと小型ターンテーブルをREST APIで制御する

2020年9月22日火曜日

OpenSCADとUltimaker Curaを使用してRaspberry Pi Zero WHの土台を作成する

OpenSCADとUltimaker Curaを使用して、Raspberry Pi Zero WHの土台を作成するには以下の手順を実行します。

〇Raspberry Pi Zero WHの土台

〇土台にRapberry Pi Zeroをネジ止めした画像

作成手順

1. OpenSCADで以下のコードを実行して形状を調整し、STLファイルにエクスポートします。
土台の四隅のスペーサーの高さはSPACER_Hで変更できます(ここでは5mmに設定しています)。その他、ネジに合わせて適宜HOLE_RADISを調整します。

〇OpenSCADの画面

// Raspberry Pi Zeroのベースサイズ
PIZERO_W=65;
PIZERO_D=30;
PIZERO_H=9;

HOLE_OFFSET = 3.5;
// 四隅の穴の半径: ネジの大きさやプリンタの設定により適宜変更してください。
// HOLE_RADIUS = 1.38; ※Anycubic MEGA Sの場合
// HOLE_RADIUS = 1.4;
HOLE_RADIUS = 1.45;

// 底の厚さ
BOTTOM_THICK=2;
// 四隅のスペーサーの高さ
SPACER_H=5;

module pizero_base()
{
    difference(){
        union(){
            linear_extrude(height=BOTTOM_THICK){
                square([PIZERO_W, PIZERO_D]);
            }

            translate([0, 0, BOTTOM_THICK])
            linear_extrude(height=SPACER_H){
                square([HOLE_OFFSET*2, HOLE_OFFSET*2]);
            }
            translate([PIZERO_W-HOLE_OFFSET*2, 0, BOTTOM_THICK])
            linear_extrude(height=SPACER_H){
                square([HOLE_OFFSET*2, HOLE_OFFSET*2]);
            }
            translate([0, PIZERO_D-HOLE_OFFSET*2, BOTTOM_THICK])
            linear_extrude(height=SPACER_H){
                square([HOLE_OFFSET*2, HOLE_OFFSET*2]);
            }
            translate([PIZERO_W-HOLE_OFFSET*2, PIZERO_D-HOLE_OFFSET*2, BOTTOM_THICK])
            linear_extrude(height=SPACER_H){
                square([HOLE_OFFSET*2, HOLE_OFFSET*2]);
            }
        }
        translate([HOLE_OFFSET, HOLE_OFFSET, 0])
        linear_extrude(height=SPACER_H+BOTTOM_THICK){
            circle(HOLE_RADIUS, $fn=50);
        }
        translate([PIZERO_W-HOLE_OFFSET, HOLE_OFFSET, 0])
        linear_extrude(height=SPACER_H+BOTTOM_THICK){
            circle(HOLE_RADIUS, $fn=50);
        }
        translate([HOLE_OFFSET, PIZERO_D-HOLE_OFFSET, 0])
        linear_extrude(height=SPACER_H+BOTTOM_THICK){
            circle(HOLE_RADIUS, $fn=50);
        }

        translate([PIZERO_W-HOLE_OFFSET, PIZERO_D-HOLE_OFFSET, 0])
        linear_extrude(height=SPACER_H+BOTTOM_THICK){
            circle(HOLE_RADIUS, $fn=50);
        }
    }
}

pizero_base();

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

〇Ultimaker Curaの画面

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

LABISTS X1のサンプル設定例

環境に合わせて適宜設定を変更してください。
〇Machine settings
X(Width): 100mm
Y(Depth): 100mm
Z(Height): 100mm
G-code flavor: RepRap

+ Printhead settings
X min: 0mm
Y min: 0mm
X max: 0mm
Y max: 0mm
Gantry Height: 100mm
Number of Extruder: 1

+ Nozzle Settings
Nozzle size: 0.4mm
Compatible material diameter: 1.75mm
Nozzle offset X: 0mm
Nozzle offset Y: 0mm
Cooling Fan Number: 1

〇Print Settings
Infill Density: 30%
Print Speed: 50mm/s

関連情報

・そのほかの3Dプリンターを活用した記事は以下を参照してください。
OpenSCADまとめ

Raspberry Pi Zeroと小型ターンテーブルをREST APIで制御する

OpenSCADとUltimaker Curaを使用して、Raspberry Pi Zeroをタミヤのユニバーサルプレートに固定できるマウンタを作成する

2020年9月21日月曜日

Debian 10(Buster)/Ubuntu 20.04に3DプリンタのスライサーアプリUltimaker Curaをインストールする

Ultimaker Curaで3Dデータをスライスして、3Dプリンターに出力するgcodeに変換する事ができます。

〇Ultimaker Curaの画面(Debian 10)

〇Ultimaker Curaの画面(Ubuntu 20.04)

インストール方法

以下のコマンドを実行します。
sudo mkdir -p /opt/cura

cd /opt/cura

sudo wget https://github.com/Ultimaker/Cura/releases/download/4.7.0/Ultimaker_Cura-4.7.0.AppImage

sudo chmod +x Ultimaker_Cura-4.7.0.AppImage

cat << EOF | sudo tee /usr/share/applications/cura.desktop
[Desktop Entry]
Version=1.0
Type=Application
Terminal=false
Exec=/opt/cura/Ultimaker_Cura-4.7.0.AppImage
Name=Ultimaker Cura
Categories=Development;
EOF

関連情報

・Ultimaker Curaのgithubリポジトリ
https://github.com/Ultimaker/Cura

2020年9月20日日曜日

Jupyter上でChartifyを使用してヒストグラムを表示する

Jupyter上でChartifyを使用してヒストグラムを表示するには、以下のサンプルのようにhistogramを使用します。

サンプルコード

import chartify
import pandas as pd

chart_data = chartify.examples.example_data()
print(chart_data)

ch = chartify.Chart(blank_labels=True, y_axis_type='density')
ch.set_title("ヒストグラムサンプル")
ch.plot.histogram(data_frame=chart_data, values_column='total_price', bins=20)
ch.show()

〇出力画像

インストール方法

Jupyterの仮想環境で以下のコマンドを実行します。
pipenv install chartify

関連情報

・Chartifyのgithubリポジトリ
https://github.com/spotify/chartify

2020年9月19日土曜日

Jupyter上でChartifyを使用してテキストグラフを表示する

Jupyter上でChartifyを使用してテキストグラフを表示するには、以下のサンプルのようにtextを使用します。テキストグラフは、散布図のようにマーカーではなくテキストを表示します。
テキストだけだと分かりにくいので下記の例では分布図とテキストグラフを重ねて点も表示するようにしています。
font_sizeで文字サイズ、angleで角度、x_offset/y_offsetでオフセットを指定できます。

サンプルコード

import chartify

data = chartify.examples.example_data()
chart_data = data.groupby(['fruit'])[['quantity', 'total_price']].sum().reset_index()
print(chart_data)

ch = chartify.Chart(blank_labels=True, x_axis_type='linear', y_axis_type='linear')
ch.set_title("テキストグラフサンプル")
ch.plot.text(data_frame=chart_data, x_column='total_price', y_column='quantity', 
    text_column='fruit', color_column='fruit', angle=-30, font_size='12pt', x_offset=1, y_offset=-5)
ch.style.color_palette.reset_palette_order()
ch.plot.scatter(
    data_frame=chart_data,
    x_column='total_price',
    y_column='quantity',
    color_column='fruit')
ch.set_legend_location("outside_bottom")
ch.show()

〇出力画像

インストール方法

Jupyterの仮想環境で以下のコマンドを実行します。
pipenv install chartify

関連情報

・Chartifyのgithubリポジトリ
https://github.com/spotify/chartify

2020年9月18日金曜日

Jupyter上でChartifyを使用して散布図を表示する

Jupyter上でChartifyを使用して散布図を表示するには、以下のサンプルのようにscatterを使用します。
markerでマーカーの形を変更する事ができます(asterisk, circle, circle_cross, circle_x, cross, diamond, diamond_cross, hex, inverted_triangle, square, square_x, square_cross, triangle, x, *, +, o, ox, o+)。

サンプルコード

import chartify
import pandas as pd

chart_data = chartify.examples.example_data()
print(chart_data)

ch = chartify.Chart(blank_labels=True, x_axis_type='datetime', y_axis_type='linear')
ch.set_title("散布図サンプル")
ch.plot.scatter(data_frame=chart_data, x_column='date', y_column="total_price", 
    size_column='total_price', color_column='fruit', marker='asterisk')
ch.show()

〇出力画像

インストール方法

Jupyterの仮想環境で以下のコマンドを実行します。
pipenv install chartify

関連情報

・Chartifyのgithubリポジトリ
https://github.com/spotify/chartify

2020年9月17日木曜日

Jupyter上でChartifyを使用して積上げ領域グラフを表示する

Jupyter上でChartifyを使用して積上げ領域グラフを表示するには、以下のサンプルのようにareaを使用します。
StackedをFalseにすると積み上げでない領域グラフになります。

サンプルコード

import chartify
import pandas as pd

data = chartify.examples.example_data()
data['month_year'] = data['date'].values.astype('datetime64[M]')
chart_data = data.groupby(['fruit', 'month_year'])[['quantity']].sum().reset_index()
print(chart_data)

ch = chartify.Chart(blank_labels=True, x_axis_type='datetime', y_axis_type='linear')
ch.set_title("領域グラフサンプル")
ch.plot.area(data_frame=chart_data, x_column='month_year', y_column='quantity', color_column='fruit', stacked=True)
ch.show()

〇出力画像

インストール方法

Jupyterの仮想環境で以下のコマンドを実行します。
pipenv install chartify

関連情報

・Chartifyのgithubリポジトリ
https://github.com/spotify/chartify

2020年9月16日水曜日

Chartifyを使用した折れ線グラフの線を点線や破線に設定する

Chartifyを使用した折れ線グラフの線を点線や破線に設定するには、以下のサンプルのようにline_dashを使用します。
dashedで破線・dottedで点線になります。

サンプルコード

import chartify

data = chartify.examples.example_data()
chart_data = data.groupby(['country', 'date'])[['quantity']].sum().reset_index().query('country in ("JP")')
print(chart_data)

ch = chartify.Chart(blank_labels=True, x_axis_type='datetime', y_axis_type='linear')
ch.set_title("折れ線グラフサンプル")
ch.plot.line(data_frame=chart_data, x_column='date', y_column='quantity', color_column='country', line_dash='dotted')
ch.show()

〇出力画像

インストール方法

Jupyterの仮想環境で以下のコマンドを実行します。
pipenv install chartify

関連情報

・Chartifyのgithubリポジトリ
https://github.com/spotify/chartify

2020年9月15日火曜日

Chartifyを使用した折れ線グラフの線の幅を設定する

Chartifyを使用した折れ線グラフの線の幅を設定するには、以下のサンプルのようにline_widthを使用します(デフォルトは4です)。

サンプルコード

import chartify

data = chartify.examples.example_data()
chart_data = data.groupby(['country', 'date'])[['quantity']].sum().reset_index().query('country in ("US", "JP")')
print(chart_data)

ch = chartify.Chart(blank_labels=True, x_axis_type='datetime', y_axis_type='linear')
ch.set_title("折れ線グラフサンプル")
ch.plot.line(data_frame=chart_data, x_column='date', y_column='quantity', color_column='country', line_width=1)
ch.show()

〇出力画像

インストール方法

Jupyterの仮想環境で以下のコマンドを実行します。
pipenv install chartify

関連情報

・Chartifyのgithubリポジトリ
https://github.com/spotify/chartify

2020年9月14日月曜日

Jupyter上でChartifyを使用して折れ線グラフを表示する

Jupyter上でChartifyを使用して折れ線グラフを表示するには、以下のサンプルのようにlineを使用します。

サンプルコード

import chartify

data = chartify.examples.example_data()
chart_data = data.groupby(['fruit', 'date'])[['quantity']].sum().reset_index()
print(chart_data)

ch = chartify.Chart(blank_labels=True, x_axis_type='datetime', y_axis_type='linear')
ch.set_title("折れ線グラフサンプル")
ch.plot.line(data_frame=chart_data, x_column='date', y_column='quantity', color_column='fruit')
ch.show()

〇出力画像

インストール方法

Jupyterの仮想環境で以下のコマンドを実行します。
pipenv install chartify

関連情報

・Chartifyのgithubリポジトリ
https://github.com/spotify/chartify

2020年9月13日日曜日

Jupyter上でChartifyを使用してヒートマップを表示する

Jupyter上でChartifyを使用してヒートマップを表示するには、以下のサンプルのようにheatmapを使用します。

サンプルコード

import chartify

data = chartify.examples.example_data()
chart_data = data.groupby(['country', 'fruit'])[['quantity']].sum().reset_index()
print(chart_data)

ch = chartify.Chart(blank_labels=True, x_axis_type='categorical', y_axis_type='categorical')
ch.set_title("ヒートマップサンプル")
ch.plot.heatmap(data_frame=chart_data, x_column='fruit', y_column='country', 
    text_column='quantity', color_column='quantity', text_format='{:}')
ch.show()

〇出力画像

インストール方法

Jupyterの仮想環境で以下のコマンドを実行します。
pipenv install chartify

関連情報

・Chartifyのgithubリポジトリ
https://github.com/spotify/chartify

2020年9月12日土曜日

Jupyter上でChartifyを使用してパラレルチャートを表示する

Jupyter上でChartifyを使用してパラレルチャートチャートを表示するには、以下のサンプルのようにparallelを使用します。

サンプルコード

import chartify

data = chartify.examples.example_data()
bar_data = data.groupby(['country', 'fruit'])[['quantity']].sum().reset_index()
print(bar_data)

ch = chartify.Chart(blank_labels=True, x_axis_type='categorical')
ch.set_title("パラレルチャート")
ch.plot.parallel(data_frame=bar_data, categorical_columns=['fruit'], numeric_column='quantity', color_column='country')
ch.show()

〇出力画像

インストール方法

Jupyterの仮想環境で以下のコマンドを実行します。
pipenv install chartify

関連情報

・Chartifyのgithubリポジトリ
https://github.com/spotify/chartify

2020年9月11日金曜日

Jupyter上でChartifyを使用して横方向ロリポップチャートを表示する

Jupyter上でChartifyを使用して横方向ロリポップチャートを表示するには、以下のサンプルのようにlollipopを使用します。

サンプルコード

import chartify

data = chartify.examples.example_data()
bar_data = data.groupby('country')[['quantity']].sum().reset_index()
print(bar_data)

ch = chartify.Chart(blank_labels=True, y_axis_type='categorical')
ch.set_title("横方向ロリポップチャート")
ch.plot.lollipop(data_frame=bar_data, categorical_columns='country', numeric_column='quantity', color_column='country')
ch.show()

〇出力画像

インストール方法

Jupyterの仮想環境で以下のコマンドを実行します。
pipenv install chartify

関連情報

・Chartifyのgithubリポジトリ
https://github.com/spotify/chartify

2020年9月10日木曜日

Jupyter上でChartifyを使用して横方向積上げ棒グラフを表示する

Jupyter上でChartifyを使用して横方向積上げ棒グラフを表示するには、以下のサンプルのようにbar_stackedを使用します。

サンプルコード

import chartify

data = chartify.examples.example_data()
bar_data = data.groupby(['country', 'fruit'])[['quantity']].sum().reset_index()
print(bar_data)

ch = chartify.Chart(blank_labels=True, y_axis_type='categorical')
ch.set_title("横方向積上棒グラフ")
ch.plot.bar_stacked(data_frame=bar_data, categorical_columns='country', numeric_column='quantity',stack_column='fruit')
ch.show()


〇出力画像


インストール方法

Jupyterの仮想環境で以下のコマンドを実行します。
pipenv install chartify

関連情報

・Chartifyのgithubリポジトリ
https://github.com/spotify/chartify

2020年9月9日水曜日

Jupyter上でChartifyを使用してデータソースの文字列を設定する

Jupyter上でChartifyを使用してデータソースの文字列を設定するには、set_source_labelメソッドを使用します。

サンプルコード

import chartify

data = chartify.examples.example_data()
bar_data = data.groupby('country')[['quantity']].sum().reset_index()
print(bar_data)

ch = chartify.Chart(blank_labels=True, y_axis_type='categorical')
ch.set_title("横方向棒グラフ")
ch.plot.bar(data_frame=bar_data, categorical_columns='country', numeric_column='quantity', color_column='country')
ch.set_source_label("サンプルデータソース")
ch.show()


〇出力画像


インストール方法

Jupyterの仮想環境で以下のコマンドを実行します。
pipenv install chartify

関連情報

・Chartifyのgithubリポジトリ
https://github.com/spotify/chartify

2020年9月8日火曜日

Jupyter上でChartifyを使用して凡例の位置を変更する

Jupyter上でChartifyを使用して凡例の位置を変更するには、set_legend_locationメソッドを使用します。

サンプルコード

import chartify

data = chartify.examples.example_data()
bar_data = data.groupby('country')[['quantity']].sum().reset_index()
print(bar_data)

ch = chartify.Chart(blank_labels=True, y_axis_type='categorical')
ch.set_title("横方向棒グラフ")
ch.plot.bar(data_frame=bar_data, categorical_columns='country', numeric_column='quantity', color_column='country')
ch.set_legend_location("outside_bottom")
ch.show()


〇出力画像


インストール方法

Jupyterの仮想環境で以下のコマンドを実行します。
pipenv install chartify

関連情報

・Chartifyのgithubリポジトリ
https://github.com/spotify/chartify

2020年9月7日月曜日

Debian 10(Buster)にJupyter Labをインストールする(pipenv版)

Jupyter Labでインタラクティブなコンピューティング環境を提供する事ができます。

〇Jupyter Labの画面

インストール手順

1.pipenvのインストール
sudo apt-get -y install python3-pip python3-distutils python3-dev

sudo pip3 install --upgrade setuptools

sudo pip3 install pipenv

echo "export PIPENV_VENV_IN_PROJECT=true" >> ~/.bashrc

source ~/.bashrc

2. Jupyterのインストール
mkdir -p ~/jupyter

cd ~/jupyter

pipenv --python 3.7

pipenv install

pipenv install jupyterlab

mkdir -p ~/.jupyter

cat << EOF > ~/.jupyter/jupyter_notebook_config.py
c.JupyterApp.allow_remote_access = True
c.JupyterApp.ip = '0.0.0.0'
c.JupyterApp.open_browser = False
c.JupyterApp.port = 8080
c.JupyterApp.token = 'jupyter'
EOF

3. Jupyter Labをサービスとして登録
※以下の例ではdebianユーザでのサービス動作を想定しています。環境に合わせ、ユーザ名・パスを適宜変更してください。
cat << EOF | sudo tee /etc/systemd/system/jupyter.service
[Unit]
Description=Jupyter
[Service]
Type=simple
ExecStart=/home/debian/jupyter/.venv/bin/jupyter-lab
User=debian
Group=debian
WorkingDirectory=/home/debian/jupyter
Restart=always
RestartSec=10
[Install]
WantedBy=multi-user.target
EOF

sudo systemctl enable jupyter

sudo systemctl start jupyter

4. ブラウザで以下のアドレスにアクセスします。
http://<サーバ名またはIPアドレス>:8080/?token=jupyter

関連情報

・Jupyterに関する他の情報はこちらを参照してください。

2020年9月6日日曜日

Raspberry Pi(Raspbian Buster)/Debian 10(Buster)にpipenvとmoviepyをインストールする

moviepyで動画をpythonから編集する事ができます。

インストール方法

1.pipenvのインストール
sudo apt-get update

sudo apt-get -y install python3-pip python3-distutils python3-dev

sudo pip3 install --upgrade setuptools

sudo pip3 install pipenv

echo "export PIPENV_VENV_IN_PROJECT=true" >> ~/.bashrc

source ~/.bashrc

2. moviepy用の仮想環境作成
mkdir -p ~/moviepy

cd ~/moviepy

sudo apt-get -y install libpng-dev

pipenv --python 3.7

pipenv install matplotlib

pipenv install moviepy

pipenv shell

3. 動作確認用コード実行
以下のコードを実行すると、指定した動画の最初の10秒を切り出します。
from moviepy.editor import *

clip = VideoFileClip("hydrangea.mp4").subclip(0,10)
clip.write_videofile("hydrangea_opening.mp4")

関連情報

MoviePyのまとめ

・moviepyのホームページ
https://zulko.github.io/moviepy/

2020年9月5日土曜日

MoviePyとscikit-imageで動画画面に半透明の星形を描画する

MoviePyとscikit-imageで動画画面に半透明の星形を描画するには、polygon関数とCompositeVideoClipを使用します。

サンプルコード

以下のサンプルコードでは、scikit-imageのpolygon関数で星形を描画し、CompositeVideoClipを使用して動画と重ね合わせます。
from moviepy.editor import *
from skimage.draw import *
import numpy as np

clip1 = VideoFileClip("hydrangea.mp4")

img = np.zeros((clip1.h, clip1.w, 4), dtype=np.uint8)
cx = clip1.w/2
cy = clip1.h/2
points = 5
rad = 2*np.pi/points
halfrad = rad/2
outer_radius = clip1.h*0.4
inner_radius = clip1.h*0.2
starx = []
stary = []
for pl in range(points):
    starx.append(cx+np.cos(pl*rad-np.pi/2)*outer_radius)
    starx.append(cx+np.cos(pl*rad+halfrad-np.pi/2)*inner_radius)
    stary.append(cy+np.sin(pl*rad-np.pi/2)*outer_radius)
    stary.append(cy+np.sin(pl*rad+halfrad-np.pi/2)*inner_radius)

rr, cc = polygon(stary, starx)
img[rr, cc] = (255,255,192,128)
clip2 = ImageClip(img).set_duration(clip1.duration)
clip1t = CompositeVideoClip([clip1, clip2])

clip1t.write_videofile("star.mp4")


〇元動画の画面

 

〇出力動画の画面

 

 〇scikit-imageインストール
MoviePyの他、仮想環境のフォルダに移動して以下のコマンドを実行します。

pipenv install scikit-image

関連情報

MoviePyのまとめ

・moviepyのホームページ
https://zulko.github.io/moviepy/