lcd arduino

آموزش راه اندازی LCD کاراکتری با آردوینو

مقدمه:

سلام دوستان. این بار میخوایم یه آموزش بدیم از نحوه راه اندازی lcd کاراکتری با برد آردوینو. این جلسه هم یکی دیگر از مجموعه جلسات آردوینو هست. برای دسترسی به تمامی جلسات آردوینو میتونید از لینک های زیر استفاده کنید:

دوره آموزشی آردوینو

LCD کاراکتری که ما میخوایم توی این جلسه استفاده کنیم 16 در 2 هست یعنی دو ردیف داره و توی هر ردیف میتونه 16 کاراکتر رو نشون بده و یه Led بک لایت داره که باعث میشه نور پشت صفحه LCD روشن بشه. شما به ازای هر کاراکتر روی LCD میتونید یه مستطیل ببینید( وقتی نور صفحه نمایش رو کم و زیاد میکنید این مستطیل ها قابل مشاهده هستند).
همونطور که از اسم این LCD هم پیداست این LCD فقط برای نمایش متن به کار میره و شما نمیتونید روش یه عکس ببینید یا کارایی از این دست انجام بدید.

اتصال LCD کاراکتری به آردوینو:

 

اول عکس زیر رو ببینید تا بفهمید کلا چه خبره. بعد در مورد تک تک  این سیم ها توضیحات لازم رو میدیم.

نحوه اتصال آردوینو به  LCD کاراکتری

 

سیم های متصل به آردوینو

برای اتصال یه LCD کاراکتری به آردوینو به 6 تا پین دیجیتال نیاز هست که باید همشون هم به صورت خروجی تعریف بشن. در جدول زیر شماره پایه های متصل رو میتونید ببینید:

نام پین مربوط به LCD

 شماره پایه مربوط به LCD  شماره پایه متصل شده به پین آردوینو
RS 4 7
E 6 8
D4 11 9
D5 12 10
D6 13 11
D7 14 12

 

نکته:
پایه شماره 5 LCD باید به زمین وصل شود

 

سیم های تغذیه LCD کاراکتری

برای روشن شدن خود LCD باید پایه شماره 1 رو به زمین و پایه شماره 2 رو به VCC وصل کنید. همچنین برای روشن شدن LCD بک لایت هم باید پایه شماره 15 رو VCC و پایه شماره 16 رو به زمین وصل کنید.

 

سیم های مخصوص پتانسیومتر

 

برای تنظیم نور صفحه LCD باید یه پتانسیومتر وصل کنیم به LCD . این پتانسیومتر سه تا پایه داره. یه پایه اش که اول یا سومش( از هر طرفی که بخونید) یکیش باید وصل بشه به VCC و اون یکی هم باید وصل بشه به زمین. میمونه پایه وسط که اصل کاری هست. پایه وسط هم شما حتما باید وصل کنید به پایه شماره 3 LCD کاراکتری (توی شکل بالا میشه اون سیم زرد رنگه که از اینور LCD به اونورش وصل)

یه چیزی که خیلی وقتا این وسط گیج کننده است اینه که یه سری سیم ها رو وصل میکنیم بعد شماره پایه ها یادمون میره. مثلا نمیدونیم الان تا پایه چند رو وصل کردیم. پایه آخر از lcd کاراکتری که بهش سیم وصل کردیم پایه 9 بود یا پایه 10. برای حل این مشکل میتونید یه کار کنید. lcd رو از شروع ستون اول روی بردبرد بچسبونید و برای شمارشش دیگه اونقدر دردسر نمیکشید. حالا اگه این وسط بردبرد شما ستون هاش هم شماره داشت که چه بهتر، دیگه همه چی حل میشه.

 

نکته:
اگه LCD خودتون رو اولین بار از یه جایی میخرید احتمال پین هدری بهش لحیم نشده. برای قرار گرفتن LCD روی بردبرد حتما باید پین هدر بهش لحیم کنید.

اگه دوست دارید هم یه آموزش کامل از لحیم کردن بخونید میتونید از آموزش زیر که توی سایت ما منتشر شده استفاده کنید:

آموزش کامل لحیم کاری

 

کد راه اندازی LCD کاراکتری با آردوینو:

 

خود نرم افزار arduino پیش فرض یه نمونه برنامه از راه اندازی lcd کاراکتری با آردوینو داره که میتونید از مسیر زیر به اون دسترسی پیدا کنید:

مسیر:  File >> Example>>Liquid Crystal >> Hello world

 

توضیح خط به خط کد

 

include <liquidCrystal.h>

این خط برای اضافه کردن کتابخونه مربوط به lcd کاراکتری هست.

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

از این خط برای تعریف پایه هایی از آردوینو که به lcd کاراکتری متصل میشن استفاده میشه. طبق این خط پایه های 12 و 11 و 5 و 4 و 3 و 2 از آردوینو به lcd کاراکتری وصل میشن.

تذکر: ما شماره این پایه ها رو دوست نداریم و میخوایم خودمون عوضش کنیم به خاطر همین از شماره دستور زیر استفاده میکنیم:

LiquidCrystal lcd(7 , 8 , 9 , 10

, 11 ,12);

یعنی الان طبق دستور جدید پایه های 7 و 8 و 9 و 10 و 11 و 12 به lcd کاراکتری وصل میشن.

lcd.begin(16, 2);

این دستور میگه که LCD که ما به آردوینو وصل کردیم یه LCD 16*2  هست.

lcd.print("hello, world!");

با استفاده از این دستور عبارت hello , world روی LCD کاراکتری نمایش داده میشه. طبیعی هست که اگه بخوایم متن دیگه ای رو نمایش بده باید به جای hello ,world متن مورد نظر خودمون رو بنویسیم.

lcd.setCursor(0, 1);

با این دستور LCD میره به ردیف اول و سطر دوم و شروع میکنه به نوشتن داده ها.

 

نکته:
چون برای شمردن تعداد سطرها و ستون ها از عدد 0 شروع کرده برای نمایش روی ردیف اول باید عدد 0 و برای نمایش روی سطر دوم از عدد 1 استفاده کنیم. در صورتی که میخواید سطر دیگه ای رو برای نمایش انتخاب کنید میتونید این شماره ها رو تغییر بدید.

lcd.print(millis() / 1000);

این دستور میاد و تعداد لحظات سپری شده از موقعی که میکرو ریست شده رو روی LCD کاراکتری نمایش میده.

در نهایت این کد رو روی برد arduino بریزید و نتیجه نهایی کار شما باید یه چیزی بشه شبیه به این شکل:

نمایش متن روی LCD کاراکتری  با arduino

دوستان برای این جلسه فک میکنم کافی ایشالا. ایشالا سعی میکنیم یه جلسه دیگه هم بذاریم و تمامی دستورات LCD کاراکتری رو توی آردوینو به طور کامل بررسی کنیم. مثل همیشه اگه دوست دارید از ما مطلع بشید و مطالب جدید رو بدونید کی منتشر میشه میتونید ما رو در تلگرام و یا اینستاگرام دنبال کنید:

اگه هم که خیلی عاشق ما هستید که سایت ما رو به دوستانتون معرفی کنید. ممنون از همکاریتون. 😉 

راه اندازی سروو موتور با آردوینو

راه اندازی سروو موتور با آردوینو

سلام و عرض ادب خدمت تمامی دوستان.توی این جلسه قصد داریم سروو موتور رو با برد آردوینو راه اندازی کنیم.با ما همراه باشید.

سروو موتورها چه موتورهایی هستن؟

این موتورها بیشتر برای چرخش های دقیق به کار میرن.کاربردهاشون هم بیشتر توی بازو های مکانیکی هست که نیازه تا یه درجه خاصی بازو حرکت کنه.دو تا شرکت بزرگ هم که این نوع موتورها رو تولید میکنن شرکت های Hitec و Futaba هستن.

قطعات مورد نیاز برای اتصال سروو موتور به آردوینو:

  1. برد arduino (ما از مدل uno استفاده کردیم)
  2. یک عدد موتور سروو
  3. سیم های Jumper

 

نحوه اتصال سروو موتور به آردوینو:

شکل زیر گویای همه چیز هست:

نحوه اتصال سروو موتور به آردوینو

موتور سروو سه تا سیم مادگی داره که باید به آردوینو وصل کنیم.سیم اول VCC هست که باید وصل بشه به 5 ولت.(سیم قرمز رنگ در شکل بالا) سیم دوم سیم زمین موتور سروو هست که باید به پایه GND آردوینو وصل بشه(سیم مشکی رنگ) و در نهایت سیم سوم دیتا هست هم که باید وصل بشه به یکی از پایه های دیجیتال آردوینو که ما اینجا از پایه شماره 3 آردوینو استفاده کردیم(سیم زرد رنگ در شکل بالا)

کد راه اندازی موتور سروو:

خدایی اینقدر این کد ساده است که من دیگه تیکه تیکه اش نکردم.یه جا توضیحش میدم.

include &amp;amp;lt;servo.h&amp;amp;gt; 

int servoPin = 3; 

Servo Servo1; 
void setup() { 

   Servo1.attach(servoPin); 
}
void loop(){ 

   Servo1.write(0); 
   delay(1000); 

   Servo1.write(90); 
   delay(1000); 

   Servo1.write(180); 
   delay(1000); 
}

توضیح کد:

در ابتدای کار کتابخونه موتور سروو به برنامهاضافه میشه.در خط بعد پایه دیجیتالی که موتور بهش وصل میشه رو به صورت یه متغیر integer تعریف میکنیم.در خط بعدی یه object به نام Servo1 تعریف میکنیم.(اگه نمیدونید object چی هست به این لینک مراجعه کنید).در تابع Setup هم تنها کاری که نیاز هست انجام بدیم اینه که موتورمون رو به پایه 3 دیجیتال attach کنیم.در نهایت هم در تابع loop با استفاده از دستورات ()Servo1.write و آرگومان ورودیش به موتور میگیم که چند درجه بچرخه.در اینجا ما ابتدا به موتور گفتیم توی زاویه 0 درجه وایسا بعد یه ثانیه صبر کن و بعد از اون برو توی زاویه 90 درجه بچرخ ، دوباره یه ثانیه صبر میکنه و در نهایت هم بهش میگیم برو توی زاویه 180 درجه.دوباره یه ثانیه صبر میکنه و برمیگرده اول تابع loop و در نهایت میاد برمیگرده به حالت اولش و توی زاویه صفر قرار میگیره.

این هم از این جلسه.زیاد سخت نبود.ایشالا در آینده وارد پروژه های سخت تر و پیچیده تر هم میشیم.در نهایت اگه دوست دارید که بدونید چه مطالب جدیدی توی سایت ما منتشر میشه و یا مطالبی رو بخونید که توی سایت منتشر نمیشن میتویند ما رو در کانال تلگرام و یا اینستاگراممون دنبال کنید.

 

تا جلسه آینده خدانگهدار

آردوینو و آلتراسونیک-بخش دوم{راه اندازی}

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

 

الف:اتصال ماژول به برد آردوینو:

اول خالی از لطف نیست یه بار دیگه پایه های این ماژول رو دوباره بررسی کنیم.شکل زیر رو ببینید:

srf05 pins

در عکس زیر هم میتونید نحوه اتصال این ماژول رو به صورت خیلی واضح ببینید:

srf05 arduino

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

srf05 arduino connection

خوب الان دیگه فک کنم به طور کامل فهمیده باشید که چجور باید آردوینو رو به srf05 وصل کرد.در مورد این که چرا انی پین ها هم برای اتصال در نظر گرفته شده اند توی کد بیشتر متوجه میشید.

ب:کدنویسی ماژول:

مثل سایر ماژول هایی که به آردوینو وصل میشن برای آلتراسونیک هم یه کتابخونه خیلی خوب وجود داره که میتونیم بدون هیچ دردسری با استفاده از اون ماژول رو راه اندازی کنیم و کلی هم دستورات مختلف رو روش اجرا کنیم.کتابخونه مورد نظر ما Newping.h نام داره:

معرفی کتابخانه Newping.h :

این کتابخونه برای ماژول های مختلف آلتراسونیک مثل SR04, SRF05, SRF06, DYP-ME007 کاربرد داره  و دارای دستورات خیلی زیاد و انعطاف پذیری هست.برای استفاده از این کتابخونه اول باید اون رو دانلود کنید و به برنامه تون اضافه کنید.برای دانلود از لینک زیر استفاده کنید:

لینک دانلود کتابخانه newping.h

بعد از دانلود باید اون رو به آردوینو اضافه کنید که نحوه اضافه کردنش هم به این صورت هست که فولدر این فایل رو در پوشه Library در محل نصب یا اگه پرتابل هست در محل قرار داشتن نرم افزار کپی میکنید.

حالا دیگه رسیدیم به اصل مطلب که کدنویسیش هست:

#include <NewPing.h>

این خط که قیافه اش دیگه خیلی واضحه مربوط به اضافه کردن کتابخانه newping.h به برنامه هست.

#define TRIGGER_PIN 12
#define ECHO_PIN  11
#define MAX_DISTANCE 200

این سه خط هم که خیلی واضحه.خط اول شماره پایه ای که باید Trigger به اون وصل بشه نشون داده میشه.که پایه شماره 12 هست.خط دوم مربوط به اتصال پایه Echo هست و با اون میگیم که پایه Echo باید به پایه 11 دیحیتال از برد آردوینو وصل بشه و در نهایت در خط سوم میگیم که ماکزیمم فاصله ای که آلتراسونیک اندازه گیری کنه چقدر باشه که این مقدار برابر 200 سانتی متر قرار داده شده.

 NewPing sonar ( TRIGGER_PIN , ECHO_PIN , MAX_DISTANCE );  

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

void setup(){
Serial.begin(115200);
}

خیلی واضح هست که این دستور مربوط به راه اندازی پورت سریال با بادریت 115200 هست.

void loop{
delay(50);
int uS = Sonar.ping();
Serial.print("Ping:");
Serial.print(uS/US_ROUNDTRIP_CM);
Serial.println("CM");
}

توی تابع loop که دستوراتش همیشه اجرا میشن ابتدا با هر بار خواندن 50 میلی ثانیه صبر میکنه برنامه تا عملیات با دقت انجام بشه.
خط بعد ابتدا یه پالس رو میفرسته و سپس مدت زمانی که طول میکشه تا اون پالس برگرده رو توی متغیر uS قرار میده.
خط چهارم عبارت Ping رو روی پنجره پورت سریال نمایش میده.
خط پنجم مقدار فاصله رو بر حسب ساانتی متر حساب میکنه و روی پنجره سریال نمایش میده.

 نکته:عبارت : US_ROUNDTRIP_CM یک مقدار ثابت هست و مقدارش برابر 50 قرار داره.مکانیزم درونی srf05 که با pic روی ماژول هم ارتباط داره به این صورت هست که هر 50 میکروثانیه که طول میکشه تا موج بره و برگرده تقریبا 1 سانتی متر فاصله وجود داره.این رابطه رو هم با هم عبارت
معروفx= v*t بدست میارن.
خط ششم هم عبارت cm رو روی پنجره سریال نمایش میده.
در آخر اگه میخواید کد رو به صورت یکجا داشته باشید میتونید از لینک زیر اون رو دانلود کنید:

برای دریافت آخرین مطالب سایت  و همچنین مطالب منحصر به فرد دیگر که در سایت منتشر نمی شوند میتوانید در کانال تلگرام ما عضو شوید و یا در اینستاگرام ما را فالوو کنید:

آلتراسونیک و arduino-بخش اول

دوستان سلام.با یکی دیگه از مجموعه جلسات آموزش arduino در خدمتتون هستیم.توی این جلسه میخوایم ماژول کاربردی SRF05 رو راه اندازی کنیم.

ماژول های آلتراسونیک یا همون فاصله سنج چیست ؟

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

کاربرد این ماژول ها در کجاست؟

اکثر استفاده این دسته از ماژول ها در رباتیک هست که برای تخمین فاصله ربات از یه جسم یا مانع به کار میره تا بتونه خودش رو تنظیم کنه و درست حرکت کنه.

این ماژول های چجوری کار میکنن؟

این ماژول ها دو تا پایه دارن به نام ECHO و Trigger که ما میاییم و پایه Trigger رو یه لحظه یک میکنیم (این یک لحظه باید بیشتر از 10 میکرو ثانیه باشه)و خود این ماژول یه سیگنال رو 8 بار با یه پهنای پالس خیلی کم و میفرسته بعدش اون پالسه برمیگرده و به پایه ECHO داده میشه و ما این پایه رو به میکرو وصل میکنیم و با استفاده از یه سری محاسبات فاصله رو بدست میاریم.

 

ماژول SRF05:اول یه دونه عکس از این ماژول رو ببینید.

Ultrasnonic

این ماژول یه ماژول سبز رنگ هست(این رنگش مهمه چون باهاش کار داریم) که میتونه فاصله رو از رنج 3 سانتی متر الی 5 متر تشخیص بده.معروف هست به آلتراسونیک انگلیسی.یه نمونه دیگه از همین التراسونیک هم هست که به رنگ آبی هست و ارزون هست که چینی تشریف داره و سه سوته هم میسوزه.اگه میخواید یه کار تر و تمیز انجام بدید پیشنهاد میکنم حتما از همین ماژول استفاده کنید.

پایه های این ماژول هم توی عکس زیر اومده:

 

ultrasonic pin

ماژول SRF05 دارای دو ردیف پین است:

1-پین هایی که برای پروگرم کردن میکرو PIC هست که روی برد قرار گرفته که پین های سمت راست هستند.

2-پین هایی که در اختیار ما هستند و میتوانیم با آن با ماژول ارتباط برقرار کنیم و فاصله را بخوانیم که پین های سمت چپ هستند.

 

ما با پین های سمت راست کاری نداریم و این پین ها همان ابتدای کار توسط شرکت سازنده پروگرم میشوند.کار ما با پین های سمت چپ است.

معرفی پین های سمت چپ:

1-VCC  یا 5V : این پایه مربوط به تغذیه ماژول است و باید به 5 ولت وصل شود.

2-ECHO Output :این پایه خروجی پایه ECHO هستش که با استفاده از اون و انجام یه سری عملیات ها میتونیم فاصله رو تشخیص بدیم.

3-Trigger :این پایه رو یه لحظه یک میکنیم و خود ماژول یه سیگنال رو برامون میفرسته.

4-Mode :این پایه برای تعیین مد کارکرد ماژول به کار میره(در مورد مد ها به طور کامل در پایین توضیح دادیم)

5-GND:پایه مربوط به ground ماژول که باید به زمین وصل بشه.

 

معرفی مدهای کاری ماژول:

این ماژول در دو مد کار میکنه که دیتاشیت ماژول اون ها رو به نام Mode1 و Mode2 نامگذاری کرده که در زیر به تفصیل هر کدومشون رو توضیح دادیم:

مد کاری 1 :

توی این مد پایه های Trigger و Echo از هم جدا هستند.کدهایی که توی سری قبلی این ماژول یعنی  SRF04 کاملا سازگار است و میتوان تمامی کدهایی که توی اون سری رو به کار بردید اینجا هم استفاده کنید.برای این که وارد این مد بشید فقط کافیست به پایه Mode کاری نداشته باشید و چیزی رو هم بهش وصل نکرده باشید.البته این پایه به طور داخلی Pull up شده.شکل زیر رو ببینید:

Ultrasnoinc mode1

نحوه عملکرد:ابتدا از طریق پایه Trigger یه پالس با حداقل پهنای 10 میکروثانیه فرستاده میشه (ردیف اول در عکس بالا)که بعد خود ماژول 8 پالس متوالی رو میفرسته(ردیف دوم در عکس بالا) و سپس پالس برگشتی باید حداقل در رنج 100us تا 25ms باشه تا ماژول بتونه فاصله رو تشخیص بده و با استفاده از یه سری محاسبات هم این پهنای پالس به فاصله تبدیل میشه.

مد کاری 2:

توی این مد برای راه اندازی پایه های Echo و Trigger یکی میشن.در واقع پایه Echo بدون اتصال میمونه و پایه Trigger هم عمل Trig رو انجام میده و هم نقش پایه Echo رو بازی میکنه.برای این که ماژول هم در این مد کار کنه باید پایه Mode به زمین وصل بشه.شکل زیر رو ببینید:

Ultrasonic-mode2

احتمالا دیگه خودتون میتونید این شکل رو تحلیل کنید.نحوه کارکردش به این شکل هست که ابتدا یه پالس با پهنای حداقل 10 میکروثانیه از طریق پایه مشترک فرستاده میشه(ردیف اول در شکل بالا)بعد خود ماژول 8 تا پالس با پهنای کمتر میفرسته (ردیف دوم در شکل بالا) و سپس نتیجه ی این 8 تا پالس از طریق پایه مشترک به ما داده میشه (بخش قرمز رنگ ردیف اول در شکل بالا)که پهنایی بین 100 میکروثانیه تا 25 میلی ثانیه داره و  با برنامه نویسی میکروکنترلر میتونیم فاصله رو تشخیص بدیم.

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

برای دریافت آخرین مطالب سایت  و همچنین مطالب منحصر به فرد دیگر که در سایت منتشر نمی شوند میتوانید در کانال تلگرام ما عضو شوید و یا در اینستاگرام ما را فالوو کنید:

 

 

 

 

 

راه اندازی Gy-80 با آردوینو -بخش دوم{اتصال ماژول و تست آن}

دوستان سلام.

توی بخش قبل ماژول GY-80  رو معرفی کردیم که میتونید از اینجا اون مطلب رو بخونید.توی این قسمت میخوایم نحوه اتصال این ماژول به برد arduino و همچنین کدنویسی اون صحبت کنیم.با ما همراه باشید. 


اتصال ماژول GY-80 به arduino:

اگه قسمت اول این نوشته رو خونده باشید گفتیم که میتونیم این ماژول رو با دو پروتکل I2C و SPI راه اندازی کنیم.ما در اینجا برای راه اندازی این ماژول از پروتکل I2C استفاده میکنیم.
این پروتکل دو تا سیم اصلی داره.یکی SDA که برای دیتا هست و اون یکی هم SCL که برای کلاک به کار میره. نمایی از این پروتکل رو در شکل زیر میبینید:

راه اندازی Gy-80 با آردوینو

 

پس با این حساب برای اتصال ماژول به برد آردوینو به 4 سیم نیاز هست.دو تا مربوط به تغذیه و دو تا سیم هم مربوط به پروتکل I2C که توی شکل زیر مشخص شده.

راه اندازی Gy-80 با آردوینو

پین VCC_IN (سیم قرمز رنگ) که باید وصل بشه به 5 ولت برد.پین GND(سیم مشکی) که باید وصل به GND برد .پین SCL (سیم زردرنگ)که باید وصل بشه به پایه A5 (برای برد UNO ) یا پایه 21 برای برد Mega  و پایه SDA (سیم نارنجی رنگ)که باید وصل بشه به A4 برای UNO یا 20 برای Mega

نکته 1 :
میتونید به جای استفاده ازپایه VCC_IN از پایه VCC_3.3V استفاده کنید که در این صورت باید اون رو حتما به ولتاژ 3.3 ولت روی برد وصل کنید.
نکته 2:
روی ماژول GY-80  هیچگونه led وجود نداره که به شما وضعیت برد رو نشون بده.مثلا یه Led سبز رنگ باشه که نشون بده ولتاژ ولتاژ وصل شده بهش.(بر خلاف ماژول های دیگر مثل GY-521  که یه Led روی خودش داره که وضعیت اتصال ولتاژ رو نشون میده)

چک کردن اتصالات و سالم بودن برد:

برای این که چک کنیم ببینیم ماژولمون سالم هست یا نه و این که به طور کامل به برد وصل شده از یک نمونه کد استفاده میکنیم که معروف هست به I2C Scanner.

 

I2C Scanner چیه و به چه دردی میخوره؟
این نمونه کد برای چک کردن و فهمیدن این که چه قطعات و سنسورهایی از طریق I2C به بردمون وصل هستن و روی سریال مانیتور هم بهمون نشون میده که یه قطعه با فلان آدرس به بردمون وصل هست(توی پروتکل I2C هر سنسور و قطعه یه آدرس داره که به وسیله اون آدرس با برد در ارتباطه و داده ها رو رد و بدل میکنه.)

این کد رو در زیر میبینید و میتونید از این لینک دانلود کنید:


کد I2C Scanner

توصیح خطوط برنامه:

#include&amp;amp;lt;Wire.h&amp;amp;gt;;
 
 
void setup()
{
 Wire.begin();
 
 Serial.begin(9600);
 while (!Serial); // Leonardo: wait for serial monitor
 Serial.println("\nI2C Scanner");
}

 

در  خط اول که کتابخونه Wire.h به برنامه معرفی میشه که این کتابخونه برای پروتکل i2c به کار میره.

توی تابع Setup  هم پروتکل I2C شروع به کار میکنه و ارتباط سریال هم برقرار میشه و  بادریت اون روی 9600 تنظیم میشه سپس در پنجره سریال عبارتI2C Scanner نوشته میشه.

void loop()
{
 byte error, address;
 int nDevices;
 
 Serial.println("Scanning...");
 
 nDevices = 0;
 for(address = 1; address &amp;amp;lt; 127; address++ )
 {
 // The i2c_scanner uses the return value of
 // the Write.endTransmisstion to see if
 // a device did acknowledge to the address.
 Wire.beginTransmission(address);
 error = Wire.endTransmission();
 
 if (error == 0)
 {
 Serial.print("I2C device found at address 0x");
 if (address&amp;amp;lt;16)
 Serial.print("0");
 Serial.print(address,HEX);
 Serial.println(" !");
 
 nDevices++;
 }
 else if (error==4)
 {
 Serial.print("Unknow error at address 0x");
 if (address&amp;amp;lt;16)
 Serial.print("0");
 Serial.println(address,HEX);
 } 
 }
 if (nDevices == 0)
 Serial.println("No I2C devices found\n");
 else
 Serial.println("done\n");
 
 delay(5000); // wait 5 seconds for next scan
}

 در تابع Loop دو متغیر از نوع بایت به اسم های error, address تعریف میشه همچنین یک متغیر هم از نوع int تعریف میشود که در ادامه میفهمید این  متغیرها برای چی تعریف شدن.

 خط بعدی روی پورت سریال عبارت …Scannig نوشته میشه.که یه جورایی داره نشون میده برنامه در حال اسکن سنسورهایی هست که به میکرو از طریق I2C وصل هست.

در خط بعدی مقدار متغیر nDevices برابر 0 قرار داده میشه.(این متغیر مربوط به تعداد سنسور و ماژول هایی هست که به برد وصل شده و به طور پیش فرض برابر صفر قرار داده میشه)

در خط بعد یه حلقه for تعریف میشه که توی این حلقه مقدار address از 1 تا 126 تغییر میکنه و هر دفعه یکی بهش اضافه میشه.  با استفاده از این خط مقدار متغیر adress با استفاده از پروتکل I2C فرستاده میشه تا هر Device و سنسوری که روی خط هست و این آدرس رو داره دریافت کنه.

خط بعد مربوط به پایان ارتباط I2C هست و کسی که این آدرس رو داره یه بایت به میکروکنترلر میفرسته و میگه که من این این آدرس رو دارم.این بایت همون متغیر error هست که در ادامه خیلی باهاش سر و کار داریم.

سوال:این 1 تا 126 از کجا اومده؟ پروتکل I2C به طور همزمان میتونه از 128 آدرس مختلف پشتیبانی که که آدرس ها از 0 تا 127 هستند که میشه 128 تا آدرس ولی معمولا آدرس های اول و آخر این بازه یعنی 0 و 127 قرار داده نمیشه پس بازمون میشه 1 تا 126

در اینجا دو حالت پیش میاد:

اگر آدرسی که میکرو میفرسته روی خط موجود باشه در این صورت مقدار صفر توی متغیر error نوشته میشه  و میکرو میفهمه که این آدرس روی خط موجود هست و اگر اون آدرس روی خط موجود نباشه هم مقدار 4 در متغیر error نوشته میشه.

اگر آدرس روی خط موجود باشد(حلقه if ):
در این صورت برنامه وارد حلقه if اول میشود و طبق آن ابتدا روی پورت سریال عبارت I2C device found at address 0x نوشته میشود.پس از اون اگه این آدرس کوچکتر از 16 باشه ابتدا روی پورت سریال مقدار 0 نوشته میشه و بعد آدرس رو مینویسن و اگه نباشه هم مستقیم آدرس رو به صورت هگز روی پورت سریال مینویسن.

اگر آدرس روی خط موجود باشد(حلقه else if):

در این صورت برنامه وارد حلقه else if میشود و طبق آن ابتدا روی پورت سریال عبارت Unknow error at address 0x نوشته میشود.پس از اون اگه این آدرس کوچکتر از 16 باشه ابتدا روی پورت سریال مقدار 0 نوشته میشه و بعد آدرس رو مینویسن و اگه نباشه هم مستقیم آدرس رو به صورت هگز روی پورت سریال مینویسن.

 

ماجرای این عدد 16 چیه؟اصلا چرا این هست؟
جواب این سوال رو نمیدم و خودتون بشینید فکر کنید فقط یه نکته ریز داره که مربوط میشه به اعداد هگز

در پایان کد هم تعداد Device هایی که به برد وصل هستند رو نشون میده که این مقدار، عدد مربوط به  متغیر nDevices هست.(نیاز به توضیح بیشتری نداره.همه چیزش مشخصه)

آخرین خط برنامه هم مربوط به یه تاخیر 5 ثانیه ای هست که باعث میشه این عمل Scan هر 5 ثانیه یک بار انجام بشه.

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

برای دریافت آخرین مطالب سایت  و همچنین مطالب منحصر به فرد دیگر که در سایت منتشر نمی شوند میتوانید در کانال تلگرام ما عضو شوید و یا در اینستاگرام ما را فالوو کنید: