AHURATUS Smart Home Sprachassistent

N | Feststoff


N | Feststoff


AHURATUS Smart Home Sprachassistent


Entwickelt von Ehsan Shaghaei
Innopolis Universität
AHURATUS Wissenschaftsclub.

STM32F103ZET6 UNIVERSAL BOARD


Einleitung


AHURATUS Smart Home Voice Assistant ist ein IOT-Gerät, das entwickelt wurde, um andere Heimgeräte durch Spracherkennung zu steuern. Hinweis: Dieses Gerät ist NUR für akademische Zwecke hergestellt.


Ansatz


Beschreibung


"AHURATUS Smart Home Voice Assistant" verwendet ein ARM Cortex-M3-Verfahren zum Ausführen der Anweisungen sowie mehrere Peripheriegeräte, um die Komplexität der Datenbus- und HF-Schaltkreisberechnungen zu verringern.


Stückliste


#KomponentennameRolleLinks zu technischen Dokumenten
1STM32F103ZET6Prozess und KontrolleDatenblatt
2HC-05 Bluetooth-ModulBluetooth-FunkverbindungDatenblatt
3220-5 V AC-DC-AdapterDie Schaltung mit Strom versorgenDatenblatt
4LED oder Mosfets oder RelaisZur SystemausgabeDatenblatt

Werkbank und Software


#Name der SoftwareRolleLinks und Verweise
1STM32CubeIDEIDE für die Codierung unserer AnweisungLink
2GNU-ARMC-Compiler für ARM-ProzessorenLink
3JlinkProgrammierer und DebuggerLink
4HERKULESSerialPort-ÜberwachungssoftwareLink
5Arduino-SprachsteuerungAndroid-Anwendung zum Senden von Daten an unser GerätLink

STM32F103ZET6 UNIVERSAL BOARD


Einzelheiten


Wir verwenden HAL-Treiber, die vom Hersteller des Prozessors bereitgestellt wurden, um die Komplexität der Fehlerprüfung und den unkomplizierten Einsatz von Peripheriegeräten zu verringern. Wir verwenden HC-05, um Daten von unserem Benutzer über eine drahtlose Verbindung zu empfangen, indem wir die Moduleinstellungen mit dem folgenden AT-Befehl festlegen:


Senden: AT + UART = 115200, 0, 0
Antwort: OK
_ Hinweis: Um AT-Befehle anzuwenden, müssen Sie den KEY-Pin mit dem HIGH-Pegel verbinden.

Mit STM32CubeIDE setzen wir die Peripherieregister wie folgt:


  • UART2 (HC-05 Serial Port):

huart2.Instance = USART2; huart2.Init.BaudRate = 115200; huart2.Init.WordLength = UART_WORDLENGTH_8B; huart2.Init.StopBits = UART_STOPBITS_1; huart2.Init.Parity = UART_PARITY_NONE; huart2.Init.Mode = UART_MODE_TX_RX; huart2.Init.HwFlowCtl = UART_HWCONTROL_NONE; huart2.Init.OverSampling = UART_OVERSAMPLING_16; if (HAL_UART_Init(&huart2) != HAL_OK) { Error_Handler(); } 

  • UART1 (Überwachung des seriellen Anschlusses über den RS-232-Standardanschluss):

  huart1.Instance = USART1; huart1.Init.BaudRate = 115200; huart1.Init.WordLength = UART_WORDLENGTH_8B; huart1.Init.StopBits = UART_STOPBITS_1; huart1.Init.Parity = UART_PARITY_NONE; huart1.Init.Mode = UART_MODE_TX_RX; huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE; huart1.Init.OverSampling = UART_OVERSAMPLING_16; if (HAL_UART_Init(&huart1) != HAL_OK) { Error_Handler(); } 

  • DMA-Kanäle 11, 15 und 16 (Direkter Speicherzugriff für UART2 RX und UART1 RX bzw. UART1 TX.):

  /* DMA controller clock enable */ __HAL_RCC_DMA1_CLK_ENABLE(); /* DMA interrupt init */ /* DMA1_Channel1_IRQn interrupt configuration */ HAL_NVIC_SetPriority(DMA1_Channel1_IRQn, 0, 0); HAL_NVIC_EnableIRQ(DMA1_Channel1_IRQn); /* DMA1_Channel5_IRQn interrupt configuration */ HAL_NVIC_SetPriority(DMA1_Channel5_IRQn, 0, 0); HAL_NVIC_EnableIRQ(DMA1_Channel5_IRQn); /* DMA1_Channel6_IRQn interrupt configuration */ HAL_NVIC_SetPriority(DMA1_Channel6_IRQn, 0, 0); HAL_NVIC_EnableIRQ(DMA1_Channel6_IRQn); 

Darüber hinaus stellen wir die GPIO-Modi wie folgt ein, um unsere LEDs oder andere Geräte anzusteuern.


  /* GPIO Ports Clock Enable */ __HAL_RCC_GPIOE_CLK_ENABLE(); __HAL_RCC_GPIOC_CLK_ENABLE(); __HAL_RCC_GPIOF_CLK_ENABLE(); __HAL_RCC_GPIOA_CLK_ENABLE(); __HAL_RCC_GPIOB_CLK_ENABLE(); __HAL_RCC_GPIOD_CLK_ENABLE(); __HAL_RCC_GPIOG_CLK_ENABLE(); /*Configure GPIO pin Output Level */ HAL_GPIO_WritePin(GPIOE, GPIO_PIN_5, GPIO_PIN_RESET); /*Configure GPIO pin Output Level */ HAL_GPIO_WritePin(GPIOF, LED3_Pin|GPIO_PIN_7|LED1_Pin, GPIO_PIN_RESET); /*Configure GPIO pin Output Level */ HAL_GPIO_WritePin(GPIOB, LED4_Pin|GPIO_PIN_2, GPIO_PIN_RESET); /*Configure GPIO pin Output Level */ HAL_GPIO_WritePin(GPIOG, GPIO_PIN_6|LED2_Pin|GPIO_PIN_11, GPIO_PIN_RESET); /*Configure GPIO pin : PE2 */ GPIO_InitStruct.Pin = GPIO_PIN_2; GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING_FALLING; GPIO_InitStruct.Pull = GPIO_NOPULL; HAL_GPIO_Init(GPIOE, &GPIO_InitStruct); /*Configure GPIO pins : PE3 PE4 PE6 */ GPIO_InitStruct.Pin = GPIO_PIN_3|GPIO_PIN_4|GPIO_PIN_6; GPIO_InitStruct.Mode = GPIO_MODE_INPUT; GPIO_InitStruct.Pull = GPIO_NOPULL; HAL_GPIO_Init(GPIOE, &GPIO_InitStruct); /*Configure GPIO pin : PE5 */ GPIO_InitStruct.Pin = GPIO_PIN_5; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; HAL_GPIO_Init(GPIOE, &GPIO_InitStruct); /*Configure GPIO pins : LED3_Pin PF7 LED1_Pin */ GPIO_InitStruct.Pin = LED3_Pin|GPIO_PIN_7|LED1_Pin; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; HAL_GPIO_Init(GPIOF, &GPIO_InitStruct); /*Configure GPIO pin : PA0 */ GPIO_InitStruct.Pin = GPIO_PIN_0; GPIO_InitStruct.Mode = GPIO_MODE_INPUT; GPIO_InitStruct.Pull = GPIO_NOPULL; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); /*Configure GPIO pins : LED4_Pin PB2 */ GPIO_InitStruct.Pin = LED4_Pin|GPIO_PIN_2; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); /*Configure GPIO pin : PB10 */ GPIO_InitStruct.Pin = GPIO_PIN_10; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); /*Configure GPIO pin : PB11 */ GPIO_InitStruct.Pin = GPIO_PIN_11; GPIO_InitStruct.Mode = GPIO_MODE_INPUT; GPIO_InitStruct.Pull = GPIO_NOPULL; HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); /*Configure GPIO pins : PG6 LED2_Pin PG11 */ GPIO_InitStruct.Pin = GPIO_PIN_6|LED2_Pin|GPIO_PIN_11; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; HAL_GPIO_Init(GPIOG, &GPIO_InitStruct); /*Configure GPIO pin : PG8 */ GPIO_InitStruct.Pin = GPIO_PIN_8; GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING; GPIO_InitStruct.Pull = GPIO_NOPULL; HAL_GPIO_Init(GPIOG, &GPIO_InitStruct); 

Schließlich schreiben wir den folgenden Code in die Funktion c main() , um unseren Befehlsdecodierungsalgorithmus auszuführen:


 HAL_UART_Transmit(&huart1,"Ping->> AHURATUS VOICE ASSISTANT\r\n", sizeof("Ping->> AHURATUS VOICE ASSISTANT\r\n"), 1); int i; for (i=0; i<100;i++){ data[i] = '\0'; } HAL_UART_Receive_DMA(&huart2, data, sizeof(data)); while (1) { if(strlen(data)>2){ if(strcasecmp( data,"Hey")==0){ HAL_UART_DMAStop(&huart2); HAL_UART_Transmit(&huart1, "How can I help you ?\r\n", sizeof("How can I help you ?\r\n"), 100);//Users Signal Receieved! int i; for (i=0; i<100;i++){ data[i] = '\0'; } HAL_UART_Receive_DMA(&huart2, data, sizeof(data));// Polling for new data int FLG = 1; while(!strlen(data)){ if(FLG){ HAL_UART_Transmit(&huart1, "Polling for Command ...\r\n", sizeof("Polling for Command ...\r\n"), 1); } FLG= 0; //wait... } HAL_Delay(200);//short delay to recieve the rest of data; if( (!strcasecmp(data,"turn on light one")) ||(!strcasecmp(data,"turn on light 1")) ){ HAL_GPIO_WritePin(LED1_GPIO_Port, LED1_GPIO_Port,GPIO_PIN_SET); HAL_UART_Transmit(&huart1, "Light 1 Turned ON\r\n", sizeof("Light 1 Turned ON\r\n"), 1); }else if( (!strcasecmp(data,"turn off light one")) ||(!strcasecmp(data,"turn off light 1")) ){ HAL_GPIO_WritePin(LED1_GPIO_Port, LED1_GPIO_Port,GPIO_PIN_RESET); HAL_UART_Transmit(&huart1, "Light 1 Turned OFF\r\n", sizeof("Light 1 Turned OFF\r\n"), 1); }else if( (!strcasecmp(data,"turn on light two")) ||(!strcasecmp(data,"turn on light 2")) ){ HAL_GPIO_WritePin(LED2_GPIO_Port, LED2_GPIO_Port,GPIO_PIN_SET); HAL_UART_Transmit(&huart1, "Light 2 Turned ON\r\n", sizeof("Light 2 Turned ON\r\n"), 1); }else if( (!strcasecmp(data,"turn off light two")) ||(!strcasecmp(data,"turn off light 2")) ){ HAL_GPIO_WritePin(LED2_GPIO_Port, LED2_GPIO_Port,GPIO_PIN_RESET); HAL_UART_Transmit(&huart1, "Light 2 Turned OFF\r\n", sizeof("Light 2 Turned OFF\r\n"), 1); }else if( (!strcasecmp(data,"turn on light three")) ||(!strcasecmp(data,"turn on light 3")) ){ HAL_GPIO_WritePin(LED3_GPIO_Port, LED3_GPIO_Port,GPIO_PIN_SET); HAL_UART_Transmit(&huart1, "Light 3 Turned ON\r\n", sizeof("Light 3 Turned ON\r\n"), 1); }else if( (!strcasecmp(data,"turn off light three")) ||(!strcasecmp(data,"turn off light 3")) ){ HAL_GPIO_WritePin(LED3_GPIO_Port, LED3_GPIO_Port,GPIO_PIN_RESET); HAL_UART_Transmit(&huart1, "Light 3 Turned OFF\r\n", sizeof("Light 3 Turned OFF\r\n"), 1); }else if( (!strcasecmp(data,"turn on light four")) ||(!strcasecmp(data,"turn on light 4")) ){ HAL_GPIO_WritePin(LED4_GPIO_Port, LED4_GPIO_Port,GPIO_PIN_SET); HAL_UART_Transmit(&huart1, "Light 4 Turned ON\r\n", sizeof("Light 4 Turned ON\r\n"), 1); }else if( (!strcasecmp(data,"turn off light four")) ||(!strcasecmp(data,"turn off light 4")) ){ HAL_GPIO_WritePin(LED4_GPIO_Port, LED4_GPIO_Port,GPIO_PIN_RESET); HAL_UART_Transmit(&huart1, "Light 4 Turned OFF\r\n", sizeof("Light 4 Turned OFF\r\n"), 1); } }else{ HAL_UART_Transmit(&huart1, "ERROR-> INVALID Command\r\n", sizeof("ERROR-> INVALID Command\r\n"), 1); } HAL_UART_DMAStop(&huart2); for (i=0; i<100;i++){ data[i] = '\0'; }//makes the buffer empty HAL_UART_Receive_DMA(&huart2, data, sizeof(data)); } } 

Anschließend stellen wir über ein Android-Gerät eine Bluetooth- Verbindung zu unserem System her. Wir verwenden die Anwendung "Arduino Voice Control" , um Sprache an unser System zu senden.
Nach dem Schlüsselwort "HEY" fragt unser System nach den nächsten Befehlen ab und folgt Ihren Sprachbefehlen wie oben erwähnt.


Fazit


Das Projekt "AHURATUS Smart Home Voice Assistant" kann verwendet werden, um durch ein paar einfache Änderungen in der Schaltung ein einfaches und kostengünstiges funktionierendes Smart Home-Gerät zu erhalten. wie zum Beispiel:


  • Verwenden eines MOSFET und eines AC-Isolationsschaltkreises zur Steuerung von Geräten mit AC-Betriebsspannungen
  • Verwenden der Pulsweitenmodulation (PWM), um den Ausgang besser steuern zu können
  • Verwenden Sie TRIAC, um eine einstellbare Lichtstärke einzustellen
  • Entwerfen Sie eine bessere Anwendung für eine bessere Interaktion mit dem Benutzer
  • Verwenden Sie Kinect oder andere Bewegungserkennungsgeräte, um zu messen, ob das Gerät mit den Gesten des Benutzers kompatibel ist.

Grüße,
Ehsan Shaghaei
Kontakt zu mir

Source: https://habr.com/ru/post/de475960/


All Articles