こんにちはコハペペです。YouTubeのチャンネルの電子ペーパーの投稿で、mbedねこちゃんでY's
Lab INC.のY-CONに画像を表示したいという方がおられたので、おためしのプログラムを作ってみました。制作過程を順を追って書いてみました。参考にして頂ければ幸いです。
しかしながら、このモジュールは持っていないため、実際に動作するかは未確認なところご了承ください。
Y-CONはY's Lab INC.が販売している電子ペーパーのモジュールです。
調べてみると、シリアル通信でモノクロBMPのファイルをそのまま送信することで、画像が表示できるようです。mp3デコーダICみたいな感じに使える電子ペーパーモジュールですね。
そのため、
- SDFileSystemを使ってSDカードからBMPファイルを読み込んで
- データをシリアル通信でY-CON電子ペーパーへ出力する
というプログラムを作ればよさそうです。それでは作っていきましょう。
1.SDカードを使うためのライブラリのインポート
mbedCompilerでプロジェクトを新規作成します。プロジェクト名はycon_testにしました。
ここにSDカードを使えるようにするためのライブラリーのSDFileSystemをインポートします。
SDFileSystemをクリックすると下のような画面になるので、右側のImport Compilerをクリックします。
Target Pathを先ほど新規作成したプロジェクト名「ycon_test」にして[Import]をクリック。
これで、FileSystemライブラリがインポートできました。ここで試しにコンパイルしてみて下さい。
大量のコンパイルエラーがでます。
2.mbedライブラリの変更
LPC1114でFileSystemを使うとmbedライブラリにバグがあるようなので、mbedライブラリを過去のバージョンに変更します。
プロジェクトの中の[mbed]をクリックして、右側のリビジョンをクリックします。
リビジョン137を選んで、右クリックして「ワーキングコピーをこのリビジョンに切り替える」をクリックします。mbedライブラリが過去のバージョンになります。コンパイルをしてみて下さい。
コンパイルが通ります。
3.SDファイルにアクセスするためのプログラムを追加
SDカードとマイコンの配線は以下のような設定です。
- SDカードのMISO LPC1114の1番ピン
- SDカードのMOSI LPC1114の2番ピン
- SDカードのCS LPC1114の4番ピン
- SDカードのSCK LPC1114の6番ピン
- SDカードの3V3 ブレッドボードの電源
- SDカードのGND ブレッドボードのGND
です。
プログラムは以下の通りです。
#include "mbed.h"
#include "SDFileSystem.h"
//SDFileSystem name(mosi, miso, sck, cs, mount);
SDFileSystem sd( dp2, dp1, dp6, dp4, "sd");
int main() {
FILE *fp = fopen("/sd/test.bmp", "r"); //ファイルを開く
if(fp != NULL) {
;//ファイルが開けたので何か処理をする
}
fclose(fp); //ファイルを閉じる
free(fp); //解放
}
test.bmpというファイルを、fopneで開いて、ifの{ }で何か処理をして、fcloseで閉じます。
このままだと、単に開いて閉じるだけのプログラムです。
4.シリアルポートクラスを用意して通信速度を設定する
シリアル通信をするにはSerialクラスを使います。
SDFileSystem sd(.... の下の行に
Serial ycon(USBTX, USBRX);
を追加します。USBTXはLPC1114の16ピン、USBRXは15ピンに対応しています。
通信速度を設定するためにmain()の下に
ycon.baud(115200);
を追加します。Y-CONは商品のページによると115200のようです。
プログラムはこんな感じです。
#include "mbed.h"
#include "SDFileSystem.h"
//SDFileSystem name(mosi, miso, sck, cs, mount);
SDFileSystem sd( dp2, dp1, dp6, dp4, "sd");
Serial ycon(USBTX, USBRX);
int main() {
ycon.baud(115200); //通信速度をY-CONのビットレートに設定する
FILE *fp = fopen("/sd/test.bmp", "r"); //ファイルを開く
if(fp != NULL) {
;//ファイルが開けたので何か処理をする
}
fclose(fp); //ファイルを閉じる
free(fp); //解放
}
これで、SDカードのファイルのオープンと、シリアル通信の用意ができました。
5.ファイルの内容をシリアルに出力する
ファイルから1バイト読み込んで、そのデータをシリアルへ出力します。
ファイルの最後まで繰り返すプログラムはこんか感じになります。
int data;
while (1){ //ループ
data = fgetc(fp); //1バイト読み込む
if( data == EOF ) //ファイルの終わりかチェック
break; //ファイルの終わりならばループを抜ける
ycon.putc((unsigned char)data); //シリアルに1バイト送信
}
これを先ほどのif{ } の中に追加します。
プログラム全体はこうなりました。
#include "mbed.h"
#include "SDFileSystem.h"
//SDFileSystem name(mosi, miso, sck, cs, mount);
SDFileSystem sd( dp2, dp1, dp6, dp4, "sd");
Serial ycon(USBTX, USBRX);
int main() {
ycon.baud(115200); //通信速度をY-CONのビットレートに設定する
FILE *fp = fopen("/sd/test.bmp", "r"); //ファイルを開く
if(fp != NULL) {
int data;
while (1){ //ループ
data = fgetc(fp); //1バイト読み込む
if( data == EOF ) //ファイルの終わりかチェック
break; //ファイルの終わりならばループを抜ける
ycon.putc((unsigned char)data); //シリアルに1バイト送信
}
}
fclose(fp); //ファイルを閉じる
free(fp); //解放
}
6.テスト
Y-CONを持っていないので、表示ができるかどうかの確認はできないため、送信内容をパソコンで受信して、データが正しく送信されているか確認します。
LPC1114とmbedねこちゃんを以下のように配線します。
- LPC1114の15ピン ねこちゃんの緑の端子の14Rx
- LPC1114の16ピン ねこちゃんの緑の端子の13Tx
パソコンのソフトはテラタームを使いました。テラタームの設定は以下の途中くらいを参考にしてください。
SDカードに適当なtest.bmpを保存して、SDカードスロットに刺します。
先ほど作ったプログラムをコンパイルします。エラーがなければ書き込み用のデータがダウンロードできるので、そのファイルをmbedドライブにコピーします。コピーが完了すれば、マイコンへの書き込みも完了します。
配線の全体像はこんな感じです。
mbedねこちゃんの赤いリセットボタンを押すと、プログラムが実行されtest.bmpの内容がパソコンに送信されます。テラタームでの受信結果はこんな感じになりました。
バイナリのデータをテキスト表示しているのでめちゃめちゃになっていますが、最初の出だしが「BM...」 となっていてBMPファイルの識別子が表示されてます。ログをバイナリで保存して、元のファイルと内容が同じかどうか確認してみました。
左がSDに入っていたファイルのデータ、右がテラタームで受信したデータです。ファイルの終わりまでピッタリ同じでした。
これでSDのBMPファイルの内容が、そのままシリアルに出力されていることが確認できました。
7.Y-CONとの配線
Y-CONとLPC1114との配線は最低限以下の3本が必要です。
- Y-CONのVCC ブレッドボードの電源
- Y-CONのGND ブレッドボードのGND
- Y-CONのRX LPC1114の16番ピン
8.まとめ
mbedねこちゃん&LPC1114で、Y's Lab INC.のY-COMにbmpデータを表示できるかもしれないプログラムを作ってみました。もし動作を確認できましたらコメント頂けるとありがたいです。
コメント