Gestione di un motore passo-passo
con interfaccia Centronics.
Motore passo-passo a 4 fasi unipolare a magnete permanente; 4 resistenze da 2.7 KΩ; 4 Transistor NPN BD135; 4 Diodi 1N4148.
Descrizione
Il movimento del motore è gestito dall’interfaccia Centronics mediante software scritto in linguaggio Visual Basic 6.
Il comando delle fasi del motore è del tipo Full-Step secondo la seguente tabella.
|
Step |
A |
B |
C |
D |
Decimale |
|
1 |
1 |
0 |
0 |
1 |
9 |
|
2 |
1 |
0 |
1 |
0 |
10 |
|
3 |
0 |
1 |
1 |
0 |
6 |
|
4 |
0 |
1 |
0 |
1 |
5 |
Nella seguente figura si mostra il form utilizzato per la realizzazione del programma.
Sul form sono presenti:
· 3 CommandButton con proprietà Name situate nel riquadro "Rotazione" e poste come: cmdAntioraria, cmdOraria e cmdArresto. La proprietà Caption vale, rispettivamente: &Antioraria, &Oraria e A&rresto;
· 1 TextBox con proprietà Name = txtStep e proprietà Text =1. Sulla TextBox è inserita una Label di commento con proprietà Caption = Step/sec;
· 4 Shape di forma circolare denominate shpLed che simulano l’accensione di 4 LED con codice binario pari a quello delle fasi del motore. Per inserire le 4 Shape, come matrice di controlli, è necessario inserire una Shape e utilizzare il comando copia/incolla. Alla domanda di Visual Basic se si vuole costruire una matrice di controlli rispondere Si. In tal modo le 4 Shape saranno individuate dai nomi: shpLed(0), shpLed(1), shpLed(2), shpLed(3);
· 1 Label denominata lblOut con proprietà Caption = 0. Quando il programma è in esecuzione essa mostra in sequenza i numeri decimali relativi al comando delle fasi del motore. Sulla tale Label è inserita una Label di commento con proprietà Caption = Valore di Output.
· 2 Timer, 1 denominato tmrMoto, con proprietà Interval = 1000. Tale valore può essere variato durante l’esecuzione del programma modificando la proprietà Text della txtStep ed 1 denominato TimerMovimenti con proprietà Interval = 1000
Il programma si compone di 6 subroutine.
· Form_Load. Si attiva al caricamento del programma e consente di inizializzare i vari oggetti presenti sul form. In particolare disabilita il Timer, imposta la proprietà Interval a 1000 (ms) e pone a 1 (Step/sec) il valore della TextBox denominata txtStep. Inoltre le 4 Shape vengono impostate di colore bianco e nella Label denominata lblOut viene caricato il valore iniziale 0. L’istruzione out(890), 0 imposta gli 8 bit dei dati dell’interfaccia Centronics come output.
· cmdAntioraria. E’ richiamata con un click sul pulsante di Antioraria. Attiva il Timer per la generazione della sequenza di comando del motore. Inoltre abilita il pulsante di Arresto e disabilita quello di Antioraria.
· cmdOrararia. E’ richiamata con un click sul pulsante di Antiorararia. Disabilita il Timer per cui il motore si ferma. Inoltre viene abilitato il pulsante di Arresto e disabilitato quello di Oraria.
· cmdArresta. E’ richiamata con un click sul pulsante di Arresta. Si abilita con il click di Antioraria o Oraria ed arresta il programma.
· cmdUscita. Un click sul pulsante Uscita consente di terminare l’esecuzione del programma.
Listato del programma in Visual Basic
Public Antiorario As Boolean
Public IndiceLista As Integer
Public NumPassi As Integer
Public Direzione As String
Public PassoCorrente As Integer
Private Sub cmdAggiungi_Click()
Dim Direzione As String
Select Case cboDirezione.ListIndex
Case 0
Direzione = "O"
Case 1
Direzione = "A"
Case 2
Direzione = "F"
End Select
lstMovimenti.AddItem Direzione + txtPassi.Text
End Sub
Private Sub cmdArresto_Click()
tmrMoto.Enabled = False
cmdAntiorario.Enabled = True
cmdAntiorario.Default = True
cmdArresto.Enabled = False
cmdOrario.Enabled = True
cmdStart.Enabled = True
End Sub
Private Sub cmdAntiorario_Click()
Antiorario = True
tmrMoto.Enabled = True
cmdAntiorario.Enabled = False
cmdOrario.Enabled = True
cmdArresto.Enabled = True
cmdArresto.Default = True
cmdStart.Enabled = False
End Sub
Private Sub cmdCancella_Click()
If lstMovimenti.ListIndex >= 0 Then
lstMovimenti.RemoveItem lstMovimenti.ListIndex
End If
End Sub
Private Sub cmdCancellaLista_Click()
lstMovimenti.Clear
End Sub
Private Sub cmdCancellaTutto_Click()
On Error GoTo Errore
risposta = MsgBox("I dati saranno cancellati definitivamente.Sei sicuro?", _
vbYesNo + vbCritical, "Attenzione")
If risposta = vbYes Then
lstMovimenti.Clear
Kill "c:\Dati.txt"
End If
Exit Sub
Errore:
MsgBox "Errore n." & Err.Number & Chr(13) & Err.Description, vbOKOnly +
vbCritical, "Attenzione"
End Sub
Private Sub cmdLeggi_Click()
Dim Dati As String
Dim i As Integer
On Error GoTo Errore
lstMovimenti.Clear
Open "C:\Dati.txt" For Input As #1
i = 0
Do While Not EOF(1)
i = i + 1
Input #1, Dati
lstMovimenti.AddItem Dati
Loop
Close #1
MsgBox "Dati letti correttamente", vbOKOnly, "Lettura File"
Exit Sub
Errore:
MsgBox "Errore n." & Err.Number & Chr(13) & Err.Description, vbOKOnly +
vbCritical, "Attenzione"
End Sub
Private Sub cmdSalva_Click()
Dim i As Integer
MsgBox "I dati saranno salvati in C:\Dati.txt ", vbOKOnly, "Attenzione"
Open "C:\Dati.txt" For Output As #1
For i = 0 To lstMovimenti.ListCount - 1
Write #1, lstMovimenti.List(i)
Next i
Close #1
risposta = MsgBox("Dati salvati correttamente", vbOKOnly, "Salvataggio")
End Sub
Private Sub cmdOrario_Click()
Antiorario = False
tmrMoto.Enabled = True
cmdAntiorario.Enabled = True
cmdOrario.Enabled = False
cmdArresto.Enabled = True
cmdArresto.Default = True
cmdStart.Enabled = False
End Sub
Private Sub cmdStart_Click()
cmdAntiorario.Enabled = False
cmdOrario.Enabled = False
If lstMovimenti.List(0) = "" Then
MsgBox "Inserire i movimenti e premere Aggiungi", vbOKOnly + vbInformation,
"Attenzione"
Else
cmdStart.Enabled = False
cmdStop.Enabled = True
IndiceLista = 0
lstMovimenti.ListIndex = IndiceLista
Direzione = Mid(lstMovimenti.List(IndiceLista), 1, 1)
NumPassi = Val(Mid(lstMovimenti.List(IndiceLista), 2))
PassoCorrente = 0
TimerMovimenti.Enabled = True
End If
End Sub
Private Sub cmdStop_Click()
cmdStart.Enabled = True
cmdStop.Enabled = False
TimerMovimenti.Enabled = False
cmdAntiorario.Enabled = True
cmdOrario.Enabled = True
End Sub
Private Sub cmdUscita_Click()
Dim risposta As Integer
risposta = MsgBox("Vuoi abbandonare il programma?", vbOKCancel + vbInformation,
"Uscita")
If risposta = vbOK Then End
End Sub
Private Sub Form_Load()
cboDirezione.ListIndex = 0
cmdAntiorario.Default = True
cmdArresto.Enabled = False
txtStep.Text = 1
tmrMoto.Enabled = False
tmrMoto.Interval = 1000
TimerMovimenti.Enabled = False
TimerMovimenti.Interval = 1000
Dim conta As Integer
Do While conta <= 3
shpLed(conta).FillStyle = 0
shpLed(conta).FillColor = vbWhite
conta = conta + 1
Loop
lblOut.Caption = 0
Out (890), 0
End Sub
Private Sub TimerMovimenti_Timer()
If txtStep.Text <> "" Then
If IsNumeric(txtStep.Text) Then
If Val(txtStep.Text) = 0 Then
MsgBox ("Inserire il valore del passo")
txtStep.Text = "1"
Else
tmrMoto.Interval = 1000 / (Val(txtStep.Text))
End If
Else
MsgBox ("Inserire un numero.")
txtStep.Text = "1"
End If
End If
Static num As Integer
PassoCorrente = PassoCorrente + 1
If PassoCorrente > NumPassi Then
PassoCorrente = 1
IndiceLista = IndiceLista + 1
If IndiceLista > lstMovimenti.ListCount - 1 Then
TimerMovimenti.Enabled = False
cmdStart.Enabled = True
cmdStop.Enabled = False
Exit Sub
End If
Direzione = Mid(lstMovimenti.List(IndiceLista), 1, 1)
NumPassi = Val(Mid(lstMovimenti.List(IndiceLista), 2))
lstMovimenti.ListIndex = IndiceLista
End If
LabelPassoCorrente.Caption = PassoCorrente
If Val(txtStep.Text) <> 0 Then
TimerMovimenti.Interval = 1000 / (Val(txtStep.Text))
End If
If Direzione = "O" Then
num = num + 1
If num > 4 Then num = 1
ElseIf Direzione = "A" Then
num = num - 1
If num < 1 Then num = 4
Else
Exit Sub
End If
Select Case num
Case 1
lblOut.Caption = "9"
shpLed(0).FillColor = vbGreen
shpLed(1).FillColor = vbWhite
shpLed(2).FillColor = vbWhite
shpLed(3).FillColor = vbGreen
Out (888), 9
Case 2
lblOut.Caption = "10"
Out (888), 10
shpLed(0).FillColor = vbGreen
shpLed(1).FillColor = vbWhite
shpLed(2).FillColor = vbGreen
shpLed(3).FillColor = vbWhite
Case 3
lblOut.Caption = "6"
Out (888), 6
shpLed(0).FillColor = vbWhite
shpLed(1).FillColor = vbGreen
shpLed(2).FillColor = vbGreen
shpLed(3).FillColor = vbWhite
Case 4
lblOut.Caption = "5"
Out (888), 5
shpLed(0).FillColor = vbWhite
shpLed(1).FillColor = vbGreen
shpLed(2).FillColor = vbWhite
shpLed(3).FillColor = vbGreen
End Select
End Sub
Private Sub tmrMoto_Timer()
Static num As Integer
If txtStep.Text <> "" Then
If IsNumeric(txtStep.Text) Then
If Val(txtStep.Text) = 0 Then
MsgBox "Il passo deve essere un numero diverso da 0. Il valore sarà forzato a
1", vbOKOnly + vbInformation, "Attenzione"
txtStep.Text = "1"
Else
tmrMoto.Interval = 1000 / (Val(txtStep.Text))
End If
Else
MsgBox "Il passo deve essere un numero diverso da 0. Il valore sarà forzato a
1", vbOKOnly + vbInformation, "Attenzione"
txtStep.Text = "1"
End If
End If
If Antiorario Then
num = num + 1
If num > 4 Then num = 1
Else
num = num - 1
If num < 1 Then num = 4
End If
Select Case num
Case 1
lblOut.Caption = "9"
shpLed(0).FillColor = vbGreen
shpLed(1).FillColor = vbWhite
shpLed(2).FillColor = vbWhite
shpLed(3).FillColor = vbGreen
Out (888), 9
Case 2
lblOut.Caption = "10"
Out (888), 10
shpLed(0).FillColor = vbGreen
shpLed(1).FillColor = vbWhite
shpLed(2).FillColor = vbGreen
shpLed(3).FillColor = vbWhite
Case 3
lblOut.Caption = "6"
Out (888), 6
shpLed(0).FillColor = vbWhite
shpLed(1).FillColor = vbGreen
shpLed(2).FillColor = vbGreen
shpLed(3).FillColor = vbWhite
Case 4
lblOut.Caption = "5"
Out (888), 5
shpLed(0).FillColor = vbWhite
shpLed(1).FillColor = vbGreen
shpLed(2).FillColor = vbWhite
shpLed(3).FillColor = vbGreen
End Select
End Sub
Si riporta la schermata ottenuta durante l’esecuzione del programma.
Per concludere, si vuole ricordare che, come è noto, affinché il programma funzioni correttamente è necessario caricare nella cartella C:\Windows\System il file inpout32.dll (scaricabile gratuitamente dal sito www.logix4u.net) e inserire nel progetto Visual Basic il modulo Inpout.bas di seguito riportato:
Public Declare Function Inp Lib "inpout32.dll" _
Alias "Inp32" (ByVal PortAddress As Integer) As Integer
Public Declare Sub Out Lib "inpout32.dll" _
Alias "Out32" (ByVal PortAddress As Integer, ByVal Value As Integer)
Per costruire il modulo è sufficiente scrivere il precedente codice con un editor di testi, come il Blocco Note di Windows, e salvare il file con il nome Inpout.bas
Per questo particolare progetto il programma in VB è costituito da un solo form per cui non è indispensabile generare il modulo Inpout.bas ma è sufficiente inserire nelle dichiarazioni generali del form il precedente codice con l’accortezza di dichiarare le funzioni private, come di seguito riportato.
Private Declare Function Inp Lib "inpout32.dll" _
Alias "Inp32" (ByVal PortAddress As Integer) As Integer
Private Declare Sub Out Lib "inpout32.dll" _
Alias "Out32" (ByVal PortAddress As Integer, ByVal Value As Integer)
In alternativa è disponibile anche un'altra dll per lavorare in ambiente Windows 2000, 2000XP o NT, disponibile gratuitamente sul sito Internet www.driverlinx.com. Attivando il download si può scaricare il file Windows 95NT PortI/O driver che consente di caricare il file port95nt.exe che installa automaticamente diversi file tra cui:
· DLPortIO.DLL -- Win32 DLL hardware I/O functions
· DLPortIO.BAS -- Visual Basic interface to DLPortIO.DLL
· DLPortIO.SYS -- Kernel mode driver for WinNT
(non necessaria per Win95)
In questo caso nel progetto VB si deve inserire il modulo DLPortIO.BAS e le istruzione di Input e Output devono avere il seguente formato:
· Value = DlPortReadPortUchar(Addr)
· DlPortWritePortUchar (Addr), Value
Dove Addr è l’indirizzo della porta, ad esempio 888, e Value è il valore in decimale in lettura o in scrittura.