How to make

Raspberry Pi だけで構成する汎用AVR開発環境


Raspberry Pi だけ(AVRライタ不要)でブートローダを持たないATtinyやATmegaに
Arduino IDE から
スケッチを書き込むことができる開発環境を作ります。

現行の Arduino IDE 1.8.x に対応します。


– 情報 –
  • Raspberry Pi単体ではATtiny10へのスケッチ書き込みができませんが,従来よりも,はるかに簡単に構成できるATtiny10 開発環境を作りました。詳細は「お手軽ATtiny10開発環境」に掲載(2018.05.06)
  • “Raspberry Pi GPIO”ライタでATTiny861のヒューズビットの書き換えがうまく行きません(2018.01.14)
  • GPIO対応AVRDUDEのインストールと環境設定方法を一新しました(2018.01.10)
  • 配線接続図に重大な誤りがあったのを訂正しました(2017.11.11)

  1. 概要
    1. Raspberry PiのGPIOを利用したAVRライターの事例がWebに沢山あります→ Google検索例
    2. AVRライタソフトAVRDUDEのARM版はRaspberry PiのGPIOに対応しています。Arduino IDEでスケッチの書き込みを行っているのもAVRDUDEです。
    3. Arduino IDE内蔵のAVRDUDEをGPIO経由で書き込むよう設定すればRaspberry PiとArduino IDEでAVRライタ不要のAVR開発環境を作ることがきると考えて試行してみました。
    4. しかし,Arduino IDE内蔵のAVRDUDEはGPIOを制御できません。GPIO制御可能なAVRDUDEをインストールし手動操作で差し替えてGPIOに対応させました。
      (現在、簡単にインストールする方法を試行中です→出来上がりました。2018.01.10)
    5. ATTiny13を除くATTinyの開発環境はSpence Konde氏のATTinyCoreを用います。しかし,ATTinyCoreはそれ独自のAVRDUDE動作環境を用いるためGPIO書き込みに対応しません。
      ATTinyCoreをGPIO書き込みに対応するよう書き換えたATTinyCore-Rを利用しています。この副作用としてATtiny861系デバイスへの書き込みができません。
  2. 開発環境の導入

    次の順でAVR開発環境をインストールします。
    Arduino IDEのインストール → AVR開発環境のインストール → GPIO対応avrdudeのインストール

    1. 準備
      インストール作業の前にユーザにsudoコマンドをパスワードなしで実行できる権限を付与しておきます。
      Raspbianに初期登録されているユーザ pi はsudoコマンドをパスワードなしで実行できます。
      sudoコマンドをパスワードなしで実行できる権限を付与する方法は→この検索リストを参照して下さい
    2. Arduino IDEのインストール
      1. Linux ARM用Arduinio IDEをダウンロードしインストールします。(2018.01.12現在,最新バージョンは 1.8.5 )
        インストール場所をホームディレクトリの ~/Appcations/配下にarduinoでインストールしておくと,GPIO-AVRDUDE_installerが利用できます。

        1. ファイルマネージャを起動しホームディレクトリ(/home/[ユーザ名]に Applications フォルダを作ります。
        2. ブラウザを起動しhttps://arduino.cc/en/Main/SoftwareからArduino IDE Linux ARMをダウンロードします。
        3. ダウンロードしたファイル arduino-1.8.5-linuxarm.tar.xz を右クリックし
          Extract to をクリックします。図1
        4. Extract files の Extract to 欄に /home/[ユーザ名]/Applicationsを入力し,
          Extractボタンをクリックします。図2

          図1 図2
        5. ターミナルを起動し次のように操作します。
          $ cd ~/Applications   ←カレントディレクトリ(作業ディレクトリ)をApplicationsに移動します
          $ ls                                 ←ファイル一覧を表示
          arduino-1.8.5
          $ ln -s arduino-1.8.5  arduino    ←シンボリックリンク arduino を作ります
          $ ls
          arduino atduino-1.8.5
          $ cd arduino        ←arduinoに移動します
          $ ls
          arduino          hardware    lib        revisions.txt  uninstall.sh
          arduino-builder  install.sh  libraries  tools
          examples         java        reference  tools-builder
          $ ./install.sh      ←インストールコマンド install.sh を実行します
          
          (警告が沢山表示されますが,無視します)
          
          done!               ←インストール終了
          $
      2. 念のため,IDEインストール後に手持ちのArduino UNOなどを接続してスケッチが書き込めるか確認します。
    3. AVR開発環境のインストール
      ボードマネージャからインストールします。

      1. インターネットに接続されていることが必須です。
      2. 下のpackage…jasonへの直接リンクURLをコピーします。
        https://kimio-kosaka.github.io/_RasPiduino/package_RasPiduino_index.json
      3. Arduino IDEを起動し「ファイル」→「環境設定」と進みます。図3
        「追加のボードマネージャのURL」欄に先程コピーした直接リンクURLを貼り付け,[OK]をクリックして閉じます。図4

        図3 図4
      4. [ツール]→[ボード:]→[ボードマネージャ…]と進みます。図5
      5. ボードマネージャウインドウが開きます。
        最後尾までスクロールするとKosaka.Lab提供の5つの環境がリストされるはずです。
        先ず最初に_RasPiduinoをインストールします。図6

        図5 図6
      6. ATMegaCore, ATTinyCore-R, bitDuino13 をインストールします。
      7. 最下段のGPIO-AVRDUDE_installerはGPIO対応avrdudeのインストーラです。
        ツール・メニューの選択操作だけでGPIO対応avrdudeをインストールすることができます。(下のデモビデオ参照)
      8. 用語の整理
        命名をテキトーに行い紛らわしい呼び名(用語)になったので整理します。

        1. GPIO対応avrdude GPIOを制御できるAVRライタソフト avrdude を指します。
        2. GPIO-AVRDUDE_installer 「GPIO対応avrdude」をインストールするためのツールパッケージを指します。
    4. GPIO対応avrdudeのインストール
      GPIO-AVRDUDE_installerを用いるとArduino IDEのメニューを数回クリックするだけでGPIO対応avrdudeをインストールできます。

      1. Arduino IDEが ~/Appcations/arduino でインストールされていることが必須です。
      2. ボードマネージャからGPIO-AVRDUDE_installerをインストールします。
      3. 「ツール」→「ボード:」と進みボードリストの下の方にスクロールすると,”Install GPIO AVRDUDE” と “Restore Arduino IDE AVRDUDE” の2つが見えるはずです。これは,インストール,アンインストール用シェルスクリプトを実行する”仮想ボード”です。図7
      4. 仮想ボード”Install GPIO AVRDUDE”を選択します。→ツールメニューが閉じます。
      5. 再度「ツール」メニュー開きます。
      6. 「ブートローダを書き込む」をクリックするとインストールスクリプトが実行されArduino IDEのメッセージエリア(下段の黒い背景のエリア)に進捗が表示されます。図6
      7. スクリプトの実行が終わると”*** RUNscript finished ***”と表示されます。図8
      8. Arduino IDE 標準装備のavrdudeに戻すときは仮想ボード”Restore Arduino IDE AVRDUDE”を選択し同様の操作を行います。
        図7 図8
      9. GPIO-AVRDUDE_installerは常駐させておく必要はありません。上記3〜8が済んだらパッケージマネージャからGPIO-AVRDUDE_installerをアンインストールします。
      10. 参考)インストールとレストアのシェルスクリプトは下の場所に収容されています。図9
        ~/.arduino15/packages/GPIO-AVRDUDE_installer/hardware/avr/1.0.x/bootloaders/

        図9
      11. インストールが終わりましたら「3.動作テスト」に進んで下さい。
    5. GPIO対応avrdudeの 手動 インストール
      インストーラを用いないで手動操作でGPIO対応avrdudeをインストールする手順は次のとおりです。

      1. avrdudeをインストール し SUID を付与します。
        $ sudo apt-get install avrdude
        $ sudo chown root:root /usr/bin/avrdude
        $ sudo chmod +s /usr/bin/avrdude

        (参考事項)
        Raspberry Pi(Raspbian)ではGPIOの操作にはroot権限が必要です。
        このため,一般ユーザでavrdude起動しGPIOからAVR書き込みをすることができません。
        sudo avrdudeで起動する必要があります。
        しかし,Arduino IDEの標準のplatform.txtの記述では一般ユーザ権限でavrdudeを起動するようになっています。
        IDEからroot権限でavrdudeを起動するためにインストールしたavrdudeの所有者をrootにしSUIDを付与して
        一般ユーザがavrdudeを起動しても所有者権限(toot)で実行されるよう設定します。

      2. avrdude.confにGPIOライターを追加記述します。
        $ sudo nano /etc/avrdude.conf
        
        avrdude.confの末尾に以下を追加記述
        
        programmer
          id    = "linuxgpio";
          desc  = "Use the Linux sysfs interface to bitbang GPIO lines";
          type  = "linuxgpio";
          mosi  = 18;
          miso  = 23;
          sck   = 24;
          reset = 25;
        ;
      3. Arduino IDEのavrdudeを差し替えます。
        $ cd [Arduino IDEをインストールしたディレクトリ]/hardware/tools/avr/bin/
        $ mv avrdude avrdude.org
        $ ln -s /usr/bin/avrdude ./avrdude
        $ cd ../etc/
        $ mv avrdude.conf avrdude.conf.org
        $ ln -s /etc/avrdude.conf ./avrdude.conf
  3. 動作テスト

    ATtiny85を用いた動作テストの例です。

    1. 図10のように配線します。(クリックで拡大表示)

      図10

      ピンヘッダ
      番号
      GPIO
      番号他
      ICSP
      信号
      保護抵抗 ATtiny85
      ピン番号
      1 3.3V 8
      6 GND 4
      12 GPIO18 MOSI 1kΩ 5
      16 GPIO23 MISO 1kΩ 6
      18 GPIO24 SCK 1kΩ 7
      22 GPIO25 RESET 1kΩ 1
    2. 書込み装置選択
      IDEのメニュー[ツール]→[書込み装置]と進み Raspberry Pi GPIO を選択します。
    3. ボード選択
      IDEのメニュー[ツール]→[ボード:]と進み[ATtiny25/45/85]を選択します。図A
    4. Chipの選択
      IDEのメニュー[ツール]→[Chip:]と進み[ATtiny85]を選択します。図B
    5. Clockの選択
      IDEのメニュー[ツール]→[Clock:]と進み[1MHz(Internal)]を選択します。図C

      図A ATtinyグループの選択

      図B Chipの選択

      図C Clockの選択

    6. 下のスケッチを入力します。。
      #define LED 3
      #define DTIME 500
      
      void setup() {
        pinMode(LED, OUTPUT);
      }
      
      void loop() {
        digitalWrite(LED, HIGH);
        delay(DTIME);
        digitalWrite(LED, LOW);
        delay(DTIME);
      }
    7. [マイコンボードに書き込む]ボタンをクリックします。
      コンパイルと書き込みが行われ,工場出荷状態のATtiny85であればLEDが約0.5秒間隔で点消灯するはずです。
    8. クロックを8MHz(Internal)に変更
      1. IDEのメニュー[ツール]→[Clock:]と進み[8MHz(Internal)]を選択します。
        注意:ここでクロック選択を誤ると,後ほど行う「ヒューズビット書き換え実験」でATtiny85が動かなくなります。
      2. 再度「マイコンボードに書き込む」ボタンをクリックします。
        LEDが約4秒間隔で点消灯します。これは,ATtiny85が内蔵クロック1MHzで動作しているのにクロック8MHzとしてスケッチをコンパイルして書き込んだために起こる現象です。次のヒューズビット書き換え操作でATtiny85を内蔵クロック8MHzで動作させます。
        今一度,IDEのメニュー[ツール]→[Clock:]と進み[8MHz(Internal)]となっていることを確認します。
    9. ヒューズビット書き換え
      メニュー[ツール]→[ブートローダの書き込み]と進みます。ダミーのブートローダ書き込みにより,ATtiny85のヒューズビットの書き換えとプログラムの消去が行われます。
      もういちど,スケッチをコンパイルして書き込むとLEDは約0.5秒間隔で点消灯するはずです。
  4. Arduino IDE内蔵avrdudeとGPIO対応avrdudeの違い
    ヒューズビットのlock_bits, unlock_bits の値の扱い方が異なっています。

    1. Arduino IDE内蔵avrdudeは  lock_bits = 0x0F, unlock_bits = 0x3F (8ビットデータの上位2ビットを無視しています)
    2. GPIO対応avrdude は lock_bits = 0xCF, unlock_bits = 0xFF (8ビットデータの上位2ビットを無視していません)
    3. この副作用としてArduino UNO などの既存のボードにブートローダを書き込もうとすると 0xFF != 0x3F というエラーが出て書き込みができません。
    4. これを回避するにはArduino IDE内蔵のboards.txtを書き換える必要があります
    5. GPIO-AVRDUDE_installer(v1.0.1 2018.01.13)ではインストール時にArduino IDE内蔵boards.txtを自動的に書き換えます。
    6. 手動で行う場合はつぎのとおり操作します。
      [Arduino IDEをインストールしたディレクトリ]/hardware/arduino/avr/board.txt の目的のボードの
      unlock_bits=0x3F を検索して 0x3F –> 0xFF
      lock_bits=0x0F を検索して Ox0F — > 0xCF と書き換えます(ボードによってはlock_bitsが0x2Fのものもあります)
      下記はターミナルからコマンド入力でsedにより該当箇所を一括置換して新しいファイルboard.txt.newを生成し置き換える例です。

      $ sed -e 's/unlock_bits=0x3F/unlock_bits=0xFF/g' boards.txt |\
       sed 's/lock_bits=0x0F/lock_bits=0xCF/g' |\
       sed 's/lock_bits=0x2F/lock_bits=0xEF/g'>board.txt.new
      $ mv boards.txt boards.txt.org
      $ mv boards.txt.new boards.txt
      
    7. スケッチの書き込みではエラーは起こりません。
  5. Arduini IDEをバージョンアップするとき
    1. バージョンアップする前に現行の環境でavrdudeをレストアします。
      (仮装ボード「Restore Arduino IDE AVRDUDE」への「ブートローダ書き込み」)
    2. Arduino IDEをバージョンアップした後,GPIO対応avrdudeをインストールします。
      (仮装ボード「Install GPIO AVRDURE」への 「ブートローダ書き込み」
  6. ATtiny861系の lockbits, unlockbits の読み書きに関して。

    1. ATtineCore-RはATtiny861系のlockbits,unlockbitsの書き込みに関して挙動不審なところがあります。
    2. Arduino IDE内蔵のavrdude.conf 並びに apt-getでインストールしたavrdude付属avrdude.confでは次のどのライタを使っても正しく読み書きできません。
      AVRISPmk2, Arduino ad ISP, Raspbery Pi GPIO
    3. 現在,原因調査中です。
  7. アドオンボード

    この汎用AVR開発環境向けのRaspberry Piアドオンボード(HAT)を製作しました。
    ボード上にICSP端子,ミニブレッドボード,ATmega328P用ソケットを搭載しています。ミニブレッドボード上にターゲットのATtiny,ATmegaを置きICSPラインをジャンパで配線してスケッチを書き込みます。ATmega328PソケットにはICSPとGPIOからのTXD,RXDとRTSによるReset信号が配線されており,ここにATmega328Pを装着しRasPiduinoのブートローダを書き込めばシリアルポート直結のArduino互換ボードとして動かすこともできます。この開発実験ボードは(需要があれば)キットとして頒布します。

     

  8. 関連情報
    1. 参考にした先行事例です。
      Program an AVR or Arduino Using Raspberry Pi GPIO
    2. ボードマネージャからインストールした開発環境のファイル群は ~/.arduino15/ 配下に収容されています。
    3. 開発環境はアップデートを頻繁に行っています。タイミングによってはマイナーバージョンの衝突によってインストール/アンインスト−ルができなくなったり二重にインストールされることがあります。そのようなときは次のフォルダを手動で削除することによって開発環境を初期状態にもどすことができます。
      1. .Arduino15/hardware/配下のavrフォルダを削除
      2. .Arduino15/tools/j配下のscriptフォルダを削除
    4. “仮想ボード”へのブートローダ書き込みによるシェルスクリプトの実行は、私が独自に編み出したもので画期的な方法だと自負しています。
      https://make.kosakalab.com/make/electronic-work/about_runscript/
    5. Arduino IDE で ATtiny 他の開発
      ここで制作した環境設定ファイルを使用しています。
      各種 ATtiny, ATmega の Arduinoプログラミング環境でのピン割付表もここに収容しています。
    6. Raspberry Pi シリアルポート経由でArduinoと連携
      Arduinoブートローダを書き込んだATmega328PをRaspberry Piのシリアルポートにダイレクト接続して利用する方法です。
  9. 今後…
    1. ATtiny10用の環境を作ります。

最後に注意
Raspberry PiのGPIOは5Vトレラントではありません。
5V回路にRaspberry PiのGPIO端子を接続するとRaspberry Piは深刻なダメージを受けます。


履歴

update 2018.01.10 AVRDUDEのインストールと設定方法を一新しました。
update 2017.11.22 GPIO対応AVRDUDEが必要とするlibftdi.so.1を明示的にインストールする手順を追加
update 2017.11.11 動作テスト配線接続図に重大な誤り(GND-5V取り違え)があったのを修正
upload 2017.11.08 Kimio Kosaka

この記事の公開ライセンスは「クリエイティブ・コモンズ BY-NC-SA 4.0 国際」です。

PAGETOP
Copyright © kosakalab All Rights Reserved.
Powered by WordPress & BizVektor Theme by Vektor,Inc. technology.
PAGE TOP