گاهی مسیر رشد یک ایده از دل سادهترین نیازها آغاز میشود؛ جایی که یک مهندس برای رفع مشکل شخصیاش دست به خلاقیت میزند، و نتیجهی آن به محصولی جهانی تبدیل میشود. داستان SANA USBasp – Smart ZIF-Socket AVR Programmer دقیقاً یکی از همینمسیرهاست؛ ابزاری که از دل یک پروژهی شخصی متولد شد و بعدها راهش را به بازارهای اروپا و آمریکا باز کرد.
تابستان سال ۱۳۹۲، من تصمیم گرفتم یک پروگرامر سادهتر و هوشمندتر برای میکروکنترلرهای AVR بسازم. در آن زمان از پروگرامر Hattel استفاده میکردم وواقعاً از طراحی کوچک و قابل حملش لذت میبردم؛ اما یک مشکل اساسی داشت: فقط در محیط ویندوز و با نرمافزار اختصاصی خودش کار میکرد. من کاربر لینوکس بودم و این محدودیت، عملاً من را از استفاده در پروژههای خودم بازمیداشت. از طرف دیگر، مدلهای مختلف USBasp موجود در بازار هم مشکلات خودشان را داشتند: بعضی برای هر نوع پکیج چندین سوکت جداگانه داشتند که دستگاه را بزرگ و شلوغ میکردند. بعضی دیگر از یک سوکت استفاده میکردند اما مجبور بودی هر تراشه را دقیق در محل خاصی قرار دهی و خطر اشتباه همیشه وجود داشت. در برخی مدلها هم با تغییر جامپر یا سوییچ مسیر پینها را مشخص میکردند که باز هم ساده نبود. تمامی این مدلها مشکل دیگری هم داشتند؛ تغذیه دائم سوکت باعث میشد تراشه از لحظهی اتصال روشن شود و اگر برنامهای روی آن بود، احتمال تداخل سیگنالها وجود داشت.
در طراحی نسخهی خودم از میکروکنترلر ATmega168 استفاده کردم تا نسبت به طرح اصلی فضای فلش بیشتری داشته باشم. فرمویر را هم بر پایهی سورس اصلی USBasp نوشتهی توماس فیشل توسعه دادم تا سازگاری کامل با نرمافزارها و ابزارهای موجود حفظ شود. همین سازگاری یکی از دلایل مهم محبوبیت سریع این پروگرامر شد. اما مهمترین بخش طراحی من، روتینگ خودکار سیگنالها بود. برای حفظ سادگی، تصمیم گرفتم از قابلیتهای داخلی خود میکروکنترلر برای تغییر مسیر پینها استفاده کنم و خبری از مالتیپلکسرها یا سوییچهای مکانیکی نباشد. این روش هم هزینهی ساخت را پایین آورد و هم اندازهی
برد را کوچک کرد.
برای تشخیص نوع تراشه، آرایهای به نام AVR_PIN_CONFIG در فرمویر تعریف کردم. در هر ردیف این آرایه، شمارهی پینهای سیگنالهای MOSI، MISO، SCK، RST، VCC، GND و XTAL برای هر تراشه مشخص شده بود. سپس توسط تابعی به نام pin_define پیکربندی پینها خوانده میشد و تابع ispEnterProgrammingMode تست میکرد که آیا میکرو وارد حالت پروگرام میشود یا نه. اگر نمیشد، به کانفیگ بعدی
میرفت. چالش اصلی اینجا زمان بود؛ فرمویر باید در کمترین زمان ممکن تراشه را تشخیص میداد، چون نرمافزارهای پروگرامر نباید احساس تأخیر کنند و باید تصور کنند با یک پروگرامر USBasp عادی در حال کار هستند.

یکی از نیازهای من، پروگرام کردن EEPROMهای سری ۲۴ و ۹۳ بود. بنابراین فرمویر را طوری توسعه دادم که با نرمافزار ProgISP سازگار شود. برای کشف نحوهی ارتباط، دستورات ارسالی از سمت نرمافزار را با یک پروگرامر ساده بررسی کردم و متوجه شدم برای EEPROMهای سری ۹۳ مثلاً دستور 0x07 ارسال میشود. به همین ترتیب پروتکلهای لازم را پیادهسازی و به فرمویر اضافه کردم.
در نسخههای بعدی، بخش تستر دیجیتال TTL/CMOS را هم اضافه کردم. در تسترهای متداول، فقط نتیجهی Pass/Fail نمایش داده میشود. اما من خروجی را به شکل نمودار شکل موج ورودی و خروجی نمایش دادم و نقاط خطا را با خطچین مشخص کردم تا کاربر درک بهتری از عملکرد واقعی قطعه داشته باشد. همچنین فایلهای تعریف بردار تست بهصورت متنی ذخیره میشدند تا کاربران بتوانند خودشان قطعات جدیدی به سیستم اضافه کنند. حتی با وارد کردن تعداد پینهای یک آیسی، تستر میتوانست چند گزینهی احتمالی برای شناسایی قطعه پیشنهاد دهد.

اولین نسخهها را برای استفادهی شخصی ساختم و هرگز قصد فروش نداشتم. اما وقتی همکارانم این پروگرامر را دیدند، از من خواستند برایشان هم بسازم. به مرور سفارشها بیشتر شد و در نهایت پروژهای که از اتاق کار من شروع شده بود، به کشورهای مختلف رفت — از ایران تا اروپا و آمریکا. یکی از کاربران هلندی در بازخوردی نوشت:
I can’t believe how small and perfect this programmer is. Automatic chip recognition and cross-platform operation are just genius!
موضوع نکته کلیدی
روتینگ سیگنالها سادگی طراحی با استفاده از امکانات داخلی میکروکنترلر زمان پاسخگویی تأخیر کم در تشخیص تراشه برای حفظ سازگاری نرمافزار ایمنی سختافزار عدم تغذیه دائم سوکت برای جلوگیری از تداخل سیگنالها توسعه نرمافزار تعریف ماژولهای جدا برای پشتیبانی از انواع EEPROM توسعهپذیری استفاده از فایلهای متنی برای افزودن قطعات جدید در تستر آیندهی پروژه و دعوت به مشارکت پروژهی SANA USBasp امروز بهصورت کاملاً اوپنسورس در دسترس است و هنوز جای رشد بسیاری دارد. برخی از مسیرهای پیشنهادی برای توسعه:
من از تمام علاقهمندان دعوت میکنم در توسعهی این پروژه مشارکت کنند و با دادن ⭐️ به ریپوی پروژه در گیتهاب، هم از کار حمایت کنند و هم به بیشتر دیده
شدن آن کمک کنند.
داستان SANA USBasp تنها دربارهی ساخت یک پروگرامر نیست؛ دربارهی فرآیند تبدیل یک نیاز شخصی به راهحلی جهانی است. پروژهای که از دل تجربه
و ضرورت شکل گرفت، به ابزاری مورد اعتماد در جامعهی مهندسی دنیا تبدیل شده است.
شاید این همان پیام اصلی باشد:
اگر بهجای دنبال کردن بازار، روی رفع نیاز واقعی تمرکز کنید، بازار خودش به سراغ شما میآید.
ایدهی تشخیص خودکار تراشه روی ZIF سوکت جذابه، ولی با توجه به تجربه من، در بعضی مدلها احتمال خطای شناسایی هست. بهخصوص وقتی که تراشه کمی خطا در سیگنالهای پایه داره، سیستم ممکنه مدل اشتباهی رو انتخاب کنه. شاید نیاز به مکانیزم تأیید دستی هم باشه.
درود و سپاس از دقت نظر و تجربهی ارزشمندتون 🙏
نکتهی خیلی خوبی مطرح کردید.
باید اشاره کنم که نقش ZIF سوکت در این فرآیند صرفاً نگهداری مکانیکی تراشه است و هیچ تأثیری در منطق تشخیص ندارد. آنچه اهمیت دارد، درستی روتینگ سیگنالها و الگوریتم تشخیص در فرمویر است.
در واقع اگر مسیرهای SPI، RESET، VCC و GND بهدرستی پیکربندی شوند، عملکرد تشخیص هیچ تفاوتی با اتصال مستقیم از طریق کابل ISP نخواهد داشت.
حتی از دید من، روش ZIF بهدلیل جداسازی کامل تراشه از مدار اصلی، شرایط ایزولهتری فراهم میکند و احتمال نویز یا تداخل از سایر مدارات را کاهش میدهد.
باز هم بابت توجه و بازخورد دقیق شما سپاسگزارم؛ چنین دیدگاههایی باعث بهبود و توسعه بهتر پروژه میشود 🌱
طراحی روتینگ خودکار روی ATmega168 خیلی جالب بود، اما سؤال من اینه که آیا این روش محدودیت سرعت در پروگرام تراشههای با فرکانس بالاتر ایجاد نمیکنه؟ چون در بعضی پروژهها نیاز به ISP با سرعت نسبتاً زیاد داریم.
درود و سپاس از دقت و توجه شما 🙏
به نکتهی بسیار ظریفی اشاره کردید.
بله، بهطور طبیعی بهدلیل نبود پینمالتیپلکسر (MUX) در خود میکروکنترلر، در این طراحی برای روتینگ خودکار سیگنالها مجبور شدم بهجای استفاده از واحد سختافزاری SPI، از روش نرمافزاری (bit-banging) استفاده کنم.
این موضوع در کنار پیادهسازی نرمافزاری واحد USB باعث میشود که سرعت پروگرام کمی پایینتر از نسخههای USBasp استاندارد باشد که از روتینگ ثابت استفاده میکنند.
البته همانطور که فرمودید، این دقیقاً یکی از بخشهایی است که میتواند در نسخههای آینده بهبود پیدا کند؛ مثلاً با استفاده از میکروکنترلرهای سری ARM که ارتباط USB را بهصورت سختافزاری پشتیبانی میکنند و از طرفی امکان پینمالتیپلکسینگ هم دارند، میشود هم روتینگ خودکار را حفظ کرد و هم سرعت پروگرام را افزایش داد.
درود و سپاس از دقت و توجه شما 🙏
به نکتهی بسیار ظریفی اشاره کردید.
بله، بهطور طبیعی بهدلیل نبود پینمالتیپلکسر (MUX) در خود میکروکنترلر، در این طراحی برای روتینگ خودکار سیگنالها مجبور شدم بهجای استفاده از واحد سختافزاری SPI، از روش نرمافزاری (bit-banging) استفاده کنم.
این موضوع در کنار پیادهسازی نرمافزاری واحد USB باعث میشود که سرعت پروگرام کمی پایینتر از نسخههای USBasp استاندارد باشد که از روتینگ ثابت استفاده میکنند.
این دقیقاً یکی از بخشهایی است که میتواند در نسخههای آینده بهبود پیدا کند؛ مثلاً با استفاده از میکروکنترلرهای سری ARM که ارتباط USB را بهصورت سختافزاری پشتیبانی میکنند و از طرفی امکان پینمالتیپلکسینگ هم دارند، میشود هم روتینگ خودکار را حفظ کرد و هم سرعت پروگرام را افزایش داد.
من قبلاً این پروژه رو دیده بودم و از همون موقع خیلی برام جذاب بود، خصوصاً اندازهی کوچیکش و اون هوشمندیِ تشخیص خودکار چیپ 😍، عملاً شده آچارفرانسهی AVR که واقعاً جذابه.
از همه مهمتر، متنباز منتشر شدنش حسابی خوشحالم کرد؛ دقیقاً همون چیزی که جامعهی ما لازم داره.
دمت گرم !
درود و سپاس از لطف و انرژی مثبتتون 🙏
خوشحالم که این پروژه مورد توجه جامعهی خوب سیسوگ قرار گرفته.
امیدوارم این مسیر باعث بشه پروژههای بیشتری در ایران به سمت توسعهی اوپنسورس و اشتراک دانش فنی برن.
سیسوگ با افتخار فضایی برای اشتراک گذاری دانش شماست. برای ما مقاله بنویسید.