carcon999のブログ

12年間Y!ブログの記載を移行しました。電子工作関連の記事が多いです。

nucleo F030R8を使ってLEDコントローラのシールドを使ってみた

■nucleoを使う
先日、頒布を開始したこともあり少しモチベーションが上がっているので、ちょっと変わったことを試してみようと思い、前に購入して積んであった、NUCLEO F030R8を取り出してみました。

イメージ 1

左は、Arduinoで、右が今回利用するボードです。

このボードは、2,000円を切る価格で非常にお買い得感のあるボードです。
購入の目的は、その金額もそうですがmbedのWeb開発環境を一度体験するのが目的で購入したものです。

少し前に試したら、Lチカが簡単に実行できたので、その後の題材として頒布開始したばかりのSerial LED シールドをこのボードで使えるようにしてみることにしました。
mbedのパワーがあれば、このシールドが無くても制御できるかもしれませんが、LEDの演出を考えたりするのは大変だと思いますので、少しはニーズがあるかもしれないと思っています。

イメージ 2

■mbedでのプログラム

右側の基板をよく見るとわかりますが、Arduinoのシールドが入るようなPin配置になっています。

しかし!

Arduinoのライブラリやプログラムに互換性がある訳ではないので、そこは移植作業を行う必要がありました。
※mbedがほとんど初体験なので、互換性を期待していたのですが、ありませんでした・・・orz

最終的には、mbed用にシールド用の制御クラスを用意しましたので、nucleoに限らず他のmbedでもピンさえ合わせれば制御できるはずです。

イメージ 3

さて、前置きはこのぐらいにして実際の動かし方を見てみましょう。

■ハードウェア

まず、利用するPinですが、以下の図の赤枠の箇所を今回利用することにしました。
重要なのは、シリアルポートをSerial1のTx,Rxを利用するようにしました。Arduinoと同じように、ソフトウェアシリアル・・・と思ったのですが、ちょっとそんなライブラリがあるのかわからなかったので、簡単に利用できそうなSerial1を利用することにしました。

イメージ 4

しかし、残念ながらシールド上のジャンパーピンでは、Serial1のTx(D10)に切り替えることができません。
そこで、ジャンパーのJP1上段にはジャンパーを挿入せずに、ジャンパーケーブルでJP1上段の中央PinとD10を結んであげる必要があります。ジャンパーとその結線を以下に示します。オス-メスのケーブルがあると便利ですね。

イメージ 5

イメージ 6

■ソフトウェア

GitHubにサンプルを公開しました。
ここからダウンロードして、mbedに取り込んでください。
※取り込み方は省略します。

■メインプログラム(サンプル)
// include library codes
#include "mbed.h"
#include "SerialLedController.h"

/* Commands Table. Run sequentially. */
const uint8_t led_play_list[][SERIALCOMMAND_FIXEDLEN] =
{
// 以下の演出テーブルを変更することで別な演出に切り替えることが可能です。
{ 0x94, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, /* {"name":"script","ctrl":148,"mode":1} */
{ 0x90, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00 }, /* {"name":"system","ctrl":144,"length":32,"wait":0} */
{ 0x95, 0x40, 0x00, 0x05, 0xf4, 0x01, 0x00, 0x00 }, /* {"name":"rainbow","ctrl":149,"bright":64,"mode":0,"wait":5,"loop":500} */
{ 0x97, 0x40, 0x03, 0x0a, 0x04, 0x00, 0x00, 0x00 }, /* {"name":"seesaw","ctrl":151,"bright":64,"loop":3,"wait":10,"rgbflag":4} */
{ 0x92, 0x00, 0x00, 0x00, 0x20, 0x00, 0x0a, 0x00 }, /* {"name":"shift","ctrl":146,"dir":0,"mode":0,"count":32,"wait":10} */
{ 0x94, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, /* {"name":"script","ctrl":148,"mode":0} */
};

// シリアルのインスタンスを生成する。
// TXとRXのPIN番号を指定する。
Serial sr(D10, D2);

// シリアルコントローラ用ライブラリのインスタンスを生成する。
// リセットとボーレート指定用のPIN番号を指定する。もし利用しない場合は-1を指定する。
SerialLedController controller(D4, D5);

void setup()
{
// シリアルクラスと、通信速度(true:57600, false:19200)を指定する
controller.begin(&sr, true);

// 演出用のテーブルを与える。(コントローラにデータを転送する)
if(controller.write(led_play_list, sizeof(led_play_list))){
// 転送に成功したら演出を開始する。
controller.start();
}
}

void loop()
{
}

int main()
{
setup();

while(1)
{
loop();
}
}

■LED演出の変更方法

コメントにも書いていますが、テーブルの中の数字羅列を変更していただければ、そのLED演出を行います。
この数値列のドキュメントは、こちらになります。

ドキュメントから作るのは少し大変なので、Windows版アプリでソースコードを生成してもらえると割と簡単に作れます。
アプリケーションは、こちらにあります。

このアプリで演出を検討して、コード生成のボタンを押下すると、Arduino用のコードが生成されます。
生成されたコードの赤枠にある数字列を先のエリアに張り付ければOKです。
※ニーズがあれば、mbed用のコード生成を作っても良いのですけどね・・・

イメージ 7

■動作確認

mbedで動作させると以下のような演出が確認できると思います。
下記の例は、Ext端子に32個のLEDを搭載した場合ですが、フロントの8個でも似た感じで見れると思います。