test0313
Embed:
(wiki syntax)
Show/hide line numbers
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 }
Generated on Fri Jul 15 2022 15:37:38 by
1.7.2