- 最終更新日
- 記事公開日
はじめてのATTINY!PICマイコンから乗り換えに挑戦

今回は、以前から気になっていた「ATTINY」を使ってみることにしました。
ATTINYは、Arduinoボードに載っているIC(マイコンチップ)部分だけを取り出したような存在。
USB端子やピンヘッダーが付いていない分、より小さなサイズで回路を構成できます。
これまで、回路をコンパクトにしたいときには、ATTINYのライバル的存在でもある古参のPICマイコンを使ってきました。
しかしPICは、初期設定などをビット指定で書く必要があり、Arduino系に比べると少し取っつきにくい。
しかも、書き込みの際には専用ライター「PICkit」が必要です。
そこで、安価な書き込み装置が使えて、コードの記述もArduino寄りで扱いやすいATTINYへ、PICからの乗り換えにチェレンジしてみました。
書き込みに必要なもの

※追記※
写真では、抵抗や積セラを配置していますが、これは書き込みエラー対策として一時的に設置していたものです。
実際には、パソコンを再起動したり、USBケーブルを抜き差しすると必ず書き込みエラーが発生してしまい、根本的な解決には至りませんでした。
最終的に、書き込みエラーが起きた際は、UPDIライターのPWRピンを一度抜き差しすることで確実に解消できることが分かったため、これらの部品は結果的に不要でした。
ATTINYを使用するために必要なものは以下の通りです。
- ATTINY IC
- 書き込み装置
抵抗(4.7kΩ)積層セラミックコンデンサ (0.1μF)- 変換基板 or ソケット
ATTINY IC
ATTINYにもいくつか種類がありますが、今回は以前よく使っていた「PIC12F683」と同じ8ピン構成の「ATTINY402」を選びました。
秋月電子で購入する場合、ATTINY402は1個70円。
一方、PIC12F683は1個250円ほどするので、かなりリーズナブルです。
ATTINY402とPIC12F683のスペック比較
| ATTINY402 | PIC12F683 | |
| コア | AVR | PIC |
| ROM | 4KB | 3.5KB |
| RAM | 256B | 128B |
| EEPROM | 128B | 256B |
| 動作電圧 | 1.8V~5.5V | 2.0V~5.5V |
| クロック | 20MHz | 20MHz |
| 値段 | 70円 | 250円 |
書き込み装置
ATTINY402にプログラムを書き込むためのUPDI通信ライターです。
※配線の取り違えに注意!
このUPDIライターは、購入時の状態では、GNDが「赤」、PWRが「黒」の配線になっています。
一般的な配線色とは逆になっているため、そのまま接続すると誤配線の危険があります。
安全のため、コネクタを一度引き抜き、ケーブルを逆向きに差し替えておくことをおすすめします。

画像の部分で端子がロックされていますので、この部分にピンセットなど先の細い工具を差し込んで持ち上げながらケーブルを引っ張ると、端子を傷めずに抜くことができます。
抵抗(4.7kΩ)
UPDIラインを安定化させるために、VDD - PA0間に4.7kΩのプルアップ抵抗を接続しておきます。
この抵抗が入っていないと、スケッチ書き込み時に、UPDI初期化エラーが発生する場合があります。
カーボン抵抗(炭素皮膜抵抗) 1/4W4.7kΩ - 秋月電子
積層セラミックコンデンサ (0.1μF)
電源ラインの電圧を安定化させるために、VDD -GND間に0.1μFの積層セラミックコンデンサを接続しておきます。
このコンデンサが入っていないと、スケッチ書き込み時に、UPDI初期化エラーが発生する場合があります。
積層セラミックコンデンサー 1μF50V X7R 5mm - 秋月電子
変換基板 or ソケット

1.27mmピッチのICのため、ブレッドボードで実験する際は2.54mmピッチの変換基板に実装しておくと便利です。
SOP8(1.27mm)DIP変換基板 金フラッシュ - 秋月電子
プリント基板などに実装する場合は、ソケットを使って、プログラムを書き込みます。
スケッチを書き込むための配線図

UPDIライターをATTINY402に接続します。

- UPDI - PA0(6Pin)
- VCC - PWR
- GND - GND
配線が完了したら、UPDIライターをUSB Type-Cケーブルでパソコンと繋ぎます。
パソコンのデバイスマネージャー(Windowsアイコンを右クリック)を開き、ポート(COMとLPT)のところに「USB-SERIAL CH340(COM●)」と表示されていれば、正常に認識されています。
※COM●の番号は、環境によって異なります。

もし、USBが認識されない場合は、主な原因として以下の2つが考えられます。
① CH340ドライバーが未インストール
パソコンが、シリアル通信を行うための変換チップ「CH340」を正しく認識するには、専用ドライバーが必要です。
下記リンクから CH340ドライバーをダウンロードしてインストールし、パソコンを再起動してください↓
https://www.wch.cn/downloads/CH341SER_EXE.html
②USB変換ケーブルを使用している場合
私の環境では、USB Type-CをType-Aに変換するケーブルを使用すると、正常に認識されませんでした。
もしかすると、この変換ケーブルが充電専用のものだった可能性もあります。
データ通信に対応した変換ケーブルであれば認識されるかもしれませんが、未確認です。
プログラム(Lチカ)
LEDを点灯するだけのテストプログラムです。
void setup() {
pinMode(PIN_PA3, OUTPUT);
}
void loop() {
digitalWrite(PIN_PA3, HIGH);
delay(500);
digitalWrite(PIN_PA3, LOW);
delay(500);
}
Arduino IDEの設定
Arduino IDEを開き、上部メニューの[ファイル]-[基本設定]を開きます。
「追加のボードマネージャ―のURL」に下記のURLを入力し、「OK」をクリックします。
https://descartes.net/package_drazzy.com_index.json

上部メニューの[ツール]内を以下のように設定します。
- ボード:ATtiny412/402/212/202
- ポート:COM●(※環境によって異なります)
- 書き込み装置:SerialUPDI – 230400 baud

あとは書き込みボタンをクリックして、下記のようなログが表示されれば、データの書き込みは正常に完了しています。
Action took 0.01s
Writing from hex file...
Writing flash...
[ ]
[======= ] 1/7
[============== ] 2/7
[===================== ] 3/7
[============================ ] 4/7
[=================================== ] 5/7
[========================================== ] 6/7
[==================================================] 7/7
Action took 0.09s
Verifying...
Verify successful. Data in flash matches data in specified hex-file
Action took 0.03s
Lチカ確認
OLEDディスプレイ表示


#include <Wire.h>
#include <SSD1306Ascii.h>
#include <SSD1306AsciiWire.h>
#define OLED_ADDR 0x3C
SSD1306AsciiWire oled;
void setup() {
Wire.begin();
Wire.setClock(100000L);
oled.begin(&Adafruit128x32, OLED_ADDR);
oled.setFont(System5x7);
oled.clear();
oled.println("Hello OLED!");
}
void loop() {}
I2C通信でOLEDディスプレイに文字を表示します。
- SCK(SCL) → PA2(5ピン)
- SDA → PA1(4ピン)
使用したディスプレイは、以下になります↓
書き込みエラーの対処法
もし書き込みの際に、下記のようなエラーが発生した場合。
pymcuprog.pymcuprog_errors.PymcuprogError: UPDI initialisation failed
Failed programming: uploading error: exit status 1
UPDIライターのPWRピンを一度抜き差ししてみてください。
もっと根本的な対策法が分かれば良いのですが、今のところ抜き差し以外の対処法は見つかっていません。
私の環境では、パソコンの電源を落としてしまうと、次の起動時には必ず書き込みエラーが発生し、ブレッドボードに差してるPWRピンを抜き差ししないと、正常に書き込むことができません。


