

AHURATUS Smart Home Voice Assistant
Dikembangkan oleh Ehsan Shaghaei
Universitas Innopolis
Klub Ilmiah AHURATUS .

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
Meja kerja dan perangkat lunak

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