2010年6月14日

【Arduino】 参考書

100614-1.jpg
図書館にリクエストして購入してもらいました。
最近、図書館をよく利用します。ネットで県内のすべての図書館の蔵書が検索できますし、たとえ目的の本が蔵書になくてもリクエストすれば購入してくれます。
Amazonを利用すれば本の購入は簡単ですが、内容は確認できません。専門書は近所の本屋にあるというものではないので、図書館にリクエストします。内容を見て、ずーっと手元に置いておきたいと思えば改めて自分で購入するし、そうでなければ一通り読んだら返却します。またいつでも借りることができますし。
こういう専門書だけではなくて、ライトノベルのような娯楽小説でもリクエストできます。県内の他の図書館の蔵書であれば取り寄せてくれるし、なければ購入してくれます。私は小説は1回しか読まないので、図書館にリクエストして購入してもらうと、とても助かります。唯一の欠点は、リクエストしてから届くまでに1~2週間かかるということですが、常にリクエストを入れて読む本を切らさなければ、特に気になりません。
というわけで、今では毎週、図書館に通っています。

 

100614-2.jpg
本題のこの本についてですが。
「動かして学ぶCAN通信 AVR、PIC、Arduinoを使ったCANコントローラとの接続とプログラミング」ということで、CANによるOBDのデータを読み出すためのコマンドなどが書かれていることを期待しました。しかし、もっと基本的な、CAN通信のプロトコルを学ぶ本でした。CANは、自動車用というわけではなく、機器制御用の汎用的な通信プロトコルなので、それを使って様々な機器を動かしたりセンサの値を読んだり、ということを学ぶための本です。
これはこれで面白が、残念ながらOBDに関する記述はありませんでした。いい機会なので、CAN通信については一通り勉強してみるつもりです。何かに応用できそうですから。

 

2010年6月 8日

【Arduino】モード2と車載バージョンの準備

100608-1.jpg
前回は、4行のLCD画面に7つの警告表示をするために、スクロール表示のソフトを作りましたが、たった4行のスクロールは実際には少し見づらいです。そこで、ハイビームやブレーキなどの状態を示す警告灯のみを表示することとし、それ以外の異常を示す警告灯は"Check Warning Light"として表示することにしました。スクロールしないので、この方が見やすいです。
一番上の行。ここには電圧、温度、方向指示器を常時表示します。不等号記号がありますが、これが方向指示器の矢印の代わりです。そのうち、矢印のキャラクタを作る予定です。2行目と3行目に、状態の警告灯を表示します。写真では"Fogg"と表記していますが、これは"Fog"でもいいですね。

実は、下3行をスクロール表示することとし、上の行は電圧、温度、方向指示器の常時表示というのも考えたのですが、スクロールさせるためにはどうしてもDelayを使う必要があり、方向指示器の検出が遅れてしまいます。そこで、デジタルピンの外部割り込みで方向指示器の検出をしようとしたのですが、attachInterruptを使うと、PWMの出力がなくなったり、割り込み動作をしたりしなかったりと不安定になるので、あきらめました。何か使い方にコツがあるのかもしれません。

アナログの基準電圧が安定しない件ですが、その後の調査で、供給電圧に問題があることがわかりました。12VのNi-Cdバッテリーを電源として、三端子レギュレータで5Vを作り出してArduinoに供給していたのですが、Arduinoの仕様書を見直したら、供給電圧は6~20Vとなっていました。Arduino自身が5Vのレギュレータを持っているので、供給が5Vでは低すぎたのです。
そこでレギュレータを外し、12Vを直接供給すると、安定するようになりました。ついでに、Ni-Cdバッテリーをやめて、12V700mAのスイッチングACアダプタに変更しました。

写真の状態をmode1として通常表示とし、スイッチを切り替えることで前回作ったスクロール表示をする2モードを持つことにしようと思います。Check Warning Lightが表示されたらモードを切り替えて全警告表示を見るという使い方を想定します。

 

100608-2.jpg
モードの切り替えにはロータリースイッチを使います。これで5Vを数段階に分けて、アナログ入力で電圧測定し、モードを検出する方式にします。

 

100608-3.jpg
最近のレーシングカーは、ステアリングホイールの部分にたくさんのスイッチが付いていてカッコいいので、モードスイッチもステアリングホイールに付けようと考えています。スイッチのノブは、そういうレーシングカーをイメージしてこんなのを選んでみました。
これは、エレキギターなどの楽器のパーツを扱う店で見つけました。このノブの形状はチキンヘッドと言って、ビンテージ物のエレキギターやアンプに使われているデザインなのだそうです。

 

100608-4.jpg
車載の表示機の方ですが、これもボチボチと進めています。ケースに加工してLCDを入れてみました。ちょっと下が短かったし、隙間も若干空いてしまいましたが、このくらい、70%の完成度で良しとします。あまり完璧を求めると完成しなくなってしまいますから。

 

100608-5.jpg
実際に車載する場合には、今使っているArduino Duemilanoveではなく、Arduino Pro Mini 328 5V 16MHzを使います。Duemilinoveの約1/4の面積ですが、機能は同じです。一緒に写っている1/4Wの抵抗と比較すると、その小ささが想像できると思います。しかもDuemilinoveの2/3以下の価格です。

今回の進捗はこのくらいです。

2010年5月29日

【Arduino】LCD表示スクロール


LCDは4行しかありませんが、警告灯は全部で7つあります。5つ以上の警告灯が点灯したときにはスクロールしないと、全てを表示しきれません。そんなにたくさんの警告灯が同時点灯する事があるのかというと、あります。エンジン始動時です。また、警告灯のなかには異常時以外にも点灯するものがあります。リアフォグライト、ハイビーム、デフォッガー、パーキングブレーキです。したがってスクロール表示はどうしても必要です。
しかし、キャラクタLCDには、改行やスクロールの機能がありません。そのため、スクロールはArduino側で作ってやる必要があります。

このスクロール表示には苦労しました。結局、スクロールが必要なときと必要でないときで分岐させ、スクロールが必要な場合は1秒ごとに4行すべてを書き換えています。問題はスクロールのスピードで、今は1秒のdelayを入れてます。そのため、スクロール中は警告灯の検出が1秒間に1回しかできません。
実際には、警告灯の検出が1秒遅れたところで実用的な問題はないのですが、あまりスマートな方法とは言えず不満です。そのうちに、もっといい方法がひらめく事に期待しましょう。

 

Phase0は机上で動作ソフトを作ることですが、それが完成したらPhase1に移行します。Phase1は実際にクルマに搭載します。Phase1に関しても、少し手を付け始めました。

車載のときに一番問題になるのは、取り付け方法です。見映えが悪いと満足度が下がります。しかし、全工程のなかでこれが一番難しいとも言えます。本体は見えないところに置かれるので、適当なケースでいいとして、LCDをどのように設置するかは大きな課題です。

100529-1.gif
LCDが入る大きさのタカチのケースを買いました。実際には横幅が1mm程度狭いのですが、それくらいなら基板を削ることができます。縦方向がかなり大きかったので切断して合わせてみました。下側がまるあきになりますが、下から覗き込まない限り見えないので、これで大丈夫だと思います。

 

 

100529-2.gif
ここに取り付けようと思っています。これでLCDが入れば、もっといい感じになると思うのですが。どうでしょう。

2010年5月23日

【Arduino】 Off board テスト環境

100523-1.jpg
(クリックすると大きな画像を表示します)
ソフトウェア作成のために、クルマに取り付けた時と同じ状態を再現しました。
右上のブレッドボードに、8個のスイッチとLEDが並んでいますが、スピダーの警告灯をエミュレーションしています。スピダーの警告灯は12Vの電球が点灯するので、ここには12Vを流して、スイッチONでLEDが点灯するようにしています。LEDが点灯した状態が、すなわちスピダーの警告灯が付いた状態です。
Arduinoは5V系ですから、12Vを直接つなぐことはできません。12VのON/OFFの検出にはフォトカプラを使いました。中央のブレッドボードに乗っている白いIC2個がそれです。これを使って、12VがONになるとArduinoのデジタル入力をGNDに落とします。Arduinoのデジタル入力にはソフトウェアで有効/無効を設定できるプルアップ抵抗が内蔵されているので、それを使います。
同じく中央のブレッドボードには、3端子レギュレータを載せて、ここで12Vから5Vを作り出して、Arduino、LCDとアナログセンサに供給します。
アナログセンサは、とりあえずcdsと温度センサ、それと電源である12V系の電圧を測定しています。クルマの電圧計の役割をさせているわけです。
Arduinoの入出力ポートは、シリアル通信用のRX、TX端子を除いて、これですべて埋まってしまいました。RX、TXは、Phase2でELM327と通信させてOBDデータを取り込むために空けておく必要があります。

とりあえず、スイッチやセンサが読めているかどうか表示するだけのソフトを作って、動作チェックしてみました。
写真のSW1からSW8がスイッチの状態。1はOFFで0がONになります。スイッチをONにするとフォトカプラがArduinoのデジタル入力をGNDに落とすのでこうなります。
VTは12V系の電圧、BLはcdsの読み値、TPは温度です。一応、読めているのですが、アナログ系に問題発生。12V系だけで動かしているときはいいのですが、USBをPCに接続すると基準電圧が下がってしまい、アナログの読み値が変わってしまいます。3端子レギュレータで動かしているときは、基準電圧の値は4.98V。ここでUSBをPCにつなぐと4.08Vになってしまいます。3端子レギュレータの出力は4.98Vのまま変わりませんが、Arduino内部が4.08Vになっています。対策検討中。

 

100523-2.gif
(クリックすると大きな画像を表示します)
これが回路図。電気は素人なので、適当に書いています。正しい回路図の作法には従っていないかもしれませんが、ご勘弁を。

2010年5月20日

【Arduino】 評価ボード

100520-1.jpg
LEDを光らせたり、温度センサの値を読んでみたりなど、Arduino入門の基本的な動作を一通りやってみたので、LCDをつなげてみました。LCDをつなげるに当たって、そのままだとケーブルのテンションで基板がひっくり返ったり、あっこっち向いてしまったりと使い勝手が悪いので、100円ショップで3個100円のトレイを買ってきて、そこにArduinoとLCDをネジどめして、ブレッドボードも貼り付けました。一応、これで評価ボードとします。

LCDは秋月電子で売っている20文字×4行のバックライト付き(SC2004CSWB)を使っています。Arduinoの解説記事では16文字×2行のものを使っていますが、それだと表示できる情報量が少ないので、こちらのタイプを選びました。
lcd.begin(20, 4);
と設定しておけば、問題なく使えるようです。
それから、バックライトはArduinoのアナログ出力(と言ってもPWMですが)を使っています。最終的にはcdsなどで周囲の明るさを検知して、バックライトの輝度を調節する予定です。トランジスタなどを使ってハードで実現してもいいのですが、できるだけソフトウェアで実現するほうが調整が楽なので、あえてアナログ出力を使いました。

2010年5月14日

【Arduino】 まずは購入

100514-1.jpg
Arduinoを買いました。Arduinoとは、フィジカル・コンピューティングに特化したイタリア製のマイコンです。
webを検索すると、これでLEDをチカチカさせたり、温度計を作ったり、いろいろな動かし方が紹介されています。しかし、マイコンとは本来、何かの目的を達成するための道具・手段であるはずのものですが、その手段が目的になっているサイトがほとんどです。まぁ、趣味とはある意味でそういうものですから、それはそれで全然構わないと思うし、そういう記事は役に立つので助かります。

私はArduinoを使うことが目的ではありません。最終的にやりたいことがあるのです。その手段として、Arduinoを使ってみようと思います。このBlogに書いているくらいですから、それはもちろんクルマに関係しています。

一番最初のきっかけは、これ。
100514-2.jpg
アメリカのTESLA Electronics社が販売しているG-TECH Pro EGSという多機能タコメータです。このタコメータには、小さな液晶モニタが付いていて、ここに様々な情報を選択表示できるようになっています。写真ではデジタルで回転数を表示していますが、8チャンネルのアナログおよびパルス入力を持っているので、ほぼ何でも表示できると言えるでしょう。さらに、OBD2プロトコルでECUと通信もできるので、ECUが持っている情報も表示できます。メモリモジュールによって、それらのデータのロギングもできます。

そして、先日、スピダーにOBD2のDLCが装備されていることを発見しました。ということは、このG-TECH Pro EGSをスピダーに付けることもできそうです。デザインもカッコいいし、欲しいなぁと思っていました。
しかし、そういったことができるオプションを揃えると$700くらいになります。この種の製品の価格としては格安だと思いますが、必要というものでもありません。ただの自己満足です。それに$700は、ちょっと出せません。
それなら、自分で作ってみようかな、と思いました。こんなカッコいいデザインのタコメータは作れませんが、液晶のキャラクタ・ディスプレイを使って、そこに各種車両情報を表示するのはカッコ良さそうだし、自分でも作れそうな気がします。

最初は、昔少し使った事があるPICを使おうと思ってました。webサイトでPIC関係の情報収集をしているうちに、Arduinoの存在を知りました。
私の専門は、機械工学です。機械工学と言っても今時のエンジニアですから、運動方程式を立ててPIDで制御する程度のソフトウェアを書いたりすることは出来ますが、それを動かす電気ハードになると、ちょっと難しい。PICを使った場合は、PICの入出力の前後の電気ハードは、設計と製作が必要ですが、その部分に苦手意識がありました。
しかし、Arduinoはそれ単体でADコンバータやPWM出力などを持っていて、そこまで入出力の面倒を見てくれれば私にもなんとかなりそうです。これなら、だいぶ敷居が低くなりそうに思います。

さて、Arduinoで何をしようかと言うと。いきなり最終目標のものを作るのは難しいので、次の3つのフェーズに分けてみます。

Phase0:off bord study
Arduinoを使うのは初めてなので、まずはArduinoの使い方の勉強を机上でやります。これは、LEDをチカチカさせみたり、アナログやデジタル信号を入力して、それを元に何かに出力してみたり、液晶キャラクタディスプレイの使い方を憶えます。そして、次に述べるPhase1の動作を机上で擬似的に動かしてみます。

Phase1:warning display
スピダーの警告灯表示は、シフトレバーの前に集中して配置されていますが、運転中は右腕に隠れてしまい、まったく見えません。そこで、警告灯の信号をもらって、運転中に見えるところに設置したLCDに、その内容を表示します。
この段階で、スピダーにArduinoやLCDを搭載することになるので、ケースや設置のための加工が伴います。私の予想では、ソフトを書いたり電気配線をすることよりも、この加工が一番難しいと思っています。

Phase2:ECU data display
OBD2から情報を得て、LCDに表示します。エンジン負荷、吸気量、吸気温度、ラムダフィードバックなど、ECUが持っているデータを選択的に表示できるようにします。ELM Electronics社が販売しているELM327というICがOBD2とRS232Cのインタープリターをしてくれるみたいなので、これを使うつもりです。

Phase3:Logging
最終目標はこれ。warningやECUデータに加えて、例えば加速度センサなども追加して、走行中のそれらのデータをSDメモリカードに記録できるようにします。

こんな計画を立ててみました。
Phase3の完成まで5年くらいかかるかもしれないし、途中で飽きたり投げ出したりする可能性もあります。Phase1あたりで満足してしまうかもしれません。レースに使うわけでもないし、高度なエンジンチューニングをしているわけでもないので、Phase2以降の機能がスピダーに必要なわけではありせん。付いていたらカッコいいかな、という結局は自己満足のためなのです。

というわけで、これからArduinoを使った車載電子機器の製作にチャレンジしてみます。覚悟を決めるために、このBlogに"A. Arduino"というカテゴリーを追加しました。頭が"A."なのはBMW Z4で"9."まで使ってしまったのでその次として"A."にしました。"10."にすると、ソートで"1."の前か後に並んでしまうかもしれないので。まあ、16進数だと思ってください。

まず最初の段階として、Arduinoと液晶キャラクタディスプレイ、それに入力の勉強用にcdsや温度センサなどを購入してみました。
これから、お約束のLEDチカチカとか、LCDに"Hello world!"を表示してみるとかやってみます。

Search


Recent Entries

  1. 【Arduino】 参考書
  2. 【Arduino】モード2と車載バージョンの準備
  3. 【Arduino】LCD表示スクロール
  4. 【Arduino】 Off board テスト環境
  5. 【Arduino】 評価ボード
  6. 【Arduino】 まずは購入