Replacement firmware for Dawson Dynamic OB dish positioner

Dependencies:   ConfigFile PCF8574 TextOLED mbed

Fork of mbed_blinky by Mbed

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers main.cpp Source File

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