Implemento funzioni programma

salve a tutti,arrivo dritto al dunque il mio programma ha lo scopo di comandare un auto radiocomandata (direzione, velocità, luci, frecce, clacson, mod.automatica).

il mio nuovo obiettivo era quello di aggiungere altre 3 funzioni.
1-display lcd 16x2 IIC (semplice, ma non necessario)
2-sensore di temperatura (nulla di piu semplice)
3-modulo ethernet.

sul 3° punto ho bisogno del vostro aiuto. avevo intenzione di usare il modulo ENC28J60

l'idea è questa: tramite il modulo inviare al pc determinati risultati, come la temperatura o la velocità digitale dell auto, la direzione seguita ecc..., che verranno visualizzati anche su un eventuale modulo LCD (al momento non lo prevedo)

questo risultato verrà poi visualizzato all interno di una pagina web (la grafica è secondaria), ma cosa importante DEVE ESSERE IN TEMPO REALE (o quasi massimo qualche secondo di ritardo).

quello che vorrei sapere è:
il modulo è quello giusto?
poi, è fattibile? (specifico che ho 7 pin disponibili tra analogici e digitali)

grazie mille a tutti

questo è il programma (il codice del sensore di temperatura non c è e non badate alla disposizione dei pin)

#include <SoftwareSerial.h>
#include <Servo.h> 
#define echoPin 2                            // Pin to receive echo pulse
#define trigPin 3

 SoftwareSerial BluetoothSerial = SoftwareSerial(0, 1); //si richiama il modulo bluetooth
 Servo myservo;
 
 const int input1m1 = 9; //input1 per il motore 1
 const int input2m1 = 10;//input2 per il motore 2
 const int enablem1 = 11;//regolatore motore 1
 char marcia;
 int velmotore = 0;
 int i;
 
  
void setup() {
   Serial.begin(9600);
   BluetoothSerial.begin(9600);  //si stabliscono le variabii generali
   pinMode(echoPin, INPUT);// set echopin input
   pinMode(trigPin, OUTPUT); // set pin trigger output
   pinMode(input1m1, OUTPUT);
   pinMode(input2m1, OUTPUT);
   pinMode(enablem1, OUTPUT);
   pinMode(6, OUTPUT);
   pinMode(7, OUTPUT);
   myservo.attach(13);  // attaches the servo on pin 9 to the servo object 
  myservo.write(120);
}

void loop() {
 if (BluetoothSerial.available()){
    marcia=BluetoothSerial.read(); //vengono lette le marce e di conseguenza la velocità

 if(marcia=='1'){
    velmotore = 25;
    }
    
     if(marcia=='2'){
    velmotore = 51;
    }
    
     if(marcia=='3'){
    velmotore = 76;
    }
    
     if(marcia=='4'){
    velmotore = 102;
    }
    
     if(marcia=='5'){
    velmotore = 127;
    }
    
     if(marcia=='6'){
    velmotore = 153;
    }
    
     if(marcia=='7'){
    velmotore = 178;
    }
    
     if(marcia=='8'){
    velmotore = 204;
    }
    
     if(marcia=='9'){
    velmotore = 229;
    }
    
     if(marcia=='q'){
    velmotore = 254;
    }
    
if(marcia== 'U'){
    do
 {
    digitalWrite(trigPin, LOW);// si imposta il trigpin spento per 2 microsecondi
  delayMicroseconds(2);
  digitalWrite(trigPin, HIGH);//invia per 10 microsecondi un segnale
  delayMicroseconds(10);
  digitalWrite(trigPin, LOW);// si spegne il trigpin
  int distance = pulseIn(echoPin, HIGH); // si legge il segnale (distanza in tempo <x>)
  distance= distance/58;
   if((distance>30)&&(distance!=0)){  // a volte arrivano degli zeri e quelli non li devo prendere in considerazione
    digitalWrite(input1m1,HIGH); // accendo il motore
    digitalWrite(input2m1,LOW);
    analogWrite(enablem1, 200);
   }
   if((distance<30)&&(distance!=0)){
      analogWrite(enablem1, 0);  //il motore si ferma e indica col cicalino l'arresto
      digitalWrite(7,HIGH);
      delay(500);
      digitalWrite(7,LOW);
      delay(500);
   }

    if(BluetoothSerial.available() && BluetoothSerial.read()=='u') {goto fuori;}
  } while(marcia=='U');
}
fuori:
if(marcia=='W'){                //luci
  digitalWrite(6,HIGH);
}  
if(marcia=='w'){
  digitalWrite(6,LOW);
}

if(marcia=='V'){             //clacson
  digitalWrite(7,HIGH);
}  
if(marcia=='v'){
  digitalWrite(7,LOW);
}  
   
if(marcia=='X'){             //4 frecce
  do{
  digitalWrite(8,HIGH);
  delay(750);
  digitalWrite(8,LOW);
  delay(750);
  if(BluetoothSerial.available() && BluetoothSerial.read()=='x') {digitalWrite(8,LOW);}
}while(marcia=='X');
}

if(marcia=='F'){
     digitalWrite(input1m1, HIGH); //vengono impostati i valori per i quali il motore va avanti
     digitalWrite(input2m1, LOW);
     analogWrite(enablem1, velmotore); //si imposta la velocità grazie al pin PWM
     Serial.print("avanti");
  }
  
  else{
   analogWrite(enablem1, 0); //senza comando il motore si ferma
}
  
  if(marcia=='B'){
  digitalWrite(input1m1, LOW); //vengono impostati i valori per i quali il motore va indietro
  digitalWrite(input2m1, HIGH);
  analogWrite(enablem1, velmotore); //si imposta la velocità grazie al pin PWM
  }
  if(marcia=='L'){
      myservo.write(70);
     }
     else{
      myservo.write(120);
     }
     if(marcia=='R'){
      myservo.write(190);
     }
     
     if(marcia=='G'){                //AVANTI A SINISTRA
     digitalWrite(input1m1, HIGH); //vengono impostati i valori per i quali il motore va avanti
     digitalWrite(input2m1, LOW);
     analogWrite(enablem1, velmotore); //si imposta la velocità grazie al pin PWM
     myservo.write(70);
  }
  
  if(marcia=='I'){                     //AVANTI A DESTRA
     digitalWrite(input1m1, HIGH); //vengono impostati i valori per i quali il motore va avanti
     digitalWrite(input2m1, LOW);
     analogWrite(enablem1, velmotore); //si imposta la velocità grazie al pin PWM
     myservo.write(190);
  }
  
  if(marcia=='H'){             //DIETRO A SINISTRA
     digitalWrite(input1m1, LOW); //vengono impostati i valori per i quali il motore va indietro
  digitalWrite(input2m1, HIGH);
  analogWrite(enablem1, velmotore); //si imposta la velocità grazie al pin PWM
     myservo.write(190);
  }
  if(marcia=='J'){
     digitalWrite(input1m1, LOW); //vengono impostati i valori per i quali il motore va indietro
  digitalWrite(input2m1, HIGH);
  analogWrite(enablem1, velmotore); //si imposta la velocità grazie al pin PWM
     myservo.write(70);
  }
}
}

Fattibile è fattibile, ma poi hai intenzione di mandare in giro la macchina con il cavo Ethernet attaccato? Perché altrimenti la vedo dura trasmettere alcunché, e comandare in Bluetooth un'auto che ha comunque un cavo attaccato mi pare un po' contorto :o.

L'ENC28J60 (ma anche lo shield ufficiale) si pilota in SPI, il che vuol dire che devi liberare i pin 11, 12 e 13 (ed un altro ancora per l'SS, mi pare di default sia l'8, ma credo sia meglio usare il 10) e spostare su altri pin quel che al momento è connesso a questi. Poi dovrai realizzare un server web, o usarne uno già fatto, per permettere la visualizzazione dei dati. Se si riesca a fare in tempo reale o meno dipende da molte cose, tipo quanti sono i dati in questione, come implementerai il server e in particolare la parte "dinamica" (AJAX?), ma di questo non sono esperto, per cui mi rimetto ad altri.

non sapevo che fosse necessario tenere il cavo attaccato.
non c è un modulo che faccia queste cose in wifi o qualcosa senza fili?

Ultimamente di wireless è molto in voga tale ESP8266, qua sul forum italiano c'è un thread di 115+ pagine in merito.

In alternativa c'è lo shield wifi ufficiale.

Ma... hai pensato a trasmettere i dati col Bluetooth che già hai e visualizzarli poi in qualche modo dal PC?

Clash230:
non c è un modulo che faccia queste cose in wifi o qualcosa senza fili?

Se non necessiti di grosse distanze, la soluzione migliore è il Bluetooth, poi, per arrivare più lontano, puoi andare sui moduli Xbee PRO e quindi c'è anche il WiFi, ma ... occhio ai ritardi che una trasmissione TCP/IP ti introduce :wink:

Guglielmo

siccome ho gia il modulo bluetooth (modello HC-06) e in effetti le misure si limitano a quelle di una stanza, quindi immagino un 25/30 mq massimo, come posso fare tramite bluetooth??

Usi la libreria SoftwareSerial per creare una seriale aggiuntiva sul tuo Arduino (ti consiglio i pin 10 RX e 11 TX). Colleghi il modulo HC-06 a detta seriale aggiuntiva, ricordandoti di incrociare i segali, quindi :

TX Bluetooth ----> RX SoftwareSerial Arduino
RX Bluetooth <---- TX SoftwareSerial Arduino

... e hai un bel collegamento seriale con cui scambiare informazioni con Arduino.

Guglielmo

Ma veramente lo sta già facendo, sta già utilizzando l'HC-06 se guardi lo sketch. L'assurdo è che lo usa tramite una seriale software sui pin 0 e 1 :confused:, ma mi pare di ricordare che glielo si fosse già fatto notare in passato.

Per inviare dati via BT basta che li scrivi sulla seriale in questione. Dall'altra parte ci deve essere un programma che legge dati dal bluetooth e ci fa quello che deve. L'altro lato in questione è un PC, smartphone o cos'altro?

Ahahahahah :smiley: :smiley: :smiley: ... grazie Sukko ... non mi ero messo a leggere il codice ... :slight_smile:

Si ... se lasciasse i pin 0 e 1 per la vera seriale (... da cui poter fare il debug) ed usasse altri due pin per la SoftwareSerial ... probabilmente arriverebbe prima alla sua soluzione :wink:

Guglielmo

un attimo ragazzi. prima di tutto come gia dissi e ho scritto anche in quest post, non vi preoccupate della disposizione pin, per ora è tutto provvisorio, o quasi.

Per inviare dati via BT basta che li scrivi sulla seriale in questione. Dall'altra parte ci deve essere un programma che legge dati dal bluetooth e ci fa quello che deve. L'altro lato in questione è un PC, smartphone o cos'altro?

in pratica il controllo dell auto avviene da uno smartphone android, ma io vorrei che modificasse in tempo reale un file di testo o una pagina web su un pc

Si ... se lasciasse i pin 0 e 1 per la vera seriale (... da cui poter fare il debug) ed usasse altri due pin per la SoftwareSerial ... probabilmente arriverebbe prima alla sua soluzione

scusate poi ma io non sono molto ferrato in queste cose, cosa intendi per vera seriale e debug?

I pin 0 e 1 sono collegati all'adattatore seriale <--> USB e quindi, se vuoi fare del debug, ad esempio inviando sul serial monitor delle informazioni sull'andamento del programma o sul valore di variabili, quei due pin DEVONO rimanere liberi o ... niente debug !

Guglielmo

ah ok grazie. per il resto per comandare l auto da smartphone via bluetooth e modificare un file di testo o un pagina web sul pc come faccio? non me ne intendo ma non credo di farcela solo con il modulo BT

Considera il bluetooth come un collegamento bidirezionale ...
... tu puoi dal PC/mobile inviare dei dati ad Arduino ed Arduino può, sempre attraverso lo stesso collegamento inviare dei dati al tuo PC/mobile.

Quindi, per i comandi che vorrai dargli, sarai tu a trasmettere verso Arduino, per le cose che vorrai aggiornare, riceverai gli aggiornamenti dal bluetooth e poi li elaborerai sul tuo PC/mobile per aggiornare la pagina web.

Non ti consiglio di appesantire l'applicazione su Arduino perché si occupi anche di aggiornare pagine HTML ... ricevi i dati grezzi sul PC/mobile e da questi aggiorna poi, cove vuoi tu, le pagine web :wink:

Guglielmo

si infatti mi è stato consigliato da un amico di creare semplicemente un file txt, che poi la pagina web usa per modificarsi automaticamente. grazie mille

come faccio se invece volessi che tramite bluetooth arduino inviasse un messaggio a un pc connesso, e creasse un file txt?

se per favore esiste una soluzione abbastanza semplice.
grazie mille

nessuno sa sa aiutarmi?

Fai esattamente come se le ricevessi da seriale, solo che le ricevi sul PC dalla COMx: associata al Bluetooth.

Leggi i dati che arrivano e li scrivi su file txt ... non vedo dove trovi difficoltà.

Guglielmo

non so come fare a leggerli e poi scriverli sul file, devo usare qualche programma?

Ma scusa, da lato PC non sei tu che scrivi il programma ? Perché certo che si .. devi avere un programma che legga e scriva opportunamente ...

Guglielmo

che programma posso usare?