برنامه نویسی برای پایه های 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 برد رزبری پای رو میتونید با توجه به نوع بردی که دارید از اینترنت پیدا کنید .

هیچ نظری موجود نیست:
ارسال یک نظر