ATtiny85は8ピンパッケージに8KBフラッシュ、512バイトのSRAM、6つの使いやすいGPIOピンを提供し、ボードスペースが限られフル機能のマイクロコントローラが過剰とされるコスト重視の設計に実用的です。1.8〜5.5Vで動作し、4チャンネルの10ビットADCを搭載し、ユニバーサルシリアルインターフェースを通じたソフトウェア駆動のシリアル通信をサポートします。以下では、ピン配置、内部アーキテクチャ、プログラミングワークフロー、そして実際にビルドする際に重要なトレードオフについて説明します。
主なポイント:
- 6つのGPIOピンがADC、PWM、シリアル機能を共有します。慎重なピン割り当てにより、実際のレイアウトでのリソース競合を防ぎます。
- RESETピンはヒューズを介してGPIOとして再構成できますが、そうすると高電圧プログラミングに縛られてしまいます。コミットする前にデバッグと本番のワークフローを計画してください。
- USIはI²CおよびSPIに対して手動のビットバンギングを必要とします。低速周辺機器には対応しますが、ハードウェア周辺機器と比べてファームウェアの複雑さが増します。
- ADCの安定性は電源の品質と接地に依存します。ADCノイズリダクションスリープモードは、ベースノイズが存在する場合に測定可能な結果を向上させます。
- GPIOピンはデータシートに記載されている最大40 mAの電源/入力を制御しますが、1ピンあたり20 mAを超える持続動作は劣化を加速させます。常に外部に高電流負荷をバッファリングします。
技術仕様
| パラメータ | 価値 |
|---|---|
| CPU | 8ビットAVR RISC |
| 動作電圧 | 1.8-5.5 V |
| フラッシュメモリ | 8 KB |
| SRAM | 512バイト |
| EEPROM | 512バイト |
| GPIOピン | 6 |
| ADC | 10ビット、4チャンネル |
| タイマー | 2つの8ビット |
| クロックスピード | 最大20 MHz(外部)、8 MHz(内蔵RC、デフォルト) |
| パッケージ | PDIP-8、SOIC-8、TSSOP-8、QFN/MLF-20 |
| 温度範囲 | -40から+125°C |
| シリアルインターフェース | USI(SPIまたはI²C用にソフトウェア設定可能) |
| ブラウンアウト検出 | はい |
| ウォッチドッグタイマー | はい |

ピン構成
| ピン | 主要機能 | 代替機能 |
|---|---|---|
| 1 | PB5(リセット) | PCINT5、ADC0、dW(debugWIRE) |
| 2 | PB3 | PCINT3、XTAL1、CLKI、ADC3 |
| 3 | PB4 | PCINT4、XTAL2、CLKO、ADC2 |
| 4 | GND | グラウンド |
| 5 | PB0 | モシ、ディ、SDA、AIN0、OC0A、AREF、PCINT0 |
| 6 | PB1 | MISO、DO、AIN1、OC0B、OC1A、PCINT1 |
| 7 | PB2 | SCK、USCK、SCL、ADC1、T0、INT0、PCINT2 |
| 8 | VCC | 電源供給 |

すべてのGPIOピンは少なくとも3つの機能を多重化します。経験上、最も一般的な競合はSPIプログラミング(PB0、PB1、PB2を使用)と、同じピン上のアプリケーション周辺機器との間で起こります。もしアプリケーション回路がこれらのピンに重い負荷をかけたり、固定状態に留めたりすると、ISPのプログラミングが断続的に失敗することがあります。ATtiny85とSPIライン上の外部部品の間に直列抵抗(220-470 Ω)を追加することで、プログラマはアップロード時にアプリケーション回路を上書きできます。
ピン1は内部プルアップでRESETにデフォルトで対応します。RSTDISBLヒューズ経由でGPIO(PB5)として設定すると、追加のI/Oピンが1つ増えますが、標準ISPでの再プログラム機能は失われます。そのため、高電圧並列プログラミング(HVPP)が必要となり、専門的なプログラマーが必要となり、生産ワークフローに複雑さが加わります。チームがRESETを無効にして6つ目のピンを手に入れようとしたのに、プロジェクトの後半でフィールドアップデートが実用的でなくなることに気づくのを見たことがあります。
ブロック図と内部アーキテクチャ

ATtiny85は、プログラム保存用の別個の8KBフラッシュとランタイムデータ用の512バイトSRAMを備えたハーバードアーキテクチャを採用しています。フラッシュ耐久は1ページあたり10,000回の書き込み/消去サイクルと評価されています。EEPROMは100,000サイクルの定格です。もしアプリケーションがキャリブレーションデータやログを頻繁に書き込むと、EEPROMの限界に予想以上早く到達します。書き込みを複数のアドレスに分散させたり、高サイクルカウントのデータを外部ストレージに切り替えたりします。
2つの8ビットタイマー(Timer0とTimer1)はPWMを生成し、外部イベントをカウントし、割り込みをトリガーします。Timer0はよりシンプルで、基本的なPWMや遅延機能に通常使われます。タイマー1にはPLLモードが含まれており、高周波PWM(5V電源付きPB1/PB4で最大64 MHz)を生成可能で、赤外搬送波生成や高周波調光などの用途に有用です。
ウォッチドッグタイマーはファームウェアがフリーズした場合にチップをリセットできますが、スリープモードでは低消費電力のインターバルタイマーとしても機能します。あるバッテリー駆動の設計では、ウォッチドッグを使って8秒ごとにATtiny85を起動させ、センサーを測定してスリープに戻すというもので、平均電流消費電流は10μA未満にしました。
電源とクロック構成
ATtiny85は内蔵の8 MHz RC発振器用ヒューズを8で割り、実際の1 MHzクロックを搭載しています。この保守的なデフォルトは全電圧範囲で機能しますが、性能は問題視されます。5V動作の場合、内部発振器をフル8MHzで動かすようにヒューズを再構成するのは簡単で、外部部品は不要です。
例えば、標準的なボーレートのUARTや周波数カウンターのような正確なタイミングが必要な場合、内部発振器の±10%工場出荷時のキャリブレーションは十分に厳密ではありません。外部の16MHzまたは20MHzのクリスタルは精度を±50ppmまで向上させますが、2つのコンデンサを追加しPB3/PB4を占有します。通信重視の用途ではそのトレードオフは価値がありますが、ピンがすでに制限されている場合は苦痛です。
ブラウンアウト検出(BOD)は、供給電圧が低下した際にCPUが無効命令を実行するのを防ぎます。BODを2.7Vまたは4.3Vで有効にすると、スリープ電流に約20〜25μAの電流が加わります。サブマイクロアンペアスリープを想定したバッテリー設計では、電源停止時に時折発生する不具合のリスクを承知の上で、ファームウェアでBODを無効にし低電圧状態を処理する必要があるかもしれません。
GPIO特性と負荷制限
Microchipのデータシートによると、各GPIOピンは最大40 mAの絶対電流を供給または消費できますが、これは破壊的な制限であり、動作仕様ではありません。推奨される1ピンあたりの連続電流は20 mAで、内部接地バウンドやラッチアップリスクを避けるために、すべてのピン全体の電流は200 mA未満に抑えられるべきです。
趣味のプロジェクトではGPIOからLEDを直接駆動するのは一般的ですが、順方向の電圧と電流は慎重に考慮する必要があります。標準的な赤色LEDは、5V電源で20 mAで2 V順方向ドロップを送る場合、最低でも150 Ω抵抗が必要です。誰かが「LEDが暗すぎたから」と言って47 Ωを使った基板をデバッグしたことがあります。数時間は動作していましたが、その後GPIOが永久に故障しました。
20 mA以上の負荷 - モーター、リレー、ソレノイド、さらには高出力LEDなど - には外部MOSFETまたはBJTを使用します。2N7002 NチャネルMOSFETは低コストで、10 kΩゲート抵抗で数百ミリアンペアのクリーンなスイッチを実現します。電流容量を増やすためにGPIOピンを並列に接続しようとすると、信頼性が高くありません。ピンのインピーダンスにわずかな差が電流の分配を不均一にし、損傷の可能性を生みます。
ADC運用および騒音管理
10ビットADCは0-VCC(または内部の1.1Vまたは2.56Vの基準値)を0から1023までの値に変換します。解像度は10ビットですが、ノイズが多い環境では実効ビット数(ENOB)が8ビット、場合によっては7ビットまで下がることがあります。
私の経験では、ADCの安定性を高める要素が3つあります:
- チップの近くにコンデンサをデカップリングする。 VCCおよびGNDピンから5mm以内に100 nFのセラミックと10 μFの電解コンデンサを並列に配置し、高周波スイッチングノイズをカットしました。
- ADCノイズリダクションスリープモード。 変換中にCPUを停止することでチップ内のデジタルスイッチノイズがなくなります。その差は測定可能です。このモードを有効にするだけでノイズフロアが±8 LSBから±2 LSBに下がるのを見たことがあります。
- アナロググラウンドまたはスター接地を分離する。 ADCがPWM駆動の負荷とリターンパスを共有する場合、PWMからの接地電流がADCの測定にノイズを注入します。ADCリファレンス用の電源線に専用のグラウンドトレースを通すと、結果が明らかに改善されます。
また、ADCは差動入力モードをサポートしており、特定のピンペアではオプションでゲイン(1×、8×、20×、32×)を選択可能です。これはチュートリアルではあまり文書化されていませんが、熱電対やひずみゲージブリッジのような小さな差分信号にはよく機能します。ゲインは入力範囲の減少とオフセット誤差の増加を伴うため、キャリブレーションが非常に重要になります。
USIを経由したシリアル通信
ユニバーサル・シリアル・インターフェース(USI)は、シリアルプロトコルを支援する最小限のハードウェアブロックですが、ほとんどの作業はファームウェアに任せています。シフトレジスタ、カウンタ、基本的なクロック生成機能が含まれており、低速から中速でI²CやSPIをビットバン(単位で操作)できます。
USIがうまく機能するとき:
- 100 kHzで単一のI²Cセンサーと通信すること。
- ATtiny85が常にマスターとなるSPIディスプレイやDACを駆動する
- ファームウェアの複雑さが許容されるプロトタイピングや低量設計。
USIが問題になるとき:
- マルチマスターI²Cまたはクロックストレッチシナリオ;USIはこれらを自動的に処理していません。
- 1 MHzを超える高速SPIです。専用のハードウェアがないとタイミングは難しいです。
- UARTも必要なアプリケーション。UARTハードウェアがないため、ビットバンで処理し、CPUサイクルを消費しタイミングを複雑にします。
私はTinyWireMのようなUSIベースのI²CライブラリをBMP280やSSD1306 OLEDなどのセンサーでうまく使ったことがあります。また、I²CデバイスがSCLを低く保持している(クロックストレッチ)した際、ライブラリがそれを検出できずファームウェアがフリーズしたケースを何時間もかけてデバッグしたことがあります。教訓はこうです:理想的な環境のベンチではなく、早期に実際の周辺機器とUSIコードを比較してください。
Arduino IDEでATtiny85をプログラミング

Arduino IDE経由でATtiny85をプログラムするには、Spence KondeのATTinyCoreやDavid Mellisの古いattinyパッケージのようなサードパーティ製ボード定義を追加する必要があります。これらのコアは、Arduinoの「digitalWrite()」や「analogRead()」などの機能をATtiny85ハードウェアにマッピングします。
ISPプログラミングの配線:
| ATtiny85 ピン | ISPプログラマーシグナル |
|---|---|
| 1(リセット) | リセット |
| 5(PB0) | MOSI |
| 6(PB1) | MISO |
| 7(PB2) | SCK |
| 8(VCC) | +5V(または目標電圧) |
| 4(GND) | GND |
専用のUSBtinyISP、USBasp、または「Arduino as ISP」として設定された任意のArduinoボードを使うことができます。ArduinoをISPとして使う場合は、ARDUINOのRESETとGNDの間に10μFのコンデンサを設置し、アップロード時にリセットされないようにしてください。
基板設定が重要:
- 正しいクロック周波数(内部1 MHz、8 MHz、外部16 MHz)を選択します。
- 「Burn Bootloader」を一度選択してヒューズ設定を書き込む。このステップはブートローダーをインストールするものではなく(ATtiny85はブートローダーを使用していない)、選択したクロックに合わせてヒューズを設定する。
- ヒューズ設定後、「Sketch > Upload Using Programmer」でスケッチをアップロードするか、設定でプログラマをデフォルトに設定します。
Arduinoのピン番号は物理的なピンとは直接一致しません。例えば、Arduinoのデジタルピン0はPB0(物理ピン5)に対応し、Arduinoのデジタルピン2はPB2(物理ピン7)に対応します。配線する前にコアドキュメントやピン配置図を確認してください。
最小限の動作回路

最小限の回路に必要なのは以下の通りです:
- VCC(ピン8)は3.3Vまたは5V電源に接続されています。
- GND(ピン4)はアースに接続されています。
- VCCとGNDの間に100 nFのセラミックコンデンサを設置し、ICの近くに配置されます。
- 電源がノイズがある場合、RESET(ピン1)に10 kΩプルアップ抵抗を設置することもできますが、通常は内部プルアップで十分です。
PB0(ピン5)に接続された電流制限抵抗(5Vなら220-470 Ω、3.3Vでは最低150 ΩのLEDが視覚的フィードバックを提供します。内蔵の8MHz RC発振器はデフォルトで動作するため、外部クリスタルは不要です。
このセットアップは、ブリンクテスト、PWM実験、ファームウェア開発の初期段階で安定して機能します。生産用途や騒音に敏感な用途では、100 nFセラミックと並列に10μFのバルクコンデンサを追加し、過渡電流の需要に対応します。
よくある問題と実用的な解決策
| 問題点 | 根本原因 | 解 |
|---|---|---|
| ISPのアップロードが「デバイス署名の不一致」で失敗 | IDEで間違ったチップが選択されたり、外部クロックに設定されたヒューズがクリスタルが存在しない | 委員会選考の確認;ヒューズが故障している場合は、外部クロック信号をPB3に接続するか、HVPPを使って回復してください。 |
| ADCの読み取りがランダムにドリフトまたはジャンプします | 電源のノイズ、デカップリングコンデンサの欠如、または接地不良 | VCC/GNDに近いデカップリングを100 nF + 10 μFを加えると、ADCノイズリダクションモードを有効にする;アナログとデジタルのグラウンド経路が分離 |
| I²C/SPI通信が断続的に失敗する | USIタイミングの不正確、クロック速度の不一致、または外部プルアップの欠如(I²C) | 時計の選択とヒューズ設定を再確認してください;I²C用にSDA/SCLに4.7 kΩプルアップを追加;ファームウェアでバス速度を下げる |
| GPIOピンが何時間も動作した後に反応しなくなります | 電流制限を超えて駆動されたピン、または電圧スパイクにさらされている | LED抵抗値を確認してください。高電流負荷にはMOSFETをバッファし、ピンが外部ケーブルに接続されている場合、過渡保護(ダイオードまたはTVS)を追加してください |
| コードの動作速度が合わないか、タイミングがずれている | クロックヒューズの設定がArduino IDEのボード選択と一致しません | クロック設定を変更した後、ブートローダーをバーン(ヒューズをセット);スコープやロジックアナライザーで実際のクロック周波数を検証 |
RESETヒューズが誤って無効化されたとき:
RSTDISBLのヒューズを設定してISPアクセスを失うと、標準プログラマは動作しません。AVRドラゴン(生産終了ですが中古で入手可能)のような高電圧並列プログラマ(HVPP)や、Arduinoをベースにしたオープンソース設計が必要です。これにより、特定のピンを定義された状態で保持した状態でRESETピンに12Vが適用され、ヒューズ設定に関係なくチップはプログラミングモードに強制されます。回復は可能ですが、面倒で時間もかかります。
ATtiny85を使うべき時(そして使わないべき時)
フィット感:
- 簡単な制御タスク:LEDドライバー、センサーリーダー、小型ディスプレイ。
- 8ピンパッケージで基板面積を節約するスペース制約の設計。
- スリープモードを活用したバッテリー駆動アプリケーション(ウォッチドッグオフ時の電源停止時に~0.1μAまで)
- 単位あたりの1セントが大量に重要なコスト感度の高い設計。
フィット感が悪い:
- 複数のシリアル周辺機器を同時に必要とするアプリケーション(UART + SPI + I²C)では、ファームウェアの複雑さが爆発的に増加します。
- 高速通信またはタイトなタイミング要件 - USIやシングルスレッド実行に制限される。
- 開発速度がコストよりも重要であるプロジェクト;ATmega328PやSTM32に移行すると、ハードウェアUART、SPI、I²Cが手に入り、トラブルも少なくなります。
私はATtiny85をLED照明コントローラー、バッテリーモニター、IRリモート受信機でうまく使ったことがあります。しかし、プロジェクトの途中でUARTデバッグポートやSPIフラッシュロギングなど、大容量チップでは簡単でもATtiny85では厄介な機能が増えたため、途中で放棄してしまいました。
結論
ATtiny85は、サイズ、コスト、消費電力が主な制約であり、機能が明確に定義された限界内に収まる設計において依然として有用です。共通機能を持つ6つのGPIOピンは慎重なピン割り当てが必要であり、ソフトウェア駆動のUSIはハードウェア周辺機器よりもファームウェアの負荷がかかります。ADCの性能は電源設計に大きく依存し、GPIOの電流制限は実在します。超過するとピンは永久に故障します。
設計にコミットする前にヒューズ設定、RESETピンのトレードオフ、ISPのプログラミングワークフローを理解することで、高コストの高額な後期段階の予期せぬ事態を防ぎます。適切な用途であれば、ATtiny85は最小限のフットプリントで信頼性の高い制御を提供します。より複雑な場合は、ファームウェアの負担やハードウェアの制約がコスト削減を上回るかどうかを評価してください。