همه چیز با خرید نویسنده یک دستگاه جالب در بازار ثانویه آغاز شد - Smart Response XE (
این دستگاهها چندین سال پیش متوقف شدند و مدارسی که هر کدام به قیمت 100 تا 200 دلار خریداری کردند، اکنون با قیمت 10 دلار یا کمتر در eBay ظاهر میشوند. سخت افزار آنجا برای آزمایش های گیک بسیار مناسب است:
- صفحه کلید 60
- صفحه نمایش با وضوح 384×136، 2 بیت در هر پیکسل - شبیه به BC، CGA، اما 4 رنگ نه، بلکه درجه بندی روشنایی
- میکروکنترلر ATmega128RFA1 (حافظه فلش 128 کیلوبایتی، رام 4 کیلوبایتی، رم 16 کیلوبایتی، فرستنده و گیرنده 802.15.4)
- فلش مموری خارجی (در رابطه با میکروکنترلر نه کل دستگاه) 1 مگابیت (128 کیلوبایت) با رابط SPI
- محفظه برای 4 عنصر AAA.
از نام میکروکنترلر مشخص است که متعلق به خانواده AVR است، یعنی اینکه دستگاه را با آردوینو سازگار کنیم، کاری بیش از پیش پیش پا افتاده است.
از اخبار به بعد
اما نویسنده بیشتر به فرصتی برای بازی در دستگاه، بلکه مطالعه علاقه مند است:
- فلش مموری با رابط SPI سریال
- بوت لودر برای AVR
- استاندارد 802.15.4
نویسنده با نوشتن شروع کرد
این برای آپلود بوت لودر آردوینو کافی است، اما نه طرح - پورت سریال به آنجا متصل نیست، بنابراین هنوز نمی توانید بدون باز کردن کیس انجام دهید. همچنین، خطوط TX0 و RX0 اولین پورت سریال با خطوط نظرسنجی ماتریس صفحه کلید ترکیب می شوند، یعنی خطوطی که کلیدهای عملکرد در کناره های نمایشگر را نظرسنجی می کنند. اما چه کاری می توانید انجام دهید - نویسنده این را ساخته است:
او خطوط JTAG را به آنجا آورد و حالا دیگر نیازی به باز کردن محفظه باتری نیست. و برای اینکه بتوان طرح ها را آپلود کرد، هر دو پورت سریال را به یک کانکتور وصل کردم، همچنین یک سوئیچ اضافه کردم، زیرا با نصب باتری، از نظر فیزیکی غیرممکن است که دستگاه را به روش دیگری خاموش کنید.
کار با یک آهن لحیم کاری، یک چاقوی کاربردی و یک تفنگ چسب زمان زیادی طول کشید. به طور کلی، آپلود طرح ها "از طریق هوا" بسیار راحت تر است؛ ما فوراً باید چیزی برای این کار اختراع کنیم.
Arduino IDE از این برنامه برای آپلود طرح ها استفاده می کند
نویسنده پس از تلاش از راه های مختلف برای غلبه بر این مشکل، به موارد زیر رسید. دستگاه دارای یک حافظه فلش 128 کیلوبایتی با رابط SPI است - ما داده ها را از طریق سیم دریافت می کنیم (به یاد داشته باشید که نویسنده قبلاً یک دستگاه با کانکتور در کناره دارد)، از این حافظه به عنوان بافر استفاده می کنیم و داده ها را از طریق رادیو ارسال می کنیم. کانال به دستگاه دیگری سلام از Cybiko.
پس از نوشتن کد کار با کانال رادیویی و همچنین فونت، حجم لودر از 4 کیلوبایت بیشتر شد. بنابراین، مقدار HFUSE باید از 0xDA به 0xD8 تغییر کند. اکنون بوت لودر می تواند تا 8 کیلوبایت طول داشته باشد و آدرس شروع اکنون 0x1E000 است. این در Makefile منعکس شده است، اما باید هنگام پر کردن نیز در نظر گرفته شود
فرستنده گیرنده 802.15.4 در ATmega128RFA1 در اصل برای کار با استفاده از پروتکل طراحی شده است.
مشخص شد که کانال های 15 و 26 کمترین آسیب را در برابر تداخل وای فای دارند. نویسنده دومی را انتخاب کرد. سلب مسئولیت: مترجم نمی داند که آیا مجاز است ZigBee را به این طریق ساده کند. شاید بهتر باشد کمی بیشتر برنامه نویسی کنیم و آن را به طور کامل پیاده سازی کنیم؟
در دستگاه اول، لازم است یک ماشین حالت محدود پیاده سازی شود که داده ها را از طریق پروتکل STK500 منتقل می کند. در بیشتر موارد، پیامهای ارسال و دریافت شده خودکفا هستند، اما برخی از آنها به پیامهایی که قبلاً از کانال عبور کردهاند، مرتبط هستند. شرح دیالوگ داده شده است
یکی از اجزای مهم این گفتگو، ارسال بسته هایی است که برای نوشتن در حافظه فلش دستگاه مقصد در نظر گرفته شده است. برای میکروکنترلرهای ساده از خانواده AVR حجم صفحه 128 بایت ولی برای ATmega128RFA1 256 و برای فلش مموری که از طریق پروتکل SPI وصل می شود همینطور است. برنامه در دستگاه اول، هنگام آپلود یک طرح، بلافاصله آن را به دستگاه دوم منتقل نمی کند، بلکه آن را در این حافظه می نویسد. هنگامی که Arduino IDE صحت ورودی را بررسی می کند، آنچه در آنجا نوشته شده است ارسال می شود. حال باید داده های دریافتی را از طریق کانال رادیویی به دستگاه دوم منتقل کنیم. در همان زمان، تغییر از دریافت به ارسال و برگشت اغلب اتفاق می افتد. پروتکل STK500 نسبت به تأخیر بی تفاوت است، اما از دست دادن داده ها را تحمل نمی کند (عجیب است، اما در بالا گفته شد که تأخیر بر انتقال داده ها نیز تأثیر می گذارد). و تلفات در طول انتقال بی سیم اجتناب ناپذیر است. ATmega128RFA1 دارای یک پیاده سازی سخت افزاری داخلی از درخواست های مکرر در مواقعی است که در مورد صحت انتقال شک و تردید وجود دارد، اما نویسنده تصمیم گرفت همان را در نرم افزار پیاده سازی کند. او پروتکلی را توسعه داد که در آن داده های بسیار بیشتری به یک سمت نسبت به دیگری جریان می یابد.
این کامل نیست، اما کار می کند. صفحه 256 بایتی به چهار بخش تقسیم می شود که هر بخش به صورت یک بسته از طریق هوا منتقل می شود. یک بسته می تواند تا 125 بایت داده به اضافه یک بایت برای طول و دو بایت برای CRC نگه دارد. بنابراین قطعات 64 بایتی به همراه شماره صفحه و بخش (از 0 تا 3) در آنجا قرار می گیرند. دستگاه دریافت کننده دارای متغیری است که به آن امکان می دهد تعداد بخش های دریافت شده را ردیابی کند و هنگامی که هر چهار بخش وارد شدند، دستگاه فرستنده تأیید دریافت کل صفحه را دریافت می کند. بدون تایید (CRC مطابقت نداشت) - کل صفحه را دوباره ارسال کنید. سرعت حتی بیشتر از انتقال از طریق کابل است. دیدن:
اما به طور کلی، ارائه یک راه مناسب برای اتصال کابل به دستگاه های آپلود طرح ها و از طریق آن ضروری است. به عنوان مثال، مانند عکس، داخل چنین مبدل رابطی روی CP2102 قرار دهید و آن را به برد بچسبانید تا بتواند در هنگام اتصال و جدا کردن کابل Micro USB در برابر نیرو مقاومت کند.
همچنین دارای یک تثبیت کننده 3,3 ولتی است (و نحوه استفاده از آن در دستگاهی با منبع تغذیه 6 ولت - اگر همان تثبیت کننده را داشته باشد و می توانید دو دیود اضافه کنید تا به طور خودکار انتخاب کنید که کدام یک از آنها دستگاه را تغذیه می کند) . هر سه LED باید از برد مبدل رابط لحیم نشده باشند، در غیر این صورت هنگام کار بر روی آنها باتری ها را بارگیری می کنند و همچنین در نظرسنجی صفحه کلید اختلال ایجاد می کنند و با حافظه فلش با رابط SPI کار می کنند.
دنبال کردن یک هدف حتی جالبتر از دستیابی به آن بود (و نیازی به شوخی در مورد اتوبوس ندارید). نویسنده چیزهای زیادی در مورد بوت لودرهای AVR، حافظه فلش SPI، پروتکل STK500 و استاندارد 802.15.4 آموخت.
تمام کدهای دیگر علاوه بر کتابخانه ای که در بالا توضیح داده شد − است
منبع: www.habr.com