日々の記録

ほどよく書いてきます。

keyence VHX画像データから測定値を吸い上げる

2018年06月02日 22時31分35秒 | プログラム

キーエンスのVHXというデジタルマイクロスコープをよく使っているが、寸法計測した値をたくさん処理するときに面倒があった。

csvファイルを保存してそのデータを読み込む。→面倒くさい

しかし、VHXの画面上でjpg画像を見るとデータありみたいなアイコンになるので、jpgファイルにデータが埋め込まれているはずだと考えた。

自動でまとめまでできれば、jpgだけ持って帰って処理すればいいので楽になる。

バイナリデータを見る限り、末尾に測定値が埋め込まれているようだ。しかもプレーンテキストで。ラッキー。
では、これらを取り出して必要なデータを取り出せばcsvファイル出力の一手間が省略できる。

[メイン]以下のデータだけで済むだろうから、そこを取り出す。おそらくバイナリを比較して[ メイン ]の文字を探して行けばいいが、作り始めたときはjpgデータ無いに文字列と同じバイナリ列があるかもと思ってjpgファイルのFFD9(0xFF 0xD9)のデータを探したあとに文字列を探すことにした。

jpgファイルは、0xFFが特徴的な識別子になっていて、jpg構造の最後には0xFF 0xD9の2バイト並びでファイルが終了する。しかし、サムネイルを含んでいる場合はサムネイルもまたjpg構造を持っているので、ファイルの最後の0xFF 0xD9を探し、それ以降のテキストを比較することにした。

 

command button1,2は上のボタンです。出力行が21だったり、変数固定の部分がいくらかあります。赤文字は上の表の当該セルなので場所を変えたらソースも変えてください。

Const StartCol = 20
Option Explicit
Private Sub CommandButton1_Click()
Dim FileName
Dim FileNames

FileNames = Application.GetOpenFilename("VHX jpg files,*.jpg", , , , True)
If TypeName(FileNames) <> "Variant()" Then
    Exit Sub
End If

For Each FileName In FileNames
    Call ConvertVHXimageFile(FileName, ConvertFileName(FileName))
    
Next FileName

MsgBox "done"

End Sub

Function ConvertFileName(VHXimageFileName) As String
    'ファイル名の拡張子をtxtにするだけ。関数にせんでもよかったな。
    ConvertFileName = Left(VHXimageFileName, InStrRev(VHXimageFileName, ".")) & "csv"
End Function

Sub ConvertVHXimageFile(VHXimageFileName, OutputTextFileName As String)

Dim Fn As Integer   'ファイル入出力番号として
Dim i As Long       'どっかで使う
Dim j As Long

Dim EOBinary As Long    'jpgのバイナリが終わる位置
Dim TxtStart As Long    'テキスト開始位置
Dim VHXimage() As Byte  'jpg画像のバイナリを入れる配列

'ファイルを開いて配列に入れる
Fn = FreeFile
Open VHXimageFileName For Binary As #Fn
    ReDim VHXimage(LOF(Fn))
    Get #Fn, , VHXimage
Close #Fn

'jpgデータ終わりを示すFFD9を探す
'なぜかVHXの画像には複数のFFD9があるから最後まで探す
For i = 0 To UBound(VHXimage) - 1
    If VHXimage(i) = &HFF And VHXimage(i + 1) = &HD9 Then
        EOBinary = i
    End If
Next i

'[ メイン ]の文字列を探す
Dim HeaderOfText() As Byte
HeaderOfText = StrConv("""[ メイン ]""", vbFromUnicode) '文字列をバイナリ配列にしておく
Dim SizeOfHeader As Long
    SizeOfHeader = UBound(HeaderOfText)

'データ探し
For i = EOBinary To UBound(VHXimage) - SizeOfHeader
    For j = 0 To SizeOfHeader
        If VHXimage(i + j) <> HeaderOfText(j) Then '文字列が違ったらすっ飛ばし
            Exit For
        End If
        
        If j = 9 Then       '文字列合致が9回?連続したら本物 ■9回じゃなくて、変数にできるやろ
            TxtStart = i    'そこがtextの開始行だ!
            Exit For
        End If
    Next j
Next i

'出力ファイルの準備。
Dim OutTxt() As Byte
'サイズの定義
ReDim OutTxt(UBound(VHXimage) - TxtStart)

For i = TxtStart To UBound(VHXimage)
    OutTxt(i - TxtStart) = VHXimage(i)
Next i

'ファイル出力
Fn = FreeFile
Open OutputTextFileName For Binary As #Fn
    For i = 0 To UBound(OutTxt) - 1
        Put #Fn, , OutTxt(i)
    Next i
Close #Fn
End Sub
コメント

microSDカード転送速度

2018年04月13日 20時58分18秒 | プログラム

Toshiba Exceria 64GB

-----------------------------------------------------------------------
CrystalDiskMark 6.0.0 x64 (UWP) (C) 2007-2017 hiyohiyo
Crystal Dew World : https://crystalmark.info/
-----------------------------------------------------------------------
* MB/s = 1,000,000 bytes/s [SATA/600 = 600,000,000 bytes/s]
* KB = 1000 bytes, KiB = 1024 bytes

Sequential Read (Q= 32,T= 1) : 90.231 MB/s
Sequential Write (Q= 32,T= 1) : 23.724 MB/s
Random Read 4KiB (Q= 8,T= 8) : 6.073 MB/s [ 1482.7 IOPS]
Random Write 4KiB (Q= 8,T= 8) : 0.471 MB/s [ 115.0 IOPS]
Random Read 4KiB (Q= 32,T= 1) : 5.988 MB/s [ 1461.9 IOPS]
Random Write 4KiB (Q= 32,T= 1) : 0.469 MB/s [ 114.5 IOPS]
Random Read 4KiB (Q= 1,T= 1) : 5.213 MB/s [ 1272.7 IOPS]
Random Write 4KiB (Q= 1,T= 1) : 0.460 MB/s [ 112.3 IOPS]

Test : 100 MiB [I: 7.8% (4.5/57.7 GiB)] (x1) [Interval=5 sec]
Date : 2018/04/13 20:55:16
OS : Windows 10 [10.0 Build 16299] (x64)

 

Sandisk Ultra A1 128GB

-----------------------------------------------------------------------
CrystalDiskMark 6.0.0 x64 (UWP) (C) 2007-2017 hiyohiyo
Crystal Dew World : https://crystalmark.info/
-----------------------------------------------------------------------
* MB/s = 1,000,000 bytes/s [SATA/600 = 600,000,000 bytes/s]
* KB = 1000 bytes, KiB = 1024 bytes

Sequential Read (Q= 32,T= 1) : 92.303 MB/s
Sequential Write (Q= 32,T= 1) : 52.746 MB/s
Random Read 4KiB (Q= 8,T= 8) : 6.875 MB/s [ 1678.5 IOPS]
Random Write 4KiB (Q= 8,T= 8) : 2.752 MB/s [ 671.9 IOPS]
Random Read 4KiB (Q= 32,T= 1) : 6.833 MB/s [ 1668.2 IOPS]
Random Write 4KiB (Q= 32,T= 1) : 2.667 MB/s [ 651.1 IOPS]
Random Read 4KiB (Q= 1,T= 1) : 6.761 MB/s [ 1650.6 IOPS]
Random Write 4KiB (Q= 1,T= 1) : 2.541 MB/s [ 620.4 IOPS]

Test : 100 MiB [I: 30.3% (36.0/119.1 GiB)] (x1) [Interval=5 sec]
Date : 2018/04/13 20:59:33
OS : Windows 10 [10.0 Build 16299] (x64)

コメント

Rigaku XRDのrasファイル処理

2018年01月28日 22時41分26秒 | プログラム

RigakuのXRDを使っているが、出力されるrasファイルの中身が実際にはただのテキストファイルなので、それを読み込んでまとめてしまうマクロを作ろうと思っている。
解析は専用の解析ソフトがあるのだが、なんとなく画面キャプチャではなく、グラフはエクセルで書いて出そうなんて思っている。

rasファイルのフォーマットは

*RAS_DATA_START
*RAS_HEADER_START
*DISP_FMT_X "%.2f"
*DISP_FMT_Y "%.0f"

~中略~

*MEAS_SCAN_UNIT_X "deg"
*MEAS_SCAN_UNIT_Y "counts"
*RAS_HEADER_END
*RAS_INT_START
30.0000 877.0000 1.0000
30.0100 911.0000 1.0000

~測定データが続く~

79.9900 189.0000 1.0000
80.0000 189.0000 1.0000
*RAS_INT_END
*RAS_DATA_END

 

というようなファイル形式となっている。

測定データ以外の行は*で始まるので、これ以外の行の数字を処理していく。

データの並びは、

2θ 検出X線強度 アッテネータ減衰率

の並びであるので、出力としては

2θ, 検出X線強度×アッテネータ減衰率を出力すればよい。

 

 作ったコードはこんな感じ。5000点あるデータを12個処理するのに5秒くらいかかる鈍足だが、手でやるよりは早い。

Private Sub CommandButton1_Click()
Dim TwoTheta() As Double
Dim XrayIntensity() As Double
Dim FileName
Dim FileNames
Dim i As Long
Dim j As Long
Dim T1 As Double
Dim T2 As Double

ChDrive ThisWorkbook.Path


'複数のファイルを開く
FileNames = Application.GetOpenFilename("RAS File,*.ras", , , , True)
'キャンセルのとき、Booleanが帰ってくるので、Variant()のときだけ処理実行
If TypeName(FileNames) <> "Variant()" Then
    Exit Sub
End If

Application.ScreenUpdating = False

T1 = Timer()

'マクロに値を出力したくないので新しいワークブックを作る
Workbooks.Add
With ActiveWorkbook.Sheets(1)

j = 2

For Each FileName In FileNames  'ファイル名ごとに中身を調べていく
    
    Call LoadRasFile(FileName, TwoTheta(), XrayIntensity)
        .Cells(2, j + 1) = GetFileNameOnly(FileName)    'ファイル名を出力しておく
        For i = 1 To UBound(TwoTheta())                 '値の出力
            .Cells(i + 2, j) = TwoTheta(i)
            .Cells(i + 2, j + 1) = XrayIntensity(i)
        Next i
    j = j + 2
Next FileName
End With

T2 = Timer()
Application.ScreenUpdating = True
Application.StatusBar = "処理時間=" & Format(T2 - T1, "0.00") & "[s]"
  
End Sub
Function GetFileNameOnly(FullPath) As String
'ファイルのフルパスからファイル名のみを取り出す
GetFileNameOnly = Right(FullPath, Len(FullPath) - InStrRev(FullPath, "\"))  '最後の\より右側を取り出す
GetFileNameOnly = Left(GetFileNameOnly, InStrRev(GetFileNameOnly, ".") - 1)    '拡張子のピリオドで切り落とす

End Function

Sub LoadRasFile(FileName, ByRef TwoTheta() As Double, ByRef XrayIntensity() As Double)
'rasファイルの中身を読み込んでくる。TwoThetaに2θを、XrayIntensityにX線強度を格納する。
Dim TempString As String
Dim SplitedTempString() As String
Dim Fn As Integer
Dim i As Long
i = 1

Fn = FreeFile
Open FileName For Input As #Fn
    
    '■ヘッダ読み飛ばし
    Do
        Line Input #Fn, TempString
    Loop While Left(TempString, 1) = "*"
    
    
    '■データ読み込み
    Do
        SplitedTempString = Split(TempString, " ")
           
        ReDim Preserve TwoTheta(i)
        ReDim Preserve XrayIntensity(i)
        
        TwoTheta(i) = Val(SplitedTempString(0))
        XrayIntensity(i) = Val(SplitedTempString(1)) * Val(SplitedTempString(2))
        
        Line Input #Fn, TempString
        SplitedTempString = Split(TempString, " ")
                
        i = i + 1
        
    Loop Until Left(TempString, 1) = "*"
    
Close Fn
End Sub
コメント

画像一覧HTML作成のスクリプト

2017年01月23日 00時12分12秒 | プログラム
画像を表にして整理するのに便利なので作ってみた。
観察データを横並びに確認したいときなど、Excelに貼るよりも便利だから。

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<!-- 20170121 -->
<html>

<head>
<meta content="text/html; charset=utf-8" http-equiv="Content-Type">
<title>画像サムネイル一覧テーブル作成</title>
<style type="text/css">
    .param{
        width:100px;
    }
</style>
<script type="text/javascript">
function MakeTable(){
    var StartTime = new Date();
    var FileNameList = document.form.FileList;
    var htmlOut = document.form.HTMLOut;
    var note = document.form.Note;
    var ChSet = document.form.chrSet.value;
    var ImgDir = document.form.ImgDir.value;
    var LinkDir = document.form.LinkDir.value;
    var ColNum = document.form.TableCol.value;
    var TempText = "";

    FileNameList.value = FileNameList.value.replace(/\r\n/g, "\n");
    FileNameList.value = FileNameList.value.replace(/[\n]+$/g,"").trim(); //最後の改行コード処理
    
    if(FileNameList.value.length===0){
        alert("Input File Names");
    }
    
    else{
        var FileNameArray = FileNameList.value.split("\n");
        TempText += '<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">\n';
        TempText += '<html>\n<head>\n<meta content="text/html; charset='+ChSet+'" http-equiv="Content-Type">\n';
        TempText += '<style type="text/css">\ntable{\n';
        TempText += '  border-collapse:collapse;\n}';
        TempText += '\ntd{\n';
        TempText += '  border:1px black solid;\n';
        TempText += '  text-align:center;\n}';
        TempText += '\n';
        TempText += '<\/style>\n';
        TempText += '<title>Image Table<\/title>\n<\/head>\n<body>\n\n<table>\n';
        var i = 0;
        var j = 1;
        TempText += '  <tr><td><\/td><td colspan="' + ColNum + '">Image(s)<\/td><\/tr>\n  <tr>\n    <td>Index' + j++ + '<\/td>\n';
        for(i=0;i<FileNameArray.length;i++){
            if((i % ColNum ===0) && (i !== 0 )){
                TempText += '  <\/tr>\n  <tr>\n    <td>Index' + j++ + '<\/td>\n';
            }
        TempText += '    <td><img alt="" src="' + ImgDir + FileNameArray[i] + '" title="' + FileNameArray[i] + '"><\/td>\n';
        }
        if(FileNameArray.length % ColNum !==0){
            for(i=(FileNameArray.length % ColNum); i<ColNum ; i++){
                TempText += '    <td><\/td>\n';
            }
        }
    }
    TempText += '  <\/tr>\n<\/table>\n<\/body>\n<\/html>';
    
    htmlOut.value = TempText;
    
    var StopTime = new Date();
    var dT=StopTime-StartTime;
    note.value = "処理時間:" + dT + "[ms]";

}
</script>
</head>
<body>
	画像サムネイル一覧テーブル作成<br>
	<form name="form" action="post">
		<input type="text" name="ImgDir" value="small/" class="param"><span>:dir of the thumbnail images</span><br>
		<input type="text" name="LinkDir" value="org/" class="param"><span>:dir of the images</span><br>
		<input type="text" name="TableCol" value="11" class="param"><span>:number of columns</span><br>
		<input type="text" name="chrSet" value="sjis" class="param"><span>:charactor set</span><br>
		<textarea name="FileList" cols="40" rows="15">
                </textarea>
		<textarea name="HTMLOut" cols="120" rows="15">HTML output</textarea><br>
		<input type="button" value="Generate" onclick="MakeTable()"><br>
		<textarea name="Note" cols="50" rows="2">Log</textarea><br>
	</form>

</body>

</html>

コメント

JavaScriptを使った文字列連結を使ってファイル名一覧、コマンド一覧などを作成する。

2017年01月09日 19時27分58秒 | プログラム

仕事で網羅的な観察データを作成するとき、ある程度規則的なファイル名になることがある。
そのファイル名を一覧表にするのにファイル名から一覧表を作ればいいのだが、時折サンプルがなかったりと欠落がある場合がある。
そんな時のために網羅的なデータの一覧を作成しておいて、表を作っておくと便利じゃないかと思って作ってみた。

左から順番に文字列を網羅的に連結していくだけ。毎回プログラムっていうのも面倒臭いので、こうしたものがあると多少は便利になるかなと。

文字列を連結するだけなので、フォルダ作成のコマンドを大量に作るという用途にも使えるのでは無いだろうか。

 

連結したい文字列を増やす場合はhtmlソースの<textarea name="List" cols="15" rows="10">List[n]</textarea>を増やせばよい。

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>

<head>
<meta content="text/html; charset=utf-8" http-equiv="Content-Type">
<title>文字列結合</title>
<script type="text/javascript">
    function MakeNameList(){
    var StartTime = new Date();
    var NameListArray = new Array();
    var textOut = document.form.FileNameOutput;

    //配列の格納、末尾の改行はreplaceで削除しておく。
    for(i=0;i<document.form.List.length;i++){
        NameListArray[i] = document.form.List[i].value.replace(/\n+$/g,"").split("\n");
    }

    var TempText = "";
    var tempArray = new Array();

    //配列に構造があるが、データは無い、とするため、""のブランクを入れておく。    
    tempArray[0]="";
    for(var k=0, lenk = NameListArray.length;k<lenk;k++){
        TempText = "";
        for(var i=0, leni = tempArray.length;i<leni;i++){
            var lenj = NameListArray[k].length;
            for(var j=0, lenj=NameListArray[k].length;j<lenj;j++){
                TempText += tempArray[i] + NameListArray[k][j] + "\n";
            }
        }
        tempArray = TempText.replace(/\n+$/g,"").split("\n");
    }
    textOut.value = TempText;
    TempText = "";

    var StopTime = new Date();
    var dT = StopTime - StartTime;
    document.form.Note.value = tempArray.length + "データ\n" + "処理時間" + dT + "[ms]"; 
}
</script>
</head>

<body>
<form name="form" action="post">
<textarea name="List" cols="15" rows="10">List1</textarea>
<textarea name="List" cols="15" rows="10">List2</textarea>
<textarea name="List" cols="15" rows="10">List3</textarea>
<textarea name="List" cols="15" rows="10">List4</textarea>
<textarea name="List" cols="15" rows="10">List5</textarea>
<textarea name="List" cols="15" rows="10">List6</textarea>
<textarea name="List" cols="15" rows="10">List7</textarea>
<br>
<textarea name="FileNameOutput" cols="125" rows="10">output</textarea><br>
<textarea name="Note" cols="50" rows="2">ログ</textarea><br>
<input type="button" value="Generate" onclick="MakeNameList()"><br>
</form>
</body>

</html>
コメント

バッチファイルでファイル名の一部を削除する

2015年11月03日 18時20分52秒 | プログラム

備忘録。以下のバッチファイルで「キーワード」の文字列をファイル名から削除できる。
DSC_0000.jpgから、DSC_を削除したり、ソフトが連続して出力するファイル名からある文字列を策s所し

setlocal enabledelayedexpansion
cd /d %~dp0
set keyword=キーワード
for /f "tokens=*" %%i in ('dir /b ^| findstr /i "%keyword%"') do (
set a=%%i
ren "!a!" "!a:%keyword%=!"
)
pause

コメント

renameコマンドの処理(備忘録)

2014年10月18日 17時12分14秒 | プログラム

Webカメラを使って連続写真を撮っていて動画にしようなどともくろんでいる。
しかしながら現在インターネットから手に入れたフリーソフトが画像を記録すると、ファイル名のフォーマットが

yyyymmddhmmss.jpg

になっている。hourがhhじゃないので、名前の順にソートするとおかしくなるので、更新日時の順番にソートしなくてはならない。まずコマンドプロンプトで

dir /b /od > _dir.txt

と入力してファイル名を_dir.txtファイルに入れる。テキストファイルの先頭のアンダーバーはソートしたときに一番上に来るようにするのが目的なので、別に無くてもいい。
次に、ファイル名を順番に名前変更するのだが、今までエクセルを使っていたのだが、以下のJavaScriptコードで実行することにした。ダミーデータでの試験ではうまく言っているようだ。 

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<metacontent="text/html; charset=utf-8"http-equiv="Content-Type">
<title>Make Rename Command</title>
<script type="text/javascript">
function MakeRenameCommand(){
    var StartTime = new Date();
    var textIn = document.form.TextIn;
    var textOut = document.form.TextOut;
    textOut.value="";
    var note = document.form.Note;
    var FnArray = textIn.value.split("\n");
    var inIndex=0;
    var outIndex=1;
    for(inIndex=0;inIndex<FnArray.length;inIndex++){
        if(FnArray[inIndex].slice(-4)===".jpg" || FnArray[inIndex].slice(-4)===".JPG"){
            textOut.value += 'rename "' + FnArray[inIndex] + '" "' + ('0000'+outIndex).slice(-4) + '.jpg"\n';
            outIndex++;
        }
    }
    var StopTime = new Date();
    var dT = StopTime - StartTime;
    note.value = outIndex + "files\n";
    note.value += "it took " + dT/1000 + "sec\n";
}
</script>
</head>
<body>
    <formname="form"action="post">
        <textareaname="TextIn"cols="50"rows="20"></textarea>
        <textareaname="TextOut"cols="50"rows="20"></textarea><br>
        <inputtype="button"value="Make Rename commands"onclick="MakeRenameCommand()"><br>
        <textareaname="Note"cols="50"rows="2"></textarea><br>

    </form>
</body>
</html>

4000行弱のデータを処理させたときの速度だが、ChromeとFirefoxは許容できるレベル。
Google Chromeは1.8秒
Firefox 2.6秒
IE11 31秒
インターネットエクスプローラが劇的に遅い。。

コメント

備忘録(シンタックスハイライト, Syntax Highlight)

2014年05月01日 13時34分06秒 | プログラム

ソースコードをそのまま載せるとき、<などを変換してくれる。
http://sei-street.sakura.ne.jp/page/doujin/site/doc/tool_text2html/index.html

 

きれいに見せたいときは次で変換かな。文字数がブログのリミットに迫るから厳しい時もあるけど。
http://hilite.me/

 

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
void Start_ADC(void)	/*ADC変換を開始する。自動トリガでADC1の値を読み込み続ける。プログラムからはADCを読めばよい*/
{
	//10bit分解能用ルーチン ADCは連続で動作させる
	//デジタル入出力からの切り離し
	DIDR0
	= (0<<ADC0D)	//ADC0ピンの切り離し。しかし、ADC0はリセット端子になってるから設定しちゃダメ
	| (1<<ADC1D)	//同ADC1, PB2
	| (0<<ADC2D)	//同ADC2, PB4
	| (0<<ADC3D);	//同ADC3, PB3

	ADMUX
	= (0<<REFS0)	//Reference: 0でVCC参照, 1で1.1V内部電圧源
	| (0<<ADLAR)	//ADC Left Adjust Result: 1にセットすると左詰で結果を出してくる 
	| (1);			//ADMUX1, ADMUX0で入力チャンネルを選べる 00から11までADC0からADC3まで対応 今はADC1を使う

	ADCSRA
	= (1<<ADEN)	//ADC enable
	| (1<<ADSC)	//ADC Start Conversion 1にすると変換開始
	| (1<<ADATE)	//ADC Auto Trigger Enable (for Continuous Conversion)
	| (0<<ADIF)	//ADC Interrupt Flag 変換完了すると1になるらしい
	| (0<<ADIE)	//ADC Interrupt Enable 変換完了したときに割り込み許可
	| (0b101);		//Clock Division: ADコンバータはクロック50-200kHzで性能がよい
	//分周は0のとき2、それ以上の時2^n分周。クロック4.8MHzのとき32分周(101)で150kHz。
	//ADCは起動時にアナログ回路リセットが入るので変換に25クロック(167us)必要
	//以降連続変換で回せば13クロックサイクル(87us)で変換完了→87us以内にADC読みに行くと前の値と同じってことになる

}
コメント

Nikon DSLR IR Remote (ATTiny13A)

2013年08月16日 20時24分08秒 | プログラム
定期的な撮影のため、マイコンからニコンのDSLR(デジタル一眼レフ)のリモコン信号を出すものを作った。デバイスはATTiny13Aです。8pinの安いやつ。
内蔵RC発信器を使うので、時間間隔は割といい加減だが、そこはご愛敬。
Time Lapseの撮影とか、連続的に星の写真を撮ることを目的としているので、連続的にシャッター操作ができたらいいのだ。

なお、運用して思ったが、夜間30秒の露光をしてどんどん撮影していくような場合、1秒ごとにリモコンコマンドを送るようにしておけば良いことに気がついた。
撮影終了後1秒以内に撮影コマンドがやってくるので、ほぼ連続的な動作が出来る。

このリモコンの時間設定を行う場合は、きっと昼間の連続撮影だろうな。

しかしソースコードを載せるのは面倒くさいな。

/*
 * _20130716_Nikon_IR_Remote.c
 *
 * Created: 2013/07/16 22:53:07
 *  Author: mako
*
 *          ATTiny13A
 *          +--------+
 *  -Reset ++        ++ Vcc
 *          |        |
 *     PB3 ++        ++ PB2
 *          |        |
 *     PB4 ++        ++ PB1 for IR LED output
 *          |        |
 *     GND ++        ++ PB0
 *          +--------+
 *
*
* PB1 --- 270ohm --- IR LED---GND // I think it work WITHOUT resistor.
* 4ch DIP switch or Rotary encoder(comprementary) connects PB0,PB2-PB4 to GND.
*
 */
 

#define F_CPU 1200000 //正確にしたい場合、微調節必要だが、そもそも内蔵RCクロックなのでアテにはならない
#defineSignalTime 100 //信号間隔を後でキャンセルするために設定

#include <avr/io.h>
#include <util/delay.h>

int main(void)
{
       
unsigned char IntervalStatus;
        DDRB  
=0b00010;               //Set PB1 for output, PB0,PB2-PB5 for input
        PORTB
=0b11101;                //Pull Up PB0, PB2-PB5 with internal resister
        // note DDR[Port][Number]=0 AND PORT[Port][Number]=1 -> Internal resistor pull up
       

        TCCR0A
=0b00000011;    //start counter prescaler 1/1
         // (0<

        OCR0A
=31;  // set duration : 31 count takes 31/1.2MHz = 25.8us nealy equal to 26.3us (38kHz)
        OCR0B
=10;  // set duty about 1/3

       
while(1)
       
{
               //Start Sending Shutter Command for Nikon DSLR
               //TCCR0Aの5bitの1/0で出力on/offさせている。タイマーは回しっぱなしで出力するかどうかを選択。
               //DDRDなどで制御してもいいかもしれない。
                TCCR0A
=0b100011;              _delay_us(2000);
                TCCR0A
=0b000011;              _delay_us(27850);
                TCCR0A
=0b100011;              _delay_us(  390);
                TCCR0A
=0b000011;              _delay_us(1580);
                TCCR0A
=0b100011;              _delay_us(  410);
                TCCR0A
=0b000011;              _delay_us(3580);
                TCCR0A
=0b100011;              _delay_us(  400);
                TCCR0A
=0b000011;              _delay_us(63200);
               
//Total 99.4ms

               
IntervalStatus=(((PINB & 0b11101)+1)>>1)^0b1111;       //Pinの入力は反転。pull upで
                //1加算することで、0b11101の配列が0b11110になる。そして、1ビットシフトし、0b1111とXOR演算し、
                //コンプリメンタリーのスイッチの状態を読み込める

                 //以下一行にif文を入れてしまったので、少々わかりにくいかもしれないが、ひたすら入力ピンに合わせてひたすら信号間隔を決めるだけ
                //なお、待ち時間が長いときに設定変更する場合、リセット端子が便利なので、リセットスイッチor電源スイッチを活用しよう

                 //時間間隔は必要に応じて変更
                if(IntervalStatus ==   0)  {_delay_ms(  1000-SignalTime);}  //Inteval for 1sec
               
if(IntervalStatus ==   1)  {_delay_ms(  2000-SignalTime);}  //Inteval for 2sec
               
if(IntervalStatus ==   2)  {_delay_ms(  3000-SignalTime);}  //Inteval for 3sec
               
if(IntervalStatus ==   3)  {_delay_ms(  4000-SignalTime);}  //Inteval for 4sec
               
if(IntervalStatus ==   4)  {_delay_ms(  5000-SignalTime);}  //Inteval for 5sec
               
if(IntervalStatus ==   5)  {_delay_ms(10000-SignalTime);}  //Inteval for 10sec
               
if(IntervalStatus ==   6)  {_delay_ms(15000-SignalTime);}  //Inteval for 15sec
               
if(IntervalStatus ==   7)  {_delay_ms(20000-SignalTime);}  //Inteval for 20sec
               
if(IntervalStatus ==   8)  {_delay_ms(25000-SignalTime);}  //Inteval for 25sec
               
if(IntervalStatus ==   9)  {_delay_ms(30000-SignalTime);}  //Inteval for 30sec
               
if(IntervalStatus ==  10)  {_delay_ms(45000-SignalTime);}  //Inteval for 45sec
               
if(IntervalStatus ==  11)  {_delay_ms(60000-SignalTime);}  //Inteval for 1min
               
if(IntervalStatus ==  12)  {_delay_ms(120000-SignalTime);}  //Inteval for 2min
               
if(IntervalStatus ==  13)  {_delay_ms(180000-SignalTime);}  //Inteval for 3min
               
if(IntervalStatus ==  14)  {_delay_ms(240000-SignalTime);}  //Inteval for 4min
               
if(IntervalStatus ==  15)  {_delay_ms(   200-SignalTime);}    //when open for testing.
 
       
}
}
コメント (2)

測定器制御

2012年02月02日 23時25分43秒 | プログラム
会社でいろいろな測定をするが、測定ソフトに不満を持つことがある。
汎用の測定器を使っていて、さらにユーザーがどんな測定をするのかわからないから仕方がない部分がある。

しかしだ、不満をそのまま残しておくのもアレなので、制御ソフトを作ってしまおうと思ったのだ。

しかしプログラミング言語がない。しかし、MS Officeなら入っている。
測定器は当然のようにGPIB経由で制御。

いける。Excel VBAから装置の制御が可能だ。

というわけで作成開始したわけであります。VBAでも何とかなるもんだね。Office2010なんだけど、すごく使いづらい・・・^^;
VBAはVB6.0形式のままで助かった。
コメント

オイル交換

2007年11月16日 02時18分32秒 | プログラム
オイル交換をした。久しぶりのオイル交換なので、ビクビク・・・しなかったな。

とりあえずドレンボルト開いてオイルを抜く。おおっ、黒いぜ。

今回はオイルフィルターも交換してみるのだが・・・なにやら鉄粉が多いような気が!?

今回は久しぶりにフィルター周りのパッキンも交換しました。Oリングが変形してたよ。オイルフィルターにOリングついてくるんだけどなかなか交換が面倒くさいから交換しなかったのだが、今回は交換しました。

まあ、いいや。フィルターの磁石に引っかかっているということはエンジンの中に残っていないということだ。機械部品の数から考えたら大した量じゃないような気もするけど、どうなんだろうな。今回はオイルフィルターの中の磁石まで観察したから気になる程度の鉄粉があったけど、どんなもんだろう。

わがVTRはドレンボルトにも磁石が埋め込まれていて、そこについている鉄粉は以前と変わらない量である。問題ないだろうな。きっと。そう信じよう。HONDAの250cc V2を信じよう。頼むぞMC15E


さて、今回はCastrolのPower1 4Tというのを投入。まあ、前回からですが。なんとなく15W-50を入れてみた。純正指定は10W-40なのですが、なんとなく固めのオイルのほうがいいかな、なんて。バイク古いし。と思ったけどどうなんだろうね~。

最低限の潤滑ができているのなら問題ないか、という発想です。

さて、エンジンオイル交換するとさすがにフィーリングよくなりますね。非常にいい!とまではいきませんが、なんとも表現できない向上がありますね。オイルの粘度が上がったようなかんじ?気のせいかもしれませんけどね。


さて、わがVTRはそろそろ56789kmにさしかかろうと思います。寿命の半分ほどになるのでしょうか、いや、明日つぶれてしまうかもしれません。不安です。不安です。壊れるまで乗ってあげたいのですが、来年は大学にいないので、無理かなと。
会社に入ると寮生活なのですが、バイクは一台のみだそうです。どこかにガレージ借りようにも、いい場所探すのに時間かかりそうですしね。

ガレージほしい~~~。

最近CBR250RRとVTR250をとっかえひっかえ乗っているのですが、それぞれにいいところがありますね。CBRはブンブン回して楽しいし、VTRはマッタリ走るのにいい感じ。やっぱりバイクは複数台所持したいな~。

ふと思った、車の駐車場を一台分借りて、そこにバイクを並べたら三台くらい入るんじゃないかと。考えてみよう。


ぜんぜんオイル交換から話がずれちゃったけど、まあ、気にしない。ちょっと酔っているので。

駄文、長文失礼。
コメント (2)