こんにちは!電子工作愛好家の皆さん、マイコンを使って無線通信を試してみたいけれど、「複雑な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 | 役割 |
1 | VCC | 電源入力 |
4 | GND | グラウンド |
5 | PA0 | RFデータ通信用I/O |
6 | PA1 | UPDI(プログラム書き込み) |
🔌 回路の配線(共通部分)
- 電源の安定化: ATtiny402の VCC (Pin 1)とGND (Pin 4) の間に、0.1μFのセラミックコンデンサを極力短い配線で接続します。
- RFモジュールの接続:
- RFモジュール VCC → ATtiny402 VCC
- RFモジュール GND → ATtiny402 GND
- アンテナ: 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氏)をインストールする必要があります。
- Arduino IDEの「ファイル」→「環境設定」を開き、追加のボードマネージャのURLにMegaTinyCoreのJSONアドレスを追加します。
- 「ツール」→「ボード」→「ボードマネージャ」で「MegaTinyCore」を検索してインストールします。
- ツールメニューで「ボード」を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Ω)を使って自作するのが最も安価で一般的です。
- シリアルアダプタのTXピン → 4.7kΩ抵抗 → ATtiny402の PA1 (UPDI) ピン
- シリアルアダプタのGND → ATtiny402のGNDピン
書き込み手順
- Arduino IDEの「ツール」→「書き込み装置」をSerialUPDIに設定します。
- 「ポート」でシリアルアダプタが接続されているCOMポートを選択します。
- 「スケッチ」→「アップロード」を実行します。
6. まとめと次のステップ
ATtiny402と433MHz RFモジュールの組み合わせは、極限までシンプルに無線通信を実現する強力な手段です。
- 小型で低消費電力なデバイスを簡単に作れます。
- PA0ピン1本で送受信をまかなうシンプルな回路構成。
- UPDIによる容易なプログラム書き込み。
🚀 さらなる発展のために
- Manchesterライブラリの採用: 余裕があれば、ATtiny402に対応したManchesterライブラリ(または同等のエンコーディングライブラリ)を導入することで、手動でパルスを扱うよりもノイズ耐性が高く、安定したデータ通信が可能になります。
- 双方向通信: 受信機にも送信モジュールを、送信機にも受信モジュールを搭載することで、相互にデータの送受信やACK(受信確認応答)を行えるようになり、信頼性が向上します。
このシステムを応用して、温度センサーのデータ送信や、離れた場所からのリモートコントロールなど、様々なIoTプロジェクトに挑戦してみてください!