AHURATUS مساعد صوت المنزل الذكي

الصلبة |


الصلبة |


AHURATUS مساعد صوت المنزل الذكي


التي وضعتها إحسان الشغاعي
جامعة انوبوليس
نادي حورس العلمي.

STM32F103ZET6 UNIVERSAL BOARD


مقدمة


AHURATUS Smart Home Voice Assistant هو جهاز IOT تم تطويره من أجل التحكم في الأجهزة المنزلية الأخرى عن طريق الكشف الصوتي. ملاحظة: يتكون هذا الجهاز فقط للأغراض الأكاديمية.


نهج


وصف


يستخدم "AHURATUS Smart Home Voice Assistant" عملية ARM Cortex-M3 لتشغيل الإرشادات بالإضافة إلى العديد من الأجهزة الطرفية من أجل تقليل تعقيد حسابات ناقل البيانات وحسابات الدوائر اللاسلكية.


فاتورة المواد


#اسم المكوندورروابط المستندات الفنية
1STM32F103ZET6العملية والتحكمورقة البيانات
2HC-05 وحدة بلوتوثاتصال راديو بلوتوثورقة البيانات
3محول التيار المتردد 220-5Vتشغيل الدائرةورقة البيانات
4الصمام أو Mosfets أو التبديلاتلإخراج النظامورقة البيانات

طاولة العمل والبرمجيات


#اسم البرنامجدورالروابط والمراجع
1STM32CubeIDEIDE لترميز تعليماتناصلة
2GNU-ARMC- مترجم لمعالجات أرمينياصلة
3JLINKمبرمج ومصحح أخطاءصلة
4HERCULESبرنامج مراقبة SerialPortصلة
5اردوينو التحكم الصوتيتطبيق Android لإرسال البيانات إلى الجهاز لديناصلة

STM32F103ZET6 UNIVERSAL BOARD


تفاصيل


نحن نستخدم برامج تشغيل HAL التي تم توفيرها بواسطة تصنيع المعالج من أجل تقليل تعقيد التحقق من الأخطاء والاستخدام المباشر للأجهزة الطرفية. نستخدم HC-05 لاستلام البيانات من مستخدمنا عبر اتصال لاسلكي عن طريق ضبط إعدادات الوحدة من خلال الأمر AT التالي :


الإرسال: AT + UART = 115200 ، 0 ، 0
الرد: حسنا
_ ملاحظة: من أجل تطبيق أوامر AT ، تحتاج إلى توصيل KEY pin بمستوى عالي.

باستخدام STM32CubeIDE ، قمنا بتعيين السجلات الطرفية على النحو التالي:


  • UART2 (منفذ تسلسلي 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 (مراقبة المنفذ التسلسلي من خلال منفذ قياسي RS-232):

  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 11 و 15 و 16 (الوصول المباشر للذاكرة لـ UART2 RX و UART1 RX و 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); 

علاوة على ذلك ، قمنا بتعيين أوضاع GPIO على النحو التالي من أجل قيادة المصابيح لدينا أو غيرها من الأجهزة.


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

أخيرًا ، نكتب الكود التالي في دالة c main() أجل تنفيذ خوارزمية فك تشفير أمرنا:


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

بعد ذلك ، نستخدم جهاز Android للاتصال بنظامنا عبر البلوتوث . نستخدم تطبيق "Arduino Voice Control" لإرسال الصوت إلى نظامنا.
بواسطة Keyword "HEY" ، يقوم نظامنا باستطلاعات للأوامر التالية ويتبع الأوامر الصوتية كما هو مذكور أعلاه.


استنتاج


يمكن استخدام مشروع "AHURATUS Smart Home Voice Assistant" من أجل الحصول على جهاز منزلي ذكي بسيط وبسيط من خلال بعض التعديلات البسيطة في الدائرة ؛ مثل:


  • باستخدام MOSFET ودائرة عزل AC للسيطرة على الأجهزة مع الفولتية العاملة AC
  • استخدام تعديل عرض النبض (PWM) من أجل الحصول على مزيد من التحكم في الإخراج
  • استخدم TRIAC للحصول على أداة ضبط مستوى الضوء القابلة للتعديل
  • تصميم تطبيق أفضل ليكون تفاعل أفضل مع المستخدم
  • استخدم Kinect أو أجهزة كشف الحركة الأخرى لقياس مدى توافق الجهاز مع إيماءات المستخدمين.

التحيات،
احسان شاغي
الاتصال بي

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


All Articles