test0313

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers main_test_0314.cpp Source File

main_test_0314.cpp

00001 /*
00002 ############################################
00003 ##           sMotor v0.1 Test Program     ##
00004 ##          created by Samuel Matildes    ##
00005 ############################################
00006         ---- sam.naeec@gmail.com -----
00007 This library was made for 4-Phase Stepper Motors
00008 I don't take any resposability for the damage caused to your equipment.
00009 
00010 */
00011 
00012 #include "mbed.h"
00013 #include "sMotor.h"
00014 #include "UIPEthernet.h"
00015 
00016 
00017 Serial pc(USBTX, USBRX);
00018 sMotor motor(A0, A1, A2, A3); // set the pin  sMotor motor(pin1--blueline ,pin2--pinkline ,pin3--yellowline ,pin4--orangeline)
00019 DigitalIn Button(D10);
00020 DigitalIn set_zero_point(D11);
00021 DigitalOut LED(D12);
00022 
00023 
00024 
00025 
00026 int step_speed = 1200 ; // set default motor speed
00027 int numstep = 512 ; // defines full turn of 360 degree
00028 int zerocount = 0 ;
00029 int old_zerocount = 0 ;
00030 int set_zero_step = 0 ;
00031 
00032 //int delaytime = 1200;
00033 //you might want to calibrate this value according to your motor
00034 
00035 
00036 
00037 
00038 const uint8_t   MY_MAC[6] = { 0x74,0x69,0x69,0x2D,0x30,0x31 };
00039 // IP address must be unique and compatible with your network.
00040 const IPAddress MY_IP(192, 168, 1, 181);
00041 const uint16_t  MY_PORT = 7;
00042 const char*     message = "Response successed!";
00043 
00044 
00045 UIPEthernet     uIPEthernet(A6, A5, A4, D3);    // mosi, miso, sck, cs
00046 UIPUDP          udp;
00047 
00048 
00049 
00050 
00051 
00052 
00053 //////////////////////////////////////////////////////////////////////////////////////////////
00054 
00055 
00056 int b=0;   //要到度數
00057 //const char* mesg;
00058 int e=0;   //b的記憶體
00059 //const char* message[3]; 
00060 
00061 int c=0; //現在整數步數
00062 int vardegree;//度數變化量
00063 int memory=1;//記憶度數
00064 int memorydegree=0;//記憶上次度數
00065 
00066 void scan_int(int);//讀取函數
00067 int trans(int);//轉換函數
00068 
00069 
00070 
00071 ///////////////////////////////////////////////////////////////////////////////////////////////
00072 
00073 
00074 
00075 int main(void) 
00076 {
00077     
00078     
00079 ////////////////////////////////////歸零///////////////////////////////////////////////////////////
00080     
00081     LED = 1 ;                                   // if don't setzero LED is lighting
00082     printf("Haven't set_zero_point\n\r");
00083     pc.readable();
00084     motor.setzerostep(numstep,0,step_speed);
00085  
00086     while(LED ==1)                                              //LED歸零指式燈
00087     {
00088         if( Button == 1 && old_zerocount == zerocount)          //按下按鈕進行手動歸零
00089         {
00090             motor.setzerostep(numstep,0,step_speed);
00091         }
00092         if(old_zerocount != zerocount)
00093         {
00094             printf("Press the botton to set the zero point \n\r");
00095             old_zerocount = zerocount;
00096         }
00097     }
00098  
00099  
00100  
00101  ////////////////////////////////////////////////////////////////////////////////////////////////////       
00102         
00103     uIPEthernet.begin(MY_MAC, MY_IP);
00104 
00105     IPAddress   localIP = uIPEthernet.localIP();
00106     pc.printf("Local IP = %s\r\n", localIP.toString());
00107     pc.printf("Initialization ");
00108     
00109     //馬達初始化
00110     printf("4 Phase Stepper Motor v0.1 - Set zero Program\r\n");
00111     printf("\n\r");    
00112     //motor.setzerostep(SetZeroStep,0,step_speed); // number of steps, direction, speed
00113     //printf("Already Set to Zero\n\r");
00114            
00115     printf("Enter a number:0~+-180 degree\r\n"); 
00116     if (udp.begin(MY_PORT))
00117         pc.printf("succeeded.\r\n");
00118     else
00119         pc.printf("failed.\r\n");
00120 
00121     while (1) 
00122     {
00123         int success;
00124         int size = udp.parsePacket();           //Returns the size of the packet in bytes
00125 
00126         if (size > 0) 
00127         {
00128 ////////////////////////////////////////////////////////將收的字串轉成整數///////////////////////////////////////////////////////////////
00129             do                                                      
00130             {
00131                 char*   msg = (char*)malloc(size + 1);              //malloc() 運算子會配置一個 int 需要的空間,並傳回該空間的位址,所以使用指標 ptr 來儲存這個位址
00132                 int     len = udp.read(msg, size + 1);
00133                 msg[len] = 0;//??不懂
00134                 
00135                 //mesg=msg;
00136                 b = atoi((char*)msg);                               //字串轉數字
00137                 pc.printf("Integer number: %d\r\n",b);
00138                 
00139                 //printf("received mesg: '%s", mesg);
00140                 printf("received: '%s", msg);                
00141                 
00142                 free(msg);
00143             } while ((size = udp.available()) > 0);
00144 
00145             //finish reading this packet:
00146             udp.flush();
00147             printf("'\r\n");
00148             
00149             
00150  
00151  ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
00152             
00153 
00154             do 
00155             {
00156                 //send new packet back to ip/port of client. This also
00157                 //configures the current connection to ignore packets from
00158                 //other clients!
00159                 success = udp.beginPacket(udp.remoteIP(), udp.remotePort());
00160                 if (success)
00161                     pc.printf("beginPacket: succeeded%\r\n");
00162                 else
00163                     pc.printf("beginPacket: failed%\r\n");
00164 
00165                 //beginPacket fails if remote ethaddr is unknown. In this case an
00166                 //arp-request is send out first and beginPacket succeeds as soon
00167                 //the arp-response is received.
00168             } while (!success);
00169 
00170             success = udp.write((uint8_t*)message, strlen(message));//response
00171 
00172             if (success)
00173                 pc.printf("bytes written: %d\r\n", success);
00174 
00175             success = udp.endPacket();
00176 
00177             if (success)
00178                 pc.printf("endPacket: succeeded%\r\n");
00179             else
00180                 pc.printf("endPacket: failed%\r\n");
00181 
00182             udp.stop();
00183 
00184             //restart with new connection to receive packets from other clients
00185             if (udp.begin(MY_PORT))
00186                 pc.printf("restart connection: succeeded%\r\n");
00187             else
00188                 pc.printf("restart connection: failed%\r\n");
00189                 //馬達開始
00190             if(b>180|b<-180)
00191             {
00192                 printf("Enter a number:0~+-180 degree\r\n");
00193             }    
00194             else if (b>=-180 & b<=180)
00195             {    
00196                 if(b!=memory)
00197                 {
00198             
00199                     printf("Now b: %d\n\r", b);
00200                     scan_int(b);
00201                     c=trans(vardegree);
00202                 
00203                     if (b > memorydegree)
00204                     {     
00205                         motor.step(c,0,step_speed); // dir=0; 順時鐘
00206                         //printf("Current b: %d\n\r", b);
00207                     }
00208                     if (b < memorydegree)
00209                     {
00210                         motor.step(c,1,step_speed);//dir=1;逆時鐘
00211                         //printf("Current b: %d\n\r", b);                              
00212                     }
00213                         printf("Enter a number:0~+-180 degree\r\n");
00214                     
00215                     memorydegree=b;
00216                     //printf("memorydegree: %d\n\r",memorydegree);
00217                     memory=b;
00218                 }  
00219                 //wait(1);         
00220             } 
00221         }
00222     }
00223         
00224         
00225         
00226         
00227         
00228         
00229 ///////////////////////////////////////////////////////////////////////////////////////////////        
00230         
00231         
00232         
00233         
00234         
00235         
00236         
00237         
00238         
00239         
00240         
00241         printf("Default Speed: %d\n\r",step_speed);
00242         printf("1- 360 degree clockwise step\n\r");
00243         printf("2- 360 degree anticlockwise step\n\r");
00244         printf("3- 180 degree clockwise step\n\r");
00245         printf("4- 180 degree anticlockwise step\n\r");
00246         printf("5- Change Speed\n\r");
00247         
00248         
00249         
00250         while(1)
00251         {
00252              if (pc.readable()) 
00253                     { // checks for serial
00254 
00255                         if (pc.getc()=='1')
00256                             motor.step(numstep,0,step_speed); // number of steps, direction, speed
00257 
00258                         if (pc.getc()=='2')
00259                             motor.step(numstep,1,step_speed);
00260 
00261                         if (pc.getc()=='3')
00262                             motor.step(numstep/2,0,step_speed);
00263 
00264                         if (pc.getc()=='4')
00265                             motor.step(numstep/2,1,step_speed);
00266 
00267                         if (pc.getc()=='5') 
00268                             {
00269                                 printf("Current Speed: %d\n\r", step_speed);
00270                                 printf("New speed: \n\r");
00271                                 pc.scanf("%d",&step_speed); // sets new speed
00272                             }
00273                     }           
00274         }
00275     
00276     
00277 }
00278 
00279 
00280 
00281 
00282 
00283 void sMotor::setzerostep(int SetZeroSteps, int direction, int step_speed) 
00284 {// steper function: number of steps, direction (0- right, 1- left), speed (default 1200)
00285     //printf("test\r\n");
00286     int count=0; // initalize step count
00287     if (direction==0) // turn clockwise
00288     {
00289        printf("test");
00290       do 
00291         {
00292            SetZeroClockWise();
00293            count++;
00294         }while (count<numstep & set_zero_point==0); // turn number of steps applied  
00295         if (set_zero_point==1) // 如果光遮斷器訊號被中斷則LED亮起。
00296         {
00297             LED=0;
00298             printf("Already Set to Zero\n\r");            
00299         }   
00300         //printf("test\r\n");
00301          
00302           
00303           
00304     }   
00305     zerocount++;             
00306 }   
00307 
00308 
00309 
00310 
00311 
00312 
00313 
00314 
00315 void sMotor::SetZeroClockWise()
00316 {
00317     
00318     //set_zero_step = setzeroclockwise;
00319     for(int i = 0 ; i < 8 ; i++)
00320     {
00321         //i = set_zero_step%8;
00322         switch (i) 
00323         {
00324             case 0: 
00325             {
00326                 _A0=1;
00327                 _A1=0;
00328                 _A2=0;
00329                 _A3=1;
00330             }
00331             break;
00332             case 1: 
00333             {
00334                 _A0=1;
00335                 _A1=0;
00336                 _A2=0;
00337                 _A3=0;
00338             }
00339             break;
00340             case 2: 
00341             {
00342                 _A0=1;
00343                 _A1=1;
00344                 _A2=0;
00345                 _A3=0;
00346             }
00347             break;
00348             case 3: 
00349             {
00350                 _A0=0;
00351                 _A1=1;
00352                 _A2=0;
00353                 _A3=0;
00354             }
00355             break;
00356             case 4: 
00357             {
00358                 _A0=0;
00359                 _A1=1;
00360                 _A2=1;
00361                 _A3=0;
00362             }
00363             break;
00364             case 5: 
00365             {
00366                 _A0=0;
00367                 _A1=0;
00368                 _A2=1;
00369                 _A3=0;
00370             }
00371             break;
00372             case 6: 
00373             {
00374                 _A0=0;
00375                 _A1=0;
00376                 _A2=1;
00377                 _A3=1;
00378             }
00379             break;
00380             case 7: 
00381             {
00382                 _A0=0;
00383                 _A1=0;
00384                 _A2=0;
00385                 _A3=1;
00386             }
00387             break;
00388         }//switch
00389         wait_us(step_speed); // wait time defines the speed          
00390     }//for
00391   
00392 }
00393 
00394 
00395 
00396 
00397 
00398 
00399 
00400 
00401  void scan_int(int scan)//變化量函數
00402 {
00403     //scanf("%d",&b);
00404     //printf("Enter b: %d\n\r",b);
00405     
00406     vardegree=b-memorydegree;//變化量=輸入度數-上次度數
00407     printf("vardegree: %d\n\r",vardegree);    
00408     fflush(stdout);
00409 
00410 }
00411 int trans(int trans)//度數轉步數
00412 {
00413     float numstep = 0 ; // defines full turn of 360 degree
00414     int d=0;
00415     numstep=1.422222*trans;//取實際步數值
00416     if(numstep<0)
00417     {
00418         numstep=-numstep;
00419     }
00420     d=int(numstep+0.5);//四捨五入整數步數
00421     //printf("Real steps d: %d\n\r",d);    
00422     return d;
00423 }