Kiểm tra tập lệnh Raspberry Pi trên PC


7

Tôi đang viết chương trình Raspberry Pi, để chạy công cụ, lấy đầu vào từ cảm biến, lưu trong cơ sở dữ liệu và đồng bộ hóa với máy chủ.

Có cách nào để kiểm tra nó trên PC trước khi triển khai nó lên Raspberry Pi không? Vì có quá nhiều thao tác GPIO, tôi muốn chắc chắn rằng nó hoạt động trước khi đưa nó vào Raspberry Pi. Một số loại giả lập GPIO hoặc một cái gì đó. Tôi đang dùng Manjaro Linux .

Nó không phải là trình giả lập, một loại IDE có khả năng hiểu các chức năng GPIO. Chẳng hạn, một đầu ra có thể sẽ là:

gpio 1 is running,
sensor 1 is running
sensor 2 isn't running

Một cái gì đó như thế, có lẽ là một plugin Bpython hoặc một cái gì đó. Tất cả những gì tôi muốn làm là đảm bảo rằng tất cả các chức năng GPIO của tôi đang hoạt động theo cách tôi muốn chúng hoạt động trước khi thử nghiệm trên Raspberry Pi, bởi vì nhiều lần, các lỗi trên Raspberry Pi phải làm với tôi không kết nối chính xác các bộ phận. Và tôi không thích mã hóa và sửa lỗi trên Raspberry Pi.

Vì vậy, nếu tôi có thể xác minh tập lệnh của mình hoạt động chính xác trên PC, tôi có thể truy cập Raspberry Pi, biết rằng tập lệnh của tôi vẫn ổn và sửa nội dung trên bảng. Tôi chỉ không muốn kiểm tra kịch bản của mình trên Raspberry Pi nữa.


Một cách tiếp cận khác có thể là sử dụng "sshfs" để gắn thư mục nhà raspberry pi trên PC của bạn. Sau đó, bạn có thể sử dụng bất cứ điều gì bạn muốn để viết mã của bạn với các tệp của bạn trên pi, và sau đó có một ssh-shell trên pi mà bạn thực sự chạy mã. Vì điều này xảy ra qua kết nối ssh, tốc độ bị giới hạn, nhưng nó có thể hoạt động tốt cho bạn.
Thorbjørn Ravn Andersen

Câu trả lời:


6

Tôi không biết về bất kỳ giải pháp được xây dựng sẵn sàng nào cho nhu cầu của bạn.

Tuy nhiên, bạn có thể tự viết mà không cần nỗ lực nhiều. Có bao nhiêu cuộc gọi khác nhau để bạn thực hiện các chức năng gpio? Bạn có thể thấy bạn sử dụng ít hơn 10. Chỉ cần tạo mô-đun Python cục bộ của riêng bạn có tên giống như mô-đun đích của bạn và tạo ra các sơ khai cho các chức năng bạn sử dụng.

Ví dụ: nếu bạn sử dụng hàm gpio_write () sẽ lấy một gpio và một mức mà sơ khai của bạn có thể chỉ là

def gpio_write(gpio, level):
   print("gpio_write called with gpio={} level={}".format(gpio, level))

Sơ khai gpio_read của bạn có thể là

def gpio_read(gpio):
   global val
   print("gpio_read called with gpio={}, returning {}".format(gpio, val))
   return val # where val may be read from a file or set externally

Đây là một thực tiễn khá chuẩn, được sử dụng từ lâu trong phát triển phần mềm để kiểm tra phần mềm trước khi có phần cứng.

Nhân tiện, mô-đun Python pigpio của tôi chạy trên PC Windows / Mac / Linux.


mô-đun của bạn chạy trên linux nhưng không báo lỗi nếu nó không tìm thấy gpios như thư viện gpio tiêu chuẩn? Tôi đang sử dụng mô-đun của bạn btw
Lynob 15/08/2015

Mô-đun của tôi sẽ báo lỗi nếu nó chưa được kết nối với Pi. Nó cần một Pi nối mạng chạy pigpio daemon để có sẵn khi tập lệnh được chạy. Vì vậy, bạn vẫn sẽ phải sử dụng sơ khai nếu bạn không có sẵn Pi trên mạng. Tuy nhiên, nó sẽ cho phép bạn phát triển và chạy các tập lệnh trên PC thay vì trên Raspberry Pi. Tôi đã đưa ra đề nghị đó để đáp lại "Và tôi không muốn viết mã và sửa lỗi trên pi".
joan

1
ah thật tuyệt !!!
Lynob

Tôi có thể cài đặt mô-đun của bạn bằng cách sử dụng pip?
Lynob

@Lynob Không xa như tôi biết.
joan

4

GPIO Zero cung cấp giao diện giả pin , nghĩa là bạn có thể chạy cùng mã trên PC và mô phỏng các chân. Xem các ví dụ về cách nó được sử dụng trong bộ thử nghiệm .


Ngày nay, việc đánh dấu câu trả lời của bạn là tốt nhất nhưng đây là một câu hỏi cũ (hơn 4 năm). Tuy nhiên, nó đã giúp tôi với cùng một nghi ngờ như vậy, công việc tốt :)
Fernando Ortega

3

Tôi đã tạo thư viện nhỏ này, fedeb95 / pin tỏ ra hữu ích cho tôi. Thiếu một số tính năng, nhưng nếu nó phù hợp với bạn ... nó đã làm việc cho tôi.

Chỉnh sửa: pin là một trình bao bọc RPi.GPIO. Thay vì gọi phương thức x của RPi.GPIO, bạn gọi phương thức x của pin. Bạn có thể chỉ định trong tệp cấu hình nếu chương trình của bạn đang chạy ở chế độ thử nghiệm (bạn đã đọc các giá trị ngẫu nhiên từ các chân hoặc các giá trị bạn đặt với set_value) hoặc trên một mâm xôi thực tế, trong đó thư viện này chỉ cần gọi phương thức RPi.GPIO tương ứng. Nó thiếu một cái gì đó, nhưng nó là một thư viện rất đơn giản và bất cứ ai cũng có thể tự do đóng góp hoặc cho tôi biết anh ấy cần tính năng gì và tôi sẽ cố gắng thêm nó


2
Bạn có thể liệt kê ở đây một cái nhìn tổng quan ngắn về các tính năng?
RalfFriedl

Về cơ bản nó là một trình bao bọc RPi.GPIO. Thay vì gọi phương thức x pf RPi.GPIO, bạn gọi phương thức x của pin. Bạn có thể chỉ định trong tệp cấu hình nếu chương trình của bạn đang chạy ở chế độ thử nghiệm (bạn đã đọc các giá trị ngẫu nhiên từ các chân hoặc các giá trị bạn đặt với set_value) hoặc trên một mâm xôi thực tế, trong đó thư viện này chỉ cần gọi phương thức RPi.GPIO tương ứng. Nó thiếu một cái gì đó, nhưng đó là một thư viện rất đơn giản và bất cứ ai cũng có thể tự do đóng góp hoặc cho tôi biết anh ấy cần tính năng gì và tôi sẽ cố gắng thêm nó
fedeb

Bạn nên chỉnh sửa nó thành câu trả lời.
RalfFriedl


2

Tôi cho rằng bạn có thể sử dụng các thư viện giả như Mock .

Chúng chủ yếu được sử dụng để kiểm tra đơn vị, nhưng tôi khá đẹp, nó sẽ hoạt động rất tốt trong trường hợp của bạn. Và bạn có thể sẽ tốt hơn khi thử nó bằng cách viết một số bài kiểm tra đơn vị.

Nó thay thế một lớp đang hoạt động và bạn chỉ cần tự viết cho mình hành vi mà bạn đang tìm kiếm. Nó cho phép bạn không thay đổi bất cứ điều gì trong logic của mình (ngay cả nhập khẩu), nhưng vẫn nhận được các giá trị trả về mà bạn cho là bạn sẽ nhận được từ một cuộc gọi thực tế của API.


2

Là người mới chơi Python và Pi Tôi không hiểu câu trả lời của Joan và cần một cách đơn giản (bot không tao nhã!) Để kiểm tra chương trình của tôi trên PC mà không có thông báo lỗi do thiếu cuộc gọi GPIO. Tôi chỉ cần chọn những phần mã để chạy bằng cách kiểm tra xem tôi đang chạy trên máy nào. Sau đó tôi có thể thực hiện cuộc gọi GPIO - như đóng công tắc - từ bàn phím PC.

#!/usr/bin/python3
import socket
my_PC_host_name = 'Dev'
host_name = socket.gethostname()
if (host_name != my_PC_host_name):  # Only run these lines if we're not on the PC
    import RPi.GPIO as GPIO
    # Set GPIO numbering mode and define the input pin
    GPIO.setmode(GPIO.BOARD)  # Uses the same board numbering as on the board
    GPIO.setup(16, GPIO.IN)  # Set up the pin 16 as input

if (host_name != my_PC_host_name):  # Only run these lines if we're not on the PC
    try:
        while True:
            if GPIO.input(16) == 0:
                print ("Switch is open")
            else:
                print ("Switch is closed")             
    finally:
        GPIO.cleanup()  # Cleanup the GPIO ports before ending          
else:  # We're running on the PC
    try:
        while True:
            c = input('Press "o" then "Enter":')
            if c.upper() == 'O':
                print ("Switch is open")
            else:
                print ("Switch is closed")
    finally:           
        print ("Process completed")
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.