So-net無料ブログ作成

JP4in1 MultiProtocol TX Module! - 送信機との接続 [DIY]

モジュールのファームが新しくなったので、バインドをしたい。
で、緑のランプはついてるけど、赤のランプはゆっくり点滅しているので、なんじゃらほいこれはとなり、Githubのdocsの中を探し手、TroubleShoutingの中にその記述がある。

LED 表示状態意味
点灯電源オン
消灯電源オフ
消灯プログラムが走っていないか設定されたプロトコルに対応する送信モジュールがない。
フラッシュ(0.05秒点灯0.1秒消灯)正しくないプロトコルが選択されている(コンパイル時設定がおかしいか、プロトコル番号がおかしい)
反転フラッシュ(1秒点灯、0.1秒消灯)送信機による設定や、チャネルからのバインド開始イベントを待っている
早い周期のブリンク(0.1秒点灯、0.1秒消灯)バインド実行中
ゆっくりの周期のブリンク(0.5秒点灯、0.5秒消灯)シリアルプロトコルが選択されているが、有効な信号が検出できない
さらにゆっくりな周期のブリンク(1秒点灯、1秒消灯)PPM信号が選択されているが、有効な信号が検出できない


見てみると、なんだかゆっくりとブリンクしているので、どちらにしても、送信機からの信号が必要らしい。
とすると送信機からの信号をつなげないといけない。

今回、接続を想定する送信機は、いわずとしれた12Zなので、まずは接続方法を考える。
考えられる接続方法は、2つ。
1.送信機と送信モジュール間の信号をいただく。
2.トレーナーケーブルからの信号をいただく。

1番は、信号を宇悪扱うことができれば、プロトコル変更まで、対応できる可能性があるが、
(40Mのバンド周波数をもらって、対応表で設定するなど)、どんな信号が出てるかもわからないからこれはできない。
2番は、トレーナからの信号がPPM8chを出せれば、うまくいきそうで、それは、設定すれば
うまくいったので、こちらを採用する。

ケーブル.png

ということで、図ののようなケーブルを作成したが、モジュールが起動しない(緑ランプがつかない。Jp4in1内の送信モジュール内では、AMS1175Vというのが5Vの電源を供給し、さらにそこから3.3Vを作っているが、12Zの電池出力は、6V付近だったので、多分レギュレータのドロップ電圧の中に巻き取られて、5Vが安定的に作れなくなっていると想像した。そこで、電源のラインを切断して、別途2セルのバッテリーをつけることにした。そのあたりの話は、いったん分けよう。しかし、送信機のSignalOutをPPMに接続し、V+に2セルの電池を設定することで、十分に起動することが可能になった。

プロトコル設定
機体と話しをするプロトコルを設定する。設定の仕方は、プロトコルグループ番号(バンク)を設定し、さらにプロトコル番号を設定する。16進ロータリースイッチだけだと、最大15(もしくは16)しか設定できないけど、バンクを使って70プロトコルにまで対応でき量になっている。
バンク番号プロトコル番号プロトコル
11Flysky
12AFHD52A
13AFHD52A
14AFHD52A
15AFHD52A
16AFHD52A
17AFHD52A
18SFHSS
19FrSkyV
110FrSkyD
111FrSkyX(CH_16)
112FrSkyX(EU_16)
113DEVO
114Wk2x01
21DSM(DSM2_11)
22DSM(DSM2_22)
23DSM(DSMX_11)
24DSM(DSMX_22)
25DSM(DSM2_11)
26DSM(DSM2_22)
27DSM(DSMX_11)
28DSM(DSMX_22)
29SLT
210HUBSUN(H107)
211HUBSUM(H301)
212HUBSUN(H501)
213HiSKy
214V2X2
31ESKY
32ESKY150
33ASSAN
34CORONA
35SYMAX
36KN_WLTOYS
37BAYANG
38BAYANG(H8S3D)
39BAYANG(X16_AH)
310BAYANG(IRDRONE)
311H8_3D(H8_3D)
312H8_3D(H20H)
313H8_4D(H20MINI)
314H8_3D(H30MINI)
41M3XQ(WLH80)
42M3XQ(X600)
43M3XQ(X800)
44M3XQ(H260)
45M3XQ(E010)
46M3XQ(H26WH)
47HONTAI(HONTAI)
48HONTAI(JJRCX1)
49HONTAI(XSC1)
410HONTAI(FQ777_951)
411Q303(Q303)
412Q303(CX35)
413Q303(CX10D)
414Q303(CX10WD)
51 CX10(CX10_GREEN)
52 CX10(CX10_BLUE)
53 CX10(DM007)
54 CX10(JC3015_1)
55 CX10(JC3015_2)
56 CX10(MK33041)
57 Q2X2(Q222)
58 Q2X2(Q242)
59 Q2X2(Q282)
510CG023(C023)
511CG023(YD829)
512FQ777
513YD717(YD717)
514MT99XX(MT99)


おいらが使いたいのは、FRSKYDなので、バンク1で、プロトコル番号10となる。
でこの数字を覚えておいて、モジュールに設定する。

PPMモードでのプロトコル設定に必要な手順は2つ。
バンクを設定する
プロトコル番号を設定する。
となる。
バンク番号を設定するには、

1.ロータリースイッチを15に合わせる。15って、0に合わせて1クリック左。
2.電源を入れる。(もしすでに入っていた場合には、一回切ってから)
3.現在のバンク番号をLEDにて通知される。”ちかっちかっ”って光ってしばらく消灯する。この場合だと現在選択されているバンクは2番。
4.バンクが選択される=(ちかっちかっがバンク番号になる)まで、Jp4in1のBINDボタンをクリックする。Jp4in1がバンク切り替えを受け付けると、1秒間赤のLEDが点灯し、その後、3のようにバンクが示されるから、4の手順でバンク番号を指定する。
5.対象のバンク番号になったら電源を切る。

次にプロトコル番号を設定する。

プロトコル番号を設定するには、電源が切れている状態で、ロータリースイッチに、先ほどのプロトコル番号を設定する。FrSkyDだとプロトコル番号が、10なので、8までダイアルを回し、さらに2個左側に回す。
これで、電源を入れると、バンク番号とプロトコル番号が正しく認識され、送信モジュールが、稼働するようになる。

プロトコル表には、同じエントリが複数設定可能なようで、実際に設定されているようだ。


機体とのバインド


機体とのバインドは、機体側の受信機を受信モードに設定する。例えば、UR65とかだと電源を入れた後バインドボタンを押してバインドモードに設定する。すると機体のLEDがゆっくりブリンクする。
その後、バインドボタンを押しながらJp4in1の電源を入れる。ここで、うまくいけば、バインドが完了する。

FRSKYやSHFSSのモードだと、送信周波数の微調整が必要な場合があるそうだ。うまくいかない場合は、PPMモードでは、ソースに強制チューニング値を設定して、ダウンロードを繰り返して、探すなんてこと必要になるらしいが、コンパイルとアップロードを繰り返しながら、値を探すなんてのはやってられないと思うので、その時は、Jp4in1と受信機のペアを、OpenTXの送信機に接続して、シリアルモードで、設定するのがいいと思う。どうしても自力でやるときは、先ほどのコンパイル&アップロードで、値を探すことになる。
このあたりも
https://github.com/pascallanger/DIY-Multiprotocol-TX-Module/blob/master/docs/Frequency_Tuning.md
に書いてあるので、知らで確認してください。




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

JP4in1 MultiProtocol TX Module ーソースのダウンロードとArduinoの準備 [DIY]

ソースのダウンロード


ファームウェアのアップデートに関して、二つの方法があり、


コンパイル済みバイナリのダウンロードして、それを書き込む方法

ソースからコンパイルをローカルで行い、できたバイナリを書き込む方法
の二つがあるが、ここでは、自力でコンパイルを行って、書き込む方法を選択する。

まずはソースのダウンロードについて。
前のページでも書いたけど、Jp4in1は、ハードウェアの提供のみで、ソースはおまけで、自分でバンバンしなさいと書いてあり、そこに、ソースのありかが書いてある。まずは、そこに行ってみる

GW-00011.jpg
すると右のほうに”Clone or Download"というボタンが出てくるので、それを押してZIPでダウンロードする。
GW-00012.jpg

でダウンロードしたものを、展開すると次のようになっているので、適当な場所に展開する。
GW-00014.jpg


Arduinoのダウンロード


DIY Mulitiprotocol のコンパイルは、Arduinoを使用する。Arduinoは、AVRのマイコンを使って、インターフェースなど共通規定化し、いろいろなセンサ等のハードウェアをお試しできるシステムがあって、ここでは、そのIDEを使用する。Arduinoの標準では、AVRのコンパイラが付いてくる、Jp4in1はSTM32を使うので、別途コンパイラを用意しないといけないが、このソースを開発したPascal Langerさんは、ボード定義や、コンパイラを含めたパッケージを用意してくれているので、それをダウンロードするだけで、コンパイルが可能となる。

まずは、Arduinoのダウンロードとインストールをするわけだけど、それはいろんなところで紹介されてるので、そちらで。。

いまからJp4in1をコンパイルするための、Arduinoの設定をするわけだけど、詳しいことは、
https://github.com/pascallanger/DIY-Multiprotocol-TX-Module/blob/master/docs/Arduino_IDE_Boards.md
に書いてあるので、英語で蕁麻疹が出ない人はこっちに当たったほうが正確です。


Arduinoを起動して、”ファイル”→”環境設定”のダイアログを開き、
追加のボードマネージャのURLに、以下を入力する。
https://raw.githubusercontent.com/pascallanger/DIY-Multiprotocol-TX-ModuleBoards/master/package_multi_4in1_board_index.json
GW-00017.jpg
そしてOKを押して、

”ツール”→”ボード:xxxxxx*→”ボードマネージャ”を選択して、

GW-00018.jpg

検索ボックスに ”multi"と入力すると、Pascal Langer さんのパッケージが3つ表示される。そのうちSTM32って書いてあるやつだけをダウンロードすればいい。
STM32書いてあるところの箱を一回クリックすると、右下にバージョン選択ボックスとインストールボタンが表示されるので、それで、インストールをクリックする。
GW-00021.jpg
するとコンパイルが可能になる。

検証コンパイル



コンパイラの準備ができたので、コンパイルを実施する。がその前に、
ボードを選択する必要がある。
”ツール”→”ボード:xxxx”→ボードマネージャの一覧に
Multi 4-in-1 (STM32F103CB)
が追加されているのでそれを選択する。
GW-00022.jpg

選択がうまくいくと、Arduinoのフレームの右下の表示がCOM5のMulti 4-in-1 (STM32F103CB)のように変わる。COM5の番号はここでは不問。

そこで先ほどダウンロードして、展開したソースファイルから、
DIY-Multiprotocol-TX-Module\Multiprotocol\Multiprotocol.ino
をオープンする。
GW-00024.jpg

この段階で、ほぼ準備はできているがもう一つやることがある。
このプロジェクトでは、アップロードのメソッドをコンパイル時に指定する必要があらしくデフォルトの設定ではコンパイルが失敗する。送信機からのアップロード用に設定されていて、環境を何かにあ焦る必要があるみたいだけど、それが不明というか調べてない。

で、何にする必要があるかというと、
Upload via Serial inc. Bootloader (FTDI)
を選択する。これで、コンパイルまでできる準備が完了したので、
検証コンパイル(丸のチェックボタンを押す)をやってみる。
すると何事もなくコンパイルが開始され、終了する
GW-00027.jpg

はず。

ここまできたら、Jp4In1をコンピュータに接続ずる。普通に売ってるUSB A->miniBのケーブルでいい。

Winodowsコントロールパネルのデバイスマネージャを開く。
GW-00029.jpg

ちゃんとWinodws10でもあるので、Start->Windowsシステムメニュー→コントロールパネル→デバイスマネージャで起動した後、Jp4In1を接続する。すると、COMポートに新しくデバイスが追加される。
GW-00031.jpg

僕のでは、
”Silicon labs CP210x USB to UART Bridge"が”COM5"に接続されている様子がわかる。
このCOM5を記憶しておく。


ケーブル100均のやつでもいいじゃないかと思うけど、気になる人は高いのをどうぞ。それより、コンピュータ側のハードの側の状態のほうがどうも怪しい気がしていて、シリアルをつかった設定をするときは、マシンごとリセットをしたほうがいい感じがしている。特にノートパソコンは。現に書き込みに際して、うまく認識はするけど、書き込みはできないなんてときにそんな状態が起こっている感じがある。うまくいかなかったら、マシンのリセットをして、それでもだめならほかの手を打つほうがいいような感じがしている。

そしたら、Arduino IDEの”ツール”→”シリアルポート:COMxx*->からCOM5を選択する。

そこで、ファイルメニューの下の、右向き矢印ボタンをクリックすると、再度アップロード向けコンパイルが実施される。コンパイルなしで直接書く方法もあるんだろうけど、調べてない。コンパイルもそこそこかかるので、できれば飛ばしたい時もある。
このときは、コンパイルが終わると、自動的にアップロードも開始される。抜粋するけど、代替こんな感じ。
GW-00036.jpg

うまくアップロードまで終了すると、最後に

Wrote and verified address 0x08016e64 (100.00%) Done.

Starting execution at address 0x08002000... done.

と表示され、アップロードが完了し、新しいファームで、Jp4in1が動き出す。

まずはアップロードまで。


次回バインド編。

タグ:Arduino STM32 jp4in1
コメント(0) 
共通テーマ:趣味・カルチャー

トリガーゲージ TG3 (その3) [DIY]

TG3のディスプレイは、160x128と前回のものより約4倍の情報量を誇る。といっても今どきのスマホの改造度は、2048x1280とかだったりするから、それに比べれば足元にも及ばないのはゆうに及ばず。
最も大きな違いは、情報量もそうだが、カラー表示になったことで、非常に見やすくなっている。
IMG_2301.jpg

表示されている内容は、画面全体にグラフが表示され、右上に、現在の動作状態、計測中ポイントの荷重、SDカード上に主t力されているファイル番号、撃発時の荷重が表示される。
撃発時の荷重は、グラフ上で、赤のクロスカーソルで表示される。

TG3はSDカード上にデータを記録する。起動時にSDカードのチェックを行い、挿入されるまで起動しない。
計測したデータは、SDカード内のフォルダ、"data"フォルダにCSVファイルとして記録されており、計測の度に新しい番号を付与する。
なお、構造が簡単なため時計を持てないので、ファイル作成日付は入らない。




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

トリガーゲージ TG3 (その2) [DIY]

TG3を作ろうと思ったきっかけは、この部品を見つけたから。
IMG_2361.jpg

これはロードセルといって、金属のひずみを計測する部品で、金属のばね定数?をつかって荷重を測る装置。弾性変形中の金属しか測れないので、ある程度重さをかけると壊れちゃう。マージンがある程度あるがそれでも1.5倍くらい。しかも500gこれは、何かを連想させてしまう。

しかも500gを測るキッチンスケールは、1g単位で数字が出てくるぞ!ならこれでも行けるはずだ!

なんてのが発送の原点。

だがしかし、そうは問屋が卸さなかった。

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

トリガーゲージ TG3 (その1) [DIY]

今回から何回かにわたって、TG3を特集する。

TG3は、トリガーの引いた距離とともにそのときの荷重を計測できる装置で、ミリより細かい単位で、荷重を計測できる。

前回に作成したトリガーゲージも計測というところ自体は同じようなものだが、今回は、荷重センサにロードセルを使用している。このため、より精度の高い計測が可能となり、10mg単位まで計測できる(しかし、制度的にはこの10倍の0.1g単位と思っている。)

TG3とトリガーゲージのSpecは以下の通りとなる。
機能トリガーゲージTG3
荷重センサ高分子フィルムの接触抵抗を圧力により変化させるタイプの圧力センサを用い、固定抵抗とこのセンサを電源に直列に接続することにより、圧力変化を電圧の変化として12bit計測ストレインゲージを用いたロードセルに対して、ホイートストンブリッジを用いて24bit計測
ディスプレイ白黒STN液晶

128x64ピクセル

1.8インチカラーTFT

160x128ピクセル

画面は小さいが情報量が多い

カーソル移動制御28Byj-48ステップモータ

ステップモータドライバ制御による1-2相制御

28Byj-48ステップモータ

ダイレクトドライブによる2相制御

カーソル保持5φねじロッド

1軸6φ真鍮ロッドとブッシュ

5φねじロッド

2軸6φ真鍮ロッドとリニアブッシュ

データ保持なしSDカード

8G以下(多分)

撃発検出荷重が20g以上変化した場合撃発音検出

APでも検出可能

対応銃APS-3
AP200
GP100
APS-3
AP200
GP100
お姿iphone/image-20160217221843.pngIMG_2253.JPG

プロトタイプ



となっている。
コメント(0) 
共通テーマ:趣味・カルチャー

ゲイテッドレーザーサイト その6 (とりあえずソフトウェア) [DIY]

昨日、更新したら、ページビューがぐんとあがってて、ちょっと喜んでます。

まだ、APSには関係が薄いので、その筋の人は以下は読まなくてもいいかも。


で、
今回は、12f683のソフトウェアに関して。

まずは、ちょっと長いけど全文。
// PIC12F683 Configuration Bit Settings

// 'C' source line config statements
// $Header: /home/jake/Project/GatedLaserSight/Firmware/main.c,v 1.2 2015/03/24
13:01:15 jake Exp $
#include 
//#include 

// #pragma config statements should precede project file includes.
// Use project enums instead of #define for ON and OFF.

// CONFIG
#pragma config FOSC = INTOSCIO  // Oscillator Selection bits (INTOSCIO oscillato
r: I/O function on RA4/OSC2/CLKOUT pin, I/O function on RA5/OSC1/CLKIN)
#pragma config WDTE = OFF       // Watchdog Timer Enable bit (WDT disabled)
#pragma config PWRTE = ON       // Power-up Timer Enable bit (PWRT enabled)
#pragma config MCLRE = ON       // MCLR Pin Function Select bit (MCLR pin functi
on is MCLR)
#pragma config CP = OFF         // Code Protection bit (Program memory code prot
ection is disabled)
#pragma config CPD = OFF        // Data Code Protection bit (Data memory code pr
otection is disabled)
#pragma config BOREN = OFF      // Brown Out Detect (BOR disabled)
#pragma config IESO = OFF       // Internal External Switchover bit (Internal Ex
ternal Switchover mode is disabled)
#pragma config FCMEN = OFF      // Fail-Safe Clock Monitor Enabled bit (Fail-Saf
e Clock Monitor is disabled)

#define _XTAL_FREQ 4000000

//#define GATE  GP0
#define LASER GP5
#define ON 1
#define OFF 0

volatile char gate;


void interrupt isr(void)
{
  if(PIR1bits.CMIF==1){                   // if set by Comparator
    if(CMCON0bits.COUT==1){
      gate = 1;           // gate is on
    }
    PIR1bits.CMIF = 0;
  }
}
main()
{
  // set internal clock oscillator
  OSCCONbits.IRCF=0b110;
  OSCCONbits.SCS=1;
  OSCTUNE=0;
  // そのほかのビットはリードオンリー


  // set I/O
  // set ANSEL Fosc/2,ANS=
  ANSELbits.ADCS=0b101;
  ANSELbits.ANS0=1;

  // reset GPIO
  GPIO=0;
  TRISIO=0;           // set as all output
  TRISIObits.TRISIO0=1;
  //ANSEL=0;            // set no use analog input
  CMCON0bits.CM= 0b101; // Comporator Mode Mulitiplex input with internal refere
nce
  CMCON0bits.CIS=1;     // Connect GP0/CIN+ to Comparator
  CMCON0bits.CINV=1;    // Comparator out when GP0 is over reference

  //set Vref
  VRCONbits.VREN=1;     // VRef enable
  VRCONbits.VRR=1;      // VRef Low Range
  VRCONbits.VR=10;      // 13/24*3.0=1.625V

  //interrupt setting
  INTCONbits.PEIE=1;    // Enable periphrall Interupt
  PIE1bits.CMIE=1;      // Use Comperator interrupt
  INTCONbits.GIE=1;     // Enable Interrupt
  PIR1bits.CMIF = 0;

  // Welcome LIT
  LASER=ON;
  __delay_ms(500);
  LASER=OFF;


  unsigned char state =0;
  while(1){
    if (gate==1)
      {
        gate=0;
        LASER=ON;
        __delay_ms(1500);
        LASER=OFF;
        //__delay_ms(500);
      }
  }
}



説明:
1-5行目パス
6行目今回開発系としXC8を使う。昔のコンパイラは、PICの型番号をインクルードファイルとして指定してそのなかで書くデバイス用の定数定義をしていたが、現在のものは、コンパイラの起動引数として宣言される。そのため、分ける必要は無い。こうしておけば、デバイスが変わっても、たとえばピン数が増えるなどで機能が変わらない上位デバイスに変更するとしても、プログラムを変更しないで使うことができる。 ことを目指しているが、アーキテクチャが異なればこの限りではない。ここでは、xc。hをインクルードする。
9-27行目コンフィグレーションワードの記述。MPLABXで自動的に生成されたテキストをコピーする。
29-34行目このプログラム特有の定数定義 _XTAL_FREQ: デバイス動作中のクロック周波数を指定する。(この値は、delay関数内で使用される) LASER:レーザダイオードの制御信号出力ポート
39-47行目割り込みサービスルーチン。 メインプログラムで、コンパレータの結果で閾値を越えると割り込みが起こるように設定しており、この関数で、割り込みを処理する。 この関数では、割り込みがコンパレータによるものかを確認し、さらにコンパレータ出力がオンのとき、ゲート変数を1にする。このゲート変数は、メイン関数のループ内で常に参照され、割り込みがあったことをメインプログラムに伝える。 gate変数を設定した後で、コンパレータ割り込みを再設定している。(英語で言うとリセットね)。


続きは、続きで。




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

エジソンがきた。 [DIY]

といってもインテルのやつです。


とっても小さいコンピュータです。これで、500MhzのAtomCoreが2個入りで、Wifi、BlueToothが動きます。
これだけでです。
つまり、WEBサーバなんかであればこれだけで(電源周りがひつようだけど)作れちゃうわけです。
これをUSBまで拡張しちゃえば、USBの機器がつなげちゃうわけです。

とはいえ、最初に使うのこのままだと何かと面倒なので、

にのっけることで、Ardinoとして動かすことができます。

Arduinoと違うところは、半端ないコンピューティングパワーです。ペンティアム3二個分の
があるといえばわかってもらえるでしょうか?
下手なXPパソコン2台分ってことになります。

すごいですねー
Edison を乗っけてみました。




で、なにに使おうかは決めていないところが問題。

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

Aiball のカメラモジュール [DIY]

aitendoのカメラモジュールが、Aiballで使えます。
ただしカラーバランスが悪い。あと横向き。
だけど、レンズがはずせる。。。。

これであたりを使ったりなんかすると、
さてお立会い!




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

何が幸いするかわからんもので [DIY]

ぷらっと君は、WIFI搭載の小型カメラで撮影した画像をOpenCVで加工したものだが、これに使っていたカメラが、Ai-ballと呼ばれるカメラで、ものすいごく小く軽い。
しかし、画角が大きい。ぷらっと君はで使うにはもう少し狭くしたい。逆に言うと望遠化したい。
そこで、いろいろ物色しているなかで、Aitendoにボードレンズが売ってるのを見つけた。395円これは試してみるかというので、一回買って、いわゆるWEBCAMERAで使えるかと思ってつけてみると、ぴったり入る。まあ、規格物なので、そんなにずれてないんだろうとは思っていたんだけど。
これは、ちょっと望遠よりのレンズなんだけど、焦点距離は、6mm。像が1.5倍くらいに拡大されている。
写真もあるけど、個人情報に該当するようなもので、ここでは掲載しません
;-p

このカメラは、解像度が若干いいけど、そのためかフレームレートが遅い。
#表示してるプログラムがおれの作った試作品なので、それが原因のような気もするが。
WEBCAMERAの実験に気をよくして、AIBallのカメラをいじろうとした。
AiBallのカメラはPマウント(というらしい)にレンズが搭載されている。ピンホールかと思ったけどレンズのようだ。
さっきのここで、さっきのボードレンズをつけてみるとどうなるんだろうって、当然思うわけで、Ai-Ballにマウントしたまま、ペンチでぐりっとまわすと、案の定硬いな。と思ってよく見るとカメラがういてる。

あれ、あれ、あれ、あれ、おおお、まずい。

電源入れてみると、WiFiのアクセスポイントは見えている。
 
 助かったかな?

と思い、ソフトで見てみると、絵が出ない

 "絵?”

などと冗談を言ってる場合ではない。何度やっても。カメラ画像が出ない。

で、カメラをよく見るとフレキ基盤がこじれている。

 ”あ、断線しやがった”

これで、カメラがおかしいことが判明した。

AiBallはWebサーバになっているので、URLをくれてやると、いわゆるWEB画面とその中央に、
画像を表示するフレームがある。

いつまでたっても、白いものしか写らなかった。


とりあえず、へこんで、こんな形で修理を受け付けてくれるわけはないであろうが、メーカに修理ができるかどうかのメールを送って、タイマーのデバッグを開始した。そのときに部品箱のなかから、以前買った"キーレスエントリ"型カメラヲ見つけた。キーレスエントリを模したカメラで、小さいカメラで、ヘリにくくりつけた撮影を行おうとして買ったカメラだが、数回のフライトの後、カメラとしての動作をやめてしまったので、部品箱の中に、

 ”カメラはほかので使えるかもなあ”

とかおもっておいといたものだ。ちなみに、このときは、同じカメラを2台水平に置いて、撮影したものを、二つ同時に再生して、ステレオ画像で確認するみたいな、今ほかの人がやってるようなことをやってたんだけど、何しろ、カメラとして動かないので、そこまでの実験はできてない。

このカメラつかえるかなと思い、基盤から引っぺがしてみると、同じコネクタ。

 ”そんなにうまい話はねーだろ"

実は、Aitendoでこのカメラと同じコネクタのカメラを偶然買っている。で、それもつなげてみた。当然何も起こらない。というのを一度経験しているので、あまりうまくいくとは考えていなかったが、でも同じ解像度(VGA)だし、どうせここのままでは動かないし、って思ってつなげてみると、

 上下反転、
 カラーバランスが異常

であるものの、画像を送り出している!
想定の用途では、色はどっちでもいいし、逆転して他方が、銃への取り付けは簡単になるかもしれない。


image-20140720232344.png

前にある小さいカメラが、今回ぶっ壊したもの。Aiball には取り替えたものがついている。

ただし、レンズは糊付けしてあるので、また、別のカメラを探して実験することとしよう。

キーワードは、0.5mmピッチ24ピンコネクタ、とVGA


コメント(0) 

ちょっと面白いものを作ってみた。 [DIY]

OpenCVという画像処理ができるソフトがあるんだけど、これを使ってどんなことができるかは、気になっていたんだけど、ちょっとかいてみただけで、こんなことができた。

画像ソースは、昨日のAPS練習会でとったプレートの銃口からの風景です。
これに対して、
plate1.jpg
このファイルを画像の各フレームから探せとやって、
探した結果の質が0.4以上なら赤い枠をつけるというものです。
音声をつけられるといいんだけど、ちょっとまだやりかたがわからないので、映像だけです。


見えちゃいけない景色が見えていますが、よい子はまねしないようにしましょう。

元画像では、"図形”に残ってるけど、これはあくまでも結果です。
単にへたくそであります。それはいいの!

ソース整形とか、コメントクリアとかぜんぜんやってないけど、まあ、後で見るかもしれないし、誰かの役に立つかもしれないからさらします。たぶん俺が一番使いそうだけど。。。。

// opencv1.cpp : メイン プロジェクト ファイルです。

#include "stdafx.h"
#include 
#include 
#include 

using namespace System;

int main(array ^args)
{
	Console::WriteLine(L"Hello World");
	cv::VideoCapture cap("C:\\Users\\jake\\Videos\\avis\\platecut.avi");
	// ファイルがオープンできたかの確認
	if(!cap.isOpened()) return -1;
	// 探索画像
	cv::Mat tmp_img = cv::imread("plate1.bmp", 1);
	if (tmp_img.empty()) return -1;
	cv::Mat tmpgray_img;
	 cv::cvtColor(tmp_img, tmpgray_img, CV_BGR2GRAY);
	int fps = 15;
	cv::Mat frame;
	cv::Mat frame_gray;
	cap >> frame;  // キャプチャ
	cv::Size cap_size(frame.cols,frame.rows);
	cv::VideoWriter writer("C:\\Users\\jake\\Videos\\avis\\platemarked1.mpg", CV_FOURCC('M','P','E','G'), fps, cap_size);
	int count=0;
	// cv::namedWindow("Capture", CV_WINDOW_AUTOSIZE|CV_WINDOW_FREERATIO);

		while(1) {
			cv::Mat frame;
			cv::Mat frame_gray;
			cap >> frame;  // キャプチャ
			if (frame.empty()) break;

			 cv::cvtColor(frame, frame_gray, CV_BGR2GRAY);


			// 様々な処理
			// ...
			cv::Mat result_img;
			// テンプレートマッチング
			cv::matchTemplate(frame_gray, tmpgray_img, result_img, CV_TM_CCOEFF_NORMED);

			// 最大のスコアの場所を探す
			cv::Rect roi_rect(0, 0, tmp_img.cols, tmp_img.rows);
			cv::Point max_pt;
			double maxVal;
			cv::minMaxLoc(result_img, NULL, &maxVal, NULL, &max_pt);
			roi_rect.x = max_pt.x;
			roi_rect.y = max_pt.y;
			//std::cout << "(" << max_pt.x << ", " << max_pt.y << "), score=" << maxVal << std::endl;
			Console::WriteLine("frame:"+count+"( "+max_pt.x+" , "+max_pt.y+") score="+maxVal);
			// 探索結果の場所に矩形を描画
			if (maxVal>0.4){
				cv::rectangle(frame, roi_rect, cv::Scalar(0,0,255), 3);
			}
			cv::namedWindow("search image", CV_WINDOW_AUTOSIZE|CV_WINDOW_FREERATIO);
			//cv::namedWindow("result image", CV_WINDOW_AUTOSIZE|CV_WINDOW_FREERATIO);
			cv::imshow("search image", frame);
			writer << frame;
			count++;
			//cv::imshow("result image", result_img);
			//    cv::imshow("Capture", frame);
			//
			int ch;
			ch=cv::waitKey(10);
			if (ch == 'e') {
				break;
			}

		}
	writer.release();
	

	return 0;
}


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