الخميس، 23 أبريل 2020

ربط محرك سيرفو مع Arduino Uno

Servo Motor Interface with Arduino Uno

المكونات واللوازم

اردوينو نانو
سيرفو موتور
اسلاك الربط

حول هذا المشروع

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

في هذه المقالة أستخدم محرك سيرفو واحد فقط. الرمز مخصص لمؤازرة واحدة فقط. بالنسبة للعديد من الماكينات ، قد يتغير الرمز. إذا فهمت هذا الرمز ، فستتمكن من التحكم في عدة أجهزة.
Arduino IDE هي أداة رائعة لتطوير الكود وتحميل الكود على Arduino Board.

الخطوة 1

إذا كنت تعرف بالفعل تثبيت Arduino IDE أو لديك Arduino IDE ، يرجى تخطي هذه الخطوة.

قم بتنزيل برنامج Arduino IDE 

بعد تثبيت Arduino IDE افتحه.

الخطوة 2

نحتاج في هذا المشروع إلى استخدام مكتبة باسم "Servo.h". هذه مكتبة مدمجة مع Arduino IDE.

هناك طريقتان لتضمين مكتبة

انتقل إلى Sketch> تضمين مكتبة> Servo

أو

ما عليك سوى كتابة # تتضمن <Servo.h>

# تتضمن <Servo.h>
الخطوه 3

بعد ذلك نحتاج إلى تعريف متغير نوع عدد صحيح. الآن أستخدم المتغير المسمى "pos". يمكن لهذا المتغير الاحتفاظ بقيم صحيحة فقط.

الخطوة - 4

في جزء الإعلان ، نحتاج إلى إعلان متغير آخر. هنا أستخدم اسم المتغير باسم "Myservo". يمكنك أيضًا استخدام أي أسماء أخرى. يستخدم هذا المتغير لربط المؤازرة المقابلة بالكود بأكمله. هنا نستخدم الكلمة "Servo". الصيغة هي "Servo variable_name". الرمز يبدو ،

 Myservo.
الخطوة - 5

يتكون كل برنامج Arduino من وظيفة "void setup ()" و "void loop ()". عند تشغيل Arduino ، ستعمل الوظائف / العبارات في "void setup ()" أولاً وستعمل مرة واحدة. بعد ذلك ، ستعمل الوظائف / العبارات في حلقة فارغة () مثل الحلقة.

نحن بحاجة إلى تعيين دبوس إشارة محرك سيرفو إلى Arduino pin في "إعداد الفراغ ()". في الصوت الواضح ، نعلن هنا عن دبوس Arduino للتحكم في محرك سيرفو. هنا نستخدم Digital Pin 3 من Arduino للتحكم في محرك سيرفو.

هنا نستخدم الكلمة المرفقة (). الصيغة هي "variable_name.attach (pin_number)". الرمز يبدو ،

Myservo.attach (3) ؛
الخطوة - 6

دعونا مناقشة حول بيان التحكم المؤازرة. الكلمة الأساسية هي "write ()". والصيغة هي "variable_name.write (pos)". يمكننا إما استخدام متغير أو رقم يقع بين 0 و 360 في وظيفة الكتابة.

Myservo.write (pos) ؛
الخطوة - 7

الآن نحن بحاجة إلى تعيين وظيفة حلقة. هنا نستخدم حلقة "for ()" للتحكم في محرك سيرفو. في حلقة () ، اضبط القيمة الدنيا هي 0. أي. (.pos = 0) والقيمة القصوى هي 180. أي. (pos <= 180). ثم قم بنسخ نقاط البيع أي (pos ++). ثم نفذ وظيفة الكتابة (الوظيفة في الخطوة 6) في الحلقة من أجل. ثم أضف وظيفة تأخير. تساعد وظيفة التأخير هذه في انتظار 15 مللي ثانية حتى تصل المؤازرة إلى الوضع.

for (pos = 0؛ pos <= 180؛ pos ++) {
Myservo.write (pos) ؛
تأخير (15) ؛
}}
الخطوة - 8

ثم قم بإضافة وظيفة تأخير أخرى بعد حلقة for (). وظيفة التأخير هذه تنتظر وقتًا مناظرًا (والذي يتم تضمينه في وظيفة التأخير) بعد أعلاه للحلقة.

تأخير (1000) ؛
الخطوة - 9

الآن نحن بحاجة إلى تعيين وظيفة حلقة أخرى. هنا نستخدم حلقة "for ()" للتحكم في محرك سيرفو. في حلقة () ، اضبط الحد الأدنى للقيمة 180. أي. (.pos = 180) والقيمة القصوى هي 0. أي. (pos> = 0). ثم قلل من نقاط البيع أي (pos-). ثم نفذ وظيفة الكتابة (الوظيفة في الخطوة 6) في الحلقة من أجل. ثم أضف وظيفة تأخير. تساعد وظيفة التأخير هذه في انتظار 15 مللي ثانية حتى تصل المؤازرة إلى الوضع.

for (pos = 180؛ pos> = 0؛ pos -) {
Myservo.write (pos) ؛
تأخير (15) ؛
}}
الخطوة - 10

ثم قم بإضافة وظيفة تأخير أخرى بعد حلقة for (). وظيفة التأخير هذه تنتظر وقتًا مناظرًا (والذي يتم تضمينه في وظيفة التأخير) بعد أعلاه للحلقة.

تأخير (1000) ؛
اكتمال الرمز. الكود الكامل موجود في جزء البرنامج.

اكتب الرمز بالكامل وتحقق مرة أخرى من الأخطاء. ثم قم بتحميل (زر السهم في الأعلى) الرمز إلى Arduino Board.

من فضلك لا تنسخ والصق الرمز الخاص بي. اصنع خاصتك. "لا تكن AMUL BABY !!!!!"
هنا أنا أستخدم أجهزة SG90 الدقيقة. يمكن أن تعمل لوحة Arduino Uno على محرك سيرفو بدون مصدر طاقة إضافي. ولكن عند استخدام محرك سيرفو أكثر أو نوع آخر من محرك سيرفو ، أوصي بشدة بإمداد طاقة إضافي.

كود البرمجة

#include<Servo.h>
Servo Myservo;
int pos;
void setup()
{
Myservo.attach(3);
}

void loop()
{
  
  
for(pos=0;pos<=180;pos++){
Myservo.write(pos);
delay(15);
}
  delay(1000);
  
  for(pos=180;pos>=0;pos--){
Myservo.write(pos);
delay(15);
}
  delay(1000);
  
}


Stunning borwo elzing 1axsyivikv


عمل ساعة رقمية مع تحسس الحرارة والرطوبة باستخدام اردوينو نانو



عمل ساعة رقمية مع تحسس الحرارة والرطوبة باستخدام اردوينو نانو

Arduino Nano 7SEG clock (whitout RTC)+ temp. + humid

المكونات واللوازم

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

لقد طلبت نموذج RTC وأنا في انتظار وصوله.


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


كود البرمجة


#include <Adafruit_Sensor.h>
#include <DHT.h>
#include <DHT_U.h>
#include <SevSeg.h>
DHT dht(A2,DHT22);
SevSeg Display; 
char text[10][6]; 
int i = 0;
unsigned long timer;

//----------------------SET OROLOGIO
const unsigned long period = 1000; //durata 1 sec.
const unsigned long led_period = 500; //durata lampeggio :
unsigned long startMillis;
unsigned long led_startMillis;
unsigned long currentMillis;
unsigned long led_currentMillis;
const int hrs_btn = A0; //set ore
const int min_btn = A1; //set minuti
const int ledPin = 13; //pin lampeggio :
int Hrs = 0;
int Min = 0;
int Sec = 0;
int Time = 0000;
int ledState = HIGH;

void setup() {
  pinMode(hrs_btn, INPUT_PULLUP);
  pinMode(min_btn, INPUT_PULLUP);
  pinMode(ledPin, OUTPUT);
  byte numDigits = 4;
  byte digitPins[] = {12, 10, 9, 11};
  //byte digitPins[] = {11, 9, 10, 12};
  byte segmentPins[] = {2, 3, 4, 5, 6, 7, 8,0};
  bool resistorsOnSegments = false; // 'false' means resistors are on digit pins
  byte hardwareConfig = COMMON_CATHODE; // See README.md for options
  bool updateWithDelays = false; // Default 'false' is Recommended
  bool leadingZeros = true; // Use 'true' if you'd like to keep the leading zeros
  bool disableDecPoint = true; // Use 'true' if your decimal point doesn't exist or isn't connected
  Display.begin(hardwareConfig, numDigits, digitPins, segmentPins, resistorsOnSegments,
  updateWithDelays, leadingZeros, disableDecPoint);
  Display.setBrightness(100);
  dht.begin();
  pinMode(ledPin, OUTPUT); // PIN 13 lampeggio :
  pinMode(A2, INPUT); // input DHT22
 }
  
  void loop() 
{    
  char mychar[ ] = "ORA";
  float hu = dht.readHumidity();
  float t = dht.readTemperature();
  float orario = Time;
   
      
      
      String e = String (mychar);           //memorizza mychar
      String f = e.substring (0,4);   //memorizza cifra a 4 digit 
      f.toCharArray(text[1],5);       //visualizza come 1 (ARRAY)
      
      
      orario=orario*10;
      String c = String (orario);        //memorizza ora
      String d = c.substring (0,4);      //memorizza cifra a 4 digit 
       d.toCharArray(text[2],5);        //visualizza come 2 (ARRAY)
      
               
      t=t*10;
      String k = String(t);             //memorizza t
      String r = k.substring (0,3)+"*"; //memorizza cifra a 3 digit + C
      r.toCharArray(text[3],5);       //visualizza come 3 (ARRAY)
      
      
      hu=hu*10;
      String A = String(hu);           //memorizza hu
      String B = A.substring(0,3)+"h"; //memorizza cifra a 3 digit
      B.toCharArray(text[4],5);        // visualizza come 4 (ARRAY)
      
       switch (i)
{
  case 1:
      digitalWrite(ledPin, LOW); //pin 13 on  Humid
       break;
   case 2:
      digitalWrite(ledPin, HIGH); //pin 13 off  ORA
       break;
   case 3:
      digitalWrite(ledPin, LOW);  //orario
      Display.setNumber(Time);
      if (digitalRead(hrs_btn) == LOW){goto X;}
        if (digitalRead(min_btn) == LOW){goto X;}
        break;
   case 4:
      digitalWrite(ledPin, LOW);  //gradi
       break;
}
     if (millis() > (timer + 6000)) //tempo di visualizzazione
     {
    switch(i);
    Display.setChars(text[i]);
    i++;
    if (i >= 5) i = 1; // (ARRAY)conta fino a 5 poi torna a 1
    timer = millis();}
    
    //--------------------------------OROLOGIO

  X:      currentMillis = millis();
  if (currentMillis - startMillis >= period)
  {
    Sec = Sec + 1;
    startMillis = currentMillis;
  }
  led_currentMillis = millis();
  if (led_currentMillis - led_startMillis >= led_period)
  {  led_startMillis = led_currentMillis;
    
    if (ledState == LOW) {   ledState = HIGH;
      
      if (digitalRead(hrs_btn) == LOW) //avanzamento ore
      {  Hrs = Hrs + 1; }
      
      if (digitalRead(min_btn) == LOW) //avanzamento min
      {  Min = Min + 1;  Sec = 0; }
    }
    else
    { ledState = LOW; }
    digitalWrite(ledPin, ledState);
  }
  if (Sec == 60)
  {
    Sec = 0;
    Min = Min + 1;
  }
  if (Min == 60)
  {
    Min = 0;
    Hrs = Hrs + 1;
  }
  if (Hrs == 24) //12/24 ore
  {
    Hrs = 0;
  }
  Time = Hrs * 100 + Min;
  
   Display.refreshDisplay();
}


Clock without rtc 529x1024 zmh10k0uq1