Replacement firmware for Dawson Dynamic OB dish positioner
Dependencies: ConfigFile PCF8574 TextOLED mbed
Fork of mbed_blinky by
main.cpp
00001 #include "mbed.h" 00002 #include "PCF8574.h" 00003 #include <string> 00004 #include "ConfigFile.h" 00005 00006 LocalFileSystem local("local"); 00007 ConfigFile cfg; 00008 00009 //Address of PCF8574 Button and LCD interface IC's 00010 #define PCF8574_BUTTON_ADDR 1 //A0 00011 #define PCF8574_LCD_ADDR 0 00012 00013 DigitalOut led1(LED1); 00014 DigitalOut led2(LED2); 00015 DigitalOut led3(LED3); 00016 DigitalOut led4(LED4); 00017 00018 00019 //controller pins 00020 DigitalOut Select_AZ (p20); 00021 DigitalOut Select_EL (p16); 00022 DigitalOut Direction (p25); 00023 PwmOut Drive (p26); 00024 DigitalIn Endstop_AZ (p18); 00025 DigitalIn Endstop_EL (p15); 00026 InterruptIn Pulse(p17); 00027 DigitalOut rfled(p12); 00028 00029 //LCD pin connections to PCF8574 00030 #define rs_pin 0 00031 #define e_pin 1 00032 #define d4_pin 2 00033 #define d5_pin 3 00034 #define d6_pin 4 00035 #define d7_pin 5 00036 00037 //scaling for pulses per degree 00038 #define Az_scale = 15.378 00039 #define El_scale = 5.155 00040 00041 PCF8574 pcf_lcd(p9,p10,PCF8574_LCD_ADDR,true); 00042 PCF8574 pcf_button(p9,p10,PCF8574_BUTTON_ADDR,true); 00043 00044 Ticker Refresh_timer; 00045 00046 int _column; 00047 int _row; 00048 int Az_Count; 00049 int El_Count; 00050 char buffer[20]; 00051 char Last_Direction=0; 00052 char Up=0,Down=0,Left=0,Right=0,OK=0; 00053 float Azimuth,Elevation; 00054 float pwm_freq=0.00005;//30khz 00055 float pwm_duty=0.5; 00056 float Az_ref=0,El_ref=0; 00057 float Az_zero=0; 00058 float El_zero=0; 00059 int temp; 00060 float temp2; 00061 00062 00063 //settings available in menu 00064 int setting_count=6; 00065 int setting_val[] = {0,270,0,60,Az_zero,El_zero}; 00066 00067 char * const setting_name[] = { 00068 "Az CCW Limit:", 00069 "Az CW Limit:", 00070 "El Low Limit:", 00071 "El High Limit:", 00072 "Set Current Az:", 00073 "Set Current El:", 00074 }; 00075 00076 00077 00078 00079 void writeByte(int byte); 00080 void writeCommand(int command); 00081 void locate(int column, int row); 00082 void cls(); 00083 void init(); 00084 void write4bit(int value); 00085 void character(int column, int row, int c); 00086 int address(int column, int row); 00087 void writeData(int data); 00088 void writestring(int column, int row, string c); 00089 void count_rise(); 00090 void count_fall(); 00091 void Refresh_oled(bool anytime); 00092 void menu(void); 00093 void WriteSettings(void); 00094 void ReadSettings(void); 00095 00096 00097 00098 //start of main program 00099 int main() { 00100 uint8_t val; 00101 00102 El_Count=0; 00103 Az_Count=0; 00104 00105 Endstop_AZ.mode(PullUp); 00106 Pulse.mode(PullUp); 00107 00108 rfled=0; 00109 00110 pcf_button=0xff; 00111 00112 00113 if(cfg.read("/local/settings.cfg")){ 00114 char cfgval[10]; 00115 for(int i=0;i<setting_count;i++){ 00116 cfg.getValue(setting_name[i], &cfgval[0], sizeof(setting_val)); 00117 setting_val[i]=atoi(cfgval); 00118 } 00119 } 00120 00121 init(); 00122 sprintf(buffer,"Az/El Controller"); 00123 writestring(2,0,buffer); 00124 sprintf(buffer,"M0DTS 2017"); 00125 writestring(4,1,buffer); 00126 sprintf(buffer,"rob@m0dts.co.uk"); 00127 writestring(2,2,buffer); 00128 wait(2); 00129 cls(); 00130 sprintf(buffer,"Az/El Controller"); 00131 writestring(0,0,buffer); 00132 00133 00134 Refresh_oled(true); 00135 00136 Pulse.rise(&count_rise); 00137 Pulse.fall(&count_fall); 00138 Drive.period(pwm_freq); 00139 00140 00141 00142 00143 while(1) { 00144 00145 val = pcf_button.read(); 00146 Up = ~(val>>3)&0x01; 00147 Left = ~(val>>4)&0x01; 00148 Right = ~(val>>5)&0x01; 00149 Down = ~(val>>6)&0x01; 00150 OK = ~(val>>7)&0x01; 00151 00152 if(OK){ 00153 //menu 00154 menu(); 00155 wait_ms(200); 00156 cls(); 00157 sprintf(buffer,"Az/El Controller"); 00158 writestring(0,0,buffer); 00159 Refresh_oled(true); 00160 } 00161 00162 00163 if(Up){ 00164 Last_Direction=0; 00165 Select_EL=1; 00166 Select_AZ=0; 00167 Direction=1; 00168 temp2 = 0.1; 00169 Drive.write(temp2); 00170 while(Up & Elevation<=setting_val[3]){ 00171 if(temp2<pwm_duty){ 00172 temp2+=0.01; 00173 Drive.write(temp2); 00174 } 00175 Up = ~(pcf_button.read()>>3)&0x01; 00176 Refresh_oled(false); 00177 } 00178 Drive.write(0.0f); 00179 wait_ms(100); 00180 Up=0; 00181 Refresh_oled(true); 00182 } 00183 00184 if(Down){ 00185 if(!Endstop_EL){ 00186 Last_Direction=1; 00187 Select_EL=1; 00188 Select_AZ=0; 00189 Direction=0; 00190 temp2 = 0.1; 00191 Drive.write(temp2); 00192 while(Down & !Endstop_EL & Elevation>=setting_val[2]){ 00193 if(temp2<pwm_duty){ 00194 temp2+=0.01; 00195 Drive.write(temp2); 00196 } 00197 Down = ~(pcf_button.read()>>6)&0x01; 00198 Refresh_oled(false); 00199 } 00200 Drive.write(0.0f); 00201 wait_ms(100); 00202 Down=0; 00203 Refresh_oled(true); 00204 } 00205 } 00206 00207 if(Left){ 00208 if(!Endstop_AZ){ 00209 Last_Direction=2; 00210 Select_EL=0; 00211 Select_AZ=1; 00212 Direction=1; 00213 temp2 = 0.1; 00214 Drive.write(temp2); 00215 while(Left & !Endstop_AZ & Azimuth>=setting_val[0]){ 00216 if(temp2<pwm_duty){ 00217 temp2+=0.01; 00218 Drive.write(temp2); 00219 } 00220 Left = ~(pcf_button.read()>>4)&0x01; 00221 Refresh_oled(false); 00222 } 00223 Drive.write(0.0f); 00224 wait_ms(100); 00225 Left=0; 00226 Refresh_oled(true); 00227 } 00228 } 00229 00230 if(Right){ 00231 Last_Direction=3; 00232 Select_EL=0; 00233 Select_AZ=1; 00234 Direction=0; 00235 temp = Az_Count; 00236 temp2 = 0.1; 00237 Drive.write(temp2); 00238 while(Right & Azimuth<=setting_val[1]){ 00239 if(temp2<pwm_duty){ 00240 temp2+=0.01; 00241 Drive.write(temp2); 00242 } 00243 Right = ~(pcf_button.read()>>5)&0x01; 00244 Refresh_oled(false); 00245 } 00246 Drive.write(0.0f); 00247 wait_ms(100); 00248 Right=0; 00249 Refresh_oled(true); 00250 } 00251 } 00252 } 00253 00254 void menu(void){ 00255 00256 //grab current az/el 00257 00258 setting_val[4]=(int)Azimuth; 00259 setting_val[5]=(int)Elevation; 00260 00261 int pos=0; 00262 cls(); 00263 sprintf(buffer,"Menu"); 00264 sprintf(buffer + strlen(buffer)," %i:",pos+1); 00265 writestring(0,0,buffer); 00266 sprintf(buffer,setting_name[pos]); 00267 writestring(0,1,buffer); 00268 sprintf(buffer," "); 00269 writestring(0,2,buffer); 00270 sprintf(buffer,"%i",setting_val[pos]); 00271 writestring(0,2,buffer); 00272 wait_ms(200); 00273 00274 int val; 00275 while(1){ 00276 val = pcf_button.read(); 00277 Up = ~(val>>3)&0x01; 00278 Left = ~(val>>4)&0x01; 00279 Right = ~(val>>5)&0x01; 00280 Down = ~(val>>6)&0x01; 00281 OK = ~(val>>7)&0x01; 00282 00283 if(OK){ 00284 break; 00285 } 00286 00287 if(Down){ 00288 cls(); 00289 pos++; 00290 if (pos==setting_count){ 00291 pos=setting_count-1; 00292 } 00293 sprintf(buffer,"Menu"); 00294 sprintf(buffer + strlen(buffer)," %i:",pos+1); 00295 writestring(0,0,buffer); 00296 00297 sprintf(buffer,setting_name[pos]); 00298 writestring(0,1,buffer); 00299 sprintf(buffer," "); 00300 writestring(0,2,buffer); 00301 sprintf(buffer,"%i",setting_val[pos]); 00302 writestring(0,2,buffer); 00303 00304 if(pos==setting_count-1){ 00305 sprintf(buffer,"OK=Save"); 00306 writestring(13,3,buffer); 00307 } 00308 wait_ms(200); 00309 } 00310 00311 00312 if(Up){ 00313 pos--; 00314 if (pos<0){pos=0;} 00315 cls(); 00316 sprintf(buffer,"Menu"); 00317 sprintf(buffer + strlen(buffer)," %i:",pos+1); 00318 writestring(0,0,buffer); 00319 sprintf(buffer,setting_name[pos]); 00320 writestring(0,1,buffer); 00321 sprintf(buffer," "); 00322 writestring(0,2,buffer); 00323 sprintf(buffer,"%i",setting_val[pos]); 00324 writestring(0,2,buffer); 00325 wait_ms(200); 00326 } 00327 00328 00329 if(Left){ 00330 switch (pos) { 00331 case 0: 00332 if(setting_val[pos]>0){ 00333 setting_val[pos]-=1; 00334 } 00335 break; 00336 case 1: 00337 if(setting_val[pos]>setting_val[0]){ 00338 setting_val[pos]-=1; 00339 } 00340 break; 00341 case 2: 00342 if(setting_val[pos]>0){ 00343 setting_val[pos]-=1; 00344 } 00345 break; 00346 case 3: 00347 if(setting_val[pos]>setting_val[2]){ 00348 setting_val[pos]-=1; 00349 } 00350 break; 00351 case 4: 00352 if(setting_val[pos]>0){ 00353 setting_val[pos]-=1; 00354 } 00355 break; 00356 case 5: 00357 if(setting_val[pos]>0){ 00358 setting_val[pos]-=1; 00359 } 00360 break; 00361 00362 } 00363 00364 sprintf(buffer," "); 00365 writestring(0,2,buffer); 00366 sprintf(buffer,"%i",setting_val[pos]); 00367 writestring(0,2,buffer); 00368 wait_ms(50); 00369 } 00370 00371 if(Right){ 00372 switch (pos) { 00373 case 0: //360 00374 if(setting_val[pos]<setting_val[1]){ 00375 setting_val[pos]+=1; 00376 } 00377 case 1: //360 00378 if(setting_val[pos]<360){ 00379 setting_val[pos]+=1; 00380 } 00381 break; 00382 case 2: //90 00383 if(setting_val[pos]<setting_val[3]){ 00384 setting_val[pos]+=1; 00385 } 00386 break; 00387 case 3: //90 00388 if(setting_val[pos]<90){ 00389 setting_val[pos]+=1; 00390 } 00391 break; 00392 case 4: //360 00393 if(setting_val[pos]<360){ 00394 setting_val[pos]+=1; 00395 } 00396 break; 00397 case 5: //90 00398 if(setting_val[pos]<90){ 00399 setting_val[pos]+=1; 00400 } 00401 break; 00402 } 00403 00404 sprintf(buffer," "); 00405 writestring(0,2,buffer); 00406 sprintf(buffer,"%i",setting_val[pos]); 00407 writestring(0,2,buffer); 00408 wait_ms(50); 00409 } 00410 } 00411 cls(); 00412 sprintf(buffer,"Saving..."); 00413 writestring(2,2,buffer); 00414 00415 //store settings here 00416 for(int i=0;i<setting_count;i++){ 00417 sprintf(buffer,"%i",setting_val[i]); 00418 cfg.setValue(setting_name[i], buffer) ; 00419 } 00420 00421 cfg.write("/local/settings.cfg", "# Az/El Controller Settings"); 00422 cfg.removeAll(); 00423 00424 //reset counters.... big problem! 00425 Az_Count=0; 00426 El_Count=0; 00427 00428 //save delay?! 00429 wait_ms(300); 00430 } 00431 00432 void count_rise(void){ 00433 if(Up|Right){ 00434 if(Up){ 00435 El_Count++; 00436 } 00437 if(Right){ 00438 Az_Count++; 00439 } 00440 //catch pulses after button released 00441 }else{ 00442 if(Last_Direction==0)//up 00443 El_Count++; 00444 if(Last_Direction==3)//right 00445 Az_Count++; 00446 } 00447 } 00448 00449 void count_fall(void){ 00450 if(Down|Left){ 00451 if(Down){ 00452 El_Count--; 00453 } 00454 if(Left){ 00455 Az_Count--; 00456 } 00457 //catch pulses after button released 00458 }else{ 00459 if(Last_Direction==1)//down 00460 El_Count--; 00461 if(Last_Direction==2)//left 00462 Az_Count--; 00463 } 00464 } 00465 00466 00467 void Refresh_oled(bool anytime){ 00468 00469 Elevation = ((float)El_Count/15.378)+setting_val[5]; 00470 Azimuth = ((float)Az_Count/5.155)+setting_val[4]; 00471 00472 if(Up){ 00473 sprintf(buffer,"El:% 05.1f",Elevation); 00474 writestring(11,3,buffer); 00475 buffer[0]=85;//'U' 00476 buffer[1]=0; 00477 writestring(19,3,buffer); 00478 } 00479 if(Down){ 00480 sprintf(buffer,"El:% 05.1f",Elevation); 00481 writestring(11,3,buffer); 00482 buffer[0]=68;//'D' 00483 buffer[1]=0; 00484 writestring(19,3,buffer); 00485 } 00486 if(Left){ 00487 sprintf(buffer,"Az:% 06.1f",Azimuth); 00488 writestring(0,3,buffer); 00489 buffer[0]=127;//arrow left 00490 buffer[1]=0; 00491 writestring(9,3,buffer); 00492 } 00493 if(Right){ 00494 sprintf(buffer,"Az:% 06.1f",Azimuth); 00495 writestring(0,3,buffer); 00496 buffer[0]=126;//arrow right 00497 buffer[1]=0; 00498 writestring(9,3,buffer); 00499 } 00500 00501 if(!(Up|Down|Left|Right)){ 00502 sprintf(buffer," "); 00503 writestring(9,3,buffer); 00504 writestring(19,3,buffer); 00505 if(anytime){ 00506 sprintf(buffer,"Az:% 06.1f",Azimuth); 00507 writestring(0,3,buffer); 00508 sprintf(buffer,"El:% 05.1f",Elevation); 00509 writestring(11,3,buffer); 00510 } 00511 00512 if(Endstop_AZ|Endstop_EL){ 00513 if(Endstop_AZ){ 00514 sprintf(buffer,"L"); 00515 writestring(9,3,buffer); 00516 } 00517 00518 if(Endstop_EL){ 00519 sprintf(buffer,"L"); 00520 writestring(19,3,buffer); 00521 } 00522 } 00523 } 00524 00525 00526 00527 } 00528 00529 00530 //LCD routines *********************************************************************************************** 00531 00532 void writeCommand(int command) { 00533 pcf_lcd.write(rs_pin,0x00); 00534 writeByte(command); 00535 } 00536 00537 void writeData(int data) { 00538 pcf_lcd.write(rs_pin,0x01); 00539 wait_us(10); 00540 writeByte(data); 00541 } 00542 00543 void writeByte(int value) { 00544 //send MSB 4 bits 00545 write4bit(value>>4); 00546 //send LSB 4 bits 00547 write4bit(value); 00548 } 00549 00550 void writestring(int column, int row, string c) { 00551 int a = address(column, row); 00552 writeCommand(a); 00553 for (int i = 0; c[i] != '\0'; i++){ 00554 writeData(c[i]); 00555 } 00556 } 00557 00558 void write4bit(int value) { 00559 pcf_lcd.write(d7_pin,(value>>3)&0x01); 00560 pcf_lcd.write(d6_pin,(value>>2)&0x01); 00561 pcf_lcd.write(d5_pin,(value>>1)&0x01); 00562 pcf_lcd.write(d4_pin,value&0x01); 00563 wait_us(10); 00564 pcf_lcd.write(e_pin,0x01); 00565 wait_us(10); 00566 pcf_lcd.write(e_pin,0x00); 00567 } 00568 00569 void cls() { 00570 writeCommand(0x01); // cls, and set cursor to 0 00571 wait_ms(2); // This command takes 1.64 ms 00572 locate(0, 0); 00573 } 00574 00575 void locate(int column, int row) { 00576 _column = column; 00577 _row = row; 00578 } 00579 00580 void init() { 00581 //set default pin state for enable and reset 00582 pcf_lcd.write(e_pin,0); 00583 pcf_lcd.write(rs_pin,0); 00584 00585 //Enter 4bit mode, write 2 twice 00586 write4bit(0x2); //0010 00587 write4bit(0x2); //0010 00588 write4bit(0x8); //1000 english_japanese (default), 5x8 font, 2 line+ 00589 wait_ms(10); 00590 00591 //display off, cursor off, blink off 00592 writeCommand(0x8); 00593 wait_ms(1); 00594 00595 //clear display 00596 writeCommand(0x1); 00597 wait_ms(1); 00598 00599 //display home 00600 writeCommand(0x2); 00601 wait_ms(1); 00602 00603 //increment, no shift 00604 writeCommand(0x6); 00605 wait_ms(1); 00606 00607 //display on, cursor off, blink off 00608 writeCommand(0x0c); 00609 wait_ms(1); 00610 00611 } 00612 00613 void character(int column, int row, int c) { 00614 int a = address(column, row); 00615 writeCommand(a); 00616 writeData(c);//data 00617 } 00618 00619 00620 00621 int address(int column, int row) { 00622 switch (row) { 00623 case 0: 00624 return 0x80 + column; 00625 case 1: 00626 return 0xc0 + column; 00627 case 2: 00628 return 0x94 + column; 00629 case 3: 00630 return 0xd4 + column; 00631 default: 00632 return 0x80 + column; 00633 } 00634 } 00635 00636 00637 00638 00639 00640
Generated on Tue Jul 12 2022 22:32:17 by 1.7.2