Pages: [1]   Go Down
Author Topic: Aiuto Arduino e Visual Studio  (Read 1262 times)
0 Members and 1 Guest are viewing this topic.
Basel, CH
Offline Offline
Jr. Member
**
Karma: 1
Posts: 85
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ciao ragazzi  smiley , vorrei chiedere il vostro aiuto riguardo ad un pezzo di codice che proprio non riesco a realizzare con visual studio. Diciamo che ho 5 porte COM ed arduino è collegato al COM3, come posso verificare con visual che arduino è collegato proprio a quella porta ? Mi dareste una grandissima mano se riuscite a risolvermi questo problema, in una settimana che provo non sono riuscito a combinare niente. Grazie mille in anticipo !!
« Last Edit: January 24, 2013, 11:51:52 am by RxxK » Logged

Selvazzano Dentro - Padova
Offline Offline
God Member
*****
Karma: 28
Posts: 933
"Chi sa fa, chi non sa insegna"
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Secondo me l'unica è inviare una stringa di interrogazione e vedere se e come risponde Arduino.

Naturalmente Arduino deve essere programmato per rispondere a questa interrogazione.
Logged

Basel, CH
Offline Offline
Jr. Member
**
Karma: 1
Posts: 85
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Secondo me l'unica è inviare una stringa di interrogazione e vedere se e come risponde Arduino.

Naturalmente Arduino deve essere programmato per rispondere a questa interrogazione.
Eh lo so, ma è proprio questo il problema. Non riesco a realizzare il codice  smiley-sad
Logged

Offline Offline
Edison Member
*
Karma: 26
Posts: 1339
You do some programming to solve a problem, and some to solve it in a particular language. (CC2)
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Io ho trovato due soluzioni: una sfrutta una stringa identificativa, l'altra il registry.

La prima soluzione funziona più o meno così: l'Arduino emette una particolare stringa una volta al secondo sulla seriale, e rimane in quello stato finché non riceve un comando di acknowledge dal PC. Il programma sul PC si mette in ascolto a turno su tutte le porte seriali (in VB.net puoi usare my.computer.ports o qualcosa del genere), ed attende la stringa. Se dopo un certo tempo (ad esempio 2 secondi) non arriva nulla o arriva qualcosa di diverso da quanto atteso, marca quella porta come non valida e passa alla successiva. Se invece riceve la stringa attesa, manda l'ack e inizia la comunicazione su quella porta.

L'altra soluzione va a leggere il registry di windows alla ricerca di prote seriali con un identificativo particolare... La chiave mi pare sia HKEY_LOCAL_MACHINE\HARDWARE\DEVICEMAP\SERIALCOMM, e le porte "generate" da Arduino contengono la stringa VCP. Ogni secondo vado a leggere l'elenco delle porte sotto quella chiave, e se mi accorgo che ne è comparsa una che contiene VCP nel nome, decido che quello è l'arduino.

Le due tecniche si possono ovviamente combinare: identifciazione di una nuova porta seriale che con ogni probabilità è associata ad un arduino + attesa della stringa identificativa proprio da quella porta.
Logged

Basel, CH
Offline Offline
Jr. Member
**
Karma: 1
Posts: 85
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Io ho trovato due soluzioni: una sfrutta una stringa identificativa, l'altra il registry.
@Tuxduino grazie mille, mi hai dato delle ottime informazioni. Ora proverò a trovare una soluzione smiley-grin
Logged

MC
Offline Offline
God Member
*****
Karma: 13
Posts: 917
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset


e le porte "generate" da Arduino contengono la stringa VCP


Attenzione che non solo le porte 'generate' da arduino contengono la stringa VCP !!
Logged

Vi è una spiegazione scientifica a tutto.
La fede è solo quell'anello che si porta al dito dopo il matrimonio.

Offline Offline
Edison Member
*
Karma: 26
Posts: 1339
You do some programming to solve a problem, and some to solve it in a particular language. (CC2)
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

e le porte "generate" da Arduino contengono la stringa VCP
Attenzione che non solo le porte 'generate' da arduino contengono la stringa VCP !!

Sì, credo che la stringa sia legata al tipo di chip "usb-to-serial" utilizzato. Probabilmente tra una Leonardo, una UNO e una 2009 ci sono differenze.
La soluzione è osservare con il registry editor l'elenco delle porte prima e dopo l'inserimento del cavo usb nella scheda.
Chiaro che se avessi un convertitore usb/seriale che usa lo stesso chip di Arduino ma non è un arduino, avrei problemi.
Ma lo stesso si può dire di un arduino con caricato un programma diverso da quello atteso. Ecco perché credo sia opportuno utilizzare la tecnica del registry solo per rilevare il collegamento della scheda e/o limitare il numero di porte da testare, mentre per una definitiva identificazione del dispositivo è meglio usare la tecnica della stringa univoca.
Logged

Basel, CH
Offline Offline
Jr. Member
**
Karma: 1
Posts: 85
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

e le porte "generate" da Arduino contengono la stringa VCP
Attenzione che non solo le porte 'generate' da arduino contengono la stringa VCP !!

Sì, credo che la stringa sia legata al tipo di chip "usb-to-serial" utilizzato. Probabilmente tra una Leonardo, una UNO e una 2009 ci sono differenze.
La soluzione è osservare con il registry editor l'elenco delle porte prima e dopo l'inserimento del cavo usb nella scheda.
Chiaro che se avessi un convertitore usb/seriale che usa lo stesso chip di Arduino ma non è un arduino, avrei problemi.
Ma lo stesso si può dire di un arduino con caricato un programma diverso da quello atteso. Ecco perché credo sia opportuno utilizzare la tecnica del registry solo per rilevare il collegamento della scheda e/o limitare il numero di porte da testare, mentre per una definitiva identificazione del dispositivo è meglio usare la tecnica della stringa univoca.

Quindi mi consigli un mix tra le due tecniche. Ma se non oso troppo vorrei chiederti se conosci qualche esempio che mi indichi almeno la via per inizare il codice (quello per visual o per arduino è indifferente, solo per avere uno spunto), perchè il programma che sto realizzando è funzionante ma vorrei solo aggiungere questo controllo sulle porte che sarebbe davvero molto utile.
« Last Edit: January 25, 2013, 07:33:36 am by RxxK » Logged

Offline Offline
Edison Member
*
Karma: 26
Posts: 1339
You do some programming to solve a problem, and some to solve it in a particular language. (CC2)
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Il codice specifico che ho scritto è da qualche parte in un vecchio progetto, che tra l'altro non posso divulgare perché non è opensource.

Comunque per quanto riguarda Arduino, metti un timer (es. SimpleTimer o similari) che emetta una determinata stringa ogni secondo o mezzo secondo.
Poi codifichi la ricezione seriale in modo che quando viene letta la stringa di ack dal PC il timer viene disabilitato e il programma continua.

Sul lato VB.net devi mettere in campo diverse componenti: lettura di una chiave del registry, ricezione seriale, timer. In questo momento non ho tempo di scrivere oltre... fai qualche prova poi posta codice e domande smiley
Logged

ivrea (to)
Online Online
Faraday Member
**
Karma: 57
Posts: 3559
miaaao ^-^
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

MI sembra che hai dimenticato di indicare in quale linguaggio .NET vorresti l'esempio.

Comunque penso che di esempi sulla programmazione Seriale con NET su internet ne troverai a milioni.
Arduino comunica su COMxx seriale (USB o RS232 che sia) con i comandi per un monitoriaggio usando la libreria Serial
Anche NET framework dispone di una libreria per comunicazione su seriale.
Esempio: http://community.visual-basic.it/dadebertolino/archive/2012/01/18/Porte-Seriali-e-VB-NET.aspx
Logged

my name is IGOR, not AIGOR

Basel, CH
Offline Offline
Jr. Member
**
Karma: 1
Posts: 85
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Il codice specifico che ho scritto è da qualche parte in un vecchio progetto, che tra l'altro non posso divulgare perché non è opensource.

Comunque per quanto riguarda Arduino, metti un timer (es. SimpleTimer o similari) che emetta una determinata stringa ogni secondo o mezzo secondo.
Poi codifichi la ricezione seriale in modo che quando viene letta la stringa di ack dal PC il timer viene disabilitato e il programma continua.

Sul lato VB.net devi mettere in campo diverse componenti: lettura di una chiave del registry, ricezione seriale, timer. In questo momento non ho tempo di scrivere oltre... fai qualche prova poi posta codice e domande smiley

Appena posso proverò come dici.
Comunque ho caricato le immagini di quello che ho provato a fare e ora ti spiego nel dettaglio:
- Come puoi vedere nel codice di arduino quello che ho fatto è dirgli che se riceve il carattere R arduino scrive nel seriale 82
- Poi nel codice di visual ho definito come SerialPort1.PortName il nome della porta che scelgo, invio il carattere R al seriale, arduino mi restituisce il valore 82 e visualizzo la scritta "connected to arduino".
E tutto funziona corretamente solo se al momento della scelta della COM scelgo quella a cui è collegato arduino. Nel caso scelgo una porta diversa il programma va in crash, e non riesco prorpio a capire il perchè !!!


* Cattura3.JPG (19.07 KB, 452x213 - viewed 16 times.)

* Cattura.JPG (88.45 KB, 1221x594 - viewed 24 times.)

* Cattura2.JPG (19.72 KB, 688x158 - viewed 20 times.)
Logged

ivrea (to)
Online Online
Faraday Member
**
Karma: 57
Posts: 3559
miaaao ^-^
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Beh, ma l'apertura della porta DEVE essere controllata.
E' come se aprissi in lettura un file che non esiste.
La open deve essere messa in un Try...Catch

 smiley-wink
Logged

my name is IGOR, not AIGOR

Pages: [1]   Go Up
Jump to: