今回はそれを関数にして、なるべく面倒な手続きナシでA/D変換を使えるようにします。
(Beaglebone Linux version 3.8.13-bone21 でテストしてます)
""" Analog Functions """ def setupAnalogInput(): """number will change your environment. please modify this number.""" cmd= "sudo echo cape-bone-iio > /sys/devices/bone_capemgr.9/slots" if debugmode:print cmd os.system(cmd) def readAnalogVoltagemV(ainNo): """A/D変換された値を読み取ります。 helper.14 は環境により数字が異なります""" fpath="/sys/module/bone_iio_helper/drivers/platform:bone-iio-helper/helper.14/AIN" inNo=int(ainNo) if(ainNo>7): ainNo=7 if(ainNo<0): ainNo=0 devicefilepath=fpath+str(ainNo) cmd=" cat "+ devicefilepath #double reading to avoid cache data val=commands.getoutput(cmd) val=commands.getoutput(cmd) return int(val) def readAllAnalogInputmV(): """output all of analog input values""" values=[] for ainNo in range(7): values.append(readAnalogVoltagemV(ainNo)) return values
setupAnalogInput()がA/D変換を有効にするための初期設定です。実行にはroot権限が必要です。
bone_capemgrのあとにつく数字は環境によって変わる可能性があるので読み替えてください。readAllAnalogInputmV()を実行するとすべてのA/D変換ポートの出力を配列で取得します。
readAnalogVoltagemV()は各ポートの値を読み込む関数で、不具合回避のために値を二度読みしています。
参考元:Reading analog (ADC) values on BeagleBone black
今回はAIN0を1kΩの抵抗でプルダウンして、そこに温度センサLM35DZの出力をいれました。 LM35DZは1度あたり10mVの出力となるので、A/D変換の出力を10で割れば温度が計測できます。
''' Read analog value from temperature sensor type 'sudo -s' before using this script. connect temperature sensor(lm35dz) output to ain0-ain6. ''' import time from pyBoneIO import * def setup(): setupAnalogInput() print "Read analog value interval=1 sec" print "Ctrl+c to exit." def loop(): sensorvalues=readAllAnalogInputmV() for val in sensorvalues: temp=int(val)/10 print str(temp)+ "\t", print "" print "-"*60 delaySec(1) run(setup,loop)出力をタイムスタンプとともにファイルに書きだせば、簡易温度ロガーが作成できます。 phpのグラフライブラリなどと組み合わせれば、温度ログ公開ページとかも作れそうですね。
サンプルコード等はGithubに保存してあります。
ではまた。
0 件のコメント:
コメントを投稿