Mini PC - مینی PCاینترنت اشیا - IOTمطالب علمی

کنترل رله با برد لینوکسی Orange Pi Zero

کامپیوتر های تک بردی مدتی است که در بازار الکترونیک و کامپیوتر نفوذ کرده است. این کامپیوترها با توجه به قابلیت های متنوع خود محبوبیت چشم گیری کسب کرده اند. ویژگی هایی نظیر قدرت پردازش بسیار بالا در مقایسه با میکروکنترلرها، امکان بهره گیری از سیستم عامل به عنوان رابط برای سخت افزار و نرم افزار، قابلیت­های سخت افزاری مناسب برای ارتباط با دیگر وسایل و … از جمله امکانات این کامپیوتر ها هستند.

در این میان وجود پورت های توسعه قابل کنترل موجود روی اکثر این کامپیوترها و همچنین اندازه بسیار کوچک آن ها که به صورت تک بردی و حداکثر به اندازه یک کارت تبلیغاتی است از ویژگی های متمایز کننده آن ها با سایر کامپیوترهای رایج می تواند باشد.

پورت های توسعه موجود روی کامپیوترهای تک بردی معمولاً در دو ردیف 13 یا 20 پایه ای که دارای پایه های تغذیه، پایه های قابل کنترل به عنوان ورودی و یا خروجی دیجیتال، انواع پروتکل های ارتباطی مانند USART،  I2C، SPI و … می باشد. این پورت ها به صورت مستقیم می توانند توسط کاربر کنترل شوند و برنامه ریزی برای آن ها صورت گیرد. همان طور که اشاره شد این بردها دارای سیستم عامل هستند و از تکنولوژی سیستم روی تراشه بهره می گیرند. سیستم عامل اکثر آن ها از توزیع های گوناگون لینوکس می باشد.

در این مقاله قصد داریم کنترل ماژول های رله را توسط یکی از کامپیوترهای تک بردی آموزش دهیم. برای این کار می خواهیم از کامپیوتر لینوکسی Orange Pi Zero استفاده کنیم. این برد دارای ابعاد کوچک (48 در 46 میلی متر) و قیمت ارزانتر نسبت به سایر بردهای موجود در بازار می­باشد. از امکانات این برد می توان به پردازنده چهار هسته ای H2 Cortex A7، 256 یا 512 مگابایت فضا برای حافظه اصلی، درگاه شبکه LAN، وای فای نصب شده روی برد، یک درگاه USB، پورت GPIO 26 پایه ای قابل کنترل و همچنین 13 پایه برای بردهای توسعه قابل نصب روی برد اصلی که شامل دو پورت USB، خروجی صدا و تصویر AV، و نیز IR می باشد. برای راه اندازی این برد می توان از توزیع های گوناگون لینوکسی بهره گرفت. سیستم عاملی که ما برای این کار در نظر گرفته ایم سیستم عامل Armbian توزیع Debian می باشد. دلیل این انتخاب پایداری مناسب و نیز منابع سازگار با این توزیع می­باشد.این سیستم عامل در توزیع های مختلف برای بردهای لینوکسی دیگر نیز موجود می باشد و می توان استفاده کرد.

image001 2

“برای مشاهده محصولات اورنج پای در فروشگاه ECA اینجا کنید”

ابتدا نیاز است که سیستم عامل را نصب کنیم. اما قبل از آن بهتر است به معرفی نرم افزار ها و لوازم مورد نیاز بپردازیم :

و  همچنین نرم افزارهای :

  • نرم افزار اتصال به سرور PUTTY (نسخه 32 بیتی، نسخه 64 بیتی)
  • نرم افزار SD Formatter
  • نرم افزار Win32Diskimager

در ابتدا کارت حافظه را با نرم افزار SD Formatter با فعال بودن گزینه Size Adjustment فرمت می کنیم.

image002

سپس از آدرس https://www.armbian.com/orange-pi-zero روی Other Download Options and archive کلیک کرده و Debian_jessie_default.7z را دانلود می کنیم.

image003

پس از دانلود فایل دانلود شده را از حالت فشرده خارج کرده و با نرم افزار Win32Diskimager روی کارت حافظه ای که قبلاً فرمت کرده بودیم با زدن دکمه Write سیستم عامل را روی کارت حافظه قرار می دهیم.

image004

پس از اتمام کارت حافظه را در برد قرار داده و توسط یک کابل شبکه به شبکه مورد نظر متصل می کنیم و با یک کابل میکرو USB به آدابتورتغذیه 5 ولت یا به پورت USB کامپیوتر متصل می کنیم.

در این مرحله نیاز است که از IP اختصاص داده شبکه برای برد آگاه شویم که میتوانیم با استفاده از نرم افزار های اسکن شبکه یا از تنظیمات شبکه این کار را بکنیم. حال نرم افزار PUTTY را اجرا می کنیم و آدرس آی پی برد را در قسمت HostName وارد میکنیم و نوع ارتباط را در SSH قرار می دهیم و دکمه Open را میزنیم.ممکن است اخطاری برای مسائل امنیتی نمایش داده شود که با زدن دکمه Yes می گذریم.

image005 1

اکنون از طریق پروتکل SSH با برد ارتباط برقرار کرده ایم و برای وارد شدن نیاز به نام کاربری و رمز عبور است.به صورت پیش فرض نام کاربری root و رمز عبور 1234 می باشد.پس از ورود با صفه ای مانند تصویر شماره 2 مواجه می شویم که نوشته OrangePi Zero به صورت بزرگ در بالا و مشخصاتی از نسخه سیستم عامل و … نمایش داده می شود.در پایین اخطاری نشان داده شده است که برای تغییر اندازه فایل سیستم نیازمند راهاندازی مجدد است.اکنون از ما می خواهد که رمزعور پیش فرض را تغییر دهیم (توجه کنید که رمزعبور باید پیچیدکی حداقلی را داشته باشد)و پس از تغییر آن از ما می خواهد که کاربر جدید را تعریف کنیم در ادامه مشخصاتی نیز از آن میخواهد که می توان از آن ها رد شد.

image006 1

پس از آن با نوشتن دستور reboot برد را راه اندازی مجدد می کنیم. ارتباط برقرار شده قطع می شود و نیاز به برقراری مجدد پس از آماده به کار شدن سیستم عامل می باشد.

همان طور که در تصویر زیر میبینیددر قسمت شماره 1 با نوشتن دستور df -h وضعیت حافظه سیستم را قبل از راه اندازی مجدد و در شماره 2 بعد از راه اندازی مجدد مقایسه کرده ایم.

image007 1

اکنون سیستم عامل آماده استفاده است. بهتر است قبل از نصب این که به نصب کتابخانه و برنامه های مورد نیاز به پردازید، مخازن سیستم عامل را به روز رسانی کرده و پس از آن سیستم عامل را ارتقا دهید. برای این کار می توان از دستورهای sudo apt-get update و sudo apt-get upgrade استفاده کرد.

برای استفاده از پورت GPIO این برد نیاز است که از کتابخانه های که برای این کار ارایه شده اند استفاده کنیم.یکی از کتابخانه های موجود Wiring Pi می باشد.

 Wiring Pi یک کتابخانه مبنتی بر PIN برای دسترسی به GPIO است که به زبان C برای سیستم های SoC  نوشته شده است. این کتابخانه در تمام کامپیوترهای تک بردی Raspberry Pi استفاده شده است و می توان به سادگی از آن استفاده کرد.این کتابخانه تحت لیسانس GNU LGPLv3 منتشر شده است و توسط زبان های C و C++ قابل استفاده است.این کتابخانه طوری نوشته شده است که کاربر به راحتی بتواند از آن استفاده کند و می توان گفت شباهت نسبتاً زیادی با کتابخانه های Arduino دارد.

این کتابخانه برای پلتفرم های دیگر نیز پورت شده است. اکنون قصد داریم نحوه نصب کتابخانه Wiring Pi را برای OrangePi Zero که یک کامپیوتر تک بردی لینوکسی ارزان قیمت است را بررسی کنیم.

پس از آماده شدن سیستم عامل و اتصال از طریق پروتکل SSH توسط نرم افزار Putty به برد لینوکسی به نصب این کتابخانه می پردازیم.

image008

با استفاده از دستور زیر فایل های مورد نیاز را دانلود می کنیم.

git clone https://github.com/xpertsavenue/WiringOP-Zero.git

image009

پس از اتمام بارگیری حال نیاز است که نصب انجام پذیرد برای این کار ابتدا به مسیر بارگیری شده وارد می شویم.برای این کار از دستور

 cd WiringOP-Zero

استفاده می کنیم.

image010 1

در ادامه با استفاده از دستور

Chmod +x ./build

کتابخانه مورد نظر را نصب می کنیم و قابلییت اجرایی آن ایجاد می شود.

image011 1

اکنون کتابخانه Wiring Pi برای OrangePi Zero قابل استفاده است.برای صحت از درستی فرایند نصب و عملکرد این کتابخانه می توانیم از دستور

gpio readall

استفاده کنیم.این دستور یک حالت کلی از تمام GPIO های برد به همرا ه شماره هر کدام از آن ها و نیز وضعیتشان نمایش می دهد.

توجه داشته باشید که شماره گذاری هر کدام از پایه ها در سه حالت نمایش داده شده است. یکی بر اساس ترتیب کتابخانه WiringPi و دیگری بر اساس ترتیب پردازنده +H2 و شماره گذاری فیزیکی پایه های GPIO برد لینوکسی Orange Pi   Zero.همچنین وضعیت LED های موجود روی برد نیز قابل مشاهده است.

image012

پس از نصب کامل کتابخانه و آماده شدن آن، به موضوع اصلی که کنترل چند رله توسط این کامپیوتر است می پردازیم.برای این کار از ماژول های رله که دارای تعداد مختلف رله هستند می توان استفاده کرد.

image015 1 image013 1 image014 1

بهتر است از ماژول هایی که در آن ها اپتوکوپلر جهت ایزوله کردن سیگنال ورودی و تغذیه رله ها به کار رفته است، استفاده کنید چون هم می تواند از ایجاد نویز و تاثیر مخرب احتمالی آن روی برد اصلی جلوگیری کند و هم این امکان را فراهم می آورد که با سطح ولتاژ 3.3 ولتی که پورت GPIO برد اصلی از آن استفاده می کند، بتوان از ماژول رله استفاده کرد.

همانطور که اشاره شد کتابخانه Wiring Pi در زبان های C و C++ قابل استفاده است.بدین جهت نیاز است که آشنایی کوتاهی با این زبان و قواعد آن داشته باشد.در ابتدا باید یک فایل با نام دلخواه و پسوند C++ در مسیر دلخواه ایجاد کنیم.

برای این کار از ویرایشگر متن Nano  که محیط مناسبی نیز برای کد نویسی فراهم می کند استفاده می کنیم. دستور زیر یک فایل با نام Relay و پسوند C++ ایجاد کرده و آن را در محیط Nano باز میکند. توجه داشته باشید که اگر این فایل قبلاً ایجاد شده باشد این ویرایشگر از ایجاد کردن دوباره آن خودداری کرده و همان فایل را باز میکند.

Sudo nano Relay.cpp

اکنون باید کدهای لازم را در این محیط وارد کنیم.نحوه نوشتن برنامه می تواند بسته به نیاز شما متفاوت باشد.در اینجا یک نمونه ساده را برای روشن کردن سه رله به ترتیب و با تاخیر یک ثانیه ای و سپس خاموش کردن آن ها را بررسی می کنیم.

در ابتدا باید سرآیندهای مورد نیاز برای برنامه را بنویسیم.برای این برنامه از سرآیندهای stdio.h برای ورودی و خروجی های استاندارد و نیز WiringPi.h که سر آیند مورد نیاز برای کتابخانه WiringPi می باشد.برای افزودن سر آیندها از دستور Include همانند زیر استفاده می کنیم.

#include <stdio.h>

#include <wiringPi.h>

پس از تعریف سرآیندهای مورد نیاز پایه های مورد استفاده برای اتصال به ماژول رله را به صورت ثابت تعریف میکنیم. این کار هم باعث سهولت در کد نویسی و هم از خطاهای احتمالی در به کارگیری پایه ها جلوگیری می کند.

#define Relay1        1

#define Relay2        4

#define Relay3        5

متغیرهای Relay1،  Relay2 و Relay3 می تواند دارای نام گذاری دلخواه در چهارچوب قوانین نامگذاری متغیرها در زبان C++ را داشته باشد و شماره های روبه روی هر کدام از آن ها پایه GPIO در نظر گرفته شده برای آن متغیر را نشان می دهد که می توان از هر کدام از پایه ها برای این کار استفاده کرد این کار بسته به استفاده و نحوه سیم کشی می تواند متفاوت باشد. پس از تعریف تعریف متغیرها تابع اصلی برنامه را نوشته و وارد آن می شویم.

int main (void)

{

در تابع اصلی در ابتدا دستور چاپ یک رشته متنی را می نویسیم.این نوشته پس از اجرای برنامه در صفحه چاپ می شود و بیانگر شروع برنامه است.برای چاپ رشته متنی از جریان های مختلف خروجی استاندارد همانند printf، cerr، cout و … می توان استفاده کرد.

printf ("Orange Pi Zero Relay Controll\n") ;

با فراخوانی تابع wiringPiSetup مقدار دهی اولیه برای کتابخانه WiringPi انجام می شود.

wiringPiSetup () ;

اکنون با استفاده از تابع pinMode به تعریف پایه های مورد استفاده در برنامه به عنوان خروجی اقدام می کنیم.

pinMode (Relay1, OUTPUT) ;

pinMode (Relay2, OUTPUT) ;



pinMode (Relay3, OUTPUT) ;

این تابع دارای دو آرگومان ورودی می باشد.آرگومان اول پایه مورد نظر برای تنظیم به حالت ورودی یا خروجی و آرگومان دوم مشخص کننده ورودی یا خروجی بودن است.که در این جا با استفاده از OUTPUT هر سه پایه را به عنوان خروجی تعریف کردیم.

اکنون با ایجاد یک حلقه بینهایت به کنترل رله ها به صورت دوره ای می پردازیم.ایجاد حلقه نامتناهی را می توان با استفاده از دستور های for، while یا do while ایجاد کرد.در این کد از حلقه for برای این کار استفاده میکنیم به این صورت که این حلقه را بدون نقطه شروع،شرط برقراری و گام اجرایی مینویسیم.

for (;;)

{

هر قطعه کدی که در داخل این حلقه قرار بگیرد به صورت متناوب و بنا به سرعت پردازش پردازنده اجرا خواهد شد.در این قسمت قصد داریم کاربر عددی را به عنوان ورودی وارد کند و رله متناظر با همان عدد تغییر وضعیت دهد به صورتی که اگر در حالت روشن باشد خاموش و اگر خاموش باشد به حالت روشن برود و با وارد کردن عدد 4 این عمل برای تمامی رله ها انجام شود.

برای این کار ابتدا نیاز است که از با استفاده از جریان های ورودی یک عدد را از کاربر دریافت کنیم و پس از مقایسه آن عدد توسط شرط های لازم، واکنش مورد نظر را انجام دهیم.

برای دریافت ورودی از کاربر می توانیم از جریان استاندارد cin که در زبان c++ وجود دارد استفاده کنیم.این دستور یک ورودی را از کاربر گرفته و آن را در مقدار بازگشتی خود قرار می دهد بنابر این برای استفاده از این مقدار نیاز است که ابتدا متغیر مناسب برای آن تعریف شود. توجه داشته باشید که این تعریف بهتر است قبل از ورود به حلقه انجام شود.

int RelayNumber=0;

پس از تعریف متغیر، با استفاده از دستور زیر می توانیم از کاربر ورودی را دریافت کنیم. برنامه در حالت اجرا با رسیدن به دستور دریافت ورودی، متوقف شده و پس از دریافت ادامه کدها را اجرا می کند.این حالت ممکن است برای کاربر که از نحوه عملکرد برنامه اطلاعی ندارد ناخوشایند باشد.به همین جهت برای بهبود دادن تعامل با کاربر می توانیم قبل از دستور دریافت ورودی یک پیغام مناسب به کاربر نمایش دهیم.

std::cout<<"\r\nPlease Enter Relay Number : ";

std::cin>>RelayNumber;

ورودی دریافت شده در متغیر RelayNumber قرار میگیرد.اکنون میتوانیم با استفاده از ساختار شرطی به بررسی و تطابق عدد وارد شده بپردازیم و در صورت برابر بودن مقدار متغیر با عدد متناظر هر رله عملیات مورد نظر را انجام دهیم و در صورت عدم انطباق با هیچ کدام از آن ها پیغام ورودی نا معتبر را نشان دهد.

برای تغییر وضعیت رله ها از تابع digitalWrite استفاده می کنیم.این تابع دارای دو ورودی می باشد اولی شماره پایه مورد نظر و دیگری وضعیت درخواستی برای تغییر به آن.برای شماره پایه ها از همان مقادیر ثابت تعریف شده برای رله ها استفاده می کنیم و نیز برای مقدار روشن یا خاموش بودن از تابع دیگری که وضعیت هر پایه را با دریافت شماهر پایه آن برمی گرداند استفاده می کنیم به این صورت که با مقدار بازگشتی تابع digitalRead را معکوس کرده و به عنوان آرگومان ورودی دوم تابع digitalWrite قرار میدهیم.با این کار هر بار وضعیت رله از حالت روشن به خاموش و از حالت خاموش به روشن تغییر میکند.

if(RelayNumber==1){

         digitalWrite(Relay1,!digitalRead(Relay1));

      }else if(RelayNumber == 2){

         std::cout<<"Relay 2 Switched\r\n";

         digitalWrite(Relay2,!digitalRead(Relay2));

      }else if(RelayNumber == 3){

         std::cout<<"Relay 3 Switched\r\n";

         digitalWrite(Relay3,!digitalRead(Relay3));

      }else{

         std::cout<<"Invalid Input";

      }

در آخر نیز با نوشتن دستور return 0 برنامه را به اتمام می رسانیم.

لطفا نظر خود را با ما در زمینه این پروژه در میان بگزارید.

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا