大季 矢花 / Mbed 2 deprecated MainBoard2019_LineHub_A_1

Dependencies:   mbed

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers main.cpp Source File

main.cpp

00001 #include "mbed.h"
00002 #include "RingBuffer.h"
00003 #include "SO1602A.h"
00004 
00005 //********** pin define **********//
00006 #define  SELECT1_0  PB_4
00007 #define  SELECT1_1  PB_5
00008 #define  SELECT1_2  PB_3
00009 #define  SELECT1_3  PB_1
00010 #define  SELECT2_0  PF_0
00011 #define  SELECT2_1  PF_1
00012 #define  SELECT2_2  PA_8
00013 #define  SELECT2_3  PA_11
00014 #define  SELECT3_0  PA_4
00015 #define  SELECT3_1  PA_5
00016 #define  SELECT3_2  PA_7
00017 #define  SELECT3_3  PA_6
00018 #define  Z0         PA_0
00019 #define  Z1         PA_1
00020 #define  Z2         PA_3
00021 #define  SDA        PB_7
00022 #define  SCL        PB_6
00023 #define  UART_SE    PA_2
00024 #define  UARTTX     PA_9
00025 #define  UARTRX     PA_10
00026 //********** pin define **********//
00027 
00028 //********** pin select **********//
00029 AnalogIn y1(Z0);
00030 AnalogIn y2(Z1);
00031 AnalogIn y3(Z2);
00032 
00033 DigitalOut select1[]= {
00034     DigitalOut(SELECT1_0),
00035     DigitalOut(SELECT1_1),
00036     DigitalOut(SELECT1_2),
00037     DigitalOut(SELECT1_3),
00038 };
00039 DigitalOut select2[]= {
00040     DigitalOut(SELECT2_0),
00041     DigitalOut(SELECT2_1),
00042     DigitalOut(SELECT2_2),
00043     DigitalOut(SELECT2_3),
00044 };
00045 DigitalOut select3[]= {
00046     DigitalOut(SELECT3_0),
00047     DigitalOut(SELECT3_1),
00048     DigitalOut(SELECT3_2),
00049     DigitalOut(SELECT3_3),
00050 };
00051 
00052 DigitalOut uartSE(UART_SE);
00053 
00054 DigitalOut LED(LED3);
00055 
00056 //pcとマイコンの通信設定[湯アートがマイコン]
00057 
00058 //Serial uart(USBTX,USBRX);
00059 Serial uart(UARTTX,UARTRX);
00060 
00061 I2C i2c(SDA,SCL);
00062 SO1602A oled(i2c,0x78);
00063 
00064 //********** pin select **********//
00065 
00066 //********** define **********//
00067 #define  BUFFER_SIZE  10
00068 char RS485Data[BUFFER_SIZE];
00069 RINGBUFFER::RingBuffer RS485uart(RS485Data,BUFFER_SIZE);
00070 
00071 #define  SENDDATA_SIZE    8
00072 #define  SENSORDATA_SIZE  48
00073 
00074 const int pinDef[48] = { 0, 1, 2, 3, 4, 5,
00075                          12,13,14,15, 7, 6,
00076                          22,23, 8, 9,10,11,
00077                          16,17,18,19,20,21,
00078                          27,26,25,24,40,41,
00079                          28,29,30,31,38,39,
00080                          32,33,34,35,36,37,
00081                          42,43,44,45,36,47
00082                        };
00083 
00084 const int weight[6] = { 2, 1, 0, 0,-1,-2};
00085 
00086 char send[SENDDATA_SIZE] = {60,77,80,55,65,68,90,87};
00087 bool line[SENSORDATA_SIZE] = {0};
00088 
00089 void Transmit();
00090 void PinSelect(int pin);
00091 void SendDataUpdate(char sendData[], int dataSize);
00092 void LineDataRead(bool sensorData[], int dataSize);
00093 void SendDataMake(bool sensorData[], char sendData[]);
00094 //********** define **********//
00095 
00096 void InitiaLize(void)
00097 {
00098     uartSE = 1; //送信固定
00099 
00100     uart.baud(9600);
00101     uart.attach(Transmit,Serial::TxIrq);
00102 }
00103 
00104 int main(void)
00105 {
00106     InitiaLize();
00107     //oled.init();
00108     //oled.setDispFlag(true,false,false);
00109     while(1) {
00110         /*
00111         if(send[2]>250) {
00112             oled.locate(0,0);
00113             oled.printf("%d",send[2]-256);
00114         } else {
00115             oled.locate(0,0);
00116             oled.printf("%2d",send[2]);
00117         }
00118         if(send[3]>250) {
00119             oled.locate(5,0);
00120             oled.printf("%d",send[3]-256);
00121         } else {
00122             oled.locate(5,0);
00123             oled.printf("%2d",send[3]);
00124         }
00125         */
00126         LineDataRead(line,SENSORDATA_SIZE);
00127         SendDataMake(line,send);
00128         SendDataUpdate(send,SENDDATA_SIZE);
00129     }
00130 }
00131 
00132 void Transmit()
00133 {
00134     __disable_irq();
00135     // uart.printf("%d\n\r",RS485uart.GetData());
00136     uart.putc(RS485uart.GetData());
00137     __enable_irq();
00138 
00139 }
00140 
00141 void SendDataUpdate(char sendData[], int dataSize)
00142 {
00143     __disable_irq();
00144     if(!RS485uart.InAnyData()) {
00145         RS485uart.PutData('S');
00146         for(int i = 0; i < dataSize; i++) {
00147             RS485uart.PutData(sendData[i]);
00148         }
00149         RS485uart.PutData('F');
00150     }
00151     __enable_irq();
00152 }
00153 
00154 void PinSelect(int pin)
00155 {
00156     bool selectnum[16][4]= {
00157         {0,0,0,0},
00158         {0,0,0,1},
00159         {0,0,1,0},
00160         {0,0,1,1},
00161         {0,1,0,0},
00162         {0,1,0,1},
00163         {0,1,1,0},
00164         {0,1,1,1},
00165         {1,0,0,0},
00166         {1,0,0,1},
00167         {1,0,1,0},
00168         {1,0,1,1},
00169         {1,1,0,0},
00170         {1,1,0,1},
00171         {1,1,1,0},
00172         {1,1,1,1},
00173     };
00174     if(pin < 16) {
00175         select1[0]=selectnum[pin][3];
00176         select1[1]=selectnum[pin][2];
00177         select1[2]=selectnum[pin][1];
00178         select1[3]=selectnum[pin][0];
00179         for(int i=0; i<=3; i++) {
00180             select2[i]=0;
00181             select3[i]=0;
00182         }
00183     } else if(pin < 32) {
00184         select2[0]=selectnum[pin-16][3];
00185         select2[1]=selectnum[pin-16][2];
00186         select2[2]=selectnum[pin-16][1];
00187         select2[3]=selectnum[pin-16][0];
00188         for(int i=0; i<=3; i++) {
00189             select1[i]=0;
00190             select3[i]=0;
00191         }
00192     } else if(pin < 48) {
00193         select3[0]=selectnum[pin-32][3];
00194         select3[1]=selectnum[pin-32][2];
00195         select3[2]=selectnum[pin-32][1];
00196         select3[3]=selectnum[pin-32][0];
00197         for(int i=0; i<=3; i++) {
00198             select1[i]=0;
00199             select2[i]=0;
00200         }
00201     }
00202 }
00203 
00204 void LineDataRead(bool sensorData[], int dataSize)
00205 {
00206     int pin;
00207     float readData = 0;
00208     for(int i = 0; i < dataSize; i++) {
00209         pin = pinDef[i];
00210         PinSelect(pin);
00211         if(pin<=15) {
00212             readData = y1.read();
00213         } else if(pin<=31) {
00214             readData = y2.read();
00215         } else if(pin<=47) {
00216             readData = y3.read();
00217         }
00218         //uart.printf("%f\n\r",readData);
00219         if(readData < 0.7f) {
00220             
00221             sensorData[i] = 0;
00222         } else {
00223             sensorData[i] = 1;
00224         }
00225 
00226     }
00227 }
00228 
00229 void SendDataMake(bool sensorData[], char sendData[])
00230 {
00231     int data = 0;
00232     bool ACflag = true;
00233     bool NCflag = true;
00234     int count = 0;
00235     for(int i = 0; i < 8; i++) {
00236         NCflag = true;
00237         ACflag = true;
00238         data = 0;
00239         for(int j = 0; j < 6; j++) {
00240             data += (!sensorData[count]) * weight[j];
00241             if(sensorData[count] == 1) ACflag = false;
00242             else if(sensorData[count] == 0) NCflag = false;
00243             count++;
00244         }
00245         if(NCflag) sendData[i] = 99;
00246         else if(ACflag) sendData[i] = 98;
00247         else sendData[i] = data;
00248     }
00249 }