برنامه نویسی برای پایه های GPI/O برد رزبری پای از قسمت های جالب کار با این برد هست . به جز GPI/O برای قسمتهای مختلف مثل PWM یا پورت سریال هم به همین صورت میشه برنامه نوشت و از این قسمتها استفاده کرد .
برای این کار ابتدا یک کتابخانه C از گیتهاب دانلود میکنیم . من ترجیح میدم از ترمینال استفاده کنم :
sudo apt-get update sudo apt-get install git git clone https://github.com/WiringPi/WiringPi
اگر برنامه git رو نصب ندارید ابتدا نصبش کنیم . سپس از گیتهاب کتابخانه رو کلون میکنیم .
برای چک کردن اینکه آخرین ورژن رو دریافت کرده باشیم ( در صورتیکه قبلا این کتابخانه را گرفته باشیم و الان دوباره ازش استفاده میکنیم ) از دستور زیر استفاده میکنیم :
cd wiringPi git pull origin
ما الان آخرین ورژن از کتابخانه رو روی SD Card برد رزبری پای کپی شده داریم . برای نصب این کتابخانه در مسیر جاری ( داخل پوشه wiringPi ) از دستور زیر استفاده میکنیم :
cd wiringPi ./build
بعد از نصب کتابخانه نوبت به تست کارکرد صحیح دستورات میرسه :
بهترین کار استفاده از Manual این کتابخانه است .
man gpio
از بین سوییچ های مختلفی که دستور gpio دارد سوئیچ های g- ( شماره گذاری پین ها طبق شماره گذاری انجام شده در برد به جای شماره گذاری انجام شده در wiringPi ) و همچنین دستورات read ( خواندن یک پین ) و write ( نوشتن یک مقدار ۰یا ۱ بر روی یک پین ) برای کار فعلی ما کفایت میکنند .
برای تست کارکرد صحیح ابتدا یک LED را بین یکی از پایه های GPIO ( مثلا پایه شماره ۴ ) و پایه زمین وصل میکنیم ، کدهای زیر در ترمینال باعث تعریف شدن این پایه بصورت خروجی و سپس تغییر وضعیت آن از ۰ به ۱ خواهد شد .
gpio -g mode 4 output gpio -g write 4 1 gpio -g write 4 0
همچنین برای خواندن مقدار یک پین میتوان از دستورات زیر استفاده کرد :
gpio -g mode 4 up gpio -g read 4
که یک مقدار برگشتی ۰ یا ۱ نشاندهنده بالا یا پایین بودن پین مورد نظر است .
برنامه نویسی WiringPi به زبان C
برای نوشتن برنامه به زبان C ابتدا باید هدر فایل wiringpi.h به سورس برنامه مورد نظر اضافه شود و درهنگام کامپایل هم کتابخانه wiringpi با سوئیچ l- به کامپایلر معرفی شود .
در تابع main ابتدا مقدار دهی اولیه پایه ها را انجام میدهیم :
wiringPiSetupGpio(); // Initializes wiringPi using the Broadcom GPIO pin numbers
سپس با نوشتن دستور
pinMode([pin], [mode])
میتوانیم پین ها را در یکی از مدهای Input یا Output و یا PWM قرار دهیم . مثلا :
wiringPiSetupGpio() pinMode(17, INPUT); pinMode(18, OUTPUT); pinMode(27, PWM_OUTPUT);
برای تغییر دادن مقدار یک پین output میتوانیم از دستور زیر استفاده کنیم :
digitalWrite([pin], [HIGH/LOW])
به عنوان مثال :
digitalWrite(23, HIGH);
برای یک پین که بصورت pwm تنظیم شده است میتوانیم از تابع زیر استفاده کنیم :
pwmWrite([pin], [0-1023])
به عنوان مثال:
pwmWrite(17, 410);
دستور فوق DutyCycle موج خروجی روی پایه ۱۷ را برابر ۴۰٪ قرار می دهد ( ۰.۴*۱۰۲۴ = ۴۱۰ )
برای خواندن ورودی دیجیتال از دستور زیر استفاده میکنیم :
digitalRead([pin])
به عنوان مثال این دستور پین ۱۷ را چک کرده و متناسب با ۰ یا ۱ بودن آن پیغام مناسب را چاپ میکند :
if (digitalRead(17)) printf ("pin 17 is HIGH"); else printf("pin17 in LOW");
همانطور که در موقع تست gpio دیدیم . اینجا نیز مقدار برگشتی ۰ یا ۱ خواهد بود .
برای استفاده از مقاومت PullUp یا PullDown در صورت نیاز از تابع زیر استفاده میکنیم:
pullUpDnControl([pin], [PUD_OFF, PUD_DOWN, PUD_UP])
به عنوان مثال :
pullUpDnControl(23, PUD_UP);
تاخیر در برنامه نویسی توسط دو تابع زیر ایجاد میشود .
delay([milliseconds]) delayMicroseconds([microseconds])
به عنوان مثال برای بدست آوردن تاخیر ۱ ثانیه ای میتوان بصورت زیر عمل کرد :
delay(1000)
برنامه نمونه به زبان C
#include<stdio.h> // Used for printf() statements #include<wiringPi.h> // Include WiringPi library! // Pin number declarations. We're using the Broadcom chip pin numbers. const int pwmPin = 18; // PWM LED - Broadcom pin 18, P1 pin 12 const int ledPin = 23; // Regular LED - Broadcom pin 23, P1 pin 16 const int butPin = 22; // Active-low button - Broadcom pin 22, P1 pin 15 const int pwmValue = 450; // Use this to set an LED brightness int main(void) { // Setup stuff: wiringPiSetupGpio(); // Initialize wiringPi -- using Broadcom pin numbers pinMode(pwmPin, PWM_OUTPUT); // Set PWM LED as PWM output pinMode(ledPin, OUTPUT); // Set regular LED as output pinMode(butPin, INPUT); // Set button as INPUT pullUpDnControl(butPin, PUD_UP); // Enable pull-up resistor on button printf("blinker is running! Press CTRL+C to quit."); // Loop (while(1)): while(1) { if (digitalRead(butPin)) // Button is released if this returns 1 { pwmWrite(pwmPin, pwmValue); // PWM LED at bright setting digitalWrite(ledPin, LOW); // Regular LED off } else // If digitalRead returns 0, button is pressed { pwmWrite(pwmPin, 1024 - pwmValue); // PWM LED at dim setting // Do some blinking on the ledPin: digitalWrite(ledPin, HIGH); // Turn LED ON delay(75); // Wait 75ms digitalWrite(ledPin, LOW); // Turn LED OFF delay(75); // Wait 75ms again } } return 0; }
در برنامه فوق پایه های GPIO شماره ۱۸ برای PWM شماره ۲۳ برای یک LED دائم روشن و شماره ۲۲ برای یک کلید فشاری در نظر گرفته شده است . کلید و LED ها بین پایه ها و پایه زمین قرار میگیرند . در هنگام فشرده شدن کلید فشاری LED روشن ، خاموش ( کم نور ) میشود و LED خاموش بصورت چشمک زن روشن میشود .
منابع : این مطلب با نگاهی به سایت Sparkfun.com نوشته شده که توضیحات خوبی درباره برنامه نویسی به زبان C درش آورده شده .
سایت توسعه دهنده کتابخانه wiringPi هم مطالب بسیار خوبی داره و صد البته برای سورس کتابخانه گیتهاب توسعه دهنده پیشنهاد میشه .
GPIO Pinout برد رزبری پای رو میتونید با توجه به نوع بردی که دارید از اینترنت پیدا کنید .
هیچ نظری موجود نیست:
ارسال یک نظر