農系造形室

お花とものづくりについてを中心に発信します

【OrcaSlicer】1層目の定着が悪いときにすること その1 ブリムの設定

OrcaSlicerに限らず、FDMプリンタの鬼門である1層目

こんなとき気を付けたい

・プレートへの設置面積が小さい(上物の形状にもよりますが、約D10mm以下は警戒しています。)

・サポートが独立している

定着が悪い、そんなときどうする

ブリムを設定していなければ、まずはブリムを追加しよう

 

 

ブリムって何?↓これです↓

OrcaSlicerのどこを設定すればよいか

「その他」タブの「ブリムタイプ」から選択しましょう。

 

 

ブリムの種類が選択できます。

・Mouse ear

めくれやすい角にブリムが生成されます。

・Ouetr brim only

プレート接地面の外側にブリムが生成されます。

・Inner brim only

プレート接地面の内側にブリムが生成されます。

・Outer and Inner brim

プレート接地面の内側と外側にブリムが生成されます。

 

OrcaSlicerでブリムの設定をする方法についての説明は以上です。

適切なブリムの設定をして安定した1層目を印刷出来るようになりたいですね。

【農系IoT】M5を使って発酵熱をハックしてみる その2

前回の記事のデバイス部分の解説をしていきます。

前回記事は↓こちら↓

nono112002.hatenablog.com

作ろうとしているもの


M5stackでDS18B20を3個、Si7021を繋ぎ、結果をwifi(⇒LTE)でAmbientへ飛ばしてブラウザでグラフを確認できるようにする。


Ambient

ambidata.io


登録してログインをしてチャネルを作るとチャネルIDとライトキーが発行されますので、コードにいれたらデータを飛ばせるようになります。便利!

⇒こちらまた別途記事書きます。

使用機器

Wifiに簡単に接続できるためマイコンはM5Stackを使用を選択した。

①Si7021 温湿度センサ(外気測定(DS18B20が怪しかったときの校正用))

Si7021搭載 温湿度センサモジュールwww.switch-science.com


M5stackは画面中央の赤いコネクタがI2Cコネクタ

SCL⇒C、SDA⇒D、5V,Gと接続して回路は完了

今回はコードを触る感覚のリハビリのためArduinoを選択

「 Adafruit Si 7021 Library」 という ライブラリ と、「 Adafruit Unified Sensor」というライブラリをインストールします。

②DS18B20 防水プローブ

https://amzn.asia/d/5St17F6


1.外気計測用

2.標準区計測用

3.対照区計測用

計3個使用


配線方法などは↓こちら↓の記事を参考にさせて頂きました。

qiita.com


ライブラリのインストールなど↓のHPを参考にさせて頂きました。

7ujm.net




各センサにアドレスが割り当てられているので、そのアドレスをメモる必要があります。

↓のコードをAruduino Unoに入れてアドレス取得用マイコンを作りました。

#include <OneWire.h>
#include <DallasTemperature.h>

OneWire oneWire(4);
DallasTemperature sensors(&oneWire);
DeviceAddress temp;

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

  sensors.begin();
  sensors.getAddress(temp,0);
}

void loop(void)
{
  for(int i=0;i<8;i++){
    Serial.print(" 0x");
    Serial.print(temp[i],HEX);
  }
  Serial.println();
  sensors.requestTemperatures();
  Serial.println(sensors.getTempC(temp));

  delay(500);
}

M5スタックのコードは以下です。

※解説は別途

#include <M5Stack.h>
#include <WiFi.h>
#include <Ambient.h>
#include "Adafruit_Si7021.h"
#include <OneWire.h>//温度表示確認用DS18B20用
#include <DallasTemperature.h>//温度表示確認用DS18B20用
#define SENSER_BIT    9      // 精度の設定bit

//温度表示確認用DS18B20用(1)
#define ONE_WIRE_BUS 26 // データ(黄)で使用するポート番号

OneWire oneWire(ONE_WIRE_BUS);//DS18B20用
DallasTemperature sensorsds(&oneWire);//温度表示確認用DS18B20用

DeviceAddress temp1 = {0x28,0xF4,0x97,0x96,0xF0,0x1,0x3C,0xEA};//orenge 
DeviceAddress temp2 = {0x28,0xB8,0xF5,0x96,0xF0,0x1,0x3C,0x70};//blue 
DeviceAddress temp3 = {0x28,0x59,0x73,0x96,0xF0,0x1,0x3C,0x39};//brown

const char* ssid ="SSID";    //使用したいwifiルーターのSSIDを入力
const char* password = "password";      //使用したいwifiルーターのpasswordを入力

WiFiClient client;
Ambient ambient;

unsigned int channelId = 45848;
const char* writeKey = "eca583f868caeea9";

Adafruit_Si7021 sensor = Adafruit_Si7021();

void setup(void){
M5.begin();
Serial.begin(9600); //温度表示確認用DS18B20用

sensorsds.setResolution(SENSER_BIT);//温度表示確認用DS18B20用
pinMode(ONE_WIRE_BUS,INPUT);

WiFi.begin(ssid,password);
while(WiFi.status() != WL_CONNECTED){
delay(500);
M5.Lcd.print("_");
}
M5.Lcd.print("\r\nWiFi connected\r\nIP address:");
M5.Lcd.println(WiFi.localIP());
ambient.begin(channelId,writeKey,&client);

if(!sensor.begin()){
M5.Lcd.println("Did not find Si7032 sensor");
while(true){
delay(0);
}
}

}

void loop(void){
float temp = sensor.readTemperature();
float humid = sensor.readHumidity();
M5.Lcd.printf("temp:%.2f,humid:%2f\r\n",temp,humid);

//温度表示確認用DS18B20用(1)
sensorsds.requestTemperatures();              // 温度取得要求
M5.Lcd.println(sensorsds.getTempC(temp1));  //温度1の取得&シリアル送信
M5.Lcd.println(sensorsds.getTempC(temp2));  //温度2の取得&シリアル送信
M5.Lcd.println(sensorsds.getTempC(temp3));  //温度3の取得&シリアル送信
int t1 = sensorsds.getTempC(temp1);
int t2 = sensorsds.getTempC(temp2);
int t3 = sensorsds.getTempC(temp3);

ambient.set(1,temp);
ambient.set(2,t1);
ambient.set(3,t2);
ambient.set(4,t3);
ambient.send();
delay(1000**60*15*);
}

【農系IoT】M5を使って発酵熱をハックしてみる その1

冬になると来春用の野菜苗を育てるために温床という苗床を作ります。

そのときに落ち葉、米ぬか、鶏糞、牛糞、油粕などを混ぜて、微生物の活動によって熱がでるのですが、C/N比というものと微生物の働き、それによる分解がどう関係しているのかをしりたくなりました。

なんか思ったより面白くて年末年始は鶏糞に夢中でしたのでシェアします。

C/N比というもの

YANMAR HPより

https://www.yanmar.com/jp/agri/agri_plus/soil/articles/03.html

C/N比(炭素率)とは有機物に含まれる窒素に対する炭素の割合を示す数値です。微生物は、有機物に含まれる炭素(炭酸ガス)をエネルギー源として、また窒素をタンパク源として利用し増殖します。

そして、この微生物が生存と増殖を繰り返すことで、窒素や炭素を消耗することでC/N比が低下します。つまり堆肥化とは、C/N比を下げていくことを意味しています。

有機物の分解には微生物の増殖が欠かせません。窒素が必要です。稲わらなどC/N比の高い(炭素の多い)有機物は分解の過程で窒素を消費します。しかし、有機物自体で窒素をまかなえない場合は、土壌の窒素も利用します。その結果、作物が吸収するはずの窒素が稲わらの分解に利用され生育が阻害されます。これが窒素飢餓です。

窒素飢餓を起こさないためには、窒素を多く含む牛糞や豚ぷんなどの窒素肥料を補う必要があります。また、堆肥の発酵には適切な水分が重要で、水分の多い牛糞や豚ぷんなどを材料とする場合には、バークやおがくずなどで水分を調整し、通気性を良くし、発酵を促します。

(表1)にさまざまな有機物のC/N比を示しました。

実際に温床を作ってみることにした

①標準区 約10Lプランターに下記の3種類の有機物を積層する

 1.落ち葉(C/N比高)

 2.米ぬか(C/N比普通)

 3.鶏糞(C/N比低)

②対照区 約10Lプランターに下記の3種類の有機物を積層する

 1.落ち葉(C/N比高)

 2.米ぬか(C/N比普通)

 3.牛糞(C/N比普通)

結果の予測

①に対して②が温度上昇及び下降が緩やかで長持ちする(はずでしょ!?)

計測機器

マイコンはM5Stackを使用

コード等製作プロセスは別途

①Si7021 温湿度センサ(外気測定(DS18B20が怪しかったときの校正用))

Si7021搭載 温湿度センサモジュール — スイッチサイエンス

②DS18B20 防水プローブ

https://amzn.asia/d/5St17F6

1.外気計測用

2.標準区計測用

3.対照区計測用

計3個使用

③AtomCam2

https://www.atomtech.co.jp/products/atomcam2

腐食の進行を定点観測

計測方法

・温度情報

籠に標準区、対照区の試験部材を入れ、それぞれにDS18B20を挿入した。

ビニールの影響を差分するために、標準区と対照区の間にDS18B20(外気温2)を設置した。

さらにビニールの影響と外気温を比較するためにSi7021(外気温)はビニールの外に設置した。

 

15分置きに温度のデータを取得し、ambientに送信する。

グラフの識別は以下

試験区

標準区(米ぬか、鶏糞、落ち葉):青

対照区(米ぬか、牛糞、落ち葉):橙

外気温(ハウス内温度):緑

外気温2(試験区内温度):茶


AtomCam2はビニールの中で腐食が進む様子をモニタリングするために設置

実験結果

標準区(米ぬか、鶏糞、落ち葉):青

対照区(米ぬか、牛糞、落ち葉):橙

外気温(ハウス内温度):緑

外気温2(試験区内温度):茶

気温(アメダス):灰

試験結果まとめと考察

標準区は試験開始から3日目(12/27)から外気温を超えて6日目(12/30)に最大で50℃を超えた。

対照区は試験開始から4日目と5日目で20℃に達し、最大の温度を示した。6日目には低下傾向にあった。ただし、気温を超えていないため、自家発熱か、気温の影響かは判断出来ない。

⇒低C/N比の鶏糞 は短期的に微生物の活性を上昇させることが分かった。

⇒牛糞は保水力があり、気温の影響を受けにくいことが分かった。

標準区、対照区ともに試験開始から5日目~6日目を境に温度は低下傾向。

⇒たい肥は施肥してから1週間くらい置いてから定植をするという通説と微生物の発熱の傾向が一致した。

結論

温床には鶏糞。

たい肥を入れてから1週間は定植しないほうがいい。

これらは都市伝説では無かったということでした。

 

PythonでSTLデータを作成 その1:numpy-stlを使って植木鉢用受け皿のモデリングに挑戦! #CAD自動化

ChatGPTなどのいわゆるAIサービスが普及しつつあり、色々な事務仕事が簡単に自動化出来るようになりました。

私は普段3D CADを使って製品の形状を書いている訳ですが、一向にモデリングの自動化の気配を感じません。早く楽になって欲しいけど、実際自動化しようと思ったらどうやるんだろうという興味が湧いてきたので、簡単なもののモデルをPythonを使って書いてみようと思います。

今回書くモデルは観葉植物などの植木鉢の下に敷くあれ、受け皿のモデリングPythonを使ってトライしたのちに、鉢のサイズに合わせて後から自動で変更出来るように作ってみます。

まずはコマンドプロンプトからライブラリをインストールします。

〜
pip install numpy numpy-stl
〜

今回作成したコードはこちらです。

import numpy as np
from stl import mesh
import argparse

def create_complete_cylinder_with_depressions(diameter, height, filename='flower_saucer.stl'):
    diameter = diameter +4 #フランジ分を追加、引数には鉢底の直径を入力してほしい
    radius = diameter / 2.0
    first_offset_radius = radius - 2  # 最初のくぼみの2mmオフセット
    first_depth = 1  # 最初のくぼみの深さ1mm
    second_offset_radius = radius * 0.8  # 2番目のくぼみの半径
    second_depth = height - 2  # 全高から2mm残す深さ
    second_base_offset_radius = second_offset_radius - second_depth  # 2番目のくぼみの底面の半径
    num_points = 100

    # 円周上の点を生成
    angles = np.linspace(0, 2 * np.pi, num_points, endpoint=False)
    base_circle = np.array([np.cos(angles) * radius, np.sin(angles) * radius, np.zeros(num_points)]).T
    top_circle = np.array([np.cos(angles) * radius, np.sin(angles) * radius, np.full(num_points, height)]).T
    first_depression_top = np.array([np.cos(angles) * first_offset_radius, np.sin(angles) * first_offset_radius, np.full(num_points, height)]).T
    first_depression_base = np.array([np.cos(angles) * first_offset_radius, np.sin(angles) * first_offset_radius, np.full(num_points, height - first_depth)]).T
    second_depression_top = np.array([np.cos(angles) * second_offset_radius, np.sin(angles) * second_offset_radius, np.full(num_points, height - first_depth)]).T
    second_depression_base = np.array([np.cos(angles) * second_base_offset_radius, np.sin(angles) * second_base_offset_radius, np.full(num_points, height - second_depth)]).T

    # STLファイルに保存するためのデータ構造を作成
    data = np.zeros(num_points * 12, dtype=mesh.Mesh.dtype)
    cylinder_mesh = mesh.Mesh(data, remove_empty_areas=False)

    # 三角形を作成してメッシュに追加
    for i in range(num_points):
        # 底面の三角形
        cylinder_mesh.vectors[i * 12] = np.array([base_circle[i], base_circle[(i + 1) % num_points], [0, 0, 0]])
        # シリンダーの側面
        cylinder_mesh.vectors[i * 12 + 1] = np.array([base_circle[i], top_circle[i], base_circle[(i + 1) % num_points]])
        cylinder_mesh.vectors[i * 12 + 2] = np.array([base_circle[(i + 1) % num_points], top_circle[i], top_circle[(i + 1) % num_points]])
        # 最初のくぼみでトリムされた上面の残り
        cylinder_mesh.vectors[i * 12 + 3] = np.array([top_circle[i], first_depression_top[(i + 1) % num_points], first_depression_top[i]])
        cylinder_mesh.vectors[i * 12 + 4] = np.array([first_depression_top[(i + 1) % num_points ], top_circle[(i + 1) % num_points], top_circle[i]])
        # 最初のくぼみの側面
        cylinder_mesh.vectors[i * 12 + 5] = np.array([first_depression_top[i], first_depression_base[i], first_depression_base[(i + 1) % num_points]])
        cylinder_mesh.vectors[i * 12 + 6] = np.array([first_depression_top[(i + 1) % num_points], first_depression_top[i], first_depression_base[(i + 1) % num_points]])
        # 最初のくぼみの底面
        cylinder_mesh.vectors[i * 12 + 7] = np.array([first_depression_base[i], first_depression_base[(i + 1) % num_points], second_depression_top[i]])
        cylinder_mesh.vectors[i * 12 + 8] = np.array([first_depression_base[(i + 1) % num_points], second_depression_top[(i + 1) % num_points], second_depression_top[i]])
        # 二番目のくぼみの側面
        cylinder_mesh.vectors[i * 12 + 9] = np.array([second_depression_top[i], second_depression_base[i], second_depression_top[(i + 1) % num_points]])
        cylinder_mesh.vectors[i * 12 + 10] = np.array([second_depression_top[(i + 1) % num_points], second_depression_base[i], second_depression_base[(i + 1) % num_points]])
        # 二番目のくぼみの底面
        cylinder_mesh.vectors[i * 12 + 11] = np.array([second_depression_base[i], second_depression_base[(i + 1) % num_points], [0,0,height - second_depth]])

    # ファイルに保存
    cylinder_mesh.save(filename)

def main():
    parser = argparse.ArgumentParser(description="Generate an STL file for a cylinder with depressions.")
    parser.add_argument("diameter", type=float, help="Diameter of the cylinder")
    parser.add_argument("height", type=float, help="Height of the cylinder")
    args = parser.parse_args()

    create_complete_cylinder_with_depressions(args.diameter, args.height)

if __name__ == "__main__":
    main()


〜

こちらのコードをstl_make_flower_saucer.pyという名前を付けて保存して
コマンドプロンプトから実行します。
ファイル名の後に 直径 高さ の情報を引数として入力します。

〜
python stl_make_flower_saucer.py 100 10

stl_make_flower_saucer.pyが保存されているフォルダにflower_saucer.stlが生成されました。

Orcaスライサーで開いたflower_saucer.stl

直径100mm 高さ10mmの受け皿の3Dデータが出来ました。
引数を変えてあげると

受け皿の直径が50mmに変更されました。

Pythonを使って3Dデータを作成して
引数で形状変更をすることが出来ました。

今日は一旦ここまで。

OrcaSlicerのダウンロードからセットアップまで

現在AnkerM5という3Dプリンタを使用しているのですが

どうも純正スライサーが調子が悪いので、OrcaSlicerを試してみたいと思います。

ダウンロード~セットアップまでの備忘録

 

2024/4/16現在

github.com

こちらのgithubに公開されている.zipファイル(ページ下方)をダウンロード

私はWin(10)を使っているのでWin64.zipをダウンロードします。

 

zipをダウンロードしたらまずは展開をします。

orca-slicer.exeを起動します。

以下をセットアップで聞かれます。

・国の選択

3Dプリンタの機種の選択

・材料の選択

・バンブー(3Dプリンタのメーカ名)のプラグインを入れるか

ここでfinishを押したら

最新版に更新しますか?と聞かれて飛ばされたのが↓こちら

github.com

また同じようにダウンロードして、

OrcaSlicer_Windows_Installer_V2.0.0.exeを起動します(今回は.zipじゃなかった)

するとセットアップが始まり、先ほどダウンロードしたOrcaSlicerのバージョンがあがりました。



ここまででセットアップは完了です。

いけばなのすすめ

普段は設計・ものづくり屋さんとして工業製品、農業関連の設計や製作をしています。実家が花屋ということもあるのか?ないのか、いけばなが好きで度々依頼を受けていけばなを題材にしたワークショップを開催しています。
いけばなは作品の出来栄えそのものよりも、製作の過程で「自分と向き合う」ことでより、花が生きてくるという感覚が実感できる、また素敵だと思ったお花を選んで組み合わせることで作品が完成するので割とお手軽に「作り手」になれるよいワークだと感じています。
 子供から大人まで色々な方に個人的におすすめしていますが、この記事ではおすすめしたい内容を「いけばなを経験したことが無い大人の方向け」にお伝え出来ればと思います。

分が作ったものが答え
 

 いけばなは「これでよし」と自分で決めたところで完成します。普段は「すでに決まっていること」の中で過ごす時間が多く、答えがあることが当たり前になっていたりすると「自由の中で、自分で決める」ことへ戸惑いを感じるかもしれませんが、自分が美しい、面白い、綺麗など感じたことが伝わる作品になったか、自由の中での葛藤を通して、是非感性的に悩むことを楽しんで頂きたいなと思います。花は基本的に切られた状態のものを使用することになりますので自分が迷っている、手に持っている間だけ花が弱ります、そういった性質もあり何日もかけて作品を具現化していくというものではないです。自分の意志で初めて、自分の意志で終える、そのサイクルが長くて1時間程度で経験出来る良いコンテンツだと思います。終わりを楽しむという意味でおすすめなのは1度に何作品も作るのではなく、緊張感をもって1作品を完成させることです。(1作品を緊張感をもって製作出来る方は結果的に何作品か作ってもらっても構いません)

ワークショップ参加者の作品(小学生)

 

切る緊張感と向き合う

 前項でいけばなの終わり方に触れましたが、その製作プロセスも判断の連続になります。分かりやすい事例として、形などを整えるために枝や葉、ときには花を切り落とすことが求められるのですが、これが当然後戻りが出来ないので勇気が必要です。このように製作を進める中で切るきらないの判断、折る折らないなどの判断が連続して迫られます。すぐに切れる方もいますし、迷いに迷う方もいます。
 私はすぐに切れるほうなんですが、割とあとから、あーもう少し長く使いたかった~(汗。ということもあります。繊細に考え出すとすごく繊細な行為ですが大胆さも求められます。迷えば迷いが花に出る世界だと痛感します。
 ただし切ってしまったその花を今度はどう生かすか、その花を起点に違うアイデアが生まれます。

観察すること、感じ取ること

 お花については必ずしもお花屋さんなどで購入しなければならないものではありません。自分で育てた花、もしくは庭などの採取可能な場所に自生している植物、つまり根と葉と花がつながった状態の花を自分で選んで切ってみることも楽しいです。その植物がどのように生きてきたか、それを知った状態で切ることでよく花と花が育った環境を見るようになるからです。この花を、この葉をどう使おうかな、咲きそうだな・・・花が終わりそうだな・・・と無意識に観察する状態に入ると、線や線や表情などがありありと伝わってくるようになるでしょう。そしてその中から自分が「今」面白いと思ったものを切っていけましょう。
 お花を用意してもらったときにも、その中から美しい!面白い!綺麗!など自分の感覚に訴えてくるものを選ぶのが良いと思います。そしてそれが伝わるように工夫しながら作品を製作します。相手に何を伝えたいか、は製作者側の解像度の範囲外へは出ることはありません。伝わるかどうかは見る側にゆだねられるので、伝わるかどうかはまた別の話ですが。いけることが上手な方は見ることも上手なことが多いです。普段のコミュニケーションのようですね。
 私は自分の作品を展示会などに出展する際は自分で育てた花を使います。ワークショップの中でも私が育てた花を持っていくこともありますので是非切ってみて欲しいです。(畑でワークショップにもチャレンジしてみたい・・・)

自由と向き合う

私の学んでいる流派、池坊では「自由花」というスタイルがあります。自由花なので自由です。自由と言っても私はそのときにある花材、置きたい場所、見せたい人などそのときの要件で形が決まってきていると感じています。さあ自由です、と言われたときの自分がどう形を作っていくかということに注目するのも面白いかもしれません。これも人それぞれです。最初に完成の大体の雰囲気を思い描いてから始める方、1本1本挿す度に次の一手が決まる方など。
いけばなには「手直し」という行為があります。自分が完成した、と思ったタイミングで先生や先輩にアドバイスを貰います。少し花の向きを変えたり、ここにこれを足して、これを抜いてと助言を頂けます。私は割と自分の作品を触ってもらうことが好きで、誰かの手によって自分の花の表情が変わる瞬間にパズルがはまったような感じがします。より花がのびのびとしてくれればその手は私じゃなくてもOK派です。逆に触られたくないという方もいると思います。アドバイスは聞きつつも自分の思った通りにいけたい。良い花をいけようと思えば結局は自分と向き合うしかないと思いますのでそれもまた良いと思います。

ここまで、いけばなのワークショップのおすすめポイントを挙げてみました。いかがでしたでしょうか?体験してみたい方はお知らせください。