「SH-2A モーター・サイクル・コンピューター」カテゴリーアーカイブ

CQ 出版 SH-2A 基板を利用した、モーターサイクル用コンピューターのプロトタイプの製作記、ハードとソフトについての記事や関連情報など

データロガーのケース

ATMEGA版データロガーだが、KiCADの評価はひとまず終えて(現在のバージョンで何とかなりそうだ)、ケースを完成させた、それに伴い回路も少し改造した。

いつも一品物を作る際に苦労するのがケース、市販されている大き目のケースに入れれば良いのだが、実際に使う事を考えると、それも少し痛い、今回のように基板を作る事を考えると、どんなふうにまとまるのか考えておかないと、基板のレイアウトや構成も定まらない。

最近、「低発砲塩ビ板」が結構使える事が判った、これは、アクリルサンデー株式会社が販売しているフォーレックス@と言う材料で、軽く、加工が簡単(カッターで切れる)なのが主な特徴、ただ、それなりに柔らかい(爪で強く押せば傷がつく)ので傷が付きやすく、剛性が求められるようなところには使えない。
それでも、構造を工夫すれば、ある程度は頑丈に作れるし、気軽に作れる点で、試作とかには非常に優れた材料だと思う。

今思えば、建築関係の人が、モデルを作る時とかに良く使っているのではと思う。

今回は3mm厚の板を、基板に合わせて、カットして専用接着剤で張り付け、ヤスリで加工した。

生板のサイズから効率良く切り出したのだが、横の長さが不足して、電池を入れるスペースが少なくなってしまい、単三電池は入らない事が判明し、急きょ、単四電池を入れる事にしたのだった・・・・・

※ボスに2.6mmのナットを埋め込んでいる。
※ボスが4か所だと、少し弱いので、急きょ横にネジを二か所追加してみた。
※角をヤスリで丸く仕上げた。
※液晶の穴は、同じ厚み(3mm)のアクリル板を加工、淵にフライスで「ツバ」を着け、段差をなくした。

かなりいきあたりばったりで、原寸合わせで図面も作っていないが、それなりな物が出来た感じ。

データロガー(ATMEGA1284P版)

先日、「秋月」でAVRの新製品がラインナップに追加された。(AVRの中では600円と高い部類だけど安い)
ATMEGA1284P がそれなのだが、一番のトピックは内蔵RAMが16KBもある点で、AVRで少し痛いとこが大分改善される。

以前にATMEGA64で作っていたデータロガーだけど、メモリーが少なすぎるのと(外部バスにメモリーを増設できるけど)、クロックが最大16MHzなので、途中でペンディングとなっていた、今回その時に作ったソースコードを生かして、作りなおして実験してみた。
クロックもこのデバイスは20MHzまでいけるので、19.6MHzを採用し、GPSデータの取得と100Hzでアナログ8チャンネルのデータ収集など基本的な部分の動作確認も出来た。


↑これも秋月で売っている液晶を使って、基板サイズをそれに合わせてあるのでそこそこコンパクトに仕上がった。

SH2 で作っているデータロガー、高機能なのだが、部品の入手性、コストなど考えると、今回の仕様でもまぁ十分ではある。
もうすぐモータースポーツのシーズンも始まるしで、とりあえず廉価版を早急に仕上げる事とした、安く作れるので、他にも利用用途が沢山ある。

GPSはSUP500Fを別途モジュールとしている、本来は、本体に取り付けても良いのだが、本体の取り付け位置によっては、良好な衛星の受信状態を維持出来ない可能性もある為、あえて外部モジュールとした。

※CR2032をバックアップ用電池として使っているが、実験してみると、もの凄く急速に電池が減るので実用性は無い・・
※SUP500Fはバックアップ電圧を加えないと動作しないようだ・・
※SUP500Fには1PPS出力があるのでLEDを付けたが、ほとんど電流を取れないのでバッファを付ける必要があるようだ、トランジスタも駆動出来なかった。

ATMEGA1284Pはメモリーもそれなりにあり、高速で良いのだが、ポートが少ないのが痛い、デコーダーを追加したり、色々工夫が必要。

後、やっぱり、メモリー空間が、RAM領域とROM領域が別になっていて、アクセスに気を使わないとならないのは多少痛い。
最近のフレームワークではChaN氏のFatFSを利用させてもらっている、毎度の事だが、このパッケージは凄く完成度が高く、高性能で移植性に富んでいる、この場を借りてお礼を言いたい、「ありがとう御座います~」便利に使わせてもらっています。

SUP500F GPS

アルファチャネル付きフォントの描画など、小物ソフトを色々作っていたが、GPS を接続してテストしてみる事にした。
以前にストロベリーリナックスで購入した物だけど、SUP500Fです。
この GPS は65チャンネルで更新レートが最大 10Hz とゆーのが特徴です、最近サーキットでは GPS のロガーが大流行りで、8000円で小型のやつを多くの人が付けてます。

「PhotoMete887」
GPS の測位データ解析では、フリーの LAP+ をみなさん使っているようですね・・

自分のシステムでは、専用の GPS を接続する為、測位データのロギングと合わせて、エンジン回転や、タイヤの速度、ストロークセンサー、重力など、複数のデータを統合してロギング出来るところがメリットです。
GPS モジュールは色々調べた感じでは、この「SUP500F」が性能と価格(6300円)で良さそうです。

GPS をロガーユニットと別の位置へ取りつけ出来るようにモジュール化して、必要部品を小さなケースに押し込んでいます。

SUP500F GPS とリチウム電池ホルダー

GPS 裏面とRS232バッファ

GPS モジュール(プラケースに入れた様子)

解析ソフトは、新規に作成しようと思いますが、それなりの規模になると思うので、時間はかかりそうです・・

A/D コンバーター

とりあえず、AVR に A/D コンバーター、MCP3208 を繋いでみた。
AVR で A/D との通信ソフトを書き、簡単なプロトコルで、SH 側にデータを転送。
一応、1秒辺り、100回分の変換データを SH 側に転送している。
秋月で売られているMCP3208はタイプCのグレードなので、積分非直線性が 2LSB の物だけど、それでも12ビットの分解能があるのはありがたい、それと、この A/D には、サンプルホールドも内臓されているのも良い。(400円)

基準電圧は、4.096V としたいとこだが、電源電圧が 3.3V では、駄目なようで(当然か)、3.2768V とした。
LM385-2.5 を使い、OP アンプで増幅している。(トリマ抵抗で調整)

MCP3208 マイクロチップ 12ビットA/D

SH 側、プロトコルの解析ルーチンにバグがあり、多少時間がかかったが、何とか正常に動作するようになった感じ。
こんな簡単なソフトもさっくり書けなくなったなんて・・・、結構ブルーである・・・

それと、シリアルコミュニケーションで、オーバーランやフレーミングエラーなどがあった場合に、正しい動作をしていないようなので、改修の必要がある・・・

後は、GPS モジュールを繋いで、その通信関係を作れば、ハード的には大体完了な感じか・・

あっ、ちなみに、laptime 計測のクラスも作ってみた、これは 1/100 単位まで計測可能なもので、RTC とはあんまし関係は無いけども・・

あ、そうそう、SH-2A のシステムクロック用水晶を追加して、18MHz 駆動で、周辺デバイスを現在の 24MHz から 36MHz にする必要がある、そして、LCD のクロックを 9MHz にしないと、フレームのインターバールが 60Hz にならない。
※フレーム数は、ゲーム製作などで慣れている 60Hz にしないと、何となく気持ち悪い。
先日秋葉原に行った折、18MHzの水晶を探したが何処にも売っていなかった、昔の背が高いやつはあって、一応買ったが、背が高いので、イマイチ取りつけたくない感じだ・・
それで、いつものチップワンストップで調べたら、50個くらい買わないと、イマイチ高い、でも50個も買ってどうすんだよってゆーのもある、うーーん・・・

RTC 問題

SH-2A 内臓の RTC は、バックアップが出来ない為、事実上使えません、そこから始まったのですがー、外部に AVR を置き、RTC の代わりをさせてみました。
データのやり取りは、シリアルコミュニケーションで行う為、オーバーヘッドも少なく、そこそこ良いシステムだったのですが、問題は消費電力です。
AVR を 32.768KHz とかで駆動すれば、かなり消費電力削減に効果を上げるのですが、それはそれで、マイナス面もあります。
他の問題として、SH 側の電源が落ちた場合に AVR の出力ポートから、SH 側に電気が逃げます、これを避ける為にダイオード入れるとか多少回路を工夫しないと駄目とゆー面もあります、なかなか一筋縄ではいきません。

そんなこんなで、結局 RTC 専用デバイスを付けました。
秋月で、「RTC-4543SA」とゆー 250円のデバイスが売りだされていたのがトリガーなんですけどね(笑)
これは、インターフェースもシリアルタイプで、以前に500円で売られていたやつ(I2C)とは違い、インターフェースも簡単です。(自分的には)
※それと、RTC に500円は払えないけど、250円なら許容範囲かもです(笑)
※もちろん、I2C の専用ハードがあれば、関係無いのですが、以前に、I2C 専用ポートが使えないので汎用ポートを使って、ソフト的に I2C のプロトコルを処理するコードを書いたところ、結構苦労しました・・

それで今回、AVR はそのまま残して、3.3Vで動作できる最大速度10MHzで動かすようにし、AVR に RTC を接続して、以前とおなじようにAVR で、RTC とのやりとりをさせています。
AVR は I/O プロセッサーとして動作します、SH とのシリアル速度も 96000 ボーに上げました~

また、12ビットのA/Dコンバーターも AVR に接続して、変換データを受け取るようにする予定もあります~

RTC4543SA

SH-2A にも A/D がありますが、10ビットなので、今回は、入力ポートとして使います。
※操作ボタンを付けました~

タクトSW

※現在のソースコード一式を、いつものアーカイブ場所に上げておきます。
AVR と RTC の接続などは、AVR のソースコードに書いてあるので、特に回路はいらないでしょう~、暇が出来たら、回路図を引きます。

png jpeg 読み込み

STL 問題で、vector が使えない為、保留となっていたが、結局、C 言語インターフェースで読み込みを書いた。
pngin.h、pngin.c、jpegin.h、jpegin.cがそれだ。
※非常に簡単なややつで、エラーが発生した場合などはあまり考慮されていない・・

STL vector の件:
KPIT から一応回答が来たー、「問題無く動作する!」そちらの環境を送って欲しいとゆーものだった。

あれから、自分も色々調べた、それで判った事だが、KPIT では当然、HEW からgccを使う事を前提にしている、自分はcygwinでMakefileなのだが、それでも、オプションなど調べてKIPT+HEWの環境と同じになるよう配慮したつもりでいるが、まだ何か足りない部分があるのだろう。
HEWでは、プロジェクト毎に独自のライブラリーを作成している、これに何かマジックがあるのかもしれないが、調べた限りでは、それも無い感じだし。

グローバルコンストラクターも初期化で呼んでいるし、他に何があるのだろうか??

まぁ、今回は、メモリーも少ないし、(1MB)CとC++のクラス程度で、自分フレームワークを使う事も限られると思うので、何とかなるだろうけども(何とかする!?)・・

-----
インターフェース6月号

CQ SH-2A 基板

現在、開発用に使っている基板は、車体に積んでテストするようには考えられていないので、ケースに入れられるベース基板も作る予定、そんで、インターフェース6月号をもう一冊買った。
最初アマゾンで見たら、中古でプレミア価格だったが、某HPで、CQから直接買える事が判り、自分も買ったが、送料もかからず良かった~

PSP3000 用液晶モジュール

それと、PSPの液晶も買った、今度のはPSP-3000用なので(一番安い)コネクターの形状が違う為、今までのブレッドボードは使えないけど・・
このコネクター探すのが大変そうではある・・・

組み込み機器で、C++

KPIT のC++で、STL vector が使えない問題で、多少の進展があったが、まだ解決していない。

まず、基本として、C++ の場合、グローバルコンストラクターを起動時に実行しておく必要があって、その実行アドレスのリストを、section .ctors に並べてあり、また、デストラクターは、.dtros に並べてある。
※.dtors のデストラクターリストは、exitで呼ばれるのだが、組み込みでは、終了する事が無いので、これは無視しても良いのかな!?

通常これは、crt0.o のスタートアップオブジェクトから、__main関数が呼ばれて、その中で実行するのが通例のようだが、組み込みプログラムなので、crt0.oは使っていない。
※「__main」は C++ の初期化関数で、「_main」とは区別される。
※良く考えたら、必要なのだが、C のプログラムが綺麗に走るようになってから、すっかり忘れていた。

で、そのリストをメモリー上に置いて、実行したけど、それでもvectorはうんともすんとも動かない(泣)
まだ何かあるようだ・・・

それと、もう一つ・・
g++ の libstdc++.a ライブラリーだが、これをリンクするだけで、非常に巨大となり、今回のようなシステムでは、ちょっと使えない感じ、vectorやstringを使うだけで、100キロバイト程大きくなる。
※iostream を使うと、300キロとか大きくなる。
他にmapやlistなど色々使うとさらに巨大となるので、今回は標準のこのクラスを使うのは難しいかもしれない・・

自分用の小規模で機能を絞ったSTLに相当する物を用意すれば良い気もするが、これは相当大変そうである。
※template プログラムは、先人が創ったように完成度が高く、絶妙で巧妙な仕組みを用意するのは、自分のスキルを越えていると思う。

-----
KPIT はあきらめて、gcc をソースコードからビルドする試みも試しているが、cygwinでちゃんとコンパイル出来ないでいる。
コンパイルは通っても、make check ではねられる。

STL vector の事、BMP PNG JPEG

色々動くようになって、では、そろそろ自分フレームワークをコンパイルしようかと思い、進めてみたものの、基本的部分が動かない・・

調べると、STL vector が死ぬ!

こんな簡単なプログラムを作ると、死んでしまう・・・

std::vector pad;

pad.push_back(1); // ---> 死ぬ!

又、

pad.resize(10); // ---> 死ぬ!

一方、

std::vector pad(10);

とかで、初期化段階でサイズを指定すると、使える。

基本的に、KPIT v10.02 の C++ ライブラリーにバグがあるとしか思えないが、こんな基本的なとこで死ぬのはおかしい??
多分、vector のアロケーターに SH2 で不味いコードが含まれているのだと思われるが、KPITのソースコードをダウンロードして不具合を見つけるのは、ちょっと骨が折れるので、とりあえず放置状態であるが、一応、KPIT にバグレポートを送った。

gcc のツールチェインを自分で構築してみようか・・
※時間と手間がかかるので余りやりたくない。

-----
そんで、vector が動かないと自分のフレームワークも全滅と思うが、画像操作系など、コンパイルだけはしてみた。

それに先だって、基本のライブラリー、Z、PNG、JPEG ライブラリーをソースコードからコンパイルして、ライブラリーを作ってみた。
この手の汎用ライブラリーは、configure によって開発環境の状態を取りこむのだが、クロス環境で自動で行うには、configureを改造する必要がある為、手作業で作ってみた。

それで、jpeg ライブラリーを使って純粋に C のコードで簡単な読み込みを書いて、テストしてみた。
SH-2AにはFPUが入っているハズだが、思った程高速では無い・・・
FPUを使う為におまじないが必要なのかもしれない・・

見た目では分からないけどJPEG画像を表示させてみたー

アーカイブにライブラリーなどをアップしておく。
PNG はテストしていないが、動くと思う。
※BMP のデコードは C++ のコードなので、vector 待ちです。

しかし、vector が使えないのは痛すぎる!

ソフトウェアー・アップデートなど

syscalls API の実装も進み、何とか普通に使えるようになってきた。

シリアルコミュニケーションインターフェースの API は、雑誌の記事にあったソースコードをコピーしたものだったので、全面書き換え、元々ポーリングだった動作を、送信、受信割り込みに変更した。
これで、パフォーマンスはある程度期待できると思われる。

SH72620 では、シリアルインターフェースは16バイトの FIFO 付きなのだが、16バイトでは少なすぎるので、ソフト処理で FIFO を実現している為、バッファサイズはいくらでも大きくできる、パフォーマンスはハードで処理するFIFOよりは悪いと思うが、まぁそれでもポーリングよりはずっと良いと思っている。

暇になったら、DMAC を使ってみたい~

-----
AVR の RTC だが、低消費な V タイプでは無いが、結構電気食う。
やっぱ 4MHz で動作させてるのが悪いと思うが、クロックを落とすと、通信の速度が出ないと思うので、4MHzとしたのだが・・
※4時間くらいのバックアップで 0.1V も落ちてるし・・・(涙)
この感じでは、実用性に問題あるかも・・
少なくとも、6ヵ月くらいはバックアップ出来ないと・・
※まぁ色々試せるのが試作ならではだしね・・
※I/Oプロセッサーの考えは悪く無いしね・・
雰囲気としては、AVR にさらに RTC を接続するとゆー本末転倒な事になりそう(笑)まぁ でもI/O プロセッサなんでー

-----
インクルードガードの話:
インターフェース誌のサンプルプログラムとか、色々観たけど、サンプルとは言え、品質が良くないなぁと感じる。
※いいかげんな書き方や、厳密では無い書き方が、あちこちに観られる。
※FatFsは「ELM」さんの実装だが、これはプロダクトとしては非常に考えられていて良く出来てる~
http://elm-chan.org/fsw/ff/00index_j.html
素晴らしい~(ありがとう~)

さて、本題!、良くヘッダーを多重にインクルードしないように、インクルードガードを書くけど。

#ifndef XXX
#define XXX

・・・

#endif

この「XXX」で、みんな、こんな書き方をしてる、ファイル名が、「init.h」なら、「__INIT_H__」とか・・
このアンダースコアーをダブルで加える書き方は、システムライブラリーなどで予約された書式なので、アプリケーションレベルのソースコードには書いてはいけない。
この事実を知らない人が多いようだ・・・

あと、プロトタイプの宣言でも、C++ から呼べるように、数行加えておいて欲しいものだ・・

加えて、API の説明や引数、戻り値の説明も書いておいて欲しい。
※自分のソースコードでは、Doxygen で展開すると幸せになれるようになるべく記述してる。

基本の「const」も必要なら、ちゃんと書こう!
※それだけで、バグを減らせるのだから。

困った時の AVR

コンパクトなシステムを作るには AVR は最適です。

C 言語(gcc)でプログラム出来、高速で安くて、使いやすい。

たとえば、LED の点滅を考えても、タイマーIC 555でやるより、ATTINY2313 とかの方が安くてプログラマブルです(笑)

今回、SH-2Aで、バックアップ可能な RTC をどうするか色々考えました、秋月とかで入手できる、RTC でも良いのですが、どうせなら、変わった事がしたいので、あえて、AVR を RTC として使う事にしました。

SH-2Aとのインターフェースは、シリアル TXD、RXD を使い、インテリジェントな I/O プロセッサとして機能するようにします。

RTC の他、AVR 内臓の EEPROM を利用する事で、オドメーターの保持などにも使い、12ビットの A/D も欲しいので、その変換なども受け持たせる予定でいます。
今回、仮に ATMEGA88 でやってますが、もっと PIN 数が多くて高機能なデバイスでも良いかもしれません・・
※ATMEGA88 は秋月で230円です。

AVR-RTC モジュール

AVR-ISP 接続した様子

AVR-ISP は以前に作ったものですが、まだまだ使えます~