MATSU bed config
概要¶
このページでは自作mbed互換機 MATSU-bed(mbed_pro_mini)の使い方について解説します。
正式名称はmbed_pro_miniのつもりでしたし、シルクにもそう書いてありますが、mbedが登録商標で使えないかも知れないのということ、みんなが松bedと呼ぶのでとりあえずはMATSU-bedということにします。
MATSU-bedは本家の青Mbed(LPC1768)の代わりにロボットなどに組み込むことを前提に、安価で小型なマイコンボードを目指して開発しました。
単体でUSB,RS485,CANなどの通信に対応しており、コンピューターとデバイスの通信変換器としても使用できます。
特徴¶
- Microcontroller features
- NXP LPC1549 MCU
- ARM® Cortex™-M3 Core
- 72MHz, 36KB RAM, 256KB FLASH
- 4 x SCT(State Configurable Timer)
- USB Device, 2xSPI, I2C , UART, 14xADC, GPIO, CAN, RS485
- UART, CAN and USB ISP support
- Board Features
- Board size is 18mm x 36mm
- Contain transceiver-ic of RS485 and CAN
- Built-in USB drag 'n' drop FLASH programmer
- 4 LEDs
ピンアサイン¶
- シルクでPxの様に描かれていたらプログラム上のGPIOではP0_xと宣言してください。
- (例:P1 →P0_1)
- ピンアサインには書かれていませんが、UART、SPI、PWMは基本的にどのIOピンにも割り当てることができます。
- LPC1549のスイッチマトリクスによるものです
- RS485やCANを使うときはマイコンボード裏面のジャンパをショートして下さい
- シルクで数字の後に*(アスタリスク)が付いているピンはRS485又はCANと機能を共有しており、裏面に実装されているトランシーバICに接続されています。これらの通信を使う際はマイコンボード側面のピンはIOとして使えません。
- ただし、通信の内容もそれらのピンに現れるのでデバッグに役立てて下さい。
- ISPボタンはデジタル入力として使うことができます。
- ただし、ISP1はUSBの5Vにプルアップされており、このピンの状態でUSB接続を認識しています。USBでの通信とISP1のデジタル入力の併用は推奨できません。
LED, ISPピンなどの汎用的なピンを定義したヘッダファイルをMATSUbed.hとして公開してます。
Import libraryMATSUbed
MATSU-bed PIN definition
このライブラリをインポート後、
#include "MATSUbed.h"
と宣言するだけでLED1やLED2などの各種ピンを使用することができるようになります。
サンプルコード¶
Import programMATSU-bed_blinky
MATSU-bedのLチカ用サンプルプログラム
main.cpp
#include "mbed.h" #include "USBSerial.h" #include "MATSUbed.h" //USBSerial pc; BusOut myled(LED1, LED2, LED3, LED4); //DigitalIn sw1(ISP0); //DigitalIn sw2(ISP1); int main() { //sw1.mode(PullUp); myled = 0b0001; while(1){ if(myled < 0b1000){ wait(0.5); myled = myled << 1; }else{ while(myled != 0b0001) { wait(0.5); myled = myled >> 1; } } } }
プログラムの書き込み¶
MATSU-bedに使われているLPC1549ではUSB、UART、CANの3つのISP(In-Application Program)に対応しています。このうちここではUSB-ISPについて解説します。
USB-ISPは通常のmbedと同じようにUSBストレージとしてPCにに読み込まれ、BINファイルのドラッグ&ドロップすることでプログラムを書き込むことができます。
- マイコンボードをPCとUSBで接続する
- ISP0のボタンを押す(押し続ける)
- ISP0を押し続けた状態で、RESETボタンを押す。
- ISP0を押し続けた状態で、RESETボタンを離す
- RESETボタンを離した後、ISP0ボタンを離す
- RESETボタンを離すとPCにUSBストレージとして認識される
- USBストレージの中に入っているfirmware.binを削除する
- 空になったUSBストレージに書き込みたいBINファイルをコピーする
- 書き込みが完了したらRESETボタンを押すとプログラムが走りだす
なお、MS-DOSのファイル操作が必要になるため、macOS/Linuxではmtoolsを使用してバイナリを書き込みます。 https://www.itmedia.co.jp/help/tips/linux/l0317.html
シリアルデバッグ¶
通常のmbedプラットフォームではターゲットマイコンの他にインターフェースチップが搭載されており、USBコネクタはこのインターフェースチップに接続さています。
インターフェースチップはPCとターゲットマイコンとを中継し、ドラック&ドロップによる書き込みやUSB仮想シリアル通信を可能にしています。
しかし、MATSU-bedではコスト削減のためにインターフェースチップが搭載されておらず、USBは直接マイコンにつながっています。このためUSB仮想シリアル通信をソフトウェア的に実装する必要がありました。
幸いその機能はUSBSerialとして既に公開されています。
Windows上で必要なドライバ
WindowsでUSBSerialの機能を使うためにはここからドライバをダウンロードして、デバイスマネージャからドライバを読み込んで下さい。
LinuxやOS Xではドライバを追加インストールする必要はありません。
先のLチカ用サンプルコードでは既にインポートされています。"USBSerial.h"をincludeして"USBSerial pc;"の様にオブジェクトを生成すれば、あとは通常のシリアル通信と同様にprintf関数などが使えます。以下が最も簡単なサンプルコードです。
main.cpp
#include "mbed.h" #include "USBSerial.h" USBSerial pc; int main() { while(1){ pc.printf("hello MATSU-bed Serial over USB!!!\n"); wait(1); } }
接続したコンピュータにMATSU-bedのソフトウェアシリアルが認識されるまで若干ラグがあります。そのため、プログラムの1行目など、はじめの方に記述したprintf関数などは受信できない場合があります。 この問題は"pc.readable() == 1"となるまで待機することで解決することができます。
Import programMATSU-bed_softwareserial
SoftwareSerial sample program for MATSU-bed
main.cpp
#include "mbed.h" #include "USBSerial.h" #include "MATSUbed.h" USBSerial pc; BusOut myled(LED1, LED2, LED3, LED4); int main() { myled = 0b0000; while(pc.readable() == 0); pc.printf("KEY DETECTED!!\r\nPROGRAM START\r\n"); while(1){ pc.printf("program running...\r\n"); myled = 0b0001; wait(0.5); myled = 0b0000; wait(0.5); } }
対応ライブラリ¶
CAN通信¶
CANのトランシーバICはマイコンボードの裏面に実装されています。使用するときは裏面のジャンパをショートさせて下さい。
CAN通信用の初期化
CAN can1(P0_13, P0_18) //CAN通信用のオブジェクトの初期化
CAN通信のAPIについては参考サイトを参照して下さい。
4チャンネル以上のPWM¶
MATSU-bedに使用しているマイコン、LPC1549は4つのSCT(State Configurable Timer)を積んでいます。そのため公式のPwmOutを使うと4つまでしかオブジェクトを初期化できず、それ以上初期化しようとするとマイコンがエラーでストップします。
そこで大量のサーボを動作させるような、1つの周波数で複数のPWMを出力する方法として、SCTのアウトプットに使うライブラリを自作しました。ご活用下さい。
Import librarypwm_all_out
MATSU-bed(LPC1549)でPWMを4つ以上出すプログラム
pwm_all_outの使い方
#include "PwmOut_all.h" PwmOutAll one_servo(P0_0); //1つずつ宣言 PwmOutAll servo[] = {(P0_1), (P0_2), (P0_3), (P0_5)}; //バスを使ってまとめて宣言
オフラインコンパイル¶
mbedのオフラインコンパイル環境にmbed-cliというものがあります。
これを応用してmatsubed-cliを作りました。詳しくはGitHubで説明してあります。
MATSU-bed-cli