Aliexpressなどで販売されている64x32のフルカラードットマトリクスLED2枚とNucleo F401REを利用して、 E233系の駅停車時、路線名表示ありのLED側面行先表示を再現するプログラムです。 3秒間隔、3段階切替で、路線名、種別、行先、次停車駅を個別に指定することが可能です。
Dependencies: SDFileSystem mbed
Revision 30:3ac9aa4faa34, committed 2015-02-15
- Comitter:
- chirashi
- Date:
- Sun Feb 15 02:18:58 2015 +0000
- Parent:
- 29:bc82c25b6b94
- Child:
- 31:d186b04b983e
- Commit message:
- LEDdata format change
Changed in this revision
| main.cpp | Show annotated file Show diff for this revision Revisions of this file |
--- 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;