2013/06/27

BeagleBone BlackでA/D変換をする

BeagleBone Blackには8つ(7つでした 2013-06-30訂正) の12ビットA/D変換ポートがついています。
温度センサや距離センサなどの各種アナログセンサを使った工作には必須のポートです。

BeagleBone Blackからは読み取りの方法が変わったようなので、調べてみました。
(私の環境はBeagleBone Black - Ubuntu13.04です)

参考元:
 Reading analog (ADC) values on BeagleBone black
 BeagleBone Black Analog Input

BeagleBone BlackでA/D変換をする手順は以下の通りです。
まずはA/D変換を有効にします。

    echo cape-bone-iio > /sys/devices/bone_capemgr.*/slots

上記コマンドでデバイスファイルが作成され、各ポートの値がファイルシステム経由で取得できるようになります。dmesg | grep bone  を実行すると、 起動時にeMMCとHDMI用のデバイスドライバ?が読み込まれているのがわかります。

A/D変換ポートは8つ7つあるので、AIN0からAIN7AIN6までそれぞれ読み取ることができます。

    cat /sys/module/bone_iio_helper/drivers/platform:bone-iio-helper/*/AIN0
    cat /sys/module/bone_iio_helper/drivers/platform:bone-iio-helper/*/AIN1
    cat /sys/module/bone_iio_helper/drivers/platform:bone-iio-helper/*/AIN2
    cat /sys/module/bone_iio_helper/drivers/platform:bone-iio-helper/*/AIN3
    cat /sys/module/bone_iio_helper/drivers/platform:bone-iio-helper/*/AIN4
    cat /sys/module/bone_iio_helper/drivers/platform:bone-iio-helper/*/AIN5
    cat /sys/module/bone_iio_helper/drivers/platform:bone-iio-helper/*/AIN6
    cat /sys/module/bone_iio_helper/drivers/platform:bone-iio-helper/*/AIN7

現状では2度読みしないと値が更新されないようなので注意が必要です。
以前は12ビットの値がそのまま出力されていましたが、現時点ではミリボルト単位で出力されるようになっています。自分で変換する必要がないので便利ですね。


2013/06/26

中古ノートPC 富士通 FMV-R8270を購入

メインのデスクトップPCとは別に、居間で使うPCとして8年位前のノートPCを使っていました。
そのPCのキーボードの左CTRLと左Shiftとその周辺が反応しなくなったので外付けUSBキーボードで頑張っていましたが、いい加減イヤになってきたのでノートPCを購入することにしました。

予算の関係上、新品のノートPCは厳しいので、リファービッシュノートPCを探して購入しました。
購入したのはFMV-R8270というモデルで、Core2Duoの1.2GHz、80GのHDD、メモリ2GB、スーパーマルチドライブ、無線LAN内蔵という構成でした。値段は2万8千円。

リファービッシュPCなのでWindows7のHome Editionがインストールされていましたが、SSH端末として使うのでOSを消してUbuntu13.04をインストールしました。

本体の感想ですが、リファービッシュPCだけあってキーボード等も綺麗に掃除されていました。
液晶のドット欠けや変色、バックライトの消耗等もなく、快適に使用できています。
企業用モデルなのでキーボードも打ちやすいです。
バッテリーは1時間ぐらいは持ちそうなので中古にしてはまぁまぁです。
通販でも中古ノートPCは買えますが、やはり現物を見れたほうがキータッチ等も確かめられるので安心でした。

起動速度等が気になってきたら、メモリの増設かSSDへの換装を行おうと思います。


以下、Ubuntu13.04インストール後の作業メモです。
mozcのインストール
    sudo apt-get install ibus-mozc
念のためPCを再起動します。
左上の渦?みたいなアイコンをクリックして検索ウィンドウを表示して
ibus と入力します。
インプットメソッドのところでmozcを追加し、一番上に持ってきます。

vimのインストール
私はエディタとしてviを使っていますが、標準でインストールされているものは機能が少ないものなので、フルバージョンをインストールします。
    sudo apt-get install vim

minicomのインストール
シリアル通信を使うためのターミナルソフトです。
    sudo apt-get intall minicom

開発環境のインストール

    sudo apt-get install build-essential

ついでにCPUの速度を変更するcpufrequtilsもインストールしておきます。
     sudo apt-get install cpufrequtils



2013/06/25

BeagleBone Black CPUの速度を変更する

BeagleBone Blackには1GHzで動作するCPUが搭載されています。
たいていの場合はCPU速度が速いほどよいのですが、速度を犠牲にしてでも省電力で動作させたい場合もあります。
Windows PCでは電源の設定のところで「ハイパフォーマンス」「省電力」が選べますが、Ubuntuを積んだBeagleBoneで同じようなことが出来るかを調べてみました。

参考:LinuxでCPUの動的クロック変更を無効にする方法

クロックを変更するにはcpufrqutilsというソフトが必要なのですが、BeagleBone Blackには最初からインストールされていました。

インストールされていない場合は、
  sudo apt-get install cpufrequtils
でインストールすることが出来ます。

BeagleBone Blackの標準設定では、governorがondemandとなっていました。
cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor

governorは電源プランみたいなもので、ondemandの状態ではヒマな時は最低速度で動作して忙しくなってきたら1GHzまでクロックアップしていく設定となっています。
governorは種類がいくつかあり、

常に最高速度(1GHz)で動かす場合は、
  cpufreq-set -g performance

常に最低速度(300MHz)で動かす場合は、
  cpufreq-set -g powersave

負荷に応じて動的に速度を変更する場合は、
  cpufreq-set -g ondemand

とします。

リファレンスマニュアルを見ると、消費する電流はブート中で最大460mA、何もしてないときは280mAとなっています。
遅くてもいいから消費電力を抑えたい場合は、governorをpowersaveにするとよいかもしれません。



2013/06/19

PWM出力を使う

BeagleBone Blackには8つのPWM出力があります。
PWMを使うと、モーターの回転速度を変更したり、LEDの輝度を変えることができます。
フルカラーLEDに接続すれば、好きな色を表現することもできます。

BeagleBoneではeCAPとeHRPWMという2種類のPWMが使用できます。
どちらも同じように使えるので、違いは気にしないでおきます。

eCAP2 P9-28 Mode=4
eCAP0 P9-42 Mode=0
eHRPWM0A P9-22 Mode=3
eHRPWM0B P9-21 Mode=3
eHRPWM1A P9-14 Mode=7
eHRPWM1B P9-16 Mode=7
eHRPWM2A P8-45 Mode=3 または  P8-13 Mode=4
eHRPWM2B P8-46 Mode=3 または  P8-19 Mode=4

BeagleBone BlackではeHRPWM2用のピンは内蔵eMMCとHDMI出力用に使用されているので、通常のBeagleBone Blackで使えるPWM出力は最大6つとなります。


使い方

まずはピンのMux modeを指定します。
今回はecap2を使います。

sudo -s
echo 4 > /sys/kernel/debug/omap/mcasp0_ahclkr

PWMの周波数とデューティ比を設定します。

cd /sys/class/pwm/ecap.2

echo 1 > request
echo 100 > period_freq
echo 50 > duty_percent
echo 1 > polarity

周波数とデューティ比を設定したので、あとはPWM出力を開始するだけです。

echo 1 > run

止める場合は

echo 0 > run

後片付け

echo 0 > request

PWMの周波数は100Hzまでは動作しますが、それ以上の周波数になると設定できないようです。


2013/06/16

BeagleBone Black 拡張ピンの機能を切り替える

BeagleBone、BeagleBone BlackにはP8とP9という、2つの拡張ヘッダがついています。それぞれの拡張ピンはCPUの16ビットレジスタを変更することでその機能を変更することができます。
(BeagleBone Blackのリファンレンスマニュアルの「8.2.5 Pin Usage」より)

  • Bit 15  ピンを使っているか使っていないかのインジケータ。使用しているときは1、使用していないときは0にセットする”べき”ビットです。(セットしなくてもよい)
  • Bit 14-7 予約済み。常に0にセットします。
  • Bit 6   スルーレートのコントロール。0がFast、1がSlowです。スルーレートは、入力信号に対する応答速度を示すものです。
  • Bit 5   受信を可能にするかどうか。 0=受信不可 1=受信可能  外部から信号を受けとる場合は、このビットを1に設定する必要があります。
  • Bit 4  プルアップ・プルダウンの切り替え。 0=プルダウン 1=プルアップ
  • Bit 3  プルアップ・プルダウンの有効・無効切り替え。0=PU/PD有効 1=PU/PD無効
  • Bit 2-0 機能切り替え

BeagleBone BlackにはP8とP9の拡張ヘッダがあり、ユーザが自由に機能を指定することができますが、P8は出荷時から使用されているピンがあるので、なるべくP9を使うようにした方がよいでしょう。

  • P8 11-17,19-21:eMMCに接続されています。
  • P8 27-46:HDMI出力用に使用されています。





2013/06/12

BeagleBone BlackでLEDを光らせる

BeagleBone Blackをpythonから操作しよう の第1弾。
手持ちのLEDを拡張ヘッダにつないでLEDを光らせてみましょう。

準備:

電子工作用部品の入手
本体に接続するLEDやセンサなどが手元にない場合は、電子工作用部品を販売しているWebショップなどで部品を購入しましょう。
  • 秋月電子通商 URL: http://akizukidenshi.com/
    • LED,テスタ,ブレッドボードなど、基本的な部材はたいていここで入手できます。 
  • エレ工房さくらい URL: http://www.interq.or.jp/www-user/ecw/
    • よく使う抵抗20種類セットやLEDセットなど、電子部品の手持ちが少ない場合に便利です。

電子工作を始めるにあたって必要そうなものは以下の通りです。
  • テスタ 1台
  • ブレッドボード 1枚
  • ジャンパワイヤ 1セット
  • 1/4W 炭素皮膜抵抗 数種類(100Ω,1kΩ,4.7kΩ,10kΩなど)
  • 3mmまたは5mmの砲弾型LED 10個程度
  • タクトスイッチ 10個程度
  • クリップ付きコード 3~4本
作る
部材も揃えたところで、LED点灯用の回路をブレッドボード上に作成します。
  1. LEDのカソード(足の短い方)と抵抗を接続し、抵抗とブレッドボードのGNDを接続します。
  2. Beaglebone Black(以下、BBB)のGNDとブレッドボードのGNDを接続します。
  3. P8の4番(GPIO1_7)とLEDのアノード(足の長いほう)を接続します。


BBB側の準備をします。下記コマンドを実行してください。
   
    sudo -s
    (パスワード入力)
    echo 7 > /sys/kernel/debug/omap_mux/gpmc_ad7
    echo 39 > /sys/class/gpio/export
    cd /sys/class/gpio/gpio39
    echo out > direction
    echo 0 > value



これでLEDを点灯させる準備が整いました。
下記コマンドを実行して、LEDを点灯させましょう。
   
    echo 1 > value

LEDが点灯すれば成功です。
次に、下記コマンドを実行してLEDを消灯しましょう。
   
    echo 0 > value

GPIOピンを使い終わったら下記コマンドを実行します。
   
    echo 39 > /sys/class/gpio/unexport

以上がLEDを点滅させるためのステップです。

さすがに毎回この作業を行うのはつらいので、関数を作って面倒な作業は関数に任せてしまいましょう。ライブラリはpyBBIOなどいろいろありますが、自作したものを今後使っていきます。

    git clone git://github.com/kyatou/pyBoneIO.git


'''
 blink led
 type 'sudo -s' before using this script.
'''
import time
from pyBoneIO import *

def setup():
    exportPin(39)
    setToGPIOWrite(39)
    print "Blink LED. interval=1 sec"
    print "Ctrl+c to exit."

def loop():
    turnOnGPIO(39)
    delaySec(1)
    turnOffGPIO(39)
    delaySec(1)
    
run(setup,loop)


exportやomap_muxの説明はまた今度に。


2013/06/09

BeagleBoneをUSB経由でインターネットにつなぐ

無印BeagleBoneとBeagleBone BlackはPCとUSBケーブルで接続するとUSB-Ethernetとして認識されます(母艦PC、BeagleBoneともにインターフェース名がusb0となります)

母艦PC側には当然インターネットに接続しているインターフェースがあるので、これを共有すればBeagleBoneにLANケーブルや無線LANアダプタを挿さなくてもインターネットが使えるはず。

というわけでググって調べてみました。


参考元:How To Share Network with Beagleboard through USB


母艦PC側

sudo iptables --table nat --append POSTROUTING --out-interface wlan2 -j MASQUERADE
sudo iptables --append FORWARD --in-interface usb0 -j ACCEPT
sudo echo 1 > /proc/sys/net/ipv4/ip_forward


(私の環境では、インターネットに接続しているのがwlan2、BeagleBoneに接続しているのがusb0です ip_forwardに1を書きこもうとして怒られても、ip_forwardの中身が1になってればOKです)

BeagleBone側

route add default gw 192.168.7.1

vi /etc/resolv.conf

(以下の行を追加)
nameserver 192.168.7.1

参考元の手順ではここまででOKとのこと。

我が家のネットワーク環境は以下のような感じになっているので、
まずは近いところからチェックしていきます。


ネットワーク環境

BeagleBone側で、
ping 192.168.7.1
ping 192.168.111.11
ping 192.168.111.1
ping 133.243.3.34  (NTPのサービスをしているnict)

と外側に向かってPINGを打っていきます。
インターネットに出れればOKです。

次にDNSのアドレスを設定する必要がありますが、192.168.7.1ではなく、
我が家のネットワークのDNSサーバ(ルータ)のIPに書き換えます。

vi /etc/resolv.conf
nameserver 192.168.111.1

これで ping www.google.co.jpとかやっても無事PINGが通ります。

喜んだのもつかの間、BeagleBoneを再起動すると設定が元に戻ってしまいます。
仕方が無いので

ubuntu@arm:~$ cat setupUSB0.sh
#!/bin/sh


count=`grep -c 192.168.111.1 /etc/resolv.conf`
echo ${count}
if [ ${count} -eq 0 ]; then
  echo "Adding default gateway"
  echo nameserver 192.168.111.1 >> /etc/resolv.conf
  tail /etc/resolv.conf
fi

route add default gw 192.168.7.1
netstat -rn

としてインターネット接続が必要なときに実行することにしました。


BeagleBone Blackを購入

久しぶりにBeagleBoneのページをのぞいたら、BeagleBone Blackという新作が出ているではありませんか。
金額も$45に値下げされています。これはRaspberry Piを意識しているのかな?

BeagleBone Blackで変更された部分は以下の通りです。
  • 値段が$45と、約半額までコストダウンされました。
  • CPUが500MHz-750MHz駆動だったものが1GHz駆動にアップグレードされました。
  • メモリが256MBから512MBに増えました。
  • 2GBのeMMC FLASHがつきました。これによりSDカードがなくてもLinuxが動きます
  • シリアルデバッグ用ポートに変更されました。ボードの内部で何が起きているか知りたい場合は、FTDIの3.3V用USBシリアルコネクタが必要になります。
  • MicroHDMIポートが搭載されました。母艦PCがなくても単体でGUI環境を利用できるようになりました。
うむ。これは買うしかない。

というわけでポチッておきました。今回はDigi-Keyではなく、Amazonで購入しました。
若干割高ではありますが、海外からの送料と発送までの時間を考えると妥当なところでしょう。

早速開封。内容物は

  • BeagleBone Black(BBB)本体
  • MiniUSBケーブル
  • クイックスタートガイド
の3つと非常にシンプルです。

箱の中身
eMMCにはAngstrom Linuxがインストールされており、USBケーブルでつなげばCloud9 IDEで開発がスタートできるように環境が整えられています。

ここまで整えてもらっていてはいるのですが、私はUbuntuをSDカードにインストールしてpython経由でGPIOピンを制御する方針で遊んでいこうと思います。