Pages: 1 [2]   Go Down
Author Topic: Mandare una stringa di testo da Processing ad Arduino da seriale  (Read 1957 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Jr. Member
**
Karma: 0
Posts: 82
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ciao, ho aggiornato il mio codice aggiungendo la funzione per il display seriale,
purtroppo sono ancora confuso su come cambiare modalità ed usare la funzione seriale display senza interferire con la funzione per il controllo del robot,

metto il codice aggiornato per consigli e per un aiuto

Code:
#include <IRremote.h>
#include <SoftwareSerial.h>
#include <Wire.h>
#include <Servo.h>
#include <LiquidCrystal_I2C.h>
#include "pitches.h"

// BLUETOOTH
const int txPin = 2;
const int rxPin = 3;
SoftwareSerial bluetooth(rxPin, txPin);

// SERVO RUOTE
Servo servo_ruota_destra;  
Servo servo_ruota_sinistra;
const int pin_servo_ruota_destra = 4;
const int pin_servo_ruota_sinistra = 5;

// SERVO SENSORE ULTRASUONI
Servo servo_ultrasuoni;
const int pin_servo_ultrasuoni = 6;

// LED
const int led = 7;

// PIEZO
const int piezo = 8;
int startMelody[] = {
  NOTE_E4, NOTE_D4, NOTE_E4, 0, NOTE_F4, NOTE_D5, NOTE_C5};
int noteDurations[] = {
  8, 8, 8, 10, 4, 8, 4 };

// CONTROLLO IR
#define tasto_1 0x33B8A05F // AVANTI
#define tasto_2 0x33B8609F // INDIETRO
#define tasto_3 0x33B8E01F // SINISTRA
#define tasto_4 0x33B810EF // DESTRA
#define tasto_5 0x33B820DF // FERMO
#define tasto_6 0x33B8906F // LED ON
#define tasto_7 0x33B850AF // LED OFF
#define tasto_8 0x33B840BF // START FUNZIONE EVITA OSTACOLI
#define tasto_9 0x33B8C03F // STOP FUNZIONE EVITA OSTACOLI

const short RECV_PIN = 9;
IRrecv irrecv(RECV_PIN);
decode_results results;

// SENSORE ULTRASUONI HC-SR04
#define trigPin 10
#define echoPin 11
const int distanza_ostacolo = 20;
long duration, distance;
int leftDistance, rightDistance;

// Display LCD
LiquidCrystal_I2C lcd(0x27,16,2);  // set the LCD address to 0x27 for a 16 chars and 2 line display
char nome[] = "ARDUROVER-MINI";
char versione[] = "VERSIONE 1.3";
String ContenutoTextLCD = "";
char TextLCD;

// LED RGB
const int r = 15;
const int g = 16;
const int b = 17;

// SENSORE DI LUCE
int sensore_luce = A0;
int luce = 0;

// SET PRESCALE PORTE ANALOGICHE
#define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit))
#define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit))

// VARIABILE PER LA FUNZIONE EVITA OSTACOLI
int funzione_evita_ostacoli = 0;

// VARIABILE PER LA FUNZIONE AUTO-LIGHT
int funzione_auto_light = 0;

// SETUP
void setup() {
  pinMode(led, OUTPUT);
  pinMode(piezo, OUTPUT);
  pinMode(trigPin, OUTPUT);
  pinMode(echoPin, INPUT);
  pinMode(r, OUTPUT);
  pinMode(g, OUTPUT);
  pinMode(b, OUTPUT);
  pinMode(sensore_luce, INPUT);
  servo_ruota_destra.attach(pin_servo_ruota_destra);
  servo_ruota_sinistra.attach(pin_servo_ruota_sinistra);
  servo_ultrasuoni.attach(pin_servo_ultrasuoni);
  servo_ruota_destra.write(90);
  servo_ruota_sinistra.write(91);
  servo_ultrasuoni.write(90);
  lcd.init();
  lcd.backlight();
  lcd.print(nome);
  lcd.setCursor(0, 1);
  lcd.print(versione);
  for (int thisNote = 0; thisNote < 7; thisNote++) {
    int noteDuration = 1000/noteDurations[thisNote];
    tone(piezo, startMelody[thisNote],noteDuration);
    int pauseBetweenNotes = noteDuration * 1.30;
    delay(pauseBetweenNotes);
    noTone(piezo);
  }
  // Setta  prescale a 32
  // Riduci la durata della lettura analogica da 128 micros (standard) a 32
  sbi(ADCSRA,ADPS2);
  cbi(ADCSRA,ADPS1);
  sbi(ADCSRA,ADPS0);
  // Seriale
  Serial.begin(115200);
  bluetooth.begin(115200);
  Serial.println("ARDUROVER-MINI (c) 2013 Davide Gallo");
  // Avvia la ricezione IR
  //irrecv.enableIRIn();
}

void loop() {
  luce = analogRead(sensore_luce);

  /*-----DEBUG-----*/

  // SENSORE DI LUCE
  /*Serial.print("Sensore luce:");
   Serial.println(luce);
   lcd.clear();
   lcd.print("Sensore luce:");
   lcd.setCursor(0, 1);
   lcd.print(luce);
   delay(50);*/

  // SENSORE ULTRASUONI HC-SR04
  /*int distance = ping();
   distance = (duration/2) / 29.1;
   if (distance >= 200 || distance <= 0){
   Serial.println("Fuori distanza!");
   lcd.clear();
   lcd.print("Fuori distanza!");
   }
   else {
   Serial.print("DISTANZA:");
   Serial.print(distance);
   Serial.println(" cm");
   lcd.clear();
   lcd.print("Distanza:");
   lcd.setCursor(0, 1);
   lcd.print(distance);
   lcd.print("cm");
   delay(50);
   }*/

  /*-----FINE DEBUG-----*/

  // CONTROLLO REMOTO IR
  if (irrecv.decode(&results)) {
    Serial.println("Codice IR:");
    Serial.println(results.value, HEX);
    char cmd = results.value;
    switch (cmd) {
    case tasto_1:
      avanti();
      break;
    case tasto_2:
      indietro();
      break;
    case tasto_3:
      destra();
      break;
    case tasto_4:
      sinistra();
      break;
    case tasto_5:
      fermo();
      break;
    }
    irrecv.resume();
  }

  // CONTROLLO SERIALE/BLUETOOTH
  if (bluetooth.available()) {
    char cmd = bluetooth.read();
    switch (cmd) {
    case 'w':
      avanti();
      break;
    case 'x':
      indietro();
      break;
    case 'a':
      destra();
      break;
    case 'd':
      sinistra();
      break;
    case 's':
      fermo();
      break;
    case 'l':
      digitalWrite(led, HIGH);
      break;
    case 'L':
      digitalWrite(led, LOW);
      break;
    case 'o':
      if (funzione_auto_light == 0) {
        funzione_auto_light = 1;
      }
      break;
    case 'O':
      if (funzione_auto_light == 1) {
        funzione_auto_light = 0;
      }
      break;
    case 'e':
      if (funzione_evita_ostacoli == 0) {
        funzione_start();
      }
      break;
    case 'E':
      if (funzione_evita_ostacoli == 1) {
        funzione_stop();
      }
      break;
    }
  }
  // FUNZIONE AUTO-LIGHT
  if (funzione_auto_light == 1) {
    auto_light();
  }
  // FUNZIONE EVITA OSTACOLI
  if (funzione_evita_ostacoli == 1) {
    evita_ostacoli();
  }
  else {
    digitalWrite(b, HIGH);
    digitalWrite(r, LOW);
    digitalWrite(g, LOW);
  }
}

// SENSORE ULTRASUONI HC-SR04
long ping()
{
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(1000);
  digitalWrite(trigPin, LOW);
  duration = pulseIn(echoPin, HIGH);
  distance = (duration/2) / 29.1;
}
Logged

Offline Offline
Jr. Member
**
Karma: 0
Posts: 82
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

funzioni:

Code:
// FUNZIONI DI MOVIMENTO
void avanti()
{
  servo_ruota_destra.write(180);
  servo_ruota_sinistra.write(0);
}

void indietro()
{
  servo_ruota_destra.write(0);
  servo_ruota_sinistra.write(180);
}

void destra()
{
  servo_ruota_destra.write(0);
  servo_ruota_sinistra.write(0);
}

void sinistra()
{
  servo_ruota_destra.write(180);
  servo_ruota_sinistra.write(180);

}

void fermo()
{
  servo_ruota_destra.write(90);
  servo_ruota_sinistra.write(91);
}

// FUNZIONE AUTO-LIGHT
void auto_light()
{
  if(luce > 900) {
    digitalWrite(led, HIGH);
  }
  else {
    digitalWrite(led, LOW);
  }
}

// FUNZIONE EVITA OSTACOLI
void funzione_start() {
  lcd.clear();
  lcd.print("5");
  digitalWrite(r, HIGH);
  digitalWrite(g, LOW);
  digitalWrite(b, LOW);
  tone(piezo, NOTE_C4);
  delay(500);
  digitalWrite(r, LOW);
  digitalWrite(g, LOW);
  digitalWrite(b, LOW);
  noTone(piezo);
  delay(500);
  lcd.clear();
  lcd.print("4");
  digitalWrite(r, HIGH);
  digitalWrite(g, LOW);
  digitalWrite(b, LOW);
  tone(piezo, NOTE_C4);
  delay(500);
  digitalWrite(r, LOW);
  digitalWrite(g, LOW);
  digitalWrite(b, LOW);
  noTone(piezo);
  delay(500);
  lcd.clear();
  lcd.print("3");
  digitalWrite(r, HIGH);
  digitalWrite(g, LOW);
  digitalWrite(b, LOW);
  tone(piezo, NOTE_C4);
  delay(500);
  digitalWrite(r, LOW);
  digitalWrite(g, LOW);
  digitalWrite(b, LOW);
  noTone(piezo);
  delay(500);
  lcd.clear();
  lcd.print("2");
  digitalWrite(r, HIGH);
  digitalWrite(g, LOW);
  digitalWrite(b, LOW);
  tone(piezo, NOTE_C4);
  delay(500);
  digitalWrite(r, LOW);
  digitalWrite(g, LOW);
  digitalWrite(b, LOW);
  noTone(piezo);
  delay(500);
  lcd.clear();
  lcd.print("1");
  digitalWrite(r, HIGH);
  digitalWrite(g, LOW);
  digitalWrite(b, LOW);
  tone(piezo, NOTE_C4);
  delay(500);
  digitalWrite(r, LOW);
  digitalWrite(g, LOW);
  digitalWrite(b, LOW);
  noTone(piezo);
  delay(500);
  lcd.clear();
  lcd.print("START!");
  digitalWrite(g, HIGH);
  digitalWrite(r, LOW);
  digitalWrite(b, LOW);
  tone(piezo, NOTE_C5);
  delay(1000);
  noTone(piezo);
  funzione_evita_ostacoli = 1;
  lcd.clear();
  lcd.print("FUNZIONE ATTIVA:");
  lcd.setCursor(0, 1);
  lcd.print("-EVITA OSTACOLI-");
}

void funzione_stop() {
  lcd.clear();
  lcd.print("STOP!");
  funzione_evita_ostacoli = 0;
  fermo();
  delay(200);
  tone(piezo, NOTE_C5);
  delay(200);
  noTone(piezo);
  tone(piezo, NOTE_C4);
  delay(200);
  noTone(piezo);
  delay(200);
  lcd.clear();
  lcd.print(nome);
  lcd.setCursor(0, 1);
  lcd.print(versione);
  digitalWrite(b, HIGH);
  digitalWrite(g, LOW);
  digitalWrite(b, LOW);
}

void evita_ostacoli()
{
  int distanza = ping();
  if (distanza > distanza_ostacolo) {
    avanti();
    digitalWrite(g, HIGH);
    digitalWrite(r, LOW);
    digitalWrite(b, LOW);
  }
  else {
    lcd.clear();
    lcd.print("OSTACOLO");
    lcd.setCursor(0, 1);
    lcd.print("RILEVATO!");
    digitalWrite(r, HIGH);
    digitalWrite(g, LOW);
    digitalWrite(b, LOW);
    fermo();
    servo_ultrasuoni.write(30);
    delay(300);
    rightDistance = ping();
    delay(400);
    servo_ultrasuoni.write(150);
    delay(300);
    leftDistance = ping();
    delay(400);
    servo_ultrasuoni.write(90);
    delay(200);
    compareDistance();
  }
}

void compareDistance()
{
  if (leftDistance>rightDistance)
  {
    lcd.clear();
    lcd.print("OSTACOLO A:");
    lcd.setCursor(0, 1);
    lcd.print("DESTRA!");
    indietro();
    delay(300);
    destra();
    delay(300);
    fermo();
    delay(200);
  }
  else if (rightDistance>leftDistance)
  {
    lcd.clear();
    lcd.print("OSTACOLO A:");
    lcd.setCursor(0, 1);
    lcd.print("SINISTRA!");
    indietro();
    delay(300);
    sinistra();
    delay(300);
    fermo();
    delay(200);
  } 
  else {
    lcd.clear();
    lcd.print("FUNZIONE ATTIVA:");
    lcd.setCursor(0, 1);
    lcd.print("-EVITA OSTACOLI-");
  }
}

// DISPLAY SERIALE
void SerialTextDisplay() {
if (bluetooth.available()) {
    TextLCD = bluetooth.read();
    ContenutoTextLCD.concat(TextLCD);
    if (ContenutoTextLCD != "") {
      lcd.clear();
      lcd.print(ContenutoTextLCD);
    }
  }
  else {
    ContenutoTextLCD="";
  }
}
Logged

0
Offline Offline
Faraday Member
**
Karma: 45
Posts: 5784
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

cosa intendi per cambiare m odalita' ed usare la funzione seriale ?
la funzionalita' del display e' una delle tante che vuoi creare, non e' obbligatorio bloccare il robot nel momento in cui vuoi scrivere sul display.
quale problema hai ?
Logged

- [Guida] IDE - http://goo.gl/ln6glr
- [Lib] ST7032i LCD I2C - http://goo.gl/GNojT6
- [Lib] PCF8574+HD44780 LCD I2C - http://goo.gl/r7CstH

Offline Offline
Jr. Member
**
Karma: 0
Posts: 82
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ciao, per cambio di modalità intendo che quando mando da seriale i comandi w,x,a,d,s per far muovere il robot, poi li visualizzo anche sul display,
come faccia a non far interferire le due funzioni?
Logged

0
Offline Offline
Shannon Member
****
Karma: 129
Posts: 10447
:(){:|:&};:
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

io farei così, una funzione "interpreta comandi" che lancio ogni loop (di arduino):

se è disponibile ALMENO un carattere su seriale:
   leggo un carattere da seriale.
   Se è 'M' entro nella funzione "movimento":
      leggo il prossimo carattere, se è W-A-S-D muovo di consegenza, se non do errore sulla seriale ed esco dalla funzione
   se è 'D' entro nlla funzione "display":
      creo una stringa vuota
      leggo il prossimo carattere.
      se NON è '\n'(a capo)
         salvo il carattere nella stringa
     altrimenti
         stampo la stringa sul display ed esco dalla funzione
esci dalla funzione "interpreta comando"


a questo punto da processing posso scrivere:
"mwmwmadciao ho eseguito un pò di comandi, ora li esegio al contrario
mdmsms"

che farà; avanti avanti sinistra stampa "ciao ho eseguito un pò di comandi, ora li esegio al contrario"(notare il "a capo") destra indietro indietro
Logged

sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Offline Offline
Jr. Member
**
Karma: 0
Posts: 82
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ciao grazie, scusami ma no riesco a capire il procedimento che devo eseguire, potresti farmi un'esempio di codice?

Logged

0
Offline Offline
Shannon Member
****
Karma: 129
Posts: 10447
:(){:|:&};:
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

da riga 246 a 346

https://github.com/lestofante/arduinoSketch/blob/master/QuadricotteroCompleto/QuadricotteroCompleto.pde
Logged

sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

ivrea (to)
Offline Offline
Faraday Member
**
Karma: 77
Posts: 4624
miaaao ^-^
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Tu hai stabilito una logica per i comandi che mandi. Tu hai stabilito che ogni lettera inviata su seriale venga interpretata come un comando dal robot.
Aggiungi una ulteriore lettera comando. Quando invii il testo da stampare dovrai inviare il msg iniziando con quella lettera, che sò k.

Hai già
switch (cmd) {
    case 'w': ...
   
aggiungi:
    case 'k': SerialTextDisplay(); break;
Logged

my name is IGOR, not AIGOR

Pages: 1 [2]   Go Up
Jump to: