Arduino Visual basic Firmata

Anche io dubito che Firmata possa pilotare un servomotore... non lo uso mai, quindi potrei anche avere torto.
Quando lo hai provato con quel firmware, senza collegarlo al PC e senza Firmata, sicuramente avrai caricato la libreria servo.

Io in questi casi - come ho scritto prima - non uso Firmata, molto più semplicemente creo un piccolo protocollo di comunicazione seriale fra il programma sul PC ed il firmware sulla scheda.
Se invio "A120" dal PC, leggo questo dato e faccio posizionare il servomotore A alla posizione 120, tramite l'apposita libreria. Semplice ed efficace.
Per il potenziometro puoi fare al contrario, invii al PC qualcosa che comunica il valore. Qui hai diversi metodi per farlo, o invii l'informazione periodicamente, o la invii solo quando il valore cambia, o la invii come risposta ad una interrogazione proveniente dal PC (ti basta in questo caso adoperare un altro timer del VB). Così il PC riceve "P1000" e sai cosa hai letto... ovviamente ti conviene passare attraverso il PC solo se hai intenzione di intervenire in qualche modo sulla posizione del servomotore anche tramite PC, altrimenti sarebbe sufficiente una semplice comunicazione della posizione per visualizzarla a schermo.

Mork11:
Ma utilizzando medesima formula potrei far eseguire un movimento lineare al robot?

Non ho capito cosa vorresti fare. La formula lega due grandezze con una relazione lineare. Ciò che significano le due grandezze sta a te così come la loro trasformazione in un movimento o in qualcos'altro come la posizione di un punto su uno schermo.

@paulus1969
Firmata è un modo per comandare l'Arduino dall'esterno come se il dispositivo esterno avesse lui le API di Arduino. E' un'astrazione.
Se per esempio vuoi alzare un piedino X mandi il comando "Alza il piedinoX" e Arduino esegue.
Se vuoi un valore Analogico chiedi il valore. Se vuoi mandare un PWM fai lo stesso.
La logica del programma si troverà nel dispositivo esterno, in questo caso il PC. Ovviamente il tutto a scapito della velocità.

zoomx:
Se vuoi un valore Analogico chiedi il valore. Se vuoi mandare un PWM fai lo stesso.

Ma mandare un PWM non credo basta per pilotare il Servo. La libreria Servo fa ben di più.

nid69ita:
Ma mandare un PWM non credo basta per pilotare il Servo. La libreria Servo fa ben di più.

Come Astro ha spiegato più di una volta, i servo NON lavorano in PWM, ma in PPM. Quoto le sue parole ...

In PWM l'informazione è veicolata dal rapporto tra parte bassa e parte alta del segnale, in PPM l'informazione può essere veicolata in due modi, sia dalla durata della sola parte alta, o parte bassa, del segnale, che dalla posizione dell'impulso se è un treno d'impulsi componente un pacchetto di dati.

Guglielmo

Questo è quello che ho:

Dim Angolo1 As Integer
Dim potPin1 As Integer
Dim BitMin As Long
Dim BitMax As Long
Dim ValAngMin As Integer
Dim ValAngMax As Integer
Dim VALANG As Integer
FirmataVB1.PinMode(6, OUTUPT)
potPin1 = 0

BitMin = 0
BitMax = 1023
ValAngMin = 0
ValAngMax = 179

Private Sub Tmr_AnalogIN_Pot1_Tick(sender As Object, e As EventArgs) Handles Tmr_AnalogIN_Pot1.Tick
potPin1 = FirmataVB1.AnalogRead(0) 'leggi lo stato del pin analogico A0 e assegnalo al potPin1
LggIngAnalog1.Text = potPin1 * (5 / 1023) 'quello che leggi sul potPin1 scrivilo nella label
CnvAnlINGrd1.Text = potPin1 / 5.69 'scrivi nella text box il valore di Angolo1
If Angolo1 < 20 Then 'fine corsa negativo
Tmr_AnalogOUT_J1.Enabled = False 'disabilita il timer
CnvAnlINGrd1.Text = " F.Corsa N " 'mess. finecorsa
ElseIf Angolo1 > 160 Then 'fine corsa positivo
Tmr_AnalogOUT_J1.Enabled = False 'disabilita il timer
CnvAnlINGrd1.Text = " F.Corsa P " 'mess. finecorsa
End If
VALANG = potPin1
Angolo1 = (VALANG - BitMin) / (BitMax - BitMin) * (ValAngMax - ValAngMin) + ValAngMin
FirmataVB1.AnalogWrite(6, Angolo1) 'invia il valore di angolo1 al pin digitale 6
End Sub

Ma in pratica accenna a muoversi in mal modo e a scatti non definiti ho verificato il valore di Angolo1 in ed effettivamente mi restituisce valori interi che vanno da 0 a massimo 179 interi
ma il motore sibila ma non si muove.

Per spiegare l'intenzione della mia parentesi "flash" sull'uso della formula "per due punti una sola retta"...per far eseguire al robot un movimento lineare (in gergo MOVELINEAR) ossia un movimento da punto a punto con cinematica inversa e quindi nel più breve tempo possibile.

Memorizzo la posizione di un punto A nello spazio
Memorizzo la posizione di un punto B nello spazio
Esegui il movimento da punto "A" a punto "B" passando per la retta che unisce i due
Lasciando libero arbitrio sull'utilizzo degli assi

cinematica inversa in robotica

Sto dormendo, mi sono concentrato sulla formuletta e non ho fatto caso all'uso del PWM per il servo.

Però mi pare di ricordare che con Firmata i servo si possano comandare.

Qui
http://www.xorse.it/comandare-arduino-da-vb-net.html
c'è anche un progetto in vb.net (CamMove) che muove 2 servo
http://www.xorse.it/wp-content/plugins/download-monitor/download.php?id=28
Il progetto si carica con la versione 2010.

La formula che ho scritto va bene per una retta su un piano, nello spazio non va bene. Ma esiste pure la formula per quella. Che io non conosco.

zoomx:
Però mi pare di ricordare che con Firmata i servo si possano comandare.

Ho verificato, a quanto ho visto si può fare, oltre ai pinMode input e pinMode output, ce ne è uno apposito per i servo. Una volta inizializzato come servo, poi basta fare un analogwrite.

Quindi va cambiato questo
FirmataVB1.PinMode(6, OUTUPT) in FirmataVB1.PinMode(6, SERVO)
almeno secondo le specifiche
http://firmata.org/wiki/V2.2ProtocolDetails#Servos

Da quanto ho visto, sembrerebbe così.
Da altre parti leggo anche che si potrebbe dare un mode 5 invece di mode SERVO.

Però la frase al link firmata 2.2 "This is the current proposal for adding Servo support "
Proposal non vuol dire che sia poi stato implementato, no ? Però:

Tra le librerie del IDE 1.6.12, nel Firmata.h si legge la costante
#define PIN_MODE_SERVO 0x04 // digital pin in Servo output mode
e poi
// DEPRECATED as of Firmata v2.5
#define SERVO 0x04 // same as PIN_MODE_SERVO

Lo sketch StandardFirmata.ino effettivamente richiama servo.h quindi c'è l'implementazione (si trovano nel codice dei attach e detach per i servo)

Nel firmata.h si legge anche che segue lo standard 2.5.1
#define FIRMATA_PROTOCOL_MAJOR_VERSION 2 // for non-compatible changes
#define FIRMATA_PROTOCOL_MINOR_VERSION 5 // for backwards compatible changes
#define FIRMATA_PROTOCOL_BUGFIX_VERSION 1 // for bugfix releases

Quindi il mode sarebbe 4 invece che 5, il resto, PIN_MODE_SERVO o SERVO è solo cosmesi inutile, serve solo a rendere incompatibili i programmi per banali cambi di nome. Ma chi sviluppa Firmata non poteva decidere una volta per tutte?

FirmataVB1.PinMode(6, PIN_MODE_SERVO) 'lo vede come errore
FirmataVB1.PinMode(6, SERVO) 'lo vede come istruzione

Come faccio ad associare il risultato della seguente formula all'uscita 6
Angolo1 = (VALANG - BitMin) / (BitMax - BitMin) * (ValAngMax - ValAngMin) + ValAngMin

Visto che associandolo in questo modo
FirmataVB1.AnalogWrite(6, Angolo1)

non succede nulla ?

Meglio fare le cose gradualmente... prima prova a spostare semplicemente il servo, fornendo un paio di valori fissi.

Le costanti che ho trovato sono LATO Arduino. E sono riferite a Firmata 2.5.1
La libreria che usi lato VB non sò a che versione di Firmata si riferisce.
Non hai dato, secondo me, molte info. Lato Arduino che versione di IDE ?
Lato PC/VB che versione di VB ? Usi librerie lato VB ? Quali ? A che versione di Firmata si riferiscono ?

Versione Arduino IDE V 1.6.7
Versione Firmata V.3 29 June 2007
Visual Basic Studio Ultimate 2013
Libreria Firmata.FirmataVB

Sono daccordo con quello che dice paulus1969, così facendo avrò modo di conoscere meglio il procedimento alla radice imparando anche come funziona sia l'hardware che il software con cui sto lavorando...

tieni presente che quella libreria VB è ferma dal 2011, e si riferisce a Firmata 2.0
Mentre StandardFirmata su Arduino dipende dal IDE, ma è di sicuro più avanti.
Nel ide 1.6.5 è alla 2.4.3

Ok! A questo punto cosa mi consigliate di fare concretamente per portare a termine il progetto?
Un programma a caratteri singoli e uso della seriale con firmware preimpostato su arduino è banale e scontato e oltretutto il mio obbiettivo è un altro....

Il library manager permette anche di scaricare e installare versioni precedenti, attualmente partono dalla 2.3.6 fino alla 2.5.2

Il mio parere.
Da un certo punto di vista Firmata è comodo ma, a quanto pare, manca della compatibilità fra versioni differenti anche se la cosa sembra più legata al lato VB.net
Se vuoi usarlo devi trovare l'accoppiata giusta fra versione firmware e libreria.
PArti dalla pagina ufficiale

In fondo ci sono un paio di progetti per vb.net
Poi ci sarebbe questo

ma ho l'impressione che sia vecchiotto nonostante il tizio abbia dei post che risalgono a questa estate.

Ricordati di tenere l'accoppiata librerie e componente vb.net come reliquie perché probabilmente in futuro le cose cambieranno e non le troverai più.

In alternativa potresti interagire con Firmata senza libreria DLL ma c'è da studiare il protocollo.