※ここで使用しますヘッダファイル(JissenPBL.h)およびEV3 BricxCCプログラムランチャー(run.rbf)は、 九州工業大学 花沢明俊先生が作成されたファイルを使用しております。 ファイル使用に当たり、快く了承していただき感謝いたします。 このヘッダファイルの著作権およびその他の権利は九州工業大学 花沢明俊先生にあります。 ※ すべてのNXC命令の動作を確認しておりません。動作しない命令やエラーが発生する可能性があります。その場合、もし良い解決方法、エラーの回避方法がございましたらご連絡いただけますと幸いです。 ・ 音をならしてみよう サンプルプログラムを例にコンパイル - EV3への転送 - プログラムの実行を行います。 音を鳴らすプログラムを作成します。下記のサンプルプログラムを作成します。ファイル名は「Sound.c」とします。
// Sample Program "Sound.c" #include "./jissenPBL.h" int main() { OutputInit(); SoundInit(); PlayTone(440,1000); //frq(Hz),duration Wait(1000); PlayToneEx(330,400,100); //frq(Hz),duration,vol(100 only?) Wait(1000); PlayFileEx("/home/root/lms2012/prjs/Bravo.rsf",100,false); //Filename,vol,loop Wait(1000); PlayFile("/home/root/lms2012/prjs/Boo.rsf"); //Filename only Wait(1000); OnFwdEx(OUT_BC,70,0); Wait(1000); Off(OUT_BC); }
サウンドファイルBravo.rsf と Boo.rsf はEV3-SW(Windows、Mac環境)からコピーします。詳しくはBricxCCによるEV3プログラミング(音をならしてみよう)を参考にしてください。 また、九州工業大学 花沢明俊先生が作成されたファイル JissenPBL.h もSound.c と同じディレクトリに置きます。 ・ jissenPBL.h ファイルの修正 jissenPBL.h ファイルの最初の部分(#include 部分)を下記のように追加・編集します。「(パス)」の部分はlms2012とlms_apiディレクトリの絶対パスを記述します。
#include <string.h> #include <sys/mman.h> #include <sys/ioctl.h> #include <sys/types.h> #include <sys/stat.h> #include <pthread.h> #include "lms2012/lms2012.h" #include "/(パス)/lms_api/ev3_output.h" #include "/(パス)/lms_api/ev3_output.c" #include "/(パス)/lms_api/ev3_command.h" #include "/(パス)/lms_api/ev3_command.c" #include "/(パス)/lms_api/ev3_lcd.h" #include "/(パス)/lms_api/ev3_lcd.c" #include "/(パス)/lms_api/ev3_sound.h" #include "/(パス)/lms_api/ev3_sound.c" #include "/(パス)/lms_api/ev3_button.h" #include "/(パス)/lms_api/ev3_button.c" #include "/(パス)/lms_api/ev3_constants.h" #include "/(パス)/lms_api/ev3_timer.h" #include "/(パス)/lms_api/ev3_timer.c"
次にインクルードするファイルの間で2重定義が発生しているため、コンパイル時にwarning表示が表示されます。そのままでも問題は無いのですが、定義があるファイルの中を一部コメントアウトします。 ・ ev3_lcd.h の52、54、55、128行目をコメント「//」にします。
#define LCD_BUFFER_SIZE (LCD_BYTE_WIDTH * LCD_HEIGHT) → // #define LCD_BUFFER_SIZE (LCD_BYTE_WIDTH * LCD_HEIGHT) typedef byte IMGDATA; // < Image base type → // typedef byte IMGDATA; //< Image base type typedef IMGDATA* IP; // < Instruction pointer type → // typedef IMGDATA* IP; // < Instruction pointer type bool LcdPicture(char Color, short X, short Y, IP pBitmap); → // bool LcdPicture(char Color, short X, short Y, IP pBitmap);
・ ev3_constants.h の52、53、54、330行をコメント「//」にします。
#define LCD_WIDTH 178 /* < LCD horizontal pixels */ #define LCD_HEIGHT 128 /* < LCD vertical pixels */ #define TOPLINE_HEIGHT 10 /* < Top line vertical pixels */ : #define FILENAME_SIZE 120 // < Max filename size including path, name... ↓ // #define LCD_WIDTH 178 /* < LCD horizontal pixels */ // #define LCD_HEIGHT 128 /* < LCD vertical pixels */ // #define TOPLINE_HEIGHT 10 /* < Top line vertical pixels */ : // #define FILENAME_SIZE 120 // < Max filename size including path, name...
・ ev3_button.c の21行目をコメント「//」にします。
#define BUTTON_DEBOUNCE_TIME 10 → //#define BUTTON_DEBOUNCE_TIME 10
・ ev3_sound.c の42行目をコメント「//」にします。
#define SOUND_FILE_BUFFER_SIZE (SOUND_CHUNK + 2) // < 12.8 mS @ 8KHz → //#define SOUND_FILE_BUFFER_SIZE (SOUND_CHUNK + 2) // < 12.8 mS
・ ev3_lcd.c の42行目をコメント「//」にします。
#define MIN(a,b) (((a < b) ? (a) : (b))) → //#define MIN(a,b) (((a < b) ? (a) : (b)))
・ ev3_output.c の25~30行目と1441行目をコメント「//」にします。
typedef struct { int TachoCounts; char Speed; int TachoSensor; } MOTORDATA; ↓ /* typedef struct { int TachoCounts; char Speed; int TachoSensor; } MOTORDATA; */ Wait(MS_2); // 2ms between checks → //Wait(MS_2); // 2ms between checks
コンパイルは、作業ディレクトリ上で下記のコマンドを入力します。
arm-none-linux-gnueabi-gcc Sound.c -o Sound
コンパイルが成功するとEV3上で動作する実行ファイル「Sound」が生成されます。 次に実行ファイル「Sound」をEV3に転送して実行します。 ファイルの転送にはscpコマンドを使用します(転送先EV3のIPアドレスは環境により異なります)。
scp ./Sound root@192.168.11.XXX:/home/root/lms2012/prjs/.
パスワードは無しです。サウンドファイルBravo.rsf と Boo.rsf も同様にEV3へ転送しておきます。 ファイルの実行はEV3本体へログインして実行ファイルを実行します。
ssh root@192.168.11.XXX cd lms2012/prjs/ ./Sound
プログラムの実行時には有線LANの場合ケーブルに気を付けてください。USB-LANアダプタはEV3本体に接続したままにしてください。もしUSBが外れた場合は、EV3の再起動が必要になります。
次に転送したプログラムをEV3上で動かしてみましょう ← ubuntu環境でNXCプログラミング(インストールと設定) | プログラムの実行 →