LoginSignup
1
8

More than 3 years have passed since last update.

AVRマイコンをPlatformIOで使う

Last updated at Posted at 2018-08-19

免責

この記事に従って発生した如何なる損害も筆者は負うことができません。ご免なさい。

目標

秋月電子通商さんで手軽に買えるAVRマイコンをコンソールなどCUI/CLIでArduino風に取り扱える環境を整えたいです。この記事ではATtimy13Aを例にしています。
私は今のところATmega328P、ATmega88V、ATtiny2313、ATtiny85、ATtiny13Aを使って、この環境で遊んでいます。

準備するもの

Debian/Ubuntu環境

どちらかを用意してください。いわゆるlinuxです。
まだWindowsで、この記事と同じことをする方法は書けていません。ただしVirtualBox使えば解決。
あるいは、Arduinoを使う場合だけWSLも使えるようです。

  • パソコン (VirtualBoxでも可)のDebian/Ubuntu
  • RaspberryPiなどのLinuxBoxのDebian/Ubuntu

AVRライター

どれか、ひとつ以上を用意してください。私は専用AVRライターを持っていないので紹介できません。ごめんなさい。

AVRマイコンと電子工作DIYセット

これらは必要最低限のものです。デジタルトランジスタやスイッチがあると、より楽しいです。

  1. AVRマイコン (ATtiny13A)
  2. ブレッドボードとワイヤ
  3. 抵抗入りLED(もちろんLEDと抵抗(220Ω以上かな)でも可) (抵抗入りLED)

動かすモノ

動かす回路

D1ピンにLEDを直接つないでLチカをします。図ではLEDと抵抗が別になっていますが、抵抗入りLEDの方が簡単で省スペースです。
トランジスタを使って別電源でLEDを点けるとPWMを使わずに明るさを調整できます。
回路が完成した後は、RESETやSCK、MISO、MOSIは不要です。
qiita_attiny13_led_only_ブレッドボード.png

動かすスケッチ(プログラム)

D1ピンにLEDをつなぐので、こんなスケッチになります。

main.ino
void setup() {
    pinMode(1, OUTPUT);
}

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

共通の準備

python3-pipのインストール
$ sudo apt install -y python3-pip
platformioのインストール
$ pip3 install --user --upgrade platformio
$ ~/.local/bin/platformio --version
PlatformIO, version 4.1.0
$ ~/.local/bin/platformio platform install atmelavr --with-package tool-avrdude

なお、上記のように--userを付けてpip installする場合はplatformioがユーザーのローカルにインストールされるので、~/.local/binが実行パス(\${PATH})に含まれている必要があります。 ~/.local/binは、${PYTHONUSERBASE}で変更している可能性があります。
platformioをアンインストールするには「pip3 uninstall platformio」です。

ワークスペースの作成手順
$ mkdir attiny13work
$ cd attiny13work
$ pio init -b attiny13

$ vi src/main.ino # ~スケッチ(main.ino)を前述の通りに作成~
$ vi platformio.ini # ~platformio.iniを「それぞれの準備」の通りに編集~

$ pio run # ここで色々とインストールされるかも

↓のファームウェアの書き込みの前に後述の準備をしてください。

ファームウェアの書き込み
$ pio run -t upload # ←これは、それぞれの準備ができていないと正常に動作しません。

なお、uploadではなくprogramを使うようです。私は、ずっとuploadを使っていてエラーが出ていました。

それぞれの準備

Arduino Nano(arduino)の場合

準備

Arduinoボード(互換でも可)をAVRライターとして使うために予めArduinoボードにArduinoISPソフトウェアを書き込んでおきます。

接続図 (arduino)

コンデンサを挿したままだとArduinoISPの書き込みに失敗します。
ただしAVRマイコンを書き換えるときにはコンデンサを挿してください。
qiita_attiny13_led_ブレッドボード.png

PlatformIO設定 (arduino)

以前upload_protocol = arduinoispとしていて動きませんでした。

platformio.ini(arduino)
[env:attiny13]
platform = atmelavr
framework = arduino
board = attiny13
;board_build.f_cpu = 8000000L
board_build.f_cpu = 1000000L
upload_protocol = arduino

確認 (arduino)

正しく接続できていれば、AVRマイコンのfuse設定値などの情報を表示することができます。

確認コマンド
$ ~/.platformio/packages/tool-avrdude/avrdude -c arduino -p t13

AE-UM232R(arduino-ft232r)の場合

準備

AE-UM232RのJ1を図のように、いじって3.3V出力に変えましょう。
3.3VになっているかDSR#などをテスターで確認してください。

  • J1で信号を3.3V出力に変更

接続図 (arduino-ft232r)

qiita_attiny13_led_um232r_ブレッドボード.png

PlatformIO設定 (arduino-ft232r)

platformio.ini
[env:attiny13]
platform = atmelavr
framework = arduino
board = attiny13
;board_build.f_cpu = 8000000L
board_build.f_cpu = 1000000L
upload_protocol = arduino-ft232r
upload_port = ft0
upload_speed = 300

確認 (arduino-ft232r)

正しく接続できていれば、AVRマイコンのfuse設定値などの情報を表示することができます。

確認コマンド
$ ~/.platformio/packages/tool-avrdude/avrdude -c arduino-ft232r -b 300 -p t13

GPIO(linuxgpio)の場合

準備 (linuxgpio)

linuxgpioでは、どのピンを何に使うのか設定するために~/.avrdudercを用意してください。
avrdudeを実行したときに「Can't export GPIO 17, already exported/busy?: Invalid argument」などのエラーが出ることがあります。これはavrdudeがlinuxgpioに対応していない可能性があります。このときはaptのavrdudeパッケージを使うように~/.platformio以下のavrduddeコマンドを置き換えてみて下さい。
あと「*** [upload] could not open port ft0: [Errno 2] No such file or directory: 'ft0'」というエラーが出ることがあります。platformio.iniと同じディレクトリにft0をtouchで作成してみてください。

  • ~/.avrdudercを用意
  • 場合によってはavrdudeを置き換え
  • ft0をtouchして作成する
RaspberryPi用の~/.avrduderc
programmer
  id    = "linuxgpio";
  desc  = "Use the Linux sysfs interface to bitbang GPIO lines";
  type  = "linuxgpio";
  sck   = 2; # ここは環境に合わせて変更してください
  miso  = 3; # ここは環境に合わせて変更してください
  mosi  = 4; # ここは環境に合わせて変更してください
  reset = 17; # ここは環境に合わせて変更してください
;

接続図 (linuxgpio)

RaspberryPiでは、前述の~/.avrdudercを設定して、このように接続します。
qiita_attiny13_led_gpio_ブレッドボード.png

PlatformIO設定 (linuxgpio)

platformio.ini
[env:attiny13]
platform = atmelavr
framework = arduino
board = attiny13
;board_build.f_cpu = 8000000L
board_build.f_cpu = 1000000L
upload_protocol = linuxgpio
upload_port = ft0
upload_speed = 300

確認 (linuxgpio)

正しく接続できていれば、AVRマイコンのfuse設定値などの情報を表示することができます。

確認コマンド
$ ~/.platformio/packages/tool-avrdude/avrdude -c linuxgpio -p t13

うまく動かないとき

AE-UM232R(arduino-ft232r)でISPの代わりは割と微妙

特に、ATtiny13Aを1.2MHzで動かしているとfuseが読めなかったり、反応が悪いことがあります。
arduinoやlinuxgpioの方が、いいかも。

avrdudeコマンドにルート権限がないとダメ

avrdudeコマンドにルート権限がないと駄目なことがあるようです。
linuxgpioの場合は「Can't open gpioX/direction: Permission denied」や「Can't export GPIO 17, already exported/busy?: Invalid argument」などのエラーが出ます。後者のメッセージはavrdudeが一度gpioへのアクセスに失敗した後出ます。

ユーザーをdialoutグループに入れてみる
$ sudo adduser `whoami` dialout
avrdudeコマンドにルート権限を与えてみる
$ sudo chmod a+s `which avrdude`
$ sudo chmod a+s ~/.platformio/packages/tool-avrdude/avrdude
avrdudeにルート権限なしで失敗したときの後始末
$ echo 17 > /sys/class/gpio/unexport # 前述の~/.avrdudercを設定した場合
$ echo 2 > /sys/class/gpio/unexport # 前述の~/.avrdudercを設定した場合
$ echo 3 > /sys/class/gpio/unexport # 前述の~/.avrdudercを設定した場合
$ echo 4 > /sys/class/gpio/unexport # 前述の~/.avrdudercを設定した場合

PlatformIOのavrdudeがlinuxgpioに対応していない

、PlatformIOのavrdudeコマンドがlinuxgpioに対応していない可能性があります。
その場合は、aptのavrdudeパッケージをインストールしてみて下さい。そして~/.platformio以下のavrdudeコマンドと置き換えてみて下さい。
ただし「--with-package tool-avrdude」を付けてplatformioをインストールしていない場合は、「pio run -t program」した後でないと、~/.platformio以下のavrdudeが配置されませんのでご注意を。

場合によっては、avrdudeを置き換え
$ sudo apt install -y avrdude
$ pushd ~/.platformio/packages/tool-avrdude
$ mv avrdude avrdude.old
$ popd 

RaspberryPI Zero Wの新しいaptのavrdudeだとAE-UM232Rが動かなかった

RaspberryPI Zero W用のavrdude=6.3+r1425-1+rpt1バージョンでは「avrdude: ft245r_open(): invalid device identifier ' '」というようなエラーが出ました。代わりにavrdude=6.3-2バージョンを入れました。

RPiZeroWではaptの古いavrdudeパッケージを入れた
$ apt-cache madison avrdude
   avrdude | 6.3+r1425-1+rpt1 | http://archive.raspberrypi.org/debian stretch/main armhf Packages
   avrdude |      6.3-2 | http://raspbian.raspberrypi.org/raspbian stretch/main armhf Packages
$ sudo apt install -y --allow-downgrades avrdude=6.3-2
$ sudo apt-mark hold avrdude

なお、sudo apt-mark unhold avrdude && sudo apt upgradeで、元に戻せます。

その他のメモ

ここの情報は確認が不足しているので自信がありません。

AVRマイコンの種類とplatform ID

http://docs.platformio.org/en/latest/platforms/atmelavr.html
delay関数はの_delay_ms関数で代用してます。INPUT_PULLUPはpinMode関数でINPUTにしてからdigitalWrite関数でHIGHにします(後述)。
↓は「pio boards」で出力した結果をまとめたものです。

AVRマイコン platform ID avrdude partno 特徴
ATtiny13A attiny13 t13 INPUT_PULLUPなし
ATiny85 attiny85 t85
ATmega328P pro8MHzatmega328 m328p
ATmega88V bob3 m88 delay関数なし

AVRマイコンのfuse設定値(書き換え危険)

fuse設定は特に注意です。失敗すると12Vが必要になったり、ISPが使えなくなったり、外部クロックが必要になったり大変な目に会います。
まだまだ未確認です。fuseの値は確認してください。

AVR Hz Ex Hi Lo
ATtiny13A 1.2MHz - FF 6A
ATtiny13A 9.6MHz - FF 7A
ATtiny85 1MHz FF DF 62
ATtiny85 8MHz FF DF e2
ATtiny85 16MHz Fe DD e1
ATmega328P 1MHz FF D9 62
ATmega328P 8MHz FF D9 e2
ATmega88V 1MHz F9 DF 62
ATmega88V 8MHz F9 DF e2

最後に

これは自分のためのメモですが、なるべく拡充していこうと思います。

参考

みなさまのおかげです。

Qiita

Debian 系であえて古い APT パッケージをインストールする方法
pipに--userをつけた時のインストール先を変える

ATTiny13Aのデータシート

内蔵プルアップ抵抗あり(1.1.3 Port B (PB5:PB0)
内蔵プルアップ抵抗値は20kΩ~50kΩ (Table 18-1)
http://ww1.microchip.com/downloads/en/DeviceDoc/doc8126.pdf

意外と知られていない?INPUT_PULLUP

INPUT_PULLUPが便利
http://mag.switch-science.com/2013/05/23/input_pullup/

Digital Pins

INPUT_PULLUPが無いときはINPUTにしてからHIGHにする
https://www.arduino.cc/en/Tutorial/DigitalPins

Fritzing.org

回路を描くためのツールです
http://fritzing.org

DENSIKIT.COMさんのAE-UM232Rの電子パーツ

こういうものを作れるのは凄いですね
https://sites.google.com/a/densikit.com/ds/home/fritzing

1
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
8