SSブログ
English Version

3DプリンタBambuLabA1miniの購入 [購入]

 
1.はじめに
 「デルタ式3Dプリンタ(Kossel Reprap)の購入」の記事で書いた2017年1月に購入したデルタ式3Dプリンタは今でも調子良く動いていますが、昨今の高速な3Dプリンタにも興味があります。

 Bambu Lab A1 mini(以降 A1mini と記す)が「ブラックフライデーセール 10/22(火)~12/6(金)」で定価¥52,800のところ¥29,800に値引きされていて「0.2mmノズル付きホットエンド」¥1,584(2割引き)と共に注文しました。メルマガ登録で更に2千円引きで、この背中への圧力には耐えられませんでしたw

 荷物が着荷したのでファーストインプレッション的なものを書いてみます。


2.組立は超簡単
 A1mini はネット上では中々いい評判です。開梱からセットアップまでの情報はネット上に沢山あるのでそちらを参照して欲しいですが、ネジを数本取り外したり締め付けたりするだけで動作可能な状態になります。
 今回はフィラメント切り替えオプション(AMS lite)は無しですが、唯一、少し悩んだ点として「PTFEチューブをフィラメントハブ(4つの穴が開いている)のどの穴に入れるか」です。結果としては左手前の穴に入れました。構造から考えてどの穴でもよかったものと推測します。また、弄っていて判ったのですがPTFEチューブを抜く時はチューブカップラーのように外枠を押すと抜けます。

 下の写真は組み立てが完了した状態のものです。付属のフィラメントスプールホルダは取り外し「フィラメントスプールホルダの製作(その3)」の記事で書いたスプールホルダを使っています。

A1mini 組立後の様子


3.サンプルデータの出力
 最初にWiFiに接続すると直ぐにミドルウェアのアップデート要求があり、最新バージョン(01.03.01.02)になりました。次に全体のキャリブレーション(約27分)を実施する必要があります。
 Banbu製の白いPLAフィラメントが 20g 添付されていたのでサンプルデータの中の「Pocket Copter」を出力してみました。
 ディフォルトでは出力の度に振動と流量のキャリブレーションがあり、印刷時はかなり静かなのですが、振動キャリブレーションの時は少しうるさいです。また、フィラメントの流量キャリブレーションではフィラメントを丸めたゴミを2個、A1mini が左側に投げ捨てますw
 下の写真は出力されたパーツです。白いので写真では良く判りませんが驚くほど綺麗です。積層間隔は0.2mmだと思いますが積層痕が殆どありません。

Pocket Copter 出力部品


 組み立てると下の写真のようになります。ネジの部分もピッタリでプロペラ部分もスムーズに回転します。今までPLAは加工性が悪い(硬くて削ったりし辛い)ので敬遠してきましたが、これほど綺麗なら使いたくなってしまいますね。
 でもこの綺麗さは側面がなだらかで崩れにくい等、元データが素晴らしいという要素も多分にあると思います。

Pocket Copter 組立後の様子



4.PETGフィラメントでの自作STLファイルの出力
 STLファイルをスライスするためにはパソコンに Bambu Studio をインストールする必要があります。フィラメント設定で「Generic PETG」を選択するとノズルの温度が 255℃ に設定され(従来使っていたプリンタではeSUMのPETGを1層目:235°、2層以降:230°で使っていた)、流量比も何故か少な目(0.95)になっていましたがまずはそのままで出力してみました。 サンプルとしてポケコンのコネクタ部の自作部品を出力しました。

 下図は出力時の Bambu Studio の画面キャプチャです。再生ボタンを押すと A1mini の内蔵カメラがとらえた画像が表示されます。また、外部スプールの表示はパソコン側で選択したフィラメントではなく、A1mini のタッチパネル操作で設定したフィラメントが表示されているようですが、スライス自体はパソコン側で行っているのでパソコン側で設定したフィラメントのパラメータで動作します。スライスしたデータを A1mini に送信する際は WiFi 経由で直接 A1mini に送信するのではなく、クラウド経由になるのが少し謎ですね。

出力中のパソコン画面


 下の写真が出力したもので、突起部分の強度が弱く、手で力を入れると直ぐに折れてしまいました。

PETGで出力したコネクタ部品


 ノズルの移動速度が速いために積層間の結合が弱いのかと推測しましたが、ノズル温度を従来の235℃/230℃に設定し、流量比も1.0に変更してみたところ、強度は問題ない状態になりました。ノズル温度が高い程積層間の結合が強くなりそうなものですが、温度が低く粘性があった方がねっとりと積層され強度が増すようです。上の写真の左側は変更したパラメータで出力したものです。

PETGの変更後のパラメータ



5.PETGフィラメントでの出力比較
 PETGフィラメントでの出力状況を試すために自作した洗面所のフィルタを従来のプリンタと A1mini の両方で出力してみました。
 下図は従来のプリンタのスライス結果を表示している画面です。

従来のプリンタのスライス結果表示画面


 下図は A1mini のスライス結果表示画面です。A1mini の印刷は高速ですが、キャリブレーション等の準備時間が6分弱あるので全体では 17m6s の時間が掛かります。一方上記のデルタ式では 12m8s で A1mini より速くなっています。デルタ式は構造上、ノズルを速く動かせるという点もありますが、もっと大きいものを出力する場合には A1mini の方が速くなるでしょう。また、フィラメントを交換しない場合、キャリブレーションが出力の都度必要なのかも今後の確認事項にしたいと思います。

★追記 2024/11/01 {
 デルタ式ではベッドとノズルを設定温度まで上げるのに5分程度かかるので造形開始から終了までの時間は A1mini とほぼ同じになります。
}
A1mini のスライス結果表示画面


下の写真の左側が従来のデルタ式プリンタで出力したもので右側が A1mini で出力したものです。上にあるのは A1mini での流量キャリブレーション時に投げ捨てられるフィラメント玉です。
 従来のプリンタはノズル部で出力したフィラメントの冷却ファンの風が弱く、細長い部分は冷却不足で荒れてしまう傾向がありました。A1mini では流石に冷却ファンは強力なようで(最大稼働時には結構音もでる)荒れ現象は発生していません。側面も A1mini(少し段差がありますがつなぎ目の部分でこれ以外の側面はつるりとしています)の方が綺麗ですね。

従来のプリンタとA1miniの出力比較



★追記 2024/11/04
 「フィラメントの湿気対策(その4)」の記事に A1mini 用のフィラメントボックスの制作について記載しました。

nice!(0)  コメント(0) 
共通テーマ:趣味・カルチャー

フィラメントスプールホルダの製作(その3) [3D_printer]

 「デルタ式3Dプリンタ(Kossel Reprap)の購入」の記事で書いた2017年1月に購入したデルタ式3Dプリンタはステッパーの静音化したりなどして未だに調子良く使えています。
 しかし、昨今の高速な3Dプリンタにも興味深々で、Bambu Lab A1 miniが「ブラックフライデーセール 10/22(火)~12/6(金)」で定価¥52,800のところ¥29,800に値引きされていたので「0.2mmノズル付きホットエンド」¥1,584(2割引き)と共に注文しました。更にメルマガ登録で2千円引きで、この背中への圧力には耐えられませんでしたw

 Bambu Labと言えばフィラメント自動切換えが思い浮かびますが切換えオプション(AMS lite)付きだと¥58,800になるので今回は切換えオプション無しにしました。

 フィラメントの湿気対策のためにフィラメントスプールホルダを作成するにあたり「フィラメントスプールホルダの製作(その2)」の記事で書いたものは横幅が広すぎたので適切な幅になるように改善することにしました。

 下の写真はeSUMのスプールですが、幅が6cm程あります。

eSUMのスプール


 他社の物も何個か確認しましたが、幅はほぼ同じでした。冒頭で書いた記事で作成したものは幅が 104mm でかなり余裕があったので今回は幅を 80mm に縮小することにしました。

 下図が改善したスプールホルダのCAD画面です。防湿ボックスの中で運用し易いようにスプールの外周をホールドする外周支点型で紫色の部分は外径19mm、幅6mm、内径6mmの品番 626ZZ のボールベアリングです。

改善した外周支点型スプールホルダ(幅80mm)


 背面が下図になります。大きな部品は出力にも修正にも時間が掛かるので、分割した部品を連結するようにしています。

改善した外周支点型スプールホルダ(背面)


 下図は3Dプリンタで出力したベース部分の部品です。フィラメントはPETGを使いました。アクセントをつけるためにフィラメントを取り換えて2色構成にしてみました。

スプールホルダのベース部品


 下の写真はベースパーツの背面です。ねじを使わずにしっかりと結合しています。

スプールホルダのベース部品(背面)


 回転するロール部分は使いかけのABSフィラメントで出力してみました。最近はいつもPETGフィラメントを使っていて、ABSフィラメントは殆ど使っていません。ベッドの温度を80℃にして剥がれ防止のためにこれも久々にベッドにケープを塗布しました。

スプールホルダのロール部品


 完成したスプールホルダが下の写真です。ベアリングは手持ちの内径 6mm 外径 19mm 厚さ 6mm の 626ZZ を使っています。

完成した外周支点型スプールホルダ


 スプールを乗せるとこんな感じになります。多色の部品にしたことでデザイン的にもいい感じですねぇ^^

外周支点型スプールホルダとスプール


 今回作成したスプールホルダのSTLファイルは下記からダウンロード可能です。
 使用したベアリングは外径19mm、内径6mm、幅6mmの品番 626ZZ のものです。
 商用目的以外であれば使用可能とします



★追記 2024/11/04
 「フィラメントの湿気対策(その4)」の記事にフィラメントボックスに格納し易いようにスプールホルダの横幅を小さくする改造の内容を記載しました。


[TOP] [ 前へ ] 連載記事 [ 次へ ]
nice!(0)  コメント(0) 
共通テーマ:趣味・カルチャー

8インチFDドライブの発掘 [RetroDevice]

 昔の荷物を整理していたら捨てたとばかり思っていた8インチのフロッピーディスクドライブ(YD-180-1603)が出てきました(^^)/
 40年以上前にこのFDDを使って自作のZ80ボードでCP/Mを動かしていました。自作と言っても当時トランジスタ技術という雑誌に連載されていたものを自分なりにモディファイしながら作ったものです。このマイコンはまだ手元にありますが既にあちこち故障していて今では動く状態ではありませんが、FDC等の部品は再利用できると思います。

 このFDDは今となってはかなりのレア品だと思います。ネットでマニュアルを探してみましたが見つからず(YD-180-1601の物はありましたが中身がかなり異なっていた)、唯一メルカリで1000円で売りだされていました。あの時代のものはネットから得られる情報も希薄でロストワールドですね。その後、本棚の奥からマニュアルも発掘できました(^^)

発掘したYD-180-1603の取扱説明書


 このFDDを動かすためには5V(1A)と24V(1A)の2電源が必要なのですが、この電源と接続用のケーブルは捨てた記憶が鮮明にあり、探しても出てきませんでしたorz

 気が向いたら動かしてみたいと思いますが、背中を押すために AliExpress さんで2出力のスイッチング電源を手配しておきました。
 YD-180 は今となってはかなりのレア品なので今後手を付けられなかった場合でも写真として記録に残しておくことにしました。

 まずは箱入りの状態からです。40年前の物とは思えないですね。

YD-180の箱入り状態の外観(その1)


 側面には手書きのシリアル番号のラベルが貼られています。

YD-180の箱入り状態の外観(その2)


 箱から取り出し、発泡スチロールの緩衝材を開けた状態が下の写真です。当時は塵等からの保護のためにビニール袋に入れた状態で使用していました。この写真では良く見えませんがビニールテープを固定しているガムテープは流石に長い年月を感じさせる程にカピカピの状態でした。

発泡スチロールに保護されたYD-180


 次はお待ちかねのプリント基板の部分です。ベルトも長い年月の経過を感じさせない程、しなやかな状態でした。
 尚、これ以降の写真はクリックするとかなり大きめの写真が表示されます。

YD-180のプリント基板


 下の写真はコネクタ部分をアップしたものです。ケーブルを捨ててしまったのが悔やまれますが、再度作成するのは簡単だと思います。

YD-180のコネクタ部分


 下の写真がフロントパネル部分です。フロントパネルの側面にガムテープの接着剤が固まったものが残っていますが、アルコール等で簡単に取れると思います。
 また取説によると横置きの場合は基板面を下にする必要があるとのことです。因みに当時は縦にして使っていました。

YD-180のフロントパネル


 下の写真の様にメカ部分も特に問題は無いようですね。

YD-180のメカニック部分


nice!(0)  コメント(0) 
共通テーマ:趣味・カルチャー

1辺が1から10までの正方形のレイアウトパズル [Puzzle]

 旧Twitterのタイムラインで1辺が1から10までの10個の正方形を傾けずにできるだけ面積の小さい長方形内に並べるというパズルを見かけました。

 探索プログラムを作るより、手を使って解いた方が速そうだったのでエクセル上で考えてみました。



 上記のメッセージへのリプライで書いたように面積が 405 の長方形に収めることができます。また、この面積が最小であることを演繹的に証明することもできそうです。

 しかし、それ程凝らない作りであれば探索プログラムを作るのも割合簡単なので作ってみました。枝刈りのロジックを殆ど実装していない状態ではありますが、今時のパソコンであれば直ぐに全探索できるだろうという予測に反して意外にも全探索を完了するのに20分弱掛かりました。

★追記 2024/09/14 {
 高速化してみました。今、使える実行環境が貧弱なノートPC(Celeron(R) 1.10GHz、RAM 4GB)で変更前のプログラムの実行時間が以前測定した20分弱から35分になったので通常使用しているディスクトップPCより1.8倍遅いと言うことになります。高速化した結果、上記と同様の条件での探索時間は35秒でした。最小面積の解をカウントしない場合(serchでのリカーシブコールの条件式を等号無しの不等式のみにする)の実行時間は11秒程度でした。下記のソースもアップデートしました。
}
★追記 2024/09/16 {
 配置可能かのチェックロジックをx/y軸を分離し、y軸の判断処理をx軸ループ外に配置することで高速化しました。
 上記と同様のノートPCでの実行時間が15秒になりました(解をカウントせずserchのみの処理であれば7秒)。下記のソースもアップデートしました。

 探索プログラムを実行時の画面キャプチャを貼っておきます。スクリプトで実行前後に時刻を表示しています。
 全探索の結果として10個の正方形が収まる長方形の最小面積は 405 で、この盤面では同じ面積の回答が 1,073,184 通りあることも判りました。

探索プログラムの実行結果
※変更 2024/09/14

 プログラムを作ったのでこのパズルの一般的な名称があるのか「PuzzleSquareJP」のサイトで探してみましたが見当たりませんでした(掲載数が膨大にあるので最初の10ページくらいしかチェックしていません^^;)。

 ソースも貼っておきます。

正方形配置パズルの探索プログラム(C言語)
/*********************************************** square layout puzzle solver 1..10 square are layouted minimun Rectangle Ver 0.01 2024/09/12 by skyriver Ver 0.02 2024/09/14 08:50 faster Ver 0.03 2024/09/15 21:00 faster ***********************************************/ #include <stdio.h> #define MAXSQUARE 10 #define SUMAREA (MAXSQUARE*(MAXSQUARE+1)*(MAXSQUARE*2+1)/6) #define SOLCOUNT 1 // 0:not count solusions #define MAXBOARDX (MAXSQUARE * 4) #define MAXBOARDY (MAXSQUARE * 4) #if 01 #define FIRST_XPOS (MAXBOARDX / 3 + 2) #define FIRST_YPOS (MAXBOARDY / 3 + 2) #else #define FIRST_XPOS ( MAXSQUARE - 3) #define FIRST_YPOS (MAXBOARDY - MAXSQUARE - 6) #endif typedef struct { int x; int y; } Point_t; typedef struct { Point_t min; Point_t max; } Reqt_t; Reqt_t Square[ MAXSQUARE + 1 ]; char Board[ MAXBOARDY ][ MAXBOARDX ]; //int MinSize = 406; // answer area size int MinSize = (int)(SUMAREA*1.08); // answer area size int Size; // work int SolCnt; // answer counter void DelSquare( int size, int xpos, int ypos ) { for( int y = ypos; y < ypos + size; y++ ) { for( int x = xpos; x < xpos + size; x++ ) { Board[ y ][ x ] = 0; } } } void FillSquare( int size, int xpos, int ypos ) { for( int y = ypos; y < ypos + size; y++ ) { for( int x = xpos; x < xpos + size; x++ ) { Board[ y ][ x ] = size; } } } void disp( Reqt_t req ) { Reqt_t *spnt; printf( "\n\narea size = %3d, ( %2d x %2d ) " ,MinSize ,req.max.x - req.min.x + 1 ,req.max.y - req.min.y + 1 ); spnt = &Square[ 0 ]; for( int ssize = 1; ssize < MAXSQUARE; ssize++ ) { spnt++; FillSquare( ssize, spnt->min.x, spnt->min.y ); } for( int y = 0; y < MAXBOARDY; y++ ) { printf( "\n%2d : ", y ); for( int x = 0; x < MAXBOARDX; x++ ) { int c; c = Board[y][x]; if( c == 0 ) { c = '.'; } else if( c > 9 ) { c += 'A' - 10; } else { c += '0'; } putchar( c ); } } spnt = &Square[ 0 ]; for( int ssize = 1; ssize < MAXSQUARE; ssize++ ) { spnt++; DelSquare( ssize, spnt->min.x, spnt->min.y ); } } // size <- size of square // area <- area value of rectangle // req <- min & max point of rectangle void search( int sqsize, Reqt_t req ) { int *ckpnt; Reqt_t nreq; int chky[ MAXSQUARE ]; // outside flag for y for( int y = 0; y < MAXBOARDY - sqsize; y++ ) { int yen = y + sqsize - 1; Reqt_t *spnt = &Square[ MAXSQUARE ]; ckpnt = &chky[ 0 ]; for( int sq = MAXSQUARE - sqsize; sq; sq--, spnt--, ckpnt++ ) { *ckpnt = ( y <= spnt->max.y && y + sqsize > spnt->min.y ) ? 0 : 1; } Square[ sqsize ].min.y = y; Square[ sqsize ].max.y = yen; nreq.min.y = y < req.min.y ? y : req.min.y; nreq.max.y = yen > req.max.y ? yen : req.max.y; for( int x = 0; x < MAXBOARDX - sqsize; x++ ) { int checkx = 1; spnt = &Square[ MAXSQUARE ]; ckpnt = &chky[ 0 ]; for( int sq = MAXSQUARE - sqsize; sq; sq--, spnt--, ckpnt++ ) { if( *ckpnt == 0 && x <= spnt->max.x && x + sqsize > spnt->min.x ) { checkx = 0; break; } } if( checkx != 0 ) { int xen = x + sqsize - 1; Square[ sqsize ].min.x = x; Square[ sqsize ].max.x = xen; nreq.min.x = x < req.min.x ? x : req.min.x; nreq.max.x = xen > req.max.x ? xen : req.max.x; Size = (nreq.max.x - nreq.min.x + 1) * (nreq.max.y - nreq.min.y + 1); #if SOLCOUNT if( Size <= MinSize ) { if( sqsize != 1 ) { search( sqsize - 1, nreq ); } else { if( Size == MinSize ) { SolCnt++; } else { MinSize = Size; SolCnt = 1; disp( nreq ); } } } #else if( Size < MinSize ) { if( sqsize != 1 ) { search( sqsize - 1, nreq ); } else { MinSize = Size; disp( nreq ); } } #endif } } } } int main( int argc, char *argv[] ) { Reqt_t req; printf( "\nSquare layout puzzle solver Ver 0.03\n size:%d\n", MAXSQUARE ); req.min.x = FIRST_XPOS; req.min.y = FIRST_YPOS; req.max.x = FIRST_XPOS + MAXSQUARE - 1; req.max.y = FIRST_YPOS + MAXSQUARE - 1; Square[ MAXSQUARE ] = req; FillSquare( MAXSQUARE, FIRST_XPOS, FIRST_YPOS ); search( MAXSQUARE - 1, req ); printf( "\ncomplete searching.\nsame area size answer are %d.\n", SolCnt ); return( 0 ); }
★変更 Ver0.02 2024/09/14




★追記 2024/09/12
 上記の探索では1辺が10の正方形の位置は固定なので10の正方形が中心の位置にあるものしか探索できていません。
 試しに10の正方形が左下にある場合を探索してみた結果が下図になります。

10の正方形が左下の場合の探索結果

★変更 2024/09/13 下記の記述を修正しました

 上図の探索は10の正方形を左下に固定した場合であり、10の正方形が下側(縦並び)と左側(横並び)の場合のカウント結果です。10の正方形が上側(縦並び)と右側(横並び)の場合も考慮するとこの探索結果の2倍の解があることになります。

 従って10の正方形が中心にある場合と合わせると解の総数は下記の値になります。

   4,017,384 ( = 1,472,100 x 2 + 1,073,184 )通り



★追記 2024/09/18
 16までの正方形を最小の長方形に配置する探索を単純に行うととてつもなく時間が掛かります。何時間かかけて見つけた解(size:1520 = 40 x 38)が下図です。

16サイズまでの正方形の配置例(最小の長方形ではない)


 サイズ15までの最小解を見る(全てをチェックしたわけではないのですが)と最大の正方形は端に配置されているものが含まれることから、格納する長方形の角に最大の正方形を固定して探索することにします(この条件で最小解が得られるという保証はないのですが・・)

 それでも探索時間が膨大にかかるので下記の高速化手法を考えました。
  1. スキャンサイズの最小化
     最小四角形へ配置する探索で既知の最小面積は上図の 1520(40x38)のほぼ正方形なので盤面サイズを40x38,41x37~76x20とyをデクリメントしxをその時点での長方形の最小面積をyで割った値にして全探索します。結果的に格納する長方形をほぼ正方形から長~い長方形までを全探索することになります。

  2. 幅1ギャップでの枝刈り
     幅が1のギャップには最後に配置するサイズ1の正方形しか入れることができず殆どがデッドスペースになります。この幅1のギャップの総面積が(スキャン長方形のサイズ - 正方形の面積の総和)を超えた場合はその先の探索を打ち切って枝刈りするようにしました。

 上記を実装した探索プログラムを実行した結果が下図になります。図中の x マークは上記の幅1のギャップです。最小面積は 1512(54 x 28)で実行時間は1時間29分でした。

16サイズまでの正方形の配置の探索プログラム実行画面(Ver0.03)




★追記 2024/09/20 探索状態を観察し、次の高速化を行いました。

  • Ver0.03では未チェックだった正方形の対角線上の幅1ギャップのチェックを追加
  • 大きい正方形の配置から配置しているが、次の正方形の探索条件を「配置探索対象正方形のサイズが3以上で幅1ギャップ以外の空きスペースが4個以上またはサイズが2以下」の条件に変更
  • 解を発見した場合、同じサイズの長方形の探索を中断

 得られた最小解は今までと同様に size = 1512, ( 54 x 28 ) です。記念として探索結果を貼っておきます(クリックすると実行開始から終了までの画面表示が見えます)。

16サイズまでの正方形の配置の探索プログラム実行画面(Ver0.04)


 今回の最適化と実行環境をノートPCからディスクトップ(Win11要求仕様未達の古いPC)に変更したことで探索時間は 59分17秒 となり、下記の目標を達成できました。^^



★追記 2024/09/21 次の探索に進む条件を見直し高速化 {

 上記で次の探索へ進む条件での「空きスペースが4個以上」の部分が、サイズ3の正方形の探索(次の探索のサイズ2の正方形の面積が4なので))のみを考慮しているようでしっくりきませんでした。もっと汎用的に考えれば、幅1のギャップは最後に配置するサイズ1の正方形のみが使用可能なので全てのサイズの正方形の配置探索に適応できるように次探索へ進む条件を「幅1のギャップの総面積が(スキャン中の長方形の面積 - 全正方形の面積の総和 + 1)以下」に変更しました。
 その結果、下図(クリックで表示範囲拡大)に示すように探索時間は 45分51秒 になりました。

16サイズまでの正方形の配置の探索プログラム実行画面(Ver0.04改)

}




★追記 2024/09/21
 1辺が1~13の13個の正方形を最小面積の長方形へ配置する方法を探索してみました。プログラム作成当初は結果がでるまでかなり時間が掛かっていましたが、今では4秒程度で最小面積=836(38 x 22)の解が得られます。




★追記 2024/09/24
 旧Twiiterのタイムラインで情報提供頂き、Wolfram Demonstrations Project の「Tightly Packed Squares」のページで本パズルで1辺が3~32までの探索結果を表示するデモが見れます(ソースも開示されている模様)。1辺が33以上は未だに未解決のようなので興味のある人は挑戦してみては如何でしょうか?


nice!(0)  コメント(0) 
共通テーマ:趣味・カルチャー

CH32V203で遊ぶ(その6)クロックアップ [CH32V]

 前回の記事で CH32V203 に TFT 液晶 MSP2807(320 x 240 dot)を接続した環境でのライン描画の高速化から端を発して新たな高速ライン描画法を提案しました。
 今回はレジスタ直書込みによる高速化と CH32V203 のクロックアップによる変貌ぶりについて記録して置きたいと思います。


1.はじめに
 以前から認識はしていたのですが、CH32V203 は今回使用している開発環境(MounRiver Studio)のディフォルト設定では外部クロックを使用する設定になっていて、今回のように外部クロックを接続していない状態では内部クロックを使って 8MHz で動作します。
 言わばこの大リングボール養成ギブスを付けた状態で今までグラフィック描画の高速化を試みてきました。今回はレジスタの直たたきによる高速化を行った後に、クロックアップにより羊の皮を脱ぎ捨てた CH32C203 の真の実力について記載します。


2.レジスタ直接制御による高速化
 サンプルプログラムの記述に従ってC言語で開発するとペリフェラルのステータス確認の度にサブルーチンコールし、サブルーチンの中では対応ビットをANDチェック後の状態(ゼロか否か)により、リターン値を設定するようなまどろっこしい処理になってしまいます。特にライン描画のような繰り返し回数が多い処理ではなるべくステップ数の少ない実装にしたいものです。
 そこでステータスの確認とデータの書き込みをレジスタ直アクセスにしてみました。レジスタのアドレスやステータスのビットの定義についてはディバッガでトレースすれば容易に確認でき、これらは ch32v20x.h や ch32v20x_spi.h のファイル内で定義されています。
 参考として SPI1 関連のレジスタとステータスレジスタのビット構成を下表に示します。

SPI1 関連レジスタ

SPI1 ステータス


 下図がレジスタ直制御対応前と対応後のロジアナ波形です。SPI のデータ出力の間隔が短くなり、高速化できていることが判ります。末尾の「4.まとめ」に記載しているようにレジスタを直接制御することで前回の記事に掲載した 512 個の線分を描画するテストプログラムの実行時間は従来の処理から 16% 程速くなりました。

レジスタ直制御対応前のSPI波形

レジスタ直制御対応後のSPI波形



3.クロックアップ
 下図は CH32V203 のクロック系の構成図で、これを見ると HSI(内部クロック)の 8MHz を PLL で18倍まで逓倍したものを SYSCLK にすることができます。

CH32V203 のクロック構成


 今まではディフォルト設定で SYSCLK は 8MHz で、言わばこの大リーグボール養成ギブスを付けた状態で色々高速化を試みてきました。高速化の対処も一通りやった感があるので、この辺で CH32V203 の羊の皮を取り去り本来の実力を見てみたいと思います。
 クロックの設定は system_ch32v20x.c の下記の部分の define 設定を変更することで簡単にできました。

system_ch32v20x.c
/* 
* Uncomment the line corresponding to the desired System clock (SYSCLK) frequency (after 
* reset the HSI is used as SYSCLK source).
* If none of the define below is enabled, the HSI is used as System clock source. 
*/
//#define SYSCLK_FREQ_HSE    HSE_VALUE
//#define SYSCLK_FREQ_48MHz_HSE  48000000
//#define SYSCLK_FREQ_56MHz_HSE  56000000
//#define SYSCLK_FREQ_72MHz_HSE  72000000
/////#define SYSCLK_FREQ_96MHz_HSE  96000000
//#define SYSCLK_FREQ_120MHz_HSE  120000000
//#define SYSCLK_FREQ_144MHz_HSE  144000000
//#define SYSCLK_FREQ_HSI    HSI_VALUE
//#define SYSCLK_FREQ_48MHz_HSI  48000000
//#define SYSCLK_FREQ_56MHz_HSI  56000000
//#define SYSCLK_FREQ_72MHz_HSI  72000000
//#define SYSCLK_FREQ_96MHz_HSI  96000000
//#define SYSCLK_FREQ_120MHz_HSI  120000000
#define SYSCLK_FREQ_144MHz_HSI  144000000


 sysclk が従来の 8MHz から一挙に 144MHz にアップし、SPI のプリスケーラーは2に設定しているので SPI のクロックも 4MHz から 72MHz に変わることになります。流石に SPI のプリスケーラーの設定は変更が必要と思っていましたが、なんとそのままで動作しました。
 こうなると私の安いロジアナ(サンプリングの上限が100MSa/s)では波形を確認できません。最高サンプリング 1GSa/s のオシロで観測した SPI の CLK(水色)とデータ(黄色)が下図です。プローブが安物のせいか波形が綺麗には見えませんが、カーソルで示しているように確かに 72MHz 程度のクロックが出ているようです。ブレッドボード環境でこの周波数で動作していることもすごいですね。

SPI CLK(水色) と MOSI(黄色)



4.まとめ
 数回に渡り、高速化検討をしてきましたが、高速化を一通りやった感があるので今回はクロックを 8MHZ から一挙に上限の 144MHz にアップし、CH32V203 の羊の皮を脱がせて真の実力を見てみたところグラフィック描画はとんでもない速さになりました^^
 120円の CPU でこの速さはとてつもないと思います。接続した TFT 液晶 MSP2807 もすごいですね。

 最後に今回の高速化対応での線分描画時間の測定結果を下表に示します。

Nomethodtime[s]speed ratio
1Before13.1091.00
2Register direct11.3041.16
3Clockup(144MHz)0.62620.94


 X(旧Twitter)に投稿したメッセージに添付した動画を貼っておきます。




[TOP] [ 前へ ] 連載記事一覧 [ 次へ ]
nice!(0)  コメント(0) 
共通テーマ:趣味・カルチャー