Arduinoその他工作

ラズパイ(Raspberry Pi)を使って生のArduinoを開発! ラズパイでAVR(ATtiny85)をコンパイル

ラズパイ(Raspberry Pi)とArduinoは互いの弱点をカバーし合う相棒のような関係です。
ラズパイは1GHz前後のクロック周波数と多くのメモリを持ち、ネットワークを介した通信や豊富な周辺機器など、外観は「マイコンボード」ですが、その中身は「パソコン」と変わりません。一方でアナログ信号の処理やタスク処理のリアルタイム性など本来の「マイコンボード」に求められる機能ではArduinoに軍配が上がります。

Arduinoは電子回路との相性が良いので、電子機器に組み込んで使用したいと考える方は多いでしょう。
ところがArduinoボードは電子工作や電子機器の試作には手軽で便利な一方、機器に組み込んで使用するには少し大きいマイコンボードです。
そこで今回はArduinoボードに搭載されているマイコンと同系列の小型で低価格なATtiny85(マイコン)を使用する方法を解説します。ATtiny85の開発はラズパイで行います。

 

目次

  1. マイコン「ATtiny85」とは
  2. ATtiny85の消費電力
  3. ATtiny85のピン構成
  4. ATtiny85にプログラムを書き込む
  5. ATtiny85のUSBポートは?
  6. ラズパイを使ってATtiny85にプログラムを書き込む
    1. 6.1. 準備
    2. 6.2. ラズパイでSPI通信を許可
  7. Arduino IDEでATtiny85用のプログラムをコンパイルする準備
  8. 定番の「Blink」サンプルをATtiny85で実行する
    1. 8.1. サンプルスケッチをATtiny85用に修正
    2. 8.2. スケッチをATtiny85用にコンパイル
  9. ラズパイにATtiny85を接続
    1. 9.1. ブレッドボードにATtiny85を配置
    2. 9.2. 電源ピンの接続
    3. 9.3. 抵抗の配置
    4. 9.4. SPI通信とリセットピンをラズパイに接続
    5. 9.5. LEDをATtiny85に接続
  10. avrdudeを使ってラズパイからプログラムを書き込む
    1. 10.1. avrdudeのインストール
    2. 10.2. 接続のテスト
    3. 10.3. プログラムの書き込み
  11. まとめ

 

1. マイコン「ATtiny85」とは

ATtiny85はAVRマイコンと呼ばれる製品ファミリーの中の一つです。Arduinoボードに実装されているマイコンも同じ製品ファミリーです。
ATtiny85は小型で低消費電力が特徴のマイコンで入手も容易です。

初期状態ではATtiny85のクロック周波数は1MHzに設定されています。1GHz前後のクロック周波数を持つラズパイとは大違いです。ラズパイは複数のタスクを同時に処理するために高速なCPUを必要としますが、決められたタスクを正確に繰り返すことが目的のマイコンであれば1MHzのクロック周波数でも十分な速度です。

もし1MHzのクロック周波数では処理しきれないタスクを行う場合は、内蔵クロックは8MHzまでとし、水晶発振器を外付け(外部クロック)すれば20MHzまでクロック周波数を高速化できます。

 

2. ATtiny85の消費電力

ATtiny85の動作電圧は2.7V〜5.5Vです。ラズパイの動作電圧は3.3Vなので組み合わせて使用する場合でも「電圧レベル変換」の心配なく接続できます。
ただしATtiny85は動作電圧が下がると使用できる最大クロック周波数が下がります。

データーシートの「安全動作領域(Safe Operating Area)」によると、クロック周波数20MHzで動作するのは電源電圧が4.5V以上の場合です。また、ATtiny85を2.7Vで動作させた場合の最大クロック周波数は10MHzで、動作電圧が2.7Vから4.5V間のクロック周波数は10MHzから20MHzまで電圧に比例します。

ATtiny85には1.8Vから動作する製品もありますが、1.8V時の最大クロック周波数は4MHzで、動作電圧が1.8Vから2.7V間のクロック周波数は4MHzから10MHz間となり電圧に比例します。
ただし、クロック周波数が遅ければ消費する電力も減少するので、電池で駆動する電子機器など長時間動作させたい場合は、可能な限り電圧を落として動作周波数を下げるのも有効です。

 

3. ATtiny85のピン構成

ATtiny85は小型のマイコンなので多くのピンを持ちません。8本のピンがあり、そのうち2本は電源とグランド、3本目はリセットです。残る5本が入出力ピンとして機能します。

以前の記事、「ラズパイのGPIOを再確認! まずは汎用入出力からマスターしよう」で紹介したようにラズパイには多くの入出力ピンがあります。しかし、ラズパイにはアナログ信号を読み書きするピンがないので、ATtiny85などのマイコンはこうした弱点を補う目的でも利用できます。
例えばATtiny85の5本の入出力ピンのうち2本をI2Cバスに使用してラズパイと接続すれば3本のピンが残ります。2本はアナログ信号を読み取るためのA/D変換、もう1本はPWM信号の出力として使用すればラズパイの機能を補完できます。
入出力ピンにはこれ以外にも機能が割り当てられています。詳細はデーターシートを確認してください。

 

4. ATtiny85にプログラムを書き込む

ATtiny85はAVRマイコンの一つで、Arduinoボードに実装されているマイコンと同じ製品ファミリーです。
Arduinoの開発で使用しているArduino IDEでATtiny85向けのプログラムをコンパイルすることができるので、今までにArduinoで作成したスケッチのほとんどが、そのまま利用できます。

ただしArduinoとATtiny85のハードウェア構成が異なるため修正が必要なケースもあります。
例えばI2Cバスを使った通信を行うスケッチではWireライブラリーを使用しましたが、ATtiny85の場合はTinyWireライブラリーを使用します。

また、ATtiny85はプログラムを格納するフラッシュメモリが8kバイトしかないので、Arduinoより相当コンパクトなソースコードにする必要があります。

 

5. ATtiny85のUSBポートは?

Arduinoでは作成したスケッチArduinoボードに簡単に転送できます。USBケーブルでパソコンとArduinoボードを接続してArduino IDEの「書き込みボタン」を押すだけです。
しかし当たり前ですが、ただのマイコンであるATtiny85にはUSBポートはありません。8本のピンを使ってプログラムを転送しなければなりません。

作成したプログラムは以下の手順でATtiny85に転送します。
最初に電源ピンとグランドピンを接続します。続いてリセットピンをLOWレベルに落とすとプログラムを書き込めるようになります。プログラムはMOSI、MISO、SCKの3本のピン(3線式)を使ったSPI通信で転送します。

この作業を簡単にするAVRプログラマが1,000円から2,000円程度で販売されています。もしATtiny85などのAVRマイコンに何度もプログラムの書き込みを行うのであれば購入をお勧めします。
実はこのATtiny85へのプログラムの書き込みですが、SPIを使えばArduinoで書き込むことができます。この方法はArduinoの公式マニュアル(英語)にも記載されています。
もちろんラズパイもSPI通信に対応しているのでATtiny85へのプログラムの書き込みを行えます。本記事ではこの方法を紹介します。

 

6. ラズパイを使ってATtiny85にプログラムを書き込む

USBポートを持たない8ピンのマイコン、ATtiny85にプログラムを書き込むには3線式のSPI通信を使用します。
ラズパイもSPI通信に対応しているので、本記事ではラズパイを使ってATtiny85にプログラムを書き込む方法を説明します。

ターミナル上でコマンドを実行してプログラムを書き込むので、ラズパイにSSH接続やリモート接続しながら普段使っているパソコンとArduino IDEでATtiny85の開発ができます。もちろんラズパイにインストールしたArduino IDEでも開発は可能です。

SPI通信を使ったことがない方のために、アナログ・デバイセズのWebページに詳細な解説があります。「SPIの基本を学ぶ」を参考にしてください。

6.1. 準備

以下のものを用意してください。

ラズパイ本体

raspberrypi-python-music-player-01

 

ブレッドボード

raspberrypi-gpio-06

 

GPIO拡張基板
スイッチサイエンス製(互換可)

0201-03

 

LED
色は何でも可

how-to-find-out-when-plants-need-watering-with-soil-sensor-ver2-05

 

抵抗
1kΩ×4本

how-to-control-led-with-arduino-pwm-01

 

抵抗
330Ω(LEDの破損防止用)

how-to-control-led-with-arduino-pwm-01

 

ATtiny85
AVRマイコン

using-raspberry-pi-to-program-attiny85-01

 

8ピンICソケット

using-raspberry-pi-to-program-attiny85-02

 

8ピンICソケットはなくても構いません。ただし、マイコンを使った開発は何度もプログラムを書き換えなければならないことが多く、そのたびにATtiny85を抜き差しします。ブレッドボードに直接ATtiny85を挿すより8ピンICソケットを使ったほうがピンに与えるダメージは軽減できます。

GPIO拡張基板に関してAdafruit製(海外)やスイッチサイエンス製(国内)が入手しやすそうです。
ほかにもさまざまな製品が販売されているので皆さんの使いやすいものを探してみるのも良いでしょう。

上記に加えてブレッドボード用のジャンパーワイヤが必要です。
ラズパイで作業するためにディスプレイ、USBキーボードとマウスを使用します。リモート接続ができる場合は不要です。

6.2. ラズパイでSPI通信を許可

ラズパイの初期設定ではSPI通信の機能は無効になっています。
最初にraspi-configでSPI通信を有効にします。以下のコマンドを入力してください。

sudo raspi-config

[Interface Options] ≫ [SPI]と進み「Yes」を選択します。設定は以上です。
ラズパイの再起動後、SPI通信が有効になります。以下のコマンドでラズパイを再起動してください。

sudo reboot

 

7. Arduino IDEでATtiny85用のプログラムをコンパイルする準備

Arduino IDEを使ってATtiny85用のプログラムをコンパイルします。Arduino IDEは「普段使用しているもの」「ラズパイにインストールしたもの」のいずれも利用できます。

初期状態のArduino IDEはATtiny85に対応していません。以下の手順でArduino IDEにATtiny85の開発環境を追加します。

Arduino IDEを起動します。
[ファイル] ≫ [環境設定]の「追加のボードマネージャのURL」に以下のURLをコピー&ペーストしてください。
もしURLを入力するテキストボックスが見つからない場合はArduino IDEのバージョンが古い可能性があります。Arduinoの公式サイトから最新のバージョンをインストールしてください。

https://raw.githubusercontent.com/damellis/attiny/ide-1.6.x-boards-manager/package_damellis_attiny_index.json

「OK」ボタンを押して設定画面を閉じます。
続いて[ツール] ≫ [ボード] ≫ [ボードマネージャ]を選択します。環境によっては「ボード」メニューが「ボード: “Arduino Uno”」のようにArduinoボードの名称になっている場合もありますが問題はありません。

using-raspberry-pi-to-program-attiny85-03

ボードマネージャを選択

 

「ボードマネージャ」画面を下までスクロールして「attiny」を選択し「インストール」ボタンを押します。

using-raspberry-pi-to-program-attiny85-04

ボードマネージャで「attiny」を選択

 

再度「ツール」メニューを開くと「ボード: “ATtiny25/45/85”」が選択できるようになります。その下は「プロセッサ: “ATtiny85”」「CLock: Internal 1 MHz」となるようにそれぞれサブメニューから選択してください。

using-raspberry-pi-to-program-attiny85-05

ツールメニュー

 

以上でコンパイルの準備が整いました。

 

8. 定番の「Blink」サンプルをATtiny85で実行する

Arduino IDEにはさまざまな用途のサンプルスケッチが数多くインストールされています。本記事ではその中の一つであるBlinkサンプルをATtiny85用に改修して実行します。

8.1. サンプルスケッチをATtiny85用に修正

Blinkサンプルを開きます。
[ファイル] ≫ [スケッチ例] ≫ [01. Basics]の中の「Blink」を選択してください。このスケッチは若干の修正でATtiny85用にコンパイルできます。

このスケッチは、Arduinoボード上に実装されているLEDがつながるピン番号を指定するために定数LED_BUILTINを3個所使用しています。
当然ですがATtiny85にLEDは実装されていないため、このスケッチはそのままの状態では動作しません。
そこでATtiny85の何番ピンにLEDを接続するか決め、その番号で3個所のLED_BUILTINを置き換えます。お勧めは3番ピンです。3番ピンはプログラムを書き込むためのSPI通信用の配線を行っても空いているので手軽な動作検証のピンに使用できます。

以下が修正後のスケッチです。

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

// the loop function runs over and over again forever
void loop() {
    digitalWrite(3, HIGH);   // turn the LED on (HIGH is the voltage level)
    delay(1000);             // wait for a second
    digitalWrite(3, LOW);    // turn the LED off by making the voltage LOW
    delay(1000);             // wait for a second
}

このスケッチをBlink85の名前で保存します。

8.2. スケッチをATtiny85用にコンパイル

スケッチをそのままATtiny85に送ることはできません。コンパイルして人間が読み書きできる状態のソースコードから、マイコンが読み込めるHEXファイルと呼ばれる形式に変換します。
メニューから[スケッチ] ≫ [コンパイルしたバイナリを出力]を選択します。ファイル保存ダイアログが表示されるので、適当なディレクトリに「Blink85.ino.tiny8.hex」の名前で保存してください。
このBlink85.ino.tiny8.hexがHEXファイルと呼ばれるファイルで、ATtiny85に転送できる状態のファイルです。

本記事ではラズパイからHEXファイルをATtiny85に転送します。
作成したHEXファイル(Blink85.ino.tiny8.hex)をラズパイのホームディレクトリにコピーしておきます。

 

9. ラズパイにATtiny85を接続

ラズパイを使ってHEXファイルをATtiny85に転送します。
以下の手順でラズパイとATtiny85を接続してください。

9.1. ブレッドボードにATtiny85を配置

GPIO拡張基板を使ってラズパイとブレッドボードを接続します。
8ピンICソケットを持っている場合は、先にATtiny85を8ピンICソケットに差し込みます。以降はこの状態を単に「ATtiny85」と呼びます。
ATtiny85を以下の図のようにブレッドボードに挿します。

using-raspberry-pi-to-program-attiny85-06

ATtiny85をブレッドボードに配置

 

ATtiny85の表面(型番が記載されている面)には小さな丸印があるはずです。この丸印のついているピンが1番ピンです。ピン番号は丸印から始まって反時計回りに2番、3番、…、8番と一周します。
ATtiny85はGPIO拡張基板から数列離して1番ピンが右上に来るように配置してください。

9.2. 電源ピンの接続

ラズパイの3.3Vピンをブレッドボードの電源ライン[+]に、GNDピンを電源ライン[-]に接続します。

続いてATtiny85の4番ピンを電源ライン[-]に、8番ピンを電源ライン[+]に接続します。

using-raspberry-pi-to-program-attiny85-07

ATtiny85に電源を接続

 

9.3. 抵抗の配置

SPI通信やリセットの配線が短絡(ショート)した際に回路を保護するために抵抗を配置します。
ATtiny85のSPI通信に使用するピンは電源ピン(8番ピン)と並んだ3本です。以下の図のように1kΩの抵抗をそれぞれのピンに接続します。抵抗のもう一端はATtiny85の左側、空いているスペースに挿します。

using-raspberry-pi-to-program-attiny85-08

抵抗を接続(1)

 

リセットピンにも1kΩの抵抗をつなげましょう。リセットピンは1番ピンです。この抵抗も以下の図のようにもう一端はATtiny85の左側に挿します。

using-raspberry-pi-to-program-attiny85-09

抵抗を接続(2)

 

書き込みには直接関係しませんが、点滅させるLEDの電流制限抵抗もここで配置します。LEDを接続するピンは3番ピンです。「3番ピン === LED === 抵抗 === 電源ライン[-]」となるように、LEDのスペースを空けて330Ωの抵抗を配置します。以下の図を参考にしてください。

using-raspberry-pi-to-program-attiny85-10

抵抗を接続(3)

 

9.4. SPI通信とリセットピンをラズパイに接続

SPI通信用の3本のピンとリセットピンにつなげた抵抗の一端をラズパイに接続します。
ラズパイのSPIピンは公式マニュアル(英語)を参照してください。
ATtiny85の7番ピンはSCLKです。7番ピンにつながる抵抗の一端をラズパイのSCLK(GPIO11)に接続します。

using-raspberry-pi-to-program-attiny85-11

SPIとリセットをラズパイに接続(1)

 

ATtiny85の6番ピンはMISOです。6番ピンにつながる抵抗の一端をラズパイのMISO(GPIO09)に接続します。

using-raspberry-pi-to-program-attiny85-12

SPIとリセットをラズパイに接続(2)

 

残るATtiny85の5番ピンはMOSIです。5番ピンにつながる抵抗の一端をラズパイのMOSI(GPIO10)に接続します。

using-raspberry-pi-to-program-attiny85-13

SPIとリセットをラズパイに接続(3)

 

最後に、ラズパイのGPIO22をATtiny85の1番(リセット)ピンに接続します。

using-raspberry-pi-to-program-attiny85-14

SPIとリセットをラズパイに接続(4)

 

9.5. LEDをATtiny85に接続

LEDをブレッドボードに挿します。長い方の端子(アノード)をATtiny85の3番ピンに接続、短い方の端子(カソード)は330Ωの抵抗に接続します。

using-raspberry-pi-to-program-attiny85-15

LEDをATtiny85に接続

 

10. avrdudeを使ってラズパイからプログラムを書き込む

ラズパイとATtiny85の接続が完了したらプログラムの書き込みを行います。

プログラムの書き込みにはavrdudeと呼ばれるコマンドを使用します。
avrdudeにはさまざまなバージョンがあります。本記事で使用するのはkevincuzner.comで配布しているavrdudeです。
すでにラズパイにavrdudeがインストールされている場合でも次の手順に従ってください。

10.1. avrdudeのインストール

最初にラズパイのOSを最新の状態にアップデートし、avrdudeの実行に必要なアプリケーションをインストールしておきます。
以下のコマンドを順次入力してください。

sudo apt update && sudo apt upgrade -y
sudo apt install bison automake autoconf flex gcc-avr binutils-avr avr-libc -y

OSのアップデートとavrdudeの実行に必要なアプリケーションのインストールが完了したら、avrdudeのインストールを行います。
以下のコマンドでavrdudeのソースコードをダウンロードします。

git clone https://github.com/kcuzner/avrdude

ダウンロードしたソースコードの中にインストール用のスクリプトが入っています。
以下のコマンドを順番に入力することでインストールを進めます。

cd avrdude/avrdude
./bootstrap
./configure
sudo make install

以上でavrdudeのインストールは完了です。

10.2. 接続のテスト

ATtiny85にプログラムを書き込むためには、リセットピンをLOWレベルに落とす必要があります。
ATtiny85のリセットピンはGPIO22に接続しました。ここでgpioコマンドを使用してGPIO22をLOWレベルに設定します。

sudo gpio -g mode 22 out
sudo gpio -g write 22 0

それでは接続のテストをします。以下のコマンドを入力してください。

sudo avrdude -p t85 -c linuxspi -P /dev/spidev0.0 -b 10000

コマンドに指定するオプションは以下の通りです。

  • -p t85はマイコンの型番号の指定です。ATtiny85を意味します。
  • -c linuxspiはラズパイのSPI通信を使うことを意味します。
  • -P /dev/spidev0.0はSPI通信に使用するバス番号です。SPI0を使用することを意味します。
  • -b 10000は通信速度の指定です。

接続が問題なく、ラズパイとATtiny85が正しく通信できたら以下のようなメッセージが表示されます。

using-raspberry-pi-to-program-attiny85-16

プログラム書き込みのテスト

 

10.3. プログラムの書き込み

これでATtiny85にプログラムを書き込む準備が整いました。
以下の手順でArduino IDEで作成したプログラム(HEXファイル)をATtiny85に転送しプログラムの書き込みを行います。

最初にHEXファイル(Blink85.ino.tiny8.hex)を保存したディレクトリに移動します。以降はHEXファイルをホームディレクトリに保存した場合の手順です。

cd ~

avrdudeを使ってHEXファイルを転送します。先ほどのテストで使用したコマンドと似ていますが、今回は転送するファイル名(Blink85.ino.tiny8.hex)が加わります。

sudo avrdude -p t85 -c linuxspi -P /dev/spidev0.0 -b 10000 -U flash:w:Blink85.ino.tiny8.hex

最後にリセットピンをHIGHにして、ATtiny85にプログラムの転送が終了したことを伝えます。以下のコマンドを入力してください。

sudo gpio -g write 22 1

LEDが点滅を始めたら成功です。
もし上手くいかない場合は以下の点を確認してください。

  • 配線は正しいか?
  • LEDの故障は考えられないか?
  • SPI通信を有効にしたあとでラズパイを再起動したか?
  • Arduino IDEで正しくHEXファイルを作成したか?

 

11. まとめ

今回はAVRマイコンの一つであるATtiny85を試してみました。ATtiny85の構造はArduinoボードに使用されているマイコンとよく似ています。
そのため、ハードウェア構成の違いに注意すればArduinoで作成した電子工作のスケッチが流用できます。

ATtiny85は8本ピンのマイコンなので、電源・グランドとリセットを除けば利用できるピンは5本しかありません。しかし、その5本のピンだけでもSPIPWM、A/D変換などの機能を搭載しているので、工夫次第で低コストで実用的な電子工作で活躍させることができます。
ラズパイの弱点であるアナログ信号の扱いをATtiny85に任せるような使い方も考えられます。
ATtiny85は入手も手軽なので、ぜひ皆さんも面白い利用方法を見付けてください。

電子工作マニュアル Vol.2
Device Plus 編集部

エレクトロニクスやメカトロニクスを愛するみなさんに、深く愛されるサイトを目指してDevice Plusを運営中。

https://deviceplus.jp