Raspberry Pi AVR-Arduinoシールドを作成する

Raspberry PiのGPIOピンに装着するAVR-Arduinoシールドです。
linuxgpioライタでAVR開発環境を構築、USBシリアル変換を追加すればArduino環境として動作します。

当サイトでは以前よりUSBaspと秋月の基板で同じような環境で使っていたので今回linuxgpioに移行してみました。
当サイトには特に専用のシールドも無いことからArudinoの形式にとらわれる必要も無くmcuを利用できればいいので自由に構成することができます。

参考サイト
ラズパイで AVR プログラミング
Raspberry Pi だけで構成する汎用AVR開発環境

シールドの作成

ベースとなる回路図

ベースのmcuはATmega328系
USBシリアル変換にはCH340G(3.3V接続)
GPIOの6本のPinに接続

Piの3.3Vは約50mA位しか取ることができません。mcuの読み書きだけならば問題ないのですが少し重い負荷を懸けたり3.3VラインのスイッチをON-OFFするとPi自体が落ちてしまいます。そのためGPIOの5Vから専用のレギュレーターを追加3.3Vを確保しています。


モジュール

Raspberry Pi 3のGPIO端子には下駄を履かしているのでこの下駄に合わせて作成、載せます。


ベースモジュール
ICソケットとサイドのピンソケットは繋がっています。
Xtalはソケットで差し替え可能
リセットスイッチはベースモジュールに
3.3V ON-OFFスイッチは小型のスライドスイッチを設けています。


チップ抵抗、コンデンサを使用


ベースモジュールにICソケットが載っていますが基本そちらは使わないでICモジュールを作成
8pin ATtiny13a
20pin Attiny2313
28pin ATmega328系


28pinタイプは全て直結していますがそれ以外はICソケットとピンソケットを直結してベースと繋がるピンヘッダは電源と信号線のみ各ICに合わせてジャンパー線で接続しています。
LEDとタクトSWを設けていますがジャンパーピンで必要に応じて接続します。
28pinタイプの19SCKはチップLEDを用いて目立たない程度に点灯しています。


8pinタイプはスペースができるのでICSP端子を設けました。
当サイトでは6pin2列タイプを採用しています。
電源以外の4本の信号線はアダプタを差し込むことで基板上のICと接続、外してICSP端子として利用できます。


CH340G USB-シリアル変換モジュール
以前作成したうちの1個を剥がして取り付け直ししました。今回はピッチ変換基板に載せています。
セラロックではうまく動かないのでXtalが必要です。
端子はマイクロUSBタイプにしました。5Vはノンコネクションで


これでハードウェアの準備が完了しました。

AVR開発環境

Arudino IDEをインストールするとAVR関連のコマンドも利用できるのですがパスを通したりいろいろ面倒になるのでシステムから使用できるようパッケージからもインストールします。

# apt install gcc-avr avr-libc avrdude

さて肝心のlinuxgpioですが現在のPiでインストールされるavrdude 6.3-2+rpi1ではデフォルトで利用できるようです。
linuxgpioをシステムに登録します。
/etc/avrdude.confの編集 末尾に追加。GPIOのピンはある程度任意に設定できるようです。
当サイトでは上記2サイトの接続で試しましたがどちらも正常に認識します。

programmer
  id    = "linuxgpio";
  desc  = "Use the Linux sysfs interface to bitbang GPIO lines";
  type  = "linuxgpio";
  reset = 17;
  sck   = 2;
  mosi  = 4;
  miso  = 3;
;

参考サイトにあるようにGPIOをデバイスとして利用するにはroot権限が必要になるのでSUIDをセットします。

chmod +s /usr/bin/avrdude

avrdudeは再起動しないとGPIOを認識しないのでここでreboot

再起動したら確認してみます。-p デバイス名は実在する適当な値を入れても自動で認識してくれます。(書込は正式な名称を入れましょう)
$ avrdude -c linuxgpio -p t13 -v
う〜んいいですね。全く外付けのライタを意識しなくて済みます。

Arduino開発環境

Arduinoのインストールや使い方はほかのサイトに沢山あるので当サイトとしてはインストールする際に感じた要点だけ記載します。
Arduino IDEは1.8.5をインストールしました。
インストールディレクトリは~/Applications このディレクトリは同じような外部パッケージをインストールする際にも使えます。

追加のボードはラズパイで AVR プログラミングで紹介されている2つを
ATmega 系:https://mcudude.github.io/MiniCore/package_MCUdude_MiniCore_index.json
ATtiny 系:http://drazzy.com/package_drazzy.com_index.json
kosakalabさんからはATtiny10/13をいただきました。

Arduino IDEを起動してボードマネージャーを開くと更新可能なボードがあります。

ここで更新したりボードを追加した際にはホームディレクトリの.arduino15に保存されます。
このディレクトリ以下にあるファイルは起動時最後に読み込まれ優先的に使用されます。
基本の設定はこのディレクトリあるファイルを編集することになります。

Arduino IDEで使用するprogrammersの設定 先頭に追加
~/.arduino15/packages/arduino/hardware/avr/1.6.21/programmers.txt

linuxgpio.name=Linux GPIO
linuxgpio.protocol=linuxgpio
linuxgpio.program.tool=avrdude

Arduino IDEに同梱されるavrdudeはlinuxgpioに対応しません。
パッケージからインストール、設定したavrdudeにリンクを貼ります。

$ cd ~/.arduino15/packages/arduino/tools/avrdude/6.3.0-arduino9/bin
$ mv avrdude avrdude.def
$ ln -s /usr/bin/avrdude

Arduino IDEのavrdude.confは本体や追加したボードのディレクトリ~/.arduino15以下に散らばっています。ユーザーが使用するprogrammerを固定化するため~/.avrdudercを作成します。
~/.avrduderc

programmer
  id    = "linuxgpio";
  desc  = "Use the Linux sysfs interface to bitbang GPIO lines";
  type  = "linuxgpio";
  reset = 17;
  sck   = 2;
  mosi  = 4;
  miso  = 3;
;

Arduino IDEの起動実行

328Pを装着してボード、プログラマー、シリアルポートを選択
ブートローダー、スケッチも問題なく書き込めます。
168p,ATtiny13a,ATtiny2313でもOKです。

コマンドラインの書込もArduino IDEからの書込も繋ぎ変えは必要無しに実行できます。

稀にシリアルポート(ttyUSB0)を見失うことがありますが3.3VスイッチをOFF-ONすることですぐに復活します。


素のAVRを扱う上ではPi(linuxgpio)+AVR-Arduinoは最高の環境かもしれません。

あと不足しているのはここからの開発能力だけですね
(-。-;)