3.3V版8MHz動作のArduinoUNO互換機の製作
Aitendoさんの2.4インチ液晶モジュール(TP付き)M024C9320TPを入手しました。
http://www.aitendo.com/product/3859
元々は前の記事で書いたようなSPI版を探していたのですが価格が安かったのでポチッとしてしまいました。
ページの説明を見ると3.3V動作の様なのですが、私の手持ちのArduinoは5VのUNOしかありません。
調べてみると、ArduinoUNOを3.3Vで動作することは可能なんですが、16MHz動作は許容範囲外なようです。
さらに調べて行くとボードに「Arduino Pro or Pro Mini」を選択すれば良い事が判りましたので
緊急で3.3V版のArduinoを作成することにしました。
映像

しなぷすのハードさんの記事を参考にして
http://www3.big.or.jp/~schaft/hardware/bootloader_sketch/page005.html#index6_2
ATmega328に3.3V8MHz版のブートローダーを書き込みます。
私が持っているのはこちらです。
https://www.switch-science.com/catalog/1999/
とりあえず、何でも出来そうなやつを選んでおきました。
8Mhz3.3V版のArduinoUNOの製作-ブートローダーライター写真/スケッチライタ写真

 
ポイントを以下にあげて行きます。
1.CN2のジャンパはは電源ON時は抜き差ししてはいけない
2.書込み時に圧電スピーカーから音が出たほうが良い場合はCN4にジャンパピンを付ける
3.CN5にジャンパピンを6個接続してあること
4.CN6、CN7にはジャンパピンを1つも接続していないこと
(このCN5~CN7は書き込む AVRの種類により切り替えます。
 ATmega88/88V/168/168P/328P:CN5のみ
 ATtiny44/84:CN6のみ
 ATtiny45/85:CN7のみにジャンパを6個接続する)
5.ブートローダー書込みは5Vで使用すること
6.SW1をArduinoISPに切り替える
7.ArduinoIDEでシリアルポートを設定する
8.ArduinoIDEでArduino Pro or Pro Miniを選択する
9.プロセッサにAtmega328(3.3V,8Mhz)を選択する。
 写真
8Mhz3.3V版のArduinoUNOの製作-ボード選択メニュー


(プロセッサとボードの関係
 ATmega168
  Arduino Diecimila or Duemilanove w/ ATmega168、Arduino Nano w/ATmega168、Arduino Pro or Pro Mini (5V, 16MHz) w/ ATmega168、Arduino Pro or Pro Mini (3.3V, 8MHz) w/ ATmega168
 ATmega328P
  Arduino Uno、Arduino Duemilanove w/ ATmega328、Ardino Nono w/ATmega328、Arduino Pro or Pro Mini (5V, 16MHz) w/ ATmega328、Arduino Pro or Pro Mini (3.3V, 8MHz) w/ ATmega328)
 ATmega328の場合は3.3Vで動作させる場合は16Mhzはスペックオーバーになるとの事で、仕方なく8MHz動作にします。
ZIFソケットに固定して書込み!!
書き込みはメニュー→ツール→ブートローダーを書き込む
8Mhz3.3V版のArduinoUNOの製作-書込みメニュー

 
ここまでで、8MHz版3.3V版のブートローダーが書き込まれたので、基盤に部品を半田付けいて行く。
回路図
8Mhz3.3V版のArduinoUNOの製作-回路図

 
完成写真
8Mhz3.3V版のArduinoUNOの製作-完成写真

 
テストプログラムの実行結果
8MHz版実行結果
 start
 Sum=14352
 millis=23642
 end
16MHz版実行結果
 start
 Sum=14352
 millis=11821
 end
かかった時間が16Mhz版のぴったり2倍で計算結果は同じです。
さすがシングルタスク。
プログラム
void setup() {
  Serial.begin(9600);
  pinMode(11, OUTPUT);
  pinMode(12, OUTPUT);
  pinMode(13, OUTPUT);
}
void loop() {
  long nStartMillis = millis();
  Serial.println("start");
  long nLoop = 300000;
 
  int nSum = 0;
  int nCount;
  for(long i=0;i     if(i%(nLoop/100)==0){
      int nAmari=nCount%4;
      if(nAmari==0){
        digitalWrite(11, LOW);
        digitalWrite(12, LOW);
        digitalWrite(13, LOW);
//Serial.println("nAmari0");
      }else
      if(nAmari==1){
        digitalWrite(11, LOW);
        digitalWrite(12, LOW);
        digitalWrite(13, HIGH);
//Serial.println("nAmari1");
      }else
      if(nAmari==2){
        digitalWrite(11, LOW);
        digitalWrite(12, HIGH);
        digitalWrite(13, HIGH);
//Serial.println("nAmari2");
      }
      else{
        digitalWrite(11, HIGH);
        digitalWrite(12, HIGH);
        digitalWrite(13, HIGH);
//Serial.println("nAmari3");
      }
      nCount++;
    }
    nSum+=i;
  }
  digitalWrite(13, HIGH);
  Serial.print("Sum=");
  Serial.println(nSum);
  Serial.print("millis=");
  Serial.println( millis() - nStartMillis);
  Serial.println("end");
  for(int i=0;i<5;i++){
        digitalWrite(11, LOW);
        digitalWrite(12, LOW);
        digitalWrite(13, LOW);
        delay(500);
        digitalWrite(11, HIGH);
        digitalWrite(12, HIGH);
        digitalWrite(13, HIGH);
        delay(500);
  }
  while(1);
}