Arduino + VB + Comunicação SerialPort + Dúvidas

bubulindo:
Isto funciona para mim... apesar de haver os problemas que o Hugo indicou.

Já agora... o pino 13 e 12 do Uno não são pinos de PWM.

Para experimentares este código, abre o Serial Port... escolhe No Line Ending, escreve 255H ou 005Q e carrega em send. O valor que escreveste é-te reenviado de volta.

Não faz nada na mesma bubulindo :s

Estranhamente isso funciona no meu...

Recebes de volta o valor que enviaste? Ou estás à espera que o LED acenda?

bubulindo:
Estranhamente isso funciona no meu...

Recebes de volta o valor que enviaste? Ou estás à espera que o LED acenda?

Envio um valor e mostra-me um caracter estranho ns consola do vb

bubulindo:
Para experimentares este código, abre o Serial Port... escolhe No Line Ending, escreve 255H ou 005Q e carrega em send. O valor que escreveste é-te reenviado de volta.

Eu escrevi isto... estás a fazer isto? Eu referia-me ao Serial Port do Arduino.

Também escrevi isto:

bubulindo:
Já agora... o pino 13 e 12 do Uno não são pinos de PWM.

Que placa estás a usar?

Repara também que eu configurei o código para usar uma baud de 19200... a tua aplicação está configurada para que baud rate?

bubulindo:

bubulindo:
Para experimentares este código, abre o Serial Port... escolhe No Line Ending, escreve 255H ou 005Q e carrega em send. O valor que escreveste é-te reenviado de volta.

Eu escrevi isto... estás a fazer isto? Eu referia-me ao Serial Port do Arduino.

Também escrevi isto:

bubulindo:
Já agora... o pino 13 e 12 do Uno não são pinos de PWM.

Que placa estás a usar?

Repara também que eu configurei o código para usar uma baud de 19200... a tua aplicação está configurada para que baud rate?

Bem visto, tinha que mudar o baud -.-
Agora ja faz o que eu quero no Serial Port do Arduino, nao consigo é no VB, estou a tentar assim :

 Dim i As Integer = TrackBar1.Value
        Dim inta As String
        SerialPort1.Open()
        If i < 10 Then
            inta = "00" & i
        ElseIf i < 100 And i >= 10 Then
            inta = "0" & i
        Else
            inta = i
        End If

        SerialPort1.Write(inta + "H")
        System.Threading.Thread.Sleep(5)
        SerialPort1.Close()

Não será mais simples fazer algo assim:

Dim i As Integer = TrackBar1.Value
SerialPort1.Write(i.toString("D3") + "H")

Nota que sempre que abres e fechas o Serial Port no Windows, o Arduino faz um reset... logo este comando nunca é "ouvido".

O ideal é abrir o Serial Port no início da aplicação e quando fechares a aplicação, fechares o Serial Port. Claro que mais tarde, terás de desactivar o auto-reset para fazer algo disto.

bubulindo:
Não será mais simples fazer algo assim:

Dim i As Integer = TrackBar1.Value

SerialPort1.Write(i.toString("D3") + "H")




Nota que sempre que abres e fechas o Serial Port no Windows, o Arduino faz um reset... logo este comando nunca é "ouvido". 

O ideal é abrir o Serial Port no início da aplicação e quando fechares a aplicação, fechares o Serial Port. Claro que mais tarde, terás de desactivar o auto-reset para fazer algo disto.

Deu assim

Dim i As String = Format(TrackBar1.Value, "000") + "A"
SerialPort1.Write(i)
System.Threading.Thread.Sleep(5)

O pior agora é que eu queria ter 8 divisões distintas e a placa que tenho só tem 6 pinos PWM -.-

ups...

bubulindo:
ups...

Pois, ahah.
E se for utilizar o shield Ethernet ainda fico com menos ou nao?

Depende do shield... Mas é provável...
Qual era o modelo de shield que estavas a pensar usar? Tens a certeza que te queres meter nisso com o que sabes de C?

bubulindo:
Depende do shield... Mas é provável...
Qual era o modelo de shield que estavas a pensar usar? Tens a certeza que te queres meter nisso com o que sabes de C?

O shield é este http://arduino.cc/en/uploads/Main/ArduinoEthernetShield_R3_Front.jpg

Ya vai ser complicado mas era a minha ideia ..

Só queria criar um site simples para desligar e ligar via internet, penso que não é muito complicado (acho eu).
Não sei é até que ponto dá para estar a utilizar o programa em vb e ao mesmo tempo ligar e desligar via ethernet

Sim, com esse shield vais perder pinos com PWM.

bubulindo:
Sim, com esse shield vais perder pinos com PWM.

Ya, o pino 10 pelo menos.
Mas mesmo assim consigo dar a volta, basta tirar uma divisao, sem problema

3... pelas minhas contas.

bubulindo:
3... pelas minhas contas.

Tive a mudar o programa e ficou assim no arduino:

int PinoV = 11;
int PinoH= 10;
int PinoS=9;
int PinoC = 6;
int PinoJ= 5;
int PinoR=7; //Não é PWM
int PinoQ = 4;
int PinoB= 2; //Não é PWM

void setup(){
  pinMode(PinoV,OUTPUT);
  pinMode(PinoH,OUTPUT);
  pinMode(PinoS,OUTPUT);
  pinMode(PinoC,OUTPUT);
  pinMode(PinoJ,OUTPUT);
  pinMode(PinoR,OUTPUT);
  pinMode(PinoQ,OUTPUT);
  pinMode(PinoB,OUTPUT);
  Serial.begin(19200);
}
void loop (){
  char pwm[4];
  unsigned char pwm_int = 0;
 
if (Serial.available() >= 4) {
//ler PWM
  for (int i = 0; i < 3; i++){
    pwm[i] = Serial.read();
}
  pwm[3] = '\0';
  pwm_int = atoi(pwm);
  switch(Serial.read()) {
    case 'V': {
          analogWrite(PinoV, pwm_int);
          Serial.println(pwm_int);
          break;}
    case 'H': {
          analogWrite(PinoH, pwm_int);
          Serial.println(pwm_int);
          break; }
    case 'S': {
          analogWrite(PinoS, pwm_int);
          Serial.println(pwm_int);
          break; }
    case 'C': {
          analogWrite(PinoC, pwm_int);
          Serial.println(pwm_int);
          break; }
    case 'J': {
          analogWrite(PinoJ, pwm_int);
          Serial.println(pwm_int);
          break; }
    case 'R': {
          analogWrite(PinoR, pwm_int);
          Serial.println(pwm_int);
          break; }
    case 'Q': {
          analogWrite(PinoQ, pwm_int);
          Serial.println(pwm_int);
          break; }
    case 'B': {
          analogWrite(PinoB, pwm_int);
          Serial.println(pwm_int);
          break; }
    
    }
}
}

O PinoR e o PinoB não vão ter dimmer, vai ser só ligar e desligar.
Se meter mais uma divisao assim a ligar e desligar só, já dá.

O analogWrite não faz nada em pinos digitais...

if(pwm_int == 0) {
    digitalWrite(pino, LOW);
} else {
    digitalWrite(pino, HIGH);
}

bubulindo:
O analogWrite não faz nada em pinos digitais...

if(pwm_int == 0) {

digitalWrite(pino, LOW);
} else {
    digitalWrite(pino, HIGH);
}

Tambem funcionava da outra maneira mas se assim está mais correto deixo da tua maneira :wink:

bubulindo:
O analogWrite não faz nada em pinos digitais...

Como é que através do vb consigo saber o estado do LED? (Se está ligado, desligado ou a sua intensidade)

Envias um "comando" para o Arduino a questionar o estado do LED que pretendes... e o Arduino responde.

bubulindo:
Envias um "comando" para o Arduino a questionar o estado do LED que pretendes... e o Arduino responde.

Pois não sei é como