Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <Arduino.h>
- //ESC bibliotheken
- #include "esp32-hal-ledc.h"
- #define TIMER_WIDTH 16
- #include <Servo.h>
- Servo MotorL, MotorR;
- boolean richtingL, richtingR;
- int snelheidL, snelheidR;
- double beginPunt[2] = {51.111634, 4.006755}; // Eerste parameter lengtegraad, tweede breedtegraad
- double eindPunt[2] = {51.111642, 4.006737};
- double hoekBoot;
- double hoekLocatie;
- boolean autopilot;
- #include <TinyGPS++.h>
- TinyGPSPlus gps;
- #include "Wire.h"
- #include <QMC5883L.h>
- QMC5883L compass;
- //Initialisatie van Timers:
- // ServoL
- hw_timer_t * servoL = NULL;
- volatile SemaphoreHandle_t timerServoL;
- portMUX_TYPE timerMuxServoL = portMUX_INITIALIZER_UNLOCKED;
- Servo ServoL;
- // ServoR
- hw_timer_t * servoR = NULL;
- volatile SemaphoreHandle_t timerServoR;
- portMUX_TYPE timerMuxServoR = portMUX_INITIALIZER_UNLOCKED;
- Servo ServoR;
- //ElektromagneetL
- hw_timer_t * magnetL = NULL;
- volatile SemaphoreHandle_t timerMagnetL;
- portMUX_TYPE timerMuxMagnetL = portMUX_INITIALIZER_UNLOCKED;
- //ElektromagneetL
- hw_timer_t * magnetR = NULL;
- volatile SemaphoreHandle_t timerMagnetR;
- portMUX_TYPE timerMuxMagnetR = portMUX_INITIALIZER_UNLOCKED;
- //Bibliotheken voor WebSocket
- #include <WiFi.h>
- #include <WiFiClientSecure.h>
- #include <WebSocketsClient.h>
- #include <esp_wifi.h>
- //Definiëring van pin nummers:
- #define pinMotorL 19
- #define pinMotorR 23
- #define pinServoL 5
- #define pinServoR 18
- #define pinMagnetL 32
- #define pinMagnetR 33
- const char* ssid = "Baitboat";//AP ssid
- const char* password = "Password";//AP password
- TaskHandle_t Task1;
- TaskHandle_t GPSKompas;
- WebSocketsClient webSocket;
- void webSocketEvent(WStype_t type, uint8_t * payload, size_t length) {
- switch(type) {
- case WStype_DISCONNECTED:
- Serial.printf("Verbinding verbroken!\n");
- digitalWrite(2, LOW);
- break;
- case WStype_CONNECTED:
- webSocket.sendTXT("Geconnecteerd!");
- digitalWrite(2, HIGH);
- break;
- case WStype_TEXT:
- analysePS3(payload);
- Serial.printf("Ontvangen tekst: %s\n", payload);
- break;
- }
- }
- void setup() {
- Serial.begin(115200);
- pinMode(2, OUTPUT);
- Serial.println("Hoofd-serial started!");
- Serial.println("Ontwikkelen van kern 0 ...");
- xTaskCreatePinnedToCore(
- Task1code, /* Task function. */
- "Task1", /* name of task. */
- 10000, /* Stack size of task */
- NULL, /* parameter of the task */
- 2, /* priority of the task */
- &Task1, /* Task handle to keep track of created task */
- 0);
- /*xTaskCreatePinnedToCore(
- GPSKompascode,
- "GPSKompas",
- 10000,
- NULL,
- 1,
- &GPSKompas,
- 0);*/
- Serial.println("Kern 0 succesvol ontwikkeld!");
- Serial.println("Speedcontrollers verbinden ...");
- /*MotorL.setPeriodHertz(50);
- MotorL.attach(pinMotorL, 1000, 2000);
- richtingL = true;
- snelheidL = 1500;
- MotorR.setPeriodHertz(50);
- MotorR.attach(pinMotorR, 1000, 2000);
- richtingR = true;
- snelheidR = 1500;*/
- /*ledcSetup(1, 50, TIMER_WIDTH);
- ledcAttachPin(pinMotorL, 1);
- snelheidL = 1500;
- snelheidR = 1500;
- ledcSetup(2, 50, TIMER_WIDTH);
- ledcAttachPin(pinMotorR, 2);*/
- MotorL.attach(pinMotorL);
- MotorL.writeMicroseconds(1500);
- snelheidL = 1500;
- Serial.println(snelheidL);
- MotorR.attach(pinMotorR);
- MotorR.writeMicroseconds(1500);
- snelheidR = 1500;
- Serial.println(snelheidR);
- Serial.println("Speedcontrollers succesvol verbonden!");
- Serial.println("Servo's verbinden ...");
- initServoL();
- initServoR();
- Serial.println("Servo's succesvol verbonden!");
- Serial.println("Elektromagneten verbinden ...");
- initMagnetL();
- initMagnetR();
- Serial.println("Elektromagneten succesvol verbonden!");
- }
- void GPSKompascode( void * pvParameters ){
- /*Serial2.begin(9600, SERIAL_8N1, 16, 17);
- Serial.println("Serial2 succesvol gestart!");
- Wire.begin();
- compass.init();
- compass.setSamplingRate(10);
- for(;;){
- while (Serial2.available() > 0){
- gps.encode(Serial2.read());
- if (gps.location.isUpdated()){
- Serial.print("Latitude= ");
- Serial.print(gps.location.lat(), 6);
- Serial.print(" Longitude= ");
- Serial.print(gps.location.lng(), 6);
- Serial.print(" GPS-satelieten: ");
- Serial.println(gps.satellites.value());
- }
- }
- int heading = compass.readHeading();
- if(heading==0) {
- /* Still calibrating, so measure but don't print
- } else {
- Serial.println(heading);
- hoekBoot = (double) heading;
- }
- }*/
- /*for(;;){
- //MotorL.write(snelheidL);
- //MotorR.write(snelheidR);
- Serial.println("SnelheidL: " + snelheidL);
- Serial.println("SnelheidR: " + snelheidR);
- vTaskDelay(2000/10);
- }*/
- }
- void Task1code( void * pvParameters ){
- WiFi.mode( WIFI_STA );
- esp_wifi_set_protocol( WIFI_IF_STA, WIFI_PROTOCOL_LR );
- WiFi.begin(ssid, password);
- Serial.println("Verbinding maken met HUB ...");
- while (WiFi.status() != WL_CONNECTED){
- delay(500);
- Serial.print(".");
- }
- Serial.println("");
- Serial.println("Geconnecteerd met HUB!");
- Serial.print("IP address: ");
- Serial.println(WiFi.localIP());
- Serial.println("Websocket-verbinding starten ...");
- webSocket.begin("192.168.4.1", 81, "/");
- webSocket.onEvent(webSocketEvent);
- webSocket.setReconnectInterval(5000);
- Serial.println("Websocket-verbinding gestart!");
- for(;;){
- webSocket.loop();
- vTaskDelay(1000/10);
- }
- }
- void loop() {
- MotorL.writeMicroseconds(snelheidL);
- MotorR.writeMicroseconds(snelheidR);
- delay(200);
- }
- void analysePS3(uint8_t * payload){
- String text = (char*) payload;
- //Linkse motor
- if (text.substring(0,3) == "ML>"){
- text.remove(0,3);
- if (text.substring(0,3) == "HLD"){
- snelheidL = 1500;
- return;
- }
- if (text.substring(0,3) == "FWD"){
- //MotorL.setDirection(ESC::FORWARD);
- richtingL = true;
- return;
- }
- if (text.substring(0,3) == "BWD"){
- //MotorL.setDirection(ESC::BACKWARD);
- richtingL = false;
- return;
- }
- //MotorL.//setSpeed(text.toInt());
- int snelheid = map(text.toInt(), 0, 500, 0, 300);
- snelheidL = richtingL ? (1500 + snelheid) : (1500 - snelheid);
- return;
- }
- //Rechtse motor
- if (text.substring(0,3) == "MR>"){
- text.remove(0,3);
- if (text.substring(0,3) == "HLD"){
- snelheidR = 1500;
- return;
- }
- if (text.substring(0,3) == "FWD"){
- //MotorR.setDirection(ESC::FORWARD);
- richtingR = true;
- return;
- }
- if (text.substring(0,3) == "BWD"){
- //MotorR.setDirection(ESC::BACKWARD);
- richtingR = false;
- return;
- }
- //MotorR.//setSpeed(text.toInt());
- int snelheid = map(text.toInt(), 0, 500, 0, 300);
- snelheidR = richtingL ? (1500 + snelheid) : (1500 - snelheid);
- return;
- }
- //Linkse servo
- if (text.substring(0,2) == "L2"){
- ServoL.write(60);
- timerRestart(servoL);
- return;
- }
- //Rechtse servo
- if (text.substring(0,2) == "R2"){
- ServoR.write(60);
- timerRestart(servoR);
- return;
- }
- //Linkse elektromagneet
- if (text.substring(0,2) == "L1"){
- digitalWrite(pinMagnetL, HIGH);
- timerRestart(magnetL);
- return;
- }
- //Linkse elektromagneet
- if (text.substring(0,2) == "R1"){
- digitalWrite(pinMagnetR, HIGH);
- timerRestart(magnetR);
- return;
- }
- }
- void IRAM_ATTR onServoL(){
- portENTER_CRITICAL_ISR(&timerMuxServoL);
- portEXIT_CRITICAL_ISR(&timerMuxServoL);
- //Code voor timer
- ServoL.write(0);
- timerStop(servoL);
- }
- void initServoL(){
- ServoL.attach(pinServoL);
- timerServoL = xSemaphoreCreateBinary();
- servoL = timerBegin(0, 80, true);
- timerAttachInterrupt(servoL, &onServoL, true);
- timerAlarmWrite(servoL, 1500000, true);
- timerAlarmEnable(servoL);
- }
- void IRAM_ATTR onServoR(){
- portENTER_CRITICAL_ISR(&timerMuxServoR);
- portEXIT_CRITICAL_ISR(&timerMuxServoR);
- //Code voor timer
- ServoR.write(0);
- timerStop(servoR);
- }
- void initServoR(){
- ServoR.attach(pinServoR);
- timerServoR = xSemaphoreCreateBinary();
- servoR = timerBegin(1, 80, true);
- timerAttachInterrupt(servoR, &onServoR, true);
- timerAlarmWrite(servoR, 1500000, true);
- timerAlarmEnable(servoR);
- }
- void IRAM_ATTR onMagnetL(){
- portENTER_CRITICAL_ISR(&timerMuxMagnetL);
- portEXIT_CRITICAL_ISR(&timerMuxMagnetL);
- //Code voor timer
- digitalWrite(pinMagnetL, LOW);
- timerStop(magnetL);
- }
- void initMagnetL(){
- pinMode(pinMagnetL, OUTPUT);
- timerMagnetL = xSemaphoreCreateBinary();
- magnetL = timerBegin(2, 80, true);
- timerAttachInterrupt(magnetL, &onMagnetL, true);
- timerAlarmWrite(magnetL, 1000000, true);
- timerAlarmEnable(magnetL);
- }
- void IRAM_ATTR onMagnetR(){
- portENTER_CRITICAL_ISR(&timerMuxMagnetR);
- portEXIT_CRITICAL_ISR(&timerMuxMagnetR);
- //Code voor timer
- digitalWrite(pinMagnetR, LOW);
- timerStop(magnetR);
- }
- void initMagnetR(){
- pinMode(pinMagnetR, OUTPUT);
- timerMagnetR = xSemaphoreCreateBinary();
- magnetR = timerBegin(3, 80, true);
- timerAttachInterrupt(magnetR, &onMagnetR, true);
- timerAlarmWrite(magnetR, 1000000, true);
- timerAlarmEnable(magnetR);
- }
- /*void //setSpeed(ESC motor, int snelheid){
- //motor.//setSpeed(snelheid);
- }*/
- void autoPilot(){
- double hoekVerschil;
- double afstandVerschil;
- boolean richting; //zal "true" zijn bij CW, en "false" bij CCW
- int motorL;
- int motorR;
- int vaarSnelheid = 350; //Vaarsnelheid van de motor, waarde tussen 0 en 500
- int correctieSnelheid1; //Snelheid waaraan de boot boot zal draaien voor hoekverschil-compensatie
- int correctieSnelheid2; //Snelheid dat een motor meer/minder zal draaien voor rechte lijn
- hoekVerschil = gradenVerschil((int)hoekLocatie, (int)hoekBoot);
- hoekLocatie = hoek(beginPunt, eindPunt);
- while(autopilot){
- //Eerst moeten we de boot in de juiste hoek zetten zodat we +- in een rechte lijn kunnen varen
- while (hoekVerschil > 15){ //Als het hoekverschil groter is dan 15°, dan ...
- //Kompas aflezen ... Nog toe te voegen
- hoekVerschil = gradenVerschil((int)hoekLocatie, (int)hoekBoot);
- //Bepalen van snelheid waaraan er één motor moet draaien
- correctieSnelheid1 = map(hoekVerschil, 180, 0, 250, 100);
- //Snelheid van die ene motor bijwerken
- //setSpeed(richting ? MotorL : MotorR , correctieSnelheid1);
- delay(100);
- }
- // Nadat de boot +- in een rechte lijn staat, kan de boot beginnen varen.
- while (afstandVerschil > 5){ //Als de afstand tussen de boot en de aankomst groter is dan 5m, dan ...
- //GPS-Locatie bijwerken ... Nog toe te voegen
- //Kompas bijwerken ... Nog toe te voegen
- //Bijwerken van de afstandsverschillen en hoekverschillen
- afstandVerschil = afstand(beginPunt, eindPunt);
- hoekLocatie = hoek(beginPunt, eindPunt);
- hoekVerschil = gradenVerschil((int)hoekLocatie, (int)hoekBoot);
- //Berekenen van correctiesnelheid om in een zo recht mogelijke lijn te varen
- correctieSnelheid2 = map(hoekVerschil, 90, 0, 100, 0);
- //Snelheid van de motoren bijwerken
- //setSpeed(MotorL, richting ? (vaarSnelheid - correctieSnelheid2) : vaarSnelheid + correctieSnelheid2);
- //setSpeed(MotorR, richting ? (vaarSnelheid + correctieSnelheid2) : vaarSnelheid - correctieSnelheid2);
- delay(200);
- }
- }
- }
- /*
- Bron: https://www.movable-type.co.uk/scripts/latlong.html
- Op deze site wordt de formule van Haversine uitgelegd.
- Deze formule is omgezet naar Arduino-code in deze functie.
- */
- double afstand(double loc1[], double loc2[]){
- double straalAarde, radLengte1, radLengte2, deltaLengte, deltaBreedte, a, c, d; //Declareren variabelen
- straalAarde = 6371000; // Straal van aarde in meter
- radLengte1 = gradenNaarRad(loc1[0]); // Omzetten van graden naar radialen
- radLengte2 = gradenNaarRad(loc2[0]); // Omzetten van graden naar radialen
- deltaLengte = gradenNaarRad(loc2[0] - loc1[0]); // Verschil van lengtegraden omzetten naar radialen
- deltaBreedte = gradenNaarRad(loc2[1] - loc1[1]); // Verschil van breedtegraden omzetten naar radialen
- a = sin(deltaLengte/2)*sin(deltaLengte/2) +
- cos(radLengte1) * cos(radLengte2) *
- sin(deltaBreedte/2) * sin(deltaBreedte/2);
- c = 2 * atan2(sqrt(a), sqrt(1-a));
- d = straalAarde * c;
- return d;
- }
- /*
- * Formule: radialen = atan2(sin(deltaLengte).cos(lat2), cos(lat1).sin(lat2)− sin(lat1).cos(lat2).cos(deltaLengte))
- * Het probleem is wel dat bij de wiskunde de X-as als referentie wordt genomen, waarbij bij een kompas het noorden (Y-as)
- * als referentie wordt genomen. Hierdoor wordt de uitgekomen graden eerst nog geanalyseerd door de functie
- * analyseGraden().
- */
- double hoek(double loc1[], double loc2[]){
- double deltaLengte, y, x, graden;
- deltaLengte = gradenNaarRad(loc2[1] - loc1[1]);
- y = sin(deltaLengte) * cos(gradenNaarRad(loc2[0]));
- x = cos(gradenNaarRad(loc1[0])) * sin(gradenNaarRad(loc2[0])) -
- sin(gradenNaarRad(loc1[0])) * cos(gradenNaarRad(loc2[0])) * cos(deltaLengte);
- graden = radNaarGraden(atan2(x, y));
- return analyseGraden(graden);
- }
- /*
- * Functie dat de referentie verschuift van de X-as naar de Y-as.
- */
- double analyseGraden(double graden){
- if (graden > -90 && graden < 90){
- graden = map(graden, -90, 90, 180, 0);
- }
- else if (graden <= -90){
- graden = map(graden, -180, -90, 270, 180);
- }
- else if (graden >= 90){
- graden = map(graden, 180, 90, 270, 360);
- }
- if (graden == 360){
- graden = 0;
- }
- return graden;
- }
- /*
- * Functie om de kleinste hoek tussen 2 graden in een cirkel te bepalen.
- */
- double gradenVerschil(int g1, int g2){
- double verschil = abs(g2 - g1) % 360;
- return verschil > 180 ? 360 - verschil : verschil;
- }
- /*
- * Functie om te bepalen wat de meest efficiënte richting is, met de klok mee (clockWise)
- * of tegen de klok in (counterClockWise). De functie zal "true" zijn als het clockWise is.
- */
- boolean clockWise(int g1, int g2){
- return (g2 - g1 + 360) % 360 > 180;
- }
- //Functie om graden om te zetten naar radialen
- double gradenNaarRad(double graden){
- return(graden * PI /180);
- }
- //Functie om radialen om te zetten naar graden
- double radNaarGraden(double radialen){
- return(radialen * 180.0 / PI);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement