Arduino と ATtinyを使って I2C Slaveデバイスを作ってみる (1) 準備編

![top](http://img3.dfm.lrv.jp/attiny-i2c/advent.png)

## めりーくりすまーす!

世の中IoTとかAIとか騒がしいですね！
ArduinoとATtinyでI2Cデバイスとか作れば、たぶんIoTで使えるよね？使おうね？（強引）という記事です。

ちょっと長くなりそうなので、今回は準備編として環境構築からLチカまで。
次回、LチカからI2Cへの対応、という感じで2回に分けて書こうと思います！

### 今回の内容

- ATtinyとは?
- 用意するもの(Lチカまで)
- Step.1 : Arduino IDEに ATTinyCore をインストール
- Step.2 : Arduino UNO へ ArduinoISP スケッチを書き込む
- Step.3 : ISP書き込み回路をつくろう
- Step.4 : ATtinyにLチカするスケッチを書き込もう

## ATtinyとは?

[ATtiny](http://www.atmel.com/products/microcontrollers/avr/tinyavr.aspx)とは、ATMEL社 (現在はMicrochip社に吸収) が開発しているマイクロプロセッサシリーズの名称です。AVRシリーズの中でピン数やROM/SRAM容量などが少なく消費電力の小さなシリーズで、様々な品種があります。

少し前の記事ですが、[『ArduinoユーザーのためのATTiny入門』](https://qiita.com/tadfmac/items/3a42a641531f2c3679a1) で、いくつかATtinyの紹介をしましたので、参考にしてください。

> ***新し目のATtinyは注意***
>
>[『ArduinoユーザーのためのATTiny入門』](https://qiita.com/tadfmac/items/3a42a641531f2c3679a1) で紹介した ATtiny85や ATtiny44などは今も使いやすくておすすめです。
>
>一方で、下記新し目のATtinyは **今のところArduinoで使えない(使うには相当な苦労が必要...)** なので、あまりオススメできません。
>[AVRFreaks](http://www.avrfreaks.net/) に集う方々であれば止めませんがw
>
> - [ATtiny102/ATtiny104](http://ww1.microchip.com/downloads/en/DeviceDoc/Atmel-42505-8-bit-AVR-Microcontrollers-ATtiny102-ATtiny104_Datasheet.pdf)
> - [ATtiny417/ATtiny814/ATtiny816/ATtiny817](http://www.atmel.com/Images/Atmel-42721-ATtiny417-814-816-817_Complete.pdf)
>
> なかでもATtiny417のシリーズは従来のAVRと比べて凄い機能が搭載されています。早く対応したCoreが出ると良いのですが、いろいろ変わりすぎていて簡単にはいかなそうな気がします。

数あるATtinyの中から今回は [ATtiny85-20PU](http://www.atmel.com/ja/jp/Images/Atmel-2586-AVR-8-bit-Microcontroller-ATtiny25-ATtiny45-ATtiny85_Datasheet-Summary.pdf) を使いたいと思います。

8ピンDIPという少ピンでありながらクリスタルレスで16.5Mhz動作もできるのが特徴です。
秋月電子やaitendoでも買え、非常に作例も多いので応用もしやすいでしょう。

- [ATtiny85-20PU 秋月電子で1個¥160](http://akizukidenshi.com/catalog/g/gI-09573/)

## 用意するもの(Lチカまで)

- PCとArduino IDE (私は Macと ちょっと古い IDE v1.6.13 を使いました。IDEは最新の1.8系でも良いはずです) とインターネット環境 (この記事が読めているなら十分!)
- Arduino UNO R3 あるいは互換機([こういうのでも](https://www.marutsu.co.jp/pc/i/605620/#item_description))とUSBケーブル x 1
- [ATtiny85-20PU](http://akizukidenshi.com/catalog/g/gI-09573/) x 1
- ブレッドボード x 1
- ジャンパーケーブル少々
- 10uFコンデンサ x 1
- LED x 1
- 100Ω〜1kΩくらいの抵抗 (ようするにLEDの電流制限用) x 1

## Step.1 : Arduino IDEに ATTinyCore をインストール

まずはじめにArduino IDEにATtinyに対応した拡張機能をインストールします。

今回は2017年の今でも活発に開発が進められている [SpenceKonde/ATTinyCore](https://github.com/SpenceKonde/ATTinyCore) を使うことにします。

ATTinyCoreのインストール方法は、下記に記載があります。

https://github.com/SpenceKonde/ATTinyCore/blob/master/Installation.md

今回は BoardManager を使ったインストールを行ってみます。

#### 1. Preferences の `Additional Boards Manager URLs` に `http://drazzy.com/package_drazzy.com_index.json` を入力

![preference](http://img3.dfm.lrv.jp/attiny-i2c//f1.png)


#### 2. Tools > Board > Board Manager から、ATTinyCore を選択してインストール

![board Manager](http://img3.dfm.lrv.jp/attiny-i2c//f2.png)

これで、Arduino IDEから ATtiny85 などの開発が行えるようになりました！

## Step.2 : Arduino UNO へ ArduinoISP スケッチを書き込む

次に Arduino UNOを書き込み機として利用するために、Arduino IDEのexampleに用意されている「ArduinoISP」というスケッチをArduino UNOに書き込みます。

#### 1. Arduino UNOのポートを選ぶ

Arduino UNOをUSBケーブルでPCに繋いで、Arduino IDEを起動してから、`Tools > Port` から、`(Arduino/Genuino UNO)` と書かれたデバイスを選択してください。

これで、スケッチの書き込み先に Arduino UNO が選択されました。

続いて`Tools > Board` でも、`Arduino/Genuino UNO`を選びます。

これで、書き込むスケッチが、`Arduino/Genuino UNO`用にビルドされるようになりました。

#### 2. スケッチ「ArduinoISP」を開いてArduino UNOへ書き込み

次に、ArduinoISPを開きます。これは、`File > Examples > 11.ArduinoISP` の中にあります。

![ArduinoISPのありか](http://img3.dfm.lrv.jp/attiny-i2c//f3.png)

ArduinoISPスケッチを開いたら、Arduino UNOへ書き込んでおきます。

![これを押す](http://img3.dfm.lrv.jp/attiny-i2c//f7.png)
↑これを押すと書き込めます!

この瞬間にArduino UNOは書き込み機に変貌したわけです。

## Step.3 : ISP書き込み回路をつくろう

一旦ここで、Arduino UNO と PCの間のUSBケーブルを抜いてArduino UNOの電源を落とします。

次は、Arduino UNOとブレッドボードを使って ATtinyに書き込むための配線を行います。
とりあえず、下図のように配線してみてください。

![schematic-ISP](http://img3.dfm.lrv.jp/attiny-i2c//schematic-isp.png)

- Arduino UNO D10 → ATtiny85 1番PIN
- Arduino UNO D11 → ATtiny85 5番PIN
- Arduino UNO D12 → ATtiny85 6番PIN
- Arduino UNO D13 → ATtiny85 7番PIN
- Arduino UNO Reset → コンデンサ(10uF)の +側 （-側を GND）
- Arduino UNO 5V → ATtiny85 8番PIN
- Arduino UNO GND → ATtiny85 4番PIN

この回路は、Arduino UNOと ATtiny85を SPIで繋いで [ISP(In System Programming)](https://ja.wikipedia.org/wiki/In-System_Programming) を行う回路です。加えて、動作確認用のLEDもついています。

## Step.4 : ATtinyにLチカするスケッチを書き込もう

回路ができたら、Arduino UNOのUSBケーブルをPCと接続してください。
再度、Arduino IDEを起動しましょう。

#### 1. Arduino UNOのポートを選ぶ

先ほど同様にポートはArduino UNOを選びます。
次に、ボードの設定ですが、先ほどと違って今度は ATtiny85を選びます。
まず、`Tools > Board`から`ATtiny25/45/85`を選びます。

次に、マイコンの種類とClockを選びます。マイコンは`ATtiny85`、クロックは`8 Mhz (internal)`を選んでおいてください。

![Board設定](http://img3.dfm.lrv.jp/attiny-i2c//f4.png)

これで、Arduino UNOの書き込み機を使って ATtiny85に書き込む設定ができました。

#### 2. スケッチを書き込む前に

スケッチを書き込む前に、1度だけ`Burn Bootloader`を実行します。

> ATtiny85ではブートローダー（プログラムの書き込み等に使うプログラム）は利用しません。
> では、なぜこのコマンドを実行するか? というと、`Burn Bootloader` の実行により、ATtinyへ`Fuse Bit`というものを設定しているからです。
>
> ここではマイコンの動作クロックの設定などを行なっています。
> 
> 参考：[『始める電子回路』/ 始めるAVR / ヒューズ設定 ](http://startelc.com/AVR/Avr_3Wfuse.html) 

これは1度だけ実行すればOKです。

#### 3. いよいよスケッチを書き込もう!

さて、いよいよ本番、本編の最終章 LチカのプログラムをATtiny85に書き込んでみましょう。
Arduino IDEで下記スケッチを適当な名前で保存しておきます。

```cpp
#define LED_PIN 3

void setup() {
  pinMode(LED_PIN,OUTPUT);
}

void loop() {
  digitalWrite(LED_PIN,HIGH);
  delay(1000);
  digitalWrite(LED_PIN,LOW);
  delay(1000);
}

```

続けて、このスケッチを、ATtinyに書き込みます。
通常のArduino IDEでの書き込み同様、→ ボタンを押すだけ。

![これを押す](http://img3.dfm.lrv.jp/attiny-i2c//f7.png)
↑これを押すと書き込めます!

こんな感じでLチカできたら成功です!

![blink](http://img3.dfm.lrv.jp/attiny-i2c//blink.gif)

> ***ATtiny85のピン番号について***
> ATtiny85は、Arduino UNOに使われている ATmega328Pより見るからにピンが少ないです。
> ですので、例えば Arduino UNOでLチカといえば、D13 が定番だったりしますが、今回はATtiny85用にD3に変更しています。
> ATtiny85で利用可能なピン番号(ATtinyCoreの場合)は下記を参照してください。
> https://camo.githubusercontent.com/081b569122da2244ff7de8bae15eb56947d05cc8/687474703a2f2f6472617a7a792e636f6d2f652f696d672f50696e6f7574543835612e6a7067


## まとめ

今回は、Arduino UNOを使ってATtiny85へのプログラミングを書き込んでLチカするところまでやってみました！
Arduinoを使って、ATtinyなど小さなマイコンの開発ができるようになると、小さなデバイスも作り放題です！
次回は、いよいよ、I2Cに対応したデバイスを作ってみます〜。お楽しみに！

> 次回はいつだろう?? ...