AHURATUS Smart Home Voice Assistant

N | Solid


N | Solid


AHURATUS Smart Home Voice Assistant


Dikembangkan oleh Ehsan Shaghaei
Universitas Innopolis
Klub Ilmiah AHURATUS .

STM32F103ZET6 UNIVERSAL BOARD


Pendahuluan


AHURATUS Smart Home Voice Assistant adalah perangkat IOT yang dikembangkan untuk mengontrol perangkat rumah lainnya dengan deteksi suara. Catatan: Perangkat ini HANYA dibuat untuk tujuan akademik.


Pendekatan


Deskripsi


"AHURATUS Smart Home Voice Assistant" menggunakan proses ARM Cortex-M3 untuk menjalankan instruksi serta beberapa perangkat periferal untuk mengurangi kompleksitas bus data dan perhitungan RF-Circuit.


Bill of material


#Nama komponenPeranTautan Dokumen Teknis
1STM32F103ZET6Proses dan kontrolLembar Data
2Modul Bluetooth HC-05Koneksi radio BluetoothLembar Data
3Adaptor AC-DC 220-5VMemberi daya pada sirkuitLembar Data
4LED atau MOSFET atau RelayUntuk output sistemLembar Data

Meja kerja dan perangkat lunak


#Nama Perangkat LunakPeranTautan dan refrensi
1STM32CubeIDEIDE untuk Pengodean instruksi kamiTautan
2GNU-ARMC-Compiler untuk prosesor ARMTautan
3JlinkProgrammer dan debuggerTautan
4HERCULESPerangkat Lunak Pemantauan SerialPortTautan
5Kontrol Suara ArduinoAplikasi Android untuk mengirim data ke perangkat kamiTautan

STM32F103ZET6 UNIVERSAL BOARD


Detail


Kami menggunakan driver HAL yang disediakan oleh pabrik prosesor untuk mengurangi kompleksitas pengecekan kesalahan dan penggunaan periferal yang lurus ke depan. Kami menggunakan HC-05 untuk menerima data dari pengguna kami melalui koneksi nirkabel dengan mengatur pengaturan modul melalui perintah AT berikut :


Mengirimkan: AT + UART = 115200, 0, 0
Tanggapan: Oke
_ Catatan: Untuk menerapkan Perintah AT Anda harus menghubungkan pin KUNCI ke tingkat TINGGI.

dengan menggunakan STM32CubeIDE kami mengatur register periferal sebagai berikut:


  • UART2 (Port Serial HC-05):

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 (Memantau Serial Port Melalui RS-232 Standard Port):

  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(); } 

  • Saluran DMA 11, 15 dan 16 (Akses Memori Langsung untuk masing-masing UART2 RX dan UART1 RX dan 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); 

Selain itu, kami mengatur mode GPIO sebagai berikut untuk Drive LED kami atau Perangkat lainnya.


  /* 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); 

Akhirnya, kita menulis kode berikut dalam fungsi c main() untuk mengeksekusi algoritma decoding perintah kami:


 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)); } } 

Setelah itu, kami menggunakan perangkat android untuk terhubung ke sistem kami dengan Bluetooth . kami menggunakan aplikasi "Kontrol Suara Arduino" untuk mengirim suara ke sistem kami.
dengan Kata Kunci "HEY" sistem kami akan melakukan polling untuk perintah selanjutnya dan mengikuti perintah suara Anda sebagaimana disebutkan di atas.


Kesimpulan


Proyek "AHURATUS Smart Home Voice Assistant" dapat digunakan untuk memiliki perangkat rumah pintar fungsional yang sederhana dan murah dengan beberapa modifikasi sederhana di sirkuit; seperti:


  • Menggunakan MOSFET dan Sirkuit Isolasi AC untuk mengontrol perangkat dengan voltase kerja AC
  • Menggunakan Pulse Width Modulation (PWM) agar dapat lebih mengontrol output
  • Gunakan TRIAC untuk memiliki setter level lampu yang dapat disesuaikan
  • Rancang aplikasi yang lebih baik untuk berinteraksi lebih baik dengan pengguna
  • menggunakan Kinect atau Perangkat Deteksi Gerakan lainnya untuk mengukur membuat perangkat tersebut kompatibel dengan gerakan pengguna.

Salam,
Ehsan shaghaei
Hubungi saya

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


All Articles