🕹️ درس 68: جوی‌استیک: کنترل دو محوره

با جوی‌استیک یک نقطه‌ی نورانی را روی ۸ LED جابه‌جا کن — با منطقه‌ی مرده.

سطح: پیشرفته · زمان: حدود 18 دقیقه · مفاهیم: جوی‌استیک، آنالوگ، منطقه‌ی مرده

قدم‌های این درس

  1. جوی‌استیک یعنی دو پتانسیومتر
  2. قدم ۱ — جوی‌استیک و هشت LED
  3. قدم ۲ — مرکز صفر، منطقه‌ی مرده، سرعت
  4. اشتباه رایج: محورهای جابه‌جا
  5. چالش: سروو فرمان

نمونه‌ای از کد این درس

const int ledPins[8] = {2, 3, 4, 5, 6, 7, 8, 9};
const int JOY_BTN = 10;
const int DEAD = 60;          // ignore small wobbles around the centre
int pos = 3;                  // which LED is the dot
unsigned long lastMove = 0, lastPrint = 0;

void setup() {
  for (int i = 0; i < 8; i++) {
    pinMode(ledPins[i], OUTPUT);
  }
  pinMode(JOY_BTN, INPUT_PULLUP);
  Serial.begin(9600);
}

void loop() {
  int x = analogRead(A0) - 512;   // -512 .. +511, 0 = centre
  int y = analogRead(A1) - 512;
  if (abs(x) < DEAD) x = 0;       // dead zone
  if (abs(y) < DEAD) y = 0;

  // more tilt = faster steps
  int wait = map(abs(x), DEAD, 512, 400, 80);
  if (x != 0 && millis() - lastMove > wait) {
    lastMove = millis();
    if (x > 0 && pos < 7) pos++;
    if (x < 0 && pos > 0) pos--;
  }

  if (digitalRead(JOY_BTN) == LOW) {
    pos = 3;                      // click = back to the middle
  }

  for (int i = 0; i < 8; i++) {
    digitalWrite(ledPins[i], i == pos);
  }

  if (millis() - lastPrint > 300) {
    lastPrint = millis();
    Serial.print("x:"); Serial.print(x);
    Serial.print(" y:"); Serial.print(y);
    Serial.print(" dot:"); Serial.println(pos);
  }
}

چرا این درس؟

دوره‌ی تینکرکد فارسی تعاملی است: هر قدم را خودت داخل شبیه‌ساز انجام می‌دهی — مدار واقعی می‌چینی، کد واقعی اجرا می‌کنی و نتیجه را همان لحظه می‌بینی. این درس روی درس‌های قبلی ساخته شده، پس اگر تازه شروع کرده‌ای از درس ۱ بیا!

این درس را رایگان در شبیه‌ساز شروع کن 🎓

درس‌های دیگر دوره

⏱️

درس 67: کرنومتر دقیق با millis

💖

درس 69: حرف‌های سفارشی روی LCD