エントリー

カテゴリー「make:」の検索結果は以下のとおりです。

NASのHDDを入れ替えた

  • 2016/05/18 11:04
  • カテゴリー:make:

 うちで立ち上げているNAS,QNAPのTS-119P2は非常に便利で,これなしの生活はもう考えられません。HDDはWD REDの3TBを入れていますが,残りが1TBを切っており,そろそろ容量を気にして使わないといけなくなりつつあります。

 しかも,HDDは消耗品なので3年で交換するつもりだったのに,もう4年になるんです。これはまずい。全然壊れる気配がないので油断をしていましたが,4年間休みなく24時間運転しているHDDに生命線たるデータをてんこ盛りしてある現状は,まさに薄氷を踏む想いです。

 交換しないといけないのですが,同じ容量にするのは時間もお金ももったいないですから,ここは容量アップです。4TBがリーズナブルですが,増えた容量が1TBくらいでは面白くないですから,ここは6TBと行きましょう。

 WD REDの6TBも,少しずつ値段が下がっていて,amazonで安くなってきた頃を見計らい購入しました。27500円くらいだったと思います。

 これをどうやって3TBと入れ替えるか考えていたのですが,前回失敗したQ-RAID1で同期してから入れ替えるという作戦を,とりあえず今回もやってみることにしました。

 私と違い,うまくいったという話が散見されることと,前回の失敗は2TBから3TBに入れ替えるということが原因だったのではないかと思ったからです。3TBと6TBなら,管理領域もおそらく同じはず。ですから入れ替えも出来るのではないかと思ったのです。

 ダメならダメで,以前のやり方でやり直せばいいだけの事ですし,Q-RAID1ならNASを動かしたままでコピーがとれますので,丸2日以上かかる作業の間,NASを止めなくてもいいのが便利です。

 3日弱かかり,ようやくコピーが終わりました。NASを落として入れ替えます。あれ,なんか新しい6TBは振動がやたら大きいようで,大きな音がします。

 電源を入れて起動しますが,ステータスランプが点滅しており,起動できない様子です。これはもうダメですね。これが金曜日の21時頃の話です。やっぱりQ-RAID1で作った外部ドライブは,そのまま内蔵に入れても動かないことがもうはっきりしました。

 なら,前回と同じように,新しい6TBを内蔵し,新規にセットアップしてから,保存してあった設定情報を書き戻して3TBを外部ドライブとして接続,その後Q-RAID1からの書き戻しを行う事にしましょう。

 ・・・と思って,6TBを内蔵し,過去の設定で起動させて3TBを外部ドライブとして認識したところまでややったのですが,いくら探しても前回と同じような,Q-RAID1からの書き戻しを行うという機能が見当たりません。

 Q-RAID1のメニューから外部ドライブをQ-RAID1設定すると,初期化されてしまいますよと警告が出ます。前回もこんなだったような気がするな・・・とボタンを押してしまいそうになりますが,万が一という事もあるので,これは実験をして確かめてみましょう。

 手持ちのフリーの2TBをNASに詰めて初期化。小さいファイルを1つか2つほど書き込んで,新しく買った6TBを外部ドライブに接続します。そしてQ-RAID1を使って6TBでバックアップをとります。

 今度は6TBを内蔵し初期化。設定を書き戻して2TBを外部ドライブとして繋いで,Q-RAID1のボタンを押します。サイズが小さいので,数時間で結果が出ます。

 果たして結果は,2TBが6TBによって上書きされてしまい,これまでの2TBのデータは完全に消えてしまいました。

 いやはや,これをこれまで使っていた3TBでやっていたら,過去数年の膨大なデータを私は一瞬のうちにすべて失っていたことになります。背筋が寒くなりました。

 事ここに至って,もうQ-RAID1からの書き戻しは出来ないと判断し,手動でデータを書き戻すことにします。6TBを再度初期化,設定の書き戻しを行って3TBの以前のドライブを外部ドライブとして接続します。

 しめしめ,FileManagerでちゃんとファイルが見えています。PCを経由してコピーをすると随分と時間がかかるのですが,NASで完結してコピーが出来ると,高速でコピー出来るので,助かります。

 と,その前に完全に設定を復元しないといけません。QNAPのNASはパッケージをインストールすることで機能拡張が出来ます。私の場合,パッケージマネージャであるOptwareIPKGをインストールしてあり,ここからperlとdnsmasqをインストールしてありました。

 まずはOptwareIPKGを入れます。しかし,App Centerで検索をしても見つかりません。これは困った。google先生に聞いてみると,メンテナンスを終了したので,昨年秋頃にApp Centerでの公開も取りやめたという事です。Entwareというのが後継らしいのでこれをインストールしようとするも,App Centerにはないのでどっかのサイトからファイルを落としてきて,手動でインストールします。

 perlはApp Centerにあるのを確認したので,dnsmasqを入れようとしますが,Entwareでは見つけることができず,このパッケージマネージャではインストール出来ないことがわかりました。

 ならばとQNAP用のdnsmasqがあるのでは,と探してみたところ,あるにはありました。しかしうまく動かず。設定も反映されず,起動もしません。そこでこの線はあきらめました。

 どっかにOptwareIPKGがおちてないかと探しましたが,すでにリンクが切れていたりと見つかりません。それならばとWebarchivesで遡ってみたら,なんとまあダウンロード出来ました。ファイルの安全性なんてもう頭にありません。わらをもつかむとはこのことです。

 幸いなことにうまくOptwareIPKGがインストール出来ました。そしてdnsmasqも無事にインストール出来て,設定を変更後に起動し,きちんと動作することも確認出来ました。

 この段階で,土曜日の朝7時。なんと,この歳になって一睡もしない「完徹」をやってしまいましたよ。

 待ち時間で5分ほど寝落ちしたりしてはいましたが,作業のログを見るとちゃんと数分単位でなにをやったかが記録されています。本当に徹夜したんだなあと。

 まあここまで来たら,あとはファイルのコピーです。フォルダを作り直し,コピーをしていきます。この段階で朝8時。こんな時間から寝ると一日無駄にするので,もう起きていることにします。

 全部で12時間ほどでコピーが終わる計算になったのですが,悪いことにもう1時間ほどで終わるというところで,NASのDNSの設定を変えたところ,コピータスクが止まってしまいました。残念ですが,やりなおしです。

 ということで,翌朝にはすべての作業が終わっていました。問題なく動いているし,ファイルもざっと確かめたところ,ちゃんとコピー出来ているようです。4年間つ買ったとは家,まだまだ元気な3TBは万が一の為しばらくそのままにして保存して置きますが,そのうちバックアップ用途に使ってみようかと思っています。

 速度が上がったわけでもなく,ただゆとりが4TB近く出来たと言うだけの話ですから,今回はもう何度もくじけそうになりました。それよりデータを失う方が怖かったので,何度も3TBに戻して6TBは別の用途に使おうと思ったほどです。

 ところで,一連の作業を進めるうちに,Q-RAID1についての結論が出たので,ここに書いておこうと思います。

 Q-RAID1は,シングルベイのNASにのみ搭載される機能で,USBで繋いだ外部ドライブを使って,RAID1(ミラーリング)を実現するものです。

 QNAPの説明では,この外部ドライブを内蔵すれば,内蔵ドライブとして動作させることがそのまま出来るとあり。実際それが出来ているという人もいるようです。

 内蔵無理でも書き戻すことは出来るとか,それもダメだとか,google先生もいろいろな意見を引っ張り出してくるので,どれが本当なのかよくわかりません。

 で,自分の検討結果や,他の人の記事をまとめて,私なりの決着を着けました。

(1)Q-RAID1の外部ドライブを内蔵しても,内蔵ドライブとして動作しない。

(2)Q-RAID1の外部ドライブから内蔵ドライブへの書き戻しは,ファームウェアのバージョンが3.7くらいまでは可能だったが,4.0以降は出来ない。

(3)内蔵ドライブの入れ替えはQ-RAID1を使うと時間がかかって仕方がないので,新しいドライブを内蔵したら古いドライブをUSBで繋いでFileManagerで書き戻した方が早いし安全。Q-RAID1だと3日かかるものも,コピーなら12時間ちょっとで終わる。

 特に(2)については,以前自分が出来ていたので,出来ないよと言う意見を見る度に「ウソだ」と思っていましたが,これはファームのバージョンで来出る出来ないがあるんだとわかり,納得をしました。

 Q-RAID1は,rsyncを使ったミラーリングということがよく知られているのですが,確かに自動的に完全なバックアップが用意出来ていることの安心感は大きくて,そのためだけでも使う価値があるかも知れません。しかし,時間はかかるし,よくよく注意しないとデータを完全に失う可能性もあるので,私は怖いからもう使わないと思います。

 それより,信頼性の高いHDDを使う事と,本当に大事なデータは別にバックアップするという方が間違いないと思います。

 そうそう,今回大金を出して購入したWD REDの6TBですが,やっぱり振動が大きいです。筐体がぶるぶる振動して大変です。ブーンというかなり大きい音がしますが,REDってもともとこういう振動が信頼性を低下させるというので,振動を抑えた(管理した)というのも,売りになってませんでしたっけ?

 4TBで振動が大きいと嘆いた人は,初期不良で交換してもらい,交換品が静かなことに驚いたと言ってましたが,6TBでもそうなんでしょうか・・・面倒くさいのでもうこのままにしておきますが。

 次はまた3年。次の3年では,NASごと交換することになったりするかも知れないですね。

GPS時計の新作

  • 2016/04/20 11:42
  • カテゴリー:make:

20160420114356.JPG
 先日から取り組んでいたGPS時計ですが,ようやく完成しました。写真はブレッドボードで作った状態ですが,近いうちに基板にハンダ付けして,綺麗にまとめようと思います。

 今回はなかなか大変でした。

 まず,aitendoで買ったNEO6M-ANT-4Pというモジュールですが,これはu-bloxのNEO6Mというなかなか性能のいいGPSモジュールを搭載しているので,基本性能は抜群です。

 ただ,NEO6M-ANT-4Pというモジュールになると,バックアップ電池が死んでいて一晩放置するとCold Startになってしまうという問題がありました。

 ですので,GPS側の設定を変更しないといけないようなプログラムを書くことは出来ません。常に初期状態で立ち上がることを前提にしないといけないので,シリアルポートのボーレートは9600bps,センテンスの更新周期は1秒に1度,1PPSパルスは衛星をつかまえないと出てこないという制約で動くようにする必要があります。

 次の問題は,データが正しくデコード出来ないという問題です。1PPSで更新せず,センテンスをデコードしてそのまま表示した時には,発生しない問題でした。

 GPSからのデータは,テキストによるセンテンスで,UARTから流れてきます。メモリの小さいtiny2313ですので,UARTのバッファは64バイト程度と極めて小さいため,バッファがあふれる前にさっさと処理をしないとダメです。

 そこで,流れてくる情報を最小限の物にしたいところですが,これは前述の通りGPSの設定を変えないといけないですから,今回は出来ません。ログを見れば,かなり大量のデータが流れ込んでいますので,処理に手間取っているとリングバッファが1周して大事なデータが上書きされてしまいます。

 ですが,1PPSで更新をしないように作った場合には問題は出ず,1PPSでの更新を行うとデコード出来ない場合が出てくるというのは,ちょっと解せません。

 調べて見ると,実はLCDの表示に使っていた関数で,ウェイトが極端に長い部分がありました。5usでいいのに,1msも安全のためにとってあったんですね。

 で,1PPSで一気に表示を更新する時に,ここで100ms近くも足止めを食らってしまい,その間にデータが流れてくると,未デコードのデータが上書きされて失われてしまうのでした。

 これが,随時更新という形にすると,時刻と日付が別々に更新されるので,付加が平均化し,なんとか上書きされずに処理が間に合うようでした。

 ということで,ウェイトをぐっと減らして,この問題は解決です。

 そして最後は,1PPSとGPGGAやGPRMCというセンテンスが完全に非同期であるという問題です。先日もちょっと書きましたが,1PPSのパルスが出た段階で受け取っている最新の時刻情報が,1PPSの前の情報なのか後ろの情報なのか,不定なのです。

 1PPSは非常に正確であり,すべての衛星で完全に同期しています。ですから,この1PPSで表示を更新すれば非常に正確な時計が作れることは明白ではあるのですが,更新に使う時刻情報が1PPSよりも過去のものなら1秒加算しないといけませんし,1PPSの未来の情報なら,そのまま更新に使わねばなりません。

 私は,未来の情報が出てくるなんてことはないだろうと思っていましたから,更新時には1秒加算した時刻で更新することにしていました。これで問題がないように思ったのですが,電源を入れて衛星をつかまえた最初のうちは,1秒進んでいる事に気付いてしまったから大変です。

 しばらくすると1秒進むのが解消され,正確な時刻になっているのですが,どこで変わってしまったのかわかりません。じーっと見ていても変化せず,気が付いたら変化しているという苦しい状況で,なかなか尻尾をつかめません。

 対策は,1秒加算するかしないかで条件分岐すればいいんですが,問題はその条件がわからないことです。GPGGAなりGPRMCで出てくる時刻の情報は,最初は未来のものなのですが,しばらくすると過去の物になります。すぐに変化することもあれば,長い間変化しない場合もあり,しかも変わったことがセンテンスからはわかりません。

 そもそも,プログラムにとって,時刻の情報はGPSから出てくる物がすべてですし,これしか時刻情報を持たない以上は比較も出来ず,結局のところGPSから出てくる時刻を信用するほかありません。その時刻が,いつの間にか過去になったり未来になったりするんです。

 ははーん,これはGPGGAやGPGMCの時刻情報のうち,1/10秒や1/100秒に違いがあるんじゃないか?

 そう思って見てみたのですが,どちらも小数点以下は00です。数年前に使ったGPSモジュールでは,ここが.99になったり.00になったりしたので,きっと今回のモジュールもそうだと思っていたのに,ダメでした。これは使えません。

 なら,つかまえた衛星の数と相関があるんじゃないか?

 残念ながら,相関はありませんでした。4個でも11個でも,未来から過去に突然切り替わります。

 なら,1PPSの有無に相関はないか?ありませんでした。

 うーん,じゃステータスがVなら未来,Aなら過去なんじゃない?違いました。

 うむむむ,じゃ,情報の信頼性(DOT)の数値に相関は?

 この数字は,Cold Start直後は99.99で,衛星をつかまえて時間が経過するとどんどん小さな値になります。1.00以下になったら過去になるとか,そういう相関があるのではないかと,シリアルポートに繋いでダラダラと記録したログを頑張って見てみましたが,残念ながら相関はなし。

 このままでは,表示されている時刻のうち,1秒があっているのかあっていないのか,わからないままになってしまいます。せっかく衛星をつかまえている限り狂うことがない正確な時計を作ったのに,1秒が信用出来ないなんて,話になりません。

 これだったら,1PPSで更新しないで,センテンスが出てきた瞬間に表示をした方が,まだ正確です。この方法だと未来かも過去かも知れませんが,ずれは1秒以内のはずですから,1PPSで更新する方が状況は悪いです。

 悔しい。やっぱりGPS時計は無理なのか・・・

 とにかく,頑張ってログをとり続けます。そして,変化したことが分かった時点でログを解析します。

 そうすると,1秒に1回送られているセンテンスに書かれている時刻が,2回続けて同じ時刻になっている箇所が見つかりました。1秒に一度なのに,2回同じ時刻が出てくれば,そりゃ1秒遅れてしまいます。

 よく調べてみると,電源を入れて衛星をつかまえた直後は,やっぱり1秒未来の時刻が出てきます。しばらくすると,ほぼ現在の時刻に一致した周期で,時刻が送られてきます。

 変化するタイミングは不定で,いつ切り替わるかわかりません。また,過去の時刻に切り替わったとしても,ほぼ現在時刻に一致していて,これをそのまま表示しても違和感はないんじゃないんじゃないかと思うくらいです。

 でも,とにかく同じ時刻が2度続いてきたことを検知できれば,時刻が未来なのか過去なのかがわかります。

 そこで,1回前の秒のデータを残して起き,今回の秒と比較をして変化していない場合には,以後の時刻データは未来の物から過去の物に切り替わったと判定し,1秒加算することにしました。

 この対策の問題点は,Hot StartやWarm Startの場合には,電源投入時にすでに過去の時刻に切り替わっているかも知れないので,変化を検知できないということです。

 もちろん,同じ時刻が二度続けば1秒加算することになるのですが,1秒加算しないといけない「過去の時刻」が電源投入時から流れてくると,加算する条件がつかまえられずに,ずっと遅れたままになってしまうわけです。

 これを防ぐ為には,なからずCold Startで起動する必要があります。ん?電池が死んでいるのは,かえって好都合なんじゃないのか?

 ただ,どんな場合でも,同じ時刻が2回続いた時には,これはもう確実に過去の時刻であることがはっきりしますから,1秒加算された状態である事が画面に表示されていれば,その時刻は信用出来るということになります。消えていれば,1秒ずれている可能性があるということですね。

 もう1つの問題は,一度過去の時刻に切り替わったあとは,もう二度と未来の時刻を出すことはないという前提になっていることです。当然,未来の時刻を出すように変化することもありえるとおもいますし,その場合には,時刻が1回前のものと比べて,2秒進んだことを検出出来ればよいだけです。

 このコードを組み込んでみたのですが,実際に動作したことがないので,正しいかどうかはわかりません。

 ということで,問題点がなんとか解決しました。

 基本構造は,センテンスのデコードを行い,得られた情報のうち衛星の個数やステータスは随時,時刻と日付については1PPSで更新を行うというものです。

 1PPSはINT0で割り込みをかけます。UARTでも割り込みを使いますが,AVRの場合は割り込みの優先度は固定で,優先度を変えたければ割り込み要因そのものを見直すということになりますが,今回は1PPSの優先度を上げたので,上位のINT0でいきます。

 Cold Startでは,衛星をつかまえないと1PPSが出てきません。1PPSでしか画面を更新しないと,ずっと画面が固まったままになるので,ステータスがV(つまり1PPSが出てこない)時には,随時更新されるようにしておきます。

 また,立ち上がった直後には時刻情報がでたらめですので,時が24以上になったり,月が13以上になっている場合には不正と見なして,時刻や日付を0でリセットします。

 タイムゾーンは悩みました。メモリサイズの関係もあり,日本標準時に固定してあったのですが,頑張ってあいたポートにスイッチを繋いで,変更出来るようにしようと思ったのです。

 ですが,プラス側の補正はこれまで通りとしても,マイナス側の補正にするとまた日時も調整をし直すコードが必要になったり,調べて見ると時差って1時間単位じゃなく,30分単位だったりして,コードがあふれてしまったのでやめました。

 とりあえずタイムゾーンは+9で固定とし,補正値を画面に出しておくことにとどめました。

 で,かなり不細工でお恥ずかしいのですが,以下がソースです。

続きを読む

aitendoのGPSモジュールの不良について

  • 2016/04/19 12:12
  • カテゴリー:make:

 aitendoのLCDに,同時に買ったGPSモジュールを組み合わせて,新しいGPS時計を作るという話を,ちらっと先日書きました。実はこの製作,現在進行中なのですが,なかなか難しい問題に遭遇してしまい,目下解決策を検討中です。

 いくつかのアイデアを試しましたがどうもうまくいかず,これでダメなら「万策尽きた」と白旗を揚げようと思っていた方法で,現在検証中です。

 ちらっと書きますと,1PPSパルスで画面の更新を行うという方法に起因します。HPGGAセンテンスで時刻を得ますが,問題はこの時刻の情報と1PPSがまったく非同期で,1PPSに対して前後してしまうということです。

 GPGGAで時刻を得てから1PPSで更新するという単純な方法だと,1PPSの直前で1秒進んだ時刻を得ていないといけません。そこで1秒進めたんですが,場合によってはすでに1秒進んだ状態でGPGGAに載ってくる場合があることがわかりました。

 これも,正確な別の時計を横に並べて,時刻をこまめに比較したから分かった事で,GPS時計だけを見ていたら気が付きません。

 GPGGAの時刻情報を1秒進めるかそのまま使うか,条件分岐が必要なわけですが,問題はその条件です。なにせプログラムを実行しているマイコンにとって,時計はGPSのみであって,正確な時刻との比較など出来ません。GPSから出てくる時刻がすべて正しいと考えるしかないわけです。

 で,この問題を対策するのに,手間取っています。まずは条件をつかまえる事,そして対策できたかを確認すること,この2つが必要なのですが,なにせ1秒進めるかそのままでいいかは,不定期に発生するものです。数秒で発生するかもしれないし,ずっと発生しないかもしれません。それで時間がかかっています。

 さて,この製作過程でaitendoのGPSモジュールの問題点を見つけてしまいました。

 今回時計に使った「NEO6M-ANT-4P」というモジュールとパッチアンテナのセットは,GPSモジュールにu-bloxのNEO6Mを使っていて,高感度,多機能で,かゆいところに手が届き,しかも安価と,欲しい人には盆と正月がいっぺんに来たくらいうれしいGPモジュールです。

 現在は値上がりして2800円になったとは言え,今でも十分安いと思います。

 さてこのNEO6M-ANT-4Pは,Warm Start用に衛星の情報を残すための充電式バックアップ電池と,設定情報を保存するためのEEPROMが搭載されています。

 ところが,どうも設定を記憶してくれないようなのです。電源を入れている時は設定の変更が反映されているのですが,電源を切って一晩おくと,初期状態に戻ってしまいます。

 初期状態では,1PPSのパルスは衛星をつかまえていない時には出てこないので,1PPSで割り込みをかけて表示の更新を行うというプログラムでは,衛星を掴むまで表示が全く出てこないことになります。

 衛星をつかまえずとも,モジュール内蔵のRTCの情報を表示出来ればうれしいわけで,そのために設定の変更を行ってどんなときも1PPSが出てくるようにしてあったのです。

 しかし翌日には出なくなっています。

 他にも,ボーレートの変更や,余計なメッセージを出さないようにするなどの設定変更を行っていたのですが,翌日にはそれが元にすべて戻っていて,困ってしまいました。

 当初,ツール(u-center)の使い方が悪いのだろうと思っていたのですが,頑張ってあちこちいじってみても状況は変わりません。いよいよ困り果てて調べて見ると,どうも設定が消える人と消えない人がいるようです。

 そしてさらに調べていくと,バックアップ電池が不良の場合にこの症状が出るという情報を手に入れました。いわく,バックアップ電池が不良と判断されるとCold Startになるため,設定が初期化される,ということです。

 ん?ほんとかいな。

 Cold Startって不揮発メモリであるEEPROMに書き込んだ内容さえも初期化してしまうんでしょうか。だとしたら設定の保存はバッテリバックアップで行われているだけということですから,そもそもEEPROMなんて意味がないと言うことになりませんか?

 まあとにかく,このバックアップ電池をわざとショートして電圧を下げてやると簡単に現象の再現ができるので,原因としては間違いないと思います。しかし,そうなるとEEPROMへの設定の保存(あるいはその読み出し)が確実に行えるようになるには,どうしたらいいんでしょうね。

 この問題,小容量の二次電池で設定がバックアップされているという話ですから,現時点できちんと設定が保存されている人でも,電池が切れてしまえば発生するはずです。つまり,設定の保存先をEEPROMだと思っていたら,実はSRAMでしたということですので,後で泣くことになりそうです。

 根本的には,EEPROMへの設定保存が行えるようになることなのですが,海外ではEEPROM未搭載のボードを改造して設定の保存を行うケースを見つけたものの,もともとEEPROMが搭載されていると場合の対処法は結局見つけることが出来ませんでした。

 あーめんどくさい。

 複数買った人でも,電池は全滅していたという話も聞きますので,どうも個体不良と言うよりはロット不良の可能性もあるんじゃないでしょうか。中国製というのは随分良くなってきましたけども,こういう品質の問題をどうも軽く考えているようで,個体不良は仕方がないとしても,この手の傾向不良を減らせないのは問題だなあと思います。

 で,電池を良品に交換するということも考えたのですが,それでも電池が切れればアウトですので,やっぱり根本対策ではありません。ならば,初期化された設定の状態で使うというのが一番確実です。

 幸いなことに,デフォルトの設定のままでも問題なく動くようにAVR側のソフトを書くことが出来ましたので,これで行きます。

 もっとも,衛星をつかまえないと1PPSが出てこないというのは困ったもので,その間表示が全く更新されません。1PPSが来ない間は勝手に更新するというソフトを組んでもいいんですが,もう面倒くさいので、1PPSが出てこないうちは表示が代わらないという仕様にしました。つまり,信用出来る時刻情報が1PPSという形で得られるまでは,表示を行わないという考え方です。

 一応これで,バッテリが死んでいてもCold Startから起動するGPS時計が出来ました。GPSモジュールをいちいちPCのソフトでいじらなくても,買ってきてすぐ使えるメリットはありますが,せっかくつかまえていた衛星の情報がすっかりなくなってしまうため,毎度毎度Cold Startになって,時刻情報が得られるまでに時間がかかってしまうことは,残念な所です。

 まあ,気が向いたらここにCR2032でも付けてみましょう。

 それにしてもAitendo,一筋縄ではいかないお店です。そこがまた面白いんですけどね。

LCD8812K4-01でキャラクタ表示も出来た

  • 2016/04/11 13:54
  • カテゴリー:make:

 LCD8812K4-01という特価LCDですが,やり残していたキャラクタ側のLCDも動かしてみる事にしました。

 これまでにセグメント側のLCDを表示させ,時計を作ってみたわけですが,LCDの下側にあるキャラクタ表示エリアも動かす事が出来れば,もう完璧です。

 aitendoによると,ここはパラレルの「普通」のLCDということです。まあこの世界で「普通」の「パラレル」といえば,HD44780互換のLCDのことで,これに従って動かすということでしょう。

 ということで,さっと試してみました。随分昔にGPSを使った時計を作ったのですが,この時に用意したtiny2313とLCDを動かすプログラムを,そのまま組み立ててみました。

20160411135615.JPG


 写真の通り,ちゃんと表示出来ています。

 LCDは8ビットのバスを持っていますが,ちゃんと4ビットモードでも動きますので,8本全部を繋ぐ必要はありません。

 また,表示エリアについてですが,16文字x1行という構成ではなく,8文字x2行という構成になっています。

 プログラムでは,1行目に大文字でABC...と10文字を,2行目には小文字でabc...と10文字を表示するようにしています。結果として,左側の8文字は1行目の内容が,右側の8文字は2行目の内容が表示されています。

 ドットが丸いので,独特の雰囲気があります。これとセグメントが青バックの白文字で表示されているというのは,なかなか面白いと思います。

 ということで,LCD8812K4-01の解析が終わりました。これでもうこのLCDは自由に使う事が出来ます。時計と温度計でも作るかと思っていましたが,ふとaitendoでGPSモジュールを買ってあり,1つ余っていることを思い出しました。

 これは1PPSも出せるモジュールですので,これでGPS時計を作り直してみるのが,一番手頃で面白そうです。このLCD,もうちょっと買っておこうかなあ。

AVRtiny13Aでつくるシリーズ番外編 LCD8812K4-01を動かしてみる

  • 2016/04/07 13:42
  • カテゴリー:make:

20160407134351.jpg

 ATtiny13Aを使った工作,今回は番外編です。

 先日,aitendoで99円で購入した,I2CのセグメントLCDを使ったTCXO時計が壊れてしまったことを書きました。

 TCXOの時計だけに時刻はほとんど狂うことなく,それだけにLCDの破損は非常に残念でした。原因は未だ不明ですし,完動品のLCDが手元にないため交換して治ることも確認出来ず,本当にLCDが悪いのかどうかも実は断言出来ません。

 しかし,tiny13AからはちゃんとI2Cで信号が出ていますし,Si5351Aの設定も出来ていることから,やはりLCDに問題がある可能性が濃厚でしょう。

 同じLCDが手に入らないものかなあと探してみましたが,既に売り切れており同じ物は手に配送にありません。全く同じ物でなくてもいいと「I2Cでセグメント」という条件で探してみても,なかなか見つかりません。

 そういえば,先日GPSモジュールをaitendoで買った時に,199円の特価LCDを2つ買ってあったことを思い出しました。これに交換しようと考えたのですが,それはそう簡単にできません。

 このLCDは,「LCD8812K4-01」という品名で売られているものですが,少なくとも昨年の12月頃には売られていたようです。値段は199円と安いのですが,実はデータシートがなく,サンプルコードもありません。要するに動かすにはそれなりに努力が必要なものだということです。それでこの値段はちょっと高いかなあ。

 壊してしまったI2CセグメントLCDの場合,ピン配置もサンプルコードも出ていました。発売されてからの時間も経っていたので,いろいろな人が実際に動かしていたので,そこも問題はありませんでした。

 ですが,今回のLCD8812K4-01については情報が不足している上に,動作例がありません。分かっていることは,LCDコントローラが2つ載っていることと,それぞれ独立したインターフェースであること,セグメント側はSPI(でもHT1621の仕様書にはSPIとは一切書かれていないし,実際のところSPIとは違います),キャラクタ側は8ビットパラレルであること,電源は5V単電源であること,そしてピン配置です。

 問題なのは,仮にセグメントだけを使う場合でも,SPIなのでI2CのLCDの代わりにはならないということです。SPIで繋げばいいだけじゃないかというなかれ。I2CのLCDだからこそSi5351Aとバスを共用でき,そのおかげで8ピンしかないtiny13Aでも時計が作れるのです。

 ですがSPIのLCDを使うとなると,バスをSi5351Aと共用できませんから,I2Cとは別にSPIも用意しないといけません。SPIが3本,I2Cが2本,32,768kHz入力に1本,これですでに6本ですから,ボタンが置けません。うーん,2313を使うしかないのか。

 もう一度考えます。

 I2CはLCDを制御する役割がなくなり,Si5351Aの初期設定だけに使う物になったので,設定後は入力に切り替え,ボタンを置いても良さそうです。そうするとどうにかピンは足りますね。

 どっちにしても,LCDを動かしてみないことには先に進めません。そこで,この前人未踏のLCD8812K4-01を,とりあえずセグメント側だけ動かしてみることにしました。


(1)ハードウェア

 このLCDの端子は16個あります。電源とGNDは共通ですが,セグメントとキャラクタで別々の信号が出ています。今回はセグメントだけを使いますが,セグメントはSPIという情報から,前半の5ピンが関係しそうです。

 aitendoのサイトでは,1ピンからCS,WR,A0,VDD,GNDと並んでいるということですが,SPIにA0なんて端子はありませんし,搭載されていると書かれているHT1621というLCDコントローラの仕様書を見ても,そういう端子はありません。

 そこで,A0というのはDATAであると仮定しました。そして本来HT1621に備わっている読み出し用の端子RDは,このLCDでは外には出ていないものとしました。書き込み専用ということですね。

 仕様書をさらに見ていると,読み出しの際にはRDをクロックにしてデータが出てくるようですけども,これは明らかにSPIじゃありません。ですのでこのLCDはSPIではないということになるのですが,書き込み専用とすれば,SPIと見なして動かす事が出来ます。


(2)SPIをソフトで書く

 SPIは単純ですので,HT1621の仕様書に従ってソフトで実装することにします。マイコンはもちろんtiny13Aです。

 仕様書を見ているとリードについても書かれていますが,RD端子が外に出ていないので今回は無視です。書き込みのみを実装します。

 で,ちょこちょこと書いてみると,なにやら動いているようです。結構あっさり動いてしまったので拍子抜けです。

 コマンドとデータの書き込みを行う関数をさっと書いて,一応簡単なライブラリのような物を作っておきます。

 不安があるのは,ウェイトをどこにどれくらい置くべきかがさっぱりわからないことです。インターフェースのタイミングはわかりますが,例えば電源投入後最初のコマンドを投げるまどれくらい待てばいいかとか,内部発振器の発振安定時間はいくつかとか,コマンドを投げてそれが有効になるまでの時間がどれくらいか等,全然かかれていません。

 とりあえず動いた,と言うやり方で進めるしかなさそうです。こういうのはトラブルの原因になるんだけどなあ。まぁしゃあないですね。


(3)初期設定をどうする

 ここまでで一応LCDを叩けるようになったのですが,初期設定の手順やコマンドの役割などが不明なままです。HT1621の仕様書だけでは正確なところはわかりませんし,LCDごとに異なる設定が必要な箇所もあります。

 とりあえず必要っぽいのは,SYS ENというコマンドと,LCD ONというコマンドを発行することのようです。ところが,これだけだとどうも動作が不安定になってしまいます。具体的には,4ビット目のデータが電源投入のタイミングによって,ちゃんと反映されたりしなかったりするのです。ですから,すべてのセグメントを点灯させようとしてすべて1を書き込んでいるのに,時々一部のセグメントが点灯しません。8になったり9になったりするのです。

 きっとタイミングの問題だろう,特に最後に書き込むデータがおかしいのならデータ送信後に送るCSのタイミングじゃないかと,ここのウェイトを調整しましたが,発生頻度に変化こそあれ,完治しません。困った。

 そこでもう少し調べて見ると,RC256kというコマンドを発行すれば安定して動作することがわかりました。


(4)マッピングを調べる

 初期化までは出来ました。この時点でRAMにデータを書き込みさえすれば,何らかの表示が行われるようになりました。

 次は思い通りにセグメントを点灯させるために,RAMとセグメントの対応を調べます。

 HT1621は,32x4bitのRAMを持っており,これが各セグメントに繋がっています。よって全部で128のセグメントを個別に操作できるわけです。しかし,どこにどのセグメントが繋がっているのかが分かりません。これはもう,地道に実際に点灯させて調べていくしかないです。

 私の場合,まず32のすべてのアドレスに対し1を書き込み,点灯したセグメントに「1」とLCDの写真に書き込みました。次にデータを2にして同じ事をやり,次に4,その次は8と繰り返します。

 終わったら,アドレス1つに0x0fを書き込んで,点灯したセグメントに対してアドレスを書き込んでいきます。結局,128の組み合わせを総当たりで試したわけですね。

 そして,分かったマッピングから,フォントを作ります。あまり複雑な関数を作るとメモリが足りないとか言われそうなので,必要最小限の機能に絞った小さな関数で済むようにします。


 ということで,LCD8812K4-01を実際に動かしたソースです。これを実行すると写真のように左から0,1,2,3,4,5・・・と10桁分数字が並びます。

続きを読む

ページ移動

ユーティリティ

2020年05月

- - - - - 1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31 - - - - - -

検索

エントリー検索フォーム
キーワード

ユーザー

新着画像

新着エントリー

過去ログ

Feed