Ciao a tutti,
sono nuovo nel mondo Arduino. Ho acquistato uno starter kit 2 settimane fa e poi ho deciso di cominciare a creare un piccolo rover sfruttando un vecchio modellino di auto radiocomandata smontato. Adesso il rover, una volta avviato, accelera a una velocità "x" (che è decisa da un potenzimetro) e, se incontra un ostacolo durante il percorso, grazie al sensore a infrarossi che ho installato nella parte anteriore (sharp 2Y0A21), arresta la marcia, gira le ruote anteriori, inverte la marcia per 1,5 secondi e poi riprendere a muoversi in avanti.
Il problema è che, durante la retromarcia, se ci fosse stato un ostacolo, non lo avrebbe rilevato in quanto il sensore è installato solo anteriormente. Quindi ho deciso di posizionare il sensore su di un servomotore. Adesso, quando legge un ostacolo anteriore, arresta la marcia, gira le ruote anteriori, il servomotore gira di 180° facendo in modo che il sensore legga posteriormente, e avvia la marcia all'indietro. Poi, in teoria, se ci fosse un ostacolo, dovrebbe fermarsi... ma non lo fa!
Il problema, naturalmente, era legato all'utilizzo di "delay" che non dava modo al sensore di dire ad Arduino che ci fossero ostacoli durante la marcia.
Ho provato con millis, per cercare di avere diverse letture e far decidere ad arduino se la distanza va bene oppure no. dopo svariate prove, in cui o leggeva continuamente qualcosa in retromarcia, o eseguiva tutte le righe del codice senza badare al sensore o ignorava totalmente la manovra, ho perso le speranze.
Se riuscite a darmi una mano, magari dirmi dove sbaglio, ve ne sarei grato
Vi posto lo sketch prima e dopo la modifica con servomotore:
#include <Servo.h>
Servo myservo;
//
const int switchPin = 11; //pin pulsante avvio
const int motorPin = 8; // pin motore giro
int switchState = 0; //stato su "spento" del pulsante
const int potenziometro = A0;
//
const int controlPin1 = 3; //pin avanti
const int controlPin2 = 5; //pin indietro
int motorDirection= 1; //direzione di default 1 (avanti)
int motorEnabled = 0; //motore spento di default
//
int irpin = A1;
const int ledsensore = 6;
//
int pos = 0;
int pos1 = 180;
//
int acc1 = 13;
int transistor = 10;
int acc = 4;
int transistor2 = 2;
int stato = 0;
int stato2 = 0;
//
void setup(){
pinMode(controlPin1, OUTPUT);
pinMode(controlPin2, OUTPUT);
//
pinMode(switchPin, INPUT);
pinMode(motorPin, OUTPUT);
pinMode(switchPin, INPUT);
//
pinMode(ledsensore, OUTPUT);
pinMode(irpin, INPUT);
myservo.attach(12);
myservo.write(pos);
//
pinMode(acc1, INPUT);
pinMode(transistor, OUTPUT);
//
pinMode(acc, INPUT);
pinMode(transistor2, OUTPUT);
}
void loop(){
byte velocita = map(analogRead(potenziometro),0,1023,0,255); //rileva velocità da potenziometro per motore 1
switchState = digitalRead(switchPin);
float volts = analogRead(irpin)*0.0048828125;
float distanza = 65*pow(volts, -1.10);
stato = digitalRead(acc1);
if(switchState == HIGH){
digitalWrite(transistor, HIGH);
if(stato == HIGH){
analogWrite(controlPin1, velocita);
}
}
stato2 = digitalRead(acc); //transistor 2
if(stato == HIGH){
if(distanza < 50){
digitalWrite(transistor2, HIGH);
if(stato2 == HIGH);
digitalWrite(ledsensore, HIGH);
digitalWrite(controlPin1, LOW);
myservo.write(pos1);
digitalWrite(motorPin, HIGH);
delay(1000);
digitalWrite(controlPin2, HIGH);
delay(2500);
if(stato == HIGH){
if(stato2 == HIGH){
if(distanza < 60){ //distanza in retromarcia
digitalWrite(controlPin2, LOW);
digitalWrite(motorPin, LOW);
analogWrite(controlPin1, velocita);
delay(1000);
digitalWrite(controlPin1, LOW);
digitalWrite(motorPin, HIGH);
digitalWrite(controlPin2, HIGH);
delay(1500);
digitalWrite(motorPin, LOW);
digitalWrite(controlPin2, LOW);
myservo.write(pos);
delay(1500);
analogWrite(controlPin1, velocita);
digitalWrite(ledsensore, LOW);
digitalWrite(transistor2, LOW); // disattiva il transistor per il sensore in retromarcia
}
}
else{
delay(1500);
digitalWrite(motorPin, LOW);
digitalWrite(controlPin2, LOW);
myservo.write(pos);
delay(1500);
analogWrite(controlPin1, velocita);
digitalWrite(ledsensore, LOW);
}
}
}
}
}
e quello dopo la modifica e svariati tentativi:
#include <Servo.h>
Servo myservo;
//
const int switchPin = 11; //pin pulsante avvio
const int motorPin = 8; // pin motore giro
int switchState = 0; //stato su "spento" del pulsante
const int potenziometro = A0;
//
const int controlPin1 = 3; //pin avanti ponte H
const int controlPin2 = 5; //pin indietro ponte H
int motorDirection= 1; //direzione di default 1 (avanti)
int motorEnabled = 0; //motore spento di default
//
int irpin = A1;
const int ledsensore = 6; //led lettura valore assegnato di distanza massima
//
int pos = 0;
int pos1 = 180;
//
int acc1 = 13; //stato transistor
int transistor = 10; //attivazione transistor
int acc = 4; //stato transistor 2
int transistor2 = 2; //attivazione transistor2
int stato = 0; //stato iniziale transistor
int stato2 = 0; // stato iniziale transistor2
//
long tempo = 0;
long intervallo = 1500;
void setup(){
pinMode(controlPin1, OUTPUT);
pinMode(controlPin2, OUTPUT);
//
pinMode(switchPin, INPUT);
pinMode(motorPin, OUTPUT);
pinMode(switchPin, INPUT);
//
pinMode(ledsensore, OUTPUT);
pinMode(irpin, INPUT);
myservo.attach(12);
myservo.write(pos);
//
pinMode(acc1, INPUT);
pinMode(transistor, OUTPUT);
//
pinMode(acc, INPUT);
pinMode(transistor2, OUTPUT);
Serial.begin(9600);
//time = millis();
//letturasensore_time=millis();
}
void loop(){
//time = millis();
byte velocita = map(analogRead(potenziometro),0,1023,0,255); //rileva velocità da potenziometro per motore 1
switchState = digitalRead(switchPin);
float volts = analogRead(irpin)*0.0048828125;
float distanza = 65*pow(volts, -1.10);
stato = digitalRead(acc1);
if(switchState == HIGH){
digitalWrite(transistor, HIGH);
if(stato == HIGH){
analogWrite(controlPin1, velocita);
}
}
stato2 = digitalRead(acc); //transistor 2
if(stato == HIGH){
if(distanza < 50){
Serial.println("1:");
Serial.println(distanza);
digitalWrite(transistor2, HIGH); //attiva il transistor per il sensore in retromarcia
if(stato2 == HIGH){ // se il transistor è arrivo, prosegue
digitalWrite(ledsensore, HIGH);
digitalWrite(controlPin1, LOW);
myservo.write(pos1);
digitalWrite(motorPin, HIGH);
delay(1000);
digitalWrite(controlPin2, HIGH);
unsigned long tempo2 = millis();
if(tempo2 - tempo < intervallo){
if(stato == HIGH){
if(stato2 == HIGH){
if(distanza < 60){ //distanza in retromarcia
tempo = tempo2;
Serial.println("2");
Serial.println(distanza); /
digitalWrite(controlPin2, LOW);
digitalWrite(motorPin, LOW);
analogWrite(controlPin1, velocita);
delay(1000);
digitalWrite(controlPin1, LOW);
digitalWrite(motorPin, HIGH);
digitalWrite(controlPin2, HIGH);
delay(1500);
digitalWrite(motorPin, LOW);
digitalWrite(controlPin2, LOW);
myservo.write(pos);
delay(1500);
analogWrite(controlPin1, velocita);
digitalWrite(ledsensore, LOW);
digitalWrite(motorPin, LOW);
digitalWrite(controlPin2, LOW);
myservo.write(pos);
delay(1500);
analogWrite(controlPin1, velocita);
digitalWrite(ledsensore, LOW);
}
}
}
}
}
}
}
}