オラ、ドラゴンレーダーを作るぞ(13)

***13.1 最終構造の決定

先日購入したケースをパートナーに見せびらかしていたら、丸い窓ではなく後ろの四角い窓を正面にしたほうがいいのではないかと言われました。

こっちが丸窓
こっちが丸窓
これが四角い窓。購入したLCD(WBX280V009)にぴったしサイズ。
これが四角い窓。購入したLCD(WBX280V009)にぴったしサイズ。

うーん。確かに四角いほうがLCDを無駄なく使えるんだけどなあ。
でもドラゴンレーダーのあの形が頭にあるものだから、やっぱり丸窓がいいんだよなあ。

「丸い窓から基板とか見えているとかっこいいじゃない。」
な、なるほど。
確かにこの丸いところからArduino Duemilanoveの例の青基板が見えていたら、知らない人が見たら感心してくれるかも・・・
ということで、丸窓ではなく四角い窓を正面にすることにしました。

完成イメージ
完成イメージ


一度そう決めてしまうと、LCDとArduinoの位置が確定してしまったので、いっそのこと先に配線周りのごちゃごちゃを何とかしてしまおう!ということにしました。
ブレッドボードだと片付けるたびにケーブルが抜けて、取り回しにくいんですよね~。

***13.2 必要パーツの購入

というわけで、配線をきれいにするためのパーツを購入しました。

|~商品名|~説明|
|ピンヘッダ(オスL型) 2×40 (80P)|2列になっているL字形のピンヘッダーです。LCDからユニバーサル基盤への接続に使います。|
|ピンヘッダ(オスL型) 1×40 (40P)|こっちはArduinoからユニバーサル基盤へ接続するときに使うもの。|
|シングルピンソケット(低メス) 1×14 (14P)|これが失敗・・・「低メス」の文字を見落としていましたorz
通常のピンソケットと違って一個ずつ切り離せて便利だなあと思っていたら、深さが浅いので普通のピンヘッダーだとすぐ抜けてしまう。|
|ユニバーサル基盤 47 x 72mm 2.54mmピッチ ICB-288|これだけ近所のパーツショップで買ってきました。|

L字型のピンヘッダーの存在をたまたま知ったのですが、これがあればArduinoの勇姿を基板で隠すことなく見せつけられそうだ!と思い購入しました。
それで、秋月電子さんから即効で送られてきたので、居ても立ってもいられずにハンダ作業開始!
完成イメージは次のとおりです。

ある意味この図が設計書
ある意味この図が設計書



要するに、LCDとArduinoを背中合わせにして、それぞれのピンソケットをL字ピンヘッダーでつないでしまおうという作戦です。
完全にハンダと銅線でつなげてしまうとArduinoとLCDが再利用できないので、取り外しやすくかつコンパクトにまとまった、素晴らしい構成なのだっ!!(超自画自賛モード)

***13.3 いざハンダゴテ

要となるユニバーサル基板と短く切ったビニール線との死闘が始まったわけですが、LCDとArduinoを背中合わせにしたせいか、8ピンの順番が逆になってしまい、さらにL字ソケットをつなげているため何がどうつながらないといけないのか大混乱してしまいました。

ようやく出来上がったのがこれ↓

ジャーン
ジャーン

これ動きそうにないだろ・・・だって??
ふふっ、あんたいい勘してるぜ・・・

LCDにつなげるまでもなく、テスターで導通確認をしたところ12本中4本しかつながっていませんでした(T T)。
つながっていたかと思ったらショートしている(つながってはいけないところが接触してしまっている)箇所もあったりして・・・

半日かけてこの有様ですが、買ったはいいけど使い方が分からなかったテスターの使い方がわかったので、それで良しとしよう。

デジタルマルチメータ MAS-830L マニュアルレンジ
デジタルマルチメータ MAS-830L マニュアルレンジ

以前購入したのがこのテスターです(デジタルマルチメータ MAS-830L マニュアルレンジ)。
アナログのテスターが使いやすいと本で見ていたのですが、購入時にあいにく品切れだったため、安かったこいつを買いました(1,000円)。
届いてみたら超かわいい!
真っ黄色のラバーケースに包まれていて、これだけでおもちゃみたいです。案の定2歳の息子がおもちゃ替わりにしていたりします。

上の写真のレバー位置が導通確認のポジションで、この状態でつながっているかどうか確認したい部分の両端をテスターに接続した赤/青の測定リードでつつくと、導通時には「ピー」という音がします(画面には抵抗値も表示されます)。
他のポジションは今のところ理解していませんが、この導通ポジションに関しては完全に理解しましたよ!

さて作り直しなわけですが、ピンソケット(黒い穴が開いているやつ)はべったりハンダ付けしてしまったし、ビニール線も扱いにくいし、一からつくり直そうと近所のパーツショップに自転車を飛ばします。
・・・と付いてみたらなぜか休み∑(゜ε゜!!坂道きついのに・・・
仕方ないのでうちに帰って、失敗作からハンダを吸い取り線で一個ずつ吸い取って再チャレンジすることにしました。

基板作成ver.2。LCD側です。
基板作成ver.2。LCD側です。

・・・どう思われるかはわかりませんが、自分の中では最高最善の出来です。
作り上げたあとはうっとりと眺めこんでしまいました。

こっちがArduino接続側
こっちがArduino接続側

基板のLCD側にピン接続するケーブルを這わせ、Arduino側に3.3V(プラス極。赤いリード線につながっているの)とGND(マイナス極。基板上の錫メッキ線)を這わせました。
ああ、うっとり・・・

自分で基板上のホールの穴の数を数えたり、糸ノコで基板を小さく加工したり、ホールの位置とピンヘッダーの位置を検討したりと、初めて機械いじりらしいことができて、かつ完成できたことがこんなに嬉しいとは・・・

LCDにつなげたところ
LCDにつなげたところ

さらにArduinoにつなげたところ
さらにArduinoにつなげたところ



出来上がりだけ見ると「ふーん」という感じかもしれませんが、私自身からみると奇跡の構造です。

そしてケースに入れたところ・・・!
そしてケースに入れたところ・・・!

パートナーのイメージ通り、後ろの丸窓からArduinoのかわいい姿が。
パートナーのイメージ通り、後ろの丸窓からArduinoのかわいい姿が。


この後、接触不良を直したり、つけ忘れていたプルダウン用の抵抗を付けたりしたのですが、概ねスムーズに作業が完了しました。
それもこれも全てテスターのおかげです。
基盤づくりをこれから始める人は、絶対にテスターが必須ですので、ハンダごてと一緒に買い揃えましょう!

そしてこれが、実際に動かしたところです。

ケースに全部収まって、チャックの間からUSBケーブルをちょろっと出すことができるので、すごく取り回しがいいです。
出来たぞー!!

新しいブログリーダーを作りました

これまで使っていたブログリーダー、Bloglinesが2010年11月1日を持ってサービス終了することを受けて、似たようなインターフェースのブログリーダーが欲しいと思い、自分で作ることにしました。

■FamLines BLOG READERについて

これを作っている間はドラゴンレーダーの作成も停滞気味でしたが、ようやくリリースできたのでこれからはドラゴンレーダーに専念できそうです(お仕事は?)。

今書いていて気が付きましたが、本当にどうでもいいのですが、ブログリーダーとドラゴンレーダーって字面が似てますよね。

オラ、ドラゴンレーダーを作るぞ(12)

*** 12.1 LCDでの色表現

LCDを自由自在(?)に使いこなせることが分かったので、早速画面のデザインをしようと思ったのですが、LCDでの色表現ってHTMLでいう「#FFFFFF(白色)」みたいな表記ではないことに改めて気づきました。

FFFFFFはすなわち24ビットカラーですが、ILI9325などのLCDで色を指定する場合は16bitで指定する必要があります。
白色は0xffffですし、青色は0x001fといった感じです。

そういう色見本みたいのがどこかに転がってるんだろうと、軽~く考えて検索してみたのですが、なぜか見つからない!?
拾ったライブラリなどでは「#define ORANGE 0xFC00」みたいに定数定義していたりします。

それじゃあということで、色見本ページを作りました。
カラーピッカーも作りましたので、欲しい色の16bitカラーが確認できると思います。

16bit Color Picker & Color List

・・・それとも、本当はみんな違う方法で色指定しているんでしょうか??
う~ん、不明だ。

オラ、ドラゴンレーダーを作るぞ(11)

*** 11.1 タッチパネルをどうするか

LCD操作の目処が立ったので、あとはGPSとコンパスモジュール・・・と思っていたのですが、そういえば今回買ったLCDってタッチパネルが付いてるんですよね。
せっかく付いているんだから試してみたい!

・・・と思ったのですが、Arduinoのピン数が足りなくなりそう。

LCD接続のためにすでに12本のピンが使用済みで、残るピン数は8本。
改めてタッチパネルの使用ピン数を確認してみたところ、なんと5本(x1, x2, y1, y2, タッチ状態チェック)。
ということは、LCDとタッチパネルをつなげただけで17本のピンを消費してしまい、残るピンはたったの3本だけになってしまうぅ。。

ドラゴンレーダーには、少なくともコンパスモジュールとGPSモジュールが必要なのですが、これらには何本必要なんだろ。

まずコンパスモジュールはこれ、HMC6352搭載デジタルコンパスモジュール
マニュアルによると・・・2本必要。

GPSモジュールはこれ、SparkFun Electronicsの32 Channel LS20031 GPS 5Hz Receiver
これも2本必要だと・・

てことは、ピンが1本足りない!!
どれかいらなそうなの無いかなあと本気で探してみましたが、もちろんそんな無駄ピンは使ってない。

*** 11.2 タッチパネル諦めてボタンにするか、もしくは・・・

そもそもタッチパネルを何に使うのかといいますと、ドラゴンレーダーのユーザー機能としては、縮尺を変えることができないといけないし、管理機能(ドラゴンボール=お宝の位置座標を登録する)にも色々画面操作できないといけないので、そういったユーザーインターフェースで使おうと思っていたのです。

これが使えないとなると、ボタン?みたいのでやるしか無いかあ。。
まあボタンも機械っぽくていいかなあ。

それとも、3軸加速度センサーをつけて、Wiiみたいなインターフェースを実現するとか!
う~ん・・技術力がついていけなさそうだ・・
でも、傾けるとカーソルが動くようなインターフェースも面白いかもなあ・・・。

とにかく!残る8本-GPSの2本-コンパスの2本=残る4本でユーザーインターフェースをつくんないと。
ああ・・・タッチパネルが4本でよかったらなあ・・・(←しつこい)

オラ、ドラゴンレーダーを作るぞ(10)

*** 10.1 画像も表示できたよ

前回の記事からさらに一ヶ月経ってしまいました。
その間何をしていたかと言いますと、来る10月31日にサービス終了してしまうBloglinesの代替サービスを作っていました。
それについてはまた後ほどアナウンスするとして、ようやくその代替サービスの開発が一段落したので、まだドラゴンレーダー作りを再開です。

前回、ようやくLCDとArduinoがつながったところまで進めていたので、もう少しLCDの使い込みをすることにします。
ここから先はソフトウェアの領域なので、ハンダゴテを握らなくて済むのが楽だー。

画像出力のサンプルコードを以前拾っていたので、それを動かしてみました。

楽勝楽勝♪
これまでのハードウェアで難儀したのが嘘のように、あっさり動作しました。

*** 10.2 描画速度が3倍に!

画像の出力は出来ましたが、何だか描画が遅いかなあ・・・
テケテケ~と表示されるのは、作った本人は楽しいものですが、人が見たら遅いと思うだろうなあ。

サンプルコードとは別のライブラリコードを見ていたところ、何だか電子工作室 – 2.4/2.8インチ QVGA液晶表示器の制御で公開されているライブラリコードのほうがすっきり書かれていることに気がつきました。

ということで、電子工作室のライブラリを頑張って移植してみました!

例えば↓これ。

変更前
void LCD_Writ_Bus(char VH,char VL)  
{  
  unsigned char i,temp,data;
  data=VH;
  for(i=0;i<8;i++)   {     temp=(data&0x01);     if(temp)       digitalWrite(i,HIGH);     else       digitalWrite(i,LOW);     data=data>>1;
  }
  digitalWrite(LCD_WR,LOW);
  digitalWrite(LCD_WR,HIGH);
  data=VL;
  for(i=0;i<8;i++)   {     temp=(data&0x01);     if(temp)       digitalWrite(i,HIGH);     else       digitalWrite(i,LOW);     data=data>>1;
  }
  digitalWrite(LCD_WR,LOW);
  digitalWrite(LCD_WR,HIGH);
}

変更後。こんなにすっきり
void LCD_Write_Bus(char VH,char VL)
{
    // 上位バイト出力
    PORTD = (VH & 0xFF);
    digitalWrite(LCD_WR,LOW);
    digitalWrite(LCD_WR,HIGH);

    // 下位バイト出力
    PORTD = (VL & 0xFF);
    digitalWrite(LCD_WR,LOW);
    digitalWrite(LCD_WR,HIGH);
}

データの出力を行うD0~D7の8ピンに対して、元のソースでは何度もdigitalWrite関数を呼び出していたのですが、新コードではPORTD(Arduinoのポート操作用のキーワード)を使ってすっきり簡潔になりました。

この変更により、ものすごく描画速度が早くなった!
これぞ8bitアクセスの醍醐味!(?)

この移植作業を行ったおかげで、Arduinoのコーディング方法がだいぶ理解できてきた~。

*** 10.3 文字も表示できた!

移植した電子工作室のライブラリには文字表示の関数も用意されていたので、それを使って文字表示できることを確認しました。

↑ちょっと見えづらいですが、カタカナや一部の漢字もきれいに表示出来ています。
ありがたや~

それと、改めてLCD(ILI9325)のリファレンスを読み直していると、縦表示と横表示の切り替えができることがわかりました。
今回作るドラゴンレーダーでは横表示の方が都合が良いので、横表示に変えてみました。

変更したのはLCD_Init関数の中の下記の箇所です。

LCD_Out(0x0003, 0x1028); → LCD_Out(0x0003, 0x1018);

リファレンスに詳しく(英語で)書かれていますので、必要な方はリファレンスのp.55~56(8.2.5. LCD Driving Wave Control (R02h)をご参照ください。

*** 10.4 ケース発見!

そして、今日一番の出来事ですが、ドラゴンレーダーを収めるのにぴったりなケースをGeogesで見つけてしまいました!

ドラゴンレーダー用のケース。本当は写真入れです。
ドラゴンレーダー用のケース。本当は写真入れです。

以前から「惜しい」ケースをGeogesで見つけていたのですが、こんなにぴったりのが売られているなんて・・・・
写真ケースにはむしろ微妙なデザインですが(おい)、ドラゴンレーダーを収めるには本当にサイズぴったりで、見つけたときは自分のために作ってくれたとしか思えませんでした。
ありがとうGeoges!!

周りがチャックになっていて、ぱかっと開く。しかも中はふわふわ。
周りがチャックになっていて、ぱかっと開く。しかも中はふわふわ。
丸い穴部分が少し大きいので、ボール紙でマスキング。改良の余地あり。
丸い穴部分が少し大きいので、ボール紙でマスキング。改良の余地あり。
後ろにも窓が付いていて、これがなんとILI9325と超ぴったり!もはやILI9325のために作ったとしか思えない。
後ろにも窓が付いていて、これがなんとILI9325と超ぴったり!もはやILI9325のために作ったとしか思えない。

今は配線をブレッドボードで行っているのでごちゃごちゃしていますが、ユニバーサル基盤できれいに作り直したら早速はめてみます。
楽しみだ~

*** 10.5 本日までの報告書

本日版の最終ソースです
移植した電子工作室のライブラリも含まれていますので、良かったら使ってください。

あと、PORTDを使うために少し配線も見直しました。

|~LCD側|~Arduino側|
|DB10|D0|
|DB11|D1|
|DB12|D2|
|DB13|D3|
|DB14|D4|
|DB15|D5|
|DB16|D6|
|DB17|D7|
|RS|D8|
|WR|D9|
|CS|D10|
|RESET|D11|
|LEDA、VCC(3箇所)、RD|3V3|
|DB0~DB7、LEDK1~LEDK4、GND(2箇所)|GND(1kΩの抵抗を一つ入れて)|