// RPi3 Rotator X4 with MCP3008 // 03.01.2018. Author: YT2FSG - Goran Stankovic dipl.ing.el. // email: goranstank@gmail.com, web: http://www.qsl.net/yt2fsg // // gcc -Wall -o rotator3x4 rotator3x4.c -l wiringPi // sudo ./rotator3x4 #define _GNU_SOURCE #include #include #include #include #include #include #include #include #define TRUE (1==1) #define FALSE (!TRUE) #define CHAN_CONFIG_SINGLE 8 #define CHAN_CONFIG_DIFF 0 static int myFd ; int main(void) { FILE * fp; int spiChannel=0; if ((myFd = wiringPiSPISetup (spiChannel, 10000)) < 0) { fprintf (stderr, "Can't open the SPI bus: %s\n", strerror (errno)) ; exit (EXIT_FAILURE) ; } wiringPiSetup () ; pinMode (0, OUTPUT) ; // 17 pinMode (1, OUTPUT) ; // 18 pinMode (2, OUTPUT) ; // 27 pinMode (3, OUTPUT) ; // 22 pinMode (4, OUTPUT) ; // 23 pinMode (5, OUTPUT) ; // 24 pinMode (6, OUTPUT) ; // 25 pinMode (7, OUTPUT) ; // 4 unsigned char buf[] = { 0x01, 0x80, 0x00 }; // Data to send int adc1, adc2, adc3, adc4; int p1, p2, p3, p4; int set=1; // Start pozicioniranja int delta=2; // min ugao za koji rotator ne reaguje int out1=0, out2=0, out3=0, out4=0; int ps1=100, ps2=200, ps3=300, ps4=340; int tt=4; // 250ms int time1=0, time2=0, time3=0, time4=0; int time_max1=60, time_max2=60, time_max3=60, time_max4=60; int pmin1=0, pmax1=1023, pmin2=0, pmax2=1023, pmin3=0, pmax3=1023, pmin4=0, pmax4=1023; int op1, op2, op3, op4; unsigned char cc=0; char c; char buffer[100]; // long length; int i=0, j=0; int buffer2[16]; // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - printf("*** RPi3 Rotator for X4 antennas system ***\n"); printf("by: YT2FSG - Goran Stankovic dipl.ing.el. (goranstank@gmail.com)\n\n"); printf("Parameters: Ant1 Ant2 Ant3 Ant4\n"); // Ucitavanje parametara iz file 'time_max' if ((fp = fopen("time_max","r")) == NULL) { printf("file 'time_max' not found! \n"); } else { while(1) { c = fgetc(fp); if (feof(fp)) { break; } if (c==',') { buffer[i] = 0; i = 0; buffer2[j] = atoi(buffer); j++; } else { buffer[i] = c; i++; } } buffer[i] = 0; buffer2[j] = atoi(buffer); printf("time_max (sec): %3d %3d %3d %3d \n", buffer2[0], buffer2[1], buffer2[2], buffer2[3]); time_max1 = buffer2[0]; time_max2 = buffer2[1]; time_max3 = buffer2[2]; time_max4 = buffer2[3]; } fclose(fp); // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // Ucitavanje parametara iz file 'calibration' i=0; j=0; if ((fp = fopen("calibration","r")) == NULL) { printf("file 'calibration' not found! \n"); } else { while(1) { c = fgetc(fp); if (feof(fp)) { break; } if (c==',') { buffer[i] = 0; i = 0; buffer2[j] = atoi(buffer); j++; } else { buffer[i] = c; i++; } } buffer[i] = 0; buffer2[j] = atoi(buffer); printf("cal_min ( ): %3d %3d %3d %3d \n", buffer2[0], buffer2[2], buffer2[4], buffer2[6]); printf("cal_max ( ): %3d %3d %3d %3d \n", buffer2[1], buffer2[3], buffer2[5], buffer2[7]); pmin1 = buffer2[0]; pmax1 = buffer2[1]; pmin2 = buffer2[2]; pmax2 = buffer2[3]; pmin3 = buffer2[4]; pmax3 = buffer2[5]; pmin4 = buffer2[6]; pmax4 = buffer2[7]; } fclose(fp); // exit(0); // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - while (1) { // Citanje pozicije antena - potenciometri (MCP3008) delay(50); // delay 50ms // CH0 buf[0] = 0x01; buf[1] = 0x80; buf[2] = 0x00; wiringPiSPIDataRW(spiChannel, buf, 3); adc1 = ( (buf[1] & 3 ) << 8 ) + buf[2]; delay(50); // delay 50ms // CH1 buf[0] = 0x01; buf[1] = 0x90; buf[2] = 0x00; wiringPiSPIDataRW(spiChannel, buf, 3); adc2 = ( (buf[1] & 3 ) << 8 ) + buf[2]; delay(50); // delay 50ms // CH2 buf[0] = 0x01; buf[1] = 0xA0; buf[2] = 0x00; wiringPiSPIDataRW(spiChannel, buf, 3); adc3 = ( (buf[1] & 3 ) << 8 ) + buf[2]; delay(50); // delay 50ms // CH3 buf[0] = 0x01; buf[1] = 0xB0; buf[2] = 0x00; wiringPiSPIDataRW(spiChannel, buf, 3); adc4 = ( (buf[1] & 3 ) << 8 ) + buf[2]; // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // Calibration op1 = pmax1 - pmin1; if (op1 < 1 ) { p1 = adc1 * 360 / 1023; } else { p1 = (adc1 - pmin1) * 360 / op1; } op2 = pmax2 - pmin2; if (op2 < 1 ) { p2 = adc2 * 360 / 1023; } else { p2 = (adc2 - pmin2) * 360 / op2; } op3 = pmax3 - pmin3; if (op3 < 1 ) { p3 = adc3 * 360 / 1023; } else { p3 = (adc3 - pmin3) * 360 / op3; } op4 = pmax4 - pmin4; if (op4 < 1 ) { p4 = adc4 * 360 / 1023; } else { p4 = (adc4 - pmin4) * 360 / op4; } // printf("Position: %d=%d %d=%d %d=%d %d=%d \n", adc1, p1, adc2, p2, adc3, p3, adc4, p4); // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // Ucitavanje parametara iz FLASH-DISK file 'pos_set' i=0; j=0; if ((fp = fopen("/var/www/html/pos_set","r")) == NULL) { printf("file '/var/www/html/pos_set' not found! \n"); } else { while(1) { c = fgetc(fp); if (feof(fp)) { break; } if (c==',') { buffer[i] = 0; i = 0; buffer2[j] = atoi(buffer); j++; } else { buffer[i] = c; i++; } } buffer[i] = 0; buffer2[j] = atoi(buffer); // printf("pos_set : %3d %3d %3d %3d \n", buffer2[0], buffer2[1], buffer2[2], buffer2[3]); ps1 = buffer2[0]; ps2 = buffer2[1]; ps3 = buffer2[2]; ps4 = buffer2[3]; } fclose(fp); // exit(0); // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // Ucitavanje parametara iz FLASH-DISK file 'set' i=0; j=0; if ((fp = fopen("/var/www/html/set","r")) == NULL) { printf("file '/var/www/html/set' not found! \n"); } else { while(1) { c = fgetc(fp); if (feof(fp)) { break; } buffer[i] = c; i++; } buffer[1] = 0; set = atoi(buffer); // printf("set : %d \n", set); } fclose(fp); // exit(0); // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // Obrada - pozicioniranje antena na zadatu poziciju if (set==1) { set = 0; cc = 8; // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - //Upisi '0' u FLASH-DISK file 'set' if ((fp = fopen("/var/www/html/set","w")) == NULL) { printf("file '/var/www/html/set' not open! \n"); } else { fputc( '0', fp); } fclose(fp); if (p1 < ps1 - delta) { out1 = 1; } else if (p1 > ps1 + delta) { out1 = 2; } else { out1 = 0; } if (p2 < ps2 - delta) { out2 = 1; } else if (p2 > ps2 + delta) { out2 = 2; } else { out2 = 0; } if (p3 < ps3 - delta) { out3 = 1; } else if (p3 > ps3 + delta) { out3 = 2; } else { out3 = 0; } if (p4 < ps4 - delta) { out4 = 1; } else if (p4 > ps4 + delta) { out4 = 2; } else { out4 = 0; } } else { if ((p1 >= ps1) && (out1==1)) { out1 = 0; } if ((p1 <= ps1) && (out1==2)) { out1 = 0; } if (out1 !=0) { time1++; if ((time1/tt) > time_max1) { out1 = 0; } } if ((p2 >= ps2) && (out2==1)) { out2 = 0; } if ((p2 <= ps2) && (out2==2)) { out2 = 0; } if (out2 !=0) { time2++; if ((time2/tt) > time_max2) { out2 = 0; } } if ((p3 >= ps3) && (out3==1)) { out3 = 0; } if ((p3 <= ps3) && (out3==2)) { out3 = 0; } if (out3 !=0) { time3++; if ((time3/tt) > time_max3) { out3 = 0; } } if ((p4 >= ps4) && (out4==1)) { out4 = 0; } if ((p4 <= ps4) && (out4==2)) { out4 = 0; } if (out4 !=0) { time4++; if ((time4/tt) > time_max4) { out4 = 0; } } } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // Postavnjanje izlaza if (out1 == 1) { digitalWrite(0,0); digitalWrite(1,1); } else if (out1 == 2) { digitalWrite(0,1); digitalWrite(1,0); } else { time1 = 0; digitalWrite(0,0); digitalWrite(1,0); } if (out2 == 1) { digitalWrite(2,0); digitalWrite(3,1); } else if (out2 == 2) { digitalWrite(2,1); digitalWrite(3,0); } else { time2 = 0; digitalWrite(2,0); digitalWrite(3,0); } if (out3 == 1) { digitalWrite(4,0); digitalWrite(5,1); } else if (out3 == 2) { digitalWrite(4,1); digitalWrite(5,0); } else { time3 = 0; digitalWrite(4,0); digitalWrite(5,0); } if (out4 == 1) { digitalWrite(6,0); digitalWrite(7,1); } else if (out4 == 2) { digitalWrite(6,1); digitalWrite(7,0); } else { time4 = 0; digitalWrite(6,0); digitalWrite(7,0); } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - //Upisi podatke u RAM-DISK file 'position' if ((fp = fopen("/var/tmp1/position","w")) == NULL) { printf("file '/var/tmp1/position' not open! \n"); } else { fprintf(fp,"%3d,%3d,%3d,%3d\n",p1,p2,p3,p4); } fclose(fp); // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - printf("%d # A1: %3d=%3d %d-%03d # A2: %3d=%3d %d-%03d # A3: %3d=%3d %d-%03d # A4: %3d=%3d %d-%03d # \n", cc,p1,ps1,out1,time1/tt,p2,ps2,out2,time2/tt,p3,ps3,out3,time3/tt,p4,ps4,out4,time4/tt); cc++; if (cc > (tt-1)) { cc=0; } delay(50); // delay 4*50+50=250ms => tt=4 } close (myFd) ; return 0; }