Macchina rc+ultrasuoni [consulenza sui sensori da usare]

Edit: volevo aggiungere dei sonseri per "vedere" se a lato dell' auto ci sono ostacoli, e specialmente dietro :).
I sensori ad ultrasuoni mi sembrano eccessivi quindi pensavo di costruire 3 di questi "aggeggi" (Gioblu.com is for sale | HugeDomains) gli ho provati con un arduino mega e funzionano bene. ma vorrei capire se riesco a far gestire ultrasuoni+3 sensori ir ad un atmega328 o se devo aggiungere un altro atmega (magari un atmega8 che costa 1 dollaro).


Salve a tutti, sto creando una macchinetta che evita gli ostacoli con un sensore ad ultrasuini hc-sr04.
Il problema è che quando la macchina di avvicina a un ostacolo non inverte la marcia. Qualcuno sa illuminarmi???
Sketch:

int motor1Pin1 = 3;    // pin 2 on L293D
int motor1Pin2 = 2;    // pin 7 on L293D
int enablePin = 11;    // pin 1 on L293D

#define ECHOPIN 12        // Pin to receive echo pulse
#define TRIGPIN 13        // Pin to send trigger pulse

/*
 * setup function
 * Initialize the serial line (D0 & D1) at 115200.
 * Then set the pin defined to receive echo in INPUT 
 * and the pin to trigger to OUTPUT.
 */


void setup()
{
    digitalWrite(enablePin, HIGH);
  
  pinMode(ECHOPIN, INPUT);
  pinMode(TRIGPIN, OUTPUT);
     pinMode(motor1Pin1, OUTPUT);
  pinMode(motor1Pin2, OUTPUT);
  pinMode(enablePin, OUTPUT);
}

/*
 * loop function.
 * 
 */
void loop()
{
  // Start Ranging
  digitalWrite(TRIGPIN, LOW);
  delayMicroseconds(2);
  digitalWrite(TRIGPIN, HIGH);
  delayMicroseconds(10);
  digitalWrite(TRIGPIN, LOW);
  // Compute distance
  float distance = pulseIn(ECHOPIN, HIGH);
  distance= distance/58;
if (distance<10) {
    digitalWrite(motor1Pin1, HIGH);  //indietro
    digitalWrite(motor1Pin2, LOW); 


}
else {
     digitalWrite(motor1Pin1, LOW);   // avanti
    digitalWrite(motor1Pin2, HIGH);  
} 
  delay(200);
}

prova a mettere al posto del float per la distanza un unsigned int

ma il sensore l'hai provato separatamente con l'ausilio del serial monitor?

cece99:
Qualcuno sa illuminarmi???

"Fiat Lux" :grin:

?R:
prova a mettere al posto del float per la distanza un unsigned int

ma il sensore l'hai provato separatamente con l'ausilio del serial monitor?

Ma sai cosa è successo? Dopo uno scontro il sensore si è affossato e non rilevava più bene :slight_smile:

cece99:

?R:
prova a mettere al posto del float per la distanza un unsigned int

ma il sensore l'hai provato separatamente con l'ausilio del serial monitor?

Ma sai cosa è successo? Dopo uno scontro il sensore si è affossato e non rilevava più bene :slight_smile:

ma non doveva evitarli gli ostacoli? :stuck_out_tongue:
va beh... comunque non penso ti serva la precisione di un float, che sono 4 byte, ti consiglio di usare un unsigned int che comunque hai la tolleranza di un cm e occupa solo 2 byte

?R:

cece99:

?R:
prova a mettere al posto del float per la distanza un unsigned int

ma il sensore l'hai provato separatamente con l'ausilio del serial monitor?

Ma sai cosa è successo? Dopo uno scontro il sensore si è affossato e non rilevava più bene :slight_smile:

ma non doveva evitarli gli ostacoli? :stuck_out_tongue:
va beh... comunque non penso ti serva la precisione di un float, che sono 4 byte, ti consiglio di usare un unsigned int che comunque hai la tolleranza di un cm e occupa solo 2 byte

Mi manca una sola cosa: con questo code la macchina dovrebbe (in caso di ostacolo) tornare indietro, andare avanti sterzando e dopo continuare ad andare avanti. Ma mi sterza a priori (il resto funziona bene).
Questo è lo sketch:

int motor1Pin1 = 3;    // pin 2 on L293D
int motor1Pin2 = 2;    // pin 7 on L293D
int enablePin = 11;    // pin 1 on L293D

#define ECHOPIN 12        // Pin to receive echo pulse
#define TRIGPIN 13        // Pin to send trigger pulse

/*
 * setup function
 * Initialize the serial line (D0 & D1) at 115200.
 * Then set the pin defined to receive echo in INPUT 
 * and the pin to trigger to OUTPUT.
 */


void setup()
{
    digitalWrite(enablePin, HIGH);
  
  pinMode(ECHOPIN, INPUT);
  pinMode(TRIGPIN, OUTPUT);
     pinMode(motor1Pin1, OUTPUT);
  pinMode(motor1Pin2, OUTPUT);
  pinMode(enablePin, OUTPUT);
}

/*
 * loop function.
 * 
 */
void loop()
{
  // Start Ranging
  digitalWrite(TRIGPIN, LOW);
  delayMicroseconds(2);
  digitalWrite(TRIGPIN, HIGH);
  delayMicroseconds(10);
  digitalWrite(TRIGPIN, LOW);
  // Compute distance
  float distance = pulseIn(ECHOPIN, HIGH);
  distance= distance/58;
if (distance<15) {
    digitalWrite(motor1Pin1, HIGH);  //indietro
    digitalWrite(motor1Pin2, LOW); 
    delay(1000);
    digitalWrite(motor1Pin1, LOW);   // avanti
    digitalWrite(motor1Pin2, HIGH); 
    digitalWrite(10,HIGH); //enable sterzo
    digitalWrite(4,HIGH);//sterzo
    digitalWrite(9,LOW);
    delay(1000);
    digitalWrite(10,LOW); //disable sterzo
    

}
else {
     digitalWrite(motor1Pin1, LOW);   // avanti
    digitalWrite(motor1Pin2, HIGH);  
} 
  delay(200);
}

[code]

[/code]

non vedo dichiarati i pinMode dei pin 10, 4 e 9... prova a dichiararli... i pin non dichiarati sono per default degli input e dal codice sembra che tu voglia usarli come output, no?

?R:
non vedo dichiarati i pinMode dei pin 10, 4 e 9... prova a dichiararli... i pin non dichiarati sono per default degli input e dal codice sembra che tu voglia usarli come output, no?

Bravo era quello il problema :).
Ho aggiunto un altro quesito nel primo post: qualcuno mi saprebbe aiutare?

cece99:
Edit: volevo aggiungere dei sonseri per "vedere" se a lato dell' auto ci sono ostacoli, e specialmente dietro :).
I sensori ad ultrasuoni mi sembrano eccessivi quindi pensavo di costruire 3 di questi "aggeggi" (Gioblu.com is for sale | HugeDomains) gli ho provati con un arduino mega e funzionano bene. ma vorrei capire se riesco a far gestire ultrasuoni+3 sensori ir ad un atmega328 o se devo aggiungere un altro atmega (magari un atmega8 che costa 1 dollaro).

la tua domanda è solo se puoi farcela a gestire tutto con un atmega328? io penso di si, non vedo problemi, ne controlli uno alla volta magari dando la priorità a quello che ritieni più importante :wink:

?R:

cece99:
Edit: volevo aggiungere dei sonseri per "vedere" se a lato dell' auto ci sono ostacoli, e specialmente dietro :).
I sensori ad ultrasuoni mi sembrano eccessivi quindi pensavo di costruire 3 di questi "aggeggi" (http://www.gioblu.com/tutorials/sensori/176-sensore-ir-led-arduino-processing) gli ho provati con un arduino mega e funzionano bene. ma vorrei capire se riesco a far gestire ultrasuoni+3 sensori ir ad un atmega328 o se devo aggiungere un altro atmega (magari un atmega8 che costa 1 dollaro).

la tua domanda è solo se puoi farcela a gestire tutto con un atmega328? io penso di si, non vedo problemi, ne controlli uno alla volta magari dando la priorità a quello che ritieni più importante :wink:

Ok, ma non capisco bene come unire i due codici perchè quello degli infrarossi è pieno di void per ogni cosa e non so come si usano.
Mi sapresti aiutare?

metti i 2 codici, vediamo cosa si può fare

?R:
metti i 2 codici, vediamo cosa si può fare

Ok, comunque se vieni su face ti spiego meglio.
A me basterebbe che il sensore dietro mi funzioni durante la retromarcia e se trova un ostacolo mi fa girare subito la macchina :).
Questi sono i due sketch:

#define irEmitter 12            // polo positivo emettitore
#define irReceiverN 11          // polo negativo ricevitore
#define irReceiverP 10          // polo positivo ricevitore
long distance = 0;
int interval = 0;

void setup() {
  Serial.begin(9600);              // inizializza seriale a 9600 baud
  pinMode(irEmitter, OUTPUT);      // il led emettitore è un output
  pinMode(irReceiverP, OUTPUT);    // il polo positivo del let ricevitore è un output
  digitalWrite(irReceiverP, LOW);  // e deve essere LOW
}


void focus(int focusPoint) {
 interval = focusPoint;  
 distance = readLight(true) - readLight(false);
 if(distance < 0) distance = 0;
 // processing
 Serial.println(distance);
}

double readLight(boolean lightOn) {       
 digitalWrite(irEmitter, lightOn ? HIGH : LOW);
 pinMode(irReceiverN, OUTPUT);
 digitalWrite(irReceiverN, HIGH); //carico ricevitore di induttanza
 long reading = 0;
 pinMode(irReceiverN, INPUT);
 digitalWrite(irReceiverN, LOW);
 long lightTime = millis(); 
 while((millis() - lightTime) < interval)
  if(digitalRead(irReceiverN) == 0)
   reading++;
 
 return reading;
}
  
void loop() {
focus(115);
}
[code]

[code]
int motor1Pin1 = 3;    // pin 2 on L293D
int motor1Pin2 = 2;    // pin 7 on L293D
int enablePin = 11;    // pin 1 on L293D

#define ECHOPIN 12        // Pin to receive echo pulse
#define TRIGPIN 13        // Pin to send trigger pulse

/*
 * setup function
 * Initialize the serial line (D0 & D1) at 115200.
 * Then set the pin defined to receive echo in INPUT 
 * and the pin to trigger to OUTPUT.
 */


void setup()
{
    digitalWrite(enablePin, HIGH);
  
  pinMode(ECHOPIN, INPUT);
  pinMode(TRIGPIN, OUTPUT);
     pinMode(motor1Pin1, OUTPUT);
  pinMode(motor1Pin2, OUTPUT);
  pinMode(enablePin, OUTPUT);
}

/*
 * loop function.
 * 
 */
void loop()
{
  // Start Ranging
  digitalWrite(TRIGPIN, LOW);
  delayMicroseconds(2);
  digitalWrite(TRIGPIN, HIGH);
  delayMicroseconds(10);
  digitalWrite(TRIGPIN, LOW);
  // Compute distance
  float distance = pulseIn(ECHOPIN, HIGH);
  distance= distance/58;
if (distance<15) {
    digitalWrite(motor1Pin1, HIGH);  // set pin 2 on L293D high
    digitalWrite(motor1Pin2, LOW);   // set pin 7 on L293D low
    delay(1000);
    digitalWrite(10,HIGH);
    digitalWrite(4,HIGH);
    digitalWrite(9,LOW);
    delay(100);
    digitalWrite(motor1Pin1, LOW);   // set pin 2 on L293D low
    digitalWrite(motor1Pin2, HIGH);  // set pin 7 on L293D high
    delay(2000);
    digitalWrite(10,LOW);
}
else {
     digitalWrite(motor1Pin1, LOW);   // set pin 2 on L293D low
    digitalWrite(motor1Pin2, HIGH);  // set pin 7 on L293D high
} 
  delay(200);
}

[code]

[/code][/code][/code]

ok se vieni su skype (facebook non mi piace) tra mezzoretta ti spiego un po' :wink:

?R:
ok se vieni su skype (facebook non mi piace) tra mezzoretta ti spiego un po' :wink:

No problem, thank you :smiley: