Arduino + Bluetooth / Processing / Android controller

Ciao,

sto cercando di capire se un progetto che ho in mente e o meno fattibile:

collego ad un arduino uno il bluetooth mate silver.
collego arduino uno al pc via usb.
collego via blutooth un telefono android col bt mate silver.

con uno sketch processing per android creo un'interfaccia e invio dei dati via bluetooth
uno sketch processing sul pc interpreta questi dati e attraverso la classe Robot simula la pressione di tasti su tastiera.

in pratica il telefono android diventa una tastiera virtuale via bluetooth

ho fatto delle prove ma sembra che la comunicazione seriale non funzioni correttamente: il motivo è forse che non si può leggere da seriale via usb il bluetooth?

Scusa ma....
Perchè non salti arduino ed usi una pennetta blueetooh di quelle che emulano la seriale tra cui metà delle trust da 10 euro ? O.o

Perchè non ho la pennetta :smiley:

Dentro all' al micro hai messo del codice ? il trasmettitore mete li com è collegato ? sulla seriale standard di arduino o lo usi con la SwSerial ?
Se è il primo caso prova a togliere il chip dall'arduino e riprova se è il secondo devi creare un codice che sposti i dati da una parte all'altra con un ovvi aperdita di tempo....

Nell'UNO c'è un codice che praticamente riscrive: Serial.println(Serial.read()). La COM3 è collegata, uso la seriale standard di Arduino. Il bluetooth mate silver è collegato ai pin tx e rx di arduino, per questo chiedevo conferma... devo usare per forza la newsoftserial? Altrimenti posso collegare il bt ad un pro mini e poi collegarmi i2c con arduino uno...

Se te connetti il ricetrasmettitore alla seriale Hardware di arduino lui si pianta...
prova con la seriale emulata la NewSosftwareSerial prendi i dati da una coppia di pin e li riscrivi nella seriale nativa e dovrebbe andare :wink:

Grazie! Provo domattina, 'notte!

notte 8)

Dunque,

ho scaricato la NewSoftSerial e ho collegato il modulo bluetooth, cambiato baud rate a 38.4k.

Codice arduino:

#include <NewSoftSerial.h>

int i = 0;

NewSoftSerial mySerial(2, 3);

void setup()  
{
  Serial.begin(57600);
  mySerial.begin(38400);
}

void loop()  
{
  if (mySerial.available()) {
      Serial.print((char)mySerial.read());
      ++i;
  }
  if (i > 24) {
    Serial.println();
    i = 0;
  }
}

Processing però, a differenza del serial monitor di arduino, non mi legge correttamente i valori:

es. : se scrivo 0 sul terminale bluetooth android, arduino legge 0, processing legge 48...

import processing.serial.*;

int val = 0; 
int i = 0;
Serial port; 

void setup() {
  
  size(200,200);
  port = new Serial(this, Serial.list()[1], 57600); 
}

void draw() {
 background(val); 
}

void serialEvent(Serial port) {
  val = port.read();
  println( "Raw Input:" + val);
  if ( i > 24 ) 
    i = 0;
  else
    ++i;
}

E' un problema software?

Prova a farli lavorare alla stesa velocità....

Tutti e due a 56k quindi

o anche a 38.4K... basta che siano uguali :slight_smile:

Provato, a 56 k non legge neanche arduino (credo sia un limite della newsoftserial), a 38.4 persiste il problema e 0 processing lo legge 48, così come 1 lo legge 49 e così via.

Quello che devo inviare io sono 3 byte, binario, ognuno segnala se robot (classe di processing) deve premere un tasto o meno.

es: sul telefono android è caricato uno sketch processing che invia alla pressione di uno o più bottoni, una sequenza di 0 e 1 a seconda dei tasti premuti.
supponiamo che solo un tasto sia stato premuto

0010 0000 0000 0000 0000 0000

arduino 'stampa' sulla seriale

0010 0000 0000 0000 0000 0000

uno sketch processing su pc legge e interpreta quell'1
e la classe robot preme un tasto sulla tastiera

Codice arduino in test:

#include <NewSoftSerial.h>

int i = 0;
int current[24];
int previous[24];

NewSoftSerial mySerial(2, 3);

void setup()  
{
  for (int j = 0; j < 24; ++j) {
    current[j] = 0;
    previous[j] = current[j];
  }
  
  Serial.begin(38400);
  mySerial.begin(38400);
}

void loop()  
{
  while (mySerial.available() && i < 24) {
      current[i]=mySerial.read();
      ++i;
  }
  
  i = 0;
  
  for (int j = 0; j < 24; ++j) {
    if (current[j] != 0 && current[j] != 1) 
      Serial.print(previous[j]);
    else
      Serial.print(current[j]);
    previous[j] = current[j];
  }
  
  delay(10);
}

EDIT: ho capito perchè legge 48: è il codice ascii di processing per '0'!

Forse sto andando OT sul forum di Arduino, ma qualcuno sa come usare il multitouch con processing per android? Perchè ho bisogno di leggere più di un input contemporaneamente... e mousepressed ne legge solo uno per volta