تبدیل پیکسل به کد ++C در آردوینو
پس از اینکه ما ترسیم پیکسلی خود را به پایان رساندیم، هنوز باید آن را به یک فایل C یا ++C تبدیل کنیم. ما می توانیم این کار را به صورت دستی نیز انجام دهیم، اما این کار خیلی جالب نیست. بسیار بهتر است که یک برنامه ی کوچک بنویسیم که به طور اتوماتیک این تبدیل را انجام دهد. ما می توانیم چنین برنامه ای را در هر زبان برنامه نوسی مدرنی بنویسیم؛ و در اینجا قصد داریم از روبی(Ruby) استفاده کنیم. پردازش گرافیک ها در روبی ساده است و این را مدیون کتابخانه ی rmagick روبی هستیم. این کتابخانه به ImageMagick که یک ابزار قدرتمند برای تبدیل تصاویر است متصل می شود. قبل از اینکه بتوانیم rmagick را نصب کنیم، باید ImageMagick را نصب کنیم.
(تصویر 25)
وقتی که ما ImageMagick را در سیستم خود نصب کنیم، می توانیم کتابخانه ی rmagick را با استفاده از فرمان زیر نصب کنیم:
maik> gem install rmagick
اکنون می توانیم از rmagick در برنامه های روبی خود استفاده کنیم. ما از آن برای تبدیل یک فایل گرافیکی به یک فایل ++C استفاده می کنیم:
require 'RMagick'
include Magick
image = Image::read(ARGV[0]).first
puts '#include "thermometer.h"'
puts 'PROGMEM const unsigned char thermometer[] = {'
puts " #{image.columns}, #{image.rows},"
(0..image.rows).each do |y|
print ' B'
(0..image.columns).each do |x|
pixel = image.pixel_color(x, y)
print pixel.red == 0 ? '0' : '1'
print ', B' if (x + 1) % 8 == 0
end
print '0' * (8 - (image.columns % 8))
puts ','
end
puts '};'
در کدهای بالا، ابتدا برنامه، کتابخانه ی rmagick را بارگذاری می کند و فضای نام(namespace) RMagick را ایمپورت(import) می کند. ما این کار را برای کوتاه شدن تایپ کردن استفاده می کنیم زیرا اکنون ما مجبور نیستیم تمام کلاس های که در فضای نام RMagick را کاملا تعیین کنیم.
در خط شماره 4، ما یک تصویر را قرائت(read) می کنیم که نامش را باید به صورت یک آرگومان خط فرمان(command-line) پاس بدهیم. فرمت فایل این تصویر اهمیتی ندارد، زیرا ImageMagick تقریبا تمام فرمت های فایل های تصویری را شناسایی می کند. متغیر image حاوی یک تصویر است که دیگر به فایل اصلی وابسته نیست.
عبارت زیر درست یابی شود:
سپس ما سه خط اولِ این فایل ++C را در خروجی(output) که می خواهیم فایل ما در آن تولید شود، ایجاد می کنیم. این خط ها اکثراً استاتیک هستند. تنها خط سوم، حاوی برخی بخش های متغیر است. یعنی width و height تصویر.
سپس ما پیکسل های تصویر را با استفاده از دو حلقه ی(nested loops) تو در تو پردازش می کنیم. حلقه ی بیرونی برای هر ردیف(row) از تصویر تکرار می شود. و حلقه ی درونی نیز بر روی هر ستون(column) از تصویر تکرار می شود. در خط 13، ما پیکسل فعلی را قرائت می کنیم(read) و سپس در خط بعدی، با استفاده از یک ترفند ساده، برای تعین اینکه آیا این پیکسل سیاه(black) یا سفید(white) است، استفاده می کنیم.
اکنون ما می دانیم که تصاویر ما تنها شامل پیکسل های سیاه و سفید هستند، بنابراین خوب است که تنها یک مولفه ی رنگی را بررسی کنیم. اگر مولفهی red (قرمز) برابر با 0 باشد، پیکسل ما سیاه خواهد شد. و اگر 1 باشد، پیکسل ما سفید خواهد شد. ما هر پیکسل را به یک مقدار بیتی( bit value) تبدیل می کنیم و اگر تعداد پیکسل های درون ردیف(row) تصویر، قابل تقسیم بر 8 و بدون باقی مانده نباشند، ما بیت های باقی مانده را با صفرها پر می کنیم.ما می توانیم برنامه را به صورت زیر اجرا کنیم:
maik> ruby img2cpp.rb thermometer.png > thermometer.cpp
این فراخوانی، فایل thermometer.png را به یک فایل ++C تبدیل می کند که می توانیم آن را بدون تغییرات بیشتر، به پروژه ی آردوینوی خود متصل کنیم. در فصل بعد، می آموزید که چگونه یک دسته ی بازی Wii یا Wii Nunchuk را به آردوینو متصل کنید و با استفاده از کتابخانه ی TVout آردوینو را به یک کنسول بازی تبدیل کنید.
اگر کدها کار نکرد چه کنیم؟
با اینکه سخت افزارهای این فصل ساده است، اما ممکن است خطاهای زیادی ایجاد شود. اگر هیچ سیگنال ویدئویی را در تلویزیون خود مشاهده نمی کنید، اطمینان حاصل کنید که منبع ورودی(input source) را درست انتخاب کرده باشید. معمولاً نام آن AV یا Composite است. اگر شک دارید، تمام موارد را امتحان کنید. سپس بررسی کنید که مقاومت ها را درست متصل کرده باشید. مقاومت 470 اهم باید به پین D7 و مقاومت 1 کیلو اهم را باید به پین D9 متصل کنید. همچنین مطمئن شوید که مقاومت ها مقادیر صحیحی داشته باشند. اگر یک سیگنال ویدئویی نادرست دریافت کردید، مطمئن شوید که به اشتباه، از NTSC به جای PAL یا برعکس، استفاده نکرده باشید. همچنین بررسی کنید که کابل اصلاح شده ی RCA را به درستی لحیم کرده باشید. اگر شک دارید، می توانید بیشتر از لحیم استفاده کنید.
تمرین های آخر فصل
- از کتابخانه ی TVout برای به تصویر در آوردن داده های برخی دیگر سنسورها استفاده کنید. شما می توانید سعی کنید که مقالات کنترل پارک در فصل 5، یا احساس جهان دور ما در صفحه 77 را با استفاده از کتابخانه ی TVout به تصویر در آورید.
- دماسنج تلویزیون را اصلاح کنید تا بتواند هم از درجه ی سلسیوس و هم از درجه ی فارنهایت استفاده کند و هر چند ثانیه یک بار تغییر کند. فقط به متن دما بسنده نکنید بلکه گرافیک ها را نیز تغییر دهید.
1. سعی کنید نظرات شما مرتبط با مقاله ی مورد نظر باشد، در غیر این صورت پاسخ داده نخواهد شد.
2. سوالات خود را به صورت کوتاه بیان کنید و از پرسیدن چند سوال به طور همزمان خودداری کنید.
3. سوال خود را به طور واضح بیان کنید و از کلمات مبهم استفاده نکنید.