主にCADツールやサーバ管理など、知財や共同研究に関係しない事項についてはこちらに書いておきます。気が向いたら分類していますが、分類方針があやふやなので、結局、検索しないとだめかも。
目次
コメントはありません。 Comments/公開作業日誌?
初期設定は人の好みなので、使いやすければ何でもよいわけですが。
検索すれば、LTspiceの優れた解説ページやブログがたくさん見つかるので、いまさら解説ページを作成する意義は小さいのですが、講義のシミュレーション演習や自宅での学習の際、忘れやすい事項について参照するためのノートとしてまとめたものを以下のURIに置きます。
#ref(): File not found: "psoc20120827-2.png" at page "公開作業日誌"
デバイスの比較については、各種の解説ページやCypress社のドキュメントに説明されているが、実際には、メモリ容量や、アナログ/ディジタルブロック数を考えてデバイスを選択することは難しい。多くの場合は、使用できるユーザモジュールやIOピン数で選択することが多いと思われる。私の場合は、以下の基準で探しているが、妥当かどうかは不明。
UART, TX8, RX8, TX8SW(TX8のソフトウエア版)がある。UARTは双方向、TX8は送信専用、RX8は受信専用となっている。高レベルAPIはどれも殆ど同じ。複数のシリアル通信ポートが必要な場合には、使い分けが必要。例えば、多数のセンサによる計測システムでは、コマンドを送るための送信ポート1個と計測データを吸い上げるための受信ポートが多数必要となる。従って、1個のTX8と、多数のRX8を実装することになる。また、PCと1対1の通信を行う場合には、UARTを1個使用したほうが便利。
I2Cは2線のBUS接続であるため、複数のチップ間の通信を容易に行え、また拡張性が高い(7bitアドレス)。しかし、データレートが100kまたは400kbpsに限られ、CPUクロックも制約を受ける。UARTは、BUS接続ではないため、通信相手毎にポートを作る必要がある。CY8C29466では、RX, TXの合計で8ポートまで。この範囲内であれば、UARTを使用することで、高速化が可能。UART接続でデバイス数を増やしたい場合は、ヘッダにデバイス番号を追加し、2つのUARTポートをスルーさせるように接続することで実現可能。ただし、この接続法では、ソフトウエア処理が挟まるため、デバイス間の遅延が発生し、処理の同時実行はできないので、別途割り込み専用の配線が必要となる。
通信と計測を行う場合、異なるクロックが必要となる。クロックを分周した周波数ソースとして、VC1, VC2, VC3が用意されているが、分周比が大きい(低周波)のはVC3である。VC1, VC2で通信用のクロックを作成したとき、VC3でDACやADCを動かしたいことがあるが、アナログブロックのクロックとしてVC3が選択できない。別途カウンターを用意する方法もあるが、ディジタルブロックを複数消費するので、Misc Digital/DigInv?(インバータ)の入力をVC3とし、Analog Clock Select(アナログクロックのMUX)で、DigInv?を置いたディジタルブロックを選択して、アナログクロック他院に接続する。DigInv?のClockSync?をSync to SysClk?にしておくこと。インバータを通すので、アナログ部とディジタル部のクロック位相が180度ずれてしまうが、ADCやDAC単体では問題ないようだ。回路間の接続によっては、クロックの位相に注意が必要。DigBuf?というものもあるが、なぜか上手く動作しない。何かの設定が必要なのかも。
センサやADCの較正値の保持や前回終了時(電源OFF時)の状態の復元などに不揮発性メモリが必要なことが多い。大容量が必要ない場合には、外部マイクロSDモジュールを接続すしなくても、PSoC内のフラッシュメモリに書き込む方法が用意されている。
自作の楽しみはないけれど、センサー、ブザー、LED、プログラマなど、全部付いていて、色々な実験ができるマイコンボードが3,000円ほどで買えるということで、早速、講義の演習に使用してみたが、学生には受けないようだった。CY8C21434 が搭載されていて、キャップセンス(タッチセンサ)も使える。
評価ボード部分の等価回路図。
評価ボードには、GPIOがピンヘッダーに接続されており、拡張が可能。写真はブレッドボードに挿せるようにした変換基板。RS232Cポートも付けてあるが、今ならUSBポートだろう。
PSoC FirstTouch?の近接センサ(人体センサ)を使ったカラーイルミネーションの例
lab02.lzhをダウンロードして、適当な場所で解凍してください。下記の回路図に合わせて、IOポートやクロックの設定をする必要があります。 LEDの色で体温を測る、LED体温計。30 - 40度ぐらいの温度を細かく測定する必要があります。ここでは、室温付近での温度変化を増幅する代わりに、ソフトゥエアでADCの変換結果(adc_out)を変数sensの倍率に拡大しています。但し、ソフトゥエアで増幅すると、その倍率に比例して精度(LSB当たりの変換電圧)が落ちることになります。精度を落とさないためには、ADCの前にアナログ電圧を増幅する方法がありますが、FirstTouch?に搭載されているPSoC CY8C21434には、Programmable Gain Amplifier のモジュールがありません。このため、ADCの変換ビット数を高くする必要があります。1bitの増加は、約6dBの増幅に相当します。
Thermistorは、温度によって抵抗値が変化するデバイスです。FirstTouch?に付いているものは、摂氏25度で10kohm, 温度依存性は、Cypress社のWEBページでAN2395というドキュメントに含まれる自動計算ソフトで計算できますが、ここでは、温度を数値で表すわけではないので、必要ありません。Zener (Zener diode)は、逆方向バイアスを加えると、一定電圧に保つことができるダイオードです。FurstTouch?には、2.4Vに保つダイオードが付いていて、これで一定電圧をThermistorに加えます。基準とする温度のときのTermistorの電圧を基準電圧(2.4V)/2となるように設定することで、その温度を中心として温度測定ができます。このため、10kohmの抵抗を接続しています。BGR(Bandgap Reference)は、ADCのMSBに相当する電圧を決める基準電圧源として使用しています。Thrmistorの出力電圧をADCでディジタル値に変換後、CPUにデータを転送し、2個のPWM回路のDuty Ratioを設定し、BlueとRedのLEDの明るさを制御して、色を変化させます。
PSoC Creator をインストールすると、PSoC Creatorの登録画面が自動で起動するので、そのまま登録すればよいが(Cypress社のアカウント登録が必要)、コンパイラのライセンス登録は手動で行う必要がある。
#ref(): File not found: "psoccr20120827-1.png" at page "公開作業日誌"
ワイヤーボンダーを行う基板は、ボンディングランド部分を無電解金フラッシュ仕上げにすること。簡易説明書に書き忘れていた。
老眼の場合、近視用眼鏡をしていると50cm-60cm離れた物しか見えないのですが、眼鏡を取ると、2-3cmのところにフォーカスが来ます。この状態だと、至近距離のため物が大きく見え、正確に半田付けを制御できます。半田付けのポイントは、半田の量と溶け具合を把握することですが、小さなパッド面積では、目が良くても溶け具合の把握が難しいので、精密工作用のレンズを使用するか、至近距離で見える目を持つことが必要です。フラックスで目がやられることだけ注意すれば、SSOP, 0.5mmQFPのほか、QFNやMLFでも半田付けできるようになります。
SSOP, QFPなどの表面実装パッケージの半田付け手順
QFN, MLFの場合は、位置合わせまで行ったら、ピンセットで抑えて、ホットエアSMD除去機で加熱する。この場合、導通確認は難しいが、ショートの確認は可能。
某P版.comに基板製造を発注したところ、拡張Gerberフォーマットで設計データを出して下さいと言われました。研究室でよく使用されているPCBE ver.0.4では、拡張Gerberフォーマットに対応していないため、PCBE ver.0.4で設計したPCBE0.4形式データを、PCBE ver.0.5で読んで、拡張Gerberデータを出力し、製造発注したところ、うまく製造できるようです。拡張Gerberデータの出力手順については、 http://jaco.ec.t.kanazawa-u.ac.jp/edu/vlsi/pcbe/ に書いておきました。
プリインストールアプリは、設定画面やコントロールパネルでは削除できないため、Power Shellで以下のコマンドを実行。
これを行う状況の例:Windows10には、何種類かのストアアプリがプリインストールされている。ストアアプリ版OneNote?もプリインストールされているが、これは、ログインアカウントをマイクロソフトアカウントからローカルアカウントに変更すると起動しなくなる。また、ローカルアカウントから関連付けしても復活できない。ただし、デスクトップ版OneNote?では、この現象は起こらない。起動しなくなったOneNote?は、一旦削除して、Windowsストアから再インストール(無料)すると、起動できるようになる。ただし、再インストールしてもローカルアカウントでは起動しない。
Windowsのアカウントには、PCに独自に設定したローカルアカウントとストアアプリを利用するときに必要なマイクロソフトアカウントがある。マイクロソフトアカウントを使用して、PCにユーザを作成した場合、ユーザ名がマイクロソフトに登録したままの名前になる。日本語で登録した場合、ユーザ名とホームディレクトリ名が日本語になり、日本語非対応のソフトなどが動作しない等の不都合がある。回避方法として下記が考えられる。
Windows8.1 の初期設定で、マイクロソフトアカウントではなく、ローカルアカウントを作成すると、システムドライブのBitLocker?が実行できないようで、ドライブエラーとなる(! マークが付くのでわかる)。そのまま使っても問題ないのだが、気持ちが悪いので、マイクロソフトアカウントを関連付けると解消される。しかし、エラーのまま(ローカルアカウントのまま)Windows10にアップグレードすると、BitLocker?解除も実行もできなくなり、エラーをクリアすることができず、Windows8.1を再インストールとなる。もしかすると、Windows10のBitLocker?解除方法があるのかもしれないが。
スタート - アクセサリ - コンピュータの簡単操作 で、拡大鏡を起動拡大鏡のウインドウにマウスカーソルを表示した状態で、スクリーンキャプチャーする。
デスクトップに一時的においたファイルを編集した後、削除ができなくなることがある。但し、この現象が起きるマシンとそうでない名心があるようで、特定マシンで頻繁に起きる。対策は、他のAdministratorアカウントで、ユーザフォルダの相当ファイルを削除する。コマンドラインでの実行は、
NASへの接続のためパスワードを保存設定するようにしておいても、「ネットワークドライブに再接続できませんでした」と表示され、接続ができないことがある。WindowsのバージョンやWindowsの更新状態にも依存しているようだ。いろいろな対処法が考えられるが、簡単な方法は以下の通り。Windows7 64bit Ultimate で動作確認(このバージョンは、金沢大学のMS包括ライセンス協定で提供されている)
ATOK2010以降変換精度が低いという噂があり(辞書の引き継ぎの問題では?)、ATOK2009を使い続けている人が多い。しかし、Windows7では、ATOK2009の言語バーが消えて使えなくなることがある。私の場合、Windows7 (64bit)でこの現象を確認した。ただし、この現象が出たのは、Dell OPTIPLEX のみで、他のマシンでは問題なく動作している。応急対処法は以下のとおり。
Microsoft outlook から送信されたメールを受信すると、winmail.datという添付ファイルになっていることがある。このままでは、添付ファイルが読めないので、Gmailに転送して読む。専用のリーダソフトもあるようだが、稀に来るwinmail.datのために専用ソフトをインストールするのは面倒だ。
事務文書や推薦書などの専用様式が印刷物で提供されることが多い。スキャンした画像を背景として設定し、上に文字を入力すれば、プリント時の位置合わせの必要が無くなって便利だが、Microsoft Officeには、表だってこの機能が用意されていない。Wordの背景にスキャンした画像を貼り付けるには下記のようにする。
Office2003以降、ツールバーがなくなりリボンで各種操作を行うようになった。よく使う機能をツールバーにアイコンとして並べておくと便利なのだが、Office2003以降では、リボンよりも、クイックアクセスツールバーにアイコン登録しておくほうが便利。
タブレットを表示器に使用する場合などは、スリープモードにならないようにする。設定画面 - {}開発者向けオプション - スリープモードにしないをチェック。開発者向けオプションは、デフォルトでは使用できないので、「Nexus7 への自作プログラムのインストール」の項を参照して、開発者になっておくこと。
Android の画面は操作しないと消灯になり、最大30分まで設定できる。しかし、表示器として使用する場合には、点灯したままにしたい。Backlight Switchというアプリを使用して、指定アプリの起動時に、消灯しないように設定することができる。
Eclipse環境で開発したAndroidアプリケーションをスマホに転送するのは、スマホをUSB接続した状態で、Eclipseでアプリを実行し、エミュレータと接続された実機の接続画面で、実行したい機種を選択するだけというお手軽さだが、Google Nexus は少し手順が必要だ。Android端末は、PCにUSB接続すると、自動的にストレージと認識され音声や動画をUSBメモリと同じように転送できるが、Androidのシステムとして認識させるためにはPC側にドライバーをインストールする必要がある。一旦、Androidとして認識させると、DDMSから実機上でのデバッグが可能となり、これほど楽ちんな開発環境は、見たことがないほどだ。
手順は下記のような感じ。検索すると色々な手順が示されていて、Adnroidのバージョンにも依存するようだ。
Androidスマートフォンで文字入力入力(エディットテキスト)にフォーカスすると、自動的にソフトキーボードが起動する。しかし、初期状態で起動されると都合の悪い場合がある。画面が余っていれば、下の方をソフトキーボードエリアとして残しておけば使い勝手がよいが、起動画面に多くの情報を表示する場合、最初からソフトウエアキーボードで画面が隠れるのは避けたい。この場合は、表示設定処理の前に下記のような記述を入れる。android.view.WindowManager?.LayoutParams?インポートすること。
protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // Suppress the soft keyboard(追加部分) getWindow().setSoftInputMode(LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN); // Set the activity contents(表示設定) setContentView(R.layout.activity_main); }
テキストボックスに何も入力されなかった場合の処理が必要な場合が多いが、空の文字列の判定でエラーを出すことが意外と多い。メモリに割り当てられたインスタンス(オブジェクト)の文字列の空と、変数宣言における空、または、オブジェクト同士を比較したことによるシンタクスエラーだが(英語の"a"と"the"の違いと同じ)。無いということ自体が抽象的概念であるため、混乱しやすい。以下のように判定を行うと覚えておくことにする。
EditText inputNum = (EditText) findViewById(R.id.editTextInputNum); String inputText = inputNum.getText().toString(); // 空文字の判定部分 if(inputText.equals("")) inputText = "0";
つまり、imputTextオブジェクトの文字を""と比較している。例えば、if(inputText == "")としたのでは、別のオブジェクト(ポインタ)の比較なのでNG。当然、インスタンスを持たないnullとの比較もNGとなる。
自作の計測システムを手っ取り早く作成するためのPCのプログラミング方法をまとめておく。市販の計測器を組み合わせてシステム化する場合は、LabView?を使用するのが効率的だが、自作の回路基板をPCと接続するには、シリアル接続 + 自作プログラムのほうが簡便。こうしておけば、ZigBee?やBluetoothによる無線化も容易に実現できる。
VB(Visual Basic)使いの学生はあまり見かけないが、電子情報分野以外のPCユーザにはVBが普及しており、また、市販計測器のマニュアルには、大抵BASICのプログラム例が掲載されていて、慣れている人が多いという事情からVB.NETの例を示す。C#でも殆ど違いはない。
Stringから整数, 実数
adc16 = Short.Parse(rcvData) adc32 = Integer.Parse(rcvData) offset = Double.Parse(calData)
整数からString
'固定小数点3桁 Label1.Text = offset.ToString("F3")
System.Threading.Thread.Sleep(ミリ秒)
フォームにSerialPort?とComboBox?を配置し、ComboBox_Portをいう名前にしたと想定。ComboBox_Portには、現在使えるポート番号一覧を表示する。
'起動フォームのクラスより前にインポート Imports System.IO
'データの受信用バッファを想定 Dim rcvDataStr As String
'起動処理 Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load 'ポート番号用の配列 Dim PortList As String() '利用可能なシリアルポート名の配列を取得 PortList = IO.Ports.SerialPort.GetPortNames() 'シリアルポート番号リストの表示をクリア ComboBox_Port.Items.Clear() Dim PortName As String 'シリアルポート名をコンボボックスにセット For Each PortName In PortList ComboBox_Port.Items.Add(PortName) Next PortName 'シリアルポートの初期選択(任意) If ComboBox_Port.Items.Count > 0 Then ComboBox_Port.SelectedIndex = 0 End If End Sub
'終了処理(フォームが閉じられたとき) Private Sub Form1_Close(sender As System.Object, e As System.EventArgs) Handles MyBase.FormClosing 'シリアルポートの状態確認 If SerialPort1.IsOpen = True Then '制御対象のデバイスの停止命令送信の例 SerialPort1.Write("stop" + Chr(13) + Chr(10)) 'シリアルポートのクローズ SerialPort1.Close() End If 'フォームの終了 Me.Close() End Sub
'COMポートのオープン/クローズの実行 Private Sub Button_Com_Click(sender As System.Object, e As System.EventArgs) Handles Button_Com.Click If SerialPort1.IsOpen = False Then 'ドロップダウンリストによるシリアルポートの設定 If ComboBox_Port.SelectedItem = "" Then MessageBox.Show("デバイスをPCに接続してから本プログラムを再起動してください", "Error", MessageBoxButtons.OK) Else SerialPort1.PortName = ComboBox_Port.SelectedItem End If 'シリアルポートのオープン Try SerialPort1.Open() Catch ex As Exception MessageBox.Show(ex.Message, "シリアルポート開始エラー", _ MessageBoxButtons.OK, _ MessageBoxIcon.Error, _ MessageBoxDefaultButton.Button3) End Try Else SerialPort1.Write("stop" + Chr(13) + Chr(10)) 'stopコマンドの送信 rcvDataStr = SerialPort1.ReadExisting() '受信バッファのクリア rcvDataStr = "" '受信変数のクリア 'シリアルポートのクローズ SerialPort1.Close() End If End Sub
面倒でも、シリアルポートにコマンドを送る前に実行するとよい。
'データの受信用バッファを想定 Dim rcvDataStr As String
'シリアルポートの確認 If SerialPort1.IsOpen = False Then MessageBox.Show("シリアルポートが開いていません", "Error", MessageBoxButtons.OK) Else rcvDataStr = SerialPort1.ReadExisting() '受信バッファのクリア rcvDataStr = "" '受信変数のクリア SerialPort1.Write("start" + Chr(13) + Chr(10)) 'startコマンドの送信を想定 End If
多チャネル化を行う場所は2カ所考えられる。(1)センサの多チャンネル化(マイコンの入力ポートを増やす)、(2)PCの多チャンネル化(シリアルポートを増やす)。(1)はクロック精度での同時性を保障することができる。(2)は、空間的に分散させることができる。通常、1つのシリアルポートに1つの計測制御ソフトを用意し、さらに複数の計測制御ソフト1つのソフトで制御する構成が便利である。作例をに示す。
#ref(): File not found: "key_ctrl.png" at page "公開作業日誌"
上段左から、計測ソフトの起動、一斉スタート(モード1)、一斉ストップ(モード2)、一斉ストップ、下段左から、状態表示欄、起動しているプロセスIDリストの表示欄。ただし、プロセス間の実行命令時刻は、10ms程度ズレが生じるため、マイコン基板にRTCを搭載(32.768kHzが多い)してもよいが、面倒な割には精度は上がらない。時刻確認のためのタイムスタンプ機能(クリックするとPC側の時刻をデータに追加する)も搭載している。コード例は、他の項目で機能毎に分解して紹介する。
フォームの開始
Dim f As New Form2() f.Show(Me)
フォームの終了
Me.Close()
フォームにProcessを配置する。
'TEST.exeプログラムを起動 'Microsoft.VisualBasic.Interaction.Shell("TEST.exe", AppWinStyle.NormalFocus) Process.Start("TEST.exe")
'プログラムを起動したことをStatusStripのLabelに表示(無くてもよい) ToolStripStatusLabel1.Text = "New TEST is invoked"
フォームにComboBox?とProcessを配置する。現在起動しているTEST.exeのプロセスIDを取得して、ComboBox?のリストに表示する。
'フォームのClass Dim procID(32) As Integer '動作中のTEST.exeのProcess ID Dim Nproc As Integer '動作中のTEST.exeのプロセス数
'先に起動していたプロセスIDの取得 Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 'FVSプロセスのリスト作成 getID() End Sub
'プロセスの起動毎に、getID()を実行する
'プロセスIDの取得とComboBoxへのリスト表示 Private Sub getID() Dim processes() As Process 'Processの再チェック processes = Process.GetProcesses() 'TESTプロセスのリスト再作成 ComboBox1.Items.Clear() ComboBox1.Text = "TEST Process ID" Nproc = 0 For i As Integer = 0 To processes.Count - 1 If processes(i).ProcessName = "TEST" Then procID(Nproc) = processes(i).Id ComboBox1.Items.Add(procID(Nproc).ToString()) Nproc = Nproc + 1 End If Next ToolStripStatusLabel2.Text = Nproc.ToString() End Sub
'コマンドを送るプロセスのリスト作成(プロセスIDの取得の項参照) getID() '例えば、[CTRL] + [s] を子プロセスのあるコマンド1に割り当ててあるとする For i = 0 To Nproc - 1 AppActivate(procID(i)) SendKeys.Send("^s") Next ToolStripStatusLabel3.Text = "Running in mode 1" '必要ならフォーカスを制御元である自分に戻す Me.Activate()
フォーカスの有無にかかわらず、ホットキーのポーリングを行うには、(1) GetAsyncKeyState? API関数, (2) RegisterHotKey? API関数, の方法が一般的だが、実際に実装してみると、かなり処理が重い。計測の開始、停止を制御するだけであれば、フォーカスを持つフォームのキーイベントを受け取れればよいことが多いので、下記のような簡便な方法でも対応可能。
'キーイベントの取得 Private Sub Form1_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles MyBase.KeyUp 'コマンドを送るプロセスのリスト作成(プロセスIDの取得の項参照) getID() 'Form1に対してMe.KeyPreview = Trueにしておくこと If e.KeyCode = Keys.T Then '[CTRL] + [t] でコマンド1開始 If e.Control Then For i = 0 To Nproc - 1 AppActivate(procID(i)) SendKeys.Send("^t") Next ToolStripStatusLabel3.Text = "Running in mode 1" End If ElseIf e.KeyCode = Keys.S Then '[CTRL] + [s] でコマンド2開始 If e.Control Then For i = 0 To Nproc - 1 AppActivate(procID(i)) SendKeys.Send("^s") Next ToolStripStatusLabel3.Text = "Running in mode 2" End If ElseIf e.KeyCode = Keys.X Then '[CTRL] + [x] でコマンド停止 If e.Control Then For i = 0 To Nproc - 1 AppActivate(procID(i)) SendKeys.Send("^x") Next ToolStripStatusLabel3.Text = "Stopped" End If End If '次のキーイベントを受け取るため、フォーカスを自分に戻しておく Me.Activate() End Sub
フォームにOpenFileDialog?を配置。
'起動フォームのクラスより前にインポート Imports System.IO
Private Sub ReadCSV(ByRef DataLine() As String) OpenFileDialog1.FileName = "calibration_data.csv" OpenFileDialog1.Filter = "CSVファイル|*.csv|全てのファイル|*.*" If OpenFileDialog1.ShowDialog = Windows.Forms.DialogResult.OK Then Using reader As New StreamReader(OpenFileDialog1.FileName) For i As Integer = 0 To calEL DataLine(i) = reader.ReadLine Next End Using End If End Sub
フォームにSaveFileDialog?を配置。
'起動フォームのクラスより前にインポート Imports System.IO
Private Sub WriteCSV(ByRef DataLine As String) SaveFileDialog1.FileName = "measurement_data.csv" SaveFileDialog1.Filter = "CSVファイル|*.csv|全てのファイル|*.*" If SaveFileDialog1.ShowDialog = Windows.Forms.DialogResult.OK Then Using writer As New StreamWriter(SaveFileDialog1.FileName) writer.Write(DataLine) End Using End If End Sub
フォームにSaveFileDialog?を配置。
'起動フォームのクラスより前にインポート Imports System.IO
'ヘッダー文字列の設定 header = "Input (V), Output (A)" + Chr(13) + Chr(10) 'データのファイル書き出しルーチンの呼び出し saveData(header)
Private Sub saveData(ByRef header As String) SaveFileDialog1.FileName = DateTime.Now.ToString("\d\a\t\ayyyyMMdd-HHmmss") + ".csv" SaveFileDialog1.Filter = "CSVファイル|*.csv|全てのファイル|*.*" If SaveFileDialog1.ShowDialog = Windows.Forms.DialogResult.OK Then If File.Exists(SaveFileDialog1.FileName) Then Dim result As DialogResult result = MessageBox.Show("同じ名前のファイルがあります。上書きしますか?", "ファイルの新規作成", MessageBoxButtons.YesNo) If result <> Windows.Forms.DialogResult.Yes Then Return End If '日本語文字コード指定書き込み(Shift-JIS) Using writer As New StreamWriter(SaveFileDialog1.FileName, False, System.Text.Encoding.GetEncoding("shift_jis")) 'ヘッダーの書き込み writer.Write(header) 'データの書き出し For i As Integer = 0 To Nd - 1 writer.WriteLine(input(i).ToString() + "," + output(i).ToString()) Next End Using End If End Sub
ヘルプは、HTMLで提供する。インストールしておいたHELPファイルを参照させるか、インターネットを通じてHELPファイルを提供しているURLを参照させる。ヘルプは、頻繁に改訂が必要なため、URLを参照させたほうが便利。
'HELPファイルのパス指定 'Dim helpFileName As String = ".\help_files\help.html" Dim helpFileName As String = "http://jaco.ec.t.kanazawa-u.ac.jp/j/"
'HELPファイルのオープン Try Help.ShowHelp(Me, helpFileName) Catch ex As Exception MessageBox.Show("ヘルプファイルが見つかりません") End Try
'シリアルポート送信処理 Private Sub TexBox_Cmd_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles TextBox_Cmd.KeyPress If e.KeyChar = Chr(13) Then 'Enterキーの判定 If SerialPort1.IsOpen Then If String.IsNullOrEmpty(TextBox_Cmd.Text) = False Then 'TextboxがNullの場合は送信無し Try 'シリアルポートからコマンドを送信する. SerialPort1.Write(TextBox_Cmd.Text + Chr(13) + Chr(10)) 'コマンドボックスをクリアする TextBox_Cmd.Clear() Catch ex As Exception MsgBox(ex.Message) End Try 'e.KeyChar = "" 'Enterキーのクリア End If Else MessageBox.Show("シリアルポートが開いていません", "Error", MessageBoxButtons.OK) End If End If End Sub
'デリゲートの宣言 Private Delegate Sub Delegate_RcvDataToTextBox() Private Delegate Sub Delegate_logData()
'シリアルポート受信イベント処理 Private Sub SerialPort1_DataReceived(ByVal sender As System.Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived
'シリアルポートをオープンしていない場合、処理を行わない. If SerialPort1.IsOpen Then Try '受信バッファの行データ読み出し(ASCII) 'rcvDataStr = SerialPort1.ReadLine() '受信バッファの行データ読み出し(Binary) '(配列変数, 配列変数のオフセット(Byte), 読み出しByte数) 'SerialPort1.Read(rcvDataBin, 0, 16) '受信バッファの全データ読み出し rcvDataStr = SerialPort1.ReadExisting() ' '受信データの変数処理ルーチンに転送(ASCIIモード受信処理) Invoke(New Delegate_logData(AddressOf Me.logData)) ' '受信したデータをテキストボックス処理ルーチンに転送 Invoke(New Delegate_RcvDataToTextBox(AddressOf Me.RcvDataToTextBox)) Catch ex As Exception MsgBox(ex.Message) End Try Else MessageBox.Show("シリアルポートが開いていません", "Error", MessageBoxButtons.OK) End If End Sub
'受信データをテキストボックスの最後に追記する Private Sub RcvDataToTextBox() If IsNothing(rcvDataStr) = False Then TextBox1.AppendText(rcvDataStr) End If End Sub
'受信データを処理する Private Sub logData() '受信データの処理内容 End Sub
'起動フォームのクラスより前にインポート Imports System.Drawing
'データ Dim X(8), Y(8) As Double
Private Sub vactorDraw() Dim ix(8), iy(8), im(8), norm As Integer Dim prsclr(8) As Color '色分け用変数 norm = 20 '表示倍率調整 '座標の計算 For i As Integer = 0 To 7 ix(i) = (X(i) + 125) * norm iy(i) = (Y(i) + 125) * norm im(i) = Math.Sqrt((X(i) * X(i)) + (Y(i) * Y(i))) Next '軸の描画 Dim gport As New Bitmap(PictureBox1.Width, PictureBox1.Height) Dim g As Graphics = Graphics.FromImage(gport) g.DrawLine(Pens.LightGray, 125, 0, 125, 250) g.DrawLine(Pens.LightGray, 0, 125, 250, 125) g.DrawEllipse(Pens.LightGray, 94, 94, 62, 62) g.DrawEllipse(Pens.LightGray, 62, 62, 125, 125) g.DrawEllipse(Pens.LightGray, 31, 31, 187, 187) g.DrawEllipse(Pens.LightGray, 0, 0, 250, 250) '時間に対するペン色の割り当て Dim BPen0 As New Pen(Color.Black, 2) Dim BPen1 As New Pen(Color.DimGray, 2) Dim BPen2 As New Pen(Color.Gray, 2) Dim BPen3 As New Pen(Color.DarkGray, 2) Dim BPen4 As New Pen(Color.Silver, 2) Dim BPen5 As New Pen(Color.LightGray, 2) Dim BPen6 As New Pen(Color.Gainsboro, 2) Dim BPen7 As New Pen(Color.WhiteSmoke, 2) 'ベクトルの→描画 g.DrawEllipse(BPen7, ix(7) - 2, iy(7) - 2, 4, 4) g.DrawLine(BPen7, ix(7), iy(7), 125, 125) g.DrawEllipse(BPen6, ix(6) - 2, iy(6) - 2, 4, 4) g.DrawLine(BPen6, ix(6), iy(6), 125, 125) g.DrawEllipse(BPen5, ix(5) - 2, iy(5) - 2, 4, 4) g.DrawLine(BPen5, ix(5), iy(5), 125, 125) g.DrawEllipse(BPen4, ix(4) - 2, iy(4) - 2, 4, 4) g.DrawLine(BPen4, ix(4), iy(4), 125, 125) g.DrawEllipse(BPen3, ix(3) - 2, iy(3) - 2, 4, 4) g.DrawLine(BPen3, ix(3), iy(3), 125, 125) g.DrawEllipse(BPen2, ix(2) - 2, iy(2) - 2, 4, 4) g.DrawLine(BPen2, ix(2), iy(2), 125, 125) g.DrawEllipse(BPen1, ix(1) - 2, iy(1) - 2, 4, 4) g.DrawLine(BPen1, ix(1), iy(1), 125, 125) g.DrawEllipse(BPen0, ix(0) - 2, iy(0) - 2, 4, 4) g.DrawLine(BPen1, ix(0), iy(0), 125, 125) 'オブジェクトの開放 BPen0.Dispose() BPen1.Dispose() BPen2.Dispose() BPen3.Dispose() BPen4.Dispose() BPen5.Dispose() BPen6.Dispose() BPen7.Dispose() g.Dispose() PictureBox1.Image = gport End Sub
'起動フォームのクラスより前にインポート Imports System.Windows.Forms.DataVisualization.Charting
'過去8点のベクトル描画の例 Private Sub vectorChart() Dim series1 As New Series() 'チャート表示用変数 Dim chartMag As Double Dim chartDir As Double 'グラフのタイプを設定 series1.ChartType = SeriesChartType.Polar 'データ系列の初期化 Chart1.Series.Clear() 'マーカの設定 series1.MarkerStyle = System.Windows.Forms.DataVisualization.Charting.MarkerStyle.Star4 Chart1.Palette = ChartColorPalette.SemiTransparent series1.MarkerSize = 20 'データポイントの設定 For i As Integer = 0 To 7 'データ数(pid)がプロット数に足りない場合(0, 0)をデータポイントに設定 If i > pid Then chartMag = 0 chartDir = 0 Else chartMag = Double.Parse(mag(pid - i)) chartDir = Double.Parse(dir(pid - i)) End If 'X-Yデータポイントの追加 series1.Points.AddXY(chartDir, chartMag) Next 'グラフ出力 Chart1.Series.Add(series1) End Sub
Windows 7 (64bit)に Visual Studio Express 2012 for Desktop をインストールして起動すると、OSの互換性に問題があるというメッセージが出る場合がある(出ない場合もある)。patch_KB2781514を適用(エラーメッセージから検索できる)しても、問題が解決しない場合は、Visual Studio 2012 Update 3 により解決する。 http://www.microsoft.com/visualstudio/jpn/visual-studio-update#story-update
とりあえず、下記で接続してみる。