Salve a tutti, sono nuovo del forum e nuovo anche di Arduino, ma ho qualche conoscenza di base in merito al linguaggio di programmazione.
Mi si presenta il seguente problema:
Tramite processing ho realizzato un programma che riceve un input (un numero da 0 a 1023) dal mio iPad e lo memorizza in una variabile differente in base a quale input ho dato all'iPad. Ad esempio, se muovo il fader "motore_1" processing memorizza inputMotore1 = x; in base alla posizione del fader, mentre se muovo il fader "motore_2" lo memorizza su inputMotore2 = x; allo stesso modo. Tramite questi valori vorrei controllare la velocità di rotazione di due motori distinti, usando due H-Bridge.
A questo punto mi sono bloccato, non mi viene in mente nulla di funzionante per dire ad Arduino tramite la porta seriale che il valore che sta arrivando è riferito al motore_2 piuttosto che al motore_1.
Qualche suggerimento? (Se non sono stato chiaro tenterò di spiegarmi meglio)
Quello che devi creare è un TUO protocollo, ovvero devi decidere come spedire i dati, in quale forma.
Esempio se devi accendere o spegnere 3 led a scelta, si potrebbe pensare a un "comando" del tipo "LxA" oppure "LxS" dove x può essere 1,2 o 3 e A=acceso S=spento
Se con Processing scrivo sulla porta seriale una stringa "Z1023", dove "Z" identifica il motore, "1023" il valore di velocità che il motore deve assumere. Come faccio a far manipolare ad Arduino la stringa per separare il primo carattere dal resto così da capire di quale motore si tratta?
Mi spiego, vorrei dividere la stringa in modo da fare if(primoCarattere == 'Z') { analogWrite(motore_1, restoDellaStringa) }.
Conviene anche "terminare" i valori con un simbolo preciso per esempio # => Z1023# Z123#
Così sai quando termina il dato. Oppure i dati per semplicità li spedisci sempre stessa lunghezza, esempio Z1023 e Z0123 (sempre lunghi 5 caratteri)
Perchè non inizi con un primo semplice sketch di ricezione dati e scarico su serial monitor di quello che ricevi ?
(una specie di echo)
int c = 0;
void setup()
{ delay(1000);
Serial.begin(9600); // opens serial port, sets data rate to 9600 bps
}
void loop()
{ // send data only when you receive data:
if (Serial.available() > 0)
{ c = Serial.read(); // read the incoming byte
// say what you got:
Serial.print("ricevuto: ");
Serial.print(c);
Serial.print(" -> ");
Serial.println(c, DEC);
}
}
Spedisci qualcosa da Processing, su quello non ti sò aiutare, non lo conosco.
Programmi i Basic ? In C non è banale da testo "600" a valore 600.
Qui:
int inputNum = int(inData[1] + inData[2] + inData[3] + inData[4]);
Un primo problema è che spedisci M600 le cifre sono solo 3 quindi in elemento 4 non sai che c'e'.
Quindi '6'+'0'+'0' => elementi char quindi valori ascii => 54+48+48 => inputNum=150 ed elemento 4 che non si sà
Dovresti almeno fare inData[1]-48 * 100 + inData[2]-48 * 10 + inData[3]-48 per avere 600+0+0 ma è difficile sapere quali potenze usare. Se spedisci M60 hai solo 2 cifre.
Ti conviene usare atoi() passandogli array inData, l'unica cosa che devi porre carattere '\0' alla fine di quello che hai ricevuto.