Pages: [1] 2   Go Down
Author Topic: Scrivere dati da Labview a Arduino Uno  (Read 1023 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 2
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
Code:
/*
  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 - downloaded 15 times.)
Logged

Offline Offline
Jr. Member
**
Karma: 0
Posts: 53
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.  smiley
Logged

Cagliari, Italy
Offline Offline
Tesla Member
***
Karma: 114
Posts: 7179
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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  smiley-confuse) tra il pin Reset e 3V3. Questo disabilita l'autoreset dell'Arduino.
Logged

Code fast. Code easy. Codebender --> http://codebender.cc/?referrer=PaoloP

Offline Offline
Sr. Member
****
Karma: 4
Posts: 396
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
« Last Edit: July 30, 2013, 08:22:22 am by lucaleo » Logged

Offline Offline
Sr. Member
****
Karma: 4
Posts: 396
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 333
Posts: 22924
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged


Offline Offline
Newbie
*
Karma: 0
Posts: 2
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Cagliari, Italy
Offline Offline
Tesla Member
***
Karma: 114
Posts: 7179
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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ì.
Logged

Code fast. Code easy. Codebender --> http://codebender.cc/?referrer=PaoloP

Offline Offline
Newbie
*
Karma: 0
Posts: 6
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Switzerland
Offline Offline
Faraday Member
**
Karma: 114
Posts: 5978
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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  smiley-lol

Guglielmo
« Last Edit: July 14, 2014, 03:58:08 am by gpb01 » Logged

Search is Your friend ... or I am Your enemy !

Offline Offline
Newbie
*
Karma: 0
Posts: 6
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Switzerland
Offline Offline
Faraday Member
**
Karma: 114
Posts: 5978
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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 :

- Serial.available()
- Serial.read()

Guglielmo
Logged

Search is Your friend ... or I am Your enemy !

Offline Offline
Newbie
*
Karma: 0
Posts: 6
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Switzerland
Offline Offline
Faraday Member
**
Karma: 114
Posts: 5978
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Guglielmo
Logged

Search is Your friend ... or I am Your enemy !

Offline Offline
Newbie
*
Karma: 0
Posts: 6
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Grazie mille per l'aiuto e la sua disponibilità

Giovanni
Logged

Pages: [1] 2   Go Up
Jump to: