Truy cập chân gpio bằng chương trình c trong raspberry pi


8

Tôi đang sử dụng raspberry pi với hình ảnh Debian Wheezy 18-09-2012. Tôi có thể truy cập chân gpio với công cụ Wires pi. Nhưng tôi muốn biết có phương pháp nào khác mà chúng ta có thể truy cập trực tiếp vào chân gpio mà không cần nối dây không?

Khi tôi chạy lệnh sau trên thiết bị đầu cuối

echo 0 >/sys/class/gpio/export

nó cho thấy

-bash: /sys/class/gpio/export: Permission denied

Có giải pháp nào cho điều này?

Tôi cũng đã thử đoạn script sau

#!/bin/sh

echo "4" > /sys/class/gpio/export
echo "out" > /sys/class/gpio/gpio4/direction

while true
do
        echo 1 > /sys/class/gpio/gpio4/value
        echo 0 > /sys/class/gpio/gpio4/value
done

từ đây và tôi nhận được cùng một lỗi.

Tôi muốn chạy mã trên C vì hiện tại tôi không quen với cả Java và Python.


Xin chào, tôi đã thực hiện các thao tác gpio như vậy trong beagleboard bằng cách truy cập / sys / class / gpio / gpio (portpin) / value với các phương thức mở / ghi / đọc tệp bằng c. Nhưng ở đây, nó cho thấy sự cho phép bị từ chối ...
sumith

Bạn nên thêm nhóm những thứ này vào người dùng của bạn hoặc chạy bằng root với sudo. Lưu ý rằng chuyển hướng được thực hiện trước khi chạy sudo, vì vậy nó sẽ cố gắng mở nó với tư cách là người dùng của bạn chứ không phải root.
Anders

Câu trả lời:


10

Vâng, có ít nhất hai trong số họ:

Mô-đun hạt nhân GPIO

Tài liệu đầy đủ của hệ thống con này có thể được tìm thấy ở đây (tìm Sysfs Interface for Userspacephần phụ). Về cơ bản, kernel xuất một số tập tin trong /sys/class/gpio/thư mục. Dưới đây là cách sử dụng ví dụ (sử dụng chân 0 làm đầu vào và sau đó chuyển đổi thành đầu ra và đặt thành 1):

# echo 0 >/sys/class/gpio/export
# echo in >/sys/class/gpio/gpio0/direction
# cat /sys/class/gpio/gpio0/value
# echo out >/sys/class/gpio/gpio0/direction
# echo 1 >/sys/class/gpio/gpio0/value

Lưu ý rằng trong trường hợp bình thường, bạn cần quyền root để làm điều này.

Vì tất cả điều này chỉ là một hoạt động tập tin, nó có thể được thực hiện dễ dàng trong chương trình C với open()/ read()/ write()chức năng. Hãy cẩn thận khi sử dụng fopen()/ fread()/ fwritechức năng vì chúng sử dụng I / O được đệm.

Trực tiếp sử dụng thanh ghi

Cái này, tôi tin rằng, đang được sử dụng bởi chính hệ thống dây điện. Nó sử dụng /dev/memthiết bị để truy cập bộ nhớ RaspberryPi vật lý và để hoạt động trực tiếp trên các thanh ghi ánh xạ bộ nhớ BCM2835. Để sử dụng nó, bạn sẽ phải đọc biểu dữ liệu BCM2835 ( General Purpose I/O (GPIO)phần). Nó không phải là tầm thường tuy nhiên. Lưu ý, rằng bạn cần quyền root để làm điều này.

Ngoài ra còn có một thư viện C sử dụng theo cách này, bạn có thể tìm thấy nó ở đây . Nó không chỉ đơn thuần là thao túng GPIO mà vì nó khá đơn giản, nên dễ dàng chỉ trích xuất mã GPIO và hiểu cách thức hoạt động của nó.


Cảm ơn bạn. Nhưng khi cố gắng chạy echo 0> / sys / class / gpio / export nó hiển thị -bash: / sys / class / gpio / export: Quyền bị từ chối Tại sao ,? làm ơn cho tôi biết
sumith

1
@Sumith: Như đã đề cập trong câu trả lời, bạn cần có quyền người dùng root. Hãy thử sử dụng sudo -iđể trở thành người dùng root và sau đó nhập các lệnh ví dụ.
Krzysztof Adamski

1
@sumith ls -l /sys/class/gpio/exporthiển thị cái gì? @KrysztofAdamski Bạn có thể chỉnh sửa câu trả lời của mình để in đậm sự thật rằng bạn cần phải root để truy cập các tệp này không? Tôi đã không nhìn thấy nhận xét này trong câu trả lời của bạn lúc đầu.
HeatfanJohn

1
chmoding hoặc chown các tệp (dưới dạng root) là một tùy chọn khác để cho phép truy cập không được ưu tiên tiếp theo, nhưng bạn sẽ phải làm điều đó trên mỗi lần khởi động. Ngoài ra, hãy thử sudo -s để lấy shell chạy từ gốc để chạy thử nghiệm
Chris Stratton

2
@sumith: Có, chương trình của bạn chỉ cần mở các tệp đó và đọc / ghi từ / đến chúng với các hoạt động đọc / ghi bình thường. Đó là tốt hơn để sử dụng unbuffered read()/ write()chức năng thay vì đệm fread()/ fwrite(). Ngoài ra, hãy chắc chắn rằng chương trình của bạn sẽ được chạy với quyền root.
Krzysztof Adamski

3

Hoặc, nếu bạn không có nghĩa là 'trực tiếp', bạn có thể sử dụng Python hoặc thậm chí Java


Cảm ơn bạn, nhưng tôi không quen thuộc với cả java và python.s lỗi.
sumith

0

Tôi có thể truy cập ghim gpio bằng phương pháp được đề xuất bởi Chris Stratton.

Trong tập tin /etc/rc.local tôi thêm các lệnh

echo 17 (pin gpio)> / sys / class / gpio / export

chmod 777 -R / sys / lớp / gpio / gpio17.

Tôi có thể chạy chương trình c của mình mà không cần nhập sudo -s trước.

Cảm ơn tất cả các bạn đã ủng hộ tôi ..


0

Bạn có thể có quyền truy cập vào tất cả các thiết bị ngoại vi Raspberry Pi (bao gồm GPIO, C, ...) bằng C bằng cách ghi vào các thanh ghi tương ứng trên Pi.

Tôi đã viết một hướng dẫn về điều này ở đây: http://www.pieter-jan.com/node/15

Bằng cách này, bạn sẽ không phải sử dụng bất kỳ thư viện nào, chỉ cần có kiến ​​thức cơ bản về C. Tôi hy vọng điều này sẽ giúp!

Như đã nói ở trên, bạn sẽ cần phải thực thi tất cả các chương trình của mình với tư cách là người dùng sudo.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.