HOME

 

Collegare il Nutchip al PC

con Visual Basic™

sorgenti di esempio e descrizione dei comandi

Dopo avere provato Nutchip Commander, il telecomando virtuale che "gira" sullo schermo del PC, molti lettori ci hanno chiesto come fosse possibile scrivere un proprio programma per il controllo del Nutchip attraverso il computer.
In questo articolo vi spiegheremo la tecnica per colloquiare con un Nutchip collegato alla porta seriale, con cui potrete:

  • scrivere un programma che riceve i segnali da un telecomando a raggi infrarossi oppure RF
  • scrivere un programma che legge lo stato di contatti esterni collegati al Nutchip, elaborandoli o memorizzandoli in un file
  • scrivere un programma che aziona dei relè o altri apparecchi esterni come luci o motorini
  • scrivere un programma che riconosce le smartcard e registra su un file le informazioni, come orari di entrata, uscita e identificativi

Gli esempi sono scritti in Visual Basic e richiedono il modulo della porta seriale (MsComm) distribuito con la versione Professional del programma. Chi conosce altri linguaggi, come il C++, Delphi, TurboPascal, QuickBasic ecc., potrà usare la descrizione e gli esempi del protocollo di comunicazione per scrivere il relativo programma.


Il telecomando "virtuale" sullo schermo del PC funziona attraverso la porta seriale.
I LED rossi visualizzano le uscite, i verdi gli ingressi, ed il display indica lo stato.

Protocollo di comunicazione

La comunicazione seriale con il Nutchip avviene grazie ai piedini RX (ricezione dei comandi dal PC) e TX (trasmissione delle risposte del Nutchip). Questi piedini si collegano alla porta seriale del PC attraverso l'interfaccia che usiamo per programmare il Nutchip, che adatta le tensioni di + e - 12 volt usate dalla RS232 al livello di 0 e 5 volt richiesto dal Nutchip.
I comandi che il PC trasmette al Nutchip sono semplici parole di 4 lettere (4 byte). E' indispensabile usare solo lettere maiuscole, e non bisogna aggiungere caratteri di separazione (come ritorno a capo o spazi) fra un comando e l'altro.

Il Nutchip risponde ad un comando trasmettendo sempre due byte. La porta seriale va settata a 9600,N,8,1.
Le risposte del Nutchip non sono lettere ma numeri binari che possono contenere il carattere NULL (valore binario zero).

Comando: INFR

Risposta del Nutchip: Due byte, rispettivamente il byte basso e byte alto del codice ricevuto per ultimo dal telecomando. Il codice continua a essere trasmesso anche dopo che il telecomando si spegne.

Significato: Richiede al Nutchip il valore dell'ultimo codice infrarosso ricevuto. Se precedentemente il Nutchip era settato per ricevere i codici radio, subito dopo questo comando passerà a decodificare quelli a infrarossi.

Comando: RADI

Risposta del Nutchip: Due byte, rispettivamente il byte basso e byte alto del codice ricevuto per ultimo. Il codice continua a essere trasmesso anche dopo che il telecomando si spegne.

Significato: Richiede al Nutchip il valore dell'ultimo codice a radiofrequenza ricevuto. Se precedentemente il Nutchip era settato per ricevere i a raggi infrarossi, subito dopo questo comando passerà a decodificare quelli via radio.

Comando: KEY1 (ed anche: KEY2, KEY3, KEY4, KEY5, KEY6)

Risposta del Nutchip: Due byte, rispettivamente lo stato dei piedini di ingresso/uscita e il numero dello stato interno.

Significato: Forza il telecomando da seriale. Ad esempio, l'effetto del comando KEY1 è lo stesso che si avrebbe premendo il tasto 1 del telecomando: Il Nutchip non si accorge della differenza e reagirà allo stesso modo, come stabilito dalla tavola della verità.
In risposta a questo comando il Nutchip invia lo stato interno, cioè lo stato alto/basso dei piedini di ingresso ed uscita più lo stato correntemente in esecuzione.
Il significato dei bit all'interno del primo byte byte trasmesso è la seguente:

bit7
bit6
bit5
bit4
bit3
bit2
bit1
bit0
OUT4
IN4
OUT3
IN3
OUT2
IN2
OUT1
IN1

Il secondo byte trasmesso dal Nutchip è un numero binario che identifica al numero dello stato attualmente in esecuzione (st00, st01, st02, ecc.).
Attenzione:
la numerazione dello stato è sempre progressiva a partire da zero. Se la tabella originale è numerata progressivamente, tale numero corrisponderà al numero dello stato della tabella della verità inserita con Nutstation. Se invece la tabella originale fa dei "salti" nella numerazione degli stati, lo stato comunicato dal Nutchip e quello scritto sulla tavola della verità potranno differire.

Comando: KEY?

Risposta del Nutchip: Due byte, come il comando KEY1 (vedi).

Significato: Come comando KEY1, ma non corrisponde a nessun tasto del teleomando, perciò non ha nessun effetto sul Nutchip. Lo scopo di questo comando è quello di leggere lo stato interno senza alterare il Nutchip.

Attenzione a non confondere il KEY (usato per i comandi dal PC al Nutchip) con il codice del telecomando (usato per le risposte che il Nutchip restituisce al PC).

 

Esempi di comunicazione

Vediamo con degli esempi come il Nutchip risponde ai vari comandi. Per ogni comando abbiamo scritto la risposta del Nutchip in una tabellina, byte per byte, sia sotto forma di caratteri ASCII che come valori esadecimali e decimali.

Cominciando trasmettendo il comando INFR dal PC al Nutchip. Se usiamo l'interfaccia a transistor, che inserisce automaticamente l'eco dei caratteri, la stringa ricevuta in risposta dal Nutchip è di 6 caratteri: INFR**.
I primi 4 caratteri sono l'eco del comando trasmesso, gli ultimi due sono la risposta vera e propria e siccome non hanno un corrispondente visualizzabile sono indicati con degli asterischi.

stringa ricevuta I N F R * *
in esadecimale 49 4E 46 52 FF FF
in decimale 73 78 70 82 255 255


Se rileggiamo il significato del comando INFR nel protocollo, notiamo che i 2 byte della risposta (FF, FF) sono il byte basso ed alto dell'ultimo codice infrarosso ricevuto: in questo caso, al numero $FFFF esadecimale corrisponde il codice 65535 indecimale.
Se premiamo il tasto azzurro P+ sul telecomando a infrarossi Visa Simplex e ripetiamo il comando INFR otterremo invece la risposta seguente:

stringa ricevuta I N F R * *
in esadecimale 49 4E 46 52 20 10
in decimale 73 78 70 82 32 16

Il tasto P+ trasmette il codice infrarosso 4128 = $1020 esadecimale. Questo numero, scomposto nel byte basso ($20 = 32 decimale) ed alto ($10 = 16 decimale), corrisponde a quello ricevuto dal Nutchip. Per ottenere il codice decimale basta fare:

codice telecomando ricevuto ricevuto = 32 + 16 * 256 = 4128

Vediamo ora cosa otteniamo inviando il comando KEY1. Questo bottone trasmette il comando KEY1 (per trasmettere gli altri comandi, da KEY2 a KEY6, basta selezionarle dalla finestrella adiacente al bottone).

stringa ricevuta K E Y 1 * *
in esadecimale 4B 45 59 31 C7 5
in decimale 75 69 89 49 199 5

L'effetto di questo comando è identico a quello che otterremmo premendo il pulsante KEY1 sul telecomando.
Scartiamo le prime 4 lettere (l'eco del comando KEY1) e concentrandoci sugli ultimi 2 byte, che valgono rispettivamente $C7 esadecimale e 5.
Il primo dei due rivela lo stato logico degli ingressi e delle uscite del Nutchip: convertiamolo in binario.

$C7 = 199 decimale = 11000111 binario

I valori degli zeri e uno di questo numero binario rappresentano lo stato logico degli ingressi e delle le uscite dei piedini del Nutchip, secondo la corrispondenza seguente:

1
1
0
0
0
1
1
1
OUT4
IN4
OUT3
IN3
OUT2
IN2
OUT1
IN1

Quindi ora sappiamo che gli ingressi del Nutchip sono tutti alti, fuorchè IN3, mentre le uscite sono metà alte (OUT1 e OUT4) e metà basse (OUT2 e OUT3).
Concludiamo notando che l'ultimo byte ricevuto vale 5, quindi il Nutchip si trova nello stato st5.

Descrizione del programma

Il programma che vi forniamo dispone di tre grandi pulsanti, premendoli si trasmette sulla seriale il comando corrispondente.
Cliccando il primo pulsante si invia il comando INFR, con il secondo il comando RADI. Il terzo pulsante invia il comando KEY1...KEY6 a seconda del numero selezionato nella finestrella adiacente al bottone.
Il programma mostra la risposta del Nutchip nella finestra sottostante, sia come stringa testo, che come elenco dei codici esadecimali e decimali di tutti i caratteri ricevuti.

Screenshot del programma di cui forniamo i sorgenti nella pagina dei download:
questa immagine mostra la risposta del Nutchip al comando INFR (primo bottone in alto).

I tre bottoni richiamano la subroutine nutchip_command, passando la stringa contenente al comando per il Nutchip.
Questa routine invia il comando sulla seriale e ne raccoglie la risposta nella stringa risp. Quindi passa la stringa alle funzioni che preparano l'output da mostrare sul video in formato ASCII, esadeciamale e decimale.

subroutine nutchip_command
commenti
Private Sub nutchip_command(s As String) il parametro s contiene il comando da impartire al Nutchip
    Dim risp As String la stringa risp conterrà la risposta del Nutchip al comando
    On Error GoTo errors prepariamoci per eventuali errori che si possono verificare con la porta seriale
    MSComm1.CommPort = cmbComNumber.ListIndex + 1    vediamo quale porta seriale ha scelto l'utente...
    MSComm1.PortOpen = True ...e proviamo ad impegnarla. Se questo fosse impossibile, si genererà un errore.
    risp = MSComm1.Input Altrimenti si prosegue facendo una lettura fittizia della seriale allo scopo di ripurirla da eventuali caratteri rimasti in precedenza.
    MSComm1.Output = s Si trasmette il comando sulla seriale...
    Sleep (15) ...e si attendono 15 mS per dare tempo al chip di rispondere.
    risp = MSComm1.Input Ora la risposta dovrebbe essere arrivata: memorizziamola nella stringa risp...
    MSComm1.PortOpen = False ...e liberiamo la porta seriale.
A questo punto, risp contiene la risposta del Nutchip e potete usarla a vostro piacimento.
    lblOutput.Caption = print_data(risp) & _
            print_hex(risp) & print_asc(risp)
Noi ad esempio, la visualizziamo in vari formati , usando una label.
Controllate sempre la lunghezza di risp, perchè non è detto che la risposta sia arrivata: il Nutchip potrebbe essere spento, la porta seriale sbagliata, e altro ancora...
    Exit Sub Usciamo dalla subroutine
errors: Nel caso di un errore (il più tipico è dimenticarsi di scegliere la porta seriale o sceglierne una già usata da altri programmi)...
    MsgBox Err.Description, vbOKOnly, "Errori:" ...scriviamo il messaggio di errore corrispondente e abbandoniamo la subroutine.
End Sub Fine routine.

Notate come per ottenere una pausa precisa si sia chiamata una funzione dell API di Windows, che necessita della dichiarazione seguente:

Private Declare Sub Sleep Lib "Kernel32" (ByVal dwMilliseconds As Long)

Nello stesso form bisogna inserire un controllo MsComm1 (controllo per la porta seriale) settato con le seguenti proprietà:

CommPort = 1
DTREnable = True
EOFEnable = False
HandShacking = 0
InBufferSize = 1024
InputLen = 0
InputMode = 0
NullDiscard = False
OutPutBufferSize = 512
RThreshold = 0
Settings = 9600,n,8,1
SThreshold = 0
Valori consigliati per le proprietà del controllo MsComm


Pagine correlate

INTERFACCE CON ECO E SENZA ECO

  • Se usate un'interfaccia con il MAX232 non riceverete sulla porta seriale l'eco dei caratteri trasmessi da voi stessi, ma solo la risposta del Nutchip. L'interfaccia a transistor invece ripete sull'ingresso l'eco di tuttu i caratteri trasmessi dal PC.

  • Gli esempi descritti nel testo restano validi, ma riceverete solo gli ultimi 2 caratteri (quelli effetivamente trasmessi dal Nutchip) invece di 6 (l'eco dei 4 caratteri trasmessi dal PC + 2 caratteri trasmessi dal Nutchip).

  • L'interfaccia non va messa nel caso di collegamento diretto a un Basic Stamp o al Robot DeAgostini™. In questo caso il Basic Stamp genera un segnale che è già a 0...5 volt, e l'eco non viene sentito.