- CANの紹介
- SPIおよびI2Cに対するCANの比較
- CANプロトコルアプリケーション
- ArduinoでCANプロトコルを使用する方法
- 必要なコンポーネント
- 回路図
- 2つのMCP2515CANモジュール間の接続
- CAN通信用のArduinoのプログラミング
- CAN送信機サイドコードの説明(Arduino Nano)
- CANレシーバー側コードの説明(Arduino UNO)
- ArduinoでのCAN通信の動作
今日、平均的な自動車は、情報を感知して交換するための約60〜100個のセンサーユニットで構成されています。自動運転、エアバッグシステム、タイヤ空気圧監視、クルーズコントロールシステムなどの機能により、自動車メーカーは常に自動車をよりスマートにしています。この数は今後も増えると予想されます。他のセンサーとは異なり、これらのセンサーは重要な情報を処理するため、これらのセンサーからのデータは、標準の自動車通信プロトコルを使用して通信する必要があります。たとえば、速度、スロットル位置などのクルーズコントロールシステムデータは、電子制御ユニット(ECU)に送信される重要な値です。車の加速レベルを決定するために、ここでの誤解やデータの損失は重大な障害につながる可能性があります。したがって、UART、SPI、I2Cなどの標準的な通信プロトコルとは異なり、設計者はLIN、CAN、FlexRayなどの信頼性の高い自動車通信プロトコルを使用します。
利用可能なすべてのプロトコルの中で、CANがより主に使用され、人気があります。CANとは何か、CANがどのように機能するかについてはすでに説明しました。したがって、この記事では、もう一度基本を調べ、最後に、CAN通信を使用して2つのArduino間でデータを交換します。面白そうですね!それでは、始めましょう。
CANの紹介
CAN別名コントローラーエリアネットワークは、産業用および自動車用に設計されたシリアル通信バスです。これは、複数のデバイス間の通信に使用されるメッセージベースのプロトコルです。以下に示すように複数のCANデバイスが相互に接続されている場合、接続は中枢神経系のように機能するネットワークを形成し、任意のデバイスがノード内の他のデバイスと通信できるようにします。
A CANネットワークは、 2つのみのワイヤで構成されます得る高とCAN低上記のように双方向のデータ伝送のために。通常、CANの通信速度は50 Kbpsから1Mbpsの範囲であり、距離は1Mbpsで40メートルから50kpbsで1000メートルの範囲です。
CANメッセージのフォーマット:
CAN通信では、データは特定のメッセージ形式としてネットワークに送信されます。このメッセージ形式には多くのセグメントが含まれていますが、2つの主要なセグメントは、CANバスでメッセージを送信および応答するのに役立つ識別子とデータです。
識別子またはCANID:識別子はCAN IDとも呼ばれ、PGN(パラメーターグループ番号)とも呼ばれます。これは、CANネットワークに存在するCANデバイスを識別するために使用されます。識別子の長さは、使用されるCANプロトコルのタイプに基づいて11ビットまたは29ビットのいずれかです。
標準CAN:0-2047(11ビット)
拡張CAN:0-2 29 -1(29ビット)
データ:これは、あるデバイスから別のデバイスに送信する必要がある実際のセンサー/制御データです。サイズデータの長さは0〜8バイトです。
データ長コード(DLC):存在するデータバイト数は0から8。
CANで使用されるワイヤー:
CANプロトコルは、情報を送受信するためのCAN_HとCAN_Lの2本のワイヤーで構成されています。両方のワイヤは差動ラインとして機能します。つまり、CAN信号(0または1)は、CAN_LとCAN_Hの間の電位差で表されます。差が正で特定の最小電圧よりも大きい場合は1であり、差が負の場合は0です。
通常、CAN通信にはツイストペアケーブルが使用されます。画像に示すように、CANネットワークの両端には通常120オームの抵抗が1つ使用されます。これは、ラインのバランスを取り、同じ電位に接続する必要があるためです。
SPIおよびI2Cに対するCANの比較
SPIとArduino、IICとArduinoの使い方をすでに学んだので、SPIとI2Cの機能をCANと比較してみましょう
パラメータ | SPI | I2C | できる |
速度 | 3Mbpsから10Mbps | 標準:100Kbps | 10KBps〜1MBps使用するワイヤーの長さにも依存します |
高速:400 Kbps | |||
高速:3.4Mbps | |||
タイプ | 同期 | 同期 | 非同期 |
ワイヤーの数 | 3+(MISO、MOSI、SCK、SS1、SS2…SS(n)) | 2線(SDA、SCL) | 2線(CAN_H、CAN_L) |
デュプレックス | 全二重 | 半二重 | 半二重 |
CANプロトコルアプリケーション
- CANプロトコルの堅牢性と信頼性により、自動車、産業機械、農業、医療機器などの業界で使用されています。
- CANでは配線の複雑さが軽減されるため、主に自動車などの自動車用途で使用されます。
- 実装コストが低く、ハードウェアコンポーネントの価格も低くなります。
- CANバスデバイスの追加と削除が簡単です。
ArduinoでCANプロトコルを使用する方法
ArduinoにはCANポートが組み込まれていないため、MCP2515と呼ばれるCANモジュールが使用されます。このCANモジュールは、SPI通信を使用してArduinoとインターフェースします。MCP2515の詳細と、Arduinoとのインターフェースについて見てみましょう。
MCP2515 CANモジュール:
MCP2515モジュールには、高速CANトランシーバーであるCANコントローラーMCP2515があります。MCP2515とMCU間の接続はSPIを介して行われます。そのため、SPIインターフェースを備えたマイクロコントローラーとのインターフェースは簡単です。
CANバスを学びたい初心者にとって、このモジュールは良いスタートとして機能します。このCANSPIボードは、産業オートメーション、ホームオートメーション、およびその他の自動車組み込みプロジェクトに最適です。
MCP2515の機能と仕様:
- 高速CANトランシーバーTJA1050を使用
- 寸法:40×28mm
- マルチCANバスインターフェースを拡張するためのSPI制御
- 8MHZ水晶発振器
- 120Ω端子抵抗
- 独立したキー、LEDインジケーター、電源インジケーターがあります
- 1 Mb / sCAN操作をサポート
- 低電流スタンバイ動作
- 最大112ノードを接続できます
MCP2515 CANモジュールのピン配置:
ピン名 |
使用する |
VCC |
5V電源入力ピン |
GND |
アースピン |
CS |
SPI SLAVE選択ピン(アクティブロー) |
そう |
SPIマスター入力スレーブ出力リード |
SI |
SPIマスター出力スレーブ入力リード |
SCLK |
SPIクロックピン |
INT |
MCP2515割り込みピン |
このチュートリアルでは、CANバスモジュールMCP2515を介してArduino NanoからArduinoUnoに湿度と温度(DHT11)センサーデータを送信する方法を見てみましょう。
必要なコンポーネント
- Arduino UNO
- Arduino NANO
- DHT11
- 16x2LCDディスプレイ
- MCP2515 CANモジュール– 2
- 10kポテンショメータ
- ブレッドボード
- 接続線
回路図
CAN送信機側の接続:
コンポーネント-ピン |
Arduino Nano |
MPC2515-VCC |
+ 5V |
MPC2515-GND |
GND |
MPC2515-CS |
D10(SPI_SS) |
MPC2515-SO |
D12(SPI_MISO) |
MPC2515-SI |
D11(SPI_MOSI) |
MPC2515-SCK |
D13(SPI_SCK) |
MPC2515-INT |
D2 |
DHT11-VCC |
+ 5V |
DHT11-GND |
GND |
DHT11-OUT |
A0 |
CANレシーバー側の回路接続:
コンポーネント-ピン |
Arduino UNO |
MPC2515-VCC |
+ 5V |
MPC2515-GND |
GND |
MPC2515-CS |
10(SPI_SS) |
MPC2515-SO |
12(SPI_MISO) |
MPC2515-SI |
11(SPI_MOSI) |
MPC2515-SCK |
13(SPI_SCK) |
MPC2515-INT |
2 |
LCD-VSS |
GND |
LCD-VDD |
+ 5V |
LCD-V0 |
10KポテンショメータセンターPINへ |
LCD-RS |
3 |
LCD-RW |
GND |
LCD-E |
4 |
LCD-D4 |
5 |
LCD-D5 |
6 |
LCD-D6 |
7 |
LCD-D7 |
8 |
LCD-A |
+ 5V |
LCD-K |
GND |
2つのMCP2515CANモジュール間の接続
H – CAN High
L –CAN低
MCP2515(Arduino Nano) |
MCP2515(Arduino UNO) |
H |
H |
L |
L |
すべての接続が確立されると、私のハードウェアは次のようになります
CAN通信用のArduinoのプログラミング
まず、ArduinoIDEにCAN用のライブラリをインストールする必要があります。次のライブラリを使用すると、MCP2515CANモジュールとArduinoのインターフェイスが簡単になります。
- Arduino CANMCP2515ライブラリのZIPファイルをダウンロードします。
- Arduino IDEから:スケッチ->ライブラリを含める->。ZIPライブラリを追加
このチュートリアルでは、コーディングはCANトランスミッターコード(Arduino Nano)とCANレシーバーコード(Arduino UNO)の2つの部分に分かれており、どちらもこのページの下部にあります。その説明は以下のとおりです。
データを送受信するためのプログラムを作成する前に、上記の手順に従ってライブラリがインストールされていること、およびCANモジュールMCP2515がプログラムで次のように初期化されていることを確認してください。
MCP2515 CANモジュールを初期化します:
MCP2515との接続を作成するには、次の手順に従います。
1. SPI CSが接続されているピン番号を設定します(デフォルトでは10)。
MCP2515 mcp2515(10);
2.ボーレートと発振器周波数を設定します
mcp2515.setBitrate(CAN_125KBPS、MCP_8MHZ);
利用可能なボーレート:
CAN_5KBPS、CAN_10KBPS、CAN_20KBPS、CAN_31K25BPS、CAN_33KBPS、CAN_40KBPS、CAN_50KBPS、CAN_80KBPS、CAN_83K3BPS、CAN_95KBPS、CAN_100KBPS、CAN_125KBPS、CAN_200KBPS、CAN_250KBPS、CAN_500KBPS、CAN_1000
利用可能なクロック速度:
MCP_20MHZ、MCP_16MHZ、MCP_8MHZ
3.モードを設定します。
mcp2515.setNormalMode(); mcp2515.setLoopbackMode(); mcp2515.setListenOnlyMode();
CAN送信機サイドコードの説明(Arduino Nano)
トランスミッターセクションでは、ArduinoNanoがSPIピンを介してMCP2515CANモジュールとインターフェースし、DHT11が温度と湿度のデータをCANバスに送信します。
まず、必要なライブラリ、SPI通信を使用するためのSPIライブラリ、CAN通信を使用するためのMCP2515ライブラリ、およびArduinoでDHTセンサーを使用するためのDHTライブラリが含まれています。以前、DHT11をArduinoとインターフェースしました。
#include
これで、Arduino NanoのA0に接続されているDHT11のピン名(OUTピン)が定義されました。
#define DHTPIN A0
また、 DHTTYPE は DHT11 として定義されています。
#define DHTTYPE DHT11
A canMsg CANメッセージフォーマットを記憶するための構造体データ型。
struct can_frame canMsg;
SPI CSが接続されているピン番号を設定します(デフォルトでは10)
MCP2515 mcp2515(10);
また、DHT11としてArduinoNanoおよびDHTタイプのDHTピンを持つクラスDHTのオブジェクトdhtが初期化されます。
DHT dht(DHTPIN、DHTTYPE);
次のvoidsetup():
次のステートメントを使用してSPI通信を開始します
SPI.begin();
次に、以下のステートメントを使用して、DHT11センサーから温度と湿度の値の受信を開始します。
dht.begin();
次に、MCP2515は次のコマンドを使用してリセットされます
mcp2515.reset();
現在、MCP2515はクロックとして500KBPSと8MHZの速度に設定されています
mcp2515.setBitrate(CAN_500KBPS、MCP_8MHZ);
そして、MCP2525は通常モードに設定されています
mcp2515.setNormalMode();
void loop()の場合:
次のステートメントは、湿度と温度の値を取得し、整数変数hとtに格納します。
int h = dht.readHumidity(); int t = dht.readTemperature();
次に、CAN IDは0x036(選択による)として与えられ、DLCは8として与えられ、hおよびtデータを データ と データ に与え、 すべてのデータを0で休ませます。
canMsg.can_id = 0x036; canMsg.can_dlc = 8; canMsg.data = h; //canMsg.dataの 湿度値を更新= t; //canMsg.dataの 温度値を更新= 0x00; //すべてを0で休ませますcanMsg.data = 0x00; canMsg.data = 0x00; canMsg.data = 0x00; canMsg.data = 0x00; canMsg.data = 0x00;
結局のところ、メッセージをCAN BUSに送信するには、次のステートメントを使用します。
mcp2515.sendMessage(&canMsg);
これで、温度と湿度のデータがメッセージとしてCANバスに送信されます。
CANレシーバー側コードの説明(Arduino UNO)
受信機セクションでは、ArduinoUNOはMCP2515および16x2LCDディスプレイとインターフェースしました。ここで、Arduino UNOはCANバスから温度と湿度を受信し、受信したデータをLCDに表示します。
まず、必要なライブラリ、SPI通信を使用するためのSPIライブラリ、CAN通信を使用するためのMCP2515ライブラリ、およびArduinoで16x2LCDを使用するためのLiquidCrsytalライブラリが含まれています。
#include
次に、ArduinoUNOとの接続に使用されるLCDピンが定義されます。
const int rs = 3、en = 4、d4 = 5、d5 = 6、d6 = 7、d7 = 8; LiquidCrystal lcd(rs、en、d4、d5、d6、d7);
構造体の データ・タイプは記憶するために宣言されているCANメッセージフォーマット。
struct can_frame canMsg;
SPI CSが接続されているピン番号を設定します(デフォルトでは10)
MCP2515 mcp2515(10);
ボイド設定():
まず、LCDが16x2モードに設定され、ウェルカムメッセージが表示されます。
lcd.begin(16,2); lcd.setCursor(0,0); lcd.print( "CIRCUIT DIGEST"); lcd.setCursor(0,1); lcd.print( "CAN ARDUINO"); delay(3000); lcd.clear();
次のステートメントを使用して、SPI通信を開始します。
SPI.begin();
次に、MCP2515は次のコマンドを使用してリセットされます。
mcp2515.reset();
現在、MCP2515は500KBPSの速度と8MHZをクロックとして設定しています。
mcp2515.setBitrate(CAN_500KBPS、MCP_8MHZ);
また、MCP2525は通常モードに設定されています。
mcp2515.setNormalMode();
次のvoidloop():
次のステートメントは、CANバスからメッセージを受信するために使用されます。メッセージを受信すると、 if 条件になります。
if(mcp2515.readMessage(&canMsg)== MCP2515:: ERROR_OK)
で あれば 条件データが受信されると、cに格納されている anMsg 、温度値を有する湿度値とデータを持つデータ。両方の値は整数xとyに格納されます。
int x = canMsg.data; int y = canMsg.data;
値を受け取った後、温度と湿度の値は、次のステートメントを使用して16x2LCDディスプレイに表示されます。
lcd.setCursor(0,0); lcd.print( "湿度:"); lcd.print(x); lcd.setCursor(0,1); lcd.print( "Temp:"); lcd.print(y); delay(1000); lcd.clear();
ArduinoでのCAN通信の動作
ハードウェアの準備ができたら、CANトランスミッターとCANレシーバーのプログラム(完全なプログラムを以下に示します)をそれぞれのArduinoボードにアップロードします。電源を入れると、DHT11によって読み取られた温度値がCAN通信を介して別のArduinoに送信され、下の画像に示すように2番目のArduinoのLCDに表示されます。また、ACリモコンを使用して、LCDに表示される温度が実際の室温に近いかどうかを確認しました。
完全な作業は、以下にリンクされているビデオで見つけることができます。質問がある場合は、コメントセクションに残すか、フォーラムを使用して他の技術的な質問をしてください。