////// VENETIETO.FI \\\\\\ //// Autopilotti 2014 \\\\ #include <EEPROM.h> #include <SoftwareSerial.h> SoftwareSerial gps(10, 0); // RX, TX -pinnit const int buttonpinset = 2; // painonäppäimen pinni const int buttonpinclear = 4; // painonäppäimen pinni const int buttonpinoikea = 12; // painonäppäimen pinni const int buttonpinvasen = 10; // painonäppäimen pinni const int ledpin = 13; // LED pinni const int Dir2a = 7; //PWM suunta 2a const int Dir2b = 8; //PWM suunta 2b const int Enable2 = 5; //PWM E2 const int numreadings = 5; int buttonstateset = 0; // muutuja pianonäppäimen tilan lukemiseksi int buttonstateclear = 0; // muutuja pianonäppäimen tilan lukemiseksi int buttonstateoikea = 0; int buttonstatevasen = 0; int ero = 0; // muutuja arvolle int address = 0; // muutuja arvolle int readings[numreadings]; // the readings from the analog input int index = 0; int total = 0; int average = 0; // the index of the current reading // the running total // the average float gpslat0;
float gpslong0; float gpslat; float gpslong; float gpsspeed; //solmua float gpsbearing; //suunta byte tallennus; void setup() Serial.begin(38400); gps.begin(38400); pinmode(ledpin, OUTPUT); //asettaa pinnin ulostuloksi pinmode(buttonpinset, INPUT); //asettaa pinnin sisääntuloksi pinmode(buttonpinclear, INPUT); //asettaa pinnin sisääntuloksi pinmode(buttonpinoikea, INPUT); pinmode(buttonpinvasen, INPUT); for (int thisreading = 0; thisreading < numreadings; thisreading++) readings[thisreading] = 0; void loop() if (gps.available() > 1) //lue arvo kun GPS antaa dataa if (char(gps.read()) == 'R' && char(gps.read()) == 'M' && char(gps.read()) == 'C') //lue arvo jossa R,M ja C (RMC) gps.parsefloat(); //poista turhat gpslatlong(gps.parseint(), gps.parseint(), gps.parseint(), gps.parseint()); //sijainti gpsohjaus(); //toista lauseke "gpsohjaus"
gpsspeed = gps.parsefloat(); //solmua gpsbearing = gps.parsefloat(); //suunta void gpslatlong(int lat1, int lat2, int long1, int long2) //paikan, nopeuden ja suunnan printti, jos vaikka haluaa tulevaisuudessa näytölle gpslat = int(lat1/100) + (lat1%100)/60.0 + float(lat2)/10000.0/60.0; gpslong = int(long1/100) + (long1%100)/60.0 + float(long2)/10000.0/60.0; Serial.print(gpsLat,5); Serial.print("/"); Serial.println(gpsLong,5); Serial.print("Nopeus:"); Serial.println(gpsSpeed,3); Serial.print("Suunta:"); Serial.println(gpsBearing,2); void gpsohjaus() //ohjaustoiminto buttonstateset = digitalread(buttonpinset); buttonstateclear = digitalread(buttonpinclear); tallennus = EEPROM.read(0); //EEPROM muistin luku osoitteesta (0) total= total - readings[index]; readings[index] = gpsbearing; total= total + readings[index]; index = index + 1; if (index >= numreadings)
index = 0; average = total / numreadings; int suunta = average/2; //suuntima on 0-360, mutta EEPROM tallentaa arvot vain välillä 0-255 if (buttonstateset == HIGH) //toimi jos Set nappia painettu EEPROM.write(0, suunta); //kirjoita EEPROMn osoitteeseen (0) suuntiman arvo digitalwrite(ledpin, HIGH); //sytytä LED if (buttonstateclear == HIGH) //toimi jos Reset nappia painettu EEPROM.write(0, 0); //kirjoita EEPROMn osoitteeseen (0) arvo 0 digitalwrite(ledpin, LOW); //sammuta LED if (tallennus!= 0) //toimi jos tallennuksen:n arvo ei ole 0 int ero = suunta-tallennus; //hetkellisen suunnan ja tallennuksen ero if (2 >= ero >= -2) //pysayta moottori jos ero pienempi kuin 2 analogwrite(enable2,0); if (ero >= 2) //pyöritä moottoria hitaasti jos ero suurempi kuin 3, vastapaivä analogwrite(enable2,130); if (ero >= 8) //pyöritä moottoria nopeasti jos ero suurempi kuin 15, vastapaivä
analogwrite(enable2,250); if (ero <= -2) //pyöritä moottoria hitaasti jos ero suurempi kuin 3, myötäpaivä digitalwrite(dir2a, LOW); digitalwrite(dir2b, HIGH); analogwrite(enable2,130); if (ero <= -8) //pyöritä moottoria nopeasti jos ero suurempi kuin 15, myötäpaivä digitalwrite(dir2a, LOW); digitalwrite(dir2b, HIGH); analogwrite(enable2,250); Serial.print("ero:"); //tulosta ero sarjaporttiin Serial.println(ero); Serial.print("average:"); //tulosta keskiarvo sarjaporttiin Serial.println(average); if (tallennus == 0) //toimi jos tallennuksen:n arvo on 0 if (buttonstateoikea == HIGH) analogwrite(enable2,250); else analogwrite(enable2,0);
if (buttonstatevasen == HIGH) digitalwrite(dir2a, LOW); digitalwrite(dir2b, HIGH); analogwrite(enable2,250); else analogwrite(enable2,0); Serial.print("tallennus:"); //tulosta tallennus sarjaporttiin Serial.println(tallennus);