Top Page Mighty-1284p_Bootloaderの書込み
自作工程のメモとして
26.Feb.2017


  一つ前のページにある「Arduino Mighty-1284p のPCB製作」に続いて、このページではBootloader(以下、BLと略す)の書込みとボードのテストを経て完成までの工程を書きます。
Web上では、すでに多くの関連情報が有りますが、最近始めたばかりの私には今一つわかりにくい内容に思えました。
そこで、自分が悩んだところを中心に、記述しておきます。


続編: Mighty CW Keyer のケースへの実装 を掲載しました。(2017/05/24)



一通りテストを終えた1号機です。


Edit by bluegriffon2.3.1

1.BL書込み

作業前の前提(私の場合)
OSは、Windows10 Pro (64)。
Arduino IDEは、 1.8.1 を使用。
Arduino IDE 1.8.1 は、ZIPで展開し、デスクトップ上のフォルダー内に置いています。
スケッチは、Documentフォルダー下に ArduinoIDE1.8 というフォルダー名称を付けて、その中においています。


■ BL書込みのための接続


左がターゲットとなる Mighty-1284p で、右側に書込み用のボードとして、ArduinoUNO を用意しました。

Mighty-1284p ArduinoUNO
+5V +5V
GND GND
RESET D10
D5 D11
D6 D12
D7 D13

■ UNO側のプログラムをダウンロード(1)


Yahoo等で、「Atmega_Board_Programmer」を検索すると、最初の辺りで
Arduino_Board_Programmer.ino が見つかりますが、一つ上のディレクトリに移動します。( 赤四角で囲っています

■ UNO側のプログラムをダウンロード(2)


@Aとクリックして、全体をダウンロードします。
ダウンロードしたZIPファイルを、全展開し、フォルダーの階層を下がっていくと以下のフォルダーが見えます。

■ UNO側のプログラムをダウンロード(3)


この中から、「Atmega_Board_Programmer」フォルダー全部をドキュメントフォルダー下の、「ArduinoIDE1.8」というフォルダーにコピーします。

■ UNO側で、「Atmega_Board_Programmer」スケッチの実行(1)


1.ここで Arduino IDE を起動する。
2.ボードの種類と、COMポートを UNO に合わせて、「Atmega_Board_Programmer」スケッチを書き込みます。

■ UNO側で、「Atmega_Board_Programmer」スケッチの実行(2)

3.書込み完了後は、シリアルモニタを起動する。

■ UNO側で、「Atmega_Board_Programmer」スケッチの実行(3)


4.シリアルモニタが起動したら、速度を 115200bps にセットする。
5.画面のような応答が有ったら、指示どおり「送信窓」に G を打ち込んで送信する。
6.すぐに反応が有り Done となっていたら完了です。


2.Mighty-1284p定義ファイルの導入

Web上で「Mighty-1284p」を検索すると、最初に古いタイプの定義ファイルが検出できますが、これを導入しても Arduino IDE 1.8.1 ではエラーに成ってしまいます。
その5番目ぐらいの位置にある Mighty-1284p repo updated for IDE 1.6.x - Arduino Forum の中のリンクにある 1.6.3 が最新のようなので、それをダウンロードします。


■ ダウンロード場所のイメージ


v1.6.3 を確認して、@AとクリックしてZIPファイルをダウンロードします。

■ ZIPファイルを展開した後のイメージ

(1)

上図のように、フォルダーの -1.6.3 を削除する。

(2)

フォルダー名を変更した後。

(3)

スケッチを置いている場所に hardware フォルダーを作成して、先ほど名前を変更したフォルダーをコピーする。

■ Arduino IDE 1.8.1 を起動してボードを確認(修正:2017/03/05)


多分、「avr-developers.com pinouts 16MHz using Optiboot」を選択すれば良いと思います。 (削除:2017/03/05)
上記の削除前(avr-developers.com pinouts ・・・・・)設定でも動作しますが、基板の設計を「STANDARD」としましたので、ボードは「"maniacbug" Mighty 1284p 16MHz using Optiboot」を選択すれば良いと思います。

◆両者の主な違い(左:avr-developers.com pinouts ・・・ 、右:"maniacbug" Mighty 1284p 16MHz using Optiboot
(1)アナログピンをデジタルポート番号で指定するときの番号順が逆。
(2)LEDの接続ピンが、13か7の違い。

■ k3ng_keyerスケッチを書き込んだ時の最下行




Web上では昨年の時点でも、ヒューズ設定を書き直す必要があると書かれている方もいらっしゃいますので、わかりませんが、今のところ動作が不安定にはなっていないようです。
変化が有りましたら、この場所に追記します。


3.ボードのテスト

自作のボードのため、一通り動作確認をしてみました。
あまり本格的とは言えませんが、一つひとつのポートのON/OFFぐらいは確認しておく必要があることから、簡単な回路とスケッチでテストしてみました。


■ テストボードの回路


デジタルポートが隣のピンと接触していたりしないかを見るための、3個のLEDを並べました。
LEDの抵抗は、省略して1本にしています。
アナログポートは、1本ですが、可変抵抗で電圧を可変できるようにしました。
電源は、テストするボードの+5VとGNDを使います。

■ テストボード

ほんとにありあわせの部品を集めて用意しました。

■ デジタルポートのテスト


ポートは出力指定ですが、出力した後でそのまま読み込んでいます。

■ アナログポートのテスト


ちょうどボリュームを+5V側に回しているときの読取値です。

■ k3ng_keyer用の簡易シールドを作り動かしてみたところ


k3ngのホームページの回路では、スピーカーの音が大きかったので、定数の変更とボリュームを付けました。

■ デジタルポートテストのスケッチ


#include <Wire.h>
#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x3f, 16, 2); // set the LCD address to 0x27 for a 16 chars and 2 line display

// start_pin = 0 to end_pin =15
// start_pin = 18 to end_pin =23
// start_pin = 24 to end_pin =31

int start_pin = 18;
int end_pin = 23;
int val = 0;

void setup()
{
  pinMode(7, OUTPUT);
  //LCD初期設定(LiquidCrystal_I2C)
  lcd.init();                      // initialize the lcd
  lcd.backlight();
  lcd.print(" digital Mode ");
  delay(1000);
  lcd.clear();
}

void loop()
{
  for (int i = start_pin; i <= end_pin; i++) {
    pinMode(i, OUTPUT);   // 出力に設定
  }

  for (int i = start_pin; i <= end_pin; i++) {
    lcd.setCursor(0, 0);
    lcd.print(i);
    lcd.print(" Pin=LOW ");
    digitalWrite(i, LOW);
    val = digitalRead(i);  // 入力ピンを読む
    lcd.setCursor(0, 1);
    if (val == 0 ) {
      lcd.print(" INPUT LOW  ");
    } else {
      lcd.print(" INPUT HIGH");
    }
    delay(1000);
    lcd.setCursor(0, 0);
    lcd.print(i);
    lcd.print(" Pin=HIGH ");
    digitalWrite(i, HIGH);
    val = digitalRead(i);  // 入力ピンを読む
    lcd.setCursor(0, 1);
    if (val == 0 ) {
      lcd.print(" INPUT LOW ");
    } else {
      lcd.print(" INPUT HIGH");
    }
    delay(1000);
    lcd.setCursor(0, 0);
    lcd.print(i);
    lcd.print(" Pin=LOW  ");
    digitalWrite(i, LOW);
    val = digitalRead(i);  // 入力ピンを読む
    lcd.setCursor(0, 1);
    if (val == 0 ) {
      lcd.print(" INPUT LOW ");
    } else {
      lcd.print(" INPUT HIGH");
    }
    delay(1000);    lcd.setCursor(0, 0);
    lcd.print(i);
    lcd.print(" Pin=HIGH ");
    digitalWrite(i, HIGH);
    val = digitalRead(i);  // 入力ピンを読む
    lcd.setCursor(0, 1);
    if (val == 0 ) {
      lcd.print(" INPUT LOW ");
    } else {
      lcd.print(" INPUT HIGH");
    }
    delay(1000);
    //        lcd.setCursor(0, 0);
    //          lcd.print("====TEST END====");
  }
}


■ アナログポートテストのスケッチ


#include <Wire.h>
#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x3f, 16, 2); // set the LCD address to 0x27 for a 16 chars and 2 line display

int start_pin = 0;
int end_pin = 7;
int val = 0;

void setup()
{
  pinMode(7, OUTPUT);
  //LCD初期設定(LiquidCrystal_I2C)
  lcd.init();                      // initialize the lcd
  lcd.backlight();
  lcd.print(" Analog Mode ");
  delay(1000);
  lcd.clear();
}

void loop()
{
  for (int i = start_pin; i <= end_pin; i++) {
    lcd.setCursor(0, 0);
    lcd.print(i);
        lcd.print(" Aval=");
    val = analogRead(i);    // アナログピンを読み取る
       lcd.print(val);
        lcd.print("     ");
    delay(1000);
  }
}


ダラダラと書いたスケッチですが、一応各テストで異常は見つかりませんでした。



4.その他気づいたこと

(1)上記テストで異常は有りませんでしたが、最初にこの基板を使った時に、LCDの表示が1文字しか出力されない現象が、発生しました。
Web上で検索したところ、既知情報として掲載されている方がいらっしゃいまして、解決することができました。(感謝)
参照ページ: 【Arduino】[LCD] print()で文章を出力しても一文字目しか表示されない | from ri2lab 

(2)さらに、赤外線(IR)リモコンの読取で使用している FlexiTimer2ライブラリが Mighty-1284p をサポートしていないためか、エラーになることが分かっています。
このFlexiTimer2がサポートしていない件は、FlexiTimer2.cppの4か所に" || defined (__AVR_ATmega1284P__)"を追記することで解消することを確認しました。(2017/04/02)

(3)D7ポートのLEDですが、ポートが入力状態の時に点灯しています。気になるときは、void setup() の中で出力に指定( pinMode(7, OUTPUT); )しておいてください。



mighty-1284p mighty 1284p ATmega1284p
99.追記用(予備)