PROBLEMA Arduino - Effetto fade in VB.NET

marco.santilli

Utente Attivo
228
12
CPU
i7 3770K
Dissipatore
Corsair Hydro H80
Scheda Madre
Asus P8z77-V Deluxe
HDD
SSD 850 pro - 256Gb
RAM
2x4Gb Corsair Vengeance 2133MHz CL9
GPU
ASUS GTX 1060 Dual
Monitor
Asus MG279Q
PSU
Enermax Revolution87+ - 650W
Case
Thermaltake Kandalf 25cm Fan
OS
WIN10
Ho acquistato questa scheda

mi serve per creare dissolvenze per una centralina per presepe...
quindi passaggio tra giorno al tramonto alla note all'alba
il classico ciclo giornaliero...
usando codice di arduino mi funziona usando una sola lampada

Codice:
#include <dimmable_light.h>

const int syncPin = 13;
const int thyristorPin = 14;

DimmableLight light(thyristorPin);

// Delay between brightness increments, in milliseconds
const int period = 50;

void setup() {
  Serial.begin(115200);
  while (!Serial)
    ;
  Serial.println();
  Serial.println("Dimmable Light for Arduino: first example");

  Serial.print("Initializing DimmableLight library... ");
  DimmableLight::setSyncPin(syncPin);
  // VERY IMPORTANT: Call this method to activate the library
  DimmableLight::begin();
  Serial.println("Done!");
}

void loop() {
  for (int i = 0; i < 256; i++) {
    light.setBrightness(i);
    delay(period);
  }
}


a me servirebbe per VB.NET perchè sto costruendo un programma direttamente connesso al pc...
qualcuno sa aiutarmi??, del codice gia provato???


utilizzo come oggetto la "firmataVB" che si carica da arduino e mi sono sempre trovato bene, ma non riesco a gestire questo effetto FADE.


ciao e grazieeeeee
 

bigendian

Utente Attivo
751
432
OS
Linux
DimmableLight e' una libreria, piuttosto complessa, visto che gli SCR che vuoi controllare hanno bisogno di un controllo piuttosto complesso con inpulsi in fase con l'alternata.


Quello che puoi fare e' integrare il codice firmata a quello che hai postato, tramite libreria firmata, settare la callback su STRING_DATA e attivare il dimming con dei comandi stringa "dimming 10" "dimming 100" etc.

 

Dumah Brazorf

Utente cAttivo
Utente Èlite
7,639
3,556
Non ho ben capito come vuoi fare.
Ti colleghi direttamente in seriale dal pc? Quindi nel loop avrai un sdata = Serial.readStringUntil('\n'); con sdata stringa, leggi i comandi che arrivano dalla seriale ed esegui. Quindi potresti avere un comando NOTTE(pin) e uno GIORNO(pin) o un comando DIM(pin, brighness, delay) dove gli dici la luminosità voluta (da 0 a 255) e in quanti secondi/millisecondi raggiungerlo. Dal pc passi il comando via seriale e ti salvi da qualche parte per ogni canale il brightness attuale, quello voluto, e quanti secondi/cicli di loop mancano.
Quindi ogni loop comincia con lettura seriale, eventuale modifica delle variabili ed esecuzione variazione luci su ogni canale.
 
Ultima modifica:

marco.santilli

Utente Attivo
228
12
CPU
i7 3770K
Dissipatore
Corsair Hydro H80
Scheda Madre
Asus P8z77-V Deluxe
HDD
SSD 850 pro - 256Gb
RAM
2x4Gb Corsair Vengeance 2133MHz CL9
GPU
ASUS GTX 1060 Dual
Monitor
Asus MG279Q
PSU
Enermax Revolution87+ - 650W
Case
Thermaltake Kandalf 25cm Fan
OS
WIN10
DimmableLight e' una libreria, piuttosto complessa, visto che gli SCR che vuoi controllare hanno bisogno di un controllo piuttosto complesso con inpulsi in fase con l'alternata.


Quello che puoi fare e' integrare il codice firmata a quello che hai postato, tramite libreria firmata, settare la callback su STRING_DATA e attivare il dimming con dei comandi stringa "dimming 10" "dimming 100" etc.


domani pomeriggio (che sono libero) provo a dargli un occhio......
intanto grazie... poi se mi serve provo a chiederti qualcosa e vediamo se insieme riusciamo a costruirlo
Post unito automaticamente:

Non ho ben capito come vuoi fare.
Ti colleghi direttamente in seriale dal pc? Quindi nel loop avrai un sdata = Serial.readStringUntil('\n'); con sdata stringa, leggi i comandi che arrivano dalla seriale ed esegui. Quindi potresti avere un comando NOTTE(pin) e uno GIORNO(pin) o un comando DIM(pin, brighness, delay) dove gli dici la luminosità voluta (da 0 a 255) e in quanti secondi/millisecondi raggiungerlo. Dal pc passi il comando via seriale e ti salvi da qualche parte per ogni canale il brightness attuale, quello voluto, e quanti secondi/cicli di loop mancano.
Quindi ogni loop comincia con lettura seriale, eventuale modifica delle variabili ed esecuzione variazione luci su ogni canale.

si utlizzo una libreria che si chiamata FirmataVB
ti permette di inviare comandi ad arduino che poi li esegue, praticamente sfrutti tutte le funzionalità del pc e hardware di arduino

nel mio caso della centralina presepe gestisco:
- una scheda con relè: luci case, movimentazione pupetti meccanici giorni, pupetti meccanici notte
- motori passo passo con fine corsa che aprono portoni e finestre
- una dissolvenza, quella che sto cercando di far funzionante sotto vb.net

ti faccio un esempio di questa libreria

accende e spegne relè
Codice:
 FirmataVB1.DigitalWrite(LuciCase01, LOW)
 FirmataVB1.DigitalWrite(LuciCase02, HIGH)

comanda un motore passo passo
Codice:
 For i = 0 To passi

            If motore_attivo_01 = True Then     
            
                FirmataVB1.DigitalWrite(Fase04, HIGH)
                FirmataVB1.DigitalWrite(Fase03, LOW)
                FirmataVB1.DigitalWrite(Fase02, LOW)
                FirmataVB1.DigitalWrite(Fase01, LOW)
                Thread.Sleep(motor_Speed)
                FirmataVB1.DigitalWrite(Fase04, LOW)
                FirmataVB1.DigitalWrite(Fase03, HIGH)
                FirmataVB1.DigitalWrite(Fase02, LOW)
                FirmataVB1.DigitalWrite(Fase01, LOW)
                Thread.Sleep(motor_Speed)
                FirmataVB1.DigitalWrite(Fase04, LOW)
                FirmataVB1.DigitalWrite(Fase03, LOW)
                FirmataVB1.DigitalWrite(Fase02, HIGH)
                FirmataVB1.DigitalWrite(Fase01, LOW)
                Thread.Sleep(motor_Speed)
                FirmataVB1.DigitalWrite(Fase04, LOW)
                FirmataVB1.DigitalWrite(Fase03, LOW)
                FirmataVB1.DigitalWrite(Fase02, LOW)
                FirmataVB1.DigitalWrite(Fase01, HIGH)
                Thread.Sleep(motor_Speed)

            Else
                Exit For
            End If


        Next


ovviamente può ricevere INPUT che gestisci con il PC ed esegui ulteriori funzioni
 
Ultima modifica:

marco.santilli

Utente Attivo
228
12
CPU
i7 3770K
Dissipatore
Corsair Hydro H80
Scheda Madre
Asus P8z77-V Deluxe
HDD
SSD 850 pro - 256Gb
RAM
2x4Gb Corsair Vengeance 2133MHz CL9
GPU
ASUS GTX 1060 Dual
Monitor
Asus MG279Q
PSU
Enermax Revolution87+ - 650W
Case
Thermaltake Kandalf 25cm Fan
OS
WIN10
DimmableLight e' una libreria, piuttosto complessa, visto che gli SCR che vuoi controllare hanno bisogno di un controllo piuttosto complesso con inpulsi in fase con l'alternata.


Quello che puoi fare e' integrare il codice firmata a quello che hai postato, tramite libreria firmata, settare la callback su STRING_DATA e attivare il dimming con dei comandi stringa "dimming 10" "dimming 100" etc.



allora.... ho provato a fare una funziona easy su arduino studio

Codice:
/*==============================================================================
 * TEST LUCI
 *============================================================================*/
const int syncPin = 3;
const int thyristorPin = 5;
const int pausaTempo = 2000;


/*==============================================================================
 * FUNZIONE TEST
 *============================================================================*/
void accensioneLuci() {

  digitalWrite(syncPin, HIGH);
  digitalWrite(thyristorPin, HIGH);
  delay(pausaTempo);
  digitalWrite(syncPin, LOW);
  digitalWrite(thyristorPin, LOW);
   delay(pausaTempo);
   digitalWrite(syncPin, HIGH);
  digitalWrite(thyristorPin, HIGH);
  delay(pausaTempo);
  digitalWrite(syncPin, LOW);
  digitalWrite(thyristorPin, LOW);
}



/*==============================================================================
 * LOOP()
 *============================================================================*/
void loop()
{
// test luci
accensioneLuci();
}

tutto dentro la firmata....
lanciata su arduino....
ed ha iniziato a lampeggiare la luce indicata...


quindi ora tolgo:
accensioneLuci();
da dentro LOOP

e devo predisporre tutto per farla invocare da vb.net
poi procedo con il passo successivo, cioè l'effetto fade....
per adesso provavo con semplice accendi e spegni...

sapere aiutarmi su questo passaggio successivo????
 

bigendian

Utente Attivo
751
432
OS
Linux
1 - crea un main loop classico per riceve i comandi firmata
2 - imposta la callback su stringa (vedi doc)
3 - su stringa "accendi-luci", quindi controllando il comando dalla callback (strcmp), chiama accensioneLuci().

4 - crea altri comanti a piacimento, dalal callback avrai
C:
if (strcmp(comando, "accendi-luci") == 0) {
    accendiLuci();
} else if (strcmp(comando, "spegni-luci") == 0) {
    spegniLuci();
} else if
    eccetera
 

marco.santilli

Utente Attivo
228
12
CPU
i7 3770K
Dissipatore
Corsair Hydro H80
Scheda Madre
Asus P8z77-V Deluxe
HDD
SSD 850 pro - 256Gb
RAM
2x4Gb Corsair Vengeance 2133MHz CL9
GPU
ASUS GTX 1060 Dual
Monitor
Asus MG279Q
PSU
Enermax Revolution87+ - 650W
Case
Thermaltake Kandalf 25cm Fan
OS
WIN10
1 - crea un main loop classico per riceve i comandi firmata
2 - imposta la callback su stringa (vedi doc)
3 - su stringa "accendi-luci", quindi controllando il comando dalla callback (strcmp), chiama accensioneLuci().

4 - crea altri comanti a piacimento, dalal callback avrai
C:
if (strcmp(comando, "accendi-luci") == 0) {
    accendiLuci();
} else if (strcmp(comando, "spegni-luci") == 0) {
    spegniLuci();
} else if
    eccetera

scusami ma mi sono intrecciato nei passaggi...
anche perchè su arduino studio non ci lavoro, ho sempre fatto progetti con firmata, comandando tutto da vb.net

(intanto grazie per l'aiuto)
possiamo fare passo passo?
grazie ancora

1.
- crea un main loop classico per riceve i comandi firmata
questo dovrei farlo su arduino studio nel file firmata
ho letto una cosa del genere non so se si tratta di questo
Codice:
void setup()
{
  Firmata.attach(DIGITAL_MESSAGE, funzionaCallback);
}

void funzionaCallback()
{
  pinMode(1, OUTPUT);
  digitalWrite(1, HIGH);
}

oppure loop dentro vb.net che controlla arduino seriale
Codice:
Private Sub SerialPort1_DataReceived(sender As Object, e As SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived

    'Searching for data input
    Dim ReadCode As String
    ReadCode = SerialPort1.ReadLine

    UpdateHintRequest(ReadCode)

End Sub


2 - imposta la callback su stringa (vedi doc)
cercando in giro ho trovato questo nella guida

Codice:
#include <Firmata.h>

void stringCallback(char *myString)
{
    Firmata.sendString(myString);
    digitalWrite(13,HIGH);
    delay(50);
    digitalWrite(13,LOW);
}

questo potrebbe essere il mio TEST?

Codice:
void accensioneLuci() {

  digitalWrite(syncPin, HIGH);
  digitalWrite(thyristorPin, HIGH);
  delay(pausaTempo);
  digitalWrite(syncPin, LOW);
  digitalWrite(thyristorPin, LOW);
   delay(pausaTempo);
   digitalWrite(syncPin, HIGH);
  digitalWrite(thyristorPin, HIGH);
  delay(pausaTempo);
  digitalWrite(syncPin, LOW);
  digitalWrite(thyristorPin, LOW);
}

3 - su stringa "accendi-luci", quindi controllando il comando dalla callback (strcmp), chiama accensioneLuci().

questo codice sotto andrebbe su arduino?

Codice:
if (strcmp(comando, "accendi-luci") == 0) {
    accensioneLuci();
} else if (strcmp(comando, "spegni-luci") == 0) {
    spegniLuci();
} else if
    eccetera

ma per "comando" cosa intendi.... per il comando è "accendi-luci" che invoca su arduino accensioneLuci();


mi si è mischiato tutto..
non ho capito, cosa va su arduinoFirmata e cosa su VB.NET per invocare la funziona in accensioneLuci(); FIRMATA

scusami, e grazie ancora per la pazienza...
 

bigendian

Utente Attivo
751
432
OS
Linux
Non ho mai usato firmata, ma altro non e' che un modo di comunicare via seriale da PC (vb) con dei comandi.

Lato PC, da visual basic, invierai dei comandi stringa.

Lato arduino

C:
/* Bigendian for Tom's Hardware (C) 2024 */

#include <Firmata.h>

void spegniLuci() {
    /* netti qui il tupo codice */
}

void accensioneLuci() {
    digitalWrite(syncPin, HIGH);
    digitalWrite(thyristorPin, HIGH);
    delay(pausaTempo);
    digitalWrite(syncPin, LOW);
    digitalWrite(thyristorPin, LOW);
    delay(pausaTempo);
    digitalWrite(syncPin, HIGH);
    digitalWrite(thyristorPin, HIGH);
    delay(pausaTempo);
    digitalWrite(syncPin, LOW);
    digitalWrite(thyristorPin, LOW);
}

void stringCallback(char *str)
{
    if (strcmp(str, "accendi-luci") == 0)
        accensioneLuci():
    else if ((strcmp(str, "spegni-luci") == 0)
        spegniLuci();
}

void setup()
{
    Firmata.setFirmwareVersion(FIRMATA_FIRMWARE_MAJOR_VERSION,
                FIRMATA_FIRMWARE_MINOR_VERSION);
    Firmata.attach(STRING_DATA, stringCallback);

    Firmata.begin(57600);
}

void loop()
{
    while (Firmata.available()) {
        Firmata.processInput();
    }
}
Post unito automaticamente:

fammi sapere se va
 

marco.santilli

Utente Attivo
228
12
CPU
i7 3770K
Dissipatore
Corsair Hydro H80
Scheda Madre
Asus P8z77-V Deluxe
HDD
SSD 850 pro - 256Gb
RAM
2x4Gb Corsair Vengeance 2133MHz CL9
GPU
ASUS GTX 1060 Dual
Monitor
Asus MG279Q
PSU
Enermax Revolution87+ - 650W
Case
Thermaltake Kandalf 25cm Fan
OS
WIN10
Codice:
void stringCallback(char *str)
{
    if (strcmp(str, "accendi-luci") == 0)
        accensioneLuci():
    else if ((strcmp(str, "spegni-luci") == 0)
        spegniLuci();
}

lato vb.net non ho trovato un codice...per richiamare la funzione
anche perchè non riesco ad interpretare quel ==0

quindi ho provato altro codice...
che riporto qui sotto

LATO FIRMATA:
Codice:
/*==============================================================================
 * TEST LUCI
 *============================================================================*/
const int syncPin = 3;
const int thyristorPin = 5;

void loop()
{

String rx="";
     
    if (Serial.available() > 0)
       {
        rx = Serial.readString();
       if(rx=="ACCENDI")
        {
         digitalWrite(syncPin, HIGH);
          digitalWrite(thyristorPin, HIGH);      
        }
        if(rx=="SPEGNI")
        {
         digitalWrite(syncPin, LOW);
          digitalWrite(thyristorPin, LOW);      
        }
         if(rx=="SERIE")
        {
        accensioneLuci();      
        }
        }
}

void accensioneLuci() {
  digitalWrite(syncPin, HIGH);
  digitalWrite(thyristorPin, HIGH);
  delay(pausaTempo);
  digitalWrite(syncPin, LOW);
  digitalWrite(thyristorPin, LOW);
   delay(pausaTempo);
   digitalWrite(syncPin, HIGH);
  digitalWrite(thyristorPin, HIGH);
  delay(pausaTempo);
  digitalWrite(syncPin, LOW);
  digitalWrite(thyristorPin, LOW);
}

LATO VB.NET
Ho provato ad invocarla sia tramite firmata:
Codice:
  Private Sub btnFirmataAccendiLuci_Click(sender As Object, e As EventArgs) Handles btnFirmataAccendiLuci.Click
        frmPannello.FirmataVB1.SerialPort1.Write("ACCENDI")
    End Sub

    Private Sub btnFirmataSpegniLuci_Click(sender As Object, e As EventArgs) Handles btnFirmataSpegniLuci.Click
        frmPannello.FirmataVB1.SerialPort1.Write("SPEGNI")
    End Sub
    Private Sub btnFirmataAccendiSerie_Click(sender As Object, e As EventArgs) Handles btnFirmataAccendiSerie.Click
        frmPannello.FirmataVB1.SerialPort1.Write("SERIE")
    End Sub

che diretto alla seriale:
Codice:
 Private Sub btnSerialeAccendiLuci_Click(sender As Object, e As EventArgs) Handles btnSerialeAccendiLuci.Click

        frmPannello.SerialPort1.Open()
        frmPannello.SerialPort1.Write("ACCENDI")
        frmPannello.SerialPort1.Close()
    End Sub

    Private Sub btnSerialeSpegniLuci_Click(sender As Object, e As EventArgs) Handles btnSerialeSpegniLuci.Click

        frmPannello.SerialPort1.Open()
        frmPannello.SerialPort1.Write("SPEGNI")
        frmPannello.SerialPort1.Close()
    End Sub

    Private Sub btnSerialeAccendiSerie_Click(sender As Object, e As EventArgs) Handles btnSerialeAccendiSerie.Click

        frmPannello.SerialPort1.Open()
        frmPannello.SerialPort1.Write("SERIE")
        frmPannello.SerialPort1.Close()
    End Sub

    Private Sub btnConnettiSeriale_Click(sender As Object, e As EventArgs) Handles btnConnettiSeriale.Click
        frmPannello.SerialPort1.BaudRate = 57600
        frmPannello.SerialPort1.DataBits = 8
        frmPannello.SerialPort1.Parity = Parity.None
        frmPannello.SerialPort1.PortName = "COM4"
        frmPannello.SerialPort1.StopBits = StopBits.One
        frmPannello.SerialPort1.Handshake = Handshake.None

    End Sub


cosi mi funziona... ma ho notato una cosa...

accendere e spegnere luci usando la firmata, è superveloce... (vb.net connesso direttamente ad arduino)

invece invocando la funzione presente dentro alla firmata (vb.net che richiama funzione di arduino), è molto lento, ci impiega quasi un secondo di tempo prima di accendere o spegnere...
altra cosa che ho notato, non sempre al primo click esegue la funzione, devo cliccare la seconda volta..
come se arduino fosse impegnato a fare altro e quindi non sempre riceve e quando riceve è più lento...

utilizzando il codice che mi hai fornito, secondo te è più veloce?
la mia sto all'interno del LOOP, il tuo giro esternamente, quindi potrebbe essere più veloce...
 

bigendian

Utente Attivo
751
432
OS
Linux
invece invocando la funzione presente dentro alla firmata (vb.net che richiama funzione di arduino),
Non mi e' chiaro, cosa intendi ?
VB puo solo inviare dei comandi seriali, non e' che fa altro. Ve benissimo con
frmPannello.FirmataVB1.SerialPort1.Write("ACCENDI")


Perche utilizzi l'oggetto Serial in arduino per ricevere se dovresti usare Firmata.processInput(); ?

strcmp e' una semplice funzione C, senza usar oggetti stringa in arduino che non so che overhead abbiano.
== 0 significa stringhe uguali.
 

bigendian

Utente Attivo
751
432
OS
Linux
Novita ? Ma non serve ne firmata ne VB per una cosa del genere, pio usare Serial e lato pc basta un terminale che invia comandi
 

Entra

oppure Accedi utilizzando
Discord Ufficiale Entra ora!