چراغ های روشن در آردوینو اجرای چراغ راهنما روی نوار WS2812 و آردوینو

چراغ های روشن در آردوینو اجرای چراغ راهنما روی نوار WS2812 و آردوینو

ما چراغ های روشنایی را از LED های آردوینو می سازیم. در این مورد از آردوینو مگا 2560 استفاده می شود که به طور بالقوه قادر به رانندگی با تردمیل 54 ال ای دی است. اما در صورت استفاده از کنترلرهای دیگر از این نوع پلتفرم آردوینو (UNO، Leonardo...) مدار و برنامه تغییر نمی کند.

نمودار سیم کشی LED به آردوینو مگا 2560.

این طرحی است که در پنجره برنامه برنامه نویسی استاندارد آردوینو به نظر می رسد.

متن برنامه پیاده سازی چراغ های روشن بر روی پلت فرم آردوینو.

int first_out = 11; //اولین خروجی گسسته

int last_out = 13; //آخرین خروجی گسسته

//block برای مقداردهی اولیه ورودی/خروجی ها و دیگر داده های اولیه

last_out = last_out + 1; //یکی برای استفاده صحیح در حلقه ها اضافه کنید

// یازدهمین، دوازدهمین و سیزدهمین پایه مجزای برد آردوینو را به عنوان خروجی تعریف کنید.

برای (i = first_out; i< last_out; i++) { pinMode(i, OUTPUT); }

برای (t = first_out; t< last_out; t++) { //перебираем номера дискретных выходов 11,12,13 поочереди

digitalWrite (t، HIGH); // LED بعدی را روشن می کند

تاخیر (500); //تأخیر 500 میلی‌ثانیه

برای (i = first_out; i< last_out; i++) { digitalWrite(i, LOW); }//гасим все светодиоды

برای افزایش تعداد LED های کنترل شده در یک حلقه، برنامه به سادگی نیاز به جایگزینی مقادیر متغیرهای first_out و last_out. متغیر اول خروجی گسسته اولیه کنترلر را ذخیره می کند و متغیر دوم آخرین یک گروه از خروجی های متوالی را ذخیره می کند. به عنوان مثال، اگر بخواهیم 10 عدد LED را در یک گلدان وصل کنیم، مقادیر زیر را وارد می کنیم: first_out = 4، last_out = 13. و پین های LED به ترتیب از 4 تا 13. و بهتر است پین های اول و دوم ورودی-خروجی های مجزا را لمس نکنید، زیرا پورت USB متصل به رایانه با آنها تداخل دارد.

در این آموزش کار با ال ای دی ها را ادامه می دهیم اما تعداد ال ای دی ها را به 5 عدد می رسانیم و افکت آتش در حال اجرا را می سازیم. برای کنترل LED ها از دستکاری پورت آردوینو استفاده می کنیم. ما مستقیماً داده ها را در پورت های آردوینو می نویسیم. این بهتر از کار با ورودی/خروجی کنترلر خاص است. این به شما امکان می دهد مقادیر LED ها را با یک عملیات تنظیم کنید.

Arduino UNO دارای 3 پورت است:
B (ورودی/خروجی دیجیتال 8 تا 13)
C (ورودی های آنالوگ)
D (ورودی/خروجی دیجیتال 0 تا 7)

هر پورت توسط 3 رجیستر کنترل می شود. DDR را ثبت کنیدتعیین می کند که پایه (پایین) چه ورودی یا خروجی خواهد بود. با استفاده از ثبات PORT، می توانید پین را روی حالت تنظیم کنید بالایا کم. با استفاده از رجیستر پین، می‌توانید وضعیت پایه‌های آردوینو را در هنگام ورودی بخوانید.

ما از پورت B استفاده خواهیم کرد. ابتدا باید تمام پایه های پورت B را به عنوان خروجی دیجیتال تنظیم کنیم. پورت B فقط 6 پین دارد. اگر قرار است از پا به عنوان OUTPUT استفاده شود، بیت های ثبت برای پورت DDRB B باید روی 1 و اگر قرار است از پا به عنوان ورودی استفاده شود، روی 0 تنظیم شود. بیت های پورت از 0 تا 7 شماره گذاری می شوند، اما همیشه شامل همه 8 پایه نیستند.
مثال:
DDRB = B00111110; // پایه های پورت B 1 تا 5 را به عنوان خروجی و 0 را به عنوان ورودی تنظیم کنید.

لطفا توجه داشته باشید که در میکروکنترلرهای Microchip برعکس است. 0 بیت - پا به عنوان یک خروجی و 1 - به عنوان ورودی کار می کند.

در پروژه آتش نشانی در حال اجرا، از 5 خروجی استفاده خواهیم کرد:
DDRB = B00011111; // پایه های پورت B را 0 تا 4 به عنوان خروجی تنظیم کنید

برای نوشتن مقادیر در پورت B، باید از ثبات PORTB استفاده کنید.
می توانید اولین LED را با دستور زیر روشن کنید:
PORTB=B00000001;
اول و چهارم:
PORTB=B00001001;

حالا می بینید که چقدر راحت می توانیم LED ها را روشن و خاموش کنیم. حالا بیایید در مورد عملگرهای شیفت صحبت کنیم

2 عملگر شیفت باینری وجود دارد: عملگر شیفت چپ<< и оператор сдвига вправо >> اپراتور شیفت چپ<< заставляет все биты сдвигаться влево, соответственно оператор сдвига вправо >> بیت ها را به راست جابجا می کند.

مثال:
varA = 1; // 00000001
varA = 1<< 0; // 00000001
varA = 1<< 1; // 00000010
varA = 1<< 2; // 00000100

اکنون به برنامه خود بازگردیم که در زیر نشان داده شده است.
باید 2 متغیر را معرفی کنیم:اولین upDown حاوی مقدار مکان حرکت - بالا یا پایین، و استوانه دوم است که LED ها را روشن می کند.

در عمل برپایی()ما تعریف می کنیم که کدام پاها باید به عنوان خروجی کار کنند.

در حلقه برنامه اصلی حلقه ()، LED ها به نوبه خود با افزایش متغیر روشن می شوند سیلنو وقتی به بالاترین حد رسید، متغیر بالا پایین 0 اختصاص داده شده و LED ها به نوبه خود به سمت پایین روشن می شوند.

/* آتش در حال اجرا. 5 LED */ کاراکتر بدون علامت upDown=1; // شروع به حرکت به سمت بالا بدون علامت char cylon=0; // ترتیب LED را تعیین می کند void setup() (DDRB = B00011111; // پورت B 0 را به 4 به عنوان خروجی تنظیم می کند) void loop() ( if(upDown==1)( // اگر به بالا برویم، سپس cylon++؛ اگر ( cylon>=4) upDown=0; // هنگامی که به بالاترین عدد LED رسید، سپس در حلقه بعدی به پایین بروید عدد LED به دست می آید، سپس در چرخه بعدی بالا می رویم) PORTB = 1<< cylon; //сдвиг delay(200); // пауза 200 мс }

در این آموزش کار با ال ای دی ها را ادامه می دهیم اما تعداد ال ای دی ها را به 5 عدد می رسانیم و افکت آتش در حال اجرا را می سازیم. برای کنترل LED ها از دستکاری پورت آردوینو استفاده می کنیم. ما مستقیماً داده ها را در پورت های آردوینو می نویسیم. این بهتر از کار با ورودی/خروجی کنترلر خاص است. این به شما امکان می دهد مقادیر LED ها را با یک عملیات تنظیم کنید.

Arduino UNO دارای 3 پورت است:

  • B (ورودی/خروجی دیجیتال 8 تا 13)
  • C (ورودی های آنالوگ)
  • D (ورودی/خروجی دیجیتال 0 تا 7)

هر پورت توسط 3 رجیستر کنترل می شود. رجیستر DDR تعیین می کند که آیا پایه (پایین) ورودی یا خروجی خواهد بود. از رجیستر PORT می توان برای تنظیم پین روی HIGH یا LOW استفاده کرد. با استفاده از رجیستر پین، می‌توانید وضعیت پایه‌های آردوینو را در هنگام ورودی بخوانید.

ما از پورت B استفاده خواهیم کرد. ابتدا باید تمام پایه های پورت B را به عنوان خروجی دیجیتال تنظیم کنیم. پورت B فقط 6 پین دارد. اگر قرار است از پا به عنوان OUTPUT استفاده شود، بیت های ثبت برای پورت DDRB B باید روی 1 و اگر قرار است از پا به عنوان ورودی استفاده شود، روی 0 تنظیم شود. بیت های پورت از 0 تا 7 شماره گذاری می شوند، اما همیشه شامل همه 8 پایه نیستند.

مثال:

DDRB = B00111110; // پایه های پورت B 1 تا 5 را به عنوان خروجی و 0 را به عنوان ورودی تنظیم کنید.

لطفا توجه داشته باشید که در میکروکنترلرهای Microchip برعکس است. 0 بیت - پا به عنوان یک خروجی و 1 - به عنوان ورودی کار می کند.

در پروژه آتش نشانی در حال اجرا، از 5 خروجی استفاده خواهیم کرد:

DDRB = B00011111; // پایه های پورت B را 0 تا 4 به عنوان خروجی تنظیم کنید

برای نوشتن مقادیر در پورت B، باید از ثبات PORTB استفاده کنید. می توانید اولین LED را با دستور زیر روشن کنید:

PORTB=B00000001;
اول و چهارم:
PORTB=B00001001;

حالا می بینید که چقدر راحت می توانیم LED ها را روشن و خاموش کنیم. حالا بیایید در مورد عملگرهای شیفت صحبت کنیم

2 عملگر شیفت باینری وجود دارد: عملگر شیفت چپ<< и оператор сдвига вправо >> اپراتور شیفت چپ<< заставляет все биты сдвигаться влево, соответственно оператор сдвига вправо >> بیت ها را به راست جابجا می کند.

مثال:

VarA = 1; // 00000001
varA = 1<< 0; // 00000001
varA = 1<< 1; // 00000010
varA = 1<< 2; // 00000100

اکنون به برنامه خود بازگردیم که در زیر نشان داده شده است. ما باید 2 متغیر را معرفی کنیم: اولی بالا پایینمقدار جایی که باید حرکت کرد - بالا یا پایین و دومی را شامل می شود سیلنچه ال ای دی روشن شود

در عمل برپایی()ما تعریف می کنیم که کدام پاها باید به عنوان خروجی کار کنند.

در حلقه برنامه اصلی حلقه ()، LED ها به نوبه خود با افزایش متغیر روشن می شوند سیلنو وقتی به بالاترین حد رسید، متغیر بالا پایین 0 اختصاص داده شده و LED ها به نوبه خود به سمت پایین روشن می شوند.

آردوینو برای مبتدیان

در این آموزش کار با ال ای دی ها را ادامه می دهیم اما تعداد ال ای دی ها را به 5 عدد می رسانیم و انجام خواهیم داد. اثر آتش در حال اجرا. برای کنترل LED ها از دستکاری پورت آردوینو استفاده می کنیم. ما مستقیماً داده ها را در پورت های آردوینو می نویسیم. این بهتر از کار با ورودی/خروجی کنترلر خاص است. این به شما امکان می دهد مقادیر LED ها را با یک عملیات تنظیم کنید.

Arduino UNO دارای 3 پورت است:

  • B (ورودی/خروجی دیجیتال 8 تا 13)
  • C (ورودی های آنالوگ)
  • D (ورودی/خروجی دیجیتال 0 تا 7)

هر پورت توسط 3 رجیستر کنترل می شود. رجیستر DDR تعیین می کند که آیا پایه (پایین) ورودی یا خروجی خواهد بود. از رجیستر PORT می توان برای تنظیم پین روی HIGH یا LOW استفاده کرد. با استفاده از رجیستر پین، می‌توانید وضعیت پایه‌های آردوینو را در هنگام ورودی بخوانید.

ما از پورت B استفاده خواهیم کرد. ابتدا باید تمام پایه های پورت B را به عنوان خروجی دیجیتال تنظیم کنیم. پورت B فقط 6 پین دارد. اگر قرار است از پا به عنوان OUTPUT استفاده شود، بیت های ثبت برای پورت DDRB B باید روی 1 و اگر قرار است از پا به عنوان ورودی استفاده شود، روی 0 تنظیم شود. بیت های پورت از 0 تا 7 شماره گذاری می شوند، اما همیشه شامل همه 8 پایه نیستند.

مثال:

DDRB = B00111110; // پایه های پورت B 1 تا 5 را به عنوان خروجی و 0 را به عنوان ورودی تنظیم کنید.

لطفا توجه داشته باشید که در میکروکنترلرهای Microchip برعکس است. 0 بیت - پا به عنوان یک خروجی و 1 - به عنوان ورودی کار می کند.

در پروژه آتش نشانی در حال اجرا، از 5 خروجی استفاده خواهیم کرد:

DDRB = B00011111; // پایه های پورت B را 0 تا 4 به عنوان خروجی تنظیم کنید

برای نوشتن مقادیر در پورت B، باید از ثبات PORTB استفاده کنید. می توانید اولین LED را با دستور زیر روشن کنید:

PORTB=B00000001;
اول و چهارم:
PORTB=B00001001;

حالا می بینید که چقدر راحت می توانیم LED ها را روشن و خاموش کنیم. حالا بیایید در مورد عملگرهای شیفت صحبت کنیم

2 عملگر شیفت باینری وجود دارد: عملگر شیفت چپ<< и оператор сдвига вправо >> اپراتور شیفت چپ<< заставляет все биты сдвигаться влево, соответственно оператор сдвига вправо >> بیت ها را به راست جابجا می کند.

مثال:

varA = 1; // 00000001
varA = 1<< 0; // 00000001
varA = 1<< 1; // 00000010
varA = 1<< 2; // 00000100

اکنون به برنامه خود بازگردیم که در زیر نشان داده شده است. ما باید 2 متغیر را معرفی کنیم: اولی بالا پایینمقدار جایی که باید حرکت کرد - بالا یا پایین و دومی را شامل می شود سیلنچه ال ای دی روشن شود

در عمل برپایی()ما تعریف می کنیم که کدام پاها باید به عنوان خروجی کار کنند.

در حلقه برنامه اصلی حلقه ()، LED ها به نوبه خود با افزایش متغیر روشن می شوند سیلنو وقتی به بالاترین حد رسید، متغیر بالا پایین 0 اختصاص داده شده و LED ها به نوبه خود به سمت پایین روشن می شوند.

کد: /* آتش در حال اجرا. 5 LED */ کاراکتر بدون علامت upDown=1; // شروع به حرکت به سمت بالا بدون علامت char cylon=0; // ترتیب LED را تعیین می کند void setup() (DDRB = B00011111; // پورت B 0 را به 4 به عنوان خروجی تنظیم می کند) void loop() ( if(upDown==1)( // اگر به بالا برویم، سپس cylon++؛ اگر ( cylon>=4) upDown=0; // هنگامی که به بالاترین عدد LED رسید، سپس در حلقه بعدی به پایین بروید عدد LED به دست می آید، سپس در چرخه بعدی بالا می رویم) PORTB = 1<< cylon; //сдвиг delay(200); // пауза 200 мс

در این آزمایش، یک نور در امتداد مقیاس LED ایجاد می کنیم.

فهرست قطعات برای آزمایش

- 1 برد آردوینو Uno؛

- 1 تخته نان بدون لحیم کاری؛

- 1 مقیاس LED;

- 10 مقاومت با مقدار اسمی 220 اهم؛

- 11 سیم نر-نر.

نمودار اصلی

نمودار روی تخته نان

طرح

دانلود طرح برای آردوینو IDE
// مقیاس LED به گروهی از پین ها که // در یک ردیف قرار دارند متصل می شود. نام‌گذاری دوستانه برای اولین و آخرین پین #define FIRST_LED_PIN 2 #define LAST_LED_PIN 11 void setup() (// 10 LED در مقیاس وجود دارد. می‌توانیم pinMode 10 // بار بنویسیم: برای هر یک از پین‌ها، اما این کار می‌کند. کد را bloat کنید و // تغییر آن را مشکل‌تر کرد. // بنابراین بهتر است از یک حلقه استفاده کنید. // pinMode را برای (eng. for) هر پین ( متغیر پین) // از اولین (=) انجام می‌دهیم. FIRST_LED_PIN) تا آخرین شامل // (<= LAST_LED_PIN), всякий раз продвигаясь к следующему // (++pin увеличивает значение pin на единицу) // Так все пины от 2-го по 11-й друг за другом станут выходами for (int pin = FIRST_LED_PIN; pin <= LAST_LED_PIN; ++pin) pinMode(pin, OUTPUT); } void loop() { // получаем время в миллисекундах, прошедшее с момента // включения микроконтроллера unsigned int ms = millis(); // нехитрой арифметикой вычисляем, какой светодиод // должен гореть именно сейчас. Смена будет происходить // каждые 120 миллисекунд. Y % X — это остаток от // деления Y на X; плюс, минус, скобки — как в алгебре. int pin = FIRST_LED_PIN + (ms / 120) % 10; // включаем нужный светодиод на 10 миллисекунд, затем — // выключаем. На следующем проходе цикла он снова включится, // если гореть его черёд, и мы вообще не заметим отключения digitalWrite(pin, HIGH); delay(10); digitalWrite(pin, LOW); }

توضیحات کد

  • با استفاده از عبارت برایسازماندهی می کنیم حلقه با شمارنده . در این مورد، برای پیکربندی پورت ها برای خروجی. برای ایجاد چنین چرخه ای، شما نیاز دارید:
    • متغیر شمارنده را با مقدار اولیه آن مقداردهی کنید. در مورد ما: پین int = FIRST_LED_ پین ;
    • شرطی را مشخص کنید که تا زمانی که حلقه تکرار شود. در مورد ما: سنجاق<= LAST_LED_ پین ;
    • قاعده ای را تعیین کنید که بر اساس آن شمارنده تغییر می کند. در مورد ما ++ پین(برای اپراتور به زیر مراجعه کنید ++ ).
  • به عنوان مثال، می توانید یک حلقه ایجاد کنید برای (int i = 10; i > 0; i = i - 1). در این مورد:
    • به متغیر i یک مقدار اختصاص داده شده است 10 ;
    • این مقدار شرط را برآورده می کند من > 0 ;
    • بنابراین، بلوک کد قرار داده شده در حلقه برای اولین بار اجرا می شود.
    • معنی منطبق قانون داده شده یک عدد کاهش می یابد و مقدار را می گیرد 9 ;
    • بلوک کد برای بار دوم اجرا می شود.
    • همه چیز بارها و بارها تکرار می شود تا معنی پیدا کند منبرابر 0 ;
    • چه زمانی منبرابر می شود 0 ، وضعیت من > 0اجرا نمی شود و اجرای حلقه به پایان می رسد.
    • کنترلر به کد زیر حلقه می رود برای ;
  • کدی را که می خواهید حلقه کنید بین یک جفت بریس فرفری قرار دهید {} اگر حاوی بیش از یک دستورالعمل باشد.
  • متغیر شمارنده در بیانیه اعلام شده است برای، می تواند در داخل یک حلقه استفاده شود. مثلا در این آزمایش سنجاقبه طور متوالی مقادیر 2 تا 11 را می گیرد و به آن منتقل می شود pinMode، به شما امکان می دهد 10 پورت را با یک خط قرار داده شده در یک حلقه پیکربندی کنید.
  • متغیرهای شمارنده فقط در داخل حلقه قابل مشاهده هستند. آن ها اگر به سنجاققبل یا بعد از حلقه، کامپایلر در مورد یک متغیر اعلام نشده خطا می دهد.
  • طرح i = i - 1در توضیح بالا یک معادله نیست! ما از عملگر انتساب = برای قرار دادن در یک متغیر استفاده می کنیم منقرار دادن ارزش برابر با ارزش فعلی من، کم شده توسط 1 ;
  • اصطلاح ++ پین- این به اصطلاح است. اپراتور افزایش ، روی یک متغیر اعمال می شود سنجاق. این دستورالعمل همان نتیجه را خواهد داد که pin = pin + 1 ;
  • اپراتور به طور مشابه با افزایش کار می کند کاهش - - کاهش یک ارزش. اطلاعات بیشتر در این مورد در مقاله مربوط به عملیات حسابی؛
  • نوع داده بدون امضابرای ذخیره اعداد صحیح بدون علامت، یعنی. فقط غیر منفی . با توجه به بیت اضافی که اکنون برای ذخیره علامت استفاده نمی شود، می توانیم مقادیر را تا سقف ذخیره کنیم 65 535 ;
  • تابع میلیستعداد میلی ثانیه هایی که از روشن شدن یا تنظیم مجدد میکروکنترلر گذشته است را برمی گرداند. در اینجا ما از آن برای زمان‌بندی زمان بین کلیدهای LED استفاده می‌کنیم.
  • با استفاده از عبارت (ms / 120) % 10ما تعیین می کنیم که کدام یک از 10 LED باید اکنون روشن شود. به عبارت دیگر، ما تعیین می کنیم که اکنون کدام قطعه 120 میلی ثانیه است و تعداد آن در ده فعلی چقدر است. شماره توالی بخش را به شماره پورتی که برای اولین بار در مجموعه فعلی ظاهر می شود اضافه می کنیم.
  • این واقعیت که ما LED را با DigitalWrite (پین، LOW)تنها 10 میلی ثانیه پس از روشن شدن، برای چشم قابل توجه نیست، زیرا خیلی زود دوباره محاسبه می شود که کدام یک از LED ها روشن می شود و روشن می شود - فقط خاموش شده یا بعدی.

سوالاتی که باید خودتان را بررسی کنید

  1. چرا در این آزمایش ما مقیاس LED را بدون استفاده از ترانزیستور وصل می کنیم؟
  2. اگر فقط LED های پورت های 5، 6، 7، 8، 9 را روشن کنیم، چه چیزی باید در برنامه تغییر کند؟
  3. برای انجام یک عمل معادل چه دستور دیگری می توان استفاده کرد ++ پین ?
  4. تفاوت بین متغیرهای نوع چیست؟ بین المللیو بدون امضا ?
  5. تابع چه چیزی را برمی گرداند millis() ?
  6. چگونه شماره پورتی را که می خواهیم LED را روی آن روشن کنیم در این آزمایش محاسبه کنیم؟

وظایف برای راه حل مستقل

  1. کد را طوری تغییر دهید که LED ها در هر ثانیه یک بار تعویض شوند.
  2. بدون خاموش کردن پورت‌ها، مطمئن شوید که نور فقط در امتداد چهار بخش میانی ترازو روشن می‌شود.
  3. برنامه را طوری تغییر دهید که به جای پین int = FIRST_LED_ پین + (ms / 120) % 10حرکت شعله توسط چرخه کنترل می شد برای .
  4. بدون تعویض سیم، برنامه را طوری تغییر دهید که نور در جهت مخالف حرکت کند.



© 2023 globusks.ru - تعمیر و نگهداری خودرو برای مبتدیان