So-net無料ブログ作成

トリガーゲージ 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) 
共通テーマ:趣味・カルチャー

300円 [DIY]

これでしばらく遊んでみよう

image-20140420234532.png
HARDOFF で買ってきた300円なり。
詳細後日

nice!(0)  コメント(0) 

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。