2016年6月11日土曜日

Arduinoブートローダーの書き込み

こちらではMyArduinoボードを製作しました。
今回はATMEGA328PUにブートローダーを書き込む方法についてメモ。
こちらのサイトを参考にライタシールドを製作しました。



書き込み回路はブレッドボードでも全く問題ありません。
しかし、自分は何回も使用することを想定し、ライタシールドにしました。
右は使用したサインスマート製のArduino互換ボードです。
互換ボードとしてはちょっとお高めですが、オスメス両方使用できる上、
3.3V、5V両方使用できる優れものです。


実際の書き込み手順です。
といっても参考サイトのまんまですが。使用したArduinoIDEは1.6.5です。

スケッチの例からArduinoISPを開きます。
シールドをつけない状態でArduinoに書き込みます。



次にシールドと書き込みたいCPUを接続します。



書き込み装置をArduino as ISPに変更してから
”ブートローダーを書き込む” を実行します。



”ブートローダーの書き込みが完了しました。”
と表示されたら無事完了です。




MyArduinoボード

Arduinoゲーム機の製作をする過程でCPU、ATMEGA328PUが
余ったのでMyArduinoボードを作ってみました。
コンセプトとしては、

  • ブレッドボードに直接挿すことを想定。
  • リセット回路を搭載。
  • USBシリアル変換ケーブルを直接挿せるように。
  • ユニバーサル基盤で製作。
こんな感じでなるべく小さくを目指しました。

回路図はこちら


最小動作回路+リセット回路の構成。
AVCC、AVrefは、自分はあんまり使わないので、VCCとくっつけてしまいました。
シリアル変換と外部電源を同時につないではいけません。

実際のパターン



ユニバーサル基盤でもこのように設計するよう心がけています。
しかし、半田付け中にしょっちゅう変更してるので、
実際の回路は少し違ったりします。


実際に製作したもの。



ブレッドボード(2.54ピッチ)の縦7ピン、横14ピンで収まります。



裏の配線は結構汚い、GND、VCCは気合配線です(笑)。


こんな感じで簡単なロボットができます。(ちゃんと動きます)。



ちなみに回路図にあるパーツを買って作っても動きません。
CPUにブートローダーを書き込む必要があります。
自分は製品のArduinoを使用するやり方で書き込みました。
つまり、製品のArduino+書き込み回路+今回のパーツで
初期費用3000円ほど、Myボード一個につき1000円以下で製作できます。
ブートローダーの書き込みについては、次回紹介します。

Arduinoゲーム機の製作6

前回までにようやく動くところまで行ったので、今回はプログラムと
回路のメモ。

といってもかなり教科書的な使い方なのであんまり工夫点はないです。



・回路



最終的な回路図はこんな感じ。
LCDは結局分圧+レギュレーターを使用しました。
これで動いたのでとりあえず良しとします。
改良するとすれば、外部から5V電源を引いてこれるといいかもしれません。


・ソフト

#include <MGLCD.h>
#include <MGLCD_SPI.h>
#include <SPI.h>
#define MODE_MAX 2

//ピン定義
#define LED 12
#define Buzzer 4
#define SW_TOP A5
#define SW_BUTTOM A2
#define SW_RIGHT A4
#define SW_LEFT A3
#define SW_B0 A1
#define SW_B1 A0

//LCD宣言
#define CS_PIN 10
#define DI_PIN  9
#define MAX_FREQ (1000*1000L)
MGLCD_AQM1248A_SPI MGLCD(MGLCD_SpiPin2(CS_PIN, DI_PIN), MAX_FREQ);

//グローバル変数
int mode =0;//現在モード
int BuzTorn[8] = { 262,294,330,349,392,440,494,523 }; //ブザー周波数

void setup() {
  //ボタンピン設定
  pinMode(SW_TOP, INPUT);
  pinMode(SW_BUTTOM, INPUT);
  pinMode(SW_RIGHT, INPUT);
  pinMode(SW_LEFT, INPUT);
  pinMode(SW_B0, INPUT);
  pinMode(SW_B1, INPUT);
  pinMode(LED, OUTPUT); //LED

  //プルアップ有効
  digitalWrite(SW_TOP, HIGH);
  digitalWrite(SW_BUTTOM, HIGH);
  digitalWrite(SW_RIGHT, HIGH);
  digitalWrite(SW_LEFT, HIGH);
  digitalWrite(SW_B0, HIGH);
  digitalWrite(SW_B1, HIGH);

  while(MGLCD.Reset()); //LCD初期化
  delay(500);
  //初期画面表示
  MGLCD.Locate(5,3);         //表示位置指定
  MGLCD.print("Game Board"); //文字列出力
  MGLCD.Locate(11,5);
  MGLCD.print("Ver.1.3 ");
  MGLCD.Rect(9,7,117,47);    //四角形表示

  tone(Buzzer,BuzTorn[6],250) ;  // ド
  delay(1000);

  MGLCD.ClearScreen();       //表示クリア
  digitalWrite(LED, HIGH);  //LED点灯
}

void loop() {
  //モード選択
  MGLCD.Locate(4,2);
  MGLCD.print("Select  Mode");
  MGLCD.Locate(8,4);
  MGLCD.print("[[ ]]");
  MGLCD.Locate(10,4);
  MGLCD.print(mode,DEC);
  if(Push_SW(SW_RIGHT)){mode++;}
  else if(Push_SW(SW_LEFT)) {mode--;}
  if(mode>MODE_MAX) {mode=0;}
  else if(mode<0) {mode = MODE_MAX;}
  if(Push_SW(SW_B0)){
    switch(mode){
        case 0: exe_mode0();
                break;
             
        case 1: exe_mode1();
                break;
             
        case 2: exe_mode2();
                break;
             
        default: break;
     }
  }
}

//--------------------
//      モード0
//--------------------
void exe_mode0(void){
  MGLCD.ClearScreen();
  MGLCD.Locate(6,2);
  MGLCD.print("MODE 0");
  while(!Push_SW(SW_B1)){
    MGLCD.Locate(6,4);
    MGLCD.print("Push B1!!");
    delay(500);
    MGLCD.Locate(6,4);
    MGLCD.print("         ");
    delay(500);
  }
  MGLCD.ClearScreen();
}

//--------------------
//      モード1
//--------------------
void exe_mode1(void){
  MGLCD.ClearScreen();
  MGLCD.Locate(6,2);
  MGLCD.print("MODE 1");
  while(!Push_SW(SW_B1)){
    MGLCD.Locate(6,4);
    MGLCD.print("Push B1!!");
    delay(500);
    MGLCD.Locate(6,4);
    MGLCD.print("         ");
    delay(500);
  }
  MGLCD.ClearScreen();
}

//--------------------
//      モード2
//--------------------
void exe_mode2(void){
  MGLCD.ClearScreen();
  MGLCD.Locate(6,2);
  MGLCD.print("MODE 2");
  while(!Push_SW(SW_B1)){
    MGLCD.Locate(6,4);
    MGLCD.print("Push B1!!");
    delay(500);
    MGLCD.Locate(6,4);
    MGLCD.print("         ");
    delay(500);
  }
  MGLCD.ClearScreen();
}

//--------------------
//    スイッチ入力
//--------------------
bool Push_SW(char sw){
  if(digitalRead(sw) == LOW){
    while(digitalRead(sw) == LOW);
    return(1);
  }else return(0);
}


ArduinoリファレンスとMGLCDのマニュアルにあるとおりです。
工夫点はスイッチ入力でしょうか。
bool Push_SW(char sw){
  if(digitalRead(sw) == LOW){
    while(digitalRead(sw) == LOW);
    return(1);
  }else return(0);
}

スイッチが押されたとき、離されるまで待つことで
確実に入力を判定します。

呼ぶときは、
if(Push_SW(SW)){ 処理 }

また入力待ちは
 while(!Push_SW(SW)){
  処理
 }
このようにスマートに書くことができます。




今回でArduinoのゲーム機製作は終わろうと思います。
ゲームプログラムを書いたところであんまり参考にならないと思いますし・・・
当初、一ヶ月ぐらいでできるだろうと思っていましたが、予想外に
時間がかかってしまいました。しかし、結構遊べそうなものができたので
結構満足しています。
しばらくはArduino関係の資料をまとめようと思います。

2016年6月7日火曜日

Arduinoゲーム機の製作5

とりあえず動くところまでいったのでご報告。
前回のバグについて。
  1. LCDが表示せずに起動することがある。
  2. スイッチの反応がおかしい。
1ははあきらめた(笑)。作り直した方は、運がよければ起動します。
Arduinoの3.3V駆動は不安定なのか、回路が不安定なのか・・・
気が向いたら直しておきます。

2はプログラムを作り直したらいつの間にか直っていました。
しかし原因不明に変わりはないので一応よくわからないプログラムも残しておきます。

というわけで2月ごろに製作した基盤で作ってみることに。
前回はネットからとってきたプログラムをちゃんぽんし、かろうじて動かしてきました。
今回はこちらのサイトで紹介されているMGLCDライブラリを使用させていただきました。
解説も詳しく載っていて、実際のライブラリも非常に使いやすかった。感謝します。



完成したのがこちら!














*この動画は新しい基盤を用いました。
*実際はブザー音が鳴りますが、なぜか音声が抜けてしまいました。

Modeを3つ用意してそれぞれ切り替えて実行するプログラムです。
Modeの中身はまだ書いていません。しかしこれでプログラムの大枠は完成しました。
あとはModeの中身にゲームを作るもよし、メロディを再生させるもよしです。

以上、動いたよという報告でした。
次回はプログラムの詳しいメモを残したいと思います。

2016年6月4日土曜日

Arduinoゲーム機の製作4

だいぶ時間が経ってしまったが、前回設計した回路図通りに
半田付けを行いました。



前回設計したアートワークではうまくいかず、
ちょっとだけ設計変更しながら作りました。

しかしバグが2点残ってしまいました。
  • LCDが表示せずに起動することがある。
  • スイッチの反応がおかしい。
試しにLCD関連を除いてスイッチ入力をシリアル通信で送ってみたところ
正常に動作したことからおそらくLCD関連のプログラムが悪さしてるっぽい。

意外とサクッといくと思ったら思わぬバグが出てしまった・・・
次回は修正してサンプルをアップできればと思います。

2016年6月2日木曜日

基板実装用に

一ヶ月程経ってしまいました。
5月は就活、研究室、サークル活動と非常に忙しかったです。
先日、大学で使う用にハンダセットを購入しました。



Amazonで購入。以下詳細です。
精密 作業 用 スタンド ルーペ 固定 クリップ & はんだ ごて スタンド & 電池 & クリーニング クロス 付き (2 LED ライト 一体 型 拡大ルーペ 付き)

AGPtek® ダイヤル式電子はんだこて

goot 高密度集積基板用はんだ SD-60



一応レビューすると、

 ・はんだごてはとても満足です。安価ですがコテ先も豊富、温度調整も効きます。

 ・コテ台は使えませんでした、サイズが大きく、はんだごてが貫通してしまいました。
   よって現状ではあまり使っていません。ルーペは使えそうです。

 ・ハンダは普通に細いので使いやすいです。

家でエッチングはできないので、完全に大学用です。

作ったのがコレ。




サークルで使用予定であるRX62Tのテストボードです。
素子のピン配線とかチップコンデンサのランドとか設計も結構難しかった。
しかし、基板実装すると基盤がグッと小さくなっていいですね。
あとなんかプロの仕上がり感が出ます(笑)。