تجربه من و دوستام از ساخت یک کنسول ساده بازی
جذابیت این پروژه فان، برای من دانشجوی ترم یک کامپیوتر این بود که بدون هیچ دانش قبلی از مباحث الکترونیکی و برنامه نویسی آردوینو مستقیما وارد این پروژه شدیم و با اینکه اشتباهات زیادی کردیم(توی همین متن به چند تاشون اشاره میکنم :)) ولی لازم دونستم این تجربه رو انتقال بدم که ممکنه برای عزیزانی که مثل ما تجربه ندارن مفید و برای اونایی هم که تجربه دارن جالب باشه.
1-فراهم کردن تجهیزات
اولین وظیفه ما فراهم کردن تجهیزات این کار بود و مسلما مهم ترینش آردوینو بود.ما یه مدل R3 اون رو خریداری کردیم(البته که الان فکر میکنم مدل های مناسب تری هم وجود داشت مثل مدل wemos به دو دلیل: اول اینکه قیمت کمتری داشت و دلیل دوم رو جلوتر میگم)
ما همچنین به چیزی نیاز داشتیم که بازی ها رو روش نمایش بدیم(LCD) و یه وسیله ای که بتونیم باهاش بازی کنیم(کلید یا جویستیک)
بخاطر اینکه در کنار کیفیت باید حواسمون به هزینه ها هم میبود LCD5110 و یک جویستیک ps2 خریداری کردیم.(توجه بیش از حد به قیمت و کاهش هزینه ها یکی از اشتباهات فاحشمون بود که باعث مشکلاتی شد که بهش اشاره میکنم)
2-تمرین و یادگیری
اولین کاری که کردیم همون کاری بود که همه در برخورد اولشون با یه آردوینو انجام میدن ، رقص نور و کلی ذوق کردیم :)
بعد از اون تصمیم گرفتیم که یک متن ساده رو روی LCD نمایش بدیم بنابراین ما :
1-پین های مربوط به انتقال دیتا رو از آردوینو به ال سی دی متصل کردیم(طبق دیتاشیت)
2-پین ولتاژ و زمین که بینشون 3.3 ولت اختلاف بود رو متصل کردیم.
3-آردوینو رو طبق کد نمونه برنامه نویسی کردیم.
با اینکه یه بک لایت آبی هم از LCD گرفتیم ولی هیچ چیزی نمایش نمیداد.یک روز تمام صرف این مشکل شد(و این اولین باری بود که با خودم گفتم شاید مسیر رو داریم اشتباه میریم و اساسا بدون تجربه قبلی وارد شدن به پروژه ای اینچنینی کار درستی نیست) ولی به هر حال در آخر روز این مسئله حل شد:
ما بعد از اندازه گیری جریان متوجه شدیم که LCD باعث افت پتانسیل زیادی میشه و جریان کافی برای نمایش دیتا وجود نداره. بنابراین بجای ولتاژ 3.3 از 5 استفاده کردیم و مشکل حل شد.
بعد از تست ال سی دی و جویستیک، تسک بعدی نوشتن یه بازی 2048 ساده بود.خوبی این تسک این بود که ما قبلا این کار رو به عنوان یه پروژه ترمینال بیس با زبان پایتون انجام داده بودیم.(لینک گیتهاب بازی 2048 ترمینال)
برای همین، دیگه از پیاده سازی الگوریتم بازی راحت شده بودیم و فقط نیاز بود که کد های پایتونی تبدیل بشن به کد های c++ و مناسب برای آردوینو.(اینم لینک گیتهاب بازی 2048 که روی آردوینو پیاده سازی کردیم)
تسک بعدی اتصال آردوینو به وای فای بود.برای اینکه بتونیم اطلاعاتی (مثل رکورد های بازی 2048) رو بفرستیم سمت سرور.
برای اینکار ما نیاز به یک ماژول وای فای داشتیم.(این دومین دلیلی بود که شاید آردوینو مدل wemos برای کار ما مناسب تر بود، چون که این مدل، ماژول وای فای رو روی خودش داره)
به هر حال بعد از کمی سرچ به ماژول esp 8266 01s رسیدیم.
یکی از بزرگ ترین مشکلاتمون از اینجا شروع شد.ما واقعا ایده ای برای برنامه ریزی این ماژول کوچولو نداشتیم.
در واقع پین های این ماژول بر اساس هدفی که ما داریم باید به آردوینو متصل میشدن و وقتی سرچ میکردیم، انواع و اقسام روش های اتصال و برنامه ریزی این ماژول رو میدیدیم.
به هر ترتیبی بود یه چیز رو که یاد گرفتیم بحث ارتباطات ماژول ها با هم بود.توی این مورد ما بایستی با استفاده از سریال و اتصال rx وای فای به tx آردوینو و tx وای فای به rx آردوینو اطلاعات رو از آردوینو به وای فای و بالعکس انتقال میدادیم.پروتکلی هم که برای این کار استفاده میشه گرچه مطمئن نیستم ولی فکر میکنم پروتکل UART هست.
اولین تسک توی این مورد تست خود ماژول وای فای به تنهایی و اینکه ببینیم به اینترنت متصل میشه یا نه. بنابراین با تیکه کد زیر اون رو به هات اسپات گوشیم متصلش کردیم:
#include <ESP8266WiFi.h>
#include <ESP8266HTTPClient.h>
#include <WiFiClient.h>
// name and password of the access point esp should connect(here is my mobile hotspot)
const char* ssid = "EspTest";
const char* password = "12345678";
void setup() {
Serial.begin(9600);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
// Wait for the Wi-Fi to connect
delay(1000);
Serial.print(++i);
Serial.print(' ');
}
//...
}
//...rest of the code...
//to communicate with arduino
و در ادامه با استفاده از سریال، وقتی که وای فای متصل میشد، به آردوینو خبر میدادیم و از طریق آردوینو ، یوزر رو مطلع میکردیم که وای فای متصل شده(مثلا با روشن موندن یک ال ای دی)
بعد از اتصال صحیح آردوینو به وای فای و همچنین وای فای به اینترنت نوبت به ارسال اطلاعات به سمت سرور بود. برای اینکار از خدمات رایگان وبسایت thingspeak استفاده کردیم.که به ما توکن میداد و با استفاده از اون توکن و صدا زدن یک http api، تونستیم اطلاعات عددیمون رو بفرستیم سمت سرور و روی یک نمودار به اصطلاح ویژوالایزش کنیم.
اینم کد کامل ماژول وای فای:
#include <ESP8266WiFi.h>
#include <ESP8266HTTPClient.h>
#include <WiFiClient.h>
const char* ssid = "EspTest";
const char* password = "12345678";
// Domain Name with full URL Path for HTTP POST Request
const char* serverName = "http://api.thingspeak.com/update";
// Service API Key
String apiKey = "9885BM14TX2FPMUU";
void setup() {
Serial.begin(9600);
delay(1000);
while (Serial.read() == 0) {
}
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
Serial.write(123);
}
}
void loop() {
if (Serial.read() == 0) {
} else {
//Check WiFi connection status
if (WiFi.status() == WL_CONNECTED) {
Serial.write(200);
WiFiClient client;
HTTPClient http;
// Your Domain name with URL path or IP address with path
int recived = 0;
if (Serial.available()) {
http.begin(client, serverName);
recived = Serial.read();
// Specify content-type header
http.addHeader("Content-Type", "application/x-www-form-urlencoded");
// Data to send with HTTP POST
String httpRequestData = "";
// 2048 score is always bigger than 32 and snake game is less
if (recived >= 32) {
httpRequestData = "api_key=" + apiKey + "&field4=" + recived;
} else {
httpRequestData = "api_key=" + apiKey + "&field5=" + recived;
}
// Send HTTP POST request
int httpResponseCode = http.POST(httpRequestData);
http.end();
}
/*
// If you need an HTTP request with a content type: application/json, use the following:
http.addHeader("Content-Type", "application/json");
// JSON data to send with HTTP POST
String httpRequestData = "{\"api_key\":\"" + apiKey + "\",\"field1\":\"" + String(random(40)) + "\"}";
// Send HTTP POST request
int httpResponseCode = http.POST(httpRequestData);*/
// Serial.print("HTTP Response code: ");
// Serial.println(httpResponseCode);
// Free resources
} else {
Serial.write(403);
}
}
}
خب الان همه چیز تکمیله... ما تا اینجا کد ها رو به درستی روی آردوینو و وای فای آپلود کردیم و اتصالات لازم رو انجام دادیم. اما یک مشکل دیگه مونده : در حال حاضر اتصالات روی یک برد بورد انجام شده و خیلی به هم ریختس و نسبت به یک محصول یه چیزی رو کم داره : box
ما بایستی عملیات باکس کردن این مدارات رو انجام میدادیم اما قبلش نیاز بود یه مقدار خود اتصالات هم مرتب بشن. برای این کار ایده ی PCB (مدار چاپی به ذهنمون رسید). اول گفتیم هدفمون رو به الکترونیکی مورد نظر بگیم و خودشون برامون PCB رو طراحی و درست کنن.
خب رفتیم مغازه و مسئله بهشون گفتیم و فهمیدیم برای طراحی هزینه جدا و ساخت هم هزینه جدا میگیرن.
تصمیم گرفتیم طراحی رو خودمون انجام بدیم و ساختش رو بدیم به اونا.طراحی رو روی یک صفحه 4.5 در 4.5 انجام دادیم و به همچین طرحی رسیدیم :
باز مراجعه کردیم به مغازه الکترونیکی و طرح رو نشون دادیم و هزینه ای که گفتن 500 به بالا بود.یه پرس و جو کردیم و دیدیم که چون PCB مون تک لایه و ساده هست میتونیم خودمونم درستش کنیم با هزینه تقریبا 150 تومن وسایلی که مورد نیاز بود. بنابراین خودمون مشغول به کار شدیم :) (این یکی از مواردی بود که صرفه جویی بیش از حد توی هزینه باعث شد علاوه بر پایین اومدن کیفیت، زمان بسیار بیشتری رو صرف این مورد کنیم ولی به هر حال تجربه جالبی بود)
برای این کار وسایل زیر رو تهیه کردیم :
ورق مسی
اسید مخصوص مدارچاپی
خب ما اینجوری شروع کردیم :
1-طرحمون رو از روی کاغذ گلاسه انتقال دادیم به ورق مسی با استفاده از اتو:
2-بعد از انتقال طرح روی صفحه مسی اونو با رعایت نکات ایمنی:) انداختیمش داخل اسید مخصوص تا اون قسمت هایی از مس که به اون نیاز نداریم کاملا از بین برن و فقط اتصالاتی که توی طرح منتقل شده باقی بمونن.
خب به تصویر بالا نگاه نکنید چون نتیجه ما یه چیز دیگه شد :)))))
میبینید که یک سری اتصالات کامل منتقل نشدن و بعد از تست با مولتی متر فهمیدیم این وسطا قطعی هایی هم وجود داره.بنابراین قشنگ زدیم با سیم لحیم و سیم های رشته ای کوچیک به فجیع ترین شکل ممکن اتصالات رو ترمیم کردیم و کثیف کاری رو به حد اعلای خودش رسوندیم :)))))) و نتیجه شد این :
بعد از ساخت PCB و تکمیل اتصالات یه جعبه خریداری کردیم و تمام تجهیزات رو داخل جعبه گذاشتیم و این بود داستان ساخت کنسول ما :)) امیدوارم که این مطلب براتون جالب بوده باشه
خوشحال میشم اگر نظری، پیشنهادی یا هر سخنی دارید برام پایین همین مطلب کامنت کنید.
کد کامل این پروژه روی گیتهاب بنده موجود هست.
ضمنا میتونید خروجی نهاییمون رو که در قالب یه ویدئوی 2 دقیقه ای ضبط کردم رو روی یوتیوب بنده مشاهده بفرمایید.
مطلبی دیگر از این انتشارات
حل مسئله تقسیم با تاخیر در مصاحبه فنی
مطلبی دیگر از این انتشارات
درست کردن گردونه شانس با پایتون
مطلبی دیگر از این انتشارات
هزینه کار برنامه نویسی رو چطور محاسبه کنیم؟