السبت، 24 أبريل 2021

التحكم في الاتجاه لمحرك DC عبر البلوتوث

 تحكم في سرعة واتجاه محرك التيار المستمر عبر البلوتوث من خلال تطبيق جوال.





الأشياء المستخدمة في هذا المشروع

اردوينو UNO

وحدة بلوتوث HC-06
يمكن استخدام وحدة HC-05 Bluetooth أيضًا
محركات تكساس إنسترومنتس المزدوجة H-Bridge L293D
محرك DC ، 12 فولت

تطبيقات البرمجيات والخدمات عبر الإنترنت
إلكترونيات بلوتوث     Bluetooth Electronics

وجدت هذا التطبيق في متجر Play ، ولكن لا تتردد في تكييف الكود لاستخدام تطبيقات أخرى ، وخيارات التخصيص في هذا التطبيق هي السبب في اختيارنا لاستخدامه.

قصة
الشهيق
كان مشروعنا الأولي هو بناء لوح تزلج كهربائي من الصفر ، يمكننا التحكم فيه باستخدام شريط التمرير في تطبيق على الهاتف. ومع ذلك ، يتطلب هذا أولاً القدرة على إرسال إشارة PWM عبر البلوتوث إلى Arduino ، بالإضافة إلى أمر لعكس اتجاه المحرك. لكوني مبتدئًا في Arduino ، كان علي أولاً البحث في الإنترنت بحثًا عن مشاريع من شأنها أن تكون بمثابة نقطة انطلاق نحو إنشاء مشروعي الخاص ، وذلك لتعلم المفاهيم الأساسية وتطبيقها. هذه نتيجة بضعة أسابيع من تعلم Arduino منذ البداية ، وسيسعدني معرفة ما إذا كان هذا بدوره قد ساعد أي شخص في تعلم شيء أو اثنين!

هذا البناء هو نموذج أولي صغير الحجم لما يمكن استخدامه على لوح التزلج ، ويجب أن يكون قابلاً للتطوير مع تعديلات طفيفة. سأقدم أولاً الأجزاء المطلوبة بالإضافة إلى بعض الشرح وراءها ، ثم الدائرة الكهربائية بالإضافة إلى الكود المصاحب ، وفي النهاية ستكون إرشادات حول كيفية تخصيص التطبيق للعمل مع البرنامج.

الأجزاء المطلوبة
سوف تحتاج:

اردوينو أونو أو نانو ؛
وحدة Bluetooth منخفضة الطاقة (BLE) ، مثل HC-06 وهو تابع فقط ، أو HC-05 الذي يمكن أن يكون سيدًا أو عبدًا. كلاهما سيعمل لأنه سيتم استخدام الوحدة كعبد. كما أنها تشترك في نفس الدبابيس الأربعة الوسطى ، وهي الوحيدة التي نحتاجها ؛





محرك L293D IC سائق. سيسمح لنا محرك الجسر H المزدوج ذو 16 سنًا بالتحكم في اتجاه الدوران وسرعة المحرك ؛




محرك 12V DC ؛
حزمة بطارية 12 فولت ؛
مصدر طاقة لاردوينو ؛
أسلاك توصيل ولوح.

الدائرة
ستتلقى HC-06 بيانات تسلسلية عند إرسالها من جهاز البلوتوث الرئيسي ، والتي سيتم توصيلها إلى Arduino من خلال دبابيس الاستلام / الإرسال ، RX / TX ، المتصلة بالدبابيس 5 و 4 من اللوحة. سيتم توصيل دبابيس GND و VCC على التوالي بـ GND و + 5V.

سيسمح لنا الجسر H في L293D بالتحكم في اتجاه دوران المحرك ، عن طريق فتح أو إغلاق زوج من المفاتيح ، 4 منها مرتبة على شكل حرف H ، ومن هنا جاء الاسم.





سائق المحرك هذا قادر أيضًا على قيادة محركين بسرعات مختلفة ، ولكن سيتم استخدام محرك واحد فقط لهذا المشروع.

لتمكين المحرك ، قم بتوصيل "Enable 1، 2" (pin1) و "Vcc1" (pin 16) to + 5V. قم بتوصيل "Vcc2" (دبوس 8) بإيجابية حزمة بطارية 12V. قم بتوصيل المسامير 4 و 5 و 12 و 13 بـ GND. قم بتوصيل "الإدخال 1" (الطرف 2) بالدبوس 10 من Arduino ، والذي سينقل إشارة pwm2 ، و "الإدخال 2" (الطرف 7) إلى الطرف 9 ، لـ pwm1. سيتيح لنا التبديل بين هذين الاتجاهين تبديل اتجاه الدوران. أخيرًا ، قم بتوصيل محرك التيار المستمر بالمخرجات 1 و 2 (الدبابيس 3 و 6).





إليك صورة لما يجب أن تبدو عليه عند توصيلها بلوح التجارب






البرنامج
تمت إضافة التعليقات للمساعدة في شرح الكود ، ولكن قد تكون هناك حاجة لمزيد من التوضيح.

pwm1 و pwm2 متضادان ، ويسمحان لنا بتبديل اتجاه الدوران. البيانات التسلسلية التي يرسلها التطبيق عبارة عن سلسلة ، c ، حيث ستكون بيانات السرعة والاتجاه. لإنجاز هذا العمل ، توجد السرعة في c [1] و c [2] و c [3] من السلسلة ، ولهذا السبب يجب استلامها كرقم مكون من 3 أرقام. لهذا السبب في التطبيق ، نقوم بتخصيص شريط التمرير لإرسال رقم بين 100 و 255. ويمكن بعد ذلك تعيين هذا على [0: 255] في Arduino تحت متغير سرعة جديد مثل:

new_speed = map(speed_value,100,255,0,255) 
ومع ذلك ، قررنا ببساطة طرح 100 من speed_value ، بحيث تنتمي السرعة إلى الفاصل الزمني [0: 155] ، حيث أن 155 كانت سريعة بما يكفي لنموذجنا الأولي.


#include<SoftwareSerial.h>
SoftwareSerial bt_ser(4,5); //connected to RX and TX pins for serial data communication
char c[6];
int i=0,speed_value=0,send_value;
#define pwm1 9 //input 2
#define pwm2 10 //input 1
boolean motor_dir = 0;
void setup()
{
Serial.begin(9600);
bt_ser.begin(9600);
pinMode(pwm1, OUTPUT);
pinMode(pwm2, OUTPUT);
}
void loop()
{
while(bt_ser.available()) //when data is transmitted
{
if(bt_ser.available()>0)
{
c[i] = bt_ser.read(); //reading the string sent from master device
Serial.print(c[i]);
i++;
}
if(c[i-1]=='N') //if button is pressed
{
motor_dir = !motor_dir; //toggle direction variable
if(motor_dir) //setting direction, pwm1 and pwm2 are opposites
digitalWrite(pwm2, 0);
else
digitalWrite(pwm1, 0);
}
}
speed_value = (c[1]-48)*100+(c[2]-48)*10+(c[3]-48)*1; //interpreting speed from string
if(motor_dir) //for a given direction
{
if(c[i-1]=='#'){ //if data has been transmitted from slider
analogWrite(pwm1, speed_value-100); //-100 so that when slider is on "0" speed is 0
i=0;
}
}
else{ //for opposite direction
if(c[i-1]=='#'){
analogWrite(pwm2, speed_value-100);
i=0;
}
}
}




التطبيق
قررنا استخدام تطبيق يسمى Bluetooth Electronics وجدناه في متجر Play ، لأنه يوفر خيارًا لإنشاء لوحات معلومات بالإضافة إلى تخصيص البيانات التي ترسلها المكونات الموجودة على لوحة القيادة ، أو كيفية تفاعلها مع بعضها البعض.



لإنشاء هذه الواجهة ، ستحتاج إلى تحرير لوحة تحكم جديدة ، ومن قائمة التحرير حدد شريط تمرير وزر ومربع نص.

يجب تحرير شريط التمرير على النحو التالي:

الحد الأدنى للقيمة: 100
القيمة القصوى: 255
إرسال سلسلة عند تغيير شريط التمرير
السلسلة تبدأ بـ: *
السلسلة تنتهي بـ: #
يجب تحرير الزر على هذا النحو (اترك النص فارغًا):

نص صحفي: ن
تحرير النص:
يمكنك بعد ذلك إضافة نص لتوضيح لوحة القيادة.

المخططات





#include<SoftwareSerial.h>
SoftwareSerial bt_ser(4,5); //connected to RX and TX pins for serial data communication
char c[6];
int i=0,speed_value=0,send_value;

#define pwm1     9   //input 2
#define pwm2    10   //input 1
 
boolean motor_dir = 0;

void setup()
{
  Serial.begin(9600);
  bt_ser.begin(9600);
  pinMode(pwm1,   OUTPUT);
  pinMode(pwm2,   OUTPUT);
}

void loop()
{
  
   while(bt_ser.available())   //when data is transmitted
     {
       if(bt_ser.available()>0)
       {
         c[i] = bt_ser.read();   //reading the string sent from master device
         Serial.print(c[i]); 
         i++;  
       }
       if(c[i-1]=='N')    //if button is pressed
        {
          motor_dir = !motor_dir;     //toggle direction variable
          if(motor_dir)               //setting direction, pwm1 and pwm2 are opposites
            digitalWrite(pwm2, 0);
          else
            digitalWrite(pwm1, 0); 
        }
      }
       
       speed_value = (c[1]-48)*100+(c[2]-48)*10+(c[3]-48)*1;  //interpreting speed from string
       if(motor_dir)   //for a given direction
          {
            if(c[i-1]=='#'){   //if data has been transmitted from slider
              
              analogWrite(pwm1, speed_value-100);  //-100 so that when slider is on "0" speed is 0
              i=0;
            }
          }
        else{       //for opposite direction
          if(c[i-1]=='#'){
            
            analogWrite(pwm2, speed_value-100);
            i=0;
          }
          
        }
            
                
}   

التحكم بدايود ضوئي من NRF24L01

 






قم بتنزيل المكتبة



#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
RF24 radio(9, 10); 
const byte address[6] = "00001";     
int button_pin = 2;
boolean button_state = 0;void setup() 
{
pinMode(button_pin, INPUT);
radio.begin();                 
radio.openWritingPipe(address);
radio.setPALevel(RF24_PA_MIN); 
radio.stopListening();  
}void loop()
{
button_state = digitalRead(button_pin);
if(button_state == HIGH)
{
const char text[] = "Your Button State is HIGH";
radio.write(&text, sizeof(text));                
}
else
{
const char text[] = "Your Button State is LOW";
radio.write(&text, sizeof(text)); 
}
radio.write(&button_state, sizeof(button_state)); 
delay(1000);
}











الجمعة، 9 أبريل 2021

نظام انذار بواسطة اردوينو

 بناء نظام إنذار باستخدام اردوينو UNO R3


قصة
في هذا المشروع، سنتعلم كيفية بناء نظام إنذار محلي.

وحدة التحكم Micro Project هذه هي Arduino Uno R3 وسوف نستخدم النقطات في التعليمات البرمجية.

يمكنك إجراء التعديلات الخاصة بك لأن النظام متعدد الاستخدامات.


#define pi 3.14
#define max_lenh 320


/* flags */
bool NORMAL_STATE = false;
bool HIGH_STATE	  = false;
bool LOW_STATE    = false;
bool TEST_MODE	  = false;
bool bip          = false;

/* time counter */
int timer_cnt = 0; 

/* photoresistor values */
int light_val = 100;
const int max_val = 255;
const int min_val = 3;

/* pins setup */
const int photoresistor_pin = A0; 	//photoresistor to arduino pin A0
const int button_pin = 10;			//button_pin
const int buzzer_pin = 11; 			//buzzer to arduino pin 11
const int relay_pin  = 12; 			//relay to arduino pin 12
const int led_pin 	 = 13; 			//led pin



void setup()
{
  pinMode(button_pin, INPUT);  // Set BUTTON - pin 10 as an input
  pinMode(buzzer_pin, OUTPUT); // Set buzzer - pin 11 as an output
  pinMode(relay_pin, OUTPUT);  // Set relay  - pin 12 as an output
  pinMode(led_pin, OUTPUT);    // Set led    - pin 13 as an output
  Serial.begin(9600);
  
  // TIMER 1 for interrupt frequency 2 Hz:
  cli(); // stop interrupts
  TCCR1A = 0; // set entire TCCR1A register to 0
  TCCR1B = 0; // same for TCCR1B
  TCNT1  = 0; // initialize counter value to 0
  // set compare match register for 2 Hz increments
  OCR1A = 31249; // = 16000000 / (256 * 2) - 1 (must be <65536)
  // turn on CTC mode
  TCCR1B |= (1 << WGM12);
  // Set CS12, CS11 and CS10 bits for 256 prescaler
  TCCR1B |= (1 << CS12) | (0 << CS11) | (0 << CS10);
  // enable timer compare interrupt
  TIMSK1 |= (1 << OCIE1A);
  sei(); // allow interrupts

}

void loop()
{ 
  
}


ISR(TIMER1_COMPA_vect){
   
  if(timer_cnt == 0) //cheak value of photoresistor when counter = 0
  {
	light_val = analogRead(photoresistor_pin);
   	if(light_val < min_val)
    {
	  	 NORMAL_STATE = false;
		 HIGH_STATE	  = false;
		 LOW_STATE    = true;
      	 TEST_MODE	  = false;
    }
    else if(light_val > max_val)
    {
      	 NORMAL_STATE = false;
		 HIGH_STATE	  = true;
		 LOW_STATE    = false;
         TEST_MODE	  = false;
    }
    else
    {
      	 NORMAL_STATE = true;
		 HIGH_STATE	  = false;
		 LOW_STATE    = false;
      	 TEST_MODE	  = false;
    }
  }
  
  
  if(digitalRead(button_pin)) //test mode
  {
    
    NORMAL_STATE  = false;
    HIGH_STATE	  = false;
    LOW_STATE     = false;
    TEST_MODE	  = true;
   
  }
  
  
  
  if(LOW_STATE)
  {
    if(bip)
    {
      tone(buzzer_pin, 500); // Send 0.5KHz sound signal...
      bip = false;
    }
    else
    {
      noTone(buzzer_pin);     // Stop sound...
      bip = true;
    }
    
    digitalWrite(relay_pin, LOW); //turns off light bulb
    digitalWrite(led_pin, LOW);	  //turns off led
    
  }
  
  else if(HIGH_STATE)
  {
	noTone(buzzer_pin); 
    bip = false;
    digitalWrite(relay_pin, HIGH); //turns ON light bulb
    digitalWrite(led_pin, LOW);	   //turns off led

    
  }
  
  else if(NORMAL_STATE)
  {
	noTone(buzzer_pin); 
    bip = false;
    digitalWrite(relay_pin, LOW); //turns off light bulb
    digitalWrite(led_pin, HIGH);  //turns on led   
  }
  
  else if(TEST_MODE)
  {
	noTone(buzzer_pin); 
    bip = false;
    digitalWrite(relay_pin, HIGH);    //turns on light bulb
    digitalWrite(led_pin, HIGH);	  //turns on led
  }