2013/07/23

BeagleBone(無印)にKernel3.8のイメージを入れる

BeagleBone Blackが出て、メモリが足りなかったりCPUが遅かったりする無印BeagleBoneの影は薄れてしまった感じではありますが、手元に2枚あるので再利用方法を考えています。

公式Wikiでは無印用と無印・Black兼用の2種類のイメージが配布されており、無印用のカーネルはv3.2.42、Black用のカーネルはv3.8.13です。(2013-07-23現在)

無印をデバイスツリーファイルのテスト機にするため、3.8のイメージをマイクロSDに書き込みます。

参考元:BeagleBoardUbuntu

手順はダウンロードして展開して焼くだけです。
セットアップスクリプト万歳。

 wget http://rcn-ee.net/deb/rootfs/raring/ubuntu-13.04-console-armhf-2013-06-14.tar.xz

 tar xJf ubuntu-13.04-console-armhf-2013-06-14.tar.xz
 cd ubuntu-13.04-console-armhf-2013-06-14

 sudo ./setup_sdcard.sh --probe-mmc

 sudo ./setup_sdcard.sh --mmc /dev/sdX --uboot bone_dtb

500MBぐらいのイメージを別途ダウンロードするのでしばらく待ちます。
マイクロSDに転送が終わったら、BeagleBoneに挿して起動します。
起動後のログを見ると、 無印のほうでもCapeマネージャが利用できています。

 ubuntu@arm:/proc$ dmesg |grep bone
 [    0.000000] Linux version 3.8.13-bone21 (root@imx6q-sabrelite-1gb-0) (gcc version 4.7.3 (Ubuntu/Linaro 4.7.3-1ubuntu1) ) #1 SMP Fri Jun 14 03:10:29 UTC 2013
 [    1.634617] bone-capemgr bone_capemgr.7: Baseboard: 'A335BONE,00A5,0812BB000908'
 [    1.642422] bone-capemgr bone_capemgr.7: compatible-baseboard=ti,beaglebone
 [    1.679849] bone-capemgr bone_capemgr.7: slot #0: No cape found
 [    1.716951] bone-capemgr bone_capemgr.7: slot #1: No cape found
 [    1.754060] bone-capemgr bone_capemgr.7: slot #2: No cape found
 [    1.791172] bone-capemgr bone_capemgr.7: slot #3: No cape found
 [    1.797597] bone-capemgr bone_capemgr.7: initialized OK.
 [    1.938233] usb usb1: Manufacturer: Linux 3.8.13-bone21 musb-hcd

これならデバイスツリーのテストに無印Boneも使えますね。
eMMCやHDMIが最初からつながっていないので、無印の方が配線の自由度があるといえばあるのかな?

BeagleBone Black デバイスツリーの使い方とヘッダ一覧表

YoutubeでBeagleBoneの動画を探していたところ、BeagleBone Blackでのデバイスツリーの使い方を解説しているものを見つけました。

作者はDublin City UniversityのDerek Molloyさんです。
講座で使っている動画なのでしょうか?45分間の動画の中で、CapeManagerにカスタムCapeを読み込ませてLEDの制御とスイッチのOn/Offの検出、プルアップ・プルダウンの使い方などを解説されています。

GPIOs on the Beaglebone Black using the Device Tree Overlays

動画の中で、ピンヘッダの名前やレジスタオフセットの一覧表が出ており、欲しいな〜と思っていたらgitにアップされていることがわかりました。
ヘッダ一覧表の一部

以下のコマンドを実行してリポジトリをもらってきましょう。

 git clone git://github.com/derekmolloy/boneDeviceTree.git

DocフォルダにP8ヘッダとP9ヘッダの一覧表がPDFで保存されています。
印刷して手元に置いておくと便利ですね。

2013/07/02

BeagleBone BlackでA/D変換(2)

前回の投稿ではアナログ入力を取り込むところまでやりました。
今回はそれを関数にして、なるべく面倒な手続きナシで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に保存してあります。
ではまた。