nucleo F030R8を使ってLEDコントローラのシールドを使ってみた
■nucleoを使う |
左は、Arduinoで、右が今回利用するボードです。
少し前に試したら、Lチカが簡単に実行できたので、その後の題材として頒布開始したばかりのSerial LED シールドをこのボードで使えるようにしてみることにしました。
mbedのパワーがあれば、このシールドが無くても制御できるかもしれませんが、LEDの演出を考えたりするのは大変だと思いますので、少しはニーズがあるかもしれないと思っています。
mbedのパワーがあれば、このシールドが無くても制御できるかもしれませんが、LEDの演出を考えたりするのは大変だと思いますので、少しはニーズがあるかもしれないと思っています。
しかし!
Arduinoのライブラリやプログラムに互換性がある訳ではないので、そこは移植作業を行う必要がありました。
※mbedがほとんど初体験なので、互換性を期待していたのですが、ありませんでした・・・orz
※mbedがほとんど初体験なので、互換性を期待していたのですが、ありませんでした・・・orz
最終的には、mbed用にシールド用の制御クラスを用意しましたので、nucleoに限らず他のmbedでもピンさえ合わせれば制御できるはずです。
さて、前置きはこのぐらいにして実際の動かし方を見てみましょう。
■ハードウェア |
まず、利用するPinですが、以下の図の赤枠の箇所を今回利用することにしました。
重要なのは、シリアルポートをSerial1のTx,Rxを利用するようにしました。Arduinoと同じように、ソフトウェアシリアル・・・と思ったのですが、ちょっとそんなライブラリがあるのかわからなかったので、簡単に利用できそうなSerial1を利用することにしました。
しかし、残念ながらシールド上のジャンパーピンでは、Serial1のTx(D10)に切り替えることができません。
そこで、ジャンパーのJP1上段にはジャンパーを挿入せずに、ジャンパーケーブルでJP1上段の中央PinとD10を結んであげる必要があります。ジャンパーとその結線を以下に示します。オス-メスのケーブルがあると便利ですね。
そこで、ジャンパーのJP1上段にはジャンパーを挿入せずに、ジャンパーケーブルでJP1上段の中央PinとD10を結んであげる必要があります。ジャンパーとその結線を以下に示します。オス-メスのケーブルがあると便利ですね。
■メインプログラム(サンプル) |
#include "mbed.h"
#include "SerialLedController.h"
/* Commands Table. Run sequentially. */
const uint8_t led_play_list[][SERIALCOMMAND_FIXEDLEN] =
{
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} */
};{ 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} */
// シリアルコントローラ用ライブラリのインスタンスを生成する。
// リセットとボーレート指定用のPIN番号を指定する。もし利用しない場合は-1を指定する。
SerialLedController controller(D4, D5);
// リセットとボーレート指定用の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.begin(&sr, true);
// 演出用のテーブルを与える。(コントローラにデータを転送する)
if(controller.write(led_play_list, sizeof(led_play_list))){
// 転送に成功したら演出を開始する。
controller.start();
}controller.start();
void loop()
{
}
{
}
int main()
{
{
setup();
while(1)
{
}while(1)
{
loop();
}このアプリで演出を検討して、コード生成のボタンを押下すると、Arduino用のコードが生成されます。
生成されたコードの赤枠にある数字列を先のエリアに張り付ければOKです。
※ニーズがあれば、mbed用のコード生成を作っても良いのですけどね・・・
生成されたコードの赤枠にある数字列を先のエリアに張り付ければOKです。
※ニーズがあれば、mbed用のコード生成を作っても良いのですけどね・・・
■動作確認 |
mbedで動作させると以下のような演出が確認できると思います。
下記の例は、Ext端子に32個のLEDを搭載した場合ですが、フロントの8個でも似た感じで見れると思います。