توضیحات
راهنمای راه اندازی برنامه ریزی برد در محیط کامپایلر آردوینو:
اما برای کد نویسی این برد در محیط کامپایلر آردینو لازم است مراحل زیر را دنبال کنید. این برد داری بوت لدی می باشد و می توانید با تنظیم جامپر ها روی RX,TX از طریق درگاه USB برد را در محیط آردوینو برنامه ریزی نمائید. این برد از پردازنده مگا8 استفاده می کند پس لازم است ابتدا این کتاب خانه را نصب و به کامپایلر معرفی کنید که طبق مراحل زیر انجام می شود. در عکس زیر نسبت پایه های آی سی های مگا 8 و سایر از جمله 328 که نمونه برد UNO می باشد مقایسه شده است.
در اولین گام به منوی Files > Preferences وارد شوید. و در مکان مشخص شده لینک زیر را کپی و پیست کرده و برروی OK بزنید.
https://mcudude.github.io/MiniCore/package_MCUdude_MiniCore_index.json
حالا از منوی Tools > Board > Boards Manage را کلیک کنید، در ابتدا از اتصال به اینتنرت مطمئن شوید. در پنجره نمایش داده شده عبارت “minicore” را سرچ کنید. طبق تصویر زیر روی گزینه install بزنید و منتظر بمونید تا نصب پکیج بصورت کامل انجام شود.
طبق توضحیات ارائه شده، این پکیج مناسب برای آیسی های و…ATMEGA328, 168, 48, 88, 8 میباشد. بعد از انجام این مرحله وارد منوی Tools > Boards شده و از بین بورد های موجود با اسکرول کردن به پایین در قسمت MiniCore، آیسی مورد نظر را برای پروگرام کردن انتخاب کنید. که ما در این مطلب چون از ATMEGA8 استفاده میکنیم پس همین مورد را انتخاب خواهیم کرد.
با توجه به وجود کریستال 16Mhz بعد از انتخاب ATMEGA8، مجدد به منوی Tools مراجعه میکنیم . طبق تصویر زیر مشاهده میکنید که چند قسمت جدید به این منو اضافه شده است که در ادامه آنها را بررسی خواهیم کرد.


کد های سنسور فاصله (التراسونیک)
const int trigPin = A1; // پایه دیجیتال برای ارسال سیگنال
const int echoPin = 13; // پایه دیجیتال برای دریافت سیگنال
void setup() {
Serial.begin(9600);
// تنظیم پایهها
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
}
void loop() {
// خواندن فاصله از حسگر اولتراسونیک
float distance = getDistance();
// چاپ نتایج
Serial.print("Distance: ");
Serial.print(distance);
Serial.println(" cm");
}
// تابع برای خواندن فاصله از حسگر اولتراسونیک
float getDistance() {
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
long duration = pulseIn(echoPin, HIGH);
float distance = (duration * 0.034) / 2; // تبدیل میکروثانیه به سانتیمتر
return distance;
}
کد های سنسور نوری ( LDR )
const int ldrPin1 = A4; // حسگر نوری اول
const int ldrPin2 = A5; // حسگر نوری دوم
void setup() {
Serial.begin(9600); // شروع ارتباط سریال
}
void loop() {
int ldrValue1 = analogRead(ldrPin1); // خواندن مقدار حسگر اول
int ldrValue2 = analogRead(ldrPin2); // خواندن مقدار حسگر دوم
// نمایش مقدار حسگر 1
Serial.print("LDR1 Value: ");
Serial.print(ldrValue1);
Serial.print(" - ");
Serial.println(getLightStatus(ldrValue1));
// نمایش مقدار حسگر 2
Serial.print("LDR2 Value: ");
Serial.print(ldrValue2);
Serial.print(" - ");
Serial.println(getLightStatus(ldrValue2));
Serial.println("---------------------"); // جداکننده برای خوانایی بهتر
delay(1000); // تاخیر 1 ثانیهای برای خواندن مقادیر جدید
}
// تابع برای تعیین وضعیت نور (شرایط برعکس شدهاند)
String getLightStatus(int value) {
if (value > 800) {
return "نور نیست";
} else if (value > 500) {
return "نور کم است";
} else if (value > 200) {
return "نور بالاست";
} else {
return "نور خیلی زیاد شد";
}
}
کد های سنسور IR
const int IR_SENSOR_PIN = A5; // پایهای که سنسور IR به آن وصل شده
void setup() {
pinMode(IR_SENSOR_PIN, INPUT); // تنظیم سنسور IR به عنوان ورودی
Serial.begin(9600); // شروع ارتباط سریال
Serial.println("IR Sensor is ready to detect signals!");
}
void loop() {
int sensorState = digitalRead(IR_SENSOR_PIN); // خواندن وضعیت سنسور
if (sensorState == LOW) { // اگر سنسور فعال شود (بسته به نوع سنسور، ممکن است HIGH باشد)
Serial.println("IR signal detected!");
} else {
Serial.println("SINGAL is not deteced yet");
}
delay(100); // تاخیر برای جلوگیری از اسپم شدن پیام
}
کد حرکت موتور ها با ارسال داده از سریال:(با اتصال جامپرها در وضعیت RX-TX):
#define M1_1 10
#define M1_2 9
#define M2_1 A0
#define M2_2 12
#define M3_1 3
#define M3_2 2
#define M4_1 5
#define M4_2 6
void setup() {
Serial.begin(9600); // شروع ارتباط سریال
pinMode(M1_1, OUTPUT);
pinMode(M1_2, OUTPUT);
pinMode(M2_1, OUTPUT);
pinMode(M2_2, OUTPUT);
pinMode(M3_1, OUTPUT);
pinMode(M3_2, OUTPUT);
pinMode(M4_1, OUTPUT);
pinMode(M4_2, OUTPUT);
turnOffMotors(); // خاموش کردن همه موتورها در ابتدای برنامه
}
// تابع خاموش کردن همه موتورها
void turnOffMotors() {
digitalWrite(M1_1, LOW); digitalWrite(M1_2, LOW);
digitalWrite(M2_1, LOW); digitalWrite(M2_2, LOW);
digitalWrite(M3_1, LOW); digitalWrite(M3_2, LOW);
digitalWrite(M4_1, LOW); digitalWrite(M4_2, LOW);
Serial.println("All motors OFF");
}
// تابع روشن کردن یک موتور مشخص
void turnOnMotor(int pin1, int pin2, int motorNumber) {
digitalWrite(pin1, HIGH);
digitalWrite(pin2, LOW);
Serial.print("Motor ");
Serial.print(motorNumber);
Serial.println(" ON");
}
void loop() {
if (Serial.available()) {
char command = Serial.read(); // خواندن فرمان دریافتی
switch (command) {
case '1':
turnOnMotor(M1_1, M1_2, 1);
break;
case '2':
turnOnMotor(M2_1, M2_2, 2);
break;
case '3':
turnOnMotor(M3_1, M3_2, 3);
break;
case '4':
turnOnMotor(M4_1, M4_2, 4);
break;
case 'A':
turnOnMotor(M1_1, M1_2, 1);
turnOnMotor(M2_1, M2_2, 2);
turnOnMotor(M3_1, M3_2, 3);
turnOnMotor(M4_1, M4_2, 4);
Serial.println("All motors ON");
break;
case 's':
turnOffMotors();
break;
}
}
}
حرکت سرو موتور با دستورات سریال:
#include <Servo.h> // کتابخانه سرو موتور
Servo myServo; // شیء سرو موتور
const int servoPin = 11; // پایه متصل به سرو موتور
int lastAngle = 90; // مقدار پیشفرض برای جلوگیری از بازگشت ناگهانی به صفر
void setup() {
Serial.begin(9600); // شروع ارتباط سریال
myServo.attach(servoPin); // اتصال سرو موتور به پایه مشخص شده
myServo.write(lastAngle); // قرار دادن موتور در زاویه پیشفرض
Serial.println("Enter angle (1 to 180):"); // پیام راهنما
}
void loop() {
if (Serial.available() > 0) { // بررسی دریافت داده از سریال
int angle = Serial.parseInt(); // خواندن مقدار عددی از سریال
if (angle >= 1 && angle <= 180) { // بررسی محدوده معتبر زاویه
lastAngle = angle; // ذخیره زاویه جدید
myServo.write(angle); // حرکت سرو موتور به زاویه مورد نظر
Serial.print("Servo moved to: ");
Serial.print(angle);
Serial.println(" degrees");
} else {
Serial.println("Invalid angle! Enter a value between 0 and 180.");
}
Serial.read(); // پاک کردن بافر سریال برای جلوگیری از دریافت مقادیر ناخواسته
}
}
کنترل LED های برد با دو کلید برد:
const int led1 = 8; // پایه LED1
const int led2 = 7; // پایه LED2
const int switch1 = A2; // پایه کلید 1
const int switch2 = A3; // پایه کلید 2
void setup() {
pinMode(led1, OUTPUT); // تنظیم پایه LED1 به عنوان خروجی
pinMode(led2, OUTPUT); // تنظیم پایه LED2 به عنوان خروجی
pinMode(switch1, INPUT_PULLUP); // تنظیم کلید 1 به عنوان ورودی با Pull-up داخلی
pinMode(switch2, INPUT_PULLUP); // تنظیم کلید 2 به عنوان ورودی با Pull-up داخلی
}
void loop() {
// خواندن وضعیت کلیدها
bool state1 = digitalRead(switch1);
bool state2 = digitalRead(switch2);
// کنترل LEDها بر اساس وضعیت کلیدها
digitalWrite(led1, !state1); // اگر کلید 1 فشرده شود، LED1 روشن شود
digitalWrite(led2, !state2); // اگر کلید 2 فشرده شود، LED2 روشن شود
}
منطق AND ,OR با بازر:
const int led1 = 8; // پایه LED1 برای OR
const int led2 = 7; // پایه LED2 برای AND
const int buzzer = 4; // پایه بازر برای AND
const int switch1 = A2; // پایه کلید 1
const int switch2 = A3; // پایه کلید 2
void setup() {
pinMode(led1, OUTPUT);
pinMode(led2, OUTPUT);
pinMode(buzzer, OUTPUT);
pinMode(switch1, INPUT_PULLUP);
pinMode(switch2, INPUT_PULLUP);
Serial.begin(9600);
}
void loop() {
// خواندن وضعیت کلیدها (0 یعنی فشردهشده)
bool state1 = !digitalRead(switch1);
bool state2 = !digitalRead(switch2);
// OR: اگر حداقل یکی از کلیدها فشرده شود، LED1 روشن شود
bool OR_Result = state1 || state2;
digitalWrite(led1, OR_Result);
// AND: اگر هر دو کلید همزمان فشرده شوند، LED2 و بازر فعال شوند
bool AND_Result = state1 && state2;
digitalWrite(led2, AND_Result);
if (AND_Result) {
digitalWrite(buzzer, HIGH); // بازر روشن شود
Serial.println("Both Buttons Pressed! (AND) --> LED2 & Buzzer ON!");
} else {
digitalWrite(buzzer, LOW); // بازر خاموش شود
}
// نمایش وضعیت در سریال مانیتور
Serial.print("Switch1: "); Serial.print(state1);
Serial.print(" | Switch2: "); Serial.print(state2);
Serial.print(" || (OR) LED1: "); Serial.print(OR_Result);
Serial.print(" && (AND) LED2: "); Serial.print(AND_Result);
if (AND_Result) {
Serial.println(" --> Both Buttons Pressed! (AND)");
} else if (OR_Result) {
Serial.println(" --> At least one button pressed (OR)");
} else {
Serial.println(" --> No button pressed");
}
delay(200); // تاخیر برای نمایش بهتر مقادیر
}
کنترل ربات با درگاه سریال و تنظیم جامپر ها روی B بعد از برنامه ریزی:
#include <Servo.h>
// شماره پایههای موتورها
#define M1_1 10
#define M1_2 9
#define M2_1 A0
#define M2_2 12
#define M3_1 3
#define M3_2 2
#define M4_1 5
#define M4_2 6
// LED و Buzzer
#define LED1 8
#define LED2 7
#define Buzzer 4
// حسگرها
#define LDR1 A4
#define LDR2 A5
#define trigPin A1
#define echoPin 13
// سرو موتور
#define servoPin 11
Servo servoMotor;
void setup() {
Serial.begin(9600);
servoMotor.attach(servoPin);
pinMode(M1_1, OUTPUT); pinMode(M1_2, OUTPUT);
pinMode(M2_1, OUTPUT); pinMode(M2_2, OUTPUT);
pinMode(M3_1, OUTPUT); pinMode(M3_2, OUTPUT);
pinMode(M4_1, OUTPUT); pinMode(M4_2, OUTPUT);
pinMode(LED1, OUTPUT); pinMode(LED2, OUTPUT);
pinMode(Buzzer, OUTPUT);
pinMode(trigPin, OUTPUT); pinMode(echoPin, INPUT);
}
void loop() {
if (Serial.available()) {
String command = Serial.readStringUntil('\n');
command.trim();
processCommand(command);
}
}
// پردازش دستورات بلوتوث
void processCommand(String command) {
// کنترل موتورها
if (command == "1") startMotor(M1_1, M1_2); // روشن کردن موتور ۱
else if (command == "2") stopMotor(M1_1, M1_2); // خاموش کردن موتور ۱
else if (command == "3") startMotor(M2_1, M2_2); // روشن کردن موتور ۲
else if (command == "4") stopMotor(M2_1, M2_2); // خاموش کردن موتور ۲
else if (command == "5") startMotor(M3_1, M3_2); // روشن کردن موتور ۳
else if (command == "6") stopMotor(M3_1, M3_2); // خاموش کردن موتور ۳
else if (command == "7") startMotor(M4_1, M4_2); // روشن کردن موتور ۴
else if (command == "8") stopMotor(M4_1, M4_2); // خاموش کردن موتور ۴
else if (command == "9") startAllMotors(); // روشن کردن همه موتورها
else if (command == "0") stopAllMotors(); // خاموش کردن همه موتورها
// کنترل LED و Buzzer
else if (command == "A") digitalWrite(LED1, HIGH); // روشن کردن LED1
else if (command == "B") digitalWrite(LED1, LOW); // خاموش کردن LED1
else if (command == "C") digitalWrite(LED2, HIGH); // روشن کردن LED2
else if (command == "D") digitalWrite(LED2, LOW); // خاموش کردن LED2
else if (command == "E") digitalWrite(Buzzer, HIGH); // روشن کردن بازر
else if (command == "F") digitalWrite(Buzzer, LOW); // خاموش کردن بازر
// کنترل سرو موتور
else if (command.startsWith("S")) servoMotor.write(command.substring(1).toInt()); // حرکت سرو موتور به زاویه مشخص (مثلاً S90)
// دریافت دادههای حسگرها
else if (command == "X") Serial.println(analogRead(LDR1)); // مقدار حسگر نور ۱
else if (command == "Y") Serial.println(analogRead(LDR2)); // مقدار حسگر نور ۲
else if (command == "Z") Serial.println(getDistance()); // مقدار حسگر فاصله
}
// راهاندازی موتور
void startMotor(int pin1, int pin2) {
digitalWrite(pin1, HIGH);
digitalWrite(pin2, LOW);
}
// توقف موتور
void stopMotor(int pin1, int pin2) {
digitalWrite(pin1, LOW);
digitalWrite(pin2, LOW);
}
// راهاندازی همه موتورها
void startAllMotors() {
startMotor(M1_1, M1_2);
startMotor(M2_1, M2_2);
startMotor(M3_1, M3_2);
startMotor(M4_1, M4_2);
}
// توقف همه موتورها
void stopAllMotors() {
stopMotor(M1_1, M1_2);
stopMotor(M2_1, M2_2);
stopMotor(M3_1, M3_2);
stopMotor(M4_1, M4_2);
}
// اندازهگیری فاصله با حسگر
int getDistance() {
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
return pulseIn(echoPin, HIGH) * 0.034 / 2;
}