【超小型無線通信】ATtiny402とRFモジュールでシンプルなIoTデバイスを自作する

【DIY】ホームセーフティ実践

こんにちは!電子工作愛好家の皆さん、マイコンを使って無線通信を試してみたいけれど、「複雑なSPI通信や大量のピン配線は避けたい」と考えていませんか?

今回は、高性能でありながらピン数が極端に少ないATtiny402というマイコン(AVR Tiny 1-Series)と、非常に安価で手軽な433MHz帯RFモジュールを組み合わせ、最小構成でデータ送受信を実現する方法を徹底解説します。

このシステムは、シンプルなON/OFF信号や温度データなどの小さな情報を、無線で飛ばすための最も手軽で低消費電力な基盤となります。


1. なぜATtiny402と433MHz RFモジュールを選ぶのか?

💡 ATtiny402の魅力:シンプルさと低消費電力

従来のAVRマイコン(ATtiny85やATmega328など)と比べ、ATtiny402(やATtiny 1-Series)には以下の大きなメリットがあります。

  • 超小型・低ピン数: SOT/SOICパッケージが主流で、I/Oピンが少ないため、回路が非常にシンプルになります。
  • UPDIインターフェース: プログラム書き込みにたった1ピンしか使用しません。残りのピンをすべてI/Oとして利用できます。
  • 高性能な内蔵機能: 新しいAVRアーキテクチャにより、20MHzのクロックを内蔵し、高速な処理が可能です。
  • 低消費電力: 電池駆動のワイヤレスセンサーなどに最適です。

💡 433MHz RFモジュールの魅力:手軽さと安価さ

433MHz帯のRFモジュールは、Amazonなどで「ASK/OOK無線モジュール」として数百円で販売されています。

  • シンプルさ: データ入出力ピン、電源、GNDのみで動作し、配線が非常に簡単です。
  • 手軽なデータ送信: ON/OFF信号のパルスを送るだけでデータ通信が可能です。

2. 必要な部品リスト(最小構成)

このシステムは「送信機」と「受信機」の2つのユニットで構成されます。どちらもほぼ同じ部品で構成できます。

部品名役割備考
マイコンATtiny402-SSNR (または同等のATtiny 1-Series)SOICパッケージの場合、DIP変換基板を推奨。
RF送信モジュール433MHz 送信機 (FS1000Aなど)送信機側で使用。
RF受信モジュール433MHz 受信機 (RXB6など)受信機側で使用。
プログラマUPDIライターUSB-to-TTLシリアルアダプタと 4.7kΩ抵抗 で自作可能。
コンデンサ0.1μF (積層セラミック)マイコンのVCC/GNDに接続し、電源ノイズを除去。
アンテナ線17cm程度の単線433MHz帯の 1/4波長 。通信距離確保に必須。
電源3.3V〜5Vの安定化電源単三電池2〜3本、または外部安定化電源。
その他ブレッドボード、ジャンパー線、220Ω抵抗、LED(受信確認用)


3. ATtiny402のピン配置と接続方法

ATtiny402は、ピン数が非常に少ないため、配線もシンプルです。今回は、データ通信にPA0ピンのみを使用します。

📌 ATtiny402の主要ピン(SOIC-8パッケージの場合)

Pin No.I/O Name役割
1VCC電源入力
4GNDグラウンド
5PA0RFデータ通信用I/O
6PA1UPDI(プログラム書き込み)

🔌 回路の配線(共通部分)

  1. 電源の安定化: ATtiny402の VCC (Pin 1)GND (Pin 4) の間に、0.1μFのセラミックコンデンサを極力短い配線で接続します。
  2. RFモジュールの接続:
    • RFモジュール VCC → ATtiny402 VCC
    • RFモジュール GND → ATtiny402 GND
  3. アンテナ: RFモジュールのアンテナ端子に、17cmの単線をまっすぐ接続します。

📡 データピンの接続

ユニットATtiny402 I/O接続先備考
送信機PA0 (Pin 5)RF送信機 DATA
受信機PA0 (Pin 5)RF受信機 DATA受信確認用LEDを別のピン(例:PA2やPA3)に接続しても良い


4. プログラムの作成:自力でパルスを生成・計測する

ATtiny402でRF通信を実現する最大のポイントは、ソフトウェアで通信プロトコル(パルスの生成と計測)を実装することです。今回は、ノイズ耐性を高めるための「プリアンブル(同期信号)」と「パルス幅変調」を組み合わせた単純な方式を採用します。

🛠️ 事前準備:MegaTinyCoreのインストール

ATtiny402をArduino IDEで扱うには、MegaTinyCore(Spence Konde氏)をインストールする必要があります。

  1. Arduino IDEの「ファイル」→「環境設定」を開き、追加のボードマネージャのURLにMegaTinyCoreのJSONアドレスを追加します。
  2. 「ツール」→「ボード」→「ボードマネージャ」で「MegaTinyCore」を検索してインストールします。
  3. ツールメニューで「ボード」をATtiny402に設定します。

(A) 送信機側のスケッチ:パルス生成 (PA0を送信ピンとして使用)

ここでは、8ビットのデータ(例:0b10110010)を送信するロジックを実装します。

C++

// ATtiny402のPA0ピンをピン番号0として使用
#define TX_PIN 0 

void setup() {
  pinMode(TX_PIN, OUTPUT);
  // PA0はPA0ピンを指します。
}

// データのビット値に応じてパルス幅を変える関数
void transmitBit(bool bitValue) {
  // パルス幅の定義 (マイクロ秒)
  const int SHORT_PULSE = 500; // '0' のパルス幅
  const int LONG_PULSE  = 1500; // '1' のパルス幅
  const int BREAK_TIME = 500; // ビット間の休憩時間
  
  // データをHIGHパルスで表現
  digitalWrite(TX_PIN, HIGH);
  if (bitValue) {
    delayMicroseconds(LONG_PULSE); // 1なら長いパルス
  } else {
    delayMicroseconds(SHORT_PULSE); // 0なら短いパルス
  }
  
  // ブレイクタイム
  digitalWrite(TX_PIN, LOW);
  delayMicroseconds(BREAK_TIME);
}

void loop() {
  // --- 1. プリアンブル (同期信号) ---
  // 受信機に「今からデータが来るよ」と知らせる
  for (int i = 0; i < 10; i++) {
    digitalWrite(TX_PIN, HIGH);
    delayMicroseconds(500); 
    digitalWrite(TX_PIN, LOW);
    delayMicroseconds(500); 
  }

  // --- 2. データ送信(8ビット) ---
  uint8_t data = 0b10110010; // 送信したいデータ
  
  for (int i = 0; i < 8; i++) {
    // 最上位ビットから順にチェック
    bool bitToSend = (data & (0b10000000 >> i)); 
    transmitBit(bitToSend);
  }

  // --- 3. データ終了信号(任意) ---
  digitalWrite(TX_PIN, LOW);
  
  delay(1000); // 1秒間隔でデータを繰り返す
}

(B) 受信機側のスケッチ:パルス計測とデータ復元 (PA0を受信ピンとして使用)

受信機側は、pulseIn()関数を使ってパルスの長さを計測し、データを復元します。

C++

// ATtiny402のPA0ピンを受信ピンとして使用
#define RX_PIN 0 
#define LED_PIN 3 // 受信確認用としてPA3ピンを使用(Pin 8)

// 受信パルス幅の閾値 (送信機と合わせて調整)
const int PULSE_THRESHOLD = 1000; // 500usと1500usの中間

void setup() {
  pinMode(RX_PIN, INPUT);
  pinMode(LED_PIN, OUTPUT);
  digitalWrite(LED_PIN, LOW);
}

// パルス幅を計測してビットを判定する関数
bool receiveBit() {
  // HIGHパルスの長さを計測(最大5ms待ち)
  unsigned long duration = pulseIn(RX_PIN, HIGH, 5000); 
  
  // ノイズ対策:短すぎるパルスは無視
  if (duration < 200) { 
    return false; // 異常値
  }
  
  // 閾値より長ければ '1' と判定
  if (duration > PULSE_THRESHOLD) {
    return true; // 1
  } else {
    return false; // 0
  }
}

void loop() {
  // プリアンブル(同期信号)の開始を待つ
  // RFモジュールはノイズで常にHIGH/LOWを出力するため、受信機は常に待機が必要
  
  // 受信機側でプリアンブルのパターン(500us HIGH/LOW)を検知するロジックが必要だが、
  // ここではシンプルに最初のHIGHパルスが一定時間以上続くのを待つ (簡易同期)
  if (digitalRead(RX_PIN) == HIGH) {
    delayMicroseconds(1000); // HIGHが続いているか確認
    if (digitalRead(RX_PIN) == HIGH) { 
        // データの始まりと見なして受信を開始
        uint8_t receivedData = 0;
        
        for (int i = 0; i < 8; i++) {
            // 受信パルスが有効かチェック
            if (receiveBit()) {
                receivedData |= (0b10000000 >> i); // 1を受信
            }
        }
    
        // データの検証
        if (receivedData == 0b10110010) {
            // 正しいデータを受信した場合、LEDを点滅
            digitalWrite(LED_PIN, HIGH);
            delay(500);
            digitalWrite(LED_PIN, LOW);
        }
    }
  }
  delay(10); // マイコンの負荷軽減
}

5. プログラムの書き込み(UPDI)

ATtiny402のプログラム書き込みには、 UPDI(Unified Program and Debug Interface) が必要です。

準備するプログラマ

USB-to-TTLシリアルアダプタ(FTDIやCP2102など)と、抵抗(4.7kΩ)を使って自作するのが最も安価で一般的です。

  1. シリアルアダプタのTXピン4.7kΩ抵抗 → ATtiny402の PA1 (UPDI) ピン
  2. シリアルアダプタのGND → ATtiny402のGNDピン

書き込み手順

  1. Arduino IDEの「ツール」→「書き込み装置」をSerialUPDIに設定します。
  2. 「ポート」でシリアルアダプタが接続されているCOMポートを選択します。
  3. 「スケッチ」→「アップロード」を実行します。

6. まとめと次のステップ

ATtiny402433MHz RFモジュールの組み合わせは、極限までシンプルに無線通信を実現する強力な手段です。

  • 小型で低消費電力なデバイスを簡単に作れます。
  • PA0ピン1本で送受信をまかなうシンプルな回路構成。
  • UPDIによる容易なプログラム書き込み。

🚀 さらなる発展のために

  1. Manchesterライブラリの採用: 余裕があれば、ATtiny402に対応したManchesterライブラリ(または同等のエンコーディングライブラリ)を導入することで、手動でパルスを扱うよりもノイズ耐性が高く、安定したデータ通信が可能になります。
  2. 双方向通信: 受信機にも送信モジュールを、送信機にも受信モジュールを搭載することで、相互にデータの送受信やACK(受信確認応答)を行えるようになり、信頼性が向上します。

このシステムを応用して、温度センサーのデータ送信や、離れた場所からのリモートコントロールなど、様々なIoTプロジェクトに挑戦してみてください!

タイトルとURLをコピーしました