1
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

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)
  • ブレッドボードとワイヤ
  • 抵抗入り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

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?