Implementação da comunicação serial bidirecional entre o Arduino e o módulo de reconhecimento de voz LU-ASR01

    Escrevi um artigo "Implementação de entrada de linguagem inteligente do Arduino" antes, discutindo a realização da entrada de voz chinesa do Arduino por meio da comunicação serial entre o Arduino e o LU-ASR01, mas essa comunicação está incompleta, porque o LU-ASR01 possui apenas uma porta serial Há uma transmissão porta TX e nenhuma porta de recepção RX. De fato, em aplicações reais, LU-ASR01 geralmente também precisa receber dados do computador host. Por exemplo, para garantir que o computador host tenha recebido os dados enviados por LU-ASR01, o computador host precisa retornar uma resposta de que o dados foram recebidos. Por exemplo, o computador host Se você deseja que LU-ASR01 envie uma determinada mensagem de voz ou deixe LU-ASR01 executar uma determinada operação, você precisa enviar dados do computador host e, em seguida, LU-ASR01 receberá os dados e realizar o processamento correspondente.

    Para resolver o problema de que a porta serial de LU-ASR01 não possui porta receptora RX, podemos usar as portas de E/S de LU-ASR01 (LU-ASR01 possui 8 portas de E/S na introdução anterior) e tomar 2 deles como comunicação de portas seriais e, em seguida, use comunicação serial suave para realizar comunicação serial bidirecional entre Arduino e LU-ASR01.

    Como não consigo encontrar nenhum dado de comunicação serial suave do módulo LU-ASR01 na Internet, só posso passar no teste contínuo, porque nem mesmo tenho as ferramentas de detecção mais básicas, osciloscópio etc., apenas um computador, um Placa Arduino e uma placa LU-ASR01. , para detectar se a porta serial soft enviou dados, só consigo conectar o LED na porta serial para ver se o LED está piscando quando a porta serial está enviando dados. Depois de dezenas de falhas, eu queria quase desesperadamente desistir da implementação de comunicação serial suave do LU-ASR01. Haha, claro que consegui no final, caso contrário, não seria capaz de escrever este artigo.

    Fofocas a parte, esse experimento é enviar um comando via LU-ASR01, e após o Arduino receber o comando, ele volta a enviar os dados do comando (ou seja, o mesmo valor) para LU-ASR01 como resposta, e por fim LU-ASR01 recebe o Arduino Depois de comparar os dados de comando enviados de volta (ou seja, julgar se os dados enviados são iguais aos dados recebidos), confirma-se que o comando foi enviado com sucesso.

   Neste experimento, o Arduino UNO ainda usa comunicação serial de hardware, usando as portas TX e RX, LU-ASR01 usa a porta IO6 como soft TX para enviar dados e a porta IO7 como soft RX para receber dados. Arduino fornece alimentação de 5V para LU-ASR01 (vermelho e preto 2 fios na figura abaixo), Arduino TX é conectado à porta IO7 de LU-ASR01 (soft RX), Arduino RX é conectado à porta IO6 de LU-ASR01 (soft TX ) , o diagrama de conexão é o seguinte:

LU-ASR01 ainda usa a plataforma de programação gráfica "bloco Tianwen", o seguinte é o programa completo no "bloco Tianwen":

 

 

Em seguida, baixamos o seguinte programa para a placa Arduino UNO, o programa completo é o seguinte:

/*

   Experimento de comunicação serial entre o Arduino e o módulo de reconhecimento de fala ASR01

   Para garantir que os dados enviados pelo ASR01 possam ser recebidos, o método de resposta é adotado. Toda vez que o Arduino recebe um identificador

   Após o comando, o comando será enviado para ASR01

*/

// define os pinos

const int LedPin = 13; // O pino conectado ao led, como o polo positivo da luz do LED

char Txbyte; //Dados de caracteres enviados pela porta serial

char Rxbyte; //dados de caracteres lidos pela porta serial

//inicialização

void setup() {

  Serial.begin(9600); //Configura a taxa de transmissão da porta serial para 9600

  pinMode(LedPin, OUTPUT); //Definir LedPin    

}

//programa principal

loop void() {

    if(Serial.available() > 0){ //Quando o buffer serial tem dados

      Rxbyte=char(Serial.read());

        if(Rxbyte==0x21) { //Quando Rxbyte é 0x21, o LedPin é definido como nível alto, ou seja, a luz é acesa

          Serial.write(Rxbyte);

          digitalWrite(LedPin, HIGH);

        }

        if(Rxbyte==0x22) { //Quando Rxbyte é 0x22, o LedPin é definido como nível baixo, ou seja, a luz é apagada

          Serial.write(Rxbyte);

          digitalWrite(LedPin, LOW);

        }

        if(Rxbyte==0x20){ //Quando Rxbyte é 0x20, o LED piscará 3 vezes

          Serial.write(Rxbyte);

          for(int i=0;i<3;i++){ //Led灯闪3下

            digitalWrite(LedPin, HIGH);

            atraso(100);

            digitalWrite(LedPin, LOW);

            atraso(100);

          }

        }

        atraso(2);

      }

}

    Após o download dos programas em ambos os lados e as 4 linhas conectadas, LU-ASR01 transmitirá primeiro "Estamos conduzindo um experimento, chame-me de "Sr. Falta de Perdão" para me acordar. Estou descansando temporariamente, ligue-me se há algo a fazer: Mr. Unforgiveness ", então chamamos de "Sr. Unforgiveness", então LU-ASR01 envia um comando de um byte pela porta serial suave após responder "estou aqui": 0x20, após o Arduino receber 0x20, envia 0x20 para LU-ASR01 novamente; quando Após LU-ASR01 receber os dados, compare com os dados enviados antes, se forem iguais, transmitirá: "Adu recebeu o comando", caso contrário, aguarde 1 segundo, se se não receber os dados corretos 0x20, vai transmitir: " Timed out, Adu não recebeu o comando, por favor reenvie" (aqui para explicar, para simplificar o procedimento, o programa não reenvia os dados novamente). Você pode então testar "luzes acesas" e "luzes apagadas".

Acho que você gosta

Origin blog.csdn.net/m0_61543203/article/details/126270423
Recomendado
Clasificación