Aliexpressなどで販売されている64x32のフルカラードットマトリクスLED2枚とNucleo F401REを利用して、 E233系の駅停車時、路線名表示ありのLED側面行先表示を再現するプログラムです。 3秒間隔、3段階切替で、路線名、種別、行先、次停車駅を個別に指定することが可能です。
Dependencies: SDFileSystem mbed
Diff: main.cpp
- Revision:
- 30:3ac9aa4faa34
- Parent:
- 29:bc82c25b6b94
- Child:
- 31:d186b04b983e
--- a/main.cpp Tue Feb 03 10:36:24 2015 +0000 +++ b/main.cpp Sun Feb 15 02:18:58 2015 +0000 @@ -54,6 +54,11 @@ //最大停車駅数 #define MaxStopStation 100 +//将来的な複数機器連動用の機器ID +//0:全機器一斉送信用 1:前面LED 2:側面LED(暫定) +#define DeviceID 2 + + //SDCard //MOSI - D11(PA7) //MISO - D12(PA6) @@ -62,9 +67,13 @@ SDFileSystem sd(D11, D12, D13, D10, "sd"); -//Serial +//Serial USB Serial pc(USBTX,USBRX ); +//Bluetooth Serial6 +//Serial pc(PA_11,PA_12 ); + + //LEDModule //R1,R2,G1,G2,B1,B2はモジュールによりコネクタのピンアサインが異なります。 //色が違う場合DigitalOutのピンアサインを変更してください。 @@ -75,6 +84,13 @@ //G2 - D7(PA8) //B1 - D2(PA10) //B2 - D3(PB3) +//or +//R1 - D6(PB5) +//R2 - D7(PB4) +//G1 - D2(PB10) +//G2 - D3(PA8) +//B1 - D4(PA10) +//B2 - D5(PB3) //A - D8(PA9) //B - D9(PC7) @@ -90,12 +106,12 @@ DigitalOut LAT(PB_15); // Data latch - active low (pulse up after data load) DigitalOut OE(PB_1); // Output enable - active low (hold high during data load, bring low after LAT pulse) -DigitalOut R1(D6); // RED Serial in for upper half -DigitalOut R2(D7); // RED Serial in for lower half -DigitalOut G1(D2); // GREEN Serial in for upper half -DigitalOut G2(D3); // GREEN Serial in for lower half -DigitalOut B1(D4); // BLUE Serial in for upper half -DigitalOut B2(D5); // BLUE Serial in for lower half +DigitalOut R1(D4); // RED Serial in for upper half +DigitalOut R2(D5); // RED Serial in for lower half +DigitalOut G1(D6); // GREEN Serial in for upper half +DigitalOut G2(D7); // GREEN Serial in for lower half +DigitalOut B1(D2); // BLUE Serial in for upper half +DigitalOut B2(D3); // BLUE Serial in for lower half @@ -150,6 +166,9 @@ int ForNumber = 114; int NextStaNumber = 1; char SerialBuffer[30]; +//シリアル処理用バッファ +char ABuffer[30]; +bool busyflag = false; int count = 0; @@ -387,6 +406,7 @@ void Init() { + //pc.baud(9600); // Set up things to a known state CLK = LOW; LAT = LOW; @@ -564,6 +584,8 @@ } //OE = LOW; + //クロック確認 + //pc.printf("CPU SystemCoreClock is %.2f MHz\r\n", (float)SystemCoreClock/1000/1000); } void ScrollTimerTick(){ @@ -589,6 +611,9 @@ //SDDataReadtest int8_t Data; + //先頭2バイトはヘッダ + fseek(fp, 2, SEEK_SET); + for(int y = Starty; y < Starty + Ready; y++){ for(int x = Startx; x < Startx + Readx; x++){ Data = getc(fp); @@ -612,6 +637,8 @@ //SDDataReadtest int8_t Data; + //先頭2バイトはヘッダ + fseek(fp, 2, SEEK_SET); for(int y = Starty; y < Starty + Ready; y++){ for(int x = Startx; x < Startx + Readx; x++){ Data = getc(fp); @@ -791,16 +818,31 @@ OE = HIGH; if (pc.readable() == 1) { // 受信したデータが存在する - SerialBuffer[count] = pc.getc(); // 受信データを読み込む - if (count > 30 || SerialBuffer[count] == '$') { // 文字数が既定の個数を超えた場合、又は終了文字を受信した場合 - SerialBuffer[count] = '\0'; // 末尾に終端文字を入れる + if (busyflag == false){ + SerialBuffer[count] = pc.getc(); // 受信データを読み込む + + }else{ + pc.printf("busy\r\n"); + } + + if (count > 29 || SerialBuffer[count] == '$') { // 文字数が既定の個数を超えた場合、又は終了文字を受信した場合 + busyflag = true; + + //SerialBuffer[count] = '\0'; // 末尾に終端文字を入れる + + for(int a = 0; a < count; a++){ + + ABuffer[a] = SerialBuffer[a]; + } + + count = 0; //路線名 L - if(SerialBuffer[0] == 'L'){ - unsigned char Sertemp1 = SerialBuffer[1]; - unsigned char Sertemp2 = SerialBuffer[2]; - unsigned char Sertemp3 = SerialBuffer[3]; + if(ABuffer[0] == 'L'){ + unsigned char Sertemp1 = ABuffer[1]; + unsigned char Sertemp2 = ABuffer[2]; + unsigned char Sertemp3 = ABuffer[3]; int n1 = 0 ; int n2 = 0 ; int n3 = 0 ; @@ -831,10 +873,10 @@ } //種別 K - if(SerialBuffer[0] == 'K'){ - unsigned char Sertemp1 = SerialBuffer[1]; - unsigned char Sertemp2 = SerialBuffer[2]; - unsigned char Sertemp3 = SerialBuffer[3]; + if(ABuffer[0] == 'K'){ + unsigned char Sertemp1 = ABuffer[1]; + unsigned char Sertemp2 = ABuffer[2]; + unsigned char Sertemp3 = ABuffer[3]; int n1 = 0 ; int n2 = 0 ; int n3 = 0 ; @@ -865,10 +907,10 @@ } //行先 F - if(SerialBuffer[0] == 'F'){ - unsigned char Sertemp1 = SerialBuffer[1]; - unsigned char Sertemp2 = SerialBuffer[2]; - unsigned char Sertemp3 = SerialBuffer[3]; + if(ABuffer[0] == 'F'){ + unsigned char Sertemp1 = ABuffer[1]; + unsigned char Sertemp2 = ABuffer[2]; + unsigned char Sertemp3 = ABuffer[3]; int n1 = 0 ; int n2 = 0 ; int n3 = 0 ; @@ -899,10 +941,10 @@ } //次停車駅 K - if(SerialBuffer[0] == 'N'){ - unsigned char Sertemp1 = SerialBuffer[1]; - unsigned char Sertemp2 = SerialBuffer[2]; - unsigned char Sertemp3 = SerialBuffer[3]; + if(ABuffer[0] == 'N'){ + unsigned char Sertemp1 = ABuffer[1]; + unsigned char Sertemp2 = ABuffer[2]; + unsigned char Sertemp3 = ABuffer[3]; int n1 = 0 ; int n2 = 0 ; int n3 = 0 ; @@ -933,8 +975,8 @@ } //スクロール有効/無効 S - if(SerialBuffer[0] == 'S'){ - unsigned char Sertemp1 = SerialBuffer[1]; + if(ABuffer[0] == 'S'){ + unsigned char Sertemp1 = ABuffer[1]; int n1 = 0 ; int n = 0; @@ -951,11 +993,11 @@ } //起動 Set - if(SerialBuffer[0] == 'S' && SerialBuffer[1] == 'e' && SerialBuffer[2] == 't'){ + if(ABuffer[0] == 'S' && ABuffer[1] == 'e' && ABuffer[2] == 't'){ pc.printf("Set\r\n"); SDFileRead(); } - + busyflag = false; }else{ count++; } @@ -967,6 +1009,7 @@ int main(){ Init(); // Set things up //Serial + pc.printf("Power ON\r\n"); @@ -1013,6 +1056,59 @@ //起動時にスクロールデータを読み込み if(ScrollEnable == 1){ + + //test + //Initialize StopStationCode + for (int x = 0; x < MaxStopStation; x++){ + StopStationCode[x]= 0; + } + + //SDRead StopStationCode + for(int i = 0; i < MaxStopStation; i++){ + + //停車駅コード取得 + int test = 0; + int test2 = 0; + sprintf(SDFilePath,"/sd/E233/StopStationList/%d.bin",1); + FILE *fp = fopen(SDFilePath, "r"); + if(fp == NULL) { + pc.printf("SDFileOpen Error %s\r\n",SDFilePath); + break; + + }else{ + //pc.printf("SDFileOpen Success %s\r\n",SDFilePath); + fseek(fp, i*2, SEEK_SET); + test = getc(fp); + test = test << 8; + + fseek(fp, i*2 + 1, SEEK_SET); + test2 = getc(fp); + test = test ^ test2; + + StopStationCode[i] = test; + pc.printf("StopStationCode[%d]:%d\r\n",i,StopStationCode[i]); + + if(StopStationCode[i] == 0){ + break; + } + fclose(fp); + } + } + + //test end + + + + + + + + + + + + + //ScrollDebug ScrollWriteCount = 80;