vb6 e Arduino

ho da poco comprato Arduino uno SMD Arduino Uno Rev3 SMD — Arduino Official Store e sto imparando a programmare in visual basic6.
Ho già preso "confidenza" con Arduino (siamo già amici) ma essendo all'inizio vorrei porvi un quesito.
sto programmando un programma in VB6 per gestire apertura e chiusura di un cancello, ma quello che vorrei sapere è come programmare uno sketch che:
quando si accorge che arriva un un segnale alto (1) dal mio programma in una determinata porta (com4), accenda 3 led gialli intermittenti e dopo 3 secondi altri 5 led azzurri fissi.
quando però il segnale che arriva dalla porta com4 diventa basso (0) si spengano i 5 led azzurri e dopo 3 secondi i tre led gialli intermittenti.

la gestione di apertura e chiusura del cancello ci pensa il mio programma, vorrei solo capire come Arduino gestisce l'arrivo di di segnali dalle porte.

scusatemi, ma sono agli inizi.

se qualcuno ha qualche consiglio, esempio o domande per chiarimenti vi ringrazio anticipatamente.

Ciao arduinh3nk3r; mamma mia impronunciabile.

quando si accorge che arriva un un segnale alto (1) dal mio programma in una determinata porta (com4), accenda 3 led gialli intermittenti e dopo 3 secondi altri 5 led azzurri fissi.

Da quello che scrivi, muovi i primi passi con la programmazione in generale, quindi quello che dovresti fare e più o meno questo:

Dopo i primi sketch debounce, blinkled, ecc passa a studiare il codice di uno degli esempi di uso della seriale di arduino.
Serial.metodo, è un'instanza della classe Serial, che le librerie creano per tè, a te basta usare i metodi offerti dalla classe SerialHardware. Se usi il metodo available come è usato negli esempi, puoi sapere se ci sono dati nel buffer e leggerli, la lettura legge un byte per volta.

Ad esempio dal tuo programma VB invii, nella seriale un byte 65 in decimale, che corrisponde al carattere ASCII 'A' (Apri), mentre per chiudere da VB invii il codice 67 'C' (chiudi).

Lato arduino, usi if (byte='A') oppure usi swicth case, se il dato in ingresso è A, fai fare a micro le cose per Apri, se C fai fare le cose per chiudere.

Questo è il modo per sperimentare, ma poi capito il meccanismo, puoi complicare le cose, creando un codice per entrare in modalità "ricevi comandi" se dopo 1s non arriva nulla esce dalla modalità "ricevi comandi".

Potresti avere la necessità di una modalità "impostazioni", e tutte le altre modalità che ti possano venire in mente come es. test, o un comando S "save", per salvare le impostazioni.

Sul playground italiano trovi un sorgente che ho scritto tempo fà, che ti mostra come gestire le modalità, il salvataggio in EEprom.

Ciao, buon lavoro.

@ MauroTec e altri
h3nk3r e un nome che mio figlia ha scritto per errore quand'era piccola e cosi spesso lo uso
negli account.
qui sotto il codice che "credo" sia nelle linee guida che mi ha dato MauroTec.
Perdonatemi qualche errore che sicuramente mi corregerete.

/*
accensione di 3 led e successivamente di 5 connesso sulla porta 12 e 11
da un comando inviato da VB6 sulla porta seriale (com4).
 
Paolo Con l'aiuto dal forum Arduino (MauroTec e altri)
http://arduino.cc/forum/index.php/topic,59472.0.html

*/
 
#define led 12  // led connesso al pin n°12
#define led2 11  // led connesso al pin n°11
byte carattere = 0;    // variabile per contenere il carattere ricevuto
 
void setup()
	{
	Serial.begin(9600); // imposto la UART per lavorare a 9600
	pinMode(led, OUTPUT); // imposto il pin sul quale è collegato il led come uscita
	pinMode(led2, OUTPUT); // imposto il secondo pin sul quale è collegato il led come uscita
	Serial.flush(); // svuoto il buffer di ricezione seriale
	}
 
void loop()
	{
 
	if (Serial.available() >0) // Controllo se il buffer di ricezione contiene qualcosa
		{
		carattere = Serial.read(); // leggo il carattere ricevuto e lo memorizzo in carattere
		Serial.flush(); // svuoto il buffer di ricezione seriale
 		}


	if (carattere=='A'  || carattere=='a') // ho ricevuto la A maiuscola o minuscola
	{		digitalWrite(led,HIGH); // accendo 3 led gialli collegati alla porta 12
		delay(3000) 
			digitalWrite(led2,HIGH); // accendo 5 led azzurri collegati alla porta 11	
			}

	if (carattere=='C'  || carattere=='c') // ho ricevuto la C maiuscola o minuscola
	{		digitalWrite(led2,LOW); // spengo 5 led azzurri collegati alla porta 11
		delay(3000) 
			digitalWrite(led,LOW); // spengo 3 led gialli collegati alla porta 12
			}
				

	  else // qui ho deciso che in tutte le altre possibilita' resti spento
			{
			digitalWrite(led,LOW); // spengo i 3 led gialli collegati alla
			
			digitalWrite(led2,LOW); // spengo i 5 led azzurri collegati alla
			
			}
 
			
		
		}
	}

grazie aspetterò con ansia gli aiuti.

Dovrebbe funzionare, tuttavia alcuni consigli:
Fai come fanno gli esempi, l'identazione del codice è importante più del codice almeno per me, perchè ti aiuto a rileggere e capire ciò che hai scritto. È facile dire vabbè poi miglioro la leggibilità del codice, e dopo 2 ti ritrovi ad avere aggiuto 200 righe, senza accorgertene, quindi periodicamente migliora la leggibilità.

Ottimo usi i commenti come si dovrebbe, anche perchè aiuta gli altri che non sanno leggere e capire il codice. Questi altri possono anche essere programmatori navigati, per dire siamo sempre principianti in qualcosa.

A voler essere pignolo, la variabile carattere, fà pensare più ad un char che ad un byte, per di più non sò se "read" ritorna "int" o byte, se funziona con byte lo lascerei così, "carattere" lo puoi modificare con "byte_in", "byteIn", "dataIn", o "byte_command".

Non è il caso di fare il match anche del carattere minuscolo, perchè ti fai fuori un valore che ti può servire per altre funzioni, ora non mi viene nessun esempio.

Elettronica:
I led non devi collegarli direttamente al pin di arduino, perchè la corrente sarebbe insufficiente per accenderli, in più rischi di bruciare la porta del micro. Serve un transistore ed ogni led deve avere la sua resistenza per limitare la corrente al valore di massimo 20mA.

Ciao.

grazie :wink: grazie :wink: grazie :wink:

Hai ragione, "carattere" fa pensare ad un char e in merito alla "c" minuscola potevo farne a meno, ma ho pensato che poteva far ricordare a qualcuno inesperto come me che ce differenza tra "C" e "c".

in merito all'hardware non avrei attaccato direttamente al pin i led ma un circuito separato,
ma se mi dicessi i componenti (in valori) che tu useresti per questo circuito ti ringrazierei due volte.

ciao grazie ancora

CIAO

Ho provato a compilare il codice nei post precedente e mi dice :
sketch_apr30a.cpp: In function 'void loop()':
sketch_apr30a:34: error: expected ;' before 'digitalWrite' sketch_apr30a:40: error: expected ;' before 'digitalWrite'

qualcuno ne sa qualcosa?

:wink:

Riprova con questo codice:

void setup()
{
    Serial.begin(9600); // imposto la UART per lavorare a 9600
    pinMode(led, OUTPUT); // imposto il pin sul quale è collegato il led come uscita
    pinMode(led2, OUTPUT); // imposto il secondo pin sul quale è collegato il led come uscita
    Serial.flush(); // svuoto il buffer di ricezione seriale
}
 
void loop()
{

    if (Serial.available() >0) // Controllo se il buffer di ricezione contiene qualcosa
    {
        carattere = Serial.read(); // leggo il carattere ricevuto e lo memorizzo in carattere
	Serial.flush(); // svuoto il buffer di ricezione seriale
    }

    if (carattere=='A'  || carattere=='a') // ho ricevuto la A maiuscola o minuscola
    {		
        digitalWrite(led,HIGH); // accendo 3 led gialli collegati alla porta 12
        delay(3000);
        digitalWrite(led2,HIGH); // accendo 5 led azzurri collegati alla porta 11	
    }

    if (carattere=='C'  || carattere=='c') // ho ricevuto la C maiuscola o minuscola
    {	
	digitalWrite(led2,LOW); // spengo 5 led azzurri collegati alla porta 11
        delay(3000);
	digitalWrite(led,LOW); // spengo 3 led gialli collegati alla porta 12

    } else { // qui ho deciso che in tutte le altre possibilita' resti spento

        digitalWrite(led,LOW); // spengo i 3 led gialli collegati alla
	digitalWrite(led2,LOW); // spengo i 5 led azzurri collegati alla

   }
}

; dopo a fine istruzione sempre, e parentesi graffe e tonde in numero pari sempre.
Identa il codice correttamente, il modo di identare che vedi su, è solo un modo, c'è ne sono altri.
Ciao.

:smiley: :smiley:
e andato compilatooooo.
anche se non ho capito dove dimenticavo il punto e virgola ... avevo guardato questa cosa.

boooo :fearful: :fearful:

ora, provo l'hardware: ho aggiunto dei transistor per evitare che si bruci il pin come dicevi spero funzioni.
ti aggiornerò.

grazie siete troppo gentili in questo forum

Boo, il tag

 non lavora come dovrebbe, non prendere in considerazione l'identazione che ti ho mostrato.
Il ; dopo delay(3000)
e il numero dispari di parentesi.

[quote]grazie siete troppo gentili in questo forum[/quote]

Prego, ma vaffa..... :D (IENE)

Ok ciao, non esitare a postare, troverai sempre qualcuno che ti risponde. 
Ciao.

fatto programma vb6 per testare circuito e sketch i led di Arduino reagiscono quando invio , ma nella breadboard non succede nulla.

allego listato del programma in vb6 che ho fatto e appena posso le foto dei collegamenti.

Private Sub cmdesci_Click()
        MSComm1.Output = "68"
         MSComm1.PortOpen = False
        End
End Sub

Private Sub cmdfine_Click()
        MSComm1.Output = "67"
End Sub

Private Sub cmdinvio_Click()
        MSComm1.Output = "65"
End Sub

Private Sub Form_Load()

        MSComm1.CommPort = 4 'porta com4
        MSComm1.Settings = "9600,n,8,1" 'setto la porta
        On Error Resume Next 'Impostiamo anche PortOpen a True come rilevazioni di errori
        MSComm1.PortOpen = True 'apro la porta

    If Err Then     'controllo l'errore se la porta e chiusa. 
        MsgBox "impossibile aprire la porta: Com" & MSComm1.CommPort & ", controllare collegamenti." & vbCrLf & Error$
    End If
     
        

End Sub

Private Sub MSComm1_OnComm()
         MSComm1.Output = 65
End Sub

intanto schema al volo ........

CIMG1415.JPG

circuito ............

CIMG1410.JPG

le resistenze dei led sono di 680h
le resistenze dei due transistor sono di 10k

MSComm1.Output = "68"

Se così vb invia il codice ASCII 68 allora è corretto, ma da vb mi aspetto che invii una stringa che converte in codice ascii di 6 e di 8 in sequenza, in questo caso MSComm1.Output = "A" dovrebbe funzionare o 'A' (ma dubito che faccia differenza per VB).

Il circuito con i led non dovrebbe funzionare così, emettitore è sollevato da massa, devi invertire il funzionamento.

E(GND) C(LED CATODI) V++(LED ANODO), non importa se le R sono sul catodo o sull'anodo.

Nel codice Arduino puoi mettere un Serial.println("A") dove fai il match del carattere (if (carattere=='A')
e in VB fai un MSComm1.Input o quello che è.

Ciao.

mi ero assentato ( i figli hanno fame)

provero quello che hai detto stasera adesso lavoro.

grazie ancora

:roll_eyes: grazie per il "va fanc ..... (iene) :grin: :grin: :grin: :grin:

provato i consigli di MauroTec e va alla grande ......... Arduino riceve e invia e anche il programma in visual basic6

ma ....... :astonished:
mi si accende i primi 3 led e dopo 3 secondi (3000) dovrebbe accendersi i 5 azzurri e non lo fa.

allego il codice dello sketch e poi quello di vb6 ma credo sia un problema dello sketch perche ho invertito le uscite e si accendono prima i 5 azzurri e dopo 3 secondi restono spenti i 3 gialli.

sketch

/*
accensione di 3 led e successivamente di 5 connesso sulla porta 12 e 11
da un comando inviato da VB6 sulla porta seriale (com4).
 Grazie MarioTec

http://arduino.cc/forum/index.php/topic,59472.0.html

*/
 
#define led 12  // led connesso al pin n°12
#define led2 11  // led connesso al pin n°11
byte carattere = 0;    // variabile per contenere il carattere ricevuto
 

void setup()
{
    Serial.begin(9600); // imposto la UART per lavorare a 9600
    pinMode(led, OUTPUT); // imposto il pin sul quale è collegato il led come uscita
    pinMode(led2, OUTPUT); // imposto il secondo pin sul quale è collegato il led come uscita
    Serial.flush(); // svuoto il buffer di ricezione seriale
}
 
void loop()
{ 

    if (Serial.available() >0) // Controllo se il buffer di ricezione contiene qualcosa
    {
        carattere = Serial.read(); // leggo il carattere ricevuto e lo memorizzo in carattere
	Serial.flush(); // svuoto il buffer di ricezione seriale
    }

    if (carattere=='A'  || carattere=='a') // ho ricevuto la A maiuscola o minuscola?
    {		digitalWrite(led,HIGH); // accendo 3 led gialli collegati alla porta 12
                Serial.print("Hai premuto: ");
		Serial.print(carattere,BYTE);
		Serial.println();

        delay(3000);
        digitalWrite(led2,HIGH); // accendo 5 led azzurri collegati alla porta 11	
    }

    if (carattere=='C'  || carattere=='c') // ho ricevuto la C maiuscola o minuscola
    {		digitalWrite(led2,LOW); // spengo 5 led azzurri collegati alla porta 11
                Serial.print("Led spenti");
                Serial.println();

        delay(3000);
	digitalWrite(led,LOW); // spengo 3 led gialli collegati alla porta 12
    } else { // qui ho deciso che in tutte le altre possibilita' resti spento
			
        digitalWrite(led,LOW); // spengo i 3 led gialli collegati alla
	digitalWrite(led2,LOW); // spengo i 5 led azzurri collegati alla
    }
    
}

codice vb6
```
[u]**Private Sub cmdesci_Click()
        MSComm1.Output = "68"
        MSComm1.PortOpen = False
        End
End Sub

Private Sub cmdfine_Click()
        MSComm1.Output = "c"
     
        txttx.Text = ""
        Dim datirx
    datirx = MSComm1.Input ' Leggo il contenuto del buffer di ricezione (e svuoto .Input)
    If Len(datirx) Then ' Se ho ricevuto qualcosa lo scrivo nella TextBox
        txtrx.Text = txtrx.Text & datirx
        End If
End Sub

Private Sub cmdinvio_Click()
        MSComm1.Output = "a"
        txttx.Text = ""
     
        Dim datitx
    datitx = MSComm1.Input ' Leggo il contenuto del buffer di ricezione (e svuoto .Input)
    If Len(datitx) Then ' Se ho ricevuto qualcosa lo scrivo nella TextBox
        txttx.Text = txttx.Text & datitx
        End If
End Sub
Private Sub Form_Load()
        MSComm1.CommPort = 4 'porta com4
        MSComm1.Settings = "9600,n,8,1" 'setto la porta
        MSComm1.RThreshold = 1 ' voglio essere informato della ricezione di ogni singolo carattere

On Error Resume Next 'Impostiamo anche PortOpen a True come rilevazioni di errori
        MSComm1.PortOpen = True 'apro la porta
    If Err Then
        MsgBox "impossibile aprire la porta: Com" & MSComm1.CommPort & ", controllare collegamenti." & vbCrLf & Error$
    End If

End Sub

Private Sub MSComm1_OnComm()
Dim Rx$
    Rx$ = MSComm1.Input ' Leggo il contenuto del buffer di ricezione (e svuoto .Input)
    If Len(Rx$) Then ' Se ho ricevuto qualcosa lo scrivo nella TextBox
        txttx.Text = txttx.Text & Rx$
    End If
End Sub

Private Sub txttx_KeyPress(KeyAscii As Integer)
       
        MSComm1.Output = Chr$(KeyAscii)

End Sub**[/u]
```
se qualche anima gentile vuole avventurarsi ... :wink: :wink: :wink:

ma ....... smiley-eek
mi si accende i primi 3 led e dopo 3 secondi (3000) dovrebbe accendersi i 5 azzurri e non lo fa.

Mi son perso una replica, ma il sito prima mi avvisava ora non più, comunque meglio così.

if (Serial.available() >0) // Controllo se il buffer di ricezione contiene qualcosa
{
    if (carattere=='A'  || carattere=='a') // ho ricevuto la A maiuscola o minuscola?
    {	....
     eccetera
}

In questo modo il codice non viene eseguito se non ci sono caratteri nel buffer della seriale, devi solo creare delle funzioni che accendono e spengono i led come vuoi tu, queste le chiami da dentro if {..

Al posto delle if puoi usare il costrutto switch case che prevede anche un condizione di default che entra in gioco quando nessuna delle condizioni precedenti si è verificata.

Ciao.