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);
}
?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?
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:
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?
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]
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
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?
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]