2012/05/18

BeagleBone Pin Guide Rev.2

前回、BeagleBoneの下に敷くものを作りましたが、いまいち使いにくかったので
Arduinoのように拡張ヘッダのすぐ横に名前がわかるようなものを作りました。

PDFデータとソースファイルは別館の方に保存してあります。

 Printable pin guide Rev.2  Download


印刷してはがきなどに貼ります。


こんな感じで切り出します。
枠もはさみで切っちゃってください


載せます

完成!!

2012/05/16

Python勉強中

BeagleBoneというキーワードでいろいろとググってると、pythonを使ってGPIOを制御したりPWM制御を行っている記事が見つかりました。

pythonは触ったことは無いのですが、この際なのでpythonもすこしかじってみることにしました。

ひとまず公式サイトのドキュメントを読んで、GPIOを制御するサンプルコードを写経しながら遊んでいます。pythonの対話モードによるテスト実行が便利だな〜と感じてます。

pythonでもCでも同じですが、マルチプレクサの設定や、gpioのexport/unexportを毎回するのは面倒になってきたので、BeagleBone用の便利なライブラリが無いか検索中です。

ではまた。

2012/05/13

UART通信を行う

BeagleBoneでUARTを行うために色々調べてみました。
BeagleBoneのURATポートが/dev/tty?にマッピングされているのがわからないため、
dmesgコマンドを使ってどのポートかを調査しました。


0.161328] omap_uart.1: ttyO1 at MMIO 0x48022000 (irq = 73) is a OMAP UART1
[    0.161641] omap_uart.2: ttyO2 at MMIO 0x48024000 (irq = 74) is a OMAP UART2
[    0.161924] omap_uart.3: ttyO3 at MMIO 0x481a6000 (irq = 44) is a OMAP UART3
[    0.162205] omap_uart.4: ttyO4 at MMIO 0x481a8000 (irq = 45) is a OMAP UART4
[    0.162494] omap_uart.5: ttyO5 at MMIO 0x481aa000 (irq = 46) is a OMAP UART5

あとは

Using the Serial and Analog Pins にあるように、omap_muxの設定を変更します。

cd /sys/kernel/debug/omap_mux/
echo 20 > uart1_rxd
echo 0 > uart1_txd
echo 21 > uart2_rxd
echo 1 > uart2_txd

muxの設定が完了したら、minicomなどのターミナルソフトで接続すればOKです。
試しにuart1_txtとurart2_rxd、uart2_txdとuart1_rxdをつなげて、minicomで互いに通信できたので問題なく動くようです。

ではまた。

2012/05/12

BeagleBone 配線ガイド

BeagleBoneには、92個の拡張ピンがありますが、リファレンスガイドのピン番号を確認し、ピンの場所を1つずつ数えながらジャンパワイヤを挿す、という作業に苦労します。

少しは効率よくジャンパワイヤを挿すために、ガイド用の用紙を作りました。
BeagleBoneを用紙の上に置くと、上下にピンの名前と番号が見えるようにしてあります。
一応細い線も引いたので、挿し間違えも減ると思います。

ガイド用紙。硬い紙に印刷するとよさそう


BeagleBoneを置いたところ。

用紙はPDFにして別館の方においておきました。
BeagleBone PIN_Guide


"""""""""""""""""""""""""""
   NEW!
BeagleBone Pin Guide rev.2
"""""""""""""""""""""""""""
ではまた。




A/D変換のテスト

BeagleBoneには、8つの12bit A/D変換がついています。
最大入力電圧は1.8Vとなっています。

今回は温度センサ LM35DZをつなげて、温度測定してみることにしました。

LM35DZは、0℃から100℃まで計測できる温度センサで、出力は10mV/℃となっています。
動作電圧は4V~20Vなので、今回はSYS_5Vから電源を供給しています。
LM35DZの出力を、AIN0(P9の39ピン)に接続し、温度測定を行いました。






時刻もNTPで補正できるので、簡易温度ロガーとしてすぐに使えそうな感じです。


今回のソースコードは以下の通りです。
/*
 *Beagle Bone
 *Sample code for analog input.
 */

#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

//LM35D
float VoltageToTemp(float voltage)
{
    //LM35D 10.0mV/Celsius
    return voltage*1000/10;
}

void printCurrentTime()
{
    //
    time_t t;
    struct tm *s_time;
    char str[100];
    (void) time(&t);
    s_time=localtime(&t);

    fprintf(stdout,"%4d-%02d-%02d %02d:%02d:%02d",1900+s_time->tm_year,s_time->tm_mon+1,s_time->tm_mday,
                    s_time->tm_hour,s_time->tm_min,s_time->tm_sec);

}

//Convert digitalvalue to voltage.
float digitalValueToVoltage(int digValue)
{
    int analogResolution=4096;//    12bit A/D converter in BeagleBone
    float voltage=0;
    float maxInputVoltage= 1.8f;
    float rate=(float)(maxInputVoltage/analogResolution);
    return (float)(rate*digValue);
}

int main()
{
    int filedescriptor=open("/sys/devices/platform/tsc/ain1", O_RDONLY);
    fprintf(stdout,"start templuture monitoring\n");

    char buffer[128];
    while(1)
    {
        int readcount=read(filedescriptor,buffer,sizeof(buffer));
        if(-1!=readcount)
        {
            buffer[readcount]=NULL;
            lseek(filedescriptor,0,0);//reset seek position
            int digitalValue=atoi(buffer);
            float voltage=digitalValueToVoltage(digitalValue);
            float templuture=VoltageToTemp(voltage);
            printCurrentTime();
            fprintf(stdout," ReadValue:%d\tVoltage:%2.3fV\tTemplture:%2.1f\n",digitalValue,voltage,templuture);
        }
        else
        {
            fprintf(stdout,"could not read from ain2\n");
            return -1;
        }
        sleep(1);
    }
    close(filedescriptor);
    return 0;
}

ではまた。



2012/05/11

LinuxとBeagleBoneのGPIOの関係


BeagleBoneのGPIOは、

  1. exportを使ってGPIOにアクセスできるようにし
  2. gpioN/value に値を書き込んだり読み込んで入出力を行い
  3. 使わなくなったらunexportする

という手順で使えるのですが、そもそもどうしてこうなってるの?と疑問に思ったので調べてみました。

オリジナル:GPIO Interfaces@kernel.org

GPIO Interfaces 勝手に翻訳
(よくわからないとこは飛ばしています)

GPIO:General Purpose Input/Outputは、ソフトウェアで柔軟に制御できるデジタル信号です。これらは様々な種類のチップにより提供され、カスタムハードウェアを開発するLinux開発者によく知られています。GPIOピンはそれぞれピンまたはBGAパッケージ上のボールに接続されています。基盤の回路図を確認すると、GPIOがどのピンに接続されているかを確認することができます。セットアップコードがドライバにその接続情報を渡すので、ドライバはGPIOに対してデータを書き込むことができます。

System-On-Chip(SOC)プロセッサは、GPIOに大きく頼っています。いくつかのケースでは、非専用ピンはGPIOとして設定することができます。そして、SOCプロセッサは数ダースものGPIO対応ピンを持ちます。

FPGAのようなロジックデバイスは簡単にGPIOピンを提供することができます。パ
ワーマネージャやオーディオコーデックなどの多機能チップ は、SOCのGPIOピン
不足を補うために少しのGPIOピンを持っています。また、I2CやSPIバスを使用し
てSOCに接続する、GPIOエ キスパンダなどもあります。大抵のPCのサウスブリッ
ジ(入出力コントローラがある側)には、数ダースのGPIOピンを持ちます。(BIOS
の ファームウェアがそれを認識している場合のみ)

GPIOの機能はシステムによって変わってきますが、共通の機能は以下の通りです。
- 1または0の値を出力できます。
- 1または0の値を読み取ることができます。いくつかのチップは出力モードになっているピンの値を読み取ることができます。また、GPIOコントローラはデグリッチ/デバウンスロジックを持ち、ソフトウェアで制御できる場合もあります。
- 入力ではIRQ信号が使える場合があります。IRQは待機中システムのウェイクアップイベントなどに使用できます。
- GPIOピンは大抵の場合、入力/出力を切り替えることができますが、製品によってはどちらか一方のみしか利用できないものもあります。
- ほとんどのGPIOはスピンロックを保持したままアクセスできます。

GPIO conventions
Identifying GPIOs
パス。 GPIOは正の整数で識別されるとのこと。負の部分はエラーコード用に使うようです。

Using GPIOs
パス。gpio_direction_inputとgpio_direction_outputを使って入出力を切り替えることができるようです。

Spinlock-Safe GPIO access
パス。マルチスレッドでなければ、IRQハンドラなどの中では安全にGPIOをメモ
リの読み取り/書き込み命令を使用してアクセスできるようで す。

GPIO access that may sleep
Claiming and Releasing GPIOs
GPIOs mapped to IRQs
Emulating Open Drain Signals
What do these conventions omit?
GPIO implementor's framework (OPTIONAL)
Controller Drivers: gpio_chip
Platform Support
Board Support
全部パス。


以下の項目が一番疑問に思ってたところの解答っぽいです。
Paths in Sysfs
以下の3種類のエントリーが /sys/class/gpio 内にあります。

  • GPIOをユーザ空間でコントロールするためのインターフェース
  • GPIOs自身
  • GPIOコントローラ ("gpio_chip")としてインスタンス化されます

これらは"device"などの標準シンボリックリンクに加えられます。

コントロールインターフェースは書き込み専用です。
/sys/class/gpio/

  • "export"...ユーザ空間はカーネルに対し、GPIOをエクスポートするよう問い合わせます。例: "echo 19 > export "は"gpio19"ノードを作成します。これはカーネルコードでなくても可能です。
  • "unexport"...exportと反対の作用を持ちます。例: "echo 19 > unexport " は"gpio19"ノードを削除します。

GPIOシグナルは /sys/class/gpio/gpio42/ のようにパスを持ちます。また、以
下のような読み取り・書き込み可能な属性を持ちます。
/sys/class/gpio/gpioN/

  • "direction" .. "in"または"out"のいずれかとなります。大抵の場合、directionは書き込み可能です。カーネルがGPIOのdirection変更をサ ポートしていなかったり、ユーザ空間に許可していない場合は、directionは表示されません。


  • "value" .. 0(low)か1(high)の値を持ちます。GPIOが出力に設定されている場合は、この値は書き込みできます。0でない値は"high"として扱われ ます。
  • "edge" .. "none","rising","falling","both"の値を持ちます。これらの値を書き込むことで、信号のエッジ形状を選択することができます。このファイルは、GPIOピンが割り込み要求可能な場合に表示されます。
  • "active_low" .. 0(false) か1(true)の値を持ちます。0以外の値を書き込むと、読み込み・書き込みの属性値が反転します。

GPIOコントローラは/sys/class/gpio/gpiochip42/のようなパスを持ち、以下の
読み取り専用属性を持ちます。
/sys/class/gpio/gpiochipN/

  • "base" .. Nと同じで、このチップで管理されるGPIOピンの最初を表します。
  • "label" .. 診断用に提供されます。(常に一意であるとは限りません)
  • "ngpio" .. 何本GPIOピンが管理されているかを示します。 (N to N + ngpio - 1)

Exporting from Kernel code
パス。

以上、GPIOについての調査でした。

2012/05/10

BeagleBone 到着

到着を待っていたBeagleBoneが夕方に届きました。

わくわくしながら箱を開けると、なぜかBeagleBoneの箱が1個しか入っていません。2個頼んだのですが。。在庫は400近くあったので在庫が無くて送れなかった、という訳でもなさそうです。
代金も2個分請求されているので、送品ミスでしょうか。ひとまずDigikeyのカスタマーセンターに「2個頼んだけど1個しかきてないよ〜」と連絡しておきました。

1箱しかない。。。

とりあえず1つは届いているので、早速開封。
内容物はBeagleBoneとUSBケーブル、SDカードアダプターとマイクロSDカードです。



Arduino, BeagleBone, BeableBoardの大きさを比較してみました。


サイズはArduinoより一回り大きい程度で、Arduinoと同じようにピンソケットが2.54mmピッチなのでブレッドボードを接続しての実験もしやすそうです。

今週末はBeagleBoneの練習として、GPIOの使い方やA/D変換、シリアル通信の実験をしてみる予定です。

ではまた。

2012/05/09

自作USBライト

秋月電子でチップLEDやハイパワーLEDを買ったので、USBライトを作りました。
USBのコネクタは不要なUSBケーブルを分解して使っています。

1つ目、USBメモリーのようなコンパクトさを目指してチップLEDを実装したタイプ。実装後はホットボンドで固めているので見た目はあまりよくありません。Make:こんなに美しい自家製デバイス見たことない の様に、レジンを使うともっと綺麗にできるかもしれません。
LEDはNFSW036CTを使用しました。側面にハンダ面が無いタイプだったので、SMDユニバーサル基板に付けれませんでした。 
LED3個と1個。そこそこ明るい
1個タイプ点灯時

2つ目、角形LED OSW57LZ161Dを使用したタイプ。去年の夏に作成。角形タイプはユニバーサル基板にきっちり付くので、砲弾型に比べ光軸を平行に保ちやすいです。

最新作、3WのパワーLED OSM5XME3C1Sを使用したタイプ。集光レンズも付けて明るさ&指向性を重視しています。熱対策として小さめのヒートシンクをくっつけてあります。

USB電源に取り付け
点灯中。かなり明るい。直視注意

パナソニックのUSB電源の容量が大きいタイプが出る様なのでホームページに確認しにいったら、5月末に発売するモデルからLEDライトアタッチメントが標準で付くとのこと。電気屋さんに並んだらどんな形になっているかを確認してみたいと思います。

ではまた。

Beagle Boneを発注


去年の11月ぐらいに、Beagle Boneが発売されて、日本で発売されるのを待っていましたが、Digikeyで日本からでも買えるようになっていました。
1台あたり約8,000円で、BeagleBoardの半額程度でした。

2台注文して今は配送待ちです。(5/6 発注 ->5/9成田到着。速いなぁ)

ただ待っているのも何なので、予習としてリファレンスマニュアルを読んでおくことにしました。


BeagleBone リファレンスマニュアル
自分が使いそうなところだけ勝手に翻訳

オリジナル:http://beagleboard.org/static/BONESRM_latest.pdf

シリアルポート
 BeagleBoneには4+1つのシリアルポートがあります。
UART1,2,4にはTx,Rx,RTS,CTSがあり、UART5はTx,Rxのみです。
(UART0はUSBポート経由,Tx,Rx,RTS,CTSあり)

A/D変換
 7つのA/D変換が付いています。(1秒に10万回サンプリング可能)
ただし、最大入力電圧は1.8Vなので、抵抗分圧やレベルシフタを使って1.8V以上の入力が無いようにしてください。VDD_ADCは1.8Vの電圧がかかっていますが、リファレンス電圧としてのみ使用してください。電源として使用しないでください。

GPIO
最大66本のGPIOピンが利用できます。3.3Vの入出力が可能です。
4つあるGPIOバンクのうち、それぞれ2ピンずつ割り込みピンとして利用できます。

TIMERS
 4本のタイマーピンが利用できます。

PWM
 最大8本のPWMピンが利用できます。
 ECAP PWMが2ピン利用できます(よくわからず)

5V DC電源
 Beagle Boneを動かすために、5VのACアダプタが利用できます。2.1mmセンタープラスのコネクタです。電圧の高いACアダプタ(7Vや12Vなど)をつないだときに備え、NCP349というチップが入っています。高い電圧がかかっている場合は、メインボードに電源が入らないようになっています。5VDCラインは拡張ヘッダにも接続されています。これは、拡張ヘッダに拡張ボードをつけた際、電源を供給できるようにするためのものです。

USB電源
Beagle BoneはUSB電源での駆動も可能です。通常、USBのポートは500mAまで電流を供給できます。USB電源で駆動している場合は、VDD_5Vには5Vが供給されないので注意してください。SYS_5Vには5Vが供給されています。

電源の選択
5VDCとUSBが両方選択されていた場合は、TPS65217Bが自動的に電源の選択を行います。I2Cインターフェースを使用して、供給源をソフトウェアから変更することもできます。

消費電力
だいたいの電力消費量は以下の通りです。
消費電流(mA@5V)
モード USB DC DC+USB
Reset 180 60 190
uBoot 363 230 340
KernelBoot 502 350 470
KernelIdling 305 170 290

USBが接続されているときは、FT2232とHUBの電源が入るため、消費電流が増加します。USBが接続されていないときは、これらのデバイスは待機状態となります。USB接続時に120mAほど消費電流が増えるのはこのためです。消費電流量は、SDカードにアクセスしたり、LEDにアクセスすると変動します。

電源ライン
 VDD_1V8
 VDD_1V8は1.8Vが出力されます。VDD_1V8は最大1200mA供給できます。VDD_1V8はプロセッサとDDR2メモリーにのみ接続されています。

 VDD_MPU
 VDD_MPUは1.1Vが出力されます。この電圧はソフトウェアにより最大1.25Vまで変更することができます。VDD_MPUはプロセッサのみに接続されます。

VDD_CORE
 VDD_MPUとほぼ同じ。

VDD_3V3A
 VDD_3V3Aは2つある3.3Vラインのうちの1つです。このラインには225mAまで供給することができます。このレールはプロセッサやSDカードスロットに接続されています。

VDD_3V3B
 VDD_3V3BはLAN8710,EEPROM,USBHUB,FT2232に接続されています。

VRTC
 VRTCには1.8Vが出力されます。最大100mA供給できます。プロセッサに接続されます。


ユーザLED
 4つのユーザLEDがGPIOピンに接続されています。
LED GPIO
User0 GPIO1_21
User1 GPIO1_22
User2 GPIO1_23
User3 GPIO1_24

10/100 イーサネット
(省略)

USBホスト
USBホストポートが1つあります。このポートは最大500mAまで供給することができます(十分な容量の電源に接続している場合)


その他:C/C++でBeagle Boneの入出力を制御する方法のチュートリアル(英語)


Beagle BoneはArduinoよりのBeable Boardです。
ファンレス省エネサーバとして使ったり、カメラ付きラジコンの基板として使ったりと、色々遊べそうな感じです。

ではまた。