Ένας οδηγός GPIO για αρχάριους
Σε αυτό το άρθρο θα μάθετε τα πάντα για τις ακίδες GPIO του Raspberry Pi. Αυτή η ανάρτηση είναι ειδικά για αρχάριους στα ηλεκτρονικά.
Πρώτα απ' όλα, μια προειδοποίηση:
Το Raspberry Pi μπορεί να υποστεί ανεπανόρθωτη ζημιά εάν οι ακίδες χρησιμοποιηθούν λανθασμένα. Έτσι, βεβαιωθείτε πάντα ότι το κύκλωμά σας είναι σωστό και ότι χρησιμοποιείτε αρκετές αντιστάσεις.
Τι είναι οι ακίδες GPIO
Οι ακίδες GPIO είναι οι 40 μικρές μεταλλικές ακίδες στο πάνω μέρος του Raspberry Pi. Η συντομογραφία GPIO σημαίνει input output γενικού σκοπού. Αυτό σημαίνει ότι οι ακίδες GPIO μπορούν να χρησιμοποιηθούν ως διεπαφή για σχεδόν οποιαδήποτε ηλεκτρονική συσκευή.
Λόγω του μεγάλου αριθμού τρόπων (κακής) χρήσης των καρφιτσών, το ξεκίνημα μπορεί να είναι λίγο μπερδεμένο. Για το λόγο αυτό, αυτή η δημοσίευση στο ιστολόγιο παρέχει μερικά παραδείγματα σχετικά με τον τρόπο ελέγχου των pins χρησιμοποιώντας Bash, C και Python. Επομένως, μια μικρή εμπειρία στον προγραμματισμό είναι πλεονέκτημα.
Αν και οι 40 ακίδες φαίνονται πανομοιότυπες, έχουν διαφορετικές λειτουργίες. 26 ακίδες μπορούν να χρησιμοποιηθούν για GPIO και ορισμένες έχουν πρόσθετες λειτουργίες. Άλλες 4 ακίδες χρησιμοποιούνται ως πηγή τροφοδοσίας (POWER, δύο φορές 3V3 και δύο φορές 5V) και 8 ως αρνητικός πόλος (επίσης γείωση ή GROUND). Οι δύο εναπομείναντες ακροδέκτες είναι η διασύνδεση I2C για το ID EEPROM.
Pinout
Το παρακάτω γράφημα δείχνει τις πιο σημαντικές πληροφορίες, μεταξύ άλλων την διάταξη ακροδεκτών. Η διάταξη ακροδεκτών είναι πανομοιότυπη για τα περισσότερα μοντέλα Raspberry Pi, αλλά υπάρχουν διαφορές. Ελέγχετε πάντα την ακριβή διάταξη ακροδεκτών του μοντέλου σας πριν συνδέσετε μια συσκευή. Για το σκοπό αυτό αρκεί να ανοίξετε ένα τερματικό στο Raspberry Pi σας (Ctrl+Alt+t) και να εκτελέσετε την ακόλουθη εντολή.
pinout
Θα δείτε ένα γραφικό όλων των συνδέσεων και την ακριβή διάταξη των ακροδεκτών του Raspberry Pi σας.
Ίσως έχετε παρατηρήσει ότι οι αριθμοί GPIO εμφανίζονται τυχαία και δεν ταιριάζουν με την αρίθμηση των ακροδεκτών. Για να αποφύγετε τη σύγχυση, αναφέρομαι στην αρίθμηση από το 1 έως το 40 ως τον αριθμό BOARD και στον αριθμό από το 1 έως το 26 ως τον αριθμό BCM ή GPIO.
Έτσι, ο ακροδέκτης 1 του BOARD είναι ο σύνδεσμος 3V3 POWER και ο ακροδέκτης 2 του GPIO είναι ο διπλανός ακροδέκτης με τον αριθμό 3 του BOARD.
Πώς να συνδέσετε μια συσκευή στους ακροδέκτες
Υπάρχουν διάφορες εναλλακτικές λύσεις για τη σύνδεση μιας συσκευής στους ακροδέκτες GPIO. Ορισμένες συσκευές διαθέτουν κεφαλίδα GPIO, ώστε η συσκευή να μπορεί να συνδεθεί απευθείας στις ακίδες GPIO. Γενικά, ωστόσο, αυτό δεν ισχύει, γι' αυτό και χρησιμοποιούνται καλώδια βραχυκυκλωμάτων ή καλώδια επέκτασης GPIO.
Παρακολουθήστε το βίντεο μας για τα GPIO Pins!
Στο ακόλουθο παράδειγμα, μια λυχνία LED συνδέεται με το Raspberry Pi χρησιμοποιώντας καλώδια βραχυκυκλώματος.
Το κύκλωμα
Τα θηλυκά προς αρσενικά καλώδια Jumper συνδέουν την ακίδα GPIO σε μια κεφαλίδα ή σε μια πλακέτα breadboard. Η ακίδα πρέπει στη συνέχεια να προγραμματιστεί για να λειτουργήσει η συσκευή. Η συσκευή μπορεί να είναι ένα κουμπί, μια λυχνία LED, ένας αισθητήρας, ένας κινητήρας ή μια οθόνη. Είναι σημαντικό μόνο η συσκευή να μπορεί να λειτουργήσει με 5 βολτ ή λιγότερο και να είναι συμβατή με τις διεπαφές I2C, SPI ή UART.
Για την κατασκευή χρειαζόμαστε τον ακόλουθο εξοπλισμό.
- Raspberry Pi με Raspberry Pi OS
- Δύο αρσενικά προς θηλυκά καλώδια Jumper
- Ένα καλώδιο Jumper αρσενικό προς αρσενικό
- Αντίσταση 10 kilo Ohm
- LED
- breadboard χωρίς συγκόλληση
Συνδέστε την καρφίτσα GPIO 13 (αριθμός ΚΑΡΤΑΣ 33) στο + λωρίδα και τον ακροδέκτη GROUND δίπλα του (αριθμός ΚΑΡΤΑ 34) στο - λωρίδα του breadboard. Στη συνέχεια, συνδέστε το ένα άκρο της αντίστασης των 10 kilo Ohm (οποιαδήποτε αντίσταση) στο + λωρίδα και το άλλο άκρο σε μία από τις εγκάρσιες λωρίδες. Για τις λυχνίες LED, ο προσανατολισμός είναι ζωτικής σημασίας. Η άνοδος είναι ο μακρύτερος από τους δύο βραχίονες και συχνά κάμπτεται, η κάθοδος είναι ο κοντύτερος βραχίονας. Η άνοδος πρέπει πάντα να δείχνει προς την + κατεύθυνση, δηλαδή προς την πηγή ενέργειας, και η κάθοδος στην – κατεύθυνση, δηλ. προς το ΕΔΑΦΟΣ. Τοποθετήστε λοιπόν τον μακρύτερο βραχίονα στην ίδια εγκάρσια λωρίδα με την αντίσταση, έτσι ώστε ο κοντύτερος βραχίονας να βρίσκεται στη διπλανή εγκάρσια λωρίδα. Τέλος, χρησιμοποιήστε το καλώδιο γέφυρας από αρσενικό σε αρσενικό για να συνδέσετε τη διαγώνια λωρίδα της καθόδου (μικρότερος βραχίονας της λυχνίας LED) με το - λωρίδα.
Το παρακάτω διάγραμμα δείχνει τη συναρμολόγηση, βεβαιωθείτε ότι όλα είναι σωστά και ότι τα εξαρτήματα έχουν εισαχθεί στην πλακέτα μέχρι το τέρμα, διαφορετικά θα υπάρχουν χαλαρές επαφές.
Τα ακόλουθα τρία παραδείγματα κώδικα σε Bash, Python και C βασίζονται σε αυτή τη δομή. Αν χρησιμοποιείτε άλλες καρφίτσες, πρέπει να τροποποιήσετε τον κώδικα ανάλογα.
Bash
Ο έλεγχος των ακροδεκτών GPIO μέσω του Bash είναι πολύ εύκολος. Στο Linux, οι ακίδες GPIO ελέγχονται από τα αρχεία στο αρχείο /sys/class/gpio φάκελος. Για να χρησιμοποιήσετε έναν ακροδέκτη GPIO, πρέπει πρώτα να εξαχθεί. Ως παράδειγμα, χρησιμοποιώ την ακίδα GPIO 13. Στα παρακάτω τα ονόματα αρχείων είναι έντονα και πλάγια.
Ανοίξτε ένα τερματικό και αναφέρετε τα περιεχόμενα του φακέλου gpio.
cd /sys/class/gpio
ls
Ο φάκελος περιέχει τα αρχεία εξαγωγής και μη εξαγωγής, καθώς και υποφακέλους για κάθε εξαγόμενο ακροδέκτη GPIO.
Εξάγουμε τον ακροδέκτη γράφοντας τον αριθμό GPIO στην εντολή /sys/class/gpio/export αρχείο. Εκτελέστε αυτή την εντολή στο τερματικό.
echo 13 > /sys/class/gpio/export
ls
Τώρα έχει δημιουργηθεί ένας φάκελος με τον αντίστοιχο αριθμό ακροδέκτη gpio13. Αυτός ο φάκελος περιέχει άλλους φακέλους και αρχεία. Προς το παρόν, μόνο τα αρχεία κατεύθυνσης και τιμών είναι σημαντικά για εμάς.
Το κατεύθυνση αρχείο αποθηκεύει τη λειτουργία της ακίδας:
στο -> Το Pin βρίσκεται σε λειτουργία ανάγνωσης ή εισόδου
out -> Το Pin βρίσκεται σε κατάσταση εγγραφής ή εξόδου
Το αξία αποθηκεύει την κατάσταση τάσης του ακροδέκτη:
0 -> ο ακροδέκτης βρίσκεται σε κατάσταση LOW -> δεν εφαρμόζεται τάση στον ακροδέκτη
1 -> Η ακίδα βρίσκεται σε κατάσταση HIGH -> Εφαρμόζεται τάση στην ακίδα
Οι ακόλουθες εντολές θέτουν τη λειτουργία σε out και την τιμή στο 1.
echo out > /sys/class/gpio/gpio13/direction
echo 1 > /sys/class/gpio/gpio13/value
Η λυχνία LED είναι τώρα αναμμένη. Είναι σημαντικό να επαναφέρετε τις τιμές των ακροδεκτών μετά τη χρήση. Οι ακόλουθες εντολές πρέπει να εκτελούνται μετά από κάθε χρήση.
echo 0 > /sys/class/gpio/gpio13/value
echo in > /sys/class/gpio/gpio13/direction
echo 13 > /sys/class/gpio/unexport
Πρόγραμμα Python
Τώρα θα αφαιρέσουμε και θα αυτοματοποιήσουμε αυτές τις εντολές Bash στην Python.
Το ακόλουθο σενάριο Python παρέχει ένα απλό GPIO_Pin κατηγορία. Αυτό το καθιστά εξαιρετικά εύκολο στη χρήση. Το os module μας επιτρέπει να εκτελούμε τις ίδιες εντολές bash όπως παραπάνω από την Python. επίσης, με τη χρήση της ενότητας __del__ μέθοδο, δεν χρειάζεται πλέον να επαναφέρουμε και να αποσύρουμε χειροκίνητα τις ακίδες.
import os
from time import sleep
class GPIO_Pin:
def __init__(self, num, mode):
if 0 <= num or num <= 40:
self.num = num
else:
print('Invalid Pin Number -> Enter a number from 0 - 40')
if mode == 'out' or mode == 'write':
self.mode = 'out'
elif mode == 'in' or mode == 'read':
self.mode = 'in'
else:
print('Invalid Pin Mode -> Enter "out" or "write" for output, "in" or "read" for input')
if self.num and self.mode:
os.system(f'echo {str(self.num)} > /sys/class/gpio/export')
sleep(0.05)
os.system(f'echo {self.mode} > /sys/class/gpio/gpio{str(self.num)}/direction')
def reset(self):
os.system(f'echo 0 > /sys/class/gpio/gpio{str(self.num)}/value')
os.system(f'echo in > /sys/class/gpio/gpio{str(self.num)}/direction')
def write(self, value):
if value == 0 or value == 'LOW':
os.system(f'echo 0 > /sys/class/gpio/gpio{str(self.num)}/value')
elif value == 1 or value == 'HIGH':
os.system(f'echo 1 > /sys/class/gpio/gpio{str(self.num)}/value')
else:
print('Invalid value -> Enter 1 or "HIGH" for HIGH, 0 or "LOW" for LOW')
def __del__(self):
self.reset()
os.system(f'echo {str(self.num)} > /sys/class/gpio/unexport')
def set_mode(self, mode):
self.mode = mode
os.system(f'echo {str(self.mode)} > /sys/class/gpio/gpio{str(self.num)}/direction')
def main():
pin = GPIO_Pin(13, 'out')
number_of_blinks = 10
for i in range(number_of_blinks):
pin.write('HIGH')
sleep(0.5)
pin.write('LOW')
sleep(0.5)
if __name__ == '__main__':
main()
Με τη μονάδα χρόνου μπορούμε ακόμη και να κάνουμε το LED να αναβοσβήνει χωρίς κανένα πρόβλημα. Ολόκληρο το σενάριο μπορεί να επεκταθεί σε μια ενότητα Python για τον έλεγχο GPIO.
Πρόγραμμα C
Επίσης στη C μπορούμε εύκολα να επεξεργαστούμε το περιεχόμενο του φακέλου gpio. Χρησιμοποιώντας την τυπική βιβλιοθήκη stdlib μπορούμε να ανοίξουμε αρχεία και να αλλάξουμε τα περιεχόμενά τους.
Το ακόλουθο πρόγραμμα C πρέπει να μεταγλωττιστεί πριν εκτελεστεί. Δημιουργήστε ένα αρχείο gpio.c και αντιγράψτε το πρόγραμμα σε αυτό.
Στη συνέχεια, ανοίξτε ένα τερματικό και πλοηγηθείτε στο φάκελο όπου βρίσκεται το gpio.c αρχείο βρίσκεται. Χρησιμοποιήστε τις ακόλουθες εντολές για να μεταγλωττίσετε και να εκτελέσετε το πρόγραμμα.
gcc -o gpio gpio.c
./gpio
Εδώ είναι το πρόγραμμα.
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#define GPIO_ROOT "/sys/class/gpio"
#define EXPORT "/sys/class/gpio/export"
#define UNEXPORT "/sys/class/gpio/export"
#define LOW 0
#define HIGH 1
int export_pin(int num) {
FILE* export = fopen(EXPORT, "w");
if (export == NULL) {
printf("Failed to open the export file\n");
exit(-1);
}
fprintf(export, "%d", num);
fclose(export);
return 0;
}
int unexport_pin(int num) {
FILE* unexport = fopen(UNEXPORT, "w");
if (unexport == NULL) {
printf("Failed to open the unexport file\n");
exit(-1);
}
fprintf(unexport, "%d", num);
fclose(unexport);
return 0;
}
int set_direction(char *mode, int num) {
char direction_file_path[1024];
snprintf(direction_file_path, sizeof(direction_file_path), "/sys/class/gpio/gpio%d/direction", num);
FILE* direction = fopen(direction_file_path, "w");
if (direction == NULL) {
printf("Failed to open the direction file\n");
exit(-1);
}
fputs(mode, direction);
fclose(direction);
return 0;
}
int set_value(int val, int num) {
char value_file_path[1024];
snprintf(value_file_path, sizeof(value_file_path), "/sys/class/gpio/gpio%d/value", num);
FILE* value = fopen(value_file_path, "w");
if (value == NULL) {
printf("Failed to open the value file\n");
exit(-1);
}
fprintf(value, "%d", val);
fclose(value);
return 0;
}
int main() {
int rslt;
int num;
int num_blinks;
num = 13;
num_blinks = 10;
rslt = export_pin(num);
rslt = set_direction("out", num);
for (int i = 0; i < num_blinks; i++) {
rslt = set_value(HIGH, num);
sleep(1);
rslt = set_value(LOW, num);
sleep(1);
}
rslt = set_value(LOW, num);
rslt = set_direction("in", num);
rslt = unexport_pin(num);
return EXIT_SUCCESS;
}
PiCockpit - Εφαρμογή GPIO
Ο ευκολότερος τρόπος ελέγχου των ακροδεκτών GPIO είναι με τη βοήθεια της εφαρμογής GPIO App. Το Διαδικτυακή διεπαφή PiCockpit είναι δωρεάν για έως και 5 Raspberry Pi. Προσφέρει δύο μεγάλα πλεονεκτήματα: Δεν χρειάζεται να γνωρίζετε προγραμματισμό για να ελέγχετε τις ακίδες GPIO και μπορείτε να το κάνετε αυτό από οπουδήποτε.
Απλά εγκαταστήστε το πρόγραμμα-πελάτη PiCockpit στο Raspberry Pi και συνδεθείτε στο λογαριασμό σας στο PiCockpit. Μετά από αυτό μπορείτε εύκολα να ελέγχετε τις ακίδες GPIO μέσω της διεπαφής ιστού.
Επόμενα βήματα
Τώρα ξέρετε πώς να χρησιμοποιείτε τους ακροδέκτες GPIO με τη βοήθεια καλωδίων βραχυκυκλώματος. Φυσικά υπάρχουν επίσης εξωτερικές μονάδες Python και βιβλιοθήκες C για τον έλεγχο των ακίδων GPIO. Ένα καλό επόμενο βήμα θα ήταν να επεκτείνετε ένα από τα παραδείγματα κώδικα. Για παράδειγμα, χρησιμοποιώντας πρόσθετες λυχνίες LED ή ένα κουμπί.
Καλή διασκέδαση στον πειραματισμό!