Kp(他称 管理人の元相方)です。
それなりに前からGR-PRACHなるマイコンが発売されています。
このGR-PEACH、圧倒的なスペックを誇る上にmbed enabledというモテマイコンです。
にも関わらず、誰も使っていません。検索したところで、ほとんど情報が出てきません。
そこで、GR-PEACHでできること、いくつかの使用上の注意をまとめました。
このページを読んで、今すぐGR-PEACHを使い、情報をネットで共有しましょう。
※長いのでカテゴリごとに折りたたんでいます。
できること編
| + | 簡単なスペック紹介 |
圧倒的の一言です。他の(主にRCJで)有名なマイコンと比較するとご覧の通り
CPU周波数は文字通り桁が違います。RAM容量に至っては単位が変わっています。 ADCの少なさが残念なところではあります。それ以外のペリフェラルの数は申し分ありません。 mbedの公式ページにより詳しい情報が載っています。 |
| + | できること |
他のマイコンでできるようなことは、よほど特別なことでない限り問題なくできます(だってmbedだし)。 加えて、mbedライブラリでサポートされていないながらも、潜在的には様々な機能が扱えます。 とりあえず有用だと思われ、動作が確認できたのはこれくらいです。
ユーザーズマニュアル(日本語で読みやすい!)には他にも種々の謎機能が掲載されています。 http://japan.renesas.com/products/mpumcu/rz/rza/rza1h/Documentation.jsp |
使用上の注意編こんなにあるから使いづらいって嫌われるんだろうなあ…
ピンに関する情報ソースはこちら。
https://developer.mbed.org/teams/Renesas/wiki/GR-PEACH_supported_function_map
| + | 割り込みに使えるピン |
割り込みに使えるピンとその組み合わせが決まっています。 以下に示す横並びのピンは、同時に割り込みが使えません。
赤字はDIPで出ているピンです(やっぱり全然出てないんですね…)。見落としがあったらごめんなさい。 P6_12はLEDに繋がっていますが、DIPではないので黒字です。 また、実際はI2CやADCなどと機能がかぶるため、このうち半分くらいしか使えなかったりします… |
| + | PWM出力ができるピン |
いろいろ特殊です。 公式のピンマップ画像でPWMと記載されていなくてもPWM出力ができるピンがあります。 TIOnとラベルが振ってあるピンがそうなのですが、要するに公式ピンマップ画像で紫色がついているピンはPWMが出力できます。 公式ピンマップ画像はこちら https://developer.mbed.org/platforms/Renesas-GR-PEACH/ さらに、以下に示す横並びのピンは、同時にPWMが使えません。
赤字はDIPで出ているピンです。P8_8はジャンパによりDIPに出すことができます。 他にも周波数を低くしようとするとピンごとに限界が異なったりします。詳しくは上に示した情報ソースをご参照ください。 |
| + | その他ハードウェア関係の注意 |
内部プルアップ・プルダウンはありません。尤も、あるマイコンでも使わない方がいいとは思いますが。 I2Cバスをジャンパによりプルアップすることはできます。 シリアルとCANの仕様に一部制限があります。詳しくは上に示した情報ソースをご参照ください。 |
| + |
|
公式が対応してくれました!もう以下の設定は必要ありません。 この記事読んでくれたんでしょうか。本当にありがとうございます。またPull-Req出します。 mbedライブラリはエラーに対していろいろと対処をしてくれます。 しかし、デフォルトではGR-PEACHはそれらの機能を使いません。2つの関数を再定義することで有効にすることができます。 いずれの関数を再定義する場合も、C++ではextern "C"を忘れずに。 error()という関数を再定義してあげると、エラーが読めるようになります。 以下のプログラムは再定義の例です。
void error(const char* format, ...)
{
va_list arg;
va_start(arg, format);
vfprintf(stderr, format, arg);
va_end(arg);
mbed_die();
}
ボーレートを指定したい場合はSerialクラスを使えば良いでしょう。
extern "C" void error(const char* format, ...)
{
va_list arg;
va_start(arg, format);
Serial pc(USBTX, USBRX);
pc.baud(115200);
pc.vprintf(format, arg);
va_end(arg);
mbed_die();
}
実際のプログラムではここでシリアルオブジェクトを定義せずに、どこか他のところで定義したものを参照するべきですね。 mbed_die()を再定義してあげると、終了処理を作ることができます。かの有名な青mbedのLEDが交互に光るあれ(Blue LEDs Of Death)もこの関数で実装されています。 以下のプログラムは再定義の例です。
void mbed_die(void)
{
__disable_irq();
gpio_t led_red;
gpio_init_out(&led_red, LED_RED);
gpio_t led_green;
gpio_init_out(&led_green, LED_GREEN);
gpio_t led_blue;
gpio_init_out(&led_blue, LED_BLUE);
while (1) {
gpio_write(&led_green, 0);
gpio_write(&led_red, 1);
wait_ms(150);
gpio_write(&led_red, 0);
gpio_write(&led_blue, 1);
wait_ms(150);
gpio_write(&led_blue, 0);
gpio_write(&led_green, 1);
wait_ms(150);
}
}
RGB LEDそれぞれが順番に光るようにしてみました。 最終的なプログラムはこのようにするといいかもしれません。
#include "mbed.h"
Serial pc(USBTX, USBRX);
extern "C" void error(const char* format, ...)
{
va_list arg;
va_start(arg, format);
pc.vprintf(format, arg);
va_end(arg);
mbed_die();
}
extern "C" void mbed_die(void)
{
__disable_irq();
gpio_t led_red;
gpio_init_out(&led_red, LED_RED);
gpio_t led_green;
gpio_init_out(&led_green, LED_GREEN);
gpio_t led_blue;
gpio_init_out(&led_blue, LED_BLUE);
while (1) {
gpio_write(&led_green, 0);
gpio_write(&led_red, 1);
wait_ms(150);
gpio_write(&led_red, 0);
gpio_write(&led_blue, 1);
wait_ms(150);
gpio_write(&led_blue, 0);
gpio_write(&led_green, 1);
wait_ms(150);
}
}
int main(int argc, const char * argv[])
{
pc.baud(9600);
error("WASTED");
return 0;
}
3色のLEDが点滅を繰り返し、シリアルモニタにはゲームオーバーを示す文字列が表示されます。 |
| + | リアルタイムOSを使っていて気づいたこと |
mbed-rtosライブラリは使えるのですが、なぜかメインスレッドを待たせると割り込みがきかなくなります。 すなわち、メインスレッドで以下の関数を呼び出し、待ちが入るとフリーズします。
CのAPIも同様です。タイムアウトを0に設定したりして、待ちが発生しないようにするとフリーズしません。 また、Thread::signal_wait()はなぜか大丈夫です。(これがかなり謎。研究中。) 仕方がないので、ランループは以下のように実装しています。
while (1) {
rtos::Thread::signal_wait(1);
osEvent event = mail.get(0);
if (event.status == osEventMail) {
Callback *callback = static_cast<Callback *>(event.value.p);
callback->func(callback->arg);
mail.free(callback);
}
}
あとはmailにputするときにシグナルを一緒に送ってやればいいわけです。 メインスレッド以外ならいくら相互排除しようが何しようが問題ありません。 |
| + | その他ソフトウェア関係の注意 |
mbed enabledなだけあって、あまり困ったことはありません。 まだたまにライブラリにバグがあったりするので、開発に協力しましょう。 個人的要望としては、CThunkをサポートして欲しいです。誰か実装してください(切実)。 |
この記事の執筆者は管理人ではなくその元相方です。
コメント
コメント一覧 (2)
ロボカップジュニアに400Mhzもの周波数は必要なのですか?
(INPUTがアルディーノで優勝したので気になりました)
GR-PEACHは、RoboCupJuniorサッカーではなく、RoboCupRescue RMRCという競技のロボットに使用しました。記事「RoboCup2017 Rescue Rapidly Manufactured Robot Competition 出場ロボット」で紹介したロボットです。
GR-PEACHはmbedで開発できるボードの中では恐らく最強クラスの処理速度を誇りますが、その処理スペックを必要とする場面でなければ、使う必要が無いはずです。RMRC競技では、カメラを処理する関係でPEACHを使うのもある程度妥当性があると言えなくもないですが、RCJで一般的に使われているセンサを処理するのであれば、正直PEACHが必要となる場面はほぼ無いと思います。
私の結論としてはRCJに400MHzは必要ありません、画像処理を独自で開発する(例えばPixyカメラのCPUにはRZ-A1Hに近いNXPのコアが使われている)のであれば妥当でしょう。
余談ですが
マイコンのスペックは、自分が組もうとしているプログラムが、どれくらいのリソースを要するのかによって決まります。INPUTが強いのは、プログラムが強いのであって、そのプログラムが動くマイコンであればArduinoでも、極端な話をすればGR-PEACHを使っても良いしPICを使っても良い訳です。
ただ、予算が潤沢だとか、自分のプログラムがどんどん重たくなった時の保険として高いスペックのマイコンを使うとかは、考え方としてはアリだと思っています。