16.78MHz -2ページ目

展開パズル

まぁ、まずはPPMなりBMPなり、画像データを生で読めるフォーマットに直そうか

桜花さんこの記事に触発されてうちでも作ってみた。多分桜花さんのヤツと違ってLinux環境のほうが解きやすいと思うけど、実行可能バイナリは入ってないから頑張れば実行環境が無くても解けると思う。

Net::Twitterでつぶやく/読む

PerlNet::Twitterを使えばPerlスクリプトから簡単につぶやいたりタイムラインを取得したりすることが出来る。まずつぶやき方
 48   my $twitter = Net::Twitter->new(
 49  username => $username,
 50  password => $password
 51  );

Twitterのアカウントを引数にNet::Twitterのインスタンスを作って、
 74   $twitter->update( $converter->convert( $text ) );

updateでつぶやく。
$ ./twitter_send.pl Net::Twitterからつぶやくなう
Username : fadis_
Password :
$

結果
続いて、タイムラインの取得。TwitterにはWEBベースの通常のインターフェースとは別にTwitter REST APIと呼ばれるアプリケーションがTwitterにアクセスするためのXMLベースのインターフェースが用意されている。これをLWPで落としてきてXML::Simpleあたりでパースしても良いのだが、Net::TwitterにはTwitter REST APIのラッパーが用意されているのでそれを使う。Twitter REST APIを使う場合Net::Twitterは何をやってくれるのかというと
1.ハッシュで与えられた引数からURLを組み立ててGETしてくる
2.取得したXMLをPerlのデータ構造にデシリアライズする
という2点だけだったりする。殆どTwitter REST APIを直接触るのと同じ感覚なので、このへんでTwitter REST APIの感触をつかんでおくととっつきやすいかもしれない。
 049     traits   => [qw/API::REST/],
 050  username => $username,
 051  password => $password
 052  );

まずつぶやく時と同じようにNet::Twitterのインスタンスを作る。
 064     $status = $twitter->friends_timeline({ count => 20 });

とりあえず最大数だけ指定してタイムラインを取得
 088     my @reversed_timeline;
 089  my $converter = Text::Iconv->new( "utf8", getSystemCharCode() );
 090  foreach my $status ( @$timeline ) {
 091  push( @reversed_timeline, $converter->convert( ${status}->{user}->{screen_name}. " : ". ${status}->{text} . "\n" ) );
 092  }
 093  foreach my $status ( @$timeline ) {
 094  print( pop( @reversed_timeline ) );
 095  }
 096  $current_head = ${$timeline}[ 0 ]->{id};

タイムラインの配列は最初の要素が最新の要素になっているのでひっくり返して順番に書き出し。このとき最新の要素のIDを覚えておく
 061     $status = $twitter->friends_timeline({ since_id => $since, count => 100 });

2度目以降のタイムラインの取得では前回取得時の最新のID以降の要素だけを取得するのがTwitter的にお行儀の良いアクセスの仕方。ちなみに、このプログラムは終了しないので止めたくなったらCtrl+Cする。
Net::Twitterにはこの他にもフォローの管理OAuthによるより安全な認証等の機能が備わっているが、詳しくは公式のドキュメントを参照。

BeagleBoard-xM

beagleBoard.orgOMAP3530上位互換SoC、DM3730を搭載する次世代BeagleBoard、BeagleBoard-xMを発表した。従来のBeagleBoardとの違いをまとめると以下のとおり
BeagleBoardBeagleBoard-xM
プロセッサOMAP3530 500MHz(初期)720MHz(現在)DM3730 1GHz
メモリ256MB512MB
RS232DIPヘッダD-sub 9pin
Ethernetなし100Base-TX
USBホストコネクタ1個4個
SDカードSDカードスロットx1MicroSDスロットx1
カメラコネクタなしあり


新しく搭載されるSoC DM3730はまだTIから公式にアナウンスされていないチップだが、こことかによるとOMAP3とAM3715(こちらも未発表の組み込み用ARM SoC)を1個のチップに収めたもので、OMAP3のみを使うことで従来のOMAP3を想定したバイナリをそのまま実行することが出来、かつもう1つのSoCをコプロセッサとして使うことで高いパフォーマンスを得ることが出来る、というシロモノらしい。ようするにNintendoDSみたいな構成になるものと思われる。

OMAP3530のUSBホストはルートハブにコネクタを3つまでつけることが出来るが、コネクタが4つついているのでボード上にUSBハブコントローラが載っているのではないかと思われる。外部USBハブなしでより多くのUSBデバイスを接続できるようになるのはありがたいのだが、BeagleBoardは最初のボードがリリースされてからUSBホストがまともに機能するボードが登場するまでにずいぶんかかったので(そしてUSBホストがまともに動かないボードを買ってしまったので)、この派手な仕様の変更には不安を感じずにはいられない。

OMAP3は元々カメラ入力のためのインターフェースを備えているが、BeagleBoardではそれらのピンは配線されておらず利用することが出来なかった。BeagleBoard-xMではこのインターフェースにアクセスするためのヘッダが追加される

写真を見る限り、基盤上の部品の密度が上がってマウント用の穴は無くなってしまったらしい。ケースに収めるには工夫が必要になりそうだ。

追記: ここによるとBeagleBoard-xMは6月7日のESC Chicagoで実機が展示され、同日よりDigi-Keyで$179で販売される模様。

Stellaris LM3S811で日本語(完成版)

Stellarisで日本語を表示するライブラリが完成したので公開。
ここからソースをダウンロードしてきてStellarisWareディレクトリの直下に置いてmakeするとlibjptext.aが出来上がるので、これをリンクしてやればStellaris LM3S811評価ボードのOLEDディスプレイ上で日本語を表示することができる。例によってサンプルプログラムはボード付属のサンプルプログラムhelloに対するパッチの形で、ここに置いてある。ビルド方法は前回と同じなのでそちらを参照。
前回からの変更点は以下の通り

ライブラリ化した
関数名を全てfstから始まる名前にした
バックスクロールに対応した
文字を振動させられるようにした

サンプルプログラムを実行するとこんなのがひたすら震えるユーザボタンを押すと振動が止まるようになっている。
16.78MHz-ガクブル
今回のサンプルプログラムは一定時間操作が無いとOLEDディスプレイの電源を落としてプロセッサのクロックを1/16にしてユーザボタンが押されるまで待つようになっている。ユーザボタンが押されたら再び文字が震えはじめる。

このライブラリは、フォントデータ部分はオリジナルのk6x8のライセンスと同じライセンスのもとで再配布することができる。それ以外の部分は修正BSDライセンスのもとで再配布することが出来る。

Stellaris LM3S811で日本語(改良版)

前回の予告通りStellaris用日本語表示関数群に改行とスクロール、フェードイン/フェードアウトを追加した改良版を作った。
まずこの新しいk6x8描画関数群を前回同様StellarisWareディレクトリの直下の展開する。前回のソースと同じ場所に展開されるが前回のものと互換性はないので前回のソースをコンパイル可能なまま今回のバージョンを展開するにはMakefileを書き換える必要がある。(この辺は近いうちにちゃんとクロスコンパイラのlib/以下に置いておけるスタティックライブラリにまとめるつもり) 日本語表示サンプルは前回同様ボード付属のサンプルプログラムhelloに対する差分の形にしてあるので、まずは必要なファイルをコピーしてくる。
$ cd /path/to/StellarisWare/
$ cd boards/ek-lm3s811/
$ mkidr japanese-0.2
$ cp hello/{Makefile,hello.c,hello.ld,startup_gcc.c} japanese-0.2/
$ cd japanese-0.2/

続いてこのパッチを当ててビルドする。
$ patch -p1 <./japanese-0.2.diff
$ make

出来上がったバイナリgcc/hello.binをOpenOCDでボードに書き込むと2行のOLEDディスプレイには収まらない長さの日本語テキストがスクロールしながら表示される。
今回の日本語表示では内部バッファやスクロール情報等を構造体FullScreenTextにまとめているのだが、大きな構造体をスタックに確保しようとするとSRAMに十分なスペースがある場合でもなぜかボードがハングしてしまう不思議現象に直面したので、
static FullScreenText text;

とりあえず構造体を静的に確保した。この問題については後でアセンブラコードやデバッガとにらめっこして調べる必要がありそうだ。多分大きすぎる構造体はスタックではなくヒープを使うようにコンパイルされるがヒープを使う準備が整っていなかったとかそういうオチで、書けないメモリ領域に書き込みでも試みてハードウェア例外で割り込みが発生したといったところだろう。使い方は、まずfstInitでテキストを渡して構造体を初期化したあと、fstDisplayで表示する。fstScrollでスクロール出来るが、今のところ下にスクロールするコードしか書いていないので戻ることは出来ない。スクロールが終端に達するとfstIsEnd関数は非ゼロ値を返す。fstSetMaskは文字の明るさを設定する。明るさといっても単色OLEDなので、実際には文字にビットマスクをかぶせることで点灯するドットを間引いている。ただでさえ6x8ドットしかない日本語フォントのドットが間引かれると読むのはほぼ不可能なので、ほぼフェードイン/フェードアウトエフェクト専用。
今回のデモでは評価ボードに搭載されているユーザボタンを使用している。テキストが終端までスクロールするとOLEDディスプレイの電源が落ちるようになっているが、ユーザボタンが押されるとOLEDディスプレイは再び電源が入りテキストが再び最初から流れる。このユーザボタンはGPIOポートCの4bit目に接続されており、付属ライブラリの関数を使うことで簡単に状態を読むことが出来る(GPIOくらいなら直接レジスタを叩いても手間は大して変わらないけど)一点注意が必要なのは、このボタンは押されていない状態がHIGHになっているということ。ちなみに隣の5bit目にはユーザLEDが接続されている