Ecco il codice per Arduino che può essere
scaricato tramite il seguente link: Drive_MST_K12.zip
Tramite l'interfaccia seriale del programma IDE di Arduino si
inviano i comandi alla scheda che li traduce in comandi per il MST_K12:
I comandi sono:
a : accensione del regolatore
al valore di regolazione fissato dal comando rxxx. Alla prima accensione bisogna
aver impostato prima il valore di regolazione tramite il comando rxxx;
s : spegnimento del
regolatore. Il
valore di regolazione e' messo a zero mentre il valore impostato
tramite il comando rxxx non viene perso ma memorizzato perché usato
alla successiva accensione;
rxxx: imposta il valore di
regolazione: xxx e' la percentuale di regolazione che può variare da 0
a 100; Quindi impostare il valore di regolazione senza aver mandato il
comando di start non ha nessun effetto se non di aggiornare il valore
di regolazione reso attivo solo dal comando di accensione.
q: ritorna lo status del
motore e del livello di regolazione attuale;
/*PROGRAMMA CONTROLLO DEL REGOLATORE MST_K12 TRAMITE INTERFACCIA SERIALE BIDIREZIONALE
Codice per pilotaggio del regolatore di velocità MST_K12. Collegando il pin 13 all'ingresso
positivo VCNT del MST_K12 e l'ingresso negativo GND alla GND della scheda Arduino( MEGA) il regolatore potrà essere
controllato inviando comandi tramite il monitor seriale della IDE dell'arduino con velocita settata a 9600.
I comandi accettati sono i seguenti:
a - accende il MOTORE
s - spenge il MOTORE
q - richiede lo stato del MOTORE.
Possibili risposte:
MOTORE acceso con regolazione xxx %
MOTORE spento
Regolazione impostata al xxx%
r xxx - scrive un valore di regolazione in %. Possibili
valori per "xxx" vanno da 0 a 100. Gli spazi sono ignorati.
I caratteri accettati sono solo quelli numerici (da 0 a 9).
*/
//pin
const byte vcnt = 13; //pin di output pwm
//variabili globali
byte regolazione = 0; //contiene il valore in % del pwm sul pin 13
int start =0; // abilita la accensione del regolatore
void setup() {
pinMode(vcnt,OUTPUT);
analogWrite(vcnt, regolazione);
Serial.begin(9600); // apro la seriale
delay(1000); //attendo che l'utente faccia altrettanto
Serial.println(F("Interfaccia Seriale Pronta ")); //sono pronto
Serial.println(F(" a= accensione; s= spegnimento; rxxx = regolazione al xxx%; q= status motore"));
}
//programma principale
void loop() {
int lettura; //contiene il valore di PWM letto dalla seriale
unsigned long tempMillis; //serve per il timeout sulla ricezione del valore di PWM
byte caratteri; //contiene il numero di caratteri ricevuti
byte tempChar; //contiene il carattere letto
//controllo se c'è qualcosa in arrivo sulla seriale
if (Serial.available()) {
byte command = Serial.read(); //leggo il primo byte
switch (command) { //controllo che sia un comando valido
case 'a': //accendo il MOTORE
//;regolazione = 100;
start =1;
analogWrite(vcnt, start*regolazione*255/100);
Serial.print(F("MOTORE"));
Serial.print(F(" acceso con regolazione al "));
Serial.print(regolazione, DEC);
Serial.println("%");
break;
case 's': //spengo il MOTORE
start=0;
analogWrite(vcnt, 0);
Serial.println(F("MOTORE spento"));
break;
case 'q': //l'utente vuole lo stato del MOTORE
Serial.print(F("MOTORE "));
if (start == 0) {
Serial.print(F("spento"));
} else if (start == 1) {
Serial.print(F("acceso"));
}
Serial.print(F(" regolazione al "));
Serial.print(regolazione, DEC);
Serial.println("%");
break;
case 'r': //imposto il PWM sul MOTORE
lettura = 0;
tempMillis = millis();
caratteri = 0;
//mi servono altri caratteri
do {
if (Serial.available()) {
tempChar = Serial.read();
caratteri++;
if ((tempChar >= 48) && (tempChar <= 57)) { //è un numero? ok
lettura = (lettura * 10) + (tempChar - 48);
} else if ((tempChar == 10) || (tempChar == 13)) {
//con invio e/o nuova linea esco
break;
}
}
//esco per timeout, per un valore di PWM maggiore di 255
//oppure per troppi caratteri senza senso ricevuti
} while ((millis() - tempMillis < 500) && (lettura <= 100) && (caratteri < 10));
//se il valore di PWM è valido, lo imposto sul pin
if (lettura <= 100) {
regolazione = lettura;
analogWrite(vcnt, start*regolazione*255/100);
Serial.print(F("regolazione impostata a "));
Serial.print(regolazione, DEC);
Serial.println("%");
}
break;
}
//svuoto il buffer da eventuali altri caratteri che non mi servono più
while (Serial.available()) {
byte a = Serial.read();
}
}
}