スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

ArduinoでCAN通信(その7:CCP通信準備・続き)

いつものArduinoのサンプル・ソフト(この書籍で紹介されている)でCCP通信の準備を開始して気が付いたことがある。

Arduino_CAN_6.jpg

それはこの本に記載されてはいるが、Arduinoのサンプル・ソフトではサポートされていない、「CAN送信のエラー処理」ルーチンである。
送信エラーには2つのパターンがあるそうです・

「自分が出したメッセージが(自機?)内で喪失する場合(送信していない)」
「送信はしたが、CANバスエラーが発生した」

ECUにデータを送ってもらう要求送信時にこんなエラーが出た場合は、確実にエラー処理する必要があります。
本にはエラー処理部分の一部コードが載っているだけで、なかなか理解が進みません。

ここの記載では「Txpend0」というフラグをチェックした後、送信バッファのTxBnCTL.TXREQが1(未送信)、0(送信済み)であるかを判定するようになっていますが、Txpend0 が皆目謎です。
この本、元々はPICマイコン用に作った機器をベースに記載しているので、本家サポートを尋ねましたが長期メンテナンスで閉鎖されています。

推測するに Txpend0 はこの本独自ソフトで用意した送信終了チェック・ルーチンで、それがNGの場合にTxBnCTL.TXREQビットを調べるということのようですが、ここらへんを自分で実装すべきか悩みます。全くゼロから始めて、CAN通信の細かな手順をプログラミングするという目的ならば、自分でソフトを構築すべきなのですが、 【ArduinoでCCP通信する機器を作る】 目的には、かなり回り道になりそうです。

・・・悩んだ結果、ベースとするArduinoソースを切り替えることにしました。
これまでに何度もお世話になっている、

/CAN_BUS_Shield

です。URLは、こちらです。

以前も書きましたが、基幹となっているファイルが、*.cppという拡張子ですので、c++で記載されているようです。
私には更に敷居が高くなってくる思いがしますが、仕方ありません(笑)

【Seeed-Studio のExsample を使うための変更】
先の本ではSPIを若いデジタルピンに割り付け、自前のSPI送受信をやってましたが、SeeedではArduinoオリジナルのSPIポートを使います。SDカードSPIと重なりますが、同時に動作させる機能上の必要が無いので、CSピンで切り分けて使用できます。

Arduino_CANBUS2_2_sch.jpg  

ピンアサインを変更した回路です。MCP2515のSPIはSDカードと共有のArduino標準SPIポートに接続されてます。
デジタルピン9に CAN_CS を割り付け、デジタルピン 10 にはSD_CSを配置してます。

【テスト環境】
上図はシステム構築した後の実用回路(予定)なので、テスト環境が必要です。
とりあえずSDは無しでもCCP通信テストはできるので今使っている送信側のSPI接続を変えます。

Arduino_CAN_31.jpg

なんやらどちゃごちゃの↑部分がArduino純正SPI位置に変更した配線です。
回路図で示すとこんなです。

Arduino_CANBUS2_2_sch.jpg  

SD_***となっている端子がArduino純正SPI端子で、CANトランシーバとSDが共用します。CAN用CS端子をデジタルピン9に割り付けますが、今はまだピン10を使ってます。
また、本番品も同じですが、Seeed の CAN_BUS_Sheild と同様に、MCP2515 コントローラの受信割り込み INT ピンが Arduino のデジタルピン 2 に接続されているので、ハードウエア受信割り込みが使用できます。

seeed の CAN_BUS_Sheild の Exsample に send.ino という簡単なArduino ソースが載っています。
このフォルダ内ファイル構成を少々替え、send.ino と同じ場所に他のファイルも置きます。

Arduino_CAN_32.jpg

このようにしておけば、Arduino IDE で send.ino を開いた時に他のファイルも参照したり編集したりするのが容易になります。

Arduino_CAN_34.jpg
(seeedのExsample、send.inoをロードした画面、一部送信データ部分をマスクしてあります。ご容赦)

以下の部分が少しいじった個所です
    // send data:  id = 0x00,       standrad frame=0, data len = 8, stmp: data buf
    // send data:  id = 0x18F00400, Extend   frame=1, data len = 8, stmp: data buf
    CAN.sendMsgBuf(0x18F00400, 1, 8, stmp);

CAN.sendMsgBuf() 関数で簡単に CAN 送信ができます。スタンダードフレームか、拡張フレームかもここで指定できます。

sendMsgBuf() の実体は mcp_can.cpp に記載されています。これを辿って処理内容を見てみると、CAN送信に必要不可欠な処理がしっかりとフォローされています(例:先に苦労して作った 送信バッファ ID レジスタ処理、送信バッファコントロールレジスタ処理、3個ある送信バッファ選択処理、送信処理状態チェック 等です)

これは何としっかりとしたサンプルでしょうか。CAN_BUS_Sheild を売っていた(いる?)ので、実用ベースになるソフトを作っているのだと推測します。私には大変ありがたいことです。seeed さま、ありがとうございます。

先のテスト環境で送信させ、受信器のシリアル・モニタで得た結果です。

・・・・途中から

RPM:1999(r/min)-00m10.39s
RPM:1999(r/min)-00m10.49s
RPM:1999(r/min)-00m10.59s
RPM:1999(r/min)-00m10.69s
RPM:1999(r/min)-00m10.79s
RPM:1999(r/min)-00m10.89s
RPM:1999(r/min)-00m10.99s
RPM:1999(r/min)-00m11. 9s
RPM:1999(r/min)-00m11.19s
RPM:1999(r/min)-00m11.29s

・・・・途中まで

100mSec毎に送信した拡張IDによる送信結果が受信されています。(回転数1999というデータです)

以上でやっとCCP通信ソフトを作る準備ができました。





コメントの投稿

非公開コメント

プロフィール

haiga

Author:haiga
私のブログへようこそ!
電気オンチが始めた自作オーディオです
2010/3/17 電子工作をプラスしました。

自作オーディオの楽しみ共有のため、私が作ったパーツ提供をしてます。質問や要望を遠慮なくコメント欄に書き込んでください。

FC2カウンター
その日1回目にアクセスいただいた方の総カウントです
最新記事
最新コメント
最新トラックバック
カテゴリ
月別アーカイブ
検索フォーム
RSSリンクの表示
リンク
ブロとも申請フォーム

この人とブロともになる

QRコード
QRコード
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。