Ir ao conteúdo

Posts recomendados

Postado

Olá boa tarde pessoal, estou desenvolvendo meu projeto de TCC, vai ser basicamente uma automação residencial controlada por voz e por bluetooth, programados no sentido de comando pai e comando filho por voz, e acionarem apenas os eletronicos por bluetooth, porém, me deparei com um problema que estou perdendo as esperanças já, não consigo conciliar o modulo de voz e o bluetooth para funcionarem simultâneamente, ele até compila e tal porém na hora de dar os comandos de voz ou bluetooth nenhum dos dois funciona. 

 

Placa Arduino MEGA 2560

Modulo de voz VR3 (Voice Recognition)

Modulo Bluetooth HC-06

//AUTOMAÇÃO RESIDENCIAL VIA BLUETOOTH E CONTROLE DE VOZ TCC 2020
#include <SoftwareSerial.h>
#include "VoiceRecognitionV3.h"

/**        
  Connection
  Arduino    VoiceRecognitionModule
   52   ------->     TX
   53   ------->     RX
*/


VR myVR(52,53);    // 52:RX 53:TX, you can choose your favourite pins.
SoftwareSerial bt_serial(50,51);//RX e TX BLUETOOTH

uint8_t records[7]; // save record
uint8_t buf[64];

// Leds indicadores de pais e filhos
int Led_Arduino = 13;
int Led_Ligar = 12;
int Led_Desligar = 11;
int Led_Lampada = 10;
int Led_TV = 9;
int Led_Portao = 8;

unsigned long tempo_limite;
unsigned long tempo_espera;


// Variaveis para armazenar o estado do comando reconhecido
boolean comando_Arduino = false;
boolean comando_Ligar = false;
boolean comando_Desligar = false;
boolean comando_Lampada = false;
boolean comando_TV = false;
boolean comando_Portao = false;

//COMANDO AVÔ
#define Arduino (0)  

//COMANDOS PAIS
#define Ligar (1) 
#define Desligar (2)

//COMANDOS FILHOS
#define Lampada (3) 
#define TV (4) 
#define Portao (5) 




void printSignature(uint8_t *buf, int len)
{
  int i;
  for(i=0; i<len; i++){
    if(buf[i]>0x19 && buf[i]<0x7F){
      Serial.write(buf[i]);
    }
    else{
      Serial.print("[");
      Serial.print(buf[i], HEX);
      Serial.print("]");
    }
  }
}

/**
  @brief   Print signature, if the character is invisible, 
           print hexible value instead.
  @param   buf  -->  VR module return value when voice is recognized.
             buf[0]  -->  Group mode(FF: None Group, 0x8n: User, 0x0n:System
             buf[1]  -->  number of record which is recognized. 
             buf[2]  -->  Recognizer index(position) value of the recognized record.
             buf[3]  -->  Signature length
             buf[4]~buf[n] --> Signature
*/
void printVR(uint8_t *buf)
{
  Serial.println("VR Index\tGroup\tRecordNum\tSignature");

  Serial.print(buf[2], DEC);
  Serial.print("\t\t");

  if(buf[0] == 0xFF){
    Serial.print("NONE");
  }
  else if(buf[0]&0x80){
    Serial.print("UG ");
    Serial.print(buf[0]&(~0x80), DEC);
  }
  else{
    Serial.print("SG ");
    Serial.print(buf[0], DEC);
  }
  Serial.print("\t");

  Serial.print(buf[1], DEC);
  Serial.print("\t\t");
  if(buf[3]>0){
    printSignature(buf+4, buf[3]);
  }
  else{
    Serial.print("NONE");
  }
  Serial.println("\r\n");
}

void setup()
{
  /** initialize */
  myVR.begin(9600);
  bt_serial.begin(9600);
  
  Serial.begin(9600);
  Serial.println("COMANDOS PAIS E FILHOS");
 

  // Declarar todos pinos como saída para os LEds
  pinMode(Led_Arduino, OUTPUT);
  pinMode(Led_Ligar, OUTPUT);
  pinMode(Led_Desligar, OUTPUT);
  pinMode(Led_Lampada, OUTPUT);
  pinMode(Led_TV, OUTPUT);
  pinMode(Led_Portao, OUTPUT);
    
  if(myVR.clear() == 0){
    Serial.println("Recognizer cleared.");
  }else{
    Serial.println("Not find VoiceRecognitionModule.");
    Serial.println("Please check connection and restart Arduino.");
    while(1);
  }

  //Carregar todos os comandos no VR3
  if(myVR.load((uint8_t)Arduino) >= 0){
    Serial.println("onRecord loaded");
  }
  
  if(myVR.load((uint8_t)Desligar) >= 0){
    Serial.println("offRecord loaded");
  }

  
  if(myVR.load((uint8_t)Ligar) >= 0){
    Serial.println("onRecord loaded");
  }
  
  if(myVR.load((uint8_t)Lampada) >= 0){
    Serial.println("offRecord loaded");
  }


 
  
  if(myVR.load((uint8_t)TV) >= 0){
    Serial.println("offRecord loaded");
  }

 if(myVR.load((uint8_t)Portao) >= 0){
    Serial.println("onRecord loaded");
  }
  
}

void loop()
{
  
  int ret;
  ret = myVR.recognize(buf, 50);
  
  if(ret>0){
    switch(buf[1]){
     // Verifica se o comando Arduino para iniciar o sistema foi reconhecido
      case Arduino:
      
            // Verifica se o sistema já está iniciado

            
            if(comando_Arduino==false){// COMANDO CASO MODULO DE VOZ DESLIGADO UTILIZA BLUETOOTH
    char c=bt_serial.read();
           if(c=='A'){digitalWrite(Led_Lampada,HIGH);}// LIga lampada BLuetooth
           if(c=='a'){digitalWrite(Led_Lampada,LOW);}

           if(c=='B'){digitalWrite(Led_TV,HIGH);}//Liga TV Bluetooth
           if(c=='b'){digitalWrite(Led_TV,LOW);}

           if(c=='C'){digitalWrite(Led_Portao,HIGH);}// Liga PORTAO bluetooth
           if(c=='c'){digitalWrite(Led_Portao,LOW);}
              
            comando_Arduino = true;
            tempo_limite = millis();
            Serial.println("Olá Mestre, o que você deseja?");
            // Ola mestre, o que você deseja? (áudio)  
            digitalWrite(Led_Arduino, HIGH);
                    
           }
           else{
            Serial.println("Já estou esperando suas ordens!");
            // Já estou esperando suas ordens (áudio)
             
           }
        
      break;
      
      case Ligar:
           if(comando_Arduino==true){
              comando_Ligar = true;
              comando_Desligar = false;
              Serial.println("Qual equipamento deseja ligar?");
              //Qual equipamento deseja acionar? áudio
              digitalWrite(Led_Ligar, HIGH);
              digitalWrite(Led_Desligar, LOW); 
              // Pois não senhor, o que deseja ligar?                    
           }
           
      break;

      case Desligar:
           if(comando_Arduino==true){
              comando_Ligar = false;
              comando_Desligar = true;
              Serial.println("Qual equipamento deseja desligar?");
              //Qual equipamento deseja desligar? áudio
              digitalWrite(Led_Ligar, LOW);
              digitalWrite(Led_Desligar, HIGH); 
              // Pois não senhor, o que deseja ligar?                    
           }

      break;

      case Lampada:
      
      if(comando_Ligar==true){
              if(digitalRead(Led_Lampada)==HIGH){
                Serial.println("Lampada já está ligada");
                //Senhor a lampada já está ligada 
              }
              else{
              Serial.println("Ligando lampada...");  
              //Será um prazer atender  
              } 
              
              digitalWrite(Led_Lampada, HIGH); 
              comando_Arduino = false;
              comando_Ligar = false;
              comando_Desligar = false;
              
              digitalWrite(Led_Ligar, LOW);
              digitalWrite(Led_Desligar, LOW);
              digitalWrite(Led_Arduino, LOW);
                       
           }
      
      if(comando_Desligar==true){
              if(digitalRead(Led_Lampada)==LOW){
                Serial.println("Lampada já está desligada");
                //Senhor a lampada já está desligada 
              }
              else{
               Serial.println("Desligando lampada..."); 
              //Será um prazer atender  
              }
              digitalWrite(Led_Lampada, LOW); 
              comando_Arduino = false;
              comando_Ligar = false;
              comando_Desligar = false;  
              
              digitalWrite(Led_Ligar, LOW);
              digitalWrite(Led_Desligar, LOW);
              digitalWrite(Led_Arduino, LOW);                  
           }
             
      break;

      case TV:
      if(comando_Ligar==true){
              if(digitalRead(Led_TV)==HIGH){
                //Senhor a TV já está ligada 
              }
              else{
              //Será um prazer atender  
              } 
              digitalWrite(Led_TV, HIGH); 
              comando_Arduino = false;
              comando_Ligar = false;
              comando_Desligar = false;  
              
              digitalWrite(Led_Ligar, LOW);
              digitalWrite(Led_Desligar, LOW);
              digitalWrite(Led_Arduino, LOW);
                     
           }
      
      if(comando_Desligar==true){
              if(digitalRead(Led_TV)==LOW){
                //Senhor a TV já está desligada 
              }
              else{
              //Será um prazer atender  
              }
              digitalWrite(Led_TV, LOW); 
              comando_Arduino = false;
              comando_Ligar = false;
              comando_Desligar = false;  
              
              digitalWrite(Led_Ligar, LOW);
              digitalWrite(Led_Desligar, LOW);
              digitalWrite(Led_Arduino, LOW);                  
           }
      break;

      case Portao:
      
      if(comando_Ligar==true){
        Serial.println("Abrir portao");
              digitalWrite(Led_Portao, HIGH); 
              comando_Arduino = false;
              comando_Ligar = false;
              comando_Desligar = false;  
              
              digitalWrite(Led_Ligar, LOW);
              digitalWrite(Led_Desligar, LOW);
              digitalWrite(Led_Arduino, LOW);       
           }
      
      if(comando_Desligar==true){
              if(digitalRead(Led_Portao)==LOW){
                //Senhor a TV já está desligada 
              }
              else{
              //Será um prazer atender  
              }
              digitalWrite(Led_Portao, LOW); 
              comando_Arduino = false;
              comando_Ligar = false;
              comando_Desligar = false;  
              
              digitalWrite(Led_Ligar, LOW);
              digitalWrite(Led_Desligar, LOW);
              digitalWrite(Led_Arduino, LOW);                  
           }
      break;


      default:
        Serial.println("Record function undefined");
        break;
  
    }
    /** voice recognized */
    printVR(buf);
  }

// Calcular tempo de espera sem resposta


if(comando_Arduino==true){
      tempo_espera = millis() - tempo_limite;
      if(tempo_espera > 8000){
        Serial.println("Tempo esgotado!");
        comando_Arduino = false;
        comando_Ligar = false;
        comando_Desligar = false;
        digitalWrite(Led_Arduino, LOW);
        digitalWrite(Led_Ligar, LOW);
        digitalWrite(Led_Desligar, LOW);
      }
  }



  
}

 

Caso alguém souber de alguma coisa por favor me ajude não sei o que está ocasionando o conflito.

 

 

 

Projeto TCC B1.txtBuscando informações...

  • Curtir 1
Postado

@aphawk Tentei utilizar a opção de RX TX no para o módulo VR3, porém ele n está identificando e n funciona. No bluetooth funciona normal, porém acaba acontecendo algum tipo de conflito ao tentar usar os dois recursos em paralelo, não sei se é uma limitação do hardware ou se é algum problema no código.

Código com RX e TX no bluetooth 

//PROJETO DE TCC 
  
#include <SoftwareSerial.h>
#include "VoiceRecognitionV3.h"

/**        
  Connection
  Arduino    VoiceRecognitionModule
   52   ------->     TX
   53   ------->     RX
*/


VR myVR(52,53);    // 52:RX 53:TX, you can choose your favourite pins.

uint8_t records[7]; // save record
uint8_t buf[64];

// Leds indicadores de pais e filhos
int Led_Arduino = 13;
int Led_Ligar = 12;
int Led_Desligar = 11;
int Led_Lampada = 10;
int Led_TV = 9;
int Led_Portao = 8;

unsigned long tempo_limite;
unsigned long tempo_espera;


// Variaveis para armazenar o estado do comando reconhecido
boolean comando_Arduino = false;
boolean comando_Ligar = false;
boolean comando_Desligar = false;
boolean comando_Lampada = false;
boolean comando_TV = false;
boolean comando_Portao = false;

//COMANDO AVÔ
#define Arduino (0)  

//COMANDOS PAIS
#define Ligar (1) 
#define Desligar (2)

//COMANDOS FILHOS
#define Lampada (3) 
#define TV (4) 
#define Portao (5) 




void printSignature(uint8_t *buf, int len)
{
  int i;
  for(i=0; i<len; i++){
    if(buf[i]>0x19 && buf[i]<0x7F){
      Serial.write(buf[i]);
    }
    else{
      Serial.print("[");
      Serial.print(buf[i], HEX);
      Serial.print("]");
    }
  }
}

/**
  @brief   Print signature, if the character is invisible, 
           print hexible value instead.
  @param   buf  -->  VR module return value when voice is recognized.
             buf[0]  -->  Group mode(FF: None Group, 0x8n: User, 0x0n:System
             buf[1]  -->  number of record which is recognized. 
             buf[2]  -->  Recognizer index(position) value of the recognized record.
             buf[3]  -->  Signature length
             buf[4]~buf[n] --> Signature
*/
void printVR(uint8_t *buf)
{
  Serial.println("VR Index\tGroup\tRecordNum\tSignature");

  Serial.print(buf[2], DEC);
  Serial.print("\t\t");

  if(buf[0] == 0xFF){
    Serial.print("NONE");
  }
  else if(buf[0]&0x80){
    Serial.print("UG ");
    Serial.print(buf[0]&(~0x80), DEC);
  }
  else{
    Serial.print("SG ");
    Serial.print(buf[0], DEC);
  }
  Serial.print("\t");

  Serial.print(buf[1], DEC);
  Serial.print("\t\t");
  if(buf[3]>0){
    printSignature(buf+4, buf[3]);
  }
  else{
    Serial.print("NONE");
  }
  Serial.println("\r\n");
}

void setup()
{
  /** initialize */
  myVR.begin(9600);
  
  Serial.begin(9600);
  Serial.println("COMANDOS PAIS E FILHOS");
 

  // Declarar todos pinos como saída para os LEds
  pinMode(Led_Arduino, OUTPUT);
  pinMode(Led_Ligar, OUTPUT);
  pinMode(Led_Desligar, OUTPUT);
  pinMode(Led_Lampada, OUTPUT);
  pinMode(Led_TV, OUTPUT);
  pinMode(Led_Portao, OUTPUT);






    
    
  if(myVR.clear() == 0){
    Serial.println("Recognizer cleared.");
  }else{
    Serial.println("Not find VoiceRecognitionModule.");
    Serial.println("Please check connection and restart Arduino.");
    while(1);
  }

  //Carregar todos os comandos no VR3
  if(myVR.load((uint8_t)Arduino) >= 0){
    Serial.println("onRecord loaded");
  }
  
  if(myVR.load((uint8_t)Desligar) >= 0){
    Serial.println("offRecord loaded");
  }

  
  if(myVR.load((uint8_t)Ligar) >= 0){
    Serial.println("onRecord loaded");
  }
  
  if(myVR.load((uint8_t)Lampada) >= 0){
    Serial.println("offRecord loaded");
  }


 
  
  if(myVR.load((uint8_t)TV) >= 0){
    Serial.println("offRecord loaded");
  }

 if(myVR.load((uint8_t)Portao) >= 0){
    Serial.println("onRecord loaded");
  }
  
}

void loop()
{
  
  int ret;
  ret = myVR.recognize(buf, 50);
  
  if(ret>0){
    switch(buf[1]){
     // Verifica se o comando Arduino para iniciar o sistema foi reconhecido
      case Arduino:
      
            // Verifica se o sistema já está iniciado

            
            if(comando_Arduino==false){ 
              if(comando_Arduino==false){// COMANDO CASO MODULO DE VOZ DESLIGADO UTILIZA BLUETOOTH
    char c=Serial.read();
  if(c=='A'){digitalWrite(Led_Lampada,HIGH);}// LIga lampada BLuetooth
  if(c=='a'){digitalWrite(Led_Lampada,LOW);}

  if(c=='B'){digitalWrite(Led_TV,HIGH);}//Liga TV Bluetooth
  if(c=='b'){digitalWrite(Led_TV,LOW);}

  if(c=='C'){digitalWrite(Led_Portao,HIGH);}// Liga PORTAO bluetooth
  if(c=='c'){digitalWrite(Led_Portao,LOW);}
              } 
            comando_Arduino=true;{
            tempo_limite = millis();
            Serial.println("Olá Mestre, o que você deseja?");
            // Ola mestre, o que você deseja? (áudio)  
            digitalWrite(Led_Arduino, HIGH);
                    
           }}
           else{
            Serial.println("Já estou esperando suas ordens!");
            // Já estou esperando suas ordens (áudio)
             
           }
        
      break;
      
      case Ligar:
           if(comando_Arduino==true){
              comando_Ligar = true;
              comando_Desligar = false;
              Serial.println("Qual equipamento deseja ligar?");
              //Qual equipamento deseja acionar? áudio
              digitalWrite(Led_Ligar, HIGH);
              digitalWrite(Led_Desligar, LOW); 
              // Pois não senhor, o que deseja ligar?                    
           }
           
      break;

      case Desligar:
           if(comando_Arduino==true){
              comando_Ligar = false;
              comando_Desligar = true;
              Serial.println("Qual equipamento deseja desligar?");
              //Qual equipamento deseja desligar? áudio
              digitalWrite(Led_Ligar, LOW);
              digitalWrite(Led_Desligar, HIGH); 
              // Pois não senhor, o que deseja ligar?                    
           }

      break;

      case Lampada:
      
      if(comando_Ligar==true){
              if(digitalRead(Led_Lampada)==HIGH){
                Serial.println("Lampada já está ligada");
                //Senhor a lampada já está ligada 
              }
              else{
              Serial.println("Ligando lampada...");  
              //Será um prazer atender  
              } 
              
              digitalWrite(Led_Lampada, HIGH); 
              comando_Arduino = false;
              comando_Ligar = false;
              comando_Desligar = false;
              
              digitalWrite(Led_Ligar, LOW);
              digitalWrite(Led_Desligar, LOW);
              digitalWrite(Led_Arduino, LOW);
                       
           }
      
      if(comando_Desligar==true){
              if(digitalRead(Led_Lampada)==LOW){
                Serial.println("Lampada já está desligada");
                //Senhor a lampada já está desligada 
              }
              else{
               Serial.println("Desligando lampada..."); 
              //Será um prazer atender  
              }
              digitalWrite(Led_Lampada, LOW); 
              comando_Arduino = false;
              comando_Ligar = false;
              comando_Desligar = false;  
              
              digitalWrite(Led_Ligar, LOW);
              digitalWrite(Led_Desligar, LOW);
              digitalWrite(Led_Arduino, LOW);                  
           }
             
      break;

      case TV:
      if(comando_Ligar==true){
              if(digitalRead(Led_TV)==HIGH){
                //Senhor a TV já está ligada 
              }
              else{
              //Será um prazer atender  
              } 
              digitalWrite(Led_TV, HIGH); 
              comando_Arduino = false;
              comando_Ligar = false;
              comando_Desligar = false;  
              
              digitalWrite(Led_Ligar, LOW);
              digitalWrite(Led_Desligar, LOW);
              digitalWrite(Led_Arduino, LOW);
                     
           }
      
      if(comando_Desligar==true){
              if(digitalRead(Led_TV)==LOW){
                //Senhor a TV já está desligada 
              }
              else{
              //Será um prazer atender  
              }
              digitalWrite(Led_TV, LOW); 
              comando_Arduino = false;
              comando_Ligar = false;
              comando_Desligar = false;  
              
              digitalWrite(Led_Ligar, LOW);
              digitalWrite(Led_Desligar, LOW);
              digitalWrite(Led_Arduino, LOW);                  
           }
      break;

      case Portao:
      
      if(comando_Ligar==true){
        Serial.println("Abrir portao");
              digitalWrite(Led_Portao, HIGH); 
              comando_Arduino = false;
              comando_Ligar = false;
              comando_Desligar = false;  
              
              digitalWrite(Led_Ligar, LOW);
              digitalWrite(Led_Desligar, LOW);
              digitalWrite(Led_Arduino, LOW);       
           }
      
      if(comando_Desligar==true){
              if(digitalRead(Led_Portao)==LOW){
                //Senhor a TV já está desligada 
              }
              else{
              //Será um prazer atender  
              }
              digitalWrite(Led_Portao, LOW); 
              comando_Arduino = false;
              comando_Ligar = false;
              comando_Desligar = false;  
              
              digitalWrite(Led_Ligar, LOW);
              digitalWrite(Led_Desligar, LOW);
              digitalWrite(Led_Arduino, LOW);                  
           }
      break;


      default:
        Serial.println("Record function undefined");
        break;
  
    }
    /** voice recognized */
    printVR(buf);
  }

// Calcular tempo de espera sem resposta


if(comando_Arduino==true){
      tempo_espera = millis() - tempo_limite;
      if(tempo_espera > 8000){
        Serial.println("Tempo esgotado!");
        comando_Arduino = false;
        comando_Ligar = false;
        comando_Desligar = false;
        digitalWrite(Led_Arduino, LOW);
        digitalWrite(Led_Ligar, LOW);
        digitalWrite(Led_Desligar, LOW);
      }
  }

        
}

 

Postado

@Christian Branco ,

 

voce continuou usando a softserial.h , meu amigo, quando não precisa e na verdade complica no seu caso pois isso é feito por software e não foi feito para ter duas conversas seriais ao mesmo tempo; enquanto você está ocupado com uma delas pode estar perdendo dados na outra.

 

Veja aqui outras pessoas com o mesmo tipo de problema seu :

 

https://stackoverflow.com/questions/12463605/two-port-receive-using-software-serial-on-arduino

 

 

Porisso que te falei para usar as interfaces seriais por hardware, você não perde nada.....

 

Por acaso qual é a velocidade da comunicação serial com cada um dos seus periféricos ?

 

Não posso te ajudar nessa linguagem infelizmente, só posso dar palpites no hardware como um todo.

 

Mas sei que o que você precisa é algo deste tipo :

 

https://www.pjrc.com/teensy/td_libs_AltSoftSerial.html

 

 

Paulo

 

  • Curtir 1
  • Membro VIP
Postado

Permita-me corroborar Paulão. Nunca tive contato com os hw's em questão mas em linhas gerais me parece ser mais inteligente usar o hw do mc. O problema é que informação de como manipular isso não é facilmente encontrável na net. Meio hard se comparada à 'moleza' do soft.

 

Antes de apelar pra assembly, tenta consultar o datasheet do mc pra acessar seus registros em questão. Me lembro que fiz pra um atmega ou attiny algo como (pseudo código)
 

void tx(dado)
{
while(flag_transmitindo);//aguarda transmissão anterior...aqui calha um timeout...
byte_a_transmitir=dado;
}

tenho um google home mini que conversa com interruptor sonoff mas...

...bem joinha este módulo de voz...

Postado

@Isadora Ferraz ,

 

À vontade, minha cara e idosa companheira de Fórum !!!!

 

Em termos de hardware, existem 4 seriais independentes no Atmega2560, cada uma com um buffer de 1 byte , o único senão é que todas compartilham a mesma interrupção, mas é fácil isolar e tratar cada uma delas.

 

Existem bibliotecas para Arduino que já implementam esse tratamento, como a alt qqr coisa que postei acima .

 

Eu particularmente trato isso fácil no Bascom, ele prevê as seriais por hardware e implementa os famosos ring buffers independentes de até 255 bytes para cada serial, e separados para RX e TX também.

 

Mas não faço ideia como a IDE do Arduino trata isso ....


Paulo

 

  • Membro VIP
Postado
  Em 30/04/2020 às 23:27, aphawk disse:

Mas não faço ideia como a IDE do Arduino trata isso .

Expandir  

E eu menos ainda. Mas penso que pode fazer uma recepção 'na raça' . Mas não sem antes preparar o hw pra interrupt serial, claro.

Um tradicional minimalismo, algo como:

unsigned char i0,i1, buffer0[255],buffer1[255];
interrupt rxserial()
{
if (flag0) buffer0[i0++]=rxbuffer0; //flag:qual serial, rxbuffer registro que acabou de receber o dado
if (flag1) buffer1[i1++]=rxbuffer1;
//if (flagx) bufferx[ix++]=rxbufferx;
}

kichute hein...

 

Já o tx... te vira...

 

  Em 01/05/2020 às 14:09, Christian Branco disse:

perguntar pra algum professores meus também

Expandir  

...e pra tirar nota boa conosco também, publique sua solução. É disso que o forum se alimenta...

  • Haha 1

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Mostrar mais  

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

Mostrar mais  
×
×
  • Criar novo...

LANÇAMENTO!

eletronica2025-popup.jpg


CLIQUE AQUI E BAIXE AGORA MESMO!