nRF24L01+とATtiny85で実現する3ピン無線センサ送信
必要な部品と材料
| 部品 | 数量 | 備考 |
|---|---|---|
| nRF24L01+ モジュール | 2 | 送信側・受信側各1個 |
| ATtiny85 | 1 | 送信側マイコン |
| Arduino UNO | 1 | 受信側・ATtiny85書き込み用 |
| セラミックコンデンサ 10nF | 1 | 電源安定化用 |
| カーボン皮膜抵抗 22kΩ | 1 | 3ピン制御用 |
| スイッチングダイオード 1N4148 | 1 | 3ピン制御用 |
| 3.3V電源 | 1 | nRF24L01+用(5V不可) |
| nRF24L01+ ソケットアダプタ | 1 | 任意(安定動作に推奨) |
プロジェクト概要
前回の「Arduino UnoでATtiny85をプログラミング」に続くプロジェクトです。安価なATtiny85を採用した後、センサデータを安価に無線送信する方法を探し、低消費電力RFトランシーバ「nRF24L01+」にたどり着きました。しかしATtiny85はピン数が少なく、通常のSPI接続(CE, CSN, SCK, MOSI, MISOの5ピン)ではセンサ接続ピンが足りません。そこで「nRF24L01+を3ピンで制御する」手法(Ralph Doncaster氏の手法)を実装し、残りのピンをセンサ入力に割り当てられるようにしました。
システム構成:送信モジュールと受信モジュール
- 送信側(Transmitter):ATtiny85 + nRF24L01+。3ピンで無線送信し、残りピンでセンサ読み取り。
- 受信側(Receiver):Arduino UNO + nRF24L01+。受信データをシリアルモニタに出力。
ライブラリは RF24 library (TMRh20版) を使用。Arduino IDEのライブラリマネージャから「RF24」で検索してインストール可能です。
送信側(Transmitter)の構築
必要部品
- ATtiny85
- nRF24L01+
- セラミックコンデンサ 10nF
- カーボン皮膜抵抗 22kΩ
- スイッチングダイオード 1N4148
配線(3ピン制御のポイント)
通常SPIでは5ピン必要ですが、CEとCSNを同じピン(PB3/ピン2)に割り当て、ダイオードと抵抗で信号を分離することで3ピン(SCK, MOSI, 共通CE/CSN)に削減しています。詳細な配線は以下の画像を参照してください。



送信側スケッチ(sender.ino)
#define CE_PIN 3
#define CSN_PIN 3 // CEとCSNを同一ピンで共有(3ピン構成)
#include "RF24.h"
RF24 radio(CE_PIN, CSN_PIN);
byte address[11] = "SimpleNode";
unsigned long payload = 0;
void setup() {
radio.begin();
radio.setAutoAck(1);
radio.setRetries(15,15);
radio.openWritingPipe(address);
}
void loop(void){
payload++;
radio.write(&payload, sizeof(unsigned long));
delay(1000); // 1秒ごとにインクリメント値を送信
}
※ATtiny85への書き込み方法は前回記事「Programming ATtiny85 with Arduino Uno」を参照してください。
受信側(Receiver)の構築
必要部品
- Arduino UNO
- nRF24L01+
- nRF24L01+ ソケットアダプタ(任意)
配線
Arduino UNOの標準SPIピン(SCK=13, MOSI=11, MISO=12)に加え、CE=7, CSN=8を使用します。


受信側スケッチ(receiver.ino)
#define CE_PIN 7
#define CSN_PIN 8
#include <SPI.h>
#include "RF24.h"
RF24 radio(CE_PIN, CSN_PIN);
byte address[11] = "SimpleNode";
unsigned long payload = 0;
void setup() {
Serial.begin(115200);
radio.begin();
radio.setAutoAck(1);
radio.setRetries(15,15);
radio.openReadingPipe(1, address);
radio.startListening();
}
void loop(void){
radio.stopListening();
radio.startListening();
radio.read(&payload, sizeof(unsigned long));
if(payload != 0){
Serial.print("Got Payload ");
Serial.println(payload);
}
delay(1000);
}
重要:nRF24L01+の電源について
nRF24L01+は必ず**3.3V**で駆動してください。Arduino UNOの3.3V出力は電流容量が不足し、モジュールが正常動作しないことがよくあります。以下のいずれかの対策を推奨します:
- 別途3.3Vレギュレータ(例:AMS1117-3.3やLD1117-3.3)で安定化電源を作る
- モジュールのVCC-GND間に10μF以上の電解コンデンサを直結する
- nRF24L01+用ソケットアダプタ(オンボードレギュレータ付き)を使用する
動作確認
- 送信側に電源を投入(自動的に送信開始)
- 受信側のArduinoをPCに接続し、シリアルモニタ(115200bps)を開く
- 「Got Payload 1」「Got Payload 2」...と1秒ごとに表示されれば成功
実装例:ユニバーサル基板へのはんだ付け
ブレッドボード上で動作確認後、ユニバーサル基板にはんだ付けして常設化しました。



まとめと今後の展開
このプロジェクトでは、ATtiny85の限られたピン数でnRF24L01+を制御し、残りのピンをセンサ入力に使えることを実証しました。フィードバックや改善提案を歓迎します。
回路図ファイル(Fritzing)
- nRF24L01+ (With Socket) ATtiny85.fzz
- nRF24L01+ Arduino Uno.fzz
製造プロセス
- ローラーピン:エトルリア起源から現代の職人技へ
- 現代ボウリングピンの進化と職人技
- Raspberry Pi 2でDS18B20温度センサー読み取りガイド
- Raspberry PiでMaxim 1-WireセンサーとDS2482 I2Cブリッジを用いた温度測定
- Raspberry Piでサーバークローゼットの温度を正確に監視
- Walabot搭載Posture Pal:首・背中の痛みを防ぐリアルタイム距離監視
- Raspberry Piで手書き数字認識:TensorFlowとOpenCVを用いたディープラーニング実装
- TJBot入門:組み立て、設定、音声制御で自分だけのAIロボットを構築
- Raspberry Pi で自作セグウェイ(自己平衡ロボット)を構築
- GoPiGo v2をWindows 10 IoT Coreで拡張 - Raspberry Pi 3対応
- スイッチ付き回路:基本電気回路の実践ガイド