概要
LIN(Local Interconnect Network)は、1999年に欧州の自動車メーカーが共同で策定した低速・低コストの車載用シリアル通信プロトコルです。CANバスよりもはるかに低コストで、シングルワイヤ(1本の信号線)で通信できる点が特徴です。
CANバスが骨格となる主要ネットワークであるのに対し、LINはボディ系の補助的なサブネットワーク(サブバス)として使われます。窓の開閉スイッチ・シートポジション調整・ドアミラー制御・照明制御など、高速通信が不要でコスト重視の用途に適しています。
通信速度は最大20kbps(標準的には9.6kbps〜19.2kbps)とCANに比べて非常に遅いですが、シングルワイヤ・低コストトランシーバ・マスタースレーブの単純な構成が低コスト化に貢献しています。
歴史・背景
LINは1999年にAudi・BMW・Daimler・Motorola・Volkswagen・VolvoがLIN Consortium(LINコンソーシアム)を設立して開発しました。CANバスが高価・複雑すぎる補助機器向けの安価な代替として位置づけられています。
2003年にLIN 2.0仕様が公開され、以降2.1(2006年)、2.2(2010年)、2.2A(2012年)と改訂されました。2016年にはISO 17987として国際標準化されています。現在の自動車1台には、CANバスとLINバスが共存しており、LINバスはしばしばCANバスのECUにスレーブとして接続された形で使われます。
技術仕様
基本仕様
| 項目 | 仕様 |
|---|---|
| 信号方式 | シングルワイヤ(12V系) |
| 通信速度 | 1 kbps〜20 kbps(標準19.2 kbps) |
| 最大ノード数 | 1マスター + 最大16スレーブ |
| フレーム周期 | 最大100ms(5ms〜100ms) |
| トポロジー | シングルバス(スター・デイジーチェーン) |
| 終端 | マスター側に1kΩのプルアップ |
フレームフォーマット
LINフレームはマスターが送信するヘッダーとスレーブが応答するレスポンスで構成されます:
[ブレークフィールド][同期フィールド][PID(1B)][データ(1〜8B)][チェックサム(1B)]
↑マスター送信 ↑マスター送信 ↑マスター ↑スレーブ応答 ↑スレーブ
- ブレークフィールド: 13ビット以上のドミナント(Low)。フレームの開始を示す
- 同期フィールド: 0x55(01010101)固定。スレーブがボーレートを計算するための基準
- PID(Protected ID): 6ビットのフレームID + 2ビットのパリティ(合計8ビット)
- データ: 1〜8バイトのペイロード
- チェックサム: データとPIDのチェックサム(LIN 2.x)
スケジュールテーブル
マスターはスケジュールテーブル(通信スケジュール)に従って定期的にヘッダーを送出します。スレーブはそのIDに対応するデータを返すだけで良いため、スレーブ側の処理が非常にシンプルです。
動作原理
LINはマスタースレーブ専用の通信です。マスターのみがバスのタイミングを制御し、スレーブは自分が担当するPIDのヘッダーが来たときのみ応答します:
- マスターがブレークフィールドを送出(フレーム開始)
- マスターが同期フィールド(0x55)を送出(スレーブがボーレードを計算)
- マスターがPIDを送出(どのデータを要求するか)
- 担当スレーブがデータ+チェックサムを返す
物理層はUARTに近く、差動ではなくシングルエンドの12V系信号です。マイコンのUARTペリフェラルを流用し、LINトランシーバIC(TJA1021等)と組み合わせることでコスト削減できます。
// マイコン(UARTベース)でのLINマスター実装例
// LINブレークフィールド送信(UARTボーレードを一時的に下げる)
void lin_send_break(void) {
// UART設定変更: 通常の1/2ボーレードで0x00を送信→13ビットLow
UART_SetBaudrate(9600 / 2); // 半分のボーレート
uint8_t brk = 0x00;
HAL_UART_Transmit(&huart2, &brk, 1, 10);
UART_SetBaudrate(9600); // 元のボーレートに戻す
}
// LINフレーム送信
void lin_send_frame(uint8_t frame_id, uint8_t *data, uint8_t len) {
uint8_t pid = lin_calc_pid(frame_id);
uint8_t sync = 0x55;
uint8_t checksum = lin_calc_checksum(pid, data, len);
lin_send_break();
HAL_UART_Transmit(&huart2, &sync, 1, 10); // 同期フィールド
HAL_UART_Transmit(&huart2, &pid, 1, 10); // PID
HAL_UART_Transmit(&huart2, data, len, 10); // データ
HAL_UART_Transmit(&huart2, &checksum, 1, 10); // チェックサム
}
// PID計算(6ビットID + 2ビットパリティ)
uint8_t lin_calc_pid(uint8_t id) {
uint8_t p0 = ((id >> 0) ^ (id >> 1) ^ (id >> 2) ^ (id >> 4)) & 0x01;
uint8_t p1 = (~((id >> 1) ^ (id >> 3) ^ (id >> 4) ^ (id >> 5))) & 0x01;
return (id & 0x3F) | (p0 << 6) | (p1 << 7);
}
用途・ユースケース
LINが使われる車載アプリケーション:
- ドアモジュール: ウィンドウ開閉スイッチ・ドアロック・ドアミラー制御をLINで統合し、CANノード数を削減
- シートコントロール: 電動シートのポジション調整モーター制御
- 照明制御: 室内照明・フットライト・アンビエントライトの調光制御
- ステアリングコラム: 方向指示スイッチ・ライトスイッチのスイッチパネル
- HVACシステム: エアコン風量・温度・風向き制御パネルとの通信
- 雨量センサー・照度センサー: 自動ワイパー・自動ライト制御向けセンサーの接続
実装・開発のポイント
LINトランシーバIC
マイコンのUARTとLINバスを接続するにはLINトランシーバが必要です:
| IC | メーカー | 特徴 |
|---|---|---|
| TJA1021 | NXP | 標準的なLINトランシーバ |
| MC33662 | NXP | 省電力LINトランシーバ |
| TLIN1027 | Texas Instruments | 低消費電力・小パッケージ |
多くのLINトランシーバは12V電源から動作し、マイコンの3.3V/5V系とレベル変換を内蔵しています。
スレーブノードの自動ボーレード検出
LINの優れた点の一つは、スレーブが同期フィールド(0x55)を見てマスターのボーレードを自動計算(オートボーレード検出)できることです。スレーブ側のクロック精度を緩和できます。
ウェイクアップ
LINバスはスリープ状態から「ウェイクアップフレーム」(LINブレーク + 特定パターン)でノードを起動できます。車載では消費電力削減のためにスリープ/ウェイクアップ制御が重要です。
他技術との比較
LIN vs CAN
| 項目 | LIN | CAN |
|---|---|---|
| 速度 | 最大20 kbps | 最大1 Mbps |
| 配線 | 1線 | 2線(差動) |
| マルチマスター | なし(マスター1台のみ) | あり |
| コスト | 非常に低い | 低〜中 |
| 用途 | ボディ系補助ネット | 主要制御ネット |
LINは低速・低コストで補助的な機器を接続するためのサブネットワーク、CANは高速・高信頼で主要なECU間通信を担うメインネットワーク、という役割分担が一般的です。