画像入力で論理シミュレーション

ここ数日、実際の画像を入力にして論理シミュレーションを行っていた。

「そんなことできるの!?」と驚かれたけど、できるんですよ。


論理シミュレーションにあたっては適当な入力を与えて、その出力を調べることで、

回路がちゃんと設計出来ているか確認するわけだ。

シンプルな入力で確認してもいいし、オーバーフローしそうな入力での動作を確認することが出来る。

ともかく、出力が既知な入力を用意して与えればよいわけだから、

すでにソフトウェアシミュレーションで使っている画像を使うというのは理にかなった話だ。


もちろん画像データを与える回路をHDLで記述しても良いのだが、

Verilogではファイルを読み込んでレジスタに展開する機能がある。

これを使えば画像データの入ったRAMはこのように記述できる。

wire [13:0] ROM_ADDR;
reg [7:0] ROM_DOUT;
reg [7:0] ROM [0:128*128-1];
initial $readmemh("rom.hex",ROM);
always @(posedge CLK) begin
  ROM_DOUT <= ROM[ROM_ADDR];
end

$readmemhを使うと16進数データ列の書かれたファイルを用意すればいい。

こんな感じで、1行1ワードで書けばいいはず。

3F
5A

あとはそれを使ったメモリのハードウェアを記述すればいいわけ。


では、逆に出力はどうすればいいだろうか。

方法の1つは出力がある度にファイルを書き出す方法。

integer OFH;
initial OFH=$fopen("foo.dump","w");
wire DOUT_EN;
wire [7:0] DOUT;
always @(posedge CLK) begin
  if(DOUT_EN==1)  $fdisplay(OFH,"%02X\n",DOUT)
end
initial begin
  wait(END==1);
  $fclose(OFH);
  $finish;
end

$fopenでファイルを開いて、最後に$fcloseでファイルを閉じる。

$finishの前に$fcloseを入れる必要がある。$finishがないテストベンチだと都合悪いかなぁ。

ここではDOUT_EN==1となったときに、DOUTをファイルに1行書き出すようになっている。

printfのようにフォーマット指定をして書き出すので複数の変数を同時に書き出すこともできる。

今回はこんな感じで出力された順番でそのまま書き出している。

出力されたデータ列をRubyで書いたスクリプトでPGM形式に変換して画像化している。


もしくは出力用のメモリを記述して、それを最後にダンプするという方法もあるかもしれない。

wire RAM_WEN;
wire [13:0] RAM_ADDR;
wire [7:0] RAM_DIN;
reg [7:0] RAM [0:128*128-1];
always @(posedge CLK) begin
  if(RAM_WEN==1) begin
    RAM[RAM_ADDR] <= RAM_DIN;
  end
end
initial begin
  wait(END==1);
  integer OFH=$fopen("out.pgm","w");
  $fdisplay(OFH,"P2\n128 128\n256\n");
  integer y,x;
  for(y=0;y<128;y=y+1) begin
     for(x=0;x<128;x=x+1) begin
       $fdisplay(OFH,"%d ",RAM[y*128+x]);
     end
    $fdisplay(OFH,"\n");
  end
  $fclose(OFH);
  $finish;
end

ランダムアクセスで書き込まれるような場合はこっちの方がいいか。

データを書き出す段階でPGM形式にしてしまうテストベンチだが、こういうのもいいのではないかなという気はした。

テストベンチともなると回路記述とはかなり勝手が違って、普通のプログラムと同じような感じで書くことになる。


他に想定出力を$readmemhで読み込んだりして作って、それと食い違いが発生したらそれを出力するとか。

$displayでコンソールに出力できるから、それで食い違いの内容を出力すると。

大量の入出力に対するテストだとそれが想定出力との照合まで含めると効率がいいかな。

大量の入出力データを作成する方法はファイルを読み込む方法だけではないけど、

実際に即した入力でのシミュレーションとかなると、やっぱりそれが確実な気はするね。

実際の画像を入力にシミュレーションというのは無謀なようで、実は簡単な方法だと。


それでシミュレーションはうまくいったのかという話だが、かなりたくさんのバグが発見された。

カウンターのリセット条件の記述が間違えてたり、最初はひどいミスが大量に見つかった。

そのあたりを片付けたら、ちゃんとまともに出力が出てくるようになったのだが、想定出力と一致しない。

そんなわけで、いろいろ信号を取り出して、正しく動いてるか確かめて……

結果的には符号拡張のミスだったんだけど、なかなかそこに行き着くまでの道のりは長かった。

けど、これFPGAに載せてしまうと、中の信号はなかなか見えないからねぇ。その点ではこんなめんどくさいシミュレーションこそ実は効率が良いと。

もちろん、もっとシンプルなテストベンチでミスを洗い出せればそれが楽なんだけどさ。

ピンクノイズを作る

テスト用のステレオ画像として、ランダムドットステレオグラムを作って使っていたのだけど、

自然画像に近いということではピンクノイズの方が適しているのでは? という話が出てきたので、ピンクノイズを作っていた。


ピンクノイズとはなにかという話の前に、ホワイトノイズという言葉の意味を知らなければならない。

ホワイトノイズは完全に不規則なノイズのことで、周波数スペクトルがいずれの周波数でも一定となるものを言う。

これは白色光の周波数スペクトルがいずれの周波数でも一定あることにちなんだ命名だ。

ピンクノイズはホワイトノイズをもじった命名で、赤、すなわち低周波の成分が強いノイズを表している。

具体的には周波数スペクトルが周波数fに対して1/fとなるものをピンクノイズと呼んでいる。

どうも自然画像の周波数スペクトルは典型的には1/fになるそうで、

入力にピンクノイズを使えば典型的な自然画像の周波数特性を再現できるのではという話が出てきたので挑戦してみた。


一般的にピンクノイズの生成はホワイトノイズにフィルタをかけることで行う。

アナログでもデジタルでもホワイトノイズの生成は比較的容易だ。

アナログ回路だとツェナーダイオードで発生する雑音を増幅する例が紹介されている。

ホワイトノイズは完全に不規則なノイズなので、デジタルだとガウス分布の乱数列を生成すればそれでホワイトノイズになる。

そうやって生成したノイズに1/f特性のフィルタをかければよいのだが、このフィルタがちょっと特殊だ。

アナログ回路だとこんなフィルタが必要らしい。

3.3 V ノイズジェネレータ (3) (シンセ・アンプラグド)

RC直列回路をいくつも並列にすると広い周波数で-3dB/oct、すなわち1/fの特性が得られるようだ。


デジタルだと、まぁ無難にFIRフィルタですかね。

というわけで、逆フーリエ変換してフィルタを設計しましょうと。

フィルタの周波数特性は、 F(u,v)=1/√f (f=√(u2+v2) ) ということで、これを逆フーリエ変換すればフィルタが求まる。

パワーが1/fなので、振幅で言うと1/√fにしないとならんのよね。ここ要注意と。

というわけで逆フーリエ変換して求まったフィルタをホワイトノイズ画像にかけてやればピンクノイズ画像の完成となる。


じゃあこれは本当に1/fの周波数スペクトルを持っているのか?

フーリエ変換して調べてみた。が……うーん、1/fのような気はするけど、ちょっとわかりにくいなぁ。

ホワイトノイズといってもスペクトルが真っ平らというわけではなくて、ガタガタするのよね。それにフィルタをかけたピンクノイズも同様。

全体的には確かに1/fで落ちてるけど、なんかちょっとわかりにくいなぁ。


そんなわけで逆フーリエ変換でピンクノイズを作ってみた。これなら確実に1/fの特性となるはず。

周波数空間で F(u,v)=(1/√f) e (θ:0~2πの一様乱数)というのを作って逆フーリエ変換すればいい。

こうすればスペクトルが1/fで、各周波数成分の位相がランダムということでノイズが生成できる。


ホワイトノイズにフィルタをかける方法でも、逆フーリエ変換で作る方法でも、できた画像は似たような感じだ。

ホワイトノイズの画像は完全にランダムな乱数列でできているわけだから、まったくとらえどころのない画像となる。

けど、ピンクノイズは高周波成分が少ない分、低周波成分が目立つということ、でこぼこ感が感じられるようになった。

実際、どんなのか見られればいいんだけど、ピンクノイズの画像って見つからないんだよな。

研究室ならScilabでピンクノイズを作って見たが、こんな感じ。

ホワイトノイズとピンクノイズ

左がホワイトノイズ、右がピンクノイズだ。確かにホワイトノイズよりは自然な気はする。

variableはすなわち配線

久しぶりにVHDLで回路設計していた。

いろいろアルゴリズムに手を加えたのだけど、意外とすぐ実装できそう。


VHDLで回路実装をするとき、variableを適宜活用している。

variableというとこれまでもforで回路を生成するときにも使っていた。

リダクション演算子をfor loopで

ループ変数と中間変数をvariableで宣言していた。


VHDLのsignalとvariableの違いはなにか? それは代入の方法だろう。

signalの代入には <= を使い、process文では最後に代入が行われる。

一方variableの代入には := を使い、即時に代入が行われる。

A <= A + 1;
B <= A + 2;
C := C + 1;
D := C + 2;

A,Bはsignal、C,Dはvariableとして宣言されているとして、

まずsignalの場合、前クロック時点でのAが3ならば、 process文の最後で Aは3+1=4、Bは3+2=5 に更新される。

一方、variableの場合、Cに代入した時点でCが3+1=4に更新される、それからDに代入が行われるので4+2=6となる。

これ、Verilogだと宣言はいずれもregで行って、代入に使う演算子を <= と = で使い分けることで実現できるんだよね。

<=がノンブロッキング代入、=がブロッキング代入ということで、使い分けに要注意と。

もっともVerilogにしても、同じregに <= と = を併用することはできない。宣言こそ一緒だけど、使う時には区別しないといけない。


4つの入力を比較して、最大値とその入力を示すを出力する回路を作っていたのだが、

まず4つの入力を2つずつ分けて比較して、その最大値同士を比較すれば効率がよさそうだと。

というわけでこんな回路を作った。

process(CLK)
  variable MAX_01 : std_logic_vector(7 downto 0);
  variable MAX_01_ID : std_logic_vector(1 downto 0);
  variable MAX_23 : std_logic_vector(7 downto 0);
  variable MAX_23_ID : std_logic_vector(1 downto 0);
begin
  if(CLK'event and CLK='1') then
    if(IN_0 >= IN_1) then
      MAX_01 <= IN_0; MAX_01_ID<="00";
    else
      MAX_01 <= IN_1; MAX_01_ID<="01";
    end if;
    if(IN_2 >= IN_3) then
      MAX_23 <= IN_2; MAX_23_ID<="10";
    else
      MAX_23 <= IN_3; MAX_23_ID<="11";
    end if;
    if(MAX_01 >= MAX_23) then
      MAX <= MAX_01; MAX_ID<=MAX_01_ID;
    else
      MAX <= MAX_23; MAX_ID<=MAX_23_ID;
    end if;
  end if;
end process;

IN_0とIN_1を比較した最大値をMAX_01、入力番号をMAX_01_IDに一旦入れ、

IN_2とIN_3を比較した最大値をMAX_23、入力番号をMAX_02_IDに一旦入れ、

それでMAX_01とMAX_23の比較をすると。これで4つの入力全てについて比較が完了すると。


もちろん実装方法は他にもいろいろあるが、効率よく実装できるのはこの方法だし、

実際に実装する回路の姿が浮かびやすいのはこの記述ではないかと思う。

1クロックで4つの変数を比較するなら、比較器2つの先に比較器1つを接続するとよさそうだと。

ここでvariableがなにをしてるのかというと、組み合わせ回路同士の接続だよな。

いわばそれぞれのif文が比較器、最初2つの比較器と最後の比較器をvariableで接続することで順序回路の組み合わせ回路部を構成してると。

まさにそういうことを記述で来ているのではないかと。


VHDLのvariableにしても、Verilogのブロッキング代入にしても、使い所がどこかというのはあるんだけど、

順序回路の組み合わせ回路部を構成するときこそ使うべきところではないかと思う。

もっとも、さっきの回路はこういう形で書くことも出来る。

MAX_01 <= IN_0 >= IN_1 when IN_0 else IN_1;
MAX_01_ID <= IN_0 >= IN_1 when "00" else "01";
MAX_23 <= IN_2 >= IN_3 when IN_2 else IN_3;
MAX_23_ID <= IN_2 >= IN_3 when "10" else "11";
process(CLK) begin
  if(CLK'event and CLK='1') then
    if(MAX_01 >= MAX_23) then
      MAX <= MAX_01; MAX_ID<=MAX_01_ID;
    else
      MAX <= MAX_23; MAX_ID<=MAX_23_ID;
    end if;
  end if;
end process;

これでも一緒のことなんだよね。前段は組み合わせ回路として記述して、その結果を使って順序回路を記述すると。

この場合はMAX_01などはsignalで宣言することになる。

けど、記述が分散してわかりにくいし、さっきの記述の方が直感的だと思うんだよね。

見慣れない人にはなんだこれはとなりかねないのは難点ではあるのだけどさ。

学位を取り返す年末年始

朝、いつものように早起きして、電車に乗って研究室に行くと、ドアが開いている。

誰か泊まり込んでたのかな? 年始早々から相変わらずだな。ただ、その時は部屋には誰もいなかった。

うーん、誰だったんだと思ったら、去年3月に退学したドクターコースの人だった。(ドクターコースに退学はつきもの)


本来は去年3月に博士の学位を得て就職する予定だったのだが、

ことは予定通り進まず、退学して半年後の学位取得に向けて論文を完成させることになっていた。

博士の学位は忘れて出て行かれるけれども、半年後には無事取り返して、

いつか立派な研究者として大活躍される日が来ることを期待している。

なんて期待を寄せていたのだけど、それも予定通り進んでいなかったようだ。


そのことは指導教員も心配していたけど。

仕事が忙しくて博士論文どころの状況ではないということだそうで、

去年の盆休みにうちの研究室に戻ってきて作業をして、それで進んだのだろうけど、

それから論文を完成させて今年3月学位取得に向けて事が進んだわけでも無く、また停滞し、

この年末年始の休みにその作業の続きをしていたそうだ。

その結果、ほぼ完成状態まで仕上げることが出来たということで、あとはE-mailでのやりとりで完成させられるとのこと。

来年9月には学位が取得できる予定だとのことだ。よかったよかった。まだやることは残ってますけどね。


前の記事でもちょこっと書いたけど、退学後の今は他の大学の研究室で仕事をしている。

その仕事の話はぽつぽつ聞いてるんだけど、いやー、なかなか難しい課題ですねぇ。

「難しい課題だからやる意味があるんだけど」というのは全くその通りだねぇ。

なにが難しいかというのは一見するとわからんのだけど、実際やってみるといろいろぶつかることは多いようで。

へぇ~と思いながら聞いていた。確かに難題だ。

そんなお仕事が次々に降ってくるものだから、博士論文もままならんと。

ただ、仕事仲間にも恵まれてうまくやっているらしいことは伝わってくる。


ただ、それにしてもなんで研究室に泊まり込んでたのかという話だ。

話を聞いてみると、実家に帰る時間が惜しいからとのこと。

僕よりは近いと思っていたのだが、どうも話を聞くと同程度らしく、めんどくさいのは確かだ。それにしても……ねぇ。

結果として学位にぐっと近づけたのだから、よかったんでしょうけどね。

どちらかというとマイナスが基準

もう修士の2年間もまとめの時期、

年内にアルゴリズムの部分だけでも書き上げようということで、せっせと書いているわけだけど、

「これ確認しておかないと」とかそういうことがぽつぽつと。


そんな中で、論文に書いた数式の符号がおかしいことに気づいた。

実装上の数式と論文の数式が食い違ってるので、「あれ?」となったのだ。

実装は正しくできているので、論文の数式に問題があるということだ。

電車の中で点検してたんだけど、いろんなところで符号がひっくり返ってて、そりゃつじつまが合わんわなと。

修正したらちゃんと実装上の数式と一致したので、これでちゃんと修正できたはず。


なんでこんなにいろんなところで符号がひっくり返ったのかという話だが、

符号の付け方が直感に合わないところが多いんだよね。

なにより両眼視差の符号だよね。

両眼視差を表すときの符号は、視差0の注視点より近くをマイナス、遠くをプラスで表す。

平行ステレオ法では注視点が無限遠にあることに相当するので、検出対象の視差は全てマイナスになる。

近くがマイナス、遠くがプラスと言われれば確かにと思うけど、検出対象が全てマイナスと言われると違和感がある。

入力例などは実態に即してマイナスの視差を示しているから、これとの対応も混乱だらけだ。


三角関数も混乱が多い。

三角関数はsinでcosを表すことができるし、逆も当然出来る。

論文中では大半がcosで統一されているのだが、sin(φ)=cos(φ-π/2) ということで、

やたらいろんなところに –π/2 が出現することとなった。

ただ、数式を書いた時期によっては混乱もあったようで +π/2 になってるところ多数。

一貫して cos(φ+π/2)、すなわち-sin(φ) ということで数式が構成されていればさほど問題はないところではあったのだが、

ある章では +π/2、ある章では-π/2 ではいろんな表記が混在して混乱の元になる。というわけで –π/2に統一することにした。

三角関数まわりの符号はなにかとめんどくさい。


どちらもマヌケなミスではあるのだが、マイナスを中心として考えるのはなにかとめんどくさい。

それで気づいたんだけど、視差の符号の定義とか論文中に書いてないなと。

一般的に言われていることではあるけど、一貫して近い側をマイナスで表記しているということは書いておかないと。

他にもこれが基準ですよとかいうことは書いておかんとならんなぁと思った。

とりあえず明日までに修正して、書き足すようにしておこう。

工具と部品を大掃除

昨日は研究室の大掃除があった。

大掃除の対象もたくさんあるけど、僕はひたすら作業台と工具まわりの整理をしていた。

工具の入った引き出しが乱雑なことになっていることは気づいていたので。


工具はぐちゃぐちゃとはいえ、実際によく使う道具が多いから、

一部は別のところに動かして、種類ごとに箱を仕切って分類する方法でうまく整理できたと思っている。

工作前のミノムシクリップと、加工された導線が同じところに入っていて、ごちゃごちゃしていたところは、

それを分類するだけでだいぶすっきりした。

と、ここまではわりとすんなり進んだのだが……


次の引き出しを開けると入っていたのは大量の電線など。

確かに工作に使う余地のあるものはあったが、どうかんがえても使わない太い線もある。

結局は使う余地のある線のうち、切られる前の巻かれた状態のものだけ残してごそっと捨てた。

切っておいてあった線は取り扱いが面倒だし、在庫としては大量すぎるということでごっそり捨てた。


次に困ったのが、大量の基板だ。ユニバーサル基板を集めて……とやってたのだけど、

なんかピッチ変換基板の類が大量に出てきて……なんかユニバーサル基板より多い気がした。

さらに多かったのがICソケット、ただし特殊な形状のもので、確かLSIを試作したときに使ってたんだっけな。

去年の大掃除のときもアホみたいにあるということで問題提起はしていたのだが、結局処分してなかったらしい。

結局、大半は処分することになり、それでだいぶすっきりした。

それにしてもピッチ変換基板、あまりに多すぎる。

まだ、表面実装部品を2.54mmピッチに変換する基板は汎用的だからいいけど、

なんかとあるコネクタ用の変換基板とかどう考えても使わんだろと。

どうも昔はこの研究室でよく使っていたらしく、それでまとめ買いしたらしいけど、今はさっぱり。

まぁさほどかさばらないので、そのまま置いておくことにはしたのだけどさ。


さらに悲惨でもはや投げ出したのが大量のIC類、レールに入っておかれていた。

レールに説明書きが書いてあるものもあって、「汎用オペアンプ」とか使えそうだなというものがある一方で、

ぱっと見ても用途がわからないものも多い。

結局、処分できたのは、古いCPLDとか、明らかに時代遅れのICに限られた。

このCPLD、1つでいくらしたんだろうなぁ。と思いつつも、もはや使う余地がないのは自明なので。

それで処分できたICは大型のものが多く、それに付随して大型のICソケットもごそっと処分したので、

処分数の割にはすっきりさせられたが、それにしても残ったものは多い。

結局は引き出しの1つをお払い箱としてIC類を集めて保管しておくことにした。

ちゃんと分類すれば使えるものもあるはずだから。かなり骨が折れる作業だけど。


捨てる部品などを1つのゴミ袋に集めていたのだが、体積はともかく、重くて持ち上がらないほどだった。

袋を分散させて、運べるようにして、4袋ぐらいになったんだったかな。大変だった。

家に帰ってきてその話をしたら、弟に「電線類は売ればけっこうな金額になったんじゃないのと」言われたけど、どうなんだろ?

そういう発想はなかったなぁ。


今回の大掃除で、まとめ買いも考え物だなと思った。

確かに抵抗とかコンデンサとか、いろんな値の物があればすぐに使えて便利だし、

汎用オペアンプだってあって困らんだろうと思ったのだろうけど、使用機会がかなり限られるわけでねぇ。

あと、昔は使っていても使わなくなった部品も多いんだよね。

最近は注文したらすぐ部品届くし、ストックの仕方からして考えないとならんよな。

確かに使用頻度が高く、すぐ使いたい部品はストックするべきなんだけど、そんなものは置いてある部品の数にして1/4もいかないんじゃないかね。


大掃除の後は忘年会だったのですが、その忘年会の席で、誕生日を祝われまして。

そう、昨日は僕の24歳の誕生日でした。まぁこの展開は予想してたけど、ただまさかケーキが出てくるとは。

そういうサービスって飲食店ではよくあるのかな? 他の人がそうして祝われてるのを見たこと、確かにあったし。

そんなわけで朝から晩までいろんなことがあった1日だった。

アナログ回路だからFPAA

気づいてみれば、学生実験のTAも折り返し地点を越え、あと2回で終わってしまうらしい。

あっという間に過ぎ去った気もするが、あと2回もしっかりお仕事しないと。


この学生実験ではFPAAというデバイスを使っている。

Field Programmable Analog Array、

FPGAと似ている気もするが、FPGAはデジタル回路を作るLSI、FPAAはアナログ回路を作るLSIだ。

FPAAにはアナログ回路の構成要素が入っていて、それの配線をプログラムすることにより所望のアナログ回路を作ると。

これで複雑な回路を手で組まなくて済むということで実験で使っているようだ。


ところがこのFPAA、困った問題がある。

高い周波数の入力を入れると、出力がなんかガタガタになるんだよな。

どうも内部的にスイッチングで抵抗・キャパシタの値を疑似的に所定の値になるように調整してるみたいで。

FPAAの構成方法もいろいろだから、このような問題が生じないFPAAもあるとは思う。

ただ、うちで実験で使っているFPAAにはそのような問題があり、実際に学生から指摘を受けることもあった。


どうも来年の実験からFPAAの使用をやめて、オペアンプを使って直接回路を構成する方法に変わるらしい。

そこまで複雑な回路でもないので、一部をひな形としてプリント基板に起こしておけばなんとかなるだろうとの考えのよう。

確かにそっちの方がいいかもしれないね。直接オペアンプを見る方がアナログ回路の勉強にもなるだろうし。

学生の手間は増えますけどね。まぁ測定内容を多少絞り込んでやればどうってことはないだろうけど。


FPAAってのもそんな洗練されたデバイスでもないよなぁ、と思っているのだけど、

こういうプログラマブルなデバイスは自己再構成、回路自身が回路の中身を書き換えることができる。

果たして自己再構成と言えるのかよくわからんけど、ルネサスのWebサイトを見てたらこんなのを見つけた。

Smart Analog (ルネサスエレクトロニクス)

ここで”Intelligent”の項目で説明されているが、回路の動作状況に応じてマイコンから回路を書き換えることができるようだ。

センサの経年劣化に応じて、マイコンが回路の構成を動的に書き換えるような使い方が例として書かれているが、

システムが自分自身のアナログ回路を書き換えるという点では自己再構成ととらえてもよいのではないだろうか?

他にPSoCというマイコンもアナログ回路部を持ち、これを書き換えることができるとかなんとか。

なんかPSoCで今のFPAAを置き換える案もあったらしいけど、不都合があって取りやめになったそうで。

サポート材もいっしょに作る

研究室で3Dプリンターを使い始めて、最初はなかなか思うように動かず苦労していたが、

最近は多少の不具合はありながらも、うまく造形できるようになった。


3Dプリンターで造形するときは上に上に積んでいくわけだけど、

下に凹の形になる部分や、外に張り出す部分の造形を考えてみると、

下になにもないところに造形するというのはそのままではできない。

そこでそのようなところにはサポート材というのを加えて造形する。

もっとも、外への張り出しはあまり急な張り出しでなければサポート材なしでも造形できるようですが。


サポート材は3Dデータを3Dプリンターへの指令に変換するスライサーで適宜追加される。

そして、造形物と一緒にサポート材も一緒に造形されるわけだ。

そしてサポート材を切り取れば所望の造形物ができているという寸法なのだが、

さて、サポート材をきれいに切り取れるものなのか。それが問題だ。


実際どうなのかという話だけど、ある程度はうまく切り取れるみたい。

サポート材は造形物に比べるとスカスカに作ってあるので、ニッパーなどで少し切り取ればある程度は取れると。

けど、バリのようなものが残ってしまうので、サポート材があった部分の仕上がりはだいぶ粗い。

サポート材の部分だけが問題ではないが、造形物の表面をきれいに仕上げるならヤスリで削るなどの処理が必要だ。


研究室にある3Dプリンターは1種類の樹脂しか使えないが、

造形物とサポート材の材料を分けて作ることで、容易にサポート材を取り外せるようにする方法があるよう。

よく3Dプリンターで使われる材料にはABSとPLAがあって、うちでは今はABSだけで造形している。

ここで造形物をABS、サポート材をPLAとしてやると、水酸化ナトリウム水溶液でPLAだけ溶かせる、すなわちサポート材だけを除去できると。


サポート材を使わないで済むならそちらの方が良い。

例えば、バスタブのような造形物を作るとき、凹を下向きに造形するとサポート材が必要だが、上向きにすればサポート材はいらない。

下向きに造形する人なんて誰もいないと思うけど、工夫次第ということはあり得るわけだ。

外向きへの張り出しもある程度まではサポート材なしで造形できる

そういうデータが蓄積されれば、さらに効率の良い造形ができるのかなと思うところ。

学生実験の指導をするお仕事

うちの指導教員がB3の学生実験を1つ受け持っている。

それで僕がTAということで後期の実験の指導を行うことになっている。

前期はうちの研究室の他の学生がTAとして指導していた。

今日はスタートに先立ち、実験内容の説明や指導のポイントを説明してもらい、実際に自分でも実験をやってみた。


指導書に従ってなんやら測定したりする実験というのは久しぶりにやった気がする。

専攻科のときにも学生実験はあったけど、自分らでロボットを設計して作ってたからなぁ。

初めて使うツールもあるので、よく話を聞いて、実際に使ってみてなるほどと確認していた。

計測したデータをその場でPCを使ってグラフにプロットしながら測定していたのだけど、

何となく、ダイオードのI-V特性を測っていたときのことを思い出した。

急に変化する部分は細かく、あとは粗く測定していたが、そういうことを実験結果を見ながらその場で考えてもらわんとならんということだ。

そこら辺はちゃんと様子を見ながら指導していかんとならんなと思った。


ただ、B3の学生がどれぐらいできるのかはようわからんのよね。

オシロスコープだとかの扱いも怪しいという話も聞くしなぁ。

これ以前の実験でもやってるはずなんだけど、なにぶん触る機会が少ないそうで。

あと、4~5人の班の中でうまく役割分担してやってもらわんとならんわけだが、

勝手に任せておいてうまくいくかどうか。大学では実験の班だって実験中だけの付き合いであることも多いようだから。

高専でも中学校でもクラスメイト同士ならなんしかうまくやってくれるだろうけどさ。それが好ましいかはともかく。

そこら辺は学生たちの調子に合わせて適宜アドバイスを与えていきたい。


その後、夕方にはTAのガイダンスを行うと言うことで、同じく実験や演習の指導を行うTAが集められた。

採用通知書とTAの心得について書かれた資料と口座振込や税金関係の書類を受け取った。

税金関係の書類はともかく、口座振込の手続きは今までも旅費の精算のためにやってるんだけどね。

ただ、給与と旅費は別になってるんだろうね。書類も旅費のときとはまた違ったし。

来週中に研究科の事務に持って行かないといけないので、忘れないうちに書いておいた。また来週頭に持って行こう。

3Dプリンターの難しいところ

やっとこさ、研究室に届いた3Dプリンターが動くようになった。(1万円相当の3Dプリンター組立作業)

結果的には初期不良だったんだけど、届いて組み立てたものの動作におかしなところがあって、

その原因がわかり、部品を交換してもらい、やっと正しく動作するようになったのだった。


3Dプリンターというのは意外に単純なものだ。

プラスチックのフィラメント(細い線)を加熱したノズルにステッピングモーターで押し出して所定量の材料を溶かしながら、

ノズルの位置をステッピングモーターで動かし、指令通りに積層していくと、それだけだ。

モーターを精度良く動かすことさえできれば、材料を精度良く置いていくことはそんなに難しいことではない。

とはいえ、その材料を所定の形に積み上げることができるか。これが難しいのである。


まず、最初の問題は一層目の材料がベッド(造形物が乗る台)に定着するかどうかということである。

最初にラフト(いかだ の意味)を形成して底面積を増やすようにしているが、今のところはわりとうまくいってる気がする。

次に問題は所定量の材料がちゃんとノズルの先から出るかということだ。

温度が低いと材料の出が悪くなるから、調子を見ながら温度を決めないと行けない。

じゃあ温度が高ければよいのか。いや、温度が高いと、材料が焦げてしまう。ほどほどが肝心だ。


材料を積んだときには問題なくても、その後問題が生じることがある。

ABSは熱収縮が大きい材料なので、熱収縮で反ってしまうことがある。

平べったいものを形成すると端の方が反り上がってしまう傾向にある。

そうするとなにが困るか。その上に積み重ねるときに既に積み重ねた部分が所定の高さより高くなってしまっているので、

ノズルとすでに積み重ねた部分がぶつかってしまうのだ。こうして積み重なり方がおかしくなってしまう。

ここが今のところの問題である。ノズルがすでに積み重ねた部分にぶつかり、形成不良が生じるところがあるのだ。


3Dプリンターにも工夫はなされていて、ベッドを加熱することで熱収縮を緩和することができるようになっている。

さらに、成形時には段ボールをかぶせることで、冷えにくくするように工夫している。

けど、それでも平べったいものだと反り返ってしまう。なかなか難しいのだ。


仕組みは意外に簡単だと言ったけど、うまくいく成形条件を決めるのは難しいようだ。

とはいえ、わりにいい加減な設定でもある程度のものは形成できたので、大したもんだなと思った。