2018年1月11日木曜日

AAM-4

 AIM-120の気分転換に、99式空対空誘導弾を調べてみました。
 といってもwikimediaの写真を眺めるだけだけど。

 用語(俺々用語)
 フィン:固定翼(AAM-4の場合は前側)
 ウイング:動翼(AAM-4の場合は後ろ側)


AAM-4




JASDF AAM-4 in Hamamatsu Air Base 20140928

 F-15に搭載された状態。フィン/ウイングには「訓練用ミサイル専用」と書いてある。フィンの後ろにはホースバンドが巻いてあるので、このまま飛ぶのではなさそう。もしかしたら飛べるのかもしれないが。。。
 フィンとウイングの厚さの違いにも注目。フィンはかなり薄いが、ウイングの根本は裾広がりで非常に分厚くなっている。
 AIM-120によくある「LIFT HIRE」「NO LIFT」や、重心マーク、シリアルナンバーといった文字は一切かかれていない。


JASDF AAM-4 left front low-angle view at Gifu Air Base November 19, 2017

 ノーズコーン付近のネジがよく分かる写真。ノーズコーンのボルトは六角穴だが、その後ろは十字溝になっている。メーカーで組み立てる部分が六角で、基地で触る部分が十字溝? 不用意に回されたくない場所は頭が変えてあるのかもしれない。六角穴ボルトを回すならそれに合った工具が必要なので、作業場に工具が無いようにすれば不用意に触ってしまうことはない。
 配線ダクトはかなり厚ぼったい感じ。


JASDF AAM-4 left front view at Gifu Air Base November 19, 2017 01

 「試験用飛しょう体(フラッタ計測用)」みたいなことが書いてある(ボケて読めない)。AAM-4B(AAM-4(改))かな?
 米軍に倣うなら、装薬ではなくイナートなので、実際に発射はできない。機体に搭載した上で、様々な速度・姿勢をとって、その際に致命的な振動が発生しないか、といった試験を行うための弾体だと思う。あちこちにひずみゲージとか貼ってあるんであろう。あとで回収して超音波診断だけ、というわけではないはず。併用はしてるかもしれないが。


JASDF AAM-4 left front view at Gifu Air Base November 19, 2017 02

 これもウイングの厚さがわかりやすいアングル。ランチラグの形状も。こんな小さな金具で220kg*10g機動とかに耐えるわけだから、末恐ろしい。おそらく後ろ側の金具1個で荷重を支えてるだろうから、これだけで3トンくらいに耐えられるんじゃないかな。破壊するなら6トンとか10トンくらいの荷重が必要?


JASDF AAM-4 left front view at Gifu Air Base November 19, 2017 03

 ノーズコーンの先端部。塗装の上からでは素材の違いとかは見られない。AIM-120だとノーズコーンの先端は空力加熱対策?の金属パーツが入ってるんだけど。


JASDF AAM-4 Warhead Section 20131124

 AAM-4Bのフィン部分。フィンに時計回りの矢印とともに「解除」の文字がある。この方向に回すとロックを解除して、フィンの着脱ができるのかな。CWにまわして解除???
 SAFE/ARMの部分にはカバーがついてる。目立たないのでこのまま飛ばしそうで怖い。


JASDF AAM-4B 20131124

 こちらも4B。上の背景ブルーシートの弾体とくらべて、ノーズコーンの後ろの構造が大きく違う(ネジの本数が増えてる)。
 ミサイルを置いているスタンドに「取扱責任者」みたいなタグがある。スタンドが壊れると上に乗ってる数千万円のミサイルも道連れになるので、管理が厳重なのかも? そういう配慮をしてるってことは、そういう事故があったんだろうか。


JASDF AAM-4B at Gifu Air Base October 25, 2015

 2枚上のフィン拡大写真の、突起のところに、REMOVE BEFORE FLIGHTタグが付いている。
 RBFがついてるということは、この棒状の部品はワンタッチで着脱できる?
 赤に斜めの白帯は、ミサイルをどの方向から見てるかを知るためのマーキングだと思う。白が赤の中間部に見えれば、ランチラグ側がこちらを向いていて、白が赤の端に見えれば、配線ダクト側がこちらを向いている。発射試験(or投下試験)のときの映像解析に使うマーキングだと思う。赤の前にある黒い四角も同様。ミサイルの直径がnピクセルで、1フレームで黒がnピクセル動いていると、1秒間に何回転している、というのを計算できる。


JASDF AAM-4B Guidance Section 20131124

 点検ハッチ?のボルトに締付けトルクが書いてある。0.85N・m±7%くらい。トルクで言うと、M3.5かM4くらいのビスかな。
 ノーズコーンに変な模様が見える。ワインディングの跡?


JASDF F-2 , 航空自衛隊 F-2 - panoramio (2)

 ちょっと解像度低い。全景だからしょうがない。
 手前のオレンジが500lb LJDAM、F-2についてるのは端から90式空対空誘導弾、99式空対空誘導弾、93式空対艦誘導弾、かな? チンステーションにはJ/AAQ-2ポッド(FLIR)がついてる。チン=顎(chin)の意味。F-16SEADとかでもHTSとか、ポッド類を吊るのによく使われる場所。
 F-2のあちこちにマーキングがついているので、試験を主にしている機体かな? 画像解析ソフトだと、マーキングの位置を解析して、姿勢や歪みを計測できるものもあるらしい。空自がそういうシステムを使っているかは不明だが、これだけあちこちにつけてるんだから使ってるんであろう。


JASDF XAAM-4 Propulsion Section 20131124

 ウイング部の拡大。
 四角い黒のマーキングがない。
 ウイングにはLOCK PINの文字がある。ということは、ここからピンを差し込んでウイングを固定するのであろう。反対側にも穴があるから、抜き取るときはそこから細い工具を差し込んで、ピンを押して抜くはず。前から後ろに向けてピンを差すのは、飛行中に空力等で抜けるのを防ぐため、と思われる。後ろから前向きに差し込むと、風圧で抜けてしまう可能性がある。
 AIM-120のウイングはナットで固定するので、取り付けには多少の手間がかかる。ピン方式なら、ウイングを差し込んで、ピンを差すだけで終わるので簡単。ピンを無くすと目も当てられないが。ウイングの根本がこれだけ太いなら、ピンの抜け止めみたいな細工もしてあるのかもしれない。

***

 AIM-120の息抜きにAAM-4を調べてみたけど、こっちも面白そうだなぁ。120が一段落したらこっちも作ってみたい。

 色々考えても、謎が謎を呼ぶ、みたいな状況。「百聞は一見にしかず」とはよく言うけど、1回詳しい人に根掘り葉掘り聞いてみたい。誰に聞くんだ、って話だけど。空自関係者に聞いてもあんまり教えてもらえないだろうしなぁ。

 空自基地って、予め予約しておけば見学できるみたい。
 最寄りの千歳基地だと、1ヶ月前までに予約してね、という感じ。最寄りと言っても、片道4時間位かかる長旅なんだが。
 Webページの説明によると、基地の説明と、F-15/UH-60の説明があるらしい。おそらく周辺住民向けの説明だろうから、通り一遍の、ググれば出てくるような話が大半だろうなぁ。残りはそこでしか聞けないこぼれ話とか。
 Mk 13ミサイル発射機とか調べようと思ったときは、ミサイル護衛艦を見学したくなった。どっちにしろ北海道のど真ん中からだと、空自も海自もとても遠くて、気軽に行ける距離じゃない。
 陸自駐屯地は気軽に行ける範囲にあるけど、陸自装備はあんまり心惹かれないからなぁ。
 陸自演習場(砲弾弾着地点)が徒歩数分で見える場所ってのは、地の利があるか。海自も空自も演習海域/空域は気軽に見れる場所じゃないから。
 照明弾を使った演習をしてる時とかはとても綺麗だし、楽しい。
 「た~まや~」「か~ぎや~」「よ~そろ~」
 陸自はようそろは違うか。

2018年1月9日火曜日

カラーチャート

 写真用紙をペーパークラフトに流用しようと思ってたんですが、某F社のインクジェット紙だとうまくできませんでした。
 紙が固く、折り曲げるのが非常に大変で、少しこするだけでインクが剥がれてしまいます。ま、ペーパークラフト用に作られた用紙ではないので、当然といえば当然かもしれません。写真を折り曲げようとしたり、表面を擦ったりすることなんて殆ど無いでしょうから。
 ということで、amazonでケント紙を注文したので、それが到着するまではAIM-120は一時休止ということで。

 印刷ツールの内、C#の部分を新造しています。今まではLuaからの関数呼び出しをリストに保存し、PrintDocumentのPrintPageでリストの処理を行う、という流れでした。新しいプログラムでは、PrintDocumentのBeginPrintでLuaスクリプトを読み込み、PrintPageが呼ばれる毎にLuaの関数を呼び出し、Luaからの関数呼び出しで直接Graphicsを操作するようにしています。
 一旦リストに保存する方式では、リストの管理が面倒なのですが、いちいちGraphicsを操作する方法でも、それはそれで面倒な感じです。


 それと、ミサイルの色の調整もやろうと思っています。
 手始めに、Luaで色のマトリクスを印刷して、本物の色に近いカラーコードを探しています。forループを書けば色の一覧を印刷できるのも、スクリプトベースの楽なところですね。
 R16色G16色B16色の4096マトリクスと、R6色G32色B6色ステップの1296ストリップの2種類を印刷してみました。4kは色の分解能は高いのですが、1マスが小さく、またA4用紙1枚にすべて印刷しているので、本や写真等と見比べるのには不向きです。1.3kの方は、特に赤と青の分解能が低いですが、36本の帯状に切断しておけば、見比べるのに非常に便利です(下の写真)。切断するのがかなり面倒で、分解能も低いですが、この用途には帯のほうが向いていると思います。A4用紙2ページ分ですが、コンビニで印刷しても100円くらいで済むはずです。
 市販のカラーチャートやカラーパレットは、色の信頼性が高い反面、値段も高く。色数もあまり多くありません。また、色の正しさは、今回に限ってはまったく不要で、むしろ逆に、自分のプリンタで印刷した色に対するカラーコードがほしいので、自分で印刷するカラーチャートのほうが利点が大きいです。
 あと、amazonで買った厚紙が届くのを待つ間に色を探したいのに、それに必要な道具をamazonで買う、という本末転倒なことをしなくても済みます。それに、印刷すればいくらでも量産できるので、汚れたり濡れたりといった心配が不要という利点もあります。帯の切断は想像以上に大変な作業なので、できればやりたくないですが。


 僕が持っている本の中で、ミサイルの写真が掲載されているのは「最新ミサイルがよ~くわかる本」「F-15完全マニュアル」「F-16完全マニュアル」くらいしかありません。
 "最新ミサイル"に掲載されている写真は、かなりの確率でイナートです。一般公開の際に撮影された写真が多い感じです。F-15本やF-16本は、そもそも機体の紹介がメインで、兵装の写真はかなり少ないです。
 「軍用機ウェポン・ハンドブック」という本も持っていますが、これは1種類あたり見開き1ページの文がメインで、写真も1種類あたり2,3枚ありますが、全てのページがモノクロなので、色の参考には使えません。
 上の画像は、F-16本の中でも数少ない、ミサイルがそれなりの大きさで写っている写真です。写真を見て分かる通り、AIM-120ではなく、AIM-9の古いタイプのミサイルです。

 ネットで拾ったAIM-120の写真だけを見ても、カラーバンドの色はかなり異なっています。撮影条件によって変わって見えるのか、仕様として色が固定されていないのかはわかりませんが、前者なら本物と見比べる必要がありますし、後者なら大体色を合わせておけばそれで十分です。
 後者だと楽ですが、前者ならかなり難しいです。おそらくJASDAFの基地公開とかで実弾を見れる機会は無いでしょうから、基地公開に行っても、整備員やパイロットっぽい人に色見本を見せて「どれが本物っぽいですか?」と聞くくらいしかできません。
 wikimediaとかを見てると、米国だと各地にミサイルを含めた展示施設があるようです。国土が広いので、空軍の施設だけでも複数ありそうですし、陸軍の施設でもAAMが展示されていたりするようです。あと、あの国のことですから、民間の博物館とかも多そうな気がします。でも流石にアメリカまで行くのは無理です。行けるかいけないかで言えば、国内の展示施設も似たような感じですが。

***

 僕は興味と関心がコロコロと移りゆくので、かなり短い期間で飽きて次のネタを探しています。さすがに三日坊主というほど短くはないですが。
 自分が何をやっていたか、あんまり思い入れもないので思い出せないですが、写真フォルダを見てみると、AIM-120の前は視線同軸カメラを作ろうとしていたようです。その前はジンバルの制御をやったり、更にその前は電光掲示板を作ったり、更にその前はライトセーバーを作ろうとしていたようです。夏頃に電光掲示板を使う用があって、その時は比較的長い期間これをやっていました。さらにその前は、超音波風速計、ジンバルで衛星追尾、といったことをやっていたようです。他にも、写真に取るまでもないようなこと、写真に残さないような小さいソフトウェア、とかを含めれば、かなり多そうです。
 約1年でも色々やっていたようですね(こういう振り返るのって年変わる前にやるべきだったんじゃないのか)。

 AIM-120もちょっと飽きてきました。AIM-9とかRIM-66なら良いとか、そういう方向ではなく、ペーパークラフトに飽きてきた感じです。そろそろ次のネタを探さないとなぁ。
 youtubeでプラモデル動画を見て、面白そうだなぁと思っているのと、積みプラモもあるので、それをやりたいんですが、なんせ田舎なので、塗料の入手性が悪すぎます。なんでprimeで売ってないんだよぅ。
 AIM-120は、モデルロケットエンジンを買ってくれば、もうちょっとドーピングできるかな。

2018年1月6日土曜日

ペパクラAIM-120A


 中央の翼もついて、AIM-120らしくなってきました。

 下から、最初に作った紙筒+円錐、2番目に作った尾翼付き、3番目に作ったフィンを追加して色を修正したもの、です。
 最初に作ったのはイナート色でした。印刷ツールの動作テストや、円筒の練習とかも兼ねていたので、ちゃんとイナートとしての役割を果たしたかなと思います。尾翼やフィンがありませんが、AIM-120の輸送形態はこの形なので、それはそれでアリな気がします。
 2番目に作ったのは、尾翼を追加して、バンドの色を変えました。ただ色の順番が違うというミスをしています。
 3番目は、作成途中で微妙にデータを変更しています。2本の茶色の帯の色が違うのはそのためです。中央の帯のほうがそれっぽい色合いですね。これを作った後に弾頭のバンドも変更しています。

 形はかなりAIM-120A/Bに近くなってきたので、あとは作る人間の技量向上と、色の修正でしょうか。全体的にグレーにするのと、バンドの色を修正するのと、フィン/翼の色を変更するのと。
 それと、今はコピー用紙で作っていますが、厚紙で作りたい気がしています。田舎だと厚紙の入手性は劣悪なので、とりあえず写真用紙で作ろうかなと思っていますが、光沢紙しか持っていないので、かなりテカテカになるはずです。

 大きさとしては、モデルロケットに近い大きさです。Alpha IIIよりは大きいですが、A-Cエンジンで打ち上げるペーパークラフトロケットの中では小型な方です。ということで、A8-3を入れればかなり飛ぶと思います。
 重心がかなり後ろで、おそらく後端バンドの前方くらいです。静安定はネガティブなので、このままでは飛ばせません。フィンを外して、ノーズに重りを入れれば飛ぶと思います。重りの量次第では、フィンが有っても飛ぶかもしれません。
 AIM-120は本来空対空ミサイルなので、地上からモデルロケットで発射するには向かない設定ですが、SLAMRAAMのように、地上発射型のAIM-120もあるので、その辺りは柔軟に解釈すればいいかな、と思っています。

 今は5分の1ですが、2分の1にしてA3に印刷すれば2.5分の1で、1.4mくらいになります。ローソンのマルチコピー機ならA3でも印刷できますし、400円くらいで済みます。とはいえ、コピー用紙ですから、かなりふにゃふにゃになりそうですね。プチプチを入れるなり、発泡充填剤を入れるなりすれば大丈夫かな? それにしても、ただでさえ円筒の作成は大変なのに、この倍ともなるとどうなることやら。
 A3に印刷するより、スクリプトを組み直してA4で10枚くらいのほうが楽かもしれません。でもそうなると、実物大のAMRAMMも作りたくなってくるなぁ。AIM-120より一回り小さいAIM-9なら、実物大でも作れるかもしれません。実物大AIM-9があれば、殺せんせーごっことかできるな!

***

 ペーパークラフトで重要なスキルは、接着剤の塗布じゃないかな、と思い始めています。紙を切るのは、直線ならカッターを使えばきれいに切れますし、曲線でもハサミでゆっくり切ればそれなりにきれいに切ることができます。折れ目も、予めけがいておけば、直線で折り曲げるのは簡単です。
 接着剤の塗布は、多すぎると紙がふやけ、接着面が厚くなり、乾燥にも時間がかかり、といった問題があり、逆に少なすぎると貼り合わせる前に乾燥してしまいます。特に大きなものを接着する場合は、均一に、かつ必要な量の接着剤を塗布するのは、なかなか大変です。ハサミのように、ゆっくり作業する、ということもできません。
 接着剤が多ければ、何回か貼り直せますが、少ないと一瞬で固まるので、それも接着剤を塗りすぎる原因かもしれません。
 とにかく、ペーパークラフトの練習は接着剤の塗布の練習と言っても良いかもしれません。
 もちろん、それほど大きくないものなら、少しずつ爪楊枝とかで塗っていけば簡単なのですけども。

Luaでソート(手抜き)

 Luaでソートしたくなったので作ってみた

 ソート関数

function sort(array, compare)
 for i = 1, #array do
  for j = #array, i + 1, -1 do
   if compare(array[i], array[j]) < 0 then
    array[i], array[j] = array[j], array[i]
   end
  end
 end
end

 サンプル

function color_to_luminance(color)
 return(0.299 * (color.R or 0) + 0.587 * (color.G or 0) + 0.114 * (color.B or 0))
end

do
 local numbers = {
  10, 5, 8, 3,
 }

 print("---")
 for i = 1, #numbers do
  print(numbers[i])
 end

 sort(numbers, function(a, b) return(b - a) end)

 print("---")
 for i = 1, #numbers do
  print(numbers[i])
 end

 local colors = {
  { R = 255, G = 255, B = 255 },
  { R = 255 },
  { G = 255 },
  { B = 255 },
  { },
 }

 print("---")
 for i = 1, #colors do
  print((colors[i].R or 0) .. " " .. (colors[i].G or 0) .. " " .. (colors[i].B or 0))
 end

 sort(colors, function(a, b) return(color_to_luminance(b) - color_to_luminance(a)) end)

 print("---")
 for i = 1, #colors do
  print((colors[i].R or 0) .. " " .. (colors[i].G or 0) .. " " .. (colors[i].B or 0))
 end

end

 結果

10
5
8
3
---
3
5
8
10
---
255 255 255
255 0 0
0 255 0
0 0 255
0 0 0
---
0 0 0
0 0 255
255 0 0
0 255 0
255 255 255


 バブルソートなのであまり早くない。今回は要素数200未満を1回通せば終わるので、たぶん問題ない。
 第2引数に比較関数を渡さないといけない。このあたりは使い方次第なので各自工夫してください。

 Luaはswapが簡単にできたり、デフォルト値をorで簡単に設定できたりするので便利。インクリメントとかデクリメントとか演算代入が使えないのは不便だけど。^で累乗できたりするのは結構便利。math.powとか使わなくても済むので、数式的に見やすい。なれないとちょっと違和感あるけど。
 あとCらいくに戻った時にセミコロンを忘れるのが欠点らしい欠点か。

2018年1月5日金曜日

ペーパークラフト

 ペーパークラフトを作りたくなった。ので、印刷ツールを作った。




 ペーパークラフトを作りたくて、ペパクラデザイナーのライセンスも持っているのだが、SketchUpとは相性が悪く、新しいCADを導入するのも面倒くさい、ということで、簡単に印刷ツールを作ってみた。
 C#のPrintDocumentからLuaを呼び出して、Grahicsのラッパーを提供するプログラムを作った。これにより、図形をLuaで作ることができる。
 イメージとしてはPostScriptに似ているかもしれない。forや数学関数が使える点が特徴的かな。

 とりあえずAIM-120A/Bをモデルにしてみた。というか、AIM-120のプラモデルがほしいけど多分売ってないのでペーパークラフトで作ろうと思い至った次第。
 スクリプト言語ベースなので、同じような図形を配置するのはとても簡単。ボルトが60本ほどあるが、ボルトの形を書く関数を作れば、あとはforで配置できる。
 ただ、形状は全部自分で書く必要があるから、ノーズコーンみたいな、矩形で表現できない形状を追加するのは大変。1回処理を作ってしまえば、パラメータを変えて再利用できるのだが、抽象化がうまくできてないと流用できない。面倒。

 昨日あたりから初めて、1日かかってようやく印刷できるようになってきた。今は簡単な円筒と円錐だけで、安定翼や操舵翼は作っていない。それを追加すれば見た目は完全にAIM-120になるはず。
 5分の1スケールだけど、長さは73cmくらいある。そのくせ直径は3.6cmしかない。LD比20くらいで、APFSDSっぽい。図らずもほぼ実寸台のAPFSDSペーパークラフトになりそうだ。
 直径3.6cmだと、A8-3とか入れればそのまま飛ばせそう。ただしこの細長いのが座屈しないかという問題があるけど。印刷ツールのテストが目的なのでコピー用紙で作ったが、かなりフニャフニャ。でもちゃんと接着したらそれなりに強くなるかも。写真用紙みたいな厚紙なら、かなりの強度があるかも。
 3.6cmは持っててかなり頼りないので、3分の1とか2.5分の1くらいにしたい。でもそうすると全長が1mを超えてしまう。AIM-120ってデカいんだなぁと実感。でもAIM-54だと長さは同じ程度ながら、直径で2倍以上でかい。デカい。

 ペーパークラフトだけで言えば、あとはフィン8枚をつければそれで終りとなる。飛ばすわけじゃないから、エンジンブロックとかも必要ない。
 C#側の処理の流れがもうちょっとなんとかなりそうなので、こちらは作り直したいところ。でも今のプログラム向けのスクリプトもすでに700行を超えていて、これを新しいプログラム向けに書き直すのもいやだなぁ、と思っている。目論見どおりに、プログラムの効率化が進めばもっと少ないスクリプトで同じことができるはずなんだけど。

 とりあえず、AIM-120が形になったら、次はRIM-67あたりも作ってみたいなぁ。

2018年1月3日水曜日

フルカラーLED

 フルカラーLEDを使いたかったので、ちょっと調べてみた。
 今回はいつも以上に空想が多く含まれております。ご了承を。(訳:ちゃんとデータシート読まないでテキトーに考えてる)

 マイコン内蔵RGB 5mmLED PL9823-F5: LED(発光ダイオード) 秋月電子通商 電子部品 ネット通販
 安心と信頼のWS28系チップ内蔵品。FT232でPCから直接制御可能なことを確認済み(FT232 Invert)。マイコンでも容易に制御できる。

 マイコン内蔵RGB 5mmLED OST4ML5B32A: LED(発光ダイオード) 秋月電子通商 電子部品 ネット通販
 信頼と実績のオプトサプライ製。最初にデータシートを見た時、思わず「バカだろ!?」と言ってしまった。このデバイスは、いわゆる3値理論に基づいた信号が必要になる。日本語圏だと使ってる人いないっぽい?。

 RGBフルカラーLED 5mm OSTAMA5B31A アノードコモン (10個入): LED(発光ダイオード) 秋月電子通商 電子部品 ネット通販
 信頼と実績のオプトサプライ製。マイコン内蔵型ではないが、それに比べて輝度が20倍くらいある。とても明るい。


 使うならWS28系かOSTAMA5B31Aの2択だなぁ。3値は未知数すぎる。Low, High, HighZの3値が必要なので、STM32系からは扱いづらい。だからあれほどOpenDrain以外にOpenSourceも実装しろと(以下略。
 PICはHiZを作りやすい気がするけど、結局レジスタを叩くならSTM32でも良さそうだなぁ。STMでやるなら、外にトランジスタを2石置いて、2ピンで制御するのが妥当なところか。もしくは、10kOhmでプルアップして、OD直結でLow、ODに10kOhmで0.5VDD、オープンで1VDDを作るとか。こちらも結局2ピンが必要なのは同じ。マイコンの内蔵プル抵抗とか使えば1ピンで使えそうだけど、数十kOhmだから、高速な信号を通すのは厳しいかも。高速といってもmin5kBaudだけど。でもGPIOを中途半端な値で放置して大丈夫なんだろうか。一応STM32はシュミットトリガを通してはいるが。

 今回の用途は、できるだけ高輝度がほしいので、5B31Aかなぁ。20mAなので、マイコンに直結できる。DCで最大50mA流せるけど。フルカラーで使うと、STBee Miniなら5個くらいしか制御できない。TLC5940とかを使えばfloor(5.33...n)個を制御できるけど、実装面積が大きくなる。8chトランジスタアレイ1+n個を使えば16n個くらいは制御できそうだけど、パラレルバスで8+8n本くらいの配線が必要になるので、ちょっと面倒な気がする。
 狭いスペースに詰め込みたいので、そういう意味ではマイコン内蔵LEDはかなり魅力的なんだが。1.25mmピッチの8ピンSOPみたいなパッケージで、max150mAくらいまで流せて、SPIライクなバスで3x8bitの、アノードコモンとカソードコモンに互換性のあるドライバICとかがあれば良いんだけどなぁ。これなら既存のフルカラーLEDに追加できるし、最近流行りの液晶バックライトにも採用を見込めるし。いや、たかが3chでバックライト用途は無理だろうけど。

 なかなか思い通りにはいかないもんだなぁ。

2018年1月2日火曜日

NLua

 C#で簡単なスクリプト機能が欲しかったけど、自前で作るほどじゃないし、かと言ってC#のスクリプトを作るほどじゃないし、ということで、NLuaを試してみた。NuGetで入れれるけど、最新版でも14年10月と、かなり前に更新が止まってる。

 テストコード

double coefficient;

private void Button1_Click(Object sender, EventArgs e)
{
    using (NLua.Lua lua = new NLua.Lua())
    {
        lua.RegisterFunction("TDAM", this, typeof(Form1).GetMethod("to_double_and_multiply"));

        string lua_version = lua["_VERSION"] as string;

        coefficient = 1;
        double v1 = (double)lua.DoString("return(TDAM(\"123.456\"))")[0];

        coefficient = 2;
        double v2 = (double)lua.DoString("return(TDAM(\"123.456\"))")[0];

        double sin45deg = (double)lua.DoString("return(math.sin(45 / 180.0 * math.pi))")[0];
    }
}

public double to_double_and_multiply(string value_str)
{
    double value = double.NaN;

    if (double.TryParse(value_str, out value))
    {
        value *= coefficient;
    }
    else
    {
        value = double.NaN;
    }

    return (value);
}

 結果は、lua_version="Lua 5.2"(string), v1=123.456(double), v2=246.912(double), sin45deg=0.70710(以下略)(double)という感じ。
 内部ではLua5.2が動いていて、標準ライブラリは何もしなくても読み込まれて、関数の登録もできる。

 もしかしたらAny CPUじゃ動かないかも(未確認)。

 関数は引数の型が違うと呼び出せない。戻り値は適当に処理してくれるっぽいけど、要素数1のobject配列が帰る。戻り値がない場合はnullになる。Luaの言語的には複数の戻り値を持てるが、C#ではできないっぽい。スタックとか気にせずにC#側を書けるのは便利な気もする。オーバーロードはGetMethodの引数でできるっぽい。
 もちろんC#で書いた部分はVisual Studioのデバッガで見れる。
 Luaの広域変数はlua["value_name"]みたいにして取れる。
 広域変数はDoStringとかを繰り返しても初期化されないので、前回の実行時の変数とかを持ち越したくない場合は、都度インスタンスを作る必要がある。

 関数の登録以外は結構簡単に書けそう。