ciao a tutti, sto lavorando ad un progetto in fase di sviluppo e devo in sostanza controllare la marcia di due motori che devono proseguire normalmente, in base alla distanza che rilevo con il sensore ad ultrasuoni. il mio problema era che alcune misure del sensore venivano sballate e la lettura di ogni singolo dato era rischiosa per il feedback alla marcia dei motori (es. 120 cm, 120 cm, 0 cm, 121 cm). per risolvere il problema ho deciso di far fare una media di 5 valori escludendo le variabili lette minime e massime ad ogni gruppo di letture essendo sicuro di eliminare sia "0 cm" che "fuori scala". adesso gli errori di arduino però mi danno questi messaggi:
[
sketch_mar18a.ino:57:59: error: macro "min" passed 5 arguments, but takes just 2
sketch_mar18a.ino:58:59: error: macro "max" passed 5 arguments, but takes just 2
sketch_mar18a.ino: In function 'void loop()':
sketch_mar18a.ino:57:12: error: 'min' was not declared in this scope
sketch_mar18a.ino:58:12: error: 'max' was not declared in this scope
Errore durante la compilazione
]
quindi da quello che ho capito su i 5 argomenti del mio array ne ha presi solo 2? perchè 2 e non nessuno?
e l'errore dopo non lo capisco proprio: non va dichiarata la funzione min né quella max!!!
come faccio a far analizzare tutte le variabili?
Il codice è quello allegato sotto. è anche presente la libreria per la shield dei motori quindi se non avete installata quella vi verranno fuori degli errori per forza sulla parte dei motori
#include <NewPing.h>
#define trigger 2 // Arduino pin tied to trigger pin on the ultrasonic sensor.
#define echo 3 // Arduino pin tied to echo pin on the ultrasonic sensor.
#define max_distance 400 // Maximum distance we want to ping for (in centimeters). Maximum sensor distance is rated at 400-500cm.
#include <Wire.h>
#include <Adafruit_MotorShield.h>
#include "utility/Adafruit_MS_PWMServoDriver.h"
int dist[5];
int mini;
int maxi;
int distanza;
// Create the motor shield object with the default I2C address
Adafruit_MotorShield AFMS = Adafruit_MotorShield();
// Or, create it with a different I2C address (say for stacking)
// Adafruit_MotorShield AFMS = Adafruit_MotorShield(0x61);
// Select which 'port' M1, M2, M3 or M4. In this case, M1
Adafruit_DCMotor *M1= AFMS.getMotor(3);
// You can also make another motor on port M2
Adafruit_DCMotor *M2 = AFMS.getMotor(4);
NewPing sonar(trigger, echo, max_distance);
int SetDistance = 0;
int ValueDist = 0;
void setup() {
Serial.begin(9600); // set up Serial library at 9600 bps
Serial.println("Adafruit Motorshield v2 - DC Motor test!");
AFMS.begin(); // create with the default frequency 1.6KHz
//AFMS.begin(1000); // OR with a different frequency, say 1KHz
Serial.print( "Sensore Ultrasuoni: ");
}
void loop() {
for(int i=0;i<5;i++){
delay(50);
unsigned int uS = sonar.ping(); // Send ping, get ping time in microseconds (uS).
ValueDist = uS / US_ROUNDTRIP_CM;
dist[i] = ValueDist;
}
mini= min(dist[0], dist[1], dist[2], dist[3], dist[4]);
maxi= max(dist[0], dist[1], dist[2], dist[3], dist[4]);
distanza =((dist[0]+ dist[1]+ dist[2] +dist[3]+ dist[4] - mini - maxi)/3);
if(distanza <= 100){
M1->run(FORWARD);
M2->run(FORWARD);
M1->setSpeed(255);
M2->setSpeed(255);}
else{
M1->setSpeed(0);
M2->setSpeed(0);}
delay(100);
}
grazie a tutti