Arduino Sonar

Salve, oggi vi chiedo un grande aiuto in quanto sto portando un progetto per i miei esami di stato. Ho trovato sul web un progettino che mi ha affascinato, ovvero la costruzione di un sonar. Da internet ho preso lo sketch principale, poi l’ho modificato inserendo anche uno schermo LCD, dei LED e un buzzer per renderlo più funzionale. tramite Processing poi facevo visualizzare questo Sonar con una grafica. Il problema si e presentato quando nello sketch ho inserito l’LCD, da quel momento il poi processing non fa muovere piu la grafica nonostante l’LCD funzioni perfetamente. Ora io credo sia un problema di memorie dato che se carico su arduino il programma senza LCD, processing funziona perfettamente, pero vorrei sapere da voi più esperti se potrebbero essere altri i problemi. premetto che processing non e un linguaggio che uso spesso, quindi ho molta confusione su quest’ultimo.

Qui c’e il codice con l’LCD:

#include <Servo.h>  //libreria servomotore
#include <LiquidCrystal.h> //libreria lcd

LiquidCrystal lcd(7, 6, 5, 4, 3, 2); //set lcd
int ledVerde = 8;  //pin led verde
int ledRosso = 9;  //pin led rosso
int Buzz = 13;  //pin buzzer

const int trigPin = 10;  //trig ultrasuoni
const int echoPin = 11;  //echo ultrasuoni

// variabili per durata e distanza
long duration;
int distance;
Servo myServo; // variabile per il controllo del motore

void setup() {
  lcd.begin(16,2);
  pinMode(Buzz, OUTPUT);
  pinMode(ledVerde, OUTPUT);
  pinMode(ledRosso, OUTPUT);
  pinMode(trigPin, OUTPUT); 
  pinMode(echoPin, INPUT); 
  Serial.begin(9600);
  myServo.attach(12); 
}

void loop() {
  // rotazione servo motore
  for(int i=15;i<=165;i++){  
  myServo.write(i);
  delay(30);
  lcd.clear();
  distance = calculateDistance();// chiamata alla funzione per il calcolo della distanza

     lcd.setCursor(0,0);     //visualizzazione display 
     lcd.println("Sonar");
     lcd.setCursor(5,0);
     lcd.println(' ');
     lcd.setCursor(6,0);
     lcd.println(' ');
     lcd.setCursor(7,0);
     lcd.println(' ');
     lcd.setCursor(8,0);
     lcd.println(' ');
     lcd.setCursor(9,0);
     lcd.println(' ');
     lcd.setCursor(10,0);
     lcd.println(' ');
     lcd.setCursor(11,0);
     lcd.println(' ');
     lcd.setCursor(12,0);
     lcd.println(' ');
     lcd.setCursor(13,0);
     lcd.println(' ');
     lcd.setCursor(14,0);
     lcd.println(' ');
     lcd.setCursor(15,0);
     lcd.println(' ');
     lcd.setCursor(0,1);
     lcd.println("D:");
     lcd.setCursor(2,1);
     lcd.println(distance);
     lcd.setCursor(5,1);
     lcd.println("cm");
     lcd.setCursor(7,1);
     lcd.println(' ');
     lcd.setCursor(8,1);
     lcd.println("P:");
     lcd.setCursor(10,1);
     lcd.println(i);
     lcd.setCursor(13,1);
     lcd.println(' ');
     lcd.setCursor(14,1);
     lcd.println(' ');
     lcd.setCursor(15,1);
     lcd.println(' ');
  
  if(distance < 10){       // accenzione led verde e rosso, e suono buzzer in base alla distanza
    digitalWrite(ledVerde, LOW);
    digitalWrite(ledRosso, HIGH);
    digitalWrite(Buzz, LOW);
  }

  if(distance > 10){       // accenzione led verde e rosso, e suono buzzer in base alla distanza
    digitalWrite(ledVerde, HIGH);
    digitalWrite(ledRosso, LOW);
    digitalWrite(Buzz, HIGH);
  }
  
  }
  
  // rotazione inversa motore
  for(int i=165;i>15;i--){  
  myServo.write(i);
  delay(30);
  lcd.clear();
  distance = calculateDistance();

     lcd.setCursor(0,0);   // scrivo su lcd
     lcd.println("Sonar");
     lcd.setCursor(5,0);
     lcd.println(' ');
     lcd.setCursor(6,0);
     lcd.println(' ');
     lcd.setCursor(7,0);
     lcd.println(' ');
     lcd.setCursor(8,0);
     lcd.println(' ');
     lcd.setCursor(9,0);
     lcd.println(' ');
     lcd.setCursor(10,0);
     lcd.println(' ');
     lcd.setCursor(11,0);
     lcd.println(' ');
     lcd.setCursor(12,0);
     lcd.println(' ');
     lcd.setCursor(13,0);
     lcd.println(' ');
     lcd.setCursor(14,0);
     lcd.println(' ');
     lcd.setCursor(15,0);
     lcd.println(' ');
     lcd.setCursor(0,1);
     lcd.println("D:");
     lcd.setCursor(2,1);
     lcd.println(distance);
     lcd.setCursor(5,1);
     lcd.println("cm");
     lcd.setCursor(7,1);
     lcd.println(' ');
     lcd.setCursor(8,1);
     lcd.println("P:");
     lcd.setCursor(10,1);
     lcd.println(i);
     lcd.setCursor(13,1);
     lcd.println(' ');
     lcd.setCursor(14,1);
     lcd.println(' ');
     lcd.setCursor(15,1);
     lcd.println(' ');
  
  if(distance < 10){           // accenzione led verde e rosso, e suono buzzer in base alla distanza
    digitalWrite(ledVerde, LOW);
    digitalWrite(ledRosso, HIGH);
    digitalWrite(Buzz, LOW);
  }

  if(distance > 10){           // accenzione led verde e rosso, e suono buzzer in base alla distanza
    digitalWrite(ledVerde, HIGH);
    digitalWrite(ledRosso, LOW);
    digitalWrite(Buzz, HIGH);
  }
  }
}
// Funzione per calcolare la distanza con HC04
int calculateDistance(){ 
  
  digitalWrite(trigPin, LOW); 
  delayMicroseconds(2);
  digitalWrite(trigPin, HIGH); 
  delayMicroseconds(10);
  digitalWrite(trigPin, LOW);
  duration = pulseIn(echoPin, HIGH); 
  distance= duration*0.034/2;
  return distance;
}

Purtroppo non posso mettere il codice di processing quindi lo lascio come allegato.
Spero possiate aiutarmi…

sonar_arduino.ino (1.5 KB)

sonar_arduino con lcd.ino (4.15 KB)

sketch_170605a.pde (5.71 KB)

ho provato ad usare la f() e ho notato che risparmiando un po di memoria il motore e piu fluidonel suo movimento. purtroppo ancora però non funziona processing… sto pensando che forse c’e bisogno di sistemare qualcosa su quest’ultimo, non so

qui il codice con la f():

#include <Servo.h>  //libreria servomotore
#include <LiquidCrystal.h> //libreria lcd

LiquidCrystal lcd(7, 6, 5, 4, 3, 2); //set lcd
int ledVerde = 8;  //pin led verde
int ledRosso = 9;  //pin led rosso
int Buzz = 13;  //pin buzzer

const int trigPin = 10;  //trig ultrasuoni
const int echoPin = 11;  //echo ultrasuoni

// variabili per durata e distanza
long duration;
int distance;
Servo myServo; // variabile per il controllo del motore

void setup() {
  lcd.begin(16,2);
  pinMode(Buzz, OUTPUT);
  pinMode(ledVerde, OUTPUT);
  pinMode(ledRosso, OUTPUT);
  pinMode(trigPin, OUTPUT); 
  pinMode(echoPin, INPUT); 
  Serial.begin(9600);
  myServo.attach(12); 
}

void loop() {
  // rotazione servo motore
  for(int i=15;i<=165;i++){  
  myServo.write(i);
  delay(30);
  lcd.clear();
  distance = calculateDistance();// chiamata alla funzione per il calcolo della distanza

     lcd.setCursor(0,0);     //visualizzazione display 
     lcd.println(F("Sonar"));
     lcd.setCursor(5,0);
     lcd.println(F("           "));
     /*lcd.setCursor(6,0);
     lcd.println(' ');
     lcd.setCursor(7,0);
     lcd.println(' ');
     lcd.setCursor(8,0);
     lcd.println(' ');
     lcd.setCursor(9,0);
     lcd.println(' ');
     lcd.setCursor(10,0);
     lcd.println(' ');
     lcd.setCursor(11,0);
     lcd.println(' ');
     lcd.setCursor(12,0);
     lcd.println(' ');
     lcd.setCursor(13,0);
     lcd.println(' ');
     lcd.setCursor(14,0);
     lcd.println(' ');
     lcd.setCursor(15,0);
     lcd.println(' ');*/
     lcd.setCursor(0,1);
     lcd.println("D:");
     lcd.setCursor(2,1);
     lcd.println(distance);
     lcd.setCursor(5,1);
     lcd.println(F("cm"));
     lcd.setCursor(7,1);
     lcd.println(F(" "));
     lcd.setCursor(8,1);
     lcd.println(F("P:"));
     lcd.setCursor(10,1);
     lcd.println(i);
     lcd.setCursor(13,1);
     lcd.println(F("   "));
     /*lcd.setCursor(14,1);
     lcd.println(' ');
     lcd.setCursor(15,1);
     lcd.println(' ');*/
  
  if(distance < 10){       // accenzione led verde e rosso, e suono buzzer in base alla distanza
    digitalWrite(ledVerde, LOW);
    digitalWrite(ledRosso, HIGH);
    digitalWrite(Buzz, LOW);
  }

  if(distance > 10){       // accenzione led verde e rosso, e suono buzzer in base alla distanza
    digitalWrite(ledVerde, HIGH);
    digitalWrite(ledRosso, LOW);
    digitalWrite(Buzz, HIGH);
  }
  
  }
  
  // rotazione inversa motore
  for(int i=165;i>15;i--){  
  myServo.write(i);
  delay(30);
  lcd.clear();
  distance = calculateDistance();

     lcd.setCursor(0,0);     //visualizzazione display 
     lcd.println(F("Sonar"));
     lcd.setCursor(5,0);
     lcd.println(F("           "));
     /*lcd.setCursor(6,0);
     lcd.println(' ');
     lcd.setCursor(7,0);
     lcd.println(' ');
     lcd.setCursor(8,0);
     lcd.println(' ');
     lcd.setCursor(9,0);
     lcd.println(' ');
     lcd.setCursor(10,0);
     lcd.println(' ');
     lcd.setCursor(11,0);
     lcd.println(' ');
     lcd.setCursor(12,0);
     lcd.println(' ');
     lcd.setCursor(13,0);
     lcd.println(' ');
     lcd.setCursor(14,0);
     lcd.println(' ');
     lcd.setCursor(15,0);
     lcd.println(' ');*/
     lcd.setCursor(0,1);
     lcd.println("D:");
     lcd.setCursor(2,1);
     lcd.println(distance);
     lcd.setCursor(5,1);
     lcd.println(F("cm"));
     lcd.setCursor(7,1);
     lcd.println(F(" "));
     lcd.setCursor(8,1);
     lcd.println(F("P:"));
     lcd.setCursor(10,1);
     lcd.println(i);
     lcd.setCursor(13,1);
     lcd.println(F("   "));
     /*lcd.setCursor(14,1);
     lcd.println(' ');
     lcd.setCursor(15,1);
     lcd.println(' ');*/
  
  if(distance < 10){           // accenzione led verde e rosso, e suono buzzer in base alla distanza
    digitalWrite(ledVerde, LOW);
    digitalWrite(ledRosso, HIGH);
    digitalWrite(Buzz, LOW);
  }

  if(distance > 10){           // accenzione led verde e rosso, e suono buzzer in base alla distanza
    digitalWrite(ledVerde, HIGH);
    digitalWrite(ledRosso, LOW);
    digitalWrite(Buzz, HIGH);
  }
  }
}
// Funzione per calcolare la distanza con HC04
int calculateDistance(){ 
  
  digitalWrite(trigPin, LOW); 
  delayMicroseconds(2);
  digitalWrite(trigPin, HIGH); 
  delayMicroseconds(10);
  digitalWrite(trigPin, LOW);
  duration = pulseIn(echoPin, HIGH); 
  distance= duration*0.034/2;
  return distance;
}

Scusa ... ma "processing" come potrebbe funzionare visto che NON gli invii alcun dato ? ? ? :o :o :o

Io, in tutto il codice, vedo solo una Serial.begin() nel Setup() e poi ... più nulla ... ::)

Guglielmo

Nel caso in cui io carico sull'arduino lo sketch senza lcd, processing funziona perfettamente. Il problema c'e nel caso in cui carico il programma con l'lcd, qui processing si avvia ma sembra non leggere cio che arduino fa. Ora mi chiedo: se senza lcd processing funziona, perche con l'lcd no? Cioe il programma su processing resta uguale, cambia solo quello di arduino

... ma hai letto quello che ti ho scritto ? ? ? :o :o :o

Ovvio che il problema è lato Arduino ... mancano delle istruzioni per comunicare con Processing !!!

Non è che "Processing" riceva i dati in chissà quale modo eh .. glie li devi inviare TU ed in quel programma io NON vedo nulla che invia qualche cosa a "Processing" ... ::)

Guglielmo

Ah ok, scusa avevo capito che mancava qualcosa su processing. comunque il problema allora si risolve soltanto inserenso un serial.begin() in piu? potresti fare un esempio? purtroppo e da poco che uso processing e arduino insieme e vorrei capire

NO, Serial.begin() è il metodo per inizializzare la comunicazione seriale, poi ... dipende da cosa si aspetta il programma "Processing". Sicuramente dovrai inviare dei dati sulla seriale usando i metodi che ti mette a disposizione la classe Serial (es. Serial.print(), Serial.println(), Serial.write(), ...).

Ti consiglio di prendere l'esempio che avevi funzionante e guardare bene quali chiamate alla classe Serial c'erano.

Guglielmo

ok, tutto adesso funziona. Pensavo che tutti i comandi "Serial.print" etc. fossero comandi che venivano usati solo per il monitor seriale di arduino; grazie mille dell'aiuto ho imparato molto! ;D