برنامه نویسی GPIO برای رزبری پای

برنامه نویسی برای پایه های 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\n");
else
    printf("Pin 17 is LOW\n");

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

مدتها بود میخواستم این مطلب رو بنویسم که حداقل برای خودم در دسترس باشه

Leave a Comment

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *