داستان
ادامه راه اندازی مجدد با یک دکمه Raspberry Pi متوقف شده
در مقاله اخیر، من نشان دادم که چگونه می توان از Arduino Pro Micro برای ارسال کاراکترها به کنسول سریال Raspberry Pi Zero W استفاده کرد. Pro Micro به این دلیل انتخاب شد که کوچک، ارزان و به راحتی به دست می آید به علاوه پورت USB یکپارچه آن را فراهم می کند. یک راه راحت برای ارتقاء آسان برنامه نویسی. ( همیشه قبل از وارد کردن کابل میکرو USB به Pro Micro، ProMicro Vcc را از RPi جدا کنید. )
این مقاله تمام مفروضات مقاله ارجاع شده قبلی را حفظ می کند و با نشان دادن اینکه چگونه به راحتی می توان از چندین پین دیجیتال در پشت سر هم برای ایجاد یک مقدار عددی استفاده کرد و سپس آن مقدار عددی را می توان برای فراخوانی انواع مختلف استفاده کرد، روی جنبه برنامه نویسی آردوینو تمرکز خواهد کرد. عملکردهایی برای انجام نیازهای ما تنها با استفاده از یک دکمه فشاری برای شروع ارتباطات با RPi از طریق کنسول سریال.
آنچه برنامه (طرح طرح) باید انجام دهد
من از قبل میدانم که فکر میکنم میخواهم با نرمافزار به چه چیزی برسم، اما مهم نیست که چقدر در استخراج کدهای آردوینو مهارت دارید، من همیشه توصیه میکنم شرایط کلی را یادداشت کنید. همیشه این کار را انجام دهید و زمانی که مدتهاست که جزئیات را فراموش کردهاید، از خودتان تشکر میکنید.
- باید قابلیت فرمان چندگانه، شاید 8 در مجموع ارائه دهد
- باید بصری و آسان برای استفاده باشد تا امکان تفویض وظایف را فراهم کند
- باید به راحتی به روز شود زیرا سیستم عامل Raspbian برای RPi اغلب تغییر می کند
- طرح باید واضح و مستند باشد تا با دیگران به اشتراک گذاشته شود
- یک دکمه مشترک باید هر یک از 8 طرح انتخاب شده را اجرا کند
پین ها
سقف اصلی p -o f- c به سادگی از یک دکمه برای چاپ در پورت سریال Tx آردوینو استفاده می کرد که به ورودی Rx0 RPi Zero W متصل بود. این برای یک POC خوب بود. اکنون که حداقل 8 مجموعه دستور جداگانه و شاید پیچیده می خواهم، به راهی برای انتخاب هر کدام به صورت جداگانه نیاز دارم. سه تا از پین های دیجیتال آردوینو 2^3 ترکیب را ارائه می دهند که عالی است. به دلیل موقعیت فیزیکی آنها، من انتخاب کردم که از D7، D8 و D9 استفاده کنم. بنابراین، من دکمه فشاری را فقط برای راحتی به D10 منتقل کردم.
2^3 (2 به توان 3 افزایش یافته است) هشت ترکیب است و به طور کلی به صورت 0 تا 7 (صفر تا هفت) توصیف می شود.
Logic Table x == no connection(default) 0 == Grounded
2^0 2^1 2^2
Decimal /-------Pins------/ Function call
Value D7 D8 D9
0 0 0 0 zero()
1 x 0 0 one()
2 0 x 0 two()
3 x x 0 three()
4 0 0 x four()
5 x 0 x five()
6 0 x x six()
7 x x x seven()
پین های آردوینو
برای درک موارد فوق، باید بینش کمی در مورد پین های دیجیتال آردوینو ارائه کنم. پین ها می توانند ورودی یا خروجی باشند. در حالت خروجی، مقدار یک پین می تواند منطقی 0 (کم) یا منطقی 1 (بالا) باشد، اما ما از حالت ورودی استفاده خواهیم کرد، بنابراین مقدار "feed" به پین باید زیاد یا کم باشد. عبارات منطقی آردوینو در واقع مفهوم بالا و پایین را درک می کنند و اگر من پین های دیجیتال را به عنوان ورودی فعال کنم، می توانم مقدار مقاومت کششی (کشش ضعیف) را نیز فعال کنم تا یک پایه ورودی باز (غیر متصل) همیشه یک عدد دیجیتال را بخواند. ارزش بالا بنابراین، اگر هر 3 مورد از D7، D8، D9 باز باشند، آنها واقعاً بالا هستند زیرا کشش ضعیف در داخل IC مقدار بالا را تضمین می کند. برای تغییر مقدار ترکیبی هشتی سه ورودی، فقط باید یک یا چند پایه را زمین (Gnd) کنم تا یک سطح منطقی پایین ایجاد کنم. یک تابع بسیار ساده (و غیر پیچیده) برای ایجاد عدد 0 تا 7 به دست آمده نوشته شد.
int nValue (void) {
uint8_t temp = 0;
if( digitalRead( 9 )) temp += 4;
if( digitalRead( 8 )) temp += 2;
if( digitalRead( 7 )) temp += 1;
return temp;
}
خوب این آسان بود! بنابراین، با باز بودن D9، D8 و D7 (پیشفرض)، تابع 7 را برمیگرداند. از آنجا که از جامپرها (یا سوئیچهای DIP) برای انتخاب شرایط روشن/خاموش (روشن == متصل به Gnd) استفاده میشود، سپس مقدار بازگشتی خواهد شد. محدوده از 7 تا 0. عالی. در اینجا دقت کنید... اگر یک سوئیچ روشن است، پین دیجیتال مربوطه به پایین منطقی کشیده می شود زیرا ما در حال اتصال مشترک سوئیچ به زمین (Gnd.) هستیم.
تا اینجا، هیچ جادوی مورد نیاز نیست: فقط یک کاربرد ساده و مستقیم منطق اولیه. اون چیز خوبیه. با تلاش برای دسترسی سطح پایین به پورت دیجیتال، کل فرآیند می تواند بسیار زشت شود. در حالی که چنین تغییراتی بسیار کارآمدتر خواهند بود، پیچیدگی در ماشینی که فقط یک بار در هر 1000 میلیثانیه چرخه میکند، به سادگی ضروری نیست. آن را ساده نگه دارید - عقل خود را حفظ کنید.
کارکرد
در حال حاضر، من بخش عمده ای از برنامه را، حداقل در ذهن خود، تکمیل کرده ام. من از تجربه میدانم که برای راهاندازی ارتباطات سریال باید کدی در setup() داشته باشم و از تجربه میدانم که تمام کارها در حلقه () انجام خواهد شد. من تصمیمی در ایجاد جدول حقیقت در بالا گرفتم که شاید هنوز واضح نباشد: تصمیم گرفتم که هر 8 حالت از طریق توابع جداگانه ارائه شود. یعنی اگر مقدار 3 دکمه 0 باشد، باید تابعی بنویسم که قبلاً با نام () صفر تعریف کرده بودم. اگر مقدار اکتال 7 باشد، من قبلاً تابع را در نمودار هفت () نام گذاری کرده ام. می توانید آن را Fred() یا Sam() یا Sue() بنامید، اما من خیلی ساده دل هستم که نمی توانم با شما به آن سفر بروم (این بار!)
برای جزئیات بیشتر: اتوماسیون کنسول سریال RPi با استفاده از آردوینو