Buongiorno,
grazie per il vostro forum.
Ho problemi programmare un'automobile Lego con due sensori.
I due sensori sono un rilevatore d'ostacoli e un microfono.
La macchina dovrebbe avanzare e poi fermarsi quando incontra un'ostacolo. A quel punto si ferma fa marcia indietro ed aspetta l'indicazione del microfono. Un colpo gira a destra, due colpi gira a sinistra e poi la macchina prosegue in avanti.
Ho creato il codice che fa tutte le funzioni singolarmente ma non riesco a fare tutte le operazioni in serie. Allego il codice e chiedo se cortesemente qualcuno può aiutarmi.
// Definizione dei pin
const int motorIn3 = 10; // Pin IN3 del ponte H per il motore
const int motorIn4 = 11; // Pin IN4 del ponte H per il motore
const int soundPin = A2; // Pin microfono
const int distanceSensor = A0; // Pin sensore di distanza
const int in1 = 8; // Pin IN1 del ponte H per il servo
const int in2 = 9; // Pin IN2 del ponte H per il servo
// Soglie e variabili
const int threshold = 200; // Soglia per rilevamento battiti
const int obstacleThreshold = 200; // Soglia per rilevare l'ostacolo
int battiti = 0;
unsigned long ultimoBattito = 0;
unsigned long battitoDelay = 2000; // Intervallo per rilevare battiti multipli
bool ostacoloTrovato = false;
void setup() {
Serial.begin(9600);
pinMode(motorIn3, OUTPUT);
pinMode(motorIn4, OUTPUT);
pinMode(soundPin, INPUT);
pinMode(in1, OUTPUT);
pinMode(in2, OUTPUT);
pinMode(distanceSensor, INPUT);
// Avvio iniziale del movimento
moveForward();
}
// Funzioni per il controllo dei motori
void moveForward() {
digitalWrite(motorIn3, HIGH);
digitalWrite(motorIn4, LOW);
Serial.println("Avanti");
}
void moveBackward() {
digitalWrite(motorIn3, LOW);
digitalWrite(motorIn4, HIGH);
Serial.println("Indietro");
}
void stopMotors() {
digitalWrite(motorIn3, LOW);
digitalWrite(motorIn4, LOW);
Serial.println("Motori fermi");
}
// Funzioni per il controllo del servo
void rotateRight() {
digitalWrite(in1, HIGH);
digitalWrite(in2, LOW);
Serial.println("Servo ruota a destra");
delay(3000); // Mantiene la rotazione per 3 secondi
stopServo();
}
void rotateLeft() {
digitalWrite(in1, LOW);
digitalWrite(in2, HIGH);
Serial.println("Servo ruota a sinistra");
delay(3000); // Mantiene la rotazione per 3 secondi
stopServo();
}
void stopServo() {
digitalWrite(in1, LOW);
digitalWrite(in2, LOW);
Serial.println("Servo fermo");
}
// Funzione per rilevare i battiti di mani
void detectClaps() {
int soundsens = analogRead(soundPin);
if (soundsens >= threshold) {
unsigned long tempoCorrente = millis();
// Se è passato abbastanza tempo dall'ultimo battito
if (tempoCorrente - ultimoBattito > battitoDelay) {
battiti = 1;
ultimoBattito = tempoCorrente;
Serial.println("Primo battito rilevato");
delay(500); // Attesa breve per il secondo battito
soundsens = analogRead(soundPin);
if (soundsens >= threshold) {
battiti = 2;
Serial.println("Secondo battito rilevato");
}
}
}
}
void loop() {
detectClaps(); // Rileva i battiti
int distance = analogRead(distanceSensor); // Lettura del sensore di distanza
if (distance < obstacleThreshold) { // Ostacolo rilevato
stopMotors();
delay(5000); // Fermati per 5 secondi
moveBackward(); // Va in retromarcia per 3 secondi
delay(3000);
stopMotors();
ostacoloTrovato = true; // Indica che l'ostacolo è stato rilevato
}
if (ostacoloTrovato) {
if (battiti == 1) { // Un battito: svolta a destra
rotateRight();
moveForward(); // Continua a muoversi in avanti
ostacoloTrovato = false; // Reset del flag ostacolo
} else if (battiti == 2) { // Due battiti: svolta a sinistra
rotateLeft();
moveForward(); // Continua a muoversi in avanti
ostacoloTrovato = false; // Reset del flag ostacolo
} else {
stopMotors(); // Se nessun battito, rimane fermo
}
} else {
if (battiti == 1) { // Un battito: svolta a destra
rotateRight();
} else if (battiti == 2) { // Due battiti: svolta a sinistra
rotateLeft();
} else {
moveForward(); // Continua ad andare avanti
}
}
battiti = 0; // Reset del conteggio battiti
delay(100); // Ritardo per stabilizzare le letture
}
Buongiorno e benvenuto nella sezione Italiana del forum,
cortesemente, come prima cosa, leggi attentamente il REGOLAMENTO di detta sezione, (... e, per evitare future possibili discussioni/incomprensioni, prestando molta attenzione al punto 15), dopo di che, come da suddetto regolamento (punto 16.7), fai la tua presentazione NELL'APPOSITA DISCUSSIONE (... quello che vedi in blu è un link, fai click su di esso per raggiungere la discussione) spiegando bene quali esperienze hai in elettronica e programmazione, affinché noi possiamo conoscere la tua esperienza ed esprimerci con termini adeguati.
Grazie,
Guglielmo
P.S.: Ti ricordo che, purtroppo, fino a quando non sarà fatta la presentazione nell’apposita discussione, nel rispetto del succitato regolamento nessuno ti risponderà (eventuali risposte o tuoi ulteriori post, verrebbero temporaneamente nascosti), quindi ti consiglio di farla al più presto.