強電

2016年12月25日

SW4STM32でprintfを使って浮動小数を出力したい

先日導入したSW4STM32は書き込みに手間が書かからず
OpenOCDを使えばデバッグもできオフラインで開発できます。

また、eclipseベースなのでPluginやMakerplaceを利用すれば自分好みの使いやすい環境にできます。

しかし、その代わりと言っては何ですが別の手間が要求されます。

まあとりあえずこれを見てください 

bandicam 2016-12-25 15-21-50-669
 
適当に円周率を表示するプログラムを書いてみます。

オンラインコンパイラ(RVDSだったかなぁ)を使っていた方であれば"PI:3.1415923"と
当たり前のように表示されると思う方が多いと思います。

しかし、オフラインコンパイラ(GCC ARM)の場合は初期設定のままでは実行結果は以下のようになってしまいます。

bandicam 2016-12-25 15-19-08-489

浮動小数の部分がきっちり抜けてPI:しか表示されないんです。
実はprintfの浮動小数処理はコード節約のためにデフォルトでは対応していません。

その為リンカーオプションをいじる必要があります。

手順ですが
まず、ProjectExplorerでプロジェクトのルートを右クリックし
Properties > C/C++ Build > Settings > MCU G++ Linker > Miscellaneous
に進みます。

bandicam 2016-12-25 16-04-54-391

デフォルトでは上部のLinker Flagsには
-specs=nosys.specs -specs=nano.specs  
と書かれていると思います。

この行に -u _printf_float を追加して
-specs=nosys.specs -specs=nano.specs  -u _printf_float に変更します。

これでprintfとかsprintfで%fにより浮動小数が扱えるようになります。

またscanfはまだしもsscanfを使うときがあるかもしれません
やはりこれらの便利関数も浮動小数に対応してなかったりします。
ついでに -u _scanf_float も追加しておきましょう。

注意する点としてはコードサイズが大きくなることですね。
比較的Flashサイズの小さいnucleo-32ボードでは気を付けた方がいいかもしれません。

以上で終わりです。

毎回設定するのはいささか面倒みがあることですが
浮動小数入出力なんてあまり使わないので覚えとくとイイこととして認識しておきましょう 

そういえば補足みたいなものですが、メモリ削減的にはオンラインコンパイラの方が断然いいかもしれません。
RDVSはメモリ削減率をアッピールしてるし?

そう考えると商用コンパイラを間接的にタダで使えるmbedは凄いな〜

nucleo32とか下位クラスのlpcマイコンであればオフラインコンパイラでコンパイルした方が良いかもね。
 


drttx at 16:41|PermalinkComments(0)

2016年12月16日

SW4STM32を使ったmbedオフラインコンパイル

最近何かと話題のmbedを使ってみました。
今回買ったのはnucleoボード!!
一枚1~2千円で買えるしコスパ最高です。

image

早速2枚買いです。取り合えずF401とF446を買っておきました。

mbedと言ってもmbedはオンライン開発環境であり僕的にはあまり好ましいとは思っていませんでした。 

じゃあなんかのIDEでstmが配布してるHALを使ってプログラムを書けば?という意見もあるかもしれませんが
あれはヤバいです。使えるようになるには相当な時間が必要だと思われます。 

1600ページある公式解説文もかなり簡素なものでゼロコンマニ秒で読む気が失せます。
素人意見ですがHALはどうしても必要な時だけ利用するのが良いと思われます。
取り敢えず今は全てを包容してくれるmbedの恩恵を受けておきましょう。 

そんなこんなで神々しい開発ツールmbedですが
ちょっと手間をかければオフラインでも開発できてしまいます。 

ようはARM開発環境さえあればいいってわけよ。
というか僕まだオンライン環境で開発してないし草も生えない
 
今回はIDEにeclipseベースの無料開発環境であるSW4STM32を使いました。
なんといっても無料なのにコンパイル時のフラッシュ容量制限が無いところが強みかな?

開発環境の構築法はネットで漁ると先人の方々が懇切丁寧に解説されているためそちらを参照してください。 

役に立つかどうかはわかりませんがオフラインコンパイルの手順を記しておきます。

まずmbedCompilerから適当にプロジェクトを制作してエクスポートします。
今回はプロジェクト名をtestとしました。

bandicam 2016-12-25 02-33-32-222
bandicam 2016-12-25 02-33-48-749
Export Targetを自分の使用するマイコンに、Exportt TollchainをSW4STM32にしExportします。
するとzip形式のファイルがダウンロードされると思います。 

どうやらダウロードされるファイルはプロジェクト名の後にマイコンボード名が付くようですね。

次にSW4STM32を起動し、右上のFileをクリックし
Import>Exsing Projects int Workspace
まで進みましょう

そこでSelect archive fileをチェックし、先ほどダウンロードしたzipファイルを参照しFinishをクリックします。

bandicam 2016-12-25 02-44-21-534

するとproject explorerにインポートしたtestが追加されてると思います。 

これでプロジェクトのインポートをは完了です。


次にプロジェクトをビルドします。ビルドはツールバーにあるハンマーのマークをクリックするかCtrl+Bです。
するとエラーが出ると思います。 (現状ではエラーが出ると勝手に結論付けてる)
  bandicam 2016-12-25 02-52-30-567

どうやらMBED_CONF_PLATFORM_DEFAULT_SERIAL_BAUD_RATEがtest/mbed/drivers内のRawSerial.hとSerial.h内で定義されていないようです。 

MBED_CONF_PLATFORM_DEFAULT_SERIAL_BAUD_RATEはmbed_config.h内で定義されており定義内容は9600です。これはデフォルトのシリアル通信の通信速度の値です。

対応としてはmbed_config.hをインクルードするかMBED_CONF_PLATFORM_DEFAULT_SERIAL_BAUD_RATEを9600(任意の値で可)に書き換えることで解決します。

書き換えるとビルドができるようになるので適当にプログラムを書いてみましょう 。 

書くもクソも最初からテンプレートが書かれていました。 

bandicam 2016-12-25 03-12-42-172

途中でエラーが出ていなかったらとりあえず書き込んでみます。

書き込み方法はいくつかります。
一つ目はツールバーの再生マークのrunをクリックもしくはCtrl+F11で書き込みます。

bandicam 2016-12-25 03-11-56-434

複数出てくることもありますが、自分の書き込みたいものを選んでOKを押しましょう 

するとマイコンボードのST-Link側のLEDが点滅してプログラムが書き込まれます。

別の方法はプロジェクトを右クリックして
Target>program chipをクリックして書き込みます。 
bandicam 2016-12-25 03-22-56-851

OKを押せば先ほどと同様にLEDが点滅して書き込まれます。

もう一つの方法はプロジェクト内のDebugファイル内にできたbinファイルをいつも通りの方法で書き込む方法です。

これはmbed本来の書き込み方法と同じなので説明の必要はありませんね


以上で解説は終わりなのですが。注意というかやった方が言いことを書いときます。 

ビルドしたときに.elfファイルが作れないとか、書き込むときにそんなファイルねぇよと警告文が出てきたときはファイルパスを短くするか、プロジェクトのcleanをやってみてください。大抵解決します。
ちなみにcleanはツールバーのprojectのところにあります。


いろんな意味で残念な解説になりましたがこれで終わりです。 

次回は外部コンパイラを使った際の問題について書きたいと思います。


続きを読む

drttx at 01:20|PermalinkComments(0)

2014年07月15日

NT金沢に行ってきました

13日割と近くで開催されたNT金沢に初めて行ってきました。
去年は用事がっていけなかったわけです。
会場は金沢駅地下もてなしドームでして、NT京都の時より小さい子供が多かった気がします
こういうことに興味を持った子が近いうちに「Makerになるのかなぁ」とか考えてたり
「作ってみた」は正義
かっこいいですね。こういうことができる人は尊敬します。

私は10:30に会場入りして14:30まで滞在してました。

IMG_2822

ワークショップとかいろいろな方のアイデアあふれる魅力的な制作物に感動していたり
コミュ症大爆発していたりと楽しかったです。Ghz2000氏と結構お話したり楽しい一日でした

Ghz2000氏からはジャンクとしてラボで余った?らしいICやFET、フィルムコンを大量にいただきました
ありがとうございます。

IMG_2838

IMG_2837

好きなだけ持って行っていいとのことで大量にもらってしまった…申し訳ない…

ICの中にはロジックやハイスピードオペアンプとか種類豊富でありがたい
この他に2SK3537も50個ほども頂いてきた…150V33Aなのでモータードライブによさげ
さりげにジャンクのところにIPMもあったので頂いてしまったり

あとワークショップでネギ振りミク作ったり
IMG_2847

綺麗です。アクリル板にレーザー加工機で加工しているそうです
三層の板にそれぞれ違う柄を掘ることで
LEDの点滅によってネギが振られてるように見えるのかな?
マイコンがAVRなので僕も制御できそうですね。
こういう作品見るとレーザー加工機が欲しくなってしまう()


それと石華工匠氏のビスマス人口結晶
IMG_2845

角度にやって変わる輝き、色言葉にできないくらい美しいです
写真では撮影が下手で美しさが伝わらんな…
この光沢はビスマスの酸化膜によるものでビスマス自体は銀色の金属です
下の方が若干銀色なのがわかるかな?

これでNTレポは終わり
残念ながらほかの作品はいろいろあって写真が撮れていない()

余談だけどSSTC(仮)試運転でミニコイルだけど動いた

IMG_2848

実際もっと放電するんだけど写真撮れませんでした
(白色のコンデンサは関係ない)
仮インバータで動かしてるので放電はしょぼいし、一次コイルの巻数が多い
一次調整したら15cmは余裕だったけど、CT燃えるし、GDTも燃えて動かなくなった
小さいテスラコイルも面白いのでもう少し小さいのも作ってみるのもいいかな








drttx at 01:21|PermalinkComments(0)

2014年07月09日

SSTC制御基板の回路図とか

咄嗟に思いついたのでここに書き留めて置く(完璧動作という保証は一切無し)
Baidu IME_2014-7-9_0-24-12
できるだけ配線を楽に尚且つ部品点数を少なくしたつもりです。

ゲートドライバーにはUCC3732_というTEXAS INSTRUMENTS社のゲートドライブICを使っています。
ただ単にIR社のはピン配置がキモいので使ってないわけで
UCC3732_は電流が結構取れる高速ゲートドライブICなわけです
別にこれ以外のハイサイド・ローサイドゲートドライバーを使っても問題ありません
というかUCC3732_は入手性が悪かったりする…

一応回路のタイミングチャート(合ってるかは保証できない)
SSTC TIMING CHART

こんな感じ…
インタラプタ信号が入ってる時テスラコイルが動作します

見ての通りこの回路は、ゲートドライブIC内の演算回路を利用して
フィードバック信号とインタラプタ信号を混ぜ混ぜしてるので
ICが違うと場合によっては動作しない為、ICの内部構成回路と真理値表を見て判断してください
大体片方のドライブICが反転されててANDとかNAND、NORみたいな動作しをしていれば動きます
とりあえずフィードバック信号とインタラプタ信号を混ぜれればなんでもいい
そこらは適当に・・・

回路の改善点ですが、GDTからのサージ対策にゲートドライブICの出力に
クランプダイオードをかませた方がいいかもしれません
もっと言えばFFとか入れたほうがもっといい

それとintはインタラプタ入力です。
余った74HC14でD比50%固定インタラプタを内蔵するのも良いかもしれません

こんな感じのもの
Baidu IME_2014-7-9_0-56-24
発振周波数は「F=1/CR」で求められます

外部入力インタラプタに対応できるように切替スイッチを入れたり
絶縁のためフォトカプラを入れるのもいいかもしれません

このように余ったゲートはいろいろ使えたりする

つまりIC3つで出来て簡単にSSTCをワンボード化出来ると思います

間違っているなどの指摘がある場合コメントにお願いします

追記…※この回路既出だった・・・(stevehv氏の回路)
海外サイトに目を向けていなかった私が悪い・・・



drttx at 01:03|PermalinkComments(0)