アーカイブ
BeagleBoard(Ubuntu9.04)とArduinoやmoxaを接続し、シリアル通信でやりとりする
BeagleBoardはTIの作ったオープンソースハードウェア。こっそり春頃からいじっていたんだけど書いてなかった。
スペックに難はあるが、ディスプレイとサウンド出力つきの組み込み環境が俺でも作れるのは魅力。作品のレベルをプロダクトに近い所まで引き上げられる。
最近CRESTでのプロジェクト用にARM版Ubuntu9.04をbuildしてインストールして、Arduinoと接続する所までやったので書いておこう。
今はApache2とruby1.8.7(いずれもaptでインストールした)を使って、外付けしたArduinoとmoxaからデータを読み取っている。とりあえず大学院棟の明るさをCdSで取得してwebに公開している → http://shokai-b.mag.keio.ac.jp/light

■準備
BeagleBoardと、インストール時にパソコンとBeagleBoard間でシリアルコンソールを使うのに必要なBeagleケーブルはdigikeyで購入できる。他の部品は国内で全て入手可能。

■Ubuntu9.04をBeagleBoardにインストール
OSはSDカードにインストールする。
最初デスクトップ版をインストールしてみたけど重すぎた。AngstromやHandheld Mojoならそれなりに動くけど、フルのUbuntuデスクトップはウィンドウマネージャをtwmにしても無理だった。
今回の用途にはCUIがあれば十分だったので、最低限のbuildツールを含んだARM用イメージを作って起動させた。
なお作業はext3のファイルシステムが読み書きできる必要があるので全て別のUbuntu Desktopで行った。
- BeagleBoardにUbuntu Desktop版インストール – 橋本詳解
- BeagleBoardにUbuntuセットアップ(GUIなし)、sshdを入れてリモートログインしてみる – 橋本詳解
- いろいろインストールして環境を整える – 橋本詳解
- Rubyまわりをインストール – 橋本詳解
これで、ApacheやRubyやsshdはもちろん、emacsと各種elisp、gemとeasy_install、rails2やsinatra、mongrel_clusterとapache2でmod_proxy_balancerなどがaptとgemでさくっとインストールできた。
このへんのサーバサイドアプリ開発環境のセットアップの容易さはubuntuさすが。
処理速度は体感でDebian化した白箱より速い。SDカードなのであまりR/Wしたくないがたぶん外付けUSB-HDDも認識できるんじゃないだろうか。そうすると、クローラ作ったり簡単なbotを動かす程度の俺は自宅サーバ環境はBeagleBoardで十分という可能性もある。
処理速度とストレージ読み書きに不安はあるが小型かつバッテリーでも動かせるUbuntu Linux環境ができた。
■Arduino / moxaとの通信
BeagleBoard基板上のシリアルコンソールに使ったポートをArduinoやmoxaとの通信を使った。
本当はUSBで接続したかったけどできなかった。
FTDIチップのドライバはaptでインストールできるが、USBに接続しても認識されない(/dev/ttyUSB0に現れない)
同じバージョンのUbuntuデスクトップを別のAMD64マシンで用意して、同じようにセットアップをしたがこちらは認識した。ARM版Ubuntuが何かおかしいのかもしれない。
64bitAMDマシンではlsmodした時にFTDIチップを監視してるプロセスがいるんだけど、BeagleBoardではlsmodしてもいない。
誰かLinux詳しい人教えてくれるとうれしいです・・・
しかたないのでセットアップに使ったBeagleケーブルのオス版を作って通信に使う。
シリアルポートの9つのピンにはよく見ると番号が振ってあり、それをBeagleBoardの基板上の1~9ピン(10は無視する)と接続する。
シリアルポート側は
12345
6789
のようになるが、BeagleBoard上のコネクタは
13579
2468
となっているのでとても捻れる。気合いではんだづけする。基板上のシルク印刷をよく見てね。




これで、Arduinoの外側にあるRX / TXピンにMAX232(ADM3202)を接続すればBeagleBoardとシリアル通信できる。

ArduinoにCdS(明るさのセンサ)なんかを接続して数値をBeagleBoardに送り続ければいい。
/etc/event.d/ttyS2 を削除して再起動すると、/dev/ttyS2がシリアルコンソールではなくシリアルポートとして開ける。
screen /dev/ttyS2
でモニタできる。
UNIX系なので、シリアルポートもFileとして簡単に読み出せた。
Arduino + BeagleBoard(Ubuntu) シリアルポートを読んでたまにファイルに書き出す – 橋本詳解
通信できる手段が整えばあとは好きにできる。
PSoC CapSenseで静電容量タッチセンサ 4つ動かした
前の記事の回路などが思いきり間違っていたので修正しつつ、CapSenseとLED4つずつに増やした。
多分、マイコンの足の数だ増やせる。
例によってコードはBitbucketにアップした
CapSense CSDウィザードで4つスイッチを置いて

AnalogMUXBusに接続されている事を確認

CSDの設定。しきい値などをかなり何度も直した。適当にやってたので理論をわかってないんだけど、どうやらセンサ部分の形状や配置に応じて微調整しなければ使い物にならないっぽい。

ピンの設定。LEDが4つにした。
使ってないピンをPull Upにしておくとノイズが来ないので安定する事に気づいた。

実体配置図

前の記事の回路が間違っていて、あのままではうまく動かなかったが、1kΩの抵抗と0.1μFのキャパシタを足したら複数認識できるようになった。
CapSense CSDのデータシートにあった図。抵抗とキャパシタが必要らしい

P1[5]とP0[3]の間に1kΩを入れて、P0[3]からキャパシタを通して銅箔テープに延ばす。

前の記事はP1[5]とP0[3]で静電容量取ろうとしてたので、思いっきり間違ってた。
プログラム。
前のやつのif(CSD_1_bIsSensorActive(センサ番号))を増やしただけ。
shokai / CapSense LED / source — bitbucket.org
main.c
#include <m8c.h> // part specific constants and macros
#include "PSoCAPI.h" // PSoC API definitions for all User Modules
#define _BV(BIT) (1<<BIT)
#define sbi(BYTE,BIT) (BYTE |= _BV(BIT))
#define cbi(BYTE,BIT) (BYTE &= ~_BV(BIT))
#define LED_0_ON() sbi(PRT1DR, 7);
#define LED_0_OFF() cbi(PRT1DR, 7);
#define LED_1_ON() sbi(PRT0DR, 1);
#define LED_1_OFF() cbi(PRT0DR, 1);
#define LED_2_ON() sbi(PRT0DR, 5);
#define LED_2_OFF() cbi(PRT0DR, 5);
#define LED_3_ON() sbi(PRT0DR, 7);
#define LED_3_OFF() cbi(PRT0DR, 7);
void main()
{
M8C_EnableGInt;
CSD_1_Start();
CSD_1_InitializeBaselines();
CSD_1_SetDefaultFingerThresholds();
while(1){
CSD_1_ScanAllSensors();
CSD_1_UpdateAllBaselines();
if(CSD_1_bIsSensorActive(0)){
LED_0_ON();
}
else{
LED_0_OFF();
}
if(CSD_1_bIsSensorActive(1)){
LED_1_ON();
}
else{
LED_1_OFF();
}
if(CSD_1_bIsSensorActive(2)){
LED_2_ON();
}
else{
LED_2_OFF();
}
if(CSD_1_bIsSensorActive(3)){
LED_3_ON();
}
else{
LED_3_OFF();
}
}
}
PSoC CapSenseで静電容量タッチセンサを自作した
回路などが間違っている事に気がつきました
正しい実装は次の記事へ。
使った部品の説明などはこのまま下へ。
*********************************************
できたっぽい。ひさしぶりにマイコンいじった。
銅箔テープの部分に指が近づけると電気容量の乱れるので、それをPSoC CY8C21334のCapSense機能で検出してLEDを光らせている。
コードもbitbucketにアップしました
(音小さい)
LEDは点滅させたくてさせているんじゃないんだけど、してしまっている。
もう少し抵抗値などの調整が必要らしい。
静電容量タッチセンサはメカニカルな部品が無いので、ビデオの最後にやっている様に、何の変哲もない壁に埋め込んでその上に人の手が乗っているかを検出したりできる。
防水加工も容易だし、銅箔等を使えば曲面に埋め込む事も出来る。
実際ヨーロッパの寒いところに行くと信号機やエレベータのボタンが凍結防止のために静電容量センサで実装されていたりする。
PSoCのCapSenseはワンチップで静電容量センサを簡単に実装できるパッケージで、商業的にはSONYのオーディオコンポやAppleのiPodのホイールなんかにも使われていてずいぶん潤っているらしく、セミナーも無料だし基盤は配るしタダメシも出てくる。
次は複数のcapsenseを使えるようにしてみる予定。

■必要な部品
リンク先は買ったお店の商品ページ。
- PSoCマイコン CY8C21334-24PVXI(20pin)
capsenseがついているマイコン。いろいろ探した結果、これをchip1stopで買うのがコストパフォーマンスが一番良いという結論になった - 秋月のSSOP変換基板
CY8C21334がSSOPという超小さいパッケージしか無いので、ブレッドボードに刺せるように足幅を広げる基盤。28ピンなので8ピン余るけど安いからこれを使う。 - 銅箔テープ たしか千石で買ったと思う。薄くて平べったい電極ならなんでも良さそう
あとは、秋月で買ったPSoC MiniProgというUSB接続の書き込み機と、ブレッドボードとLEDとクリップとベニヤ板と変換基板のピンヘッダ(オス)。
■センサー部分の制作
銅箔テープを千石で買ってきて適当な木の板に平行に貼る。裏に糊がついていたので楽だった。


CY3235 CapSense-ProxDetでは2.2kΩの抵抗と0.1μFのキャパシタがついているらしいが、手持ちのPSoC Expressセミナーの時にもらったCY3121では何もなくCY8C21434に直結しているように見えるので、これでいいのかも。
■マイコンのはんだづけ
今回はんだづけはここだけ。
フラックスをたっぷり塗って、足に沿ってさっさっと撫でる。


■PSoC Designerでのデバイス設定
新規プロジェクトをCY8C21334 24PVXI(20pin)で開始して、
Device EditorでUser ModulesからCap Sense(CSD)を配置。

「Select CSD with clock prescaler」を選択した。
PSoC入門:PSoC First Touch編 – MeRLマイコンブの記事ではwithout clock prescalerを選んでいるが、digital/analog block消費量も変わらないのでclock prescalerにしてみた。
Interconnect Viewで、CSD_1をplaceしてから右クリックすると「CSDウィザード」というのがあるのでそれを使う。
センサの数を1、スライダーを0にしてPORT0_1を左上にドラッグアンドドロップして「OK」

すると、CSD_1に接続されている。
いままでUARTやADCモジュールではInterconnect Viewで自分で接続していたが、その必要が無くなっている。

CSD_1の設定を確認。Pinの設定をしておく。

最後に、PORT0_0でLEDを光らせるためにDriveをStrongに変更

ピン割り当て

Generate Applicationして、Cでプログラムを書く。
■PSoC Designerでのプログラミング
shokai / CapSense LED / source — bitbucket.org
main.c
#include <m8c.h> // part specific constants and macros
#include "PSoCAPI.h" // PSoC API definitions for all User Modules
#define _BV(BIT) (1<<BIT)
#define sbi(BYTE,BIT) (BYTE |= _BV(BIT))
#define cbi(BYTE,BIT) (BYTE &= ~_BV(BIT))
#define LED_ON() sbi(PRT0DR, 0);
#define LED_OFF() cbi(PRT0DR, 0);
void main()
{
M8C_EnableGInt;
CSD_1_Start();
CSD_1_InitializeBaselines();
CSD_1_SetDefaultFingerThresholds();
while(1){
CSD_1_ScanAllSensors();
CSD_1_UpdateAllBaselines();
if(CSD_1_bIsSensorActive(0)){
LED_ON();
}
else{
LED_OFF();
}
}
}
■マイコンの回路を作る
データシートを見て、PSoC MiniProgから接続が必要なSCLK、SDATA、XRES、VDD(VCC)、VSS(GND)の位置を確認

その通りに配線。電源はUSBのPSoC MiniProgから給電できる。
この時点でLEDを点灯させるだけのプログラムを書いて、マイコン単体で動くか確認した。

さきほどのプログラムを書き込んで、
PORT0_1とPORT1_5からクリップで銅箔テープに接続して完成。
さわると光る。

Rails + Physical Computingする時の注意点
最近まわりでRailsが流行っているんだけど、なんだか2ケタ以上の人が「webサービスと何か(?)をするにはRuby on Railsを使えば全部できる」という盛大な勘違いを起こしているので説明用資料を書いておく。Railsはそんなに万能ではないです。
Railsはwebアプリケーションを簡単に作れるMVCフレームワークで、HTTPを通してwebブラウザから使う事を前提にしている。マイコンとProcessingを接続してガジェットを作るのとは別の常識があります。
■Railsが向いていること
Railsは、おおざっぱに列挙するとこんなアプリケーションに向いています(無理すれば変な事も可能だけど後述)
- アクセスしたURLに応じて異なるHTMLやXMLが表示される
- 後ろにSQLなどのデータベースがあって、データを溜めたり取り出したりする
- ユーザ登録してログイン/ログアウトできて、同じURLでもユーザ毎に違うHTML表示が出る
- Formがあって、テキストを打ち込んで「投稿」すると保存される
普通のwebサービスを作るのに向いています。例えば
- mixiとかFacebookのようなSNS
- WordPressやMovableTypeのように記事をFormに打ち込んでデータベースに保存して、週毎/記事毎の様々な表示で同じデータを使い回す
- twitterや掲示板みたいなもの
ようするに、あるURLにHTTP GETでアクセスすると何か表示される。そしてHTTP POSTするとデータを溜めるという機能がある。
続きを読む…


最近のコメント