Go Down

Topic: Macchina rc+ultrasuoni [consulenza sui sensori da usare] (Read 1 time) previous topic - next topic

cece99

Dec 07, 2012, 04:18 pm Last Edit: Dec 08, 2012, 04:54 pm by cece99 Reason: 1
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).
______________________________________________________________________________________________________________________________________________________


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:
Code: [Select]
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);
}
Il Vero Programmatore non ha bisogno di manuali sull'assembler, sono
  sufficienti i data sheet dei microprocessori.

ƎR

#1
Dec 07, 2012, 04:37 pm Last Edit: Dec 07, 2012, 04:41 pm by ?R Reason: 1
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?
Riccardo Ertolupi of the Vicenza Thunders Team: http://www.VicenzaThunders.com

astrobeed


cece99


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 :)
Il Vero Programmatore non ha bisogno di manuali sull'assembler, sono
  sufficienti i data sheet dei microprocessori.

Ǝ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 :)

ma non doveva evitarli gli ostacoli? :P
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
Riccardo Ertolupi of the Vicenza Thunders Team: http://www.VicenzaThunders.com

cece99




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 :)

ma non doveva evitarli gli ostacoli? :P
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:
Code: [Select]

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]
Il Vero Programmatore non ha bisogno di manuali sull'assembler, sono
  sufficienti i data sheet dei microprocessori.

Ǝ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?
Riccardo Ertolupi of the Vicenza Thunders Team: http://www.VicenzaThunders.com

cece99


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?
Il Vero Programmatore non ha bisogno di manuali sull'assembler, sono
  sufficienti i data sheet dei microprocessori.

ƎR


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 ;)
Riccardo Ertolupi of the Vicenza Thunders Team: http://www.VicenzaThunders.com

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 ;)

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?
Il Vero Programmatore non ha bisogno di manuali sull'assembler, sono
  sufficienti i data sheet dei microprocessori.

ƎR

Riccardo Ertolupi of the Vicenza Thunders Team: http://www.VicenzaThunders.com

cece99


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:
Code: [Select]

#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]
Il Vero Programmatore non ha bisogno di manuali sull'assembler, sono
  sufficienti i data sheet dei microprocessori.

ƎR

ok se vieni su skype (facebook non mi piace) tra mezzoretta ti spiego un po' ;)
Riccardo Ertolupi of the Vicenza Thunders Team: http://www.VicenzaThunders.com

cece99


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

No problem, thank you :D
Il Vero Programmatore non ha bisogno di manuali sull'assembler, sono
  sufficienti i data sheet dei microprocessori.

Go Up
 


Please enter a valid email to subscribe

Confirm your email address

We need to confirm your email address.
To complete the subscription, please click the link in the email we just sent you.

Thank you for subscribing!

Arduino
via Egeo 16
Torino, 10131
Italy