2008年4月29日火曜日

Visa.dll

そもそも Visa とななにか? Google 願います。クレジットカードではありませんが、そっちの方がバンバンヒットするかもしれません、Powered by Python みたいなもんで、探すのが嫌になります、が。

pyVISA は visa の dll を使うための便利なインターフェースを提供するだけで基本は dll を使います。多分。また、ラッパーとか ライブラリ とか com サーバーとか、、、いろいろな的確な言葉があるらしいですが、 windows プログラマではないので、私は言葉がまったく理解できていません。

GP-IB とは、測定器を制御するインターフェースの規格で、まぁ Ether net みたいな、各レイヤーの仕様を規定したものです、と思います。。。計測が専門で無い人には、訳の分からない言葉がいっぱい出てきます SICL とか SCPI とか。我慢してください。わたしがソフトのドキュメントを見ても同じようなことを感じます、し、がまんしてこうしてがんばってますので。Visa は、まぁもうちょっと仮想化というか抽象化するための通信規格と思います。多分。

Visa は、一応規格なのですが、各社の解釈や、後方互換性のために独自の機能も含まれます。2大サプライヤーは、Agilent(HP) と National Instruments(NI)です。これが微妙に違うのが問題です。先のケーブルの問題とかもここで吸収しようとするので厄介です。

Visa を Windows PC で扱うときに、なにか、環境変数とか、ファイル名とかをシェア、いや取り合う、互いに上書きしあう?ので面倒なことが起こりがちです。不安なときには、自分の会社がどちらよりのシステムなのか、システム管理者に問い合わせてください(笑)知る分けないですよね。

とりあえず、先輩(得意?)が Agilent派 か NI派 か分かれば、あわせましょう。変に刃向かって違うのをインストールすると、後で仕事が増えるだけです。

GP-IB 機器を制御するには、HP Quick Basic(Agilent) とか Visual Basic 、 C を使うのがメジャーなようです。サンプルコードがいっぱい見つかります。低水準言語です。

「もっと簡単なのないの?」ここから商売が始まります「ありますとも、Agilent(HP) Vee Pro」 「いえいえ、これからは labVIEWですよ!」学生さんとお試し版はもちろんフリーです!とMatlab か Ms-office みたいなことを言い出します。「Pythonですか?(商売にならなくなるので)サポートしてません」とも。。

横道にそれましたが、わたしも会社の都合で Agilent 派、ということでAgilent IO Libraries Suite 14.0 を言われるがまま CDインストール。これでagvisa.dll が適当にインストールされます。注意書きにもあるように、先ずソフトをインストールしてから測定器をつなぎましょう。

近い将来 NI-DAQmx を使うおもちゃ(NI)が手に入りそうなので、ひょっとするとそちらもフォローできるかもしれません。

2008年4月28日月曜日

GPIB シリアルケーブル Agilent

これから、visa.dll と pyVisa を使った計測器制御に行く前に
「agilent comunicating serial」
「agilent comunicating rs232」
で google 願います。

結論から言うと、Agilent (HP)のクロスケーブルは、変態ケーブル です。
クロスオーバーとか ヌルモデムケーブルを自称してますが、クロスオーバー なのにCD と RI が1:1でつながってますので気をつけましょう。これをつながないと機能しないので、市販のケーブルでは、agirent(HP) の機器を制御できません。HP200LXに添付されるケーブルも このHP変態ケーブルです。

pyVisa を試すにあたって、わざわざ PCI カードや USB アダプタを用意できる幸せな人はともかく、、、ちゃちゃっと機能だけシリアルケーブルで試すか、な、などと思いついた人が、きっちりはまってしまう落とし穴です、ここ。

----------
ついでに、RS-232C tips

ネジがマイナスならインチネジ、プラスなら(あまり無いけど産業用機器にたまにある)はミリネジです。

ピンが出てるのは、PC側、DTE機器。
メスは DCE機器。でも、そんなの無視してる評価ボードとか多数あります。とーてもはづかしいでつ。

ケーブルも両端が同じならクロス。これ、外人が居る時はちゃんとクロスオーバーと最後まで言いましょうね、宗教的にクロスだけでは「十字架」になるので嫌な感じになるそうです。基本は、両端が違うコネクタならストレートです、が、半田付けできる人がいる会社や、変態ケーブルを売ってる会社もあるので気をつけましょう。

D(DB)コネクタは、多極なので、オスメスで、ピン番号が入れ替わります、本当に、本気で「見て」 pin番号を確認しましょー

2008年4月23日水曜日

+5V電源 from PC

電子工作2本目!PCから 5V、まぁ普通のアイデアですね。


Posted by Picasa

古いノートPCやデスクトップから 5V!これ、結構気に入ってます(笑 探せば転がってますよね、コレ

Posted by Picasa

2008年4月22日火曜日

データの型、リスト

データの型、リスト

2008/05/02 修正 この記事間違ってます。
変数は変更できます。チュートリアル電卓編の 変数_(アンダースコア)とごっちゃになってます。
変数にオブジェクトを代入すると思わぬ結果になるそうです。オブジェクトのリファレンス先が変更されたとき、、この辺から脳が活動停止してますが、そのうち分かるように。なれるといいんですが。。。
どう間違えたかも、記録のうちなので、本文はそのままで恥をさらし続けます。

最後の方の、リストの初期化の仕方、これは危ないそうです。
>>> Data = [0.0] *6

典型的な Python になれてない人がよくする間違いだそうで、私もはまりました。
Data = [0.0 for i in range(6)]

で個々に初期化する方がいい、とありましたので、次からそうします。
2008/05/02



データタイプについて、今まで変数だけを使っていました、(自分的には、、)そういえば、変数は変更してはいけないというのを思い出しました。
A=1 とか一度した上に、A=2 とか代入してはいけないそうです。変数は不変性オブジェクト(棒読み)<くどいですね、なので変更してはいけないとか、居心地悪いですね。

と、チュートリアルの一番初めのほうにありました。変数を変えてはいけない?じゃあ何が変数よ?定数やんかそれ?ともあれ、後で変更するデータや数値は ’リスト’ とかいうデータの型が好ましいそうです。今までのソース、全部?書き換えが必要ですねー、しませんけど。でもこれからの分には、反映します、気がつく限り。

では、何が不変で何が可変か?初期値は参照するだけなので定数(変数)でいいとしましょう。いい?。可変データは、プログラム中、外の世界からもらってくるデータ。大抵、.read とか .get とか .in とかなんかそんなもの。 COM ポートのPIN のステイタスとか、受信データ、測定データのバッファにするような Data とかはリストにすべきなようです。

リストをつかうには [ ] を使います。
Data[] となれば Data は、変数でなくてリストになります、[]の中にはリストの番地を入れて呼んだり、内容を書いて書き込んだりできるみたいです。別に1つのデータでもいいので、一つのときは[0]番地だけを使うようなりストを作りましょう。

リストを使うには、何らかの形で(初期値を入れるとか)リストであることをPython に伝えないといけません。

>>> ListTest[3] = 0.0

Traceback (most recent call last):
File "", line 1, in
ListTest[3] = 0.0
NameError: name 'ListTest' is not defined


教科書では、初期値を代入するラインから始まっていますが、これでリストを初期化しているのです。
.append()を使って大きさを変えることも出来るので、空のリストを作ってもいいです。いいんですか?(笑

>>> ListTest =[]
>>> ListTest
[]
>>> ListTest[3] = 0.0

Traceback (most recent call last):
File "", line 1, in
ListTest[3] = 0.0
IndexError: list assignment index out of range

あせってはいけません。

>>> ListTest[0]

Traceback (most recent call last):
File "", line 1, in
ListTest[0]
IndexError: list index out of range

ええっ?

>>> ListTest[0] = 0.0

Traceback (most recent call last):
File "", line 1, in
ListTest[0] = 0.0
IndexError: list assignment index out of range

なんですと?
ここで[0] が指すのは1番地、1 のリストですが、「空のリスト」は、0 のリスト、かなり嫌な雰囲気です。
上等な技はスカッと忘れて1個だけのリストを初期化しましょう。

>>> Data = [0.0]
>>> Data
[0.0]
>>> Data[0]
0.0
>>> Data[0] =1.25
>>> Data[0]
1.25
>>> Data[3] =2.3

Traceback (most recent call last):
File "", line 1, in
Data[3] =2.3
IndexError: list assignment index out of range


Data だけだとリストを全体を示す[]がついてくるので、値を引用するには [] のなかに番地を入れましょう。では、6個のリストを初期化しましょう。

>>> Data = [0.0] *6 ## < これはよく無いやりかた、別の↑方法がいいらしいです。
>>> Data
[0.0, 0.0, 0.0, 0.0, 0.0, 0.0]
>>> Data[0]
0.0
>>> Data[3] = 2.5
>>> Data
[0.0, 0.0, 0.0, 2.5, 0.0, 0.0]
>>> Data[3]
2.5
>>>

番地で内容を呼べるので、for ループとかにも使えそうでまぁ、ちょっと便利そうです。

2008年4月21日月曜日

pyParallel で プリンタポートの制御

ちょっと脇にそれますが pyParallel で、プリンターポートを制御する例を。

pyParallelは、正式リリース版では無いので、自分が大切だと思う用途には使わないほうがいいと思います。
現に私の PC でも動作は、不安定で、動くことがあったとおもうと、動かなくなったりします。
今は動かないので、以下のコードは、動いていたときに確認したつもりですが。最終的に未確認です。

pyParallel が利用する simpleio.dll が windows にはじかれているようです。
この問題をどうにかする為に、私は、比較的(私の環境で)安定して動いている IO.dll を ctypes から利用することにしました。
これはまた後ほど。

LPT ポートの制御プログラムの確認には、同じく GeekHideoutParmon.exe を使っています。
プリンターポートのベースアドレスの値も、この Parmon からもらっています。

Java の更新のせいかリンクとか、うまく機能しないので、うまく動くようになったら本文修正します。

-------- Not checked ----------


import parallel

Par = parallel.Parallel()

Par.setData(0xAA)

Par.setDataStrobe(1)
Par.setAutoFeed(0)
Par.setInitOut(1)
Par.setSelect(0)

a = Par.getInError()
print a
a = Par.getInSelected()
print a
a = Par.getInPaperOut()
print a
a = Par.getInAcknowledge()
print a
a = Par.getInBusy()
print a

2008年4月20日日曜日

Com ポートの制御、その2 マイコンとの通信

RS-232C ポートを pySerial で制御してマイコンと通信してみましょう。

ループバックと違い、いろいろなことを考えないといけません。
通信する相手に手元にある activecell さん の GP232 をターゲットにします。

もともと、GPIBの測定器を古いノートPCで制御するに買いました。とても気に入って使っています。
付属のCD-Rには、丁寧なマニュアルとVB(Excel)による制御ソフトがついていて非常にありがたいです。これを、ADコンバータ入力、PWM出力モードにして Python + pySerialから制御してみましょう。思い出しましたが、このGP232 をもっと使い込みたいというのも Python を勉強するきっかけでした。ありがとうございます。

取り扱い説明書、および Visual Basic のコードに細かく丁寧な説明があるので、詳細はそちらを参照してください。

おおまかに

  1.  COMポートの設定
  2.  DTR を マイナスに、GP232 アダプタにマイナス電源を供給する。
  3.  RTS を、0、1 リセットする
  4.  I コマンドで通信確認を兼ねてファームのバージョンを読み込む35文字あるけど10文字だけ読んで残りは受信バッファーから消す
  5.  アダプターを AD読み込みモードにする
  6.  ボーレートを 9600 から 115200に変更する
  7.  Iコマンドで再度通信確認
  8.  Gコマンドで A/D データを読み込む(3回)
  9.  PコマンドでPWM出力を設定する
  10.  ボーレートを115200 から 9600に変更する
  11.  PコマンドでPWM出力を設定する

デスクトップPCで確認したときは、かなり早い GP-232 でしたが、自宅のノート + USB シリアルで確認すると遅くなりました。これは GP-232のせいではなく USB Serial アダプタのせいだと思われます。 Activecell さんもそのあたり いろいろトラブルが在った様で、同サイトに USB-Serial に関する情報も豊富です。わたしの自宅の USB-Serial adapter は、不運なことに1秒に1回しか反応しない、だめなアダプタのようです。

デスクトップでもある程度スリープが必要な UART コントローラもありますので各自 sleep() を入れる場所と(値)のチューニングをしてください、

-


## $Id$
##
## Win32 (Win XP)
## Python 2.5
## Python2.5 (for win32)
## Pywin32 210 (for win32 Python2.5)
## pySerial 2.2 (for win32 Python2.5)


import serial
from time import sleep, time

ser = serial.Serial(
port = 0, ## COM1 = 0, COM2 = 1, ...
baudrate = 9600,
parity = serial.PARITY_NONE,
bytesize = serial.EIGHTBITS,
stopbits = serial.STOPBITS_ONE,
timeout = 2.0, ## Sec
)

ser.open()

## Initialize Adapter
ser.setDTR(0) # Minus : Supply minus volts
ser.setRTS(0) # Minus : Reset
sleep(0.1)
ser.setRTS(1) # Plus :
sleep(0.1)
ser.flushInput()
ser.flushOutput()

## check Firmware
ser.write('I')
Data = ser.read(10) # (35)
print Data
sleep(0.1)
ser.flushInput()

## set Adapter mode
ser.write('A')
Data = ser.read(2) #
print Data

## change BaudRate
ser.write('B5')
sleep(0.1)
ser.setBaudrate(115200)
print ' ... Change baudrate from 9600 to 115200 '

## check Firmware
ser.write('I')
Data = ser.read(10) # (35)
print Data
sleep(0.1)
ser.flushInput()

## read AD values
ser.write('G')
Data = ser.read(20)
print time(),Data

ser.write('G')
Data = ser.read(20)
print time(),Data

ser.write('G')
Data = ser.read(20)
print time(),Data

## wrire PWM values
ser.flushInput()
ser.write('P10FF') # ch1 = 25%
print ser.read(2)

ser.flushInput()
ser.write('P22FF') # ch2 = 75%
print ser.read(2)

raw_input(' Check duty cycle and press Enter > ' )

## change BaudRate
ser.write('B0')
sleep(0.1)
ser.setBaudrate(9600)
print ' ... Change baudrate from 115200 to 9600 '


## wrire PWM values
Ch = '1'
Duty = 70.0
ser.flushInput()
ser.write('P%(c)s%(d)03X' %{'c':Ch,'d':Duty/99 *0x3FF })
print ser.read(2)

Ch = '2'
Duty = 30.0
ser.flushInput()
ser.write('P%(c)s%(d)03X' %{'c':Ch,'d':Duty/99 *0x3FF })
print ser.read(2)


raw_input(' Check duty cycle and press Enter > ' )
ser.close()





2008年4月18日金曜日

タイマー(その2)

データ収集用ソフトウェアタイマー

タイマーが time ライブラリモジュールの sleep() だけでは寂しいので、よくある要求
「1秒ごとに、3分間のデータを収集する」
というようなことをするためのプログラム。
ソフトウェアトリガーなので、タイムタグは目安程度

  1. 収集する時間を分でセットする TimeMeasurementMinutes
  2. 収集間隔を秒でセットする TimePeriod
  3. 関連する何かを初期化する
  4. while で目的の終了時刻まで処理を続ける
  5. If で収集時刻になったら測定とかデータ収集をする
  6. 終了時刻になったら終わる

本気でやるときには、ハードウェアによる外部トリガを使った方がいいです。また、外部トリガーによるデータ収集の場合でも、この時刻タグの情報(安定度もPCクロックに依存します)を信用して処理に使うとひどい目にあうので、何か工夫しましょう。最高のリアルタイム OS を使っていても mSec の量子化誤差は覚悟してください。


-------------


## Win32 (WinXP)
## Python2.5 (for win32)

from time import time

TimeMeasurementMinutes = 0.02 # in Minute
TimePeriod = 0.1 # Sec
NumberData = 1 # set initial velue

## initializetion

TimeStart = time()

while time() < TimeStart + TimeMeasurementMinutes * 60 :
if time() > TimeStart + TimePeriod * NumberData :
NumberData = NumberData +1
print time()

## measurements

print '\n Done!'

## termination

Python のコードをHTMLに変換する

Python のソース、スクリプトファイル Something.py を Something.html に変換する。
当面不満な部分だけの変換です。まだまだ試してないことだらけです。

Python がインストールされているなら、この .py ファイルを目的のフォルダにコピーしてダブルクリック。Something.py のファイル名だけ Something を(拡張子なし)を入力すると同じファイル名の Something.html ファイルが出来ます。開くのが楽なように拡張子を .txt に変更するには、Extention3 を Extention2 に変更すると Something.txt ファイルになります。なんか大文字小文字を区別して無いようです。ちょっと便利です(苦笑
  1. 目的のファイル名をキーボードから取得します
  2. ファイル名.py のファイルを開き、シーケンス文字列に読み込みます
  3. 必要な変換、文字列の置き換えをします
  4. ついでにヘッダーとフッターも決めておきます
  5. ファイル名.html を開いて、ヘッダー、テキスト、フッターの順で書き込み閉じます
3.の部分が非常に恥ずかしいです。まだ、タプルとかライブラリとか、よく分かって無いんですよね。シーケンス文字列が書き換えできないことだけは、やっと分かりました。
不変性オブジェクト(棒読み)と言うらしいです。


いいんです!今やりたいことだけできれば! < 逆切れ


本気でやりたい人は、バイナリエディタ Stirlig とか使うと、みっちり勉強できます。Extention1 = '.c' とかも、試す値打ちがあるかも、かなり無責任ですけどね。

----- in progress、not fixed -------


## $Id$
## win32
## Python2.5

Extention1 = '.py'
Extention2 = '.txt'
Extention3 = '.html'

NameFile = raw_input('File name? > ')

FileSour = open( NameFile+ Extention1,'r')
TextIn = FileSour.read()
FileSour.close()

##print TextIn

TextOut4 = TextIn.replace(r'&',r'&amp;')
TextOut3 = TextOut4.replace(r'>',r'&gt;')
TextOut2 = TextOut3.replace(r'<',r'&lt;')
TextOut1 = TextOut2.expandtabs(4)
TextOut = TextOut1

HtmlHeader = r'<P><div class="verbatim"><pre>'
HtmlFooter = r'</pre></div>'

FileDest = open(NameFile+ Extention3, 'w')
FileDest.write( HtmlHeader+ '\n'+
TextOut+ '\n'+
HtmlFooter)
FileDest.close()


2008年4月17日木曜日

Python コードを記事にするには???

タイマー(その2) 中止して、日記

タイマーが time ライブラリモジュールの sleep() だけでは寂しいので、よくある要求
「1秒ごとに、3分間のデータを収集する」
というようなことをするためのプログラム。
ソフトウェアトリガーなので、タイムタグは目安程度。

  1. 収集する時間を分でセットする TimeMeasurementMinutes
  2. 収集間隔を秒でセットする TimePeriod
  3. 関連する何かを初期化する
  4. while で目的の終了時刻まで処理を続ける
  5. If で収集時刻になったら測定とかデータ収集をする
  6. 終了時刻になったら終わる
日本Pythonユーザ会(PyJUG) のオンラインドキュメントみたいにインデントが壊れないように、丸ごとコピペしても、IDLE でちゃんと動くように期待して。前後をなんか同じタグで囲ってみました。

 --- 中止!保留! ---

駄目ですねー。Blogger のAuto Save がかかるたびに、TAB スペースやら If 節が消されてしまいました???? スクリプトをブログの記事にするってのに、なにやら根本的な問題があるのかもしれません。HTML のタグを書けないような、エスケープなんとかとか、詳しくないんですよね。。。
やっぱりきちんと、Python コード HTML 変換とか使わないといけないのでしょうか。。。
探したんですけどね、こんな検索キーワードでは見つからないんですよ。「Python HTML変換」 なんて、ねぇ(笑

py2html とか? ちょっと win32 ユーザーは、相手にされてない臭いを感じるんですよね。。。気のせいですか?それにあの派手なカラーリング好きじゃないし。。。

面倒なんです。いえ、そっち方面のプログラム、かなり苦手なんです。。。だからこっちにいるんです!
こんな苦労話聞きたくないでしょ?こんなことさっさと片付けて次に行きたいのに。

Blogger でうまく投稿できなかった Pythonのコード例
あ! < とか > がまずいんだわ、これ。HTMLコードの自動補完かなにか、多分
今日はもう寝ます。

20080418 追記 別記事で挑戦

---- It does not work ----

## Win32 (WinXP)
## Python2.5 (for win32)

from time import time

TimeMeasurementMinutes = 0.02 # in Minute
TimePeriod = 0.1 # Sec
TimeStart = time()
NumberData = 1 # set initial velue
## initializetion

(ここらへんから下で使ってるタブスペース全部消える, <が 勝手に <>に変換されてる?)
while time() <> TimeStart + TimePeriod * NumberData :

(while time() < TimeStart + TimeMeasurementMinutes * 60 : )
( if time() > TimeStart + TimePeriod * NumberData : )


(以下3行元は tab 2個)
NumberData = NumberData +1  
print time() 
## measurements


print '\n Done!'
## termination

2008年4月16日水曜日

Com ポートの制御、その1

pySerial 使って Serial port を制御する。

Win32 + Python で RS-232C ポートを制御するには、(くどいですが) 標準の Python 2.5(win32) に加えてPywin32 と pySerial ライブラリモジュールの追加インストールが必要です。
作業は、これでほとんどの終わりで、あとは書いて試すだけです。

他のターミナルソフト や 確認用ドングル で、実験する COM port のCOM番号を確認します。
port = 0, の値は、確認したCOMの値 -1 、 COM1 なら (-1して)、0 にします。
タイムアウトの値は秒。駄目そうなことが自分で分かる程度、むっとする程度で、きれない程度の秒。

  1. COMポートの設定。
  2. Tx-Rxループの確認、文字を \n 付きで送信する。 readline() で \n まで受信する。
  3. オープンの端子(CD、RI)を読んだ値が、どうなるのか確認しておく。
  4. RTS-CTS ループを確認する。
  5. DTR-DSR ループを確認する。
  6. 4と5 を反転して、もう一度。

確認用折り返しドングルを外し、同じ事をする。

USB serial などで、折り返し確認がうまく行かないときは、
 setXX() と getXX()の間に、time モジュール(標準)の sleep(0.1)
程度入れてみるのも手です。

これで PonyProg みたいなのを自分で作ってみたり。。。とか。。。まだ無理?

あぁ、Tab使ったインデントが壊れてます。これからやばいですねー、なにか対策を考えないと。
まぁ、まだしばらくは、大丈夫なのですが(笑

-----------------

## Win32 (WinXP)
## Python2.5 (for win32)
## Pywin32 210 (for win32 Python2.5)
## pySerial 2.2 (for win32 Python2.5)

import serial

ser = serial.Serial(
port = 0, ## COM1 = 0, COM2 = 1, ...
baudrate = 9600,
parity = serial.PARITY_NONE,
bytesize = serial.EIGHTBITS,
stopbits = serial.STOPBITS_ONE,
timeout = 1, ## Sec
)

ser.open()

## Tx - Rx loop
ser.write('Hi!\n')
LineData = ser.readline()
print 'Rx : ', LineData

## Open pins
RI = ser.getRI()
CD = ser.getCD()

print 'Open RI : ',RI
print 'Open CD : ',CD

## RTS CTS loop
ser.setRTS(1) # Plus
CTS = ser.getCTS()
print 'Set RTS(1) then CTS : ',CTS

## DTR DSR loop
ser.setDTR(0) # Minus
DSR = ser.getDSR()
print 'Set DTR(0) then DSR : ',DSR

## RTS CTS loop
ser.setRTS(0) # Minus
CTS = ser.getCTS()
print 'Set RTS(0) then CTS : ',CTS

## DTR DSR loop
ser.setDTR(1) # Plus
DSR = ser.getDSR()
print 'Set DTR(1) then DSR : ',DSR

ser.close()
##raw_input()

---------------
確認用ドングル が付いているとき。

Rx : Hi!

Open RI : False
Open CD : False
Set RTS(1) then CTS : True
Set DTR(0) then DSR : False
Set RTS(0) then CTS : False
Set DTR(1) then DSR : True
>>>

---------------
確認用ドングル なし、受信タイムアウト (に設定した秒) 後に表示されます。

Rx :
Open RI : False
Open CD : False
Set RTS(1) then CTS : False
Set DTR(0) then DSR : False
Set RTS(0) then CTS : False
Set DTR(1) then DSR : False
>>>

2008年4月15日火曜日

module の確認

Python には、Python をインストールしただけで付いてくる ’標準ライブラリモジュール’ と必要に応じて自分でインストールする必要がある、 ’非標準のライブラリ モジュール’ があります。
Dos の 内部コマンドと外部コマンドみたいな < あ、無視してください。

Windows と Python で シリアルポートの制御、プリンターポートの制御、GP-IBの測定器の制御をしよう!(喜!)というのは、ちょっと、かなり、、、なので、、、標準以外のライブラリモジュールのインストールが必要になります。

Linux でないので(苦笑) 細かいことをするには、Pywin32 ライブラリモジュールが必要です。
Win32all とかとも呼ばれてます。
当面、シリアルポートを制御するのに pySerial ライブラリモジュールが必要です。

そろそろライブラリモジュールと書くのが面倒になってきました。
標準でついてくるのには、モジュール。(time とか)
後付けにするのは、ライブラリ。(serial とか)と呼んでいいですか?
両方ライブラリモジュールなのですが。。。

pySerial の動作確認をしようとしたところ、自宅 PC の Python に pySerial ライブラリ が入ってないことに気がつきました。。。orz

で、ついでなので、設定した環境に必要なモジュールが入っているか確認しましょう。

IDLE (Python shell、Python GUI) で serial ライブラリが入ってるか確認する為に
import serial と打ち込むと
--------
>>> import serial

Traceback (most recent call last):
File "", line 1, in
import serial
ImportError: No module named serial
--------
う、これ、なんか、明らかにだめです。怒られてる雰囲気が満々です。

引き続き、ctypes モジュールが入ってるか確認する為に
import ctypes と打ち込むと。。。何事も無いかのように、これは OK です、多分。(Python2.5 なので)
---------
>>> import ctypes
>>>

-------
あと、ターミナルソフトですが、TeraTerm のほかに、RTS-CTS、DTR-DSR確認用、男子用() 、「あくのりっち」というデバッグ、ターミナルソフトもありますので、pySerial の動作確認には、こちらも是非ご検討ください。

2008年4月14日月曜日

時刻、時間、タイマー

データ収集やハードの制御を主な目的に考えると。Python のデータの型とか以前に、時間とか時刻がどんな風に扱えるのか気になります。

タイムタグとしての時刻は、timeモジュール time() で取れます。
値は、1970年1月1日からの秒数、だとか。計算も出来ます。経過時間 ElapsedTime を計算してみました。

localtime() を使って、ほっとする時刻にできます。
strftime() を使い表示を整形すると、もっとリラックスできます。

Win32 + Python で一番簡単に使えるタイマー は、Time モジュールの sleep() が楽です。
Threading モジュールは、、まだ全然使いこなせてません。
精度は、まぁ、こんなもんでしょう。

やっと Python ですね。う、、いくらなんでも。。。そ、そのうち何とかします。ていうか、良い方法教えてください、色づけスクリプトとか、コピペできる方法とか。。。
最後のところは、おまけです、気にしないで下さい。
---------

from time import time, sleep, strftime, localtime

TimeNow = time()
print TimeNow

TimeConverted = localtime(TimeNow)
print TimeConverted

Strings = strftime('%Y/%m/%d %H:%M:%S', TimeConverted)
print Strings

print strftime('%Y-%m-%d %H:%M:%S', localtime(TimeNow))

print '\n One moment please. \n'

TimeStart = time()
sleep(1.20)
TimeEnd = time()

print strftime('Started from : %Y-%m-%d %H:%M:%S', localtime(TimeStart))
print strftime('Terminated in : %Y-%m-%d %H:%M:%S', localtime(TimeEnd))

TimeElapsed = TimeEnd - TimeStart

print 'Elapsed time (Sec) : ', TimeElapsed

## --- appendix ---

NameTime = strftime('%Y%m%d_%H%M%S_', localtime(TimeStart))
NamePlant = 'test'
Extention1 = '.csv'

Filename = NameTime + NamePlant + Extention1
print '\nFile name : ', Filename

##raw_input()

2008年4月13日日曜日

Python 参考文献1

何もかも自分で思いついたわけではないですよ、ね、もちろん。

「初めてのPython 第2版」オライリー・ジャパン、オーム社
ISBN4-87311-210-9

やっぱし、紙の文献って助かります。ありがとうございます!
これは、1本目の記事に、恥じない、うれしい。

2008年4月12日土曜日

Com ポート確認用リターンケーブル

RS-232C のCOMポート番号とか機能の確認用折り返しケーブル(ドングル?)

pySerial から始めようと思いましたが、動作確認するのに何か無いと面白くないのでこれを。
これが電子工作1本目ですか。。。

シリアルポートを操作するソフトの動作確認は、ちょっと面倒です、もう一台 PC 用意したり、ケーブルでつないだり、それなりのソフト別に用意したり。とか。また、間違ったりすることもしょっちゅう。
COM1とCOM2を市販のクロスケーブルで繋ぐのもいいアイデアです。COM1実験ソフト、COM2確認用ターミナルソフトとか。

--------
D-sub(D) 9pin メス(F) 半田付け用のコネクタに、配線を3本半田付けします。

3 pin(TxD) ---- 2 Pin(RxD)
7 pin(RTS) ---- 8 pin(CTS)
4 pin(DTR) ---- 6 pin(DSR)
1 pin(CD)
9 pin(RI)
5 pin(GND)


後ろから見たところです。CD や RI の機能も確認したいなら、4pin(DTR)とかから接続するといいかもしれません。ピン番号は、コネクタをよーく見ると、ちゃんと数字が書いてあります。

将来のトラブルを減らすために、シェルに納めます。

使い方はこんな感じです。

これを使いたいCOMポートに接続して、自分のソフトの機能確認をします。自分でソフトを組む前に、確実な方法で、自分のソフト以外の部分を確かめておくのは、いい習慣です。

特にCOM番号は落とし穴です、古いノートPCだと COM1 が赤外線通信ポートとかに割り当てられてることもあります。

Windowsのアクセサリ、通信、ハイパーターミナルなら、プロパティで、COM1とか選んで、電話のボタンをクリックして、なにかキーを押すと画面に押したキーが表示されます。

k って押しても k と表示されなければ、何かが違います。このドングルの機能を確認するには(あああ?)、ローカルエコーを有効にしてはいけません。

通信やるなら TeraTerm とか、つかいましょ。その時は、TCP/IP ではなく Serial から起動してくださいね。

2008年4月11日金曜日

Python で GPIB や ハードを制御する環境

Windows XP (Win32)と  Python で 
 GP-IB測定器を制御する環境。
 ハードウェアを制御する環境。
ハード制御といっても COM (RS-232C)ポート やら LPT(プリンタ)ポートいじる程度。

日本語データを扱うとか、その辺は切り捨てる。人生を楽にする為に。

順に
  1. Windows XP (Win32)
  2. Agilent IO Libraries Suite 14.0  :GPIB 制御するのに VISA.DLL を何か。
  3. Python 2.5   
  4. pyWin32  : pySerial 動かすのとか Python 2.5 以前のには ctypes  
  5. PyVISA 1.3 win32 : GPIB測定器制御するのに
  6. pySerial 2.2 win32 :シリアルポートの制御に
  7. io.dll を Geek Hideout から : ctypes の実験を兼ねて、プリンターポートの制御。
またゆっくり リンク先とか整備しますね。当面は、 Google にて
ほとんど SourceForge.net にあります。

インストール した Python のバージョンと OS の種類をあわせましょ。

2008年4月10日木曜日

VB から Python script を実行する

初投稿がこれですか。。。
Visual Basic から Python のスクリプトを実行させる。
フルパスで書く。

Call Shell("c:\python25\python.exe c:\test\tool\test.py")