2014年2月28日金曜日

figma

最近のこのブログではちょっと珍しい方向性



なんか「持てそうだなー」とか思って持たせた結果です

左が12.7x99 右が5.56x45です
figmaは12分の1なのでリアルスケールに直すと左が15.24cm 右が6.672cmという感じで、WW2のあたりの対空砲くらいの口径?

12.7x99はほとんど身長と同じです
5.56x45の方はかなり重そうですが、見た目的には(特にこのキャラには)ちょうどいい感じがします


figmaのトータルイクリプス パイロットスーツ版は足面積が広いので、単体でも十分に安定するのが特徴ですね
素足のキャラとか立てるの大変…
単体でも安定するので、奥行方向に長いスタンドを使う必要が無いため、ちょっとしたスペースに置くことができます

なお、写真では唯依姫のほうが身長が高いですが、これは遠近法のせいで、実際にはほぼ同じ身長です

2014年2月24日月曜日

ARMでアセンブリ

"ARMで学ぶアセンブリ言語入門"(http://www.amazon.co.jp/dp/4863541260/)という本があります
タイトル通り、ARMマイコン上で走るアセンブリを学ぶための本です

4章の最初のあたりまで読んで後は放置していたのですが、それじゃもったいないので、せめて実機で走らせるくらいはしてみよう ということで遊んでみました

とりあえず手持ちのARMマイコンといえばSTM32F103くらいなので、このコードの上にデクリメントと条件分岐だけのコードを書いて、プログラムループのディレイとして遊びました

で、さすがにこれだけで終わるのもアレなので ARMマイコンを使用しているRaspberry Piでも試してみました

コード
      1 #include <stdio.h>
      2
      3 int main(void) {
      4     int var1 = 10, var2;
      5
      6     __asm__ (
      7         "    MOV     r0, #2               \n\t"
      8         "    MUL     %[Rw], %[Rr], r0     \n\t"
      9         : [Rw] "=r" (var2)
     10         : [Rr] "r"  (var1)
     11         : "r0"
     12     );
     13
     14     printf("%d\n", var2);
     15
     16     return(0);
     17 }
     18

こんな感じです
期待する出力は20です
まず入力としてvar1で10を与え、中でまずr0に2をロードしてからvar2にvar1*r0で 20になるはずです

で、
 $ gcc main.c
でビルドし
 $ ./a.out
で起動すると 期待したとおり20と表示して終了します

以上、ARMマイコン上で動作するアセンブリのテストでした



だけだとさすがに怒られると思うので、もう一つ試してみたいと思います

Nexus7です
RasPiと同じコードで同じように動作しました

ARMのアセンブリは様々な環境で動作するので、もうちょっと深みにハマっても面白そうだと思います


P.S.
デスクトップ版のARM版Ubuntuの13.10のアップデートが来ていました(今のバージョンは上記画像の通り13.04)
IntelCPU向けはかなり前に出ていたので、やっとか という感じですが
近いうちにアップデートしてみようと思います
やったら起動しなくなりました
とりあえず13.04に戻しています

それとARM版13.04でChromiumが動くようになっていました
あいかわらずFlashは無く、ChromiumでもFlashのエミュレートはできないので某Flashゲーはできませんが

2014年2月22日土曜日

STM32F1 TIMでPWM出力

STM32F103VEのTIM3でPWM出力をしてみた

コード

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
    GPIO_Init(GPIOA, &GPIO_InitStructure);

    {
        TIM_TimeBaseInitTypeDef TIM_InitStructure;

        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);

        TIM_InitStructure.TIM_Period = 7200 - 1;
        TIM_InitStructure.TIM_Prescaler = 1000 - 1;
        TIM_InitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
        TIM_InitStructure.TIM_CounterMode = TIM_CounterMode_Up;
        TIM_InitStructure.TIM_RepetitionCounter = 0;

        TIM_TimeBaseInit(TIM3, &TIM_InitStructure);
    }
    {
        TIM_OCInitTypeDef TIM_OCInitStructure;

        TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
        TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
        TIM_OCInitStructure.TIM_Pulse = 3600 - 1;
        TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;

        TIM_OC1Init(TIM3, &TIM_OCInitStructure);

        TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable);
    }

    TIM_ARRPreloadConfig(TIM3, ENABLE);
    TIM_Cmd(TIM3, ENABLE);

TIM3の出力1はGPIOAの6に出ている
なのでまずはGPIOの初期化をする
そしてタイマの初期化
72MHzのマイコンに対して10Hzでリセットされるように設定した

そしてTIM_OCを初期化する
このあたりはよくわかってない
本来TIM_OCInitTypeDefはもっと機能が多いのだけど TIM3の場合はすべての機能がハードウェアに実装されているわけではないのでこれくらい設定しておけばいいらしい

そして最後に諸々の有効化
あとは無限ループにでも突っ込んでおけば勝手にPWMが出力される
ロジアナで見ると10Hzの波が出てるので問題ないはず
パルスの周波数を設定するのはTIM_TimeBaseInitで デューティ比はTIM_OCxInitで行うようだ
今回はTIMのカウントダウンが7200に対してデューティ比設定が3600なのでちょうど50%になる

ちなみにこのパルス出力は完全にハードウェアで行われるため、__WFIで低消費電力モード(?)に入った状態のマイコンからも出力される
低消費電力にしたところでパルス幅の変更はできないし、他の処理もできないけれど

パルス出力はタイマ1本に大して4本まで個別に設定可能のようだ
例えばTIMを適当に設定してやればタイマ1本でサーボモーターを4個まで個別に操作できる
完全にバックグラウンドで処理されるのでCPUへの負荷も最小限で済む



ほんとうはこのエントリはタイマを使ったPWMではなく、DMAを使ってGPIOを高速で書き換える実験を書きたかった
しかしDMAを使った場合の出力が7MHz程度に対して、ソフトウェアで書き出すと12MHzくらいで出力できてしまった
DMAならバックグラウンドで処理できるけど、あまり美味しくないので今回はスルーした


もうちょっといろいろ試して、ある程度形になったらまたまとめようと思う
が、制御対象のモジュールを買ってこないとダメなのと、性能的にちゃんと制御できるかわからないので どうなることやら

追記:2015/11/16
TIM1,8,15,16,17ではTIM_CtrlPWMOutputsで出力を有効にする必要がある。TIM_CtrlPWMOutputs(TIM1, ENABLE);のように設定しないと出力されない。

2014年2月14日金曜日

Bitmapイメージをサクッと作るヘッダー

BitmapImageのヘッダです
以下のヘッダを使うと4bitのBitmap画像を作ることができます

const uint8_t BitmapHeader[] = {
0x42, 0x4D, /* ファイルタイプ:"BM" */
0x00, 0x00, 0x00, 0x00, /* ファイルサイズ(0固定でOK) */
0x00, 0x00, 0x00, 0x00, /* 予約領域(2バイトx2個) */
0x00, 0x02, 0x00, 0x00, /* データオフセット 512バイト */
0x28, 0x00, 0x00, 0x00, /* 情報ヘッダサイズ:40(0x28) Windows bitmap */
0x00, 0x00, 0x00, 0x00, /* 画像の幅 常に正数 */
0x00, 0x00, 0x00, 0x00, /* 画像の高さ 負数だと上から下へ */
0x01, 0x00, /* プレーン数 1で固定 */
0x04, 0x00, /* 1ピクセルのデータビット数 4bitモード */
0x00, 0x00, 0x00, 0x00, /* 圧縮形式:無圧縮 */
0x00, 0x00, 0x00, 0x00, /* データサイズ:0固定でOK */
0x00, 0x00, 0x00, 0x00, /* 横解像度:0固定でOK */
0x00, 0x00, 0x00, 0x00, /* 縦解像度:0固定でOK */
0x00, 0x00, 0x00, 0x00, /* 格納されてるパレット数:0固定でOK */
0x00, 0x00, 0x00, 0x00, /* 重要なパレットのインデックス:0固定でOK */
/* 以下パレット 4bit画像の場合16色まで作成可能 */
0x00, 0x00, 0x00, 0x00, /* 00: 黒       */
0xFF, 0xFF, 0xFF, 0xFF, /* 01: 白       */
0xFF, 0x00, 0x00, 0x00, /* 02: 青       */
0x00, 0xFF, 0x00, 0x00, /* 03: 緑       */
0x00, 0x00, 0xFF, 0x00, /* 04: 赤       */
0xFF, 0xFF, 0x00, 0x00, /* 05: シアン   */
0x00, 0xFF, 0xFF, 0x00, /* 06: マゼンタ */
0xFF, 0x00, 0xFF, 0x00, /* 07: イエロー */
0x7F, 0x7F, 0x7F, 0x00, /* 08: グレイ   */
};

使い方は
まず512バイトのメモリを確保します
それをmemsetで0x00で初期化します
次にmemcpyで上記配列をコピーします
この配列は大きさを定義していないので、sizeofで配列長を指定する必要があります

このヘッダは画像の幅と高さを設定するだけで使うことができます
ファイルサイズ等は0固定でも画像として認識されます(少なくともWin7やPicasaでは)

幅と高さは一旦int32_t*型のポインタを作ってから、それに代入する形で行います
int32_t *w = (int32_t*)(&hoge[0x12));
int32_t *h = (int32_t*)(&hoge[0x16]);
みたいな感じで
幅は符号なしですが、高さは符号ありで扱います

画像ファイルはRGB値の指定ではなく、カラーパレットの番号を指定します
なので写真等の保存には向きません
256色等であれば多少はマシになりますが、最適化をしない場合は期待できないでしょう
せいぜいグラフを画像データとして保存する 程度の使い方が限界になります

なお、BitmapはRGBではなく、BGRの並びで、かつ予約があるので全体で32bitになります
パレットを追加する場合はその点に注意してください

1ピクセルのデータビット数を4から8にすれば256色Bitmapになります


そもそもマイコンで画像ファイル作るなよ というのはありますが、マイコンにかぎらず、Bitmap画像は簡単に作成することができます

2014年2月4日火曜日

顧客が本当に必要だったもの

顧客が要求した機能
  デジイチでドットサイトを使いたい

メーカーの理解
  デジイチにドットサイトを搭載すればいい

営業の表現
  カメラに照準器を内蔵し素早い撮影が可能

実際に得られたもの
  ドットサイトを内蔵したカメラ

顧客がほんとうに必要だったもの
  ドットサイトを載せるためのマウント


2014年2月1日土曜日

MAGPULスリング かってみた

amazonで売ってる 【実物】本家MAGPUL製 MS3 SLING (新型マルチミッションスリング) FDE を買ってみました

MAGPULスリングはいくつかのバージョンが有りますが、以前にHSSCの例会でMS2を使ってみて、結構使いやすかったので買った次第です
なぜMS3かというと、なんとなく目についたからという理由であり、一番最新のものはMS4ですが、これは若干使いづらそうなので、結果的にMS3で良かったと思っています

メーカーページは
http://store.magpul.com/product/MAG503/slings

Multi-Mittion Sling GEN 1 という感じの名前
価格は49.95USDなのでamazon価格はちょっと割高感ありますが、まぁこれくらいなら

カラーはフラットダークアースと表記されてますが、メーカーページにはBlackかCoyoteしかなく、おそらくCoyoteの方でしょう


MAGPULのロゴは、よく見ればあちこちにありますが、ぱっと見ではほとんど気になりません

MS2からMS3への変更点として、クリップが大きいと思います
MS2はカラビナのような形状でしたが、MS3では洗濯バサミみたいな形になっています
もちろん引っ張っても外れないような形状で、更にロック機構もあるのでちゃんと固定しておけば壊れない限り外れることはないでしょう
パーツは樹脂製のような質感ですが、これは金属パーツの上に樹脂を塗ってあるようです
これにより強度を維持しつつカチャカチャというノイズが減っており、おそらく寒冷地での使用も考慮に入れてのことだと思います

ヒモの両端は同じ形状のクリップがついており、右側の状態(棒にヘコミがついてる方)はロック解除状態で、左側の状態(棒にヘコミがついてない方)がロック状態です
これはかなり見づらいので、ロック機構は常にONで、外す場合にOFFにするというふうになれるのが一番だと思います

クリップは直径5.5mm程度までの棒 もしくは6mm程度までのロープを挟むことができ、ライフル側にちょうどいい固定用の場所がない場合はパラコードを結んで、それを使って固定することもできます

MS3ではクリップ形状が変わったこともあり、ライフル側の要求が少し強くなっています
なのでもしかしたらストックにつけるアダプタ(http://store.magpul.com/product/MAG500/119)やレールにつけるアダプタ(http://store.magpul.com/product/MAG502/46)が必要になるかもしれません


で、僕はなぜ長モノ銃を持ってないのにコレを買ったのかというと
こんな感じで使いたかったというのがあります
デジイチを持ち歩く場合、ブラブラと動いてしまって鬱陶しく、動かないように固定するとイザ使いたいときに構えづらい という問題がありました
であればクイックリリースができるスリングを使っちゃえばいいんじゃね ということでこんな感じになった次第です

カメラ側の吊環の強度が心配ですが、多分大丈夫だろう ということで使っています
反対側の吊環にもパラコードを付けてあり、一般的なストラップの使い方にすることも可能なので、状況に応じて切り替えることもできます

ただこの吊り方ではシャッターのあたりから垂直に重心がかかる方向に安定するため、結構ジャマという本末転倒な事態が発生しています
理想としては三脚穴を使って固定したいのですが、そうすると三脚を使いたいときに困るので なんともしがたいところです