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)