杰瑞科技汇

Python如何操控BeagleBone?

Of course! Using Python with a BeagleBone is an excellent way to get into physical computing, robotics, and home automation. The BeagleBone is a powerful single-board computer (SBC) that runs a full Linux distribution, making it incredibly versatile.

Python如何操控BeagleBone?-图1
(图片来源网络,侵删)

Here’s a comprehensive guide covering the most common ways to use Python with a BeagleBone, from the simplest methods to more advanced projects.

Why Python on a BeagleBone?

  • Ease of Use: Python's simple, readable syntax makes it perfect for beginners and for quickly prototyping ideas.
  • Rich Libraries: There's a Python library for almost everything, from hardware control (GPIO, I2C, SPI) to web servers and data analysis.
  • Power: Unlike microcontrollers like the Arduino, the BeagleBone runs a full OS (like Debian), so you can run complex scripts, web servers, and even machine learning models directly on the device.

Method 1: The Official BeagleBone Python Library (Adafruit_BBIO)

This is the most popular and straightforward method for controlling the BeagleBone's General-Purpose Input/Output (GPIO) pins, as well as I2C and SPI peripherals. It's modeled after the popular RPi.GPIO library for the Raspberry Pi.

Step 1: Flash the BeagleBone OS

If you haven't already, you need an operating system on your BeagleBone.

  1. Download the latest BeagleBone Debian image from the official BeagleBoard.org Downloads page.
  2. Use a tool like BalenaEtcher to flash the image onto a microSD card.
  3. Insert the SD card into your BeagleBone, power it on, and wait for it to boot.

Step 2: Connect to the BeagleBone

You have two main options:

Python如何操控BeagleBone?-图2
(图片来源网络,侵删)
  • SSH (Recommended): Connect your BeagleBone to your network via Ethernet. Find its IP address (often displayed on the connected screen or via your router's admin panel). Then, from your computer, run:
    ssh debian@<your_beaglebone_ip>
    # The default password is 'temppwd'
  • USB Serial: Connect the BeagleBone to your computer via USB. It should appear as a serial device (e.g., /dev/ttyACM0 on Linux, a COM port on Windows). You can use a terminal emulator like minicom or PuTTY to connect.

Step 3: Install Adafruit_BBIO

Once you are connected via SSH, the installation is simple.

# Update package lists
sudo apt-get update
# Install the library
sudo apt-get install python3-adafruit-bbio

(For Python 2, the package name is python-adafruit-bbio)

Step 4: Your First Python Script: Blinking an LED

The BeagleBone has built-in LEDs. Let's control one of them using Python.

  1. Find the LED Name: On a BeagleBone Black, the main user-controllable LED is often named usr0. You can find a list of all available LEDs in the /sys/class/leds/ directory on the BeagleBone.

  2. Create the Python Script:

    nano blink.py
  3. Paste the following code into nano:

    import time
    from Adafruit_BBIO import GPIO
    # The 'usr0' LED is a common one on BeagleBone boards.
    # You can also use physical pin numbers like "P8_10".
    # Check your specific board's documentation for pin mappings.
    led_pin = "USR0"
    # Set the pin as an output
    GPIO.setup(led_pin, GPIO.OUT)
    print("Blinking LED. Press Ctrl+C to exit.")
    try:
        while True:
            GPIO.output(led_pin, GPIO.HIGH)  # Turn LED on
            print("LED ON")
            time.sleep(0.5)                 # Wait for 0.5 seconds
            GPIO.output(led_pin, GPIO.LOW)   # Turn LED off
            print("LED OFF")
            time.sleep(0.5)                 # Wait for 0.5 seconds
    except KeyboardInterrupt:
        print("Cleaning up")
        GPIO.cleanup() # Always clean up at the end
  4. Run the script:

    python3 blink.py

    You should see the USR0 LED blinking!


Method 2: The Low-Level Approach (sysfs)

Before Adafruit_BBIO became popular, the standard way to control GPIO was through the Linux sysfs filesystem. It's more verbose but doesn't require installing any Python libraries. It's a great way to understand what's happening under the hood.

  1. Export the GPIO Pin: You need to tell the kernel that you want to use a specific pin. Let's use P8_10.

    echo "P8_10" > /sys/class/gpio/export

    This will create a directory /sys/class/gpio/gpio44 (P8_10 corresponds to GPIO 44).

  2. Set the Direction: Now, set the pin as an output.

    echo "out" > /sys/class/gpio/gpio44/direction
  3. Create a Python Script (blink_sysfs.py):

    import time
    # The path to the GPIO value file
    gpio_pin = "/sys/class/gpio/gpio44/value"
    try:
        while True:
            # Turn the LED ON (write '1')
            with open(gpio_pin, 'w') as f:
                f.write('1')
            print("ON")
            time.sleep(0.5)
            # Turn the LED OFF (write '0')
            with open(gpio_pin, 'w') as f:
                f.write('0')
            print("OFF")
            time.sleep(0.5)
    except KeyboardInterrupt:
        print("Cleaning up")
        # Unexport the pin
        with open("/sys/class/gpio/unexport", 'w') as f:
            f.write('44')

    Run it with python3 blink_sysfs.py.

Note: The sysfs method is being phased out in modern Linux kernels in favor of the character device interface (/dev/gpiochipX). For new projects, Adafruit_BBIO is highly recommended.


Method 3: Using Web Frameworks (Flask)

A key advantage of the BeagleBone is its full OS. You can easily turn it into a web-controlled device. This is perfect for home automation projects.

Let's create a simple web server with Flask to control an LED.

  1. Install Flask:

    sudo apt-get install python3-flask
  2. Create the Flask App (app.py):

    from flask import Flask, render_template_string, request
    import Adafruit_BBIO.GPIO as GPIO
    app = Flask(__name__)
    # Set up the GPIO pin
    led_pin = "USR0"
    GPIO.setup(led_pin, GPIO.OUT)
    led_state = GPIO.LOW
    # Simple HTML template
    HTML_TEMPLATE = """
    <!DOCTYPE html>
    <html>
    <head>
        <title>BeagleBone LED Control</title>
    </head>
    <body>
        <h1>BeagleBone LED Control</h1>
        <p>Current LED State: {{ led_state }}</p>
        <a href="/turn_on"><button>Turn ON</button></a>
        <a href="/turn_off"><button>Turn OFF</button></a>
    </body>
    </html>
    """
    @app.route('/')
    def index():
        global led_state
        return render_template_string(HTML_TEMPLATE, led_state="ON" if led_state == GPIO.HIGH else "OFF")
    @app.route('/turn_on')
    def turn_on():
        global led_state
        GPIO.output(led_pin, GPIO.HIGH)
        led_state = GPIO.HIGH
        return index()
    @app.route('/turn_off')
    def turn_off():
        global led_state
        GPIO.output(led_pin, GPIO.LOW)
        led_state = GPIO.LOW
        return index()
    if __name__ == '__main__':
        # Run on the BeagleBone's IP address, accessible on the network
        app.run(host='0.0.0.0', port=5000, debug=True)
  3. Run the Flask App:

    python3 app.py
  4. Access the Web Page: Open a web browser on your computer and go to http://<your_beaglebone_ip>:5000. You should see a simple webpage with buttons to turn the LED on and off!


Method 4: Robotics with robotpy

For robotics, the RobotPy project provides a high-performance, cross-platform set of libraries for controlling motors, sensors, and other robotics hardware. It's the standard for Python-based robotics on the BeagleBone and roboRIO (FRC).

  1. Install RobotPy libraries:

    pip install robotpy-hal-base robotpy-hal-beaglebone robotpy-motors-victorsp
  2. Example: Controlling a Victor SP Motor Controller

    import wpilib
    from wpilib import TimedRobot
    from wpilib.interfaces import MotorController
    class MyRobot(TimedRobot):
        def robotInit(self):
            # Initialize a Victor SP motor on PWM channel 0
            # The BeagleBone uses the 'hal' (Hardware Abstraction Layer) to do this.
            self.motor: MotorController = wpilib.MotorController(
                "pwm", 0, hal_data={"pwm": {"channel": 0}}
            )
        def teleopPeriodic(self):
            # Get joystick input
            stick = self.stick
            y_axis = stick.getY()
            # Set motor speed
            self.motor.set(y_axis)
    if __name__ == "__main__":
        wpilib.run(MyRobot)

    This example uses the standard wpilib framework, which is designed for competition robots but can be adapted for any project.

Key Concepts & Best Practices

  • Pin Mappings: This is the most confusing part. BeagleBone pins have multiple functions (GPIO, Analog, UART, I2C, SPI). You must configure the correct pinmux settings before using a pin for a specific function. Libraries like Adafruit_BBIO handle this for you when you use their pin names (e.g., "P8_10"). For advanced use, you may need to use the config-pin command-line tool.

    # Set P9_12 to be an I2C pin
    config-pin P9_12 i2c
  • Power Management: Be careful with power. An external power supply is recommended for motors or high-current devices. Use optocouplers or MOSFETs to control high-power devices from the low-power GPIO pins.

  • Running Scripts at Boot: To make your Python script run automatically on startup, you can use systemd.

    1. Create a service file: sudo nano /etc/systemd/system/myproject.service

    2. Add a simple unit file:

      [Unit]
      Description=My Python Project
      After=network.target
      [Service]
      User=debian
      WorkingDirectory=/home/debian/my_project
      ExecStart=/usr/bin/python3 /home/debian/my_project/app.py
      Restart=always
      [Install]
      WantedBy=multi-user.target
    3. Enable and start the service:

      sudo systemctl daemon-reload
      sudo systemctl enable myproject.service
      sudo systemctl start myproject.service

Getting Help

  • BeagleBoard.org Forums: The official community is a great place for specific hardware questions.
  • Adafruit Forums: Excellent for help with Adafruit_BBIO.
  • GitHub: Look at the GitHub repositories for the libraries you're using (adafruit/Adafruit_BeagleBone_IO, robotpy/robotpy). The issue trackers and source code are invaluable resources.
分享:
扫描分享到社交APP
上一篇
下一篇