エビデイエビナイ電子工作

やったことの記録

aitendoの超小型OLEDを使ってみる #1

f:id:Rappy:20190215165246j:plain

aitendoでOLED(有機EL)モジュールを購入しました。

http://www.aitendo.com/product/14959www.aitendo.com

M096P4(BL)は画面サイズわずか0.96インチ、基盤寸法は29x27mmという超小型OLEDモジュールです。 高輝度、高視野角で、I2Cで通信を行うため小ピンマイコンでも制御が可能です。

今回はこれを、手元にあったATmega88で制御してみます。


マイコンに接続する

OLEDモジュールとマイコンに3.3Vの電源を接続し、それぞれのSCL, SDAピン同士を繋ぎます。 SCL, SDAは共に10kΩでプルアップしておきます。 また、通信開始用のタクトスイッチもPB0に接続しておきます。


f:id:Rappy:20190215230738p:plain
回路図(電源は省略)


通信フォーマット

f:id:Rappy:20190215172614p:plain
SSD1306の通信フォーマット

OLEDモジュールの制御IC SSD1306データシートを見ると、I2Cで通信を行う際のデータフォーマットは上図のようになっています。

はじめにスレーブアドレスとR/Wビットを送信します。ACKが返ってきたらコントロールバイト、データバイトの順に送信します。

コントロールバイトの Coビットは、0に設定すると次に送信するバイト以降をすべてデータバイトとして解釈しますが、1に設定すると、コントロールバイトの次の1バイトのみ、データバイトとして解釈します。

D/C#ビットは、制御コマンドを送る際は0、データを送る際は1に設定します。


初期設定を行う

f:id:Rappy:20190215172908p:plain
初期設定の流れ

OLEDを使うには初めに幾つかの設定を行う必要があります。

図のような流れで初期設定を行いますが、このモジュールはチャージポンプの設定と表示ONのみ設定すれば画面が表示されるようです。


f:id:Rappy:20190215201952p:plain f:id:Rappy:20190215204755p:plain

データシートの表によると、チャージポンプ設定は0x8D、チャージポンプ有効は0x14、表示ONは0xAFのコマンドを送信すればよさそうです。


表示させてみる

以上のことから、最低限画面を表示するには、0x00 0x8D 0x14 0xAFの順でコマンドを送信すれば良いことになります。


f:id:Rappy:20190215213213j:plain
画面が点灯し、ノイズが表示された

通信開始用のスイッチを押すと、画面が点灯し、ノイズが表示されました。 これは、画像データRAMの初期化を行っていないためです。

次回は画像データRAMを初期化し、画面をクリアするところから初めてみようと思います。


参考


https://twitter.com/__Rappy__twitter.com

LPCマイコンでARM開発 #3 ~割り込み編~

LPC1114FN28は、ARMのCortex-M0というコアを搭載しています。ARM Cortex-Mシリーズのマイコンには、NVIC(Nested Vectored Interrupt Controller) と呼ばれる割り込み専用のコントローラが内蔵されています。

NVICは、割り込みの種類に応じた割り込みハンドラの呼び出し, 複数の割り込みが発生したときの割り込み処理順序の決定, 割り込み処理間の効率化など、割り込みに関する処理を行います。


SysTickタイマを利用したタイマ割り込み

ARMマイコンは、SysTickタイマと呼ばれるペリフェラルを持っています。SysTickタイマは、値をセットしておくとカウントダウンしていくタイマで、タイマの値が0になったとき割り込みを発生させることができます。

この機能を利用して、Lチカプログラムを書いてみます。

#ifdef __USE_CMSIS
#include "LPC11xx.h"
#endif

#include <cr_section_macros.h>

#define LED_DELAY 500

int main(void) {

    /*ポートの初期化*/
    LPC_IOCON->PIO0_7 = 0xd0;

    /*ポートの方向を設定*/
    LPC_GPIO0->DIR |=  (1<<7);

    /*ポートの出力設定*/
    LPC_GPIO0->DATA |= (1<<7);

    /*SysTickタイマの設定*/
    SysTick_Config(SystemCoreClock / 1000);

    while(1);

    return 0 ;
}

/*SysTickタイマ割り込みハンドラ*/
void SysTick_Handler(void){
    static uint16_t cnt = 0;
    cnt++;
    if(cnt >= LED_DELAY){
        LPC_GPIO0->DATA ^= (1<<7);
        cnt = 0;
    }
}

SysTick_Config() は、SysTickタイマに設定する値を指定する関数です。引数として SystemCoreClock(マイコンの動作クロック周波数。デフォルトで48M) を渡すと、48Mの値を48MHzでカウントすることになり、結果として一秒ごとに割り込みが発生します。 今回は SystemCoreClockの値を1000で除算することで、1msごとの割り込みを実現しています。

ディレクトリの cr_startup_lpc11xx.cを見ると、SysTickタイマの割り込みハンドラがSysTick_Handler という名前で定義されています。 これにはWEAKシンボルがついているので、メインのソースファイルで新たに定義して利用することができます。

このプログラムでは、割り込みハンドラ内で値をカウントし、カウントした値がLED_DELAY以上になったとき、つまり500msごとにLEDの出力を反転させています。


動作確認

28番ピン(GPIO0_7ポート) にLEDと抵抗を接続し、動作を確認してみます。

www.youtube.com

きちんと500msごとにLEDが点滅しています。


おわりに

どうやらLPCマイコンではデフォルトでDelay関数が用意されていない(実はあるかもしれない) ようなのでSysTickタイマを使ってLチカしてみました。割り込み編と言っておきながらタイマ割り込みしか試しませんでしたが、他の割り込みについても必要になったら試してみようと思います。


twitter.com

LPCマイコンでARM開発 #2 ~書き込み編~

今回は書き込み編です。

前回の記事では書き込み用のhexファイルを生成するところまでやりました。今回は、実際に生成したhexファイルをマイコンに書き込んでいくのですが、まずは簡単なプログラムを書いてみます。


簡単なプログラムを書いてみる

MCUXpresso IDE でメインのcソースを開くと、iをインクリメントするだけのダミーコードが記述されています。

このダミーコードを削除し、main関数内に次のプログラムを書いていきます。

int main(void) {

    int8_t sw;

    /*ポートの初期化*/
    LPC_IOCON->PIO0_7 = 0xd0;
    LPC_IOCON->PIO0_1 = 0xd0;

    /*ポートの方向を設定*/
    LPC_GPIO0->DIR |=  (1<<7);
    LPC_GPIO0->DIR &= ~(1<<1);

    while(1){
        sw = !LPC_GPIO0->MASKED_ACCESS[(1<<1)]; //マスク処理

        if(sw){
            LPC_GPIO0->DATA |=  (1<<7); //LED点灯
        }
        else{
            LPC_GPIO0->DATA &= ~(1<<7); //LED消灯
        }
    }

    return 0 ;
}

スイッチを押している間LEDが点灯するだけのプログラムです。 これをビルドし、hexが生成されていることを確認します。


PCとマイコンを接続する

書き込み時には PCとマイコン間での通信を行うため、それぞれを接続する必要があります。

LPC1114FN28/102は、UART経由でプログラムが書き込めるよう出荷時にブートローダが書き込まれています。 そのため、特別なライタなどを用意しなくても USB/シリアル変換器があればプログラムを書き込むことができます。


akizukidenshi.com

今回は秋月のUSB/シリアル変換器を使用します。 接続は以下の通りです。


USB/シリアル変換器 LPC1114FN28/102
19番ピン(3V3) 21番ピン(3.3v IN), 7番ピン(Analog 3.3v In)
24番ピン(GND) 22番ピン(0V), 8番ピン(Analog 0V)
1番ピン(TXD) 15番ピン(rx)
5番ピン(RXD) 16番ピン(tx)
2番ピン(DTR#) 23番ピン(nR)
3番ピン(RTS#) 24番ピン(dp24)

外付け部品としてLEDとスイッチもつけておきます。 次の回路図の通り配線します。


f:id:Rappy:20190127180855p:plain
回路図1

あとはUSB/シリアル変換器とPCのUSBポートをつなげば、ハード側の準備は完了です。 次はソフト側の準備をしていきます。


Flash Magic をインストールする

プログラムをマイコンへ書き込むには専用のソフトウェアが必要です。 書き込みにはフリーのソフトウェア Flash Magic を使うことにします。

まずは公式のダウンロードページから最新版の Flash Magic をダウンロードします。


f:id:Rappy:20190127150104p:plain
ウィザードに従ってインストールを進める

ダウンロードが完了したら実行ファイルを開き、ウィザードに従ってインストールを進めます。


f:id:Rappy:20190127150553p:plain
書き込みの設定をする

インストールが完了しました。Flash Magicを開き、書き込みの設定をしていきます。


Communicationsの設定

  • Select... をクリックし、ターゲットとなるマイコンである LPC1114/102 を選択します。

  • COM Port ではUSB/シリアル変換器が接続されているCOMポート番号を選択します。

  • Baud Rate を 115200 , Interface を None(ISP) , Oscillator を 12.0 に設定します。


Eraseの設定

  • Erase blocks used by Hex File にチェックを入れます。


Hex Fileの選択

  • Browse... からビルドしたプログラムのhexファイルを選択します。


Optionsの設定

  • Verify after programmingFill unused Flash にチェックを入れます。


さて、これでソフト側も準備が整いました。 Start を押して書き込みを開始します。


動作の確認

書き込みが完了したら、マイコンに接続されたスイッチを押してみましょう。


f:id:Rappy:20190127184551j:plain
スイッチを押すと...


f:id:Rappy:20190127184755j:plain
点灯!

LEDが点灯しました! うまくいったようです。


おわりに

実は、32bitのマイコンでの開発はこれが初めてです。 今回はLEDを点灯させただけですが、やはり初めての環境での最初の一歩はワクワクしますね。 面倒な環境構築が終わったので、これからは32bitマイコンのスペックをフル活用できるまで使い倒してみたいです。

今後もどんどん新しいことをして、どんどんブログを更新していくのでよろしくお願いします!


twitter.com

LPCマイコンでARM開発 #1 ~開発環境構築編~

秋月でLPCマイコンを購入してみました。


f:id:Rappy:20190126215948j:plain
LPC1114FN28/102

LPCマイコンは、NXPセミコンダクターズ社(元PHILIPS半導体事業) が販売している32bitマイコンで、ARMアーキテクチャを採用しています。

今回購入した LPC1114FN28/102 は、ARMマイコンでは珍しいDIPパッケージなので、ブレッドボードに挿して容易に実験することが出来ます。


開発環境を構築する

さて、早速マイコンを動かしてみようと思うのですが、まずは開発環境を整える必要があります。

今回は NXPセミコンダクターズが推奨している統合開発環境 MCUXpresso IDE を使ってみます。


f:id:Rappy:20190126235243p:plain
MCUXpresso IDEをダウンロードする

まずはこちらから MCUXpresso IDE をダウンロードします。

製品をダウンロードするには事前にユーザ登録とログインをしておく必要があります。


f:id:Rappy:20190127000010p:plain
ウィザードに従ってインストールする

ダウンロードした実行ファイルを起動し、ウィザードに従ってインストールを進めていきます。 これでインストールは完了です。


新規プロジェクトを作る

MCUXpresso IDEを立ち上げ、画面左下のクイックスタートから New project... をクリックします。


f:id:Rappy:20190127000641p:plain
ターゲットデバイスにLPC1114FN/102を選択

ここでは開発に使用するマイコンボードを選択することができますが、今回はマイコン単体で開発していくので、左下の Preinstalled MCUs から LPC1114FN/102 を選択します。


f:id:Rappy:20190127001052p:plain
C Projectを選択

C言語で開発するので C Project を選択します。


f:id:Rappy:20190127001146p:plain
プロジェクト名を設定

プロジェクト名を決めます。適当に test としておき、次に進みます。


f:id:Rappy:20190127003242p:plain
CMSISライブラリをインポート

次に、CMSISライブラリをインポートします。CMSISライブラリでは、GPIOなどのペリフェラルのアドレスや割り込みの種類、割り込みハンドラ名などがマクロで定義されています。そのため、利用することで可読性が高く保守しやすいプログラムを書くことができます。

Import... をクリックし、Archiveの項目でCMSISライブラリの場所を指定します。LPC1114 のCMSISは、

nxp/MCUXpressoIDE_xxx/ide/plugins/com.nxp.mcuxpresso.tools.wizards_xxx/Examples/Legacy/NXP/LPC1000/LPC11xx/

にあります。


f:id:Rappy:20190127004037p:plain
CMSIS_CORE_LPC11xxを選択

インポートしたら CMSIS Core library の項目を CMSIS_CORE_LPC11xx に設定し、次に進みます。


f:id:Rappy:20190127004745p:plain
CMSIS_DSPLIB_CM0を選択

次の画面でも、同じくプルダウンメニューから CMSIS_DSPLIB_CM0 を選択します。

Finishを押してプロジェクト完成です!


CMSISライブラリの編集とプロジェクトの設定


f:id:Rappy:20190127005214p:plain
エクスプローラからsystem_LPC11xx.cを開く

インポートしたCMSISを編集します。

画面左のエクスプローラで CMSIS_CORE_LPC11xx の src フォルダから system_LPC11xx.c を開きます。

128行目くらいにある

#define SYSPLLCLKSEL_Val  0x00000001

となっている部分を、

#define SYSPLLCLKSEL_Val  0x00000000

に書き換えます。

デフォルトではクロック源として外部発振器の接続を想定しています。ですが今回はクロック源に内部RCオシレータを使用するため、設定値を変更する必要があります。

次は、ビルド時に書き込み用のhexファイルを生成するように設定します。


f:id:Rappy:20190127005645p:plain
プロジェクト名を右クリック、プロパティを開く

エクスプローラから先ほど設定したプロジェクト名を右クリック。プロパティを開きます。


f:id:Rappy:20190127010026p:plain
コマンドを編集する

ウィンドウ左のメニューから C/C++ Build → Settings → Build Stepsタブまで進み、Post-build stepsのコマンドを、下記のように編集します。

arm-none-eabi-size "${BuildArtifactFileName}"
arm-none-eabi-objcopy -O ihex "${BuildArtifactFileName}" "${BuildArtifactFileBaseName}.hex"
# checksum -p ${TargetChip} -d "${BuildArtifactFileBaseName}.bin"

これでビルド時にhexファイルが生成されるようになりました。確認してみましょう。


f:id:Rappy:20190127013519p:plain
Debugフォルダ内にtest.hexが生成されている

クイックスタートからプロジェクトをビルドすると、エクスプローラにDebugフォルダが表示されます。

フォルダ内に [プロジェクト名].hex というファイルが生成されいれば成功です。


おわりに

今回は、環境構築編ということで IDEのインストールからプロジェクトの設定までやってみました。 次回は書き込み編として、実際に簡単なプログラムをマイコンに書き込んでみようと思います。

また、はてブロ初の投稿でしたが、このブログでは電子工作を中心に自分がやったこと学んだことをマイペースに更新していこうと思います。未熟なスキルと拙い文章ですがぜひ今後もよろしくお願いします。


twitter.com