Scrivere dati da Labview a Arduino Uno

Ciao a tutti,
Sto realizzando un controller per un motore passo passo con l'A4983 della Allegro controllato da Arduino UNO interfacciato al PC con Labview 8.5 tramite USB. In pratica devo inviare a Arduino 4 numeri che indicano direzione, metodo di pilotaggio del motore, numero di passi e velocità, lo sketch in Arduino li elabora e attiva o meno le uscite digitali a cui è collegato l'A4983.
Caricato lo sketch, provo a passare i dati attraverso il serial monitor e tutto funziona senza problemi, Arduino mi risponde dicendomi la velocità effettiva del motore. I problemi sorgono quando tento di passare gli stessi identici dati da Labview. Ho a disposizione solo Labview 8.5, perciò devo utilizzare i driver VISA per comunicare con Arduino. Quando tento di scrivere, il LED sul pin 13 lampeggia come se premessi il pulsante di Reset sulla scheda e non succede niente, quando vado a leggere la risposta non c'è nulla.
Ho controllato che le stringhe inviate dal serial monitor e da labview siano le stesse (e sono le stesse, identiche, anche il fine carattere è giusto) e che i parametri della seriale siano corretti (e lo sono!).
Ho anche provato a caricare uno sketch che genera e invia sulla seriale numeri random e a leggerli con Labview: in questo caso funziona tutto, il problema è la scrittura sulla seriale da Labview-->Arduino. Non so più veramente dove sbattere la testa!
Vi allego il Vi e lo sketch.
Ogni aiuto è ben accetto!!!

Questo è il codice dello sketch:

/*
  Reading a serial ASCII-encoded string.
 
 It looks for an ASCII string of comma-separated values.
 
 Connections to A4983: 
 * direction: digital pin 2
 * MS1: digital pin 3
 * MS2: digital pin 4
 * MS3: digital pin 5
 * clock: digital pin 6
 * enable: digital pin 7

 */

// pins for the LEDs:
const int dir = 2;
const int drive1 = 3;
const int drive2 = 4;
const int drive3 = 5;
const int clock = 6;
const int enable = 7;


void setup() {
  // initialize serial:
  Serial.begin(9600);
  // make the pins outputs:
  pinMode(dir, OUTPUT); 
  pinMode(drive1, OUTPUT); 
  pinMode(drive2, OUTPUT); 
  pinMode(drive3, OUTPUT); 
  pinMode(clock, OUTPUT);
  pinMode(13, OUTPUT);
  pinMode(enable,OUTPUT);
  digitalWrite(enable, HIGH);
}
  
  
  void loop() {
  // if there's any serial available, read it:
  while (Serial.available() > 0) {
    // look for the next valid integer in the incoming serial stream:
    int dirUSB = Serial.parseInt(); 
    // do it again:
    int driveUSB = Serial.parseInt(); 
    // do it again:
    int nstepsUSB = Serial.parseInt();
    // do it again:
    int speedUSB = Serial.parseInt(); 

    // look for the newline. That's the end of your
    // sentence:
    if (Serial.read() == '\n') {
      digitalWrite(enable,LOW);
      //Setto la direzione di rotazione
      if (dirUSB == 0){
        digitalWrite(dir,LOW);
      }{
        digitalWrite(dir,HIGH);
      }
      //Setto il metdodo di pilotaggio (9=sedicesimo di passo)
      if (driveUSB == 1){
        digitalWrite(drive1,LOW);
        digitalWrite(drive2,LOW);
        digitalWrite(drive3,LOW);
      }else if (driveUSB == 2){
        digitalWrite(drive1,HIGH);
        digitalWrite(drive2,LOW);
        digitalWrite(drive3,LOW);
      }else if (driveUSB == 4){
        digitalWrite(drive1,LOW);
        digitalWrite(drive2,HIGH);
        digitalWrite(drive3,LOW);
      }else if (driveUSB == 8){
        digitalWrite(drive1,HIGH);
        digitalWrite(drive2,HIGH);
        digitalWrite(drive3,LOW);
      }else if (driveUSB == 9){
        driveUSB=16;
        digitalWrite(drive1,HIGH);
        digitalWrite(drive2,HIGH);
        digitalWrite(drive3,HIGH);
      }
      //Setto la velocità
      float minstep=1.8;
      minstep=minstep/driveUSB;
      float passixgiro=360/minstep;
      float minstepum=500/passixgiro;
      float velpassi=speedUSB/minstepum;
      int period=500/velpassi;
      // print the actual period
      Serial.println((500/period)*minstepum);
      //muove il motore
      for(int i=0; i<nstepsUSB; i++) {
        digitalWrite(clock,HIGH);
        digitalWrite(13,HIGH);
        delay(period/2);
        digitalWrite(clock,LOW);
        digitalWrite(13,LOW);
        delay(period/2);
      }
    }
    digitalWrite(enable,HIGH);
  }
}

stepper_arduino.vi (20.9 KB)

Non so aiutarti perchè ho usato pochissimo labview per un esame recente e non sapevo nemmeno si potesse interfacciare con arduino. Però seguo con interesse questo thread perchè mi farebbe piacere anche a me sapere come fare. :slight_smile:

Quando apri la comunicazione seriale l'Arduino viene resettato.
Probabilmente LabView ad ogni comunicazione apre e chiude.
O inserisci una pausa in Labview in modo che dopo il reset Arduino si pronto ad accettare i dati, oppure metti un condensatore (non ricordo da quanto: chiedi a Michele Menniti :~) tra il pin Reset e 3V3. Questo disabilita l'autoreset dell'Arduino.

dovrebbe essere 10uf 25v a me andava perfettamente così attenzione però che per riprogrammare devi toglierlo, potresti aggiungere un relè che a riposo tiene il condensatore staccato e quindi da la possibilità di riprogrammare arduino, con lo sketch in esecuzione impedisce l'autoreset e, quando ti serve, con un comando seriale restituisce la possibilità di programmare arduino

lucaleo:
dovrebbe essere 10uf 25v a me andava perfettamente così attenzione però che per riprogrammare devi toglierlo, potresti aggiungere un transistor che a riposo tiene il condensatore staccato e quindi da la possibilità di riprogrammare arduino, con lo sketch in esecuzione impedisce l'autoreset e, quando ti serve, con un comando seriale restituisce la possibilità di programmare arduino

Esistono anche altre 2 soluzioni al problema dell'autoreset:
una è quella di tagliare la pista della piazzola RES-EN, che può essere sempre ripristinata con una gocciolina di stagno; l'altra è più complessa ma più raffinata, si tratta di usare il firmware modificato per l'Atmega8/16U2 che ha scritto Astrobeed. In questo modo si può attivare/disattivare l'autoreset semplicemente ponticellando una coppia di pin del connettore ICSP che c'è sopra al suddetto chippino dell'Arduino UNO. Trovi la discussione ed il firmware in Megatopic.

La soluzione del condensatore fra i 3.3V e il Reset ha funzionato!!!
Grazie mille!!!!!!!!!!!!! :wink:

Che il condensatore tra Reset e 3V3 avrebbe funzionato come anti-auto-reset, ci avrei messo la mano sul fuoco. (fu testato da Michele!)
Che fosse la soluzione al tuo problema non ne ero molto sicuro, ma meglio così.

Ciao mi presento sono Giovanni
sono una new entry in questo forum perchè solo da qualche giorno ho iniziato ad appassionarmi di Arduino. A tutti voi volevo chiedere se fosse possibile inviare comandi dal software Labview verso arduiono (il viceversa funziona). Cerco di Spiegarmi meglio. Sto cercando di progettare un termometro che acquisisca la temperatura mediante Arduino usando il sensore LM35 il tutto interfacciato con labview. L'obbiettivo che mi sono posto è quello che una volta che si sia superato il valore di una soglia di temperatura labview dovrebbe mandare un comando ad arduino per far accendere una ventola.

Ringrazio anticipatamente tutti coloro che vogliano contribuire ad aiutarmi nel risolvere questo piccolo problema.

P.S. Sono ben accetti anche altri suggerimenti

Ciao weliocorno,
prima di tutto, essendo il tuo primo post, ti consiglio di presentarti QUI e di leggere con attenzione il REGOLAMENTO ...

... poi ... usi lo stesso identico sistema che per leggere, ma in senso inverso.

Da LabVIEW™ scrivi un carattere sulla porta seriale, carattere che leggi da Arduino e, in funzione del valore, (es. 0 e 1) accendi o spegni la ventola XD

Guglielmo

Prima di tutto vorrei ringraziare Guglielmo per avermi risposto. Se posso chiederle una cortesia ossia di essere un po' più esplicito nel cosa devo fare per poter inviare comandi da labview verso arduino.......perchè sono alla prima esperienza con arduino e quindi non molto esperto.

Quello che mi chiedo e se devo scrivere qualcosa nello sketch per dire che arduino deve ricevere comandi da labview.

Grazie mille

Giovanni

Immagino che già ora stai usando la classe Serial per trasmette da Arduino a LabVIEW™ via seriale la temperatura che leggi ...
... la stessa classe ti mette a disposizione i metodi per ricevere dei caratteri dalla seriale.

Guardati le :

Guglielmo

Grazie ancora Guglielmo.................un ultimissima cosa sperando di non abusare della sua pazienza e gentilezza invece dal lato labview come faccio ad inviare l'informazione ad Arduino

Ancora grazie

Giovanni

Direi che la cosa migliore è che fai una ricerca su Google per "labview write serial port" e ti scarichi qualche esempio ... :roll_eyes:

Guglielmo

Grazie mille per l'aiuto e la sua disponibilità

Giovanni

Ciao a Tutti qualcuno sa dirmi perchè quando cerco di caricare lo sketch su arduino verso la fine dell'operazione mi appare il seguente messaggio: avrdude: stk500_getsync(): not in sync: resp=0x30??

Un GRAZIE a tutti coloro che mi aiuteranno a risolvere questo problema

P.S. Ho un Arduino Uno che ho appena comprato questo è il primo sketch che tento di caricare

Giovanni

Fare un po' di ricerche qui sul forum no ??? ]:smiley:

E' un argomento che è stato trattato non so più quante volte ... cerca "stk500_getsync(): not in sync" e vedrai !!!

Nel frattempo ...

Hai selezionato la giusta board ?

Hai selezionato la giusta porta ?

Hai installato i giusti drivers (... se sei sotto Win, quelli che installa Win in automatico NON vanno bene) ?

Guglielmo