Salve a tutti, sono passati diversi mesi da quando feci il mio primo post chiedendo suggerimenti per la costruzione di un braccio robot.
In questi mesi mi sono dedicato molto alla parte hardwear del mio robot, ottenendo ottimi risultati 8)
Ora mi trovo ad afrrontar , con degli strumenti quasi nulli, la parte che riguarda il softwear.
Il funzionamento è ,molto semplice , dato che è dotato di 4 servi motore che gestiscono tutti i movimenti...
ho cercatoun po' su internet per quanto riguarda la gestione da pc e mi è sembrato di capire che processing è un ottima soluzione.
in particolare pensavo di gestire ogni servo motore con due lettere della tastiera, 'q', 'a'; 'w', 's'; 'e','d'; 'r'; 'f';
ho trovato un tutorial che mostrava come fare una cosa molto simile ma poi quando ho provato ad addattarlo alle mie esigenze qualcosa non ha funzionato.
penso sia un probema di comunicazione seriale , in quanto il messaggio mostratomi da processing è :'NullPointerException ' .
in una seconda fase penserò ad una interfaccia grafica... :%
allego i due file nella speranza che qualcuno mi dica cosa fare...
Molto semplicemente in Processing NON hai aperto la porta.
println(Serial.list());
Serve solo ad avere l'elenco delle porte disponibili.
Verifica con IDE Arduino quale porta usi, poi se su Windows usa direttamente il nome della porta (nel mio esempio COM2):
che babbo che sono!
com1 e com3 !
come faccio ad aprirla?
e un altra domanda che vorrei fare è....cosa rappresentano i numeri presenti dopo la dicitura 'myport write'?
Beh, devi capire se Arduino stà su COM1 o COM3
I valori sono il codice ascii delle lettere minuscole, 'a'=>97
Per Processing, questo codice rivisto. Poi ho usato switch() invece di 20Kg di if
import processing.serial.*;
Serial myPort;
void setup(){
//println(Serial.list());
myPort = new Serial(this, "COM3", 9600); // apertura porta
}
void draw() {
if (keyPressed) {
switch(key)
{ case 'a': myPort.write('a'); break; // 'a'=>97
case 'q': myPort.write('q'); break; // 'q'=>113
case 's': myPort.write('d'); break; // 'd'=>100
case 'w': myPort.write('e'); break; // 'e'=>101
}
}
}
Tieni conto che lato Arduino hai un programma che si aspetta una di queste lettere per fare qualcosa: 'a', 'q','s','w','d','f','r'
grazie mille, sospettavo esistesse una funzione per non dover ripetere tutto , ma non la conoscevo!
ti ringrazio davvero! la stessa fiunzione la posso sare sul programma per arduino?
ti sembra corretto quello?(al di là delle ottimizazioni )
Sinceramente mi sembra una ca....volata.
Hai 4 servo, per ogni servo fa una Serial.read(), se le perde!!!
Meglio anche li un unico switch() (Processing si scrive in Java, Arduino in C e i due linguaggi si "assomigliano")
void loop()
{ if(Serial.available())
{ int car=Serial.read();
switch(car)
{ case 'a': // se premi 'a' decrementi la variabile, sempre se non ha raggiunto il valore minimo 10
if(posizione1 > 10) posizione1--; // non deve diminuire se è 10
myservo1.write (posizione1);
break;
case 'q': // premendo 'q' aumenti la variabile fino al valore massimo 170
if(posizione1 < 170) posizione1++; // non deve aumentare se è 170
myservo1.write (posizione1);
break;
case 's': // se premi 's' decrementi la variabile, sempre se non ha raggiunto il valore minimo 10
if(posizione2 > 10) posizione2--; // non deve diminuire se è 10
myservo2.write (posizione2);
break;
case 'w': // premendo 'w' aumenti la variabile fino al valore massimo 170
if(posizione2 < 170) posizione2++; // non deve aumentare se è 170
myservo2.write (posizione2);
break;
..... e cosi per tutti gli altri tasti
}
}
Codice NON provato e non testato. Modificato al volo. Possono esserci errori di battitura.
Tieni conto però che da Arduino mandi solo 4 caratteri (comandi) !!!!!!!
Io per Processing uso la libreria G4P che ha anche un disegnatore.
Non semplicissimo però usare il tutto (poi una libreria fatta da altri).
libreria: Quarks Place
designer: Quarks Place
Il programma in Processing mi pare okay. Se colleghi Arduino quando premi un tasto dovresti vedere su Arduino lampeggiare il led Rx (ricezione). Se non lampeggia hai sbagliato porta COM.
estto non lampeggia, ma quando faccio partire il programma di processing il servo capisce che è partito( ha un calo per un secondo e poi riparte) ma poi non legge i comandi
non capisco quando faccio partire il programma la lucina di arduino lampeggia( quindi il collegamento seriale è ok!), ma quando schiaccio le lettere no! cosa può essere?
Per essere sicuri, bisogna testare una cosa alla volta. Partiamo da Arduino ed escludiamo Processing.
Aggiungi quei comandi che ti ho indicato, lancia il programma in Arduino e poi da Serial Monitor dell'IDE di Arduino dovresti vedere il msg "Avvio".
Poi sempre da Serial Monitor puoi scrivere una lettera, esempio a e premi il pulsante "invia"
Arduino dovrebbe rispondere sempre sul monitor seriale con il carattere inviato