2017年茨城高専ロボット部 Nucleo用中枢プログラム(PS2と通信) 少しだけ、交ロボ用に減らしたけど

Dependencies:   mbed

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers main.cpp Source File

main.cpp

00001 #include "mbed.h"
00002 
00003 /* USART通信ピン設定 */
00004 Serial pic(D8, D2); //TX, RX
00005 
00006 /* i2c通信ピン設定 */
00007 I2C i2c(D14, D15);  //SDA, SCL
00008 
00009 /* 確認LED設定 */
00010 DigitalOut myled(D13);
00011 
00012 /* 緊急停止ピン設定 */
00013 DigitalOut emergency(D9);
00014 
00015 /* 各関数の宣言 */
00016 void ice(int address, int data);
00017 void dev_rx();
00018 void photo();
00019 
00020 
00021 /* 右前メカナム */
00022 int send_data1 = 0x30;
00023 
00024 /* 右後メカナム */
00025 int send_data2 = 0x30;
00026 
00027 /* 左前メカナム */
00028 int send_data3 = 0x30;
00029 
00030 /* 左後メカナム */
00031 int send_data4 = 0x30;
00032 
00033 /* 射撃機構 */
00034 int send_data5 = 0x30;
00035 
00036 int send_data6 = 0x30;
00037 
00038 /* 緊急停止用フラグ */
00039 int emergency_flag = 0;
00040 
00041 void ice(int address, int data) //I2C関数
00042 {
00043     /* 周波数: 100kHz */
00044     //i2c.frequency(100000);
00045     
00046     /* スタートコンディション出力 */
00047     i2c.start();
00048     
00049     /* アドレスの書き込み */   
00050     i2c.write(address);
00051     
00052     /* データの書き込み */
00053     i2c.write(data);
00054     
00055     /* ストップコンディション出力 */
00056     i2c.stop();
00057 }
00058 
00059 void dev_rx()
00060 {
00061     /* ボーレートの設定 */
00062     pic.baud(115200);
00063     
00064     /* 各ボタンが押された時の処理 */
00065     int rcv_data = pic.getc();
00066     
00067     
00068     
00069     if(rcv_data ==0x17){
00070         send_data5 = 0x02;
00071         myled = 1;
00072     }else if(rcv_data == 0x18){
00073         send_data6 = 0x02;
00074         myled = 1;
00075     }
00076 
00077     /* -------------移動機構--------------- */
00078     //前進
00079     if(rcv_data == 0x01){   //前進50%   
00080         send_data1 = 0x02;
00081         send_data2 = 0x02;
00082         send_data3 = 0x02;
00083         send_data4 = 0x02;
00084         
00085         myled = 1;
00086         
00087     }else if(rcv_data == 0x05){ //前進 90%
00088         send_data1 = 0x03;
00089         send_data2 = 0x03;
00090         send_data3 = 0x03;
00091         send_data4 = 0x03;
00092         
00093         myled = 1;
00094         
00095     }else if(rcv_data == 0x09){ //前進 10%
00096         send_data1 = 0x01;
00097         send_data2 = 0x01;
00098         send_data3 = 0x01;
00099         send_data4 = 0x01;
00100         
00101         myled = 1;
00102     }else if(rcv_data == 0x02){ //後進 50%
00103         send_data1 = 0x05;
00104         send_data2 = 0x05;
00105         send_data3 = 0x05;
00106         send_data4 = 0x05;
00107         
00108         myled = 1;
00109     }else if(rcv_data == 0x06){ //後進 90%
00110         send_data1 = 0x06;
00111         send_data2 = 0x06;
00112         send_data3 = 0x06;
00113         send_data4 = 0x06;
00114         
00115         myled = 1;
00116     
00117     }else if(rcv_data == 0x10){ //後進 10%
00118         send_data1 = 0x04;
00119         send_data2 = 0x04;
00120         send_data3 = 0x04;
00121         send_data4 = 0x04;
00122         
00123         myled = 1;
00124         
00125     }else if(rcv_data == 0x03){ //右平衡移動 50%
00126         send_data1 = 0x05;
00127         send_data2 = 0x02;
00128         send_data3 = 0x05;
00129         send_data4 = 0x02;
00130         
00131         myled = 1;
00132     }else if(rcv_data == 0x07){ //右平行移動 90%
00133         send_data1 = 0x06;
00134         send_data2 = 0x03;
00135         send_data3 = 0x06;
00136         send_data4 = 0x03;
00137         
00138         myled = 1;
00139     }else if(rcv_data == 0x11){ //右平衡移動 10%
00140         send_data1 = 0x04;
00141         send_data2 = 0x01;
00142         send_data3 = 0x04;
00143         send_data4 = 0x01;
00144         
00145         myled = 1;
00146     }else if(rcv_data == 0x04){ //左平衡移動 50%
00147         send_data1 = 0x02;
00148         send_data2 = 0x05;
00149         send_data3 = 0x02;
00150         send_data4 = 0x05;
00151         
00152         myled = 1;
00153     }else if(rcv_data == 0x08){ //左平衡移動 90%
00154         send_data1 = 0x03;
00155         send_data2 = 0x06;
00156         send_data3 = 0x03;
00157         send_data4 = 0x06;
00158         
00159         myled  = 1;
00160     }else if(rcv_data == 0x12){ //左平衡移動 10%
00161         send_data1 = 0x01;
00162         send_data2 = 0x04;
00163         send_data3 = 0x01;
00164         send_data4 = 0x04;
00165         
00166         myled = 1;
00167     
00168     }else if(rcv_data == 0x13){ //右旋回
00169         send_data1 = 0x05;
00170         send_data2 = 0x02;
00171         send_data3 = 0x02;
00172         send_data4 = 0x05;
00173         
00174         myled = 1;
00175     }else if(rcv_data == 0x15){
00176         send_data1 = 0x04;
00177         send_data2 = 0x01;
00178         send_data3 = 0x01;
00179         send_data4 = 0x04;
00180         
00181         myled = 1;
00182     
00183     }else if(rcv_data == 0x14){ //左旋回
00184         send_data1 = 0x02;
00185         send_data2 = 0x05;
00186         send_data3 = 0x05;
00187         send_data4 = 0x02;
00188         
00189         myled = 1;
00190     }else if(rcv_data == 0x16){
00191         send_data1 = 0x01;
00192         send_data2 = 0x04;
00193         send_data3 = 0x04;
00194         send_data4 = 0x01;
00195         
00196         myled = 1;
00197     }
00198     
00199     
00200     /* 緊急停止始動 */
00201     else if(rcv_data == 0x2B){
00202         emergency_flag = 1;
00203         myled = 1;
00204     }
00205     
00206     /* 緊急停止解除 */
00207     else if(rcv_data == 0x2C){
00208         emergency_flag = 0;
00209         myled = 1;
00210     }
00211         
00212     else if(rcv_data == 0x30){
00213         send_data1 = 0x30;
00214         send_data2 = 0x30;
00215         send_data3 = 0x30;
00216         send_data4 = 0x30;
00217         send_data5 = 0x30;
00218         send_data6 = 0x30;
00219         
00220         myled = 0; 
00221         
00222     }
00223     
00224     /* 緊急停止関数 */
00225     if(emergency_flag == 1){
00226         emergency = 1;
00227         myled = 1;
00228         
00229     } else {
00230         emergency = 0;
00231         myled = 0;
00232     }
00233 }
00234 
00235 /* メイン関数 */
00236 int main(void)
00237 {
00238     /* 緊急停止解除 */
00239     emergency = 0;
00240     
00241     /* 無限ループ関数 */
00242     while(1)
00243     {   
00244         
00245         dev_rx();
00246         /* 割り込み受信関数の呼び出し */
00247         pic.attach(dev_rx, Serial::RxIrq);
00248         
00249         
00250         /* i2c関数の呼び出し */
00251         ice(0xA0, send_data1);
00252         ice(0xA2, send_data2);
00253         ice(0xA4, send_data3);
00254         ice(0xA6, send_data4);
00255         ice(0xA8, send_data5);
00256         ice(0xAA, send_data6);
00257     }
00258 }