2016年12月18日日曜日

LPC1114FN28 ロータリーエンコーダを使ってみる

先日,AliExpressで注文していたモータが届いたので,ArduinoとLPC1114FN28で
テストさせてみました.

モータはFaulhaber 1524009SRギア,エンコーダ付.ふたつで\3779でした.



コネクタは取り替えてしまいました.

初めての海外サイトでのお買い物.ちょっとだけ苦労しました.
海外だからきっと不親切だろうなーと思っていましたが,
ちゃんと追跡してくれるし,12/5発送で12/17到着も予定どうりでした.
高分解能のエンコーダ付でこのお値段はなかなかだと思います.
あとは動けば完璧.

・Arduino

Arduinoではおそらく高速回転での制御は無理と判断し,エンコーダのみのテストです.



こちらのサイトにあるプログラムを用いてテストしました.
見事,パルス数がかえってきました.
ちなみにこのArduino互換ボード,3.3V,5Vが切り替えられるのですが,
エンコーダはどちらでも動作しました.よってLPC1114FN28での検証が可能です.

・LPC1114FN28

こちらは,実際にモータを回し,テストしました.



モータ電源はエネループ直列4個,約4.8Vです.
検証に用にはQEIライブラリを使用.ソフトウェアでカウントします.
以下回転数を出力するサンプル

#include "mbed.h"
#include "QEI.h"

DigitalOut myled(LED1);

Serial pc(dp16, dp15);
QEI wheel (dp1, dp2, NC, 512,QEI::X2_ENCODING);
Ticker get_rpm;
int rpm;
int palse;

void flip(){
    palse = wheel.getPulses();
    wheel.reset();
    rpm = 60000*palse/1024;
 }

int main() {
    pc.baud(115200);
    get_rpm.attach_us(&flip,1000);
    while(1){
        wait(0.1);
        //pc.printf("Pulses is: %i\n", wheel.getPulses());
        pc.printf("rpm is: %i\n", rpm);
    }

}

エンコーダは2相1024パルスなので1ms割り込みで 6000*palse/1024
してやることで,回転数に変換できます.

回転数取得の様子



モータのスペック表から回転数定数は1140[rpm/V].よって
1140*4.8=5472[rpm]が大体の出力になるはずです.
ギアがついているとはいえかなり近い値になりました.




モータのテストが終わったので次回は速度制御に移りたいと思います.
このモータもう一組買おうかな・・・

2016年12月17日土曜日

LPC1114FN28でグラフィックLCDを使う

最近はLPC1114FN28にいろんなものをつなげて遊んでいるcake tetuです.
Arduinoゲーム機でも使ったSPIグラフィックLCDをLPCにつなげてみたメモ.

使用したのは超小型グラフィックLCD AQM1248a のピッチ変換キット.
750円でグラフィック表示できるんだからすごい.

使うといっても自分はほとんど何もしていません.
ちょうどよいライブラリがあったのでそれをほんの少し書き換えただけで使用できました.
https://developer.mbed.org/users/masato/code/Nucleo_AQM1248A/
非常に簡単かつ,使いやすいです.感謝いたします.
ページにあるとおりaqm1248a_lcd.cppの上のほうのマクロを書き換えました.

#if defined(TARGET_LPC1768)
    //: _spi(p5,NC,p7),_reset(p6),_A0(p8),_CS(p11),GraphicsDisplay(name) // for mbed LPC1768
    : _spi(dp2,NC,dp6),_reset(dp9),_A0(dp10),_CS(dp11),GraphicsDisplay(name) // for mbed LPC1114FN28
#else // defined(TARGET_NUCLEO_L152RE) || defined(TARGET_KL05Z)
    //: _spi(D11,D12,D13),_reset(D9),_A0(D8),_CS(D10),GraphicsDisplay(name) // for nucleo L152RE or other
    : _spi(dp2,NC,dp6),_reset(dp9),_A0(dp10),_CS(dp11),GraphicsDisplay(name) // for mbed LPC1114FN28
#endif

reset,A0,CSはおそらくどのピンでも可能です.今回はそれぞれdp9,dp10,dp11を割り当てました.
よって配線は以下のとおり

LCD        LPC
Vdd       ->       3.3V
CS        ->       dp11
reset     ->       dp9
RS        ->       dp10
SCLK    ->       dp6
SDI       ->       dp2
Gnd      ->       GND



文字の表示と丸が端を回るサンプル

#include "mbed.h"
#include "aqm1248a_lcd.h"
#define TARGET_LPC1768

DigitalOut myled(LED1);
aqm1248a_lcd lcd;   //LCD宣言
int px,py;          //サークル座標

int main() {
    lcd.setmode(NORMAL);
    lcd.set_contrast(25);   //コントラスト調整
    lcd.cls();              //LCDクリア
    lcd.locate(10,15);
    lcd.printf("This is AQM1248A demo");
    lcd.locate(10,25);
    lcd.printf("   for LPC1114FN28   ");
    lcd.rect(8, 13, 118, 35, 1);
    lcd.circle(3, 3, 3, 1);
    while(1) {
        px=3,py=3;
        for(px=3;px<124;px+=3){
            lcd.fillcircle(px-3, py, 3, 0);
            lcd.circle(px, py, 3, 1);
            wait(0.1);
        }
        lcd.fillcircle(px-3, py, 3, 0);
        px=124,py=0;
        for(py=3;py<44;py+=3){
            lcd.fillcircle(px, py-3, 3, 0);
            lcd.circle(px, py, 3, 1);
            wait(0.1);
        }
        lcd.fillcircle(px, py-3, 3, 0);
        px=124,py=44;
        for(px=124;px>3;px-=3){
            lcd.fillcircle(px+3, py, 3, 0);
            lcd.circle(px, py, 3, 1);
            wait(0.1);
        }
        lcd.fillcircle(px+3, py, 3, 0);
        px=3,py=44;
        for(py=44;py>3;py-=3){
            lcd.fillcircle(px, py+3, 3, 0);
            lcd.circle(px, py, 3, 1);
            wait(0.1);
        }
        lcd.fillcircle(px, py+3, 3, 0);
    }
}





さすがmbed.いとも簡単に動かすことができました.
しかし,フォントなどを入れているので Flash 20.8kbyte,RAM 1.1kbyteとります.
できることは非常に多いグラフィック液晶ですが,デバック用途で数字を表示
させるだけであれば,I2c通信のキャラクタ液晶のほうがいいのかもしれません.
そちらのほうもいずれ触れていきたいところです.


2016年12月13日火曜日

マトリックスLEDで遊ぶ その2

前回秋月のマトリックスLEDで一列ごとにスクロールさせるプログラムを作ってみました.
今回はさらに文字をスクロールさせて遊んでみることにします.

ダイナミック点灯にはタイマ割り込みを使用しました.

Ticker name; タイマ初期化
name.attach(&fptr,time);  で使用します.
簡単ですね.私はRenesasのRXマイコンを使用したことがありますが,
そこでは割り込み発生にも苦労しました.

今回は100usの割り込みを発生させ,900us点灯->100us消灯->列をずらす処理に
しました.割り込み周期等は完全に感覚です.


スクロール処理は表示部分8bit×8とバッファ8bit×8を用意し,バッファすべてを表示させたら
次の文字をバッファに読み込むという処理です.これはメインループ.
真夜中に作ったもんで頭が回らず自分で見てもあんまりいいプログラムではないです.何回 i 使うんだ(笑) 一応メモ用に公開しておきます.

#include "mbed.h"
#include "dots.h"

BusOut row(dp27,dp13,dp5,dp14,dp9,dp11,dp6,dp10);     //Row Cathode
//BusOut col(dp25,dp2,dp1,dp28,dp4,dp26,dp18,dp17);     //Col Anode
BusOut col(dp17,dp18,dp26,dp4,dp28,dp1,dp2,dp25);     //Col Anode

Ticker led_ctrl;    //LED点滅
uint16_t    out_col=0,out_row=1,st_led=0;

uint8_t pat[8];  //LED表示パターン
uint8_t pat_buf[8];  //LED表示次パターン

//LED点滅用割り込み
void led_out(){
    switch(st_led){
        case 0: row = ~out_row;
                col = pat[out_col];
                out_row*=2;
                out_col++;
                if(out_row>255){
                    out_row=1;
                    out_col=0;
                }
                break;
        case 10: col=0x00;
                break;
             
        default:break;
    }
    st_led++;
    if(st_led>10) st_led=0;
}

int main() {
    int i,j;
    int shift=0;
    row = 0x00;    //COL初期化
    col = 0x00;    //ROW初期化
    led_ctrl.attach_us(&led_out,100);
 
    //配列初期化
    for(i=0;i<8;i++){
        pat[i] = 0x00;
    }
 
    //表示配列初期化
    for(i=0;i<8;i++){
        pat_buf[i] = h[i];
    }
 
    while(1){
        for(i=0;i<8;i++){
            //配列シフト
            for(j=0;j<7;j++){
                pat[j] = pat[j+1];
            }
            pat[7]=pat_buf[0];  //末尾に代入
            //配列バッファシフト
            for(j=0;j<7;j++){
                pat_buf[j] = pat_buf[j+1];
            }
            wait(0.25);
        }
     
        //表示させたいパターンを挿入
        shift++;
        if(shift>6) shift=0;
        switch(shift){
            case 0: for(i=0;i<8;i++){ pat_buf[i] = h[i];}
                    break;
                 
            case 1: for(i=0;i<8;i++){ pat_buf[i] = e[i];}
                    break;
                 
            case 2: for(i=0;i<8;i++){ pat_buf[i] = l[i];}
                    break;
                 
            case 3: for(i=0;i<8;i++){ pat_buf[i] = l[i];}
                    break;
                 
            case 4: for(i=0;i<8;i++){ pat_buf[i] = o[i];}
                    break;
                 
            case 5: for(i=0;i<8;i++){ pat_buf[i] = ex[i];}
                    break;
                 
            case 6: for(i=0;i<8;i++){ pat_buf[i] = 0x00;}
                    break;
         
            default:break;
        }
    }
}

今回の表示パターン

uint8_t h[8]= {
    0xc6,
    0xc6,
    0xc6,
    0xfe,
    0xc6,
    0xc6,
    0xc6,
    0x00
};

uint8_t e[8]= {
    0xfe,
    0xc0,
    0xc0,
    0xfc,
    0xc0,
    0xc0,
    0xfe,
    0x00
};

uint8_t l[8]= {
    0xc0,
    0xc0,
    0xc0,
    0xc0,
    0xc0,
    0xc0,
    0xfe,
    0x00
};

uint8_t o[8]= {
    0x7c,
    0xc6,
    0xc6,
    0xc6,
    0xc6,
    0xc6,
    0x7c,
    0x00
};

uint8_t ex[8]= {
    0x66,
    0x66,
    0x66,
    0x66,
    0x00,
    0x66,
    0x66,
    0x00
};



動作の様子




とりあえず好きなパターンを表示できるようになりました.
マトリックスLEDの制御は,配列の操作などがとにかくややこしい.
しかし,その分効率の良いコードを目指そうと頭を使うので,
結構勉強になります.
気が向いたらASCIIコードを表示,シリアルで文字列送信等をやる予定です.

2016年12月3日土曜日

LPC1114FN28 I2C通信テスト

前にmbedの基本的な使い方についてメモし,次はi2c,SPI,割り込みを
書きますなんていってましたが,具体的なサンプルもあったほうがいいと思うので
一つずつ書いていこうと思います.
今回はLPC1114FN28を二つ使用し,通信させてみます.

・回路

  回路図は省略します.
  SDA(dp5),SDL(dp27)を接続.それぞれを1k抵抗でプルアップします.
  1kで問題ありませんでしたが,2.2k程度が良いようです.
  それぞれのdp14に確認用LEDを配置します.



・プログラム


Slave
#include "mbed.h"
#define SLVADRS (0x20<<1)   //Slaveアドレス

I2CSlave slave(dp5, dp27);  //SDA,SCL
DigitalOut  myled(dp14);    //受信確認LED
int main() 
{
     char num[2];  //送信配列
     num[0] = 0;   //初期化
     slave.address(SLVADRS);  //Slaveアドレス設定
     while (1) {
         int i = slave.receive();   //受信
         if(i == I2CSlave::ReadAddressed){
             slave.write(num,1); //
             num[0]++;       //加算
             myled = !myled; //dp14よりトグル出力
        }
     }
}

Slaveが送信要求を受けるとLEDが点滅し,前回の送信+1の値を送信します.
今回のプログラムを応用することで,LPC1114をセンサとして使用なんてことも可能です.

Master
#include "mbed.h"
I2C i2c(dp5, dp27);  //SDA,SCL
Serial pc(dp16, dp15); //TX,RX
DigitalOut myled(dp14); //起動確認LED
const int addr = (0x20<<1); //スレーブアドレス
int main() {
    char buf[2];//受信配列
    int err;    //エラーチェック
    while(1) {
        err = i2c.read(addr, buf, 1);   //スレーブから受信
        wait(0.5);
        pc.printf("State = %d num =  %d\n",err, buf[0]);  //シリアル出力
        myled = !myled;         //dp14よりトグル出力
    }
}

Masterは1byte受信し,PCにシリアルで送信します.一応エラーチェックもします.
動作の様子


無事動作していることを確認しました.


i2cデバイスは,パラレル通信に比べピンの量を節約できるので,
積極的に活用していきたいところです.
特に同じ3.3VのデバイスであるRaspberry PIと2ピンで接続できるのはうれしい.

次回は割り込みorSPIについてサンプル書いていきたいと思います.

マトリックスLEDで遊ぶ

どうも,cake tetuです.
今回は気まぐれで買ってみたマトリックスLEDで遊んでみたメモです.
今回購入したのはこちら













秋月電子通商で購入した青色ドットマトリクスLED 8x8ドット MOA20UB018GJ
調子に乗って青色を買ってしまいました.
順方向電圧が3.5VあるのでLPC1114では動かないのでは?と思っていましたが
テストしたところあっさり動いたのでよしとしました.

・回路等
  回路図等は今回は省略,しかし注意すべき点はピンが少ないため
  オープンドレイン端子をつなぐことになるのですが,その際にLEDの
  カソード(今回はRow)に接続すること.これでピンをほぼすべて使い,何とか
  全LEDを制御できます.
  先述のようにマイコンはLPC1114FN28を使用,mbedで開発しました.
  
・テストで使用したプログラム
  今回使用したプログラムです.縦横にスクロールするように点灯します.

   #include "mbed.h"

    BusOut row(dp27,dp13,dp5,dp14,dp9,dp11,dp6,dp10);     //Row Cathode
    BusOut col(dp25,dp2,dp1,dp28,dp4,dp26,dp18,dp17);     //Col Anode
    int main() {
      int i;
      uint16_t j;
      row = 0;    //COL初期化
      col = 0;    //ROW初期化
      while(1) {
        //COL点灯8=>1
        j=128;
        for(i=0;i<8;i++){
          col = j;
          wait(0.1);
          j = j/2;
        }
        //COL点灯1=>8
        j=1;
        for(i=0;i<8;i++){
          col = j;
          wait(0.1);
          j = j*2;
        }
        //ROW点灯8=>1
        col = 255;
        j=128;
        for(i=0;i<8;i++){
          row = ~j;
          wait(0.1);
           j = j/2;
        }
        //ROW点灯1=>8
        j=1;
        for(i=0;i<8;i++){
          row = ~j;
          wait(0.1);
          j = j*2;
        }
        row=0;
      }
  }

  BusOutが非常に便利で,これにより適当にピンをつないでしまってもまとめて定義
  しなおすことができます.col,rowに8ビットで代入するだけで点灯させることが可能です.


  動作の様子
  


  見ているだけで楽しい(笑)


たかがLEDを点灯させるだけで簡単だろと思っていましたが,ピンの接続がややこしく,
予想外に時間がかかってしまいました.意外と奥が深いマトリックスLED.
気が向いたらシリアル通信で文字を送るプログラム等を製作したいです.
12月も忙しい予感がするのであんまりいろんなことできないかな

  
  

2016年12月1日木曜日

LPC1114FN28個人的まとめ(mbed)

どうもお久しぶりです。
大学がちょっと忙しく気付いたら11月終わる・・・
その間にもちょくちょく遊んではいましたが本格的に開発には至れませんでした。
そんな中,いまさらですがmbedで遊んでみたことを個人的にメモします.
リファレンス見るほうがはるかにわかりやすいかも.

・デジタル入出力

      DigitalOut name(pin);  デジタル出力設定
  DigitalIn name(pin);  デジタル入力設定
  
   name=1;のように書くことで動作します.

・アナログ入力

   AnalogIn   name(pin);   アナログピン入力設定
    val = name.read_u16()  値の読み出し
 
    上位12ビットが有効だとか
 

・PWM出力

PwmOut name(pin);  PWM出力設定
  Duty比の入力はname=val(float 0~1.0)のようにします.

  name.period(ms);
  周期を設定します.未指定の場合は20[ms]

  name.pulsewidth(val)
  パルス幅を設定します.サーボモータ等で使用できるかも.

・シリアル通信

Serial  name(tx, rx);  シリアルポートオープン
  name.baud(baudrate); クロックレート指定

  name.format(bits, parity, stop_bits)
  通信方式指定.当分は初期設定から動かすことはなさそう.

  val = name.getc(); 受信
  val = name.readable(); 受信チェック
  文字列の受信について少しひねる必要がありそう.

  name.putc('A'); 一文字送信
  name.printf("Hello");  数値,文字列などを送信
  未確認ですがputc()のほうが早いと思われます.
  センサデータなどをだらだら出力する使い方では,がんばって8bitに収めたほうが
  よさそうです.

  ※私の環境のせいなのかシリアル変換ケーブルのDTRピンを使用すると
シリアルポートを開いた時にマイコンが停止しました.設定で回避できるのかな・・・
    いずれは割り込みを使っていきたい.
 
今回プラスI2C,SPI,タイマ割り込み等を使用できれば,当分は自宅内の電子工作で困らなさそうです.使ってみた感想はmbedはArduinoより若干難しいレベルで本内容を全部チェックしても2時間ぐらいでした.しかし,いづれはガシガシレジスタをいじっていきたいところ.
とりあえず当分はmbedを使い,LCDやモータを回して遊びたいです.
次回はI2C,SPI,タイマ割り込み等を書きたいと思います.

2016年7月2日土曜日

LPC1114FN28の開発環境を構築

お久しぶりです。

これまではArduinoを多く触ってきましたが、今回さらに高性能なLPC1114FN28
にさわってみることにしました。
今回は秋月さんで購入しました。 秋月電子通商 LPC1114FN28



とりあえずLチカしてみようと思います。

開発環境にはmbedを使用しました。
導入の手順などはここにまとまっています。

プログラムは導入時に作成されたサンプルを使用しました。
LPCの14番ピンを0.2秒ごとにHigh or Lowさせるプログラムのようです。
コンパイルし、binファイルをダウンロードしました。

ここで回路を作成します。



(写真では実際に動作させています。)
使用したシリアル変換ケーブルはこちらです。
回路は非常に単純です。

  • 7番ピン->Vcc、8番ピン->GND
  • 22番ピン->GND、21番ピン->Vcc
  • 15番ピン->シリアル変換のTX、16番ピン->シリアル変換のRX
  • 14番ピンにLED->抵抗1KΩ->GND
  • 24番ピンに抵抗510Ω(後述)
その他電源にLEDを追加しています。

次にプログラムを書き込みます。
自分は素子にシリアル変換ケーブルから直接書き込むため、

  • bin->HEXに変換
  • 書き込み

この二つの手順を踏まなければなりません。
これを一度に解決してくれるすばらしいソフトが公開されていました。
http://www3.big.or.jp/~schaft/hardware/tips/LPC1114/page002.html

24番ピンを抵抗を介してGNDに落とし、書き込みモードで電源を入れます。
シリアル変換ケーブルを接続、COMを確認しbinファイルを指定。
書き込むボタンで簡単に書き込むことができます。

ここで一度、電源を切り、24番ピンをオープンにすることでプログラムが起動します。




以上でLチカは成功しました。次回からはシリアル通信などの
モジュールについてサンプルプログラムを試していきたいと思います。

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


2016年4月30日土曜日

スピーカのUSB電源化

プリングルスのキャンペーンでスピーカをもらった。



音質も悪くないし、コンパクトでちょっとおしゃれなので
家のデスクトップ用として使用したいが、電源が電池なので
扱いにくい。




電源を付け替えるだけのほんのちょっとした電子工作。





無事起動したが、ノイズがひどい。
電源をモバイルバッテリーに変えたところ改善したので
フィルタ等で改善しようと思う。

2016年4月11日月曜日

USB-シリアル変換モジュールのテスト

どうもcaketetuです。
先日体調を崩してしまい、一週間ほどぶっ倒れていました。
自分は健康優良児であると思っていたので驚きました。
日々の体調管理が大切なのですね。

さてそんな中、amazonで注文いていたUSB-シリアル変換モジュール
が届きました。
中国からの発送で3/27に注文したのが4/12にようやく届きました。





(下はテスト基盤)
3つ購入しました。
お世辞にも状態はよいとは言えませんでしたが、動作は問題なしでした。
値段も安くサイズも小さいため、組み込みにはぴったりです。

これでようやくArduinoゲーム機も開発できます。

2016年3月29日火曜日

Arduinoゲーム機の製作3

どうも、cake tetuです。

回路図ができたのでチェックします。
3.3Vでの動作を確認しました。
シリアルは3.3V対応のケーブルがまだ届いていないので未検証。
それ以外のモジュールについては正常に動作することを確認しました。

2016年3月21日月曜日

Arduinoゲーム機の製作2

一応回路図が完成したので投稿.
新型基盤回路図

いまいち回路図の描き方がわからないのでちょっと見づらいかも。
以前に作ったものからの変更点は、


  • 電圧を3.3Vに変更。
  • 電源に新たにUSBを追加。
  • 汎用IOポートをなくした。
  • パスコン追加
など
arduinoに使用されるATmega328は3.3Vでも動作するらしいので
LCDにあわせて電源をすべて3.3Vに統一。
以前は分圧していたので抵抗が減った分さらに小型化できるはず。

汎用IOポートは6つとかあっても絶対使わないので廃止。

書き込みケーブルからの電源のみだと非常に使いずらいため
USB電源を追加することに。

パスコンは電子回路のお約束らしいので追加。(いまいち動作わかっていない)

電気系の学生にあるまじき適当回路ですが、ブレッドボードで検証して
動けば良しとします。

ではまた。

2016年3月19日土曜日

Arduinoゲーム機の製作1

Arduinoを用いてゲーム機を製作したい。
回路は大昔に作ったものがある。

旧型基盤














Arduinoを用いたといってもCPUであるATmega328のみ使用し
互換性を持たせているだけ。

旧型基盤回路図


















液晶にこれを使いたかったのがはじまり。
ちなみに回路図にはUSBがあるが、実装段階でなくしてしまった。
しかしこの基盤をユニバーサル基盤で製作した結果、
  • 5Vなのが扱いずらく、分圧しなければならない。
  • でかい。
  • 電源が書き込みケーブルからしかとっていない。
  • 2,3ピンのスイッチが使えない。
  • たまに書き込めない時がある。
と問題だらけの基盤になってしまった。
よって今回小型化し、上記の問題を解決した基盤を作成しようと思う。

ではまた。

2016年3月15日火曜日

投稿テスト

どうもcake tetuです。
まだはじめて間もないですが、ここは練習もかねてブログのテストをします。
HTMLはわかりません・・・

投稿画面












googleらしくとてもシンプルでわかりやすいです。











このへんで基本的なフォントの編集ができる模様。
リンクもすごく簡単。



動画も貼り付けてみました。特に問題なし。





これだけの機能があれば特に困ることはなさそうです。
慣れてきたらレイアウトもこだわりたいところです。
それではまた。

はじめまして

こんにちは cake tetu と申します。
勉強のため、また日々のメモとしてブログをはじめることにしました。

普段は都市圏の大学に通う学生でございます。
主にデジタルガジェットのレビューや電子工作、プログラミング、その他の趣味について
自分用のメモ程度ですが投稿したいと思います。
誰かの参考になればと思います。