دکمه START کنترلر NES خود را با این Instructable به یک سوئیچ روشن/خاموش برای چراغ ها تبدیل کنید - نسخه های دیگر را دیدم یا gut را دیدم یا وسایل الکترونیکی را تغییر دادم اما در این پروژه قطعات الکترونیکی دست نخورده هستند بنابراین می توان از کنترلر برای بازی های قدیمی پس از خاموش شدن چراغ ها استفاده کرد. بیرون…
![](https://duino4projects.com/wp-content/uploads/2020/07/Use-Your-NES-Controller-As-On-Off-Switch-for-Lights..jpg)
من از یک LED برای نور در این Instructable استفاده کردم زیرا من یک سرگرمی هستم. با این حال، با داشتن شرایط مناسب، تجربه، بیمه نامه و رله سازگار با آردوینو، فکر می کنم می توانید این سوئیچ چراغ را در هر اتاق خواب یا فضای کاری با تم نینتندو نصب کنید.
برای چیزی که خیلی ساده به نظر می رسد (ویدیو بالا را ببینید) در واقع کمی دخیل است…
مرحله 1: تجهیزات
- 1 عدد کنترلر اصلی NES - یکی را از یک مغازه دست دوم محلی انتخاب کردم
- 1 x Arduino UNO - من از DuinoTECH classic (UNO) استفاده کردم
- سیمهای بلوز 5 – 7 x نر – نر – توصیه میکنم از رنگهای مختلف برای آسانتر کردن عکسبرداری استفاده کنید (من همیشه از سیاه برای GND و قرمز برای +5V استفاده میکنم و سپس از میان رنگهای رنگین کمان میچرخم)
- 1 x LED (اختیاری)
- مقاومت 1 x 330 اهم (اختیاری)
- 1 عدد تخته نان (اختیاری)
- کابل یو اس بی
- کامپیوتر با Arduino IDE نصب شده است
مرحله 2: اتصالات
![](https://duino4projects.com/wp-content/uploads/2020/07/Connections.jpg)
- سیم مشکی از GND در آردوینو به پلاگین کنترلر پین 1 NES
- سیم قرمز از +5 ولت تا پین 7
- سیم نارنجی از D5 تا پین 2
- سیم زرد از D6 تا پین 3
- سیم سبز از D7 به پین 4
- سیم آبی از D13 به آند LED
- مقاومت 330 اهم از کاتد LED به GND (از سیم مشکی دیگری استفاده کنید) - فکر میکنم اکثر بردهای آردوینو UNO دارای یک LED روی سطح کوچک هستند که به D13 متصل است، بنابراین سیمکشی LED دیگری اختیاری است.
تصویر اول دوشاخه کنترلر NES را نشان می دهد – روی هر سوکت/پین کلیک کنید تا هر عملکرد را پیدا کنید. سیم های بلوز نر - نر به خوبی در سوکت ها قرار می گیرند.
مرحله 3: حالت های دکمه و بازگرداندن
اگر قرار بود از دو دکمه (به عنوان مثال START برای روشن و SELECT برای خاموش ) برای این سوئیچ چراغ کنترلر NES استفاده کنید، تطبیق طرح پیانوی کنترلر NES از دستورالعمل قبلی من بسیار آسان خواهد بود:
- برچسب D13 به عنوان led
- خط nes=255 را حذف کنید
- سایر عملکردهای دکمه را نیز حذف کنید
- تغییر bitRead (nes, 4) == دستور 0 tone به digitalWrite (led, HIGH)
- تغییر bitRead (nes, 5) == دستور 0 tone به digitalWrite (led, LOW)
#define nesClock 5 // label pinout #define nesLatch 6 #define nesData 7 #define led 13 byte nes = 0; // global variable void setup() { // put your setup code here, to run once: Serial.begin (9600); // serial terminal speed pinMode (nesData, INPUT); // set up pins pinMode (nesClock, OUTPUT); pinMode (nesLatch, OUTPUT); pinMode (led, OUTPUT); digitalWrite (led, LOW); } void loop() { // put your main code here, to run repeatedly: nes = nesRead (); if (bitRead (nes, 4) == 0){ digitalWrite (led, HIGH); } if (bitRead (nes, 5) == 0){ digitalWrite (led, LOW); } delay (180); } byte nesRead (){ // "bit banging" byte value = 0; digitalWrite (nesLatch, HIGH); delayMicroseconds(5); digitalWrite (nesLatch, LOW); for (int i=0; i<8; i++) { digitalWrite (nesClock, LOW); value |= digitalRead (nesData) << (7 - i); digitalWrite (nesClock, HIGH); } return (value); }
با این حال مدتی طول کشید تا تمرین کنم چگونه فقط از دکمه START استفاده کنم. من کد را از آموزش رفع اشکال Arduino.cc تطبیق دادم – در این طرح حذف debounce ضروری است (حذف debounceDelay و lastDebounceTime اثرات بسیار غیرقابل پیش بینی ایجاد می کند (گاهی LED روشن بود، گاهی اوقات خاموش بود، گاهی اوقات چشمک می زد و قسمت مانیتور سریال طرح برای ادامه کار اضافه کار می کرد).
int ledState = HIGH; // current state of LED pin int buttonState; // see below in loop() int lastButtonState = LOW; // last time START was pressed long lastDebounceTime = 0; // for debouncing switch long debounceDelay = 200; // for debouncing switch
void loop() { // put your main code here, to run repeatedly: buttonState = bitRead (nes, 4); // START pressed nesRead (); if (buttonState == 0 && lastButtonState == LOW && millis() - lastDebounceTime > debounceDelay){ if (ledState == HIGH){ ledState = LOW; // LED is OFF //Serial.println ("OFF"); } else { ledState = HIGH; // LED is ON //Serial.println ("ON"); } lastDebounceTime = millis (); } digitalWrite (led, ledState ); lastButtonState = buttonState;
متأسفانه کدی که در طرح پیانوی NES Controller خود استفاده کردم در این مورد کار نکرد - مرحله 4 را ببینید.
مرحله 4: بیت بنگ
![](https://duino4projects.com/wp-content/uploads/2020/07/Bit-Banging.jpg)
کنترلر NES از یک شیفت رجیستر 4021 برای ایجاد پالس های داده در هنگام فشار دادن دکمه استفاده می کند - روی دکمه های موجود در تصویر کلیک کنید تا داده های ایجاد شده را با فشار دادن هر دکمه مشاهده کنید یا سعی کنید این طرح را از bradsprojects.com اجرا کنید - و آردوینو عکس می گیرد. پالس ها را با جستجوی 0 ها در هر پالس تفسیر می کند.
کدی که من برای گرفتن داده های کنترلر NES استفاده کردم با کدهای استفاده شده در سایر دستورالعمل های NES Controller متفاوت بود . من نمیتوانستم روش گوردون مککامب* را برای انجام این کار تطبیق دهم (استفاده از یک دکمه NES برای روشن و خاموش کردن چراغ ) - LED فقط مانند طرح کلاسیک Blink چشمک میزند . من از تابعی جدا از تابع Loop () استفاده کردم که آن را nesRead () نامیدم - این از bit shift به روشی کمی متفاوت استفاده می کرد - من برای اولین بار در مورد آن در arduino.cc خواندم.
void nesRead (){ //function to read data from NES controller nes = 0; digitalWrite (nesLatch, LOW); digitalWrite (nesClock, LOW); digitalWrite (nesLatch, HIGH); delayMicroseconds (2); digitalWrite (nesLatch, LOW); nes = digitalRead (nesData); for (int i = 1; i <=7; i ++){ digitalWrite (nesClock, HIGH); delayMicroseconds (2); nes = nes <<1; // bitshift nes = nes + digitalRead (nesData); delayMicroseconds (4); digitalWrite (nesClock, LOW); } }
*طرح کنترلر گیم پد Teachbot در "Arduino Robot Bonanza" توسط گوردون مک کوم مک گرو هیل 2013.
مرحله 5: طرح کامل
#define nesClock 5 // label pinout #define nesLatch 6 #define nesData 7 #define led 13 int ledState = HIGH; // current state of LED pin int buttonState; // see below in loop() int lastButtonState = LOW; // last time START was pressed long lastDebounceTime = 0; // for debouncing switch long debounceDelay = 200; // for debouncing switch byte nes = 0; // label 8 bit data from controller /* Setup */ void setup() { // put your setup code here, to run once: delay (1000); // Serial.begin (9600); pinMode (nesLatch, OUTPUT); // set up pins pinMode (nesClock, OUTPUT); pinMode (nesData, INPUT); pinMode (led, OUTPUT); } void nesRead (){ //function to read data from NES controller nes = 0; digitalWrite (nesLatch, LOW); digitalWrite (nesClock, LOW); digitalWrite (nesLatch, HIGH); delayMicroseconds (2); digitalWrite (nesLatch, LOW); nes = digitalRead (nesData); for (int i = 1; i <=7; i ++){ digitalWrite (nesClock, HIGH); delayMicroseconds (2); nes = nes <<1; // bitshift nes = nes + digitalRead (nesData); delayMicroseconds (4); digitalWrite (nesClock, LOW); } } void loop() { // put your main code here, to run repeatedly: buttonState = bitRead (nes, 4); // START pressed nesRead (); if (buttonState == 0 && lastButtonState == LOW && millis() - lastDebounceTime > debounceDelay){ if (ledState == HIGH){ ledState = LOW; // LED is OFF //Serial.println ("OFF"); } else { ledState = HIGH; // LED is ON //Serial.println ("ON"); } lastDebounceTime = millis (); } digitalWrite (led, ledState ); lastButtonState = buttonState; // Current state (i.e. ON or OFF) of START is now lastButtonState }
منبع: از کنترلر NES خود به عنوان کلید روشن/خاموش برای چراغ ها استفاده کنید.