鳥の巣箱

ネトゲしたり、機械いじったり、ソフト書いたり、山篭ったり、ギャンブルしたりする人

OpenOCDでRead-out Protectionを解除する

仕事の中で、ST-Link V2に搭載されてるSTM32F103CBT6を臨時で使わなければならなくなった。
こいつをひっぺがして、新たにプログラムを書き込もうってわけだけども、デバッグも書き込みもうまくいかない。

当然といえば当然ですが、Read-out Protectionがかけられていて読み書きができないようにされてるからでした。

しかし、こっちとしてはこれを使わざるをえないので無理矢理にでもその錠をこじ開けます(

続きを読む

アークスカフェ The Best前期行ってきたよ

みなさんこんにちは。

今、アークスたちの間で話題沸騰(?)の
pso2.jp

アークスカフェ The Bestに行ってきました。

スイーツパラダイス新宿東口店の方ですね。

アイテムコード景品のせいか、大盛況のようで現在予約を入れないと入店すら困難な状況です。
金、土、日の3日間いってきましたが、予約無しできて入店できずに帰らされるアークスを何人も見ました。
前日予約でもかなり厳しいので、最低でも1週間前くらいには一本電話入れとくべきかと思います。
店内は当然アークスだらけ。見渡す限りアークスです。感覚的には9割アークスです。
アークス怖ぇ!

後期メニューに変わるタイミングでアイテムコード景品も変わるのでもしかしたら入りやすくはなるのかもしれませんが。。。

続きを読む

3周年記念アップデート。。。ムラサメよこせ(

スマログ3周年アップデートきました。

新ジョブヴァルキリー実装で、新武器までひっさげてきちゃいましたよこの子ってやつです。
しかもつおい(小並感

まぁ、ヴァルキリーは今回私スルーしますがね!

それよりも今回やるべきは。。。

続きを読む

MoveTo、LineToメソッドで描いた線とPen.Widthの特性。。。とScanLineについて。

TBitmapコンポーネントなどには、そのBitmap上に線を引くために
・MoveTo(x,y)
・LineTo(x,y)
というメソッドが用意されてます。

MoveTo(x,y)で線の始点になる座標を指定し、LineTo(x,y)で指定した座標まで直線を描きます。

また、Pen.Widthプロパティで線の太さを指定できます。
Pen.Widthプロパティに1を指定すれば1ピクセル、2を指定すれば2ピクセルの太さの線を描けます。

ではこれをふまえて、以下のプログラムを見てみます。

procedure LineDraw;
var 
    Bitmap  : TBitmap;
begin
    Bitmap  := TBitmap.Create;
    
    Bitmap.Width    := 10;
    Bitmap.Height   := 10;

    Bitmap.Canvas.Pen.Color := clRed;
    Bitmap.Canvas.Pen.Width := 1;

    Bitmap.Canvas.MoveTo(5,0);
    Bitmap.Canvas.LineTo(10,0);
end;

解説用にざっくり書きましたので、実用性等は言及無しで(
上記のプロシージャは、新たにBitmapを生成して縦横10×10の大きさに指定しています。
このBitmapに(5,0)から(5,10)に向かって太さ1ピクセルの赤い縦線を描きます。

つまりこうですね。
f:id:tsubakurame-1913:20160906175507p:plain


これは簡単です。誰にでもイメージできると思います。
では、もし仮にPen.Widthが2以上になった時は、どのように描画されるのでしょうか?
縦に2ピクセル分塗られるわけですが、それはx=5の位置ともう1ヶ所はどこでしょうか?
x=4なのか、x=6なのか。。。

ということでこれを調べましょう。
どうやって調べるかというと。
指定したピクセルの色情報を抜き出すことで、どのピクセルが塗られているのかを調べることにします。

そのためにScanLineを使います。

上記のソースをちょっといじりましょう。

procedure LineDraw;
var 
    Bitmap  : TBitmap;
    pByte   : PByteArray;
begin
    Bitmap  := TBitmap.Create;

    Bitmap.Width        := 10;
    Bitmap.Height       := 10;
    Bitmap.PixelFormat  := pf24bit;

    Bitmap.Canvas.Pen.Color := clBlack;
    Bitmap.Canvas.Pen.Width := 2;

    Bitmap.Canvas.MoveTo(5,0);
    Bitmap.Canvas.LineTo(10,0);

    pByte   := Bitmap.ScanLine[0];
end;

こうなります。
PixelFormatはいろいろ種類がありますが、24bitが一般的です。
RGBそれぞれ8bit(0~255)×3です。

pByte  := Bitmap.ScanLine[0];

でpByteにBitmap上、y=0の1行分のデータがまるっと配列として代入されます。
このとき、RGBカラー情報がすべて別に代入されるので、配列の要素数としてはwidth×3となります。
今回だと30ってことですね。
配列の並び順としては、RGBではなく逆のBGRで並んでいることに注意。

あとは、pByteをMemoコンポーネントでもcsvにして吐き出すでもいいので出力してやればOK。


ということで、Pen.Widthを2~5まで変化させて、どのように直線が描かれるのかをまとめたのが以下の画像です。

f:id:tsubakurame-1913:20160906181239p:plain
f:id:tsubakurame-1913:20160906181241p:plain

と、このような結果になりました。
Pen.Widthが奇数の時は、指定した座標を中心に描画。
Pen.Widthが偶数の時は、指定した座標よりマイナス方向へはみ出して描画されるようです。

仕事が詰まっているので今回は必要だった縦方向のみの検証です。
おそらく横方向にも同じ特性が言えるのではないかと思います。


精密な描画を求められた時、1ピクセルの計算ズレも致命な欠陥に繋がるのでこの特性は覚えておきたいですね。

HAL Driverが使えるSTM32系開発環境を作る

オヒサシブリデス


ARM Coreは昨今の組込技術には無くてはならない存在になってますね。
きがついたら
hbol.jp

Softbankが買収してたりと、最近になってARMという存在を知らなかった人にも名前くらいは浸透したのではないでしょうか。


さて、もちろん私もこの業界にいる限り避けては通れない存在です。
ARM Core CPUを販売しているメーカーのひとつにSTMicroがあります。STM32シリーズは価格が安く機能が充実しているものが多いので重宝されます。
今回はこのSTM32系の開発環境を構築していく手順をまとめます。


今回使用したものは、STMicro社のNucleo-F030R8ボードです。
評価ボードなので、ICEもついてて非常に使いやすいです。
秋月で1500円くらいで売ってます。
搭載されてるCPUはSTM32030R8T6で、STM32F0xシリーズに分類されます。


この記事では上記のボード、CPUを前提に進めますがそれ以外のものでも基本大丈夫なはずです。
少々手を加える必要はありますが。


STMicroが提供しているライブラリは現時点で2種類

Standard Peripheral Driver(通称SPD)
Hardware Abstraction Layer(通称HAL)
があります。
SPDの方が最初に提供されていたライブラリなのですが、後にHALが登場。
なのでネットなどを調べてもSPDを用いたものと、HALを用いたものでは出てくる量が全然違います。特に日本語(
しかし、STMicroは今後HALを推し進めていくようです。
さらには、一部評価ボードなどではもうSPDで操作できない部分もあるようで完全に切り捨てるようですね(
SPDとHALは互換性もないので、楽してSPDを使うと今後使えなくなった時にキッツイので。。。
なのでHALを使うことを目標に環境を立ち上げます。


色々と試行錯誤の末デバッグ環境までこぎつけた感じなので、もしかしたらいらない工程が含まれてるかもしれません。
とりあえず、現時点での私の環境をそのまま再現する手順を書きました。
これいらなかったとかアレばコメントなどください。

続きを読む