Auto modello pilota automatico gps

Salve vorrei costruire un auto rc pilotata interamente da arduino e un gps. Chi mi può aiutare? Grazie

Guarda un po' cosa ho trovato con una ricerca su San Google: LMGTFY - Let Me Google That For You

ho provato a cercare ma nn trovo niente

Hai guardato il mio link?

danyevo:
arduino e un gps.

Arduino e gps sono due parole che no vanno molto d'accordo tra loro, il massimo che puoi fare è leggere le sentenze NMEA per inviarle ad un pc oppure memorizzarle sotto forma di log su una SD, scordati di fare navigazione tramite gps con Arduino.

@Astro, sei sicuro? Mini GPS Autonomous Car for Under $100 | The Tech Junkies :stuck_out_tongue: :stuck_out_tongue: :stuck_out_tongue:

cece99:
@Astro, sei sicuro?

Certo che sono sicuro, se ti leggi altri topic simili scopri pure il motivo.

Quello del video funziona...

cece99:
Quello del video funziona...

Si col compagno di merende, non inquadrato, che la comanda con un radiocomando.
Una volta per tutte, Arduino non dispone di sufficiente potenza di calcolo per determinare il vettore tra due coordinate gps, non è una opinione è un dato di fatto.

Ok ma in vendita cè arduino autopilot ad un prezzo non tanto accessibile, utilizza arduino un gps ed altri sensori perche arduino non cè la dovrebbe fare?
Grazie..

astrobeed:

cece99:
Quello del video funziona...

Si col compagno di merende, non inquadrato, che la comanda con un radiocomando.
Una volta per tutte, Arduino non dispone di sufficiente potenza di calcolo per determinare il vettore tra due coordinate gps, non è una opinione è un dato di fatto.

Compagno di merende si o no mi sono appena comprato un modulo GPS, vediamo che ha ragione...

Ciao ho appena provato a caricare il programma su arduino ma mi da un errore sulla libreria (#include <nmea.h>)

In file included from sketch_jun10a.ino:1:
C:\Users\vale\Documents\Arduino\libraries\NMEA/nmea.h:24:24: error:
WConstants.h: No such file or directory

La libreria l' ho scaricata da qui:

http://www.maartenlamers.com/nmea/

il codice sorgente è questo:

/* GPS Car v0.1 by Eric Barch (ttjcrew.com) */

#include <nmea.h>
#include <Servo.h>
#undef abs
#undef round
int wpt = 0;
float dest_latitude;
float dest_longitude;
NMEA gps(GPRMC);  // GPS data connection to GPRMC sentence type



/* BEGIN EDITABLE CONSTANTS SECTION */

//These define the positions for your steering servo
#define CENTER_SERVO 95
#define MAX_LEFT_SERVO 85
#define MAX_RIGHT_SERVO 108

//When the car is within this range (meters), move to the next waypoint
#define WPT_IN_RANGE_M 12

//These pins are your h-bridge output. If the car is running in reverse, swap these
#define MOTOR_OUTPUT_ONE 3
#define MOTOR_OUTPUT_TWO 4

/* DEFINE GPS WPTS HERE - Create more cases as needed */
void trackWpts() {
  switch(wpt) {
    case 0:
      dest_latitude = 40.756054;
      dest_longitude = -73.986951;
      break;
    case 1:
      dest_latitude = 37.775206;
      dest_longitude = -122.419209;
      break;
    default:
      dest_latitude = 0;
      dest_longitude = 0;
      break;
  }
  if (gps.gprmc_distance_to(dest_latitude,dest_longitude,MTR) < WPT_IN_RANGE_M)
    wpt++;
}



/* END EDITABLE CONSTANTS SECTION */




Servo steering;
float dir;          // relative direction to destination
int servo_pos = CENTER_SERVO;

void setup() {
  Serial.begin(4800);
  pinMode(MOTOR_OUTPUT_ONE, OUTPUT);
  pinMode(MOTOR_OUTPUT_TWO, OUTPUT);
  steering.attach(9);
}

void loop() {
  trackWpts();
  trackGPS();
}

void trackGPS() {
  if (dest_latitude != 0 && dest_longitude != 0)
  {
    if (Serial.available() > 0 ) {
      char c = Serial.read();

      if (gps.decode(c)) {
          
        // check if GPS positioning was active
        if (gps.gprmc_status() == 'A') {
          // calculate relative direction to destination
          dir = gps.gprmc_course_to(dest_latitude, dest_longitude) - gps.gprmc_course();
          
          if (dir < 0)
            dir += 360;
          if (dir > 180)
            dir -= 360;
            
          if (dir < -75)
            hardLeft();
          else if (dir > 75)
            hardRight();
          else
            driveToTarget();
          
        }
        else //No GPS Fix...Wait for signal
          stop();
            
        }
      }
  }
  else
    stop();
}

void driveStraight() {
  steering.write(CENTER_SERVO);
  digitalWrite(MOTOR_OUTPUT_ONE, LOW);
  digitalWrite(MOTOR_OUTPUT_TWO, HIGH);
  Serial.println("Driving straight...");
}

void driveToTarget() {
  servo_pos = map(dir, -75, 75, MAX_LEFT_SERVO, MAX_RIGHT_SERVO);
  steering.write(servo_pos);
  digitalWrite(MOTOR_OUTPUT_ONE, LOW);
  digitalWrite(MOTOR_OUTPUT_TWO, HIGH);
  Serial.print("Driving at ");
  Serial.print(dir);
  Serial.print(". - ");
  Serial.print(gps.gprmc_distance_to(dest_latitude,dest_longitude,MTR));
  Serial.print("m to go");
  Serial.print("\n");
}

void hardLeft() {
  steering.write(MAX_LEFT_SERVO);
  digitalWrite(MOTOR_OUTPUT_ONE, LOW);
  digitalWrite(MOTOR_OUTPUT_TWO, HIGH);
  Serial.print("Driving hard left. - ");
  Serial.print(gps.gprmc_distance_to(dest_latitude,dest_longitude,MTR));
  Serial.print("m to go");
  Serial.print("\n");
}

void hardRight() {
  steering.write(MAX_RIGHT_SERVO);
  digitalWrite(MOTOR_OUTPUT_ONE, LOW);
  digitalWrite(MOTOR_OUTPUT_TWO, HIGH);
  Serial.print("Driving hard right. - ");
  Serial.print(gps.gprmc_distance_to(dest_latitude,dest_longitude,MTR));
  Serial.print("m to go");
  Serial.print("\n");
}

void stop() {
  steering.write(CENTER_SERVO);
  digitalWrite(MOTOR_OUTPUT_ONE, HIGH);
  digitalWrite(MOTOR_OUTPUT_TWO, HIGH);
  Serial.print("Stopped.");
  Serial.print("\n");
}

edit by mod: per favore includi il codice usando gli appositi tag

Non sò se questo progetto può interessare a qualcuno ma ve ne sarei grato se mi aiutare a portarlo a termine.. :slight_smile:
Poi sarebbe una cosa divertente da costruire..
Grazie

Io riesco a compilare...

Due cose ..

... uno, RACCHIUDI QUEL BENEDETTO CODICE DENTRO GLI APPOSITI TAG "code" (usa il bottoncino #)

... due, l'errore che ti da deriva dal fatto che la WConstants.h NON è più utilizzata dal IDE 1.x quindi ... si tratta probabilmente di una libreria non aggiornata per il nuovo IDE. Un possibile soluzione è quella di sostituire la riga con l'include del WConstants.h con l'include di Arduino.h ... sperando che non ci siano altre incompatibilità ...

Guglielmo

Scusami non ho capito cosa devo fare è da poco che conosco arduino, mi puoi spiegare un pò piu con parole povere. Grazie ancora

Ciao cece99,
Come hai fatto a compilarlo? che versione di programma usi?

danyevo:
Scusami non ho capito cosa devo fare è da poco che conosco arduino, mi puoi spiegare un pò piu con parole povere. Grazie ancora

In nmea.h, all'inizio, probabilmente hai un' qualche cosa tipo :

#include "WConstants.h"

sostituiscilo con

#include "Arduino.h"

Relativamente invece al tuo codice ... modifica il tuo precedente messaggio dove hai messo tutto il sorgente, seleziona SOLO la parte del sorgente e fai click sul bottone che trovi con il simbolo # ... vedrai che ad inizio e fine del tuo sorgente avrà aggiunto dei tag di tipo "code" e "/code" racchiusi tra parentesi quadre ... salva il messaggio così modificato :wink:

Guglielmo

P.S. : Tu hai letto vero che è chiaramente indicato : "The first basic version of the library. Only tested with Wiring i/o board, not with Arduino. The example code may not function correctly on Arduino." ... ricorda le parole di Astro ...

astrobeed:
...
Una volta per tutte, Arduino non dispone di sufficiente potenza di calcolo per determinare il vettore tra due coordinate gps, non è una opinione è un dato di fatto.

danyevo:
Ok ma in vendita cè arduino autopilot ad un prezzo non tanto accessibile, utilizza arduino un gps ed altri sensori perche arduino non cè la dovrebbe fare?

Ardupilot invia i dati del gps alla stazione a terra, un notebook, dove vengono utilizzati per visualizzare la posizione del drone su una mappa.

cece99:
mi sono appena comprato un modulo GPS, vediamo che ha ragione...

Ovviamente io visto che Arduino non può fare calcoli trigonometrici con matematica a 64 bit, i double, per i limiti imposti dalla reale precisione dei float a 32 bit è impossibile calcolare un vettore tra due coordinate gps tra loro vicine come serve in questo caso, può funzionare per coordinate tra loro distanti almeno qualche decina di kilometri.