Τα πάντα για το Bluetooth στο Raspberry Pi Pico W

Εικόνα τίτλου PiCockpit Pico W Bluetooth

Το Ίδρυμα Raspberry Pi ανακοίνωσε πρόσφατα Υποστήριξη Bluetooth με την έκδοση 1.5.1 του C/C++ SDK με μια νέα έκδοση του C/C++ SDK και του Micropython στο Pico W.

Και μάντεψε! Αν έχετε ένα Pico W, δεν χρειάζεται να αγοράσετε ένα καινούργιο.

Και αν δεν έχετε ακόμη Pico W, μπορείτε να αγοράσετε ένα. εδώ.

Έχουμε ήδη ένα άρθρο που καλύπτει όλα όσα πρέπει να γνωρίζετε για το Pico W. Επιπλέον, αν είστε αρχάριος με το Pico W, μπορείτε να δείτε αυτό το άρθρο.

Αλλά εδώ, καλύπτουμε όλα όσα πρέπει να ξέρετε για Bluetooth στο Raspberry Pi Pico W.

Pico W Ιστορικό

Ας δούμε πρώτα μερικές από τις προδιαγραφές του Pico W.

Το Pico W διαθέτει ασύρματες δυνατότητες χάρη στο ασύρματο τσιπ CYW43439.

Στην καρδιά κάθε Pico W βρίσκεται το RP2040, το οποίο είναι το πρώτο τσιπ πυριτίου του Raspberry Pi.

Το Infineon CYW43439 υποστηρίζει IEEE 802.11 b/g/n WLAN (Wi-Fi) και Bluetooth 5.2. Κατά την κυκλοφορία, μόνο το Wi-Fi υποστηριζόταν από το υλικολογισμικό και το λογισμικό.

Το CYW43439 υποστηρίζει BLE και μία μόνο κεραία που μοιράζεται μεταξύ Wi-Fi και Bluetooth.

Κεραίες Raspberry Pi και Pico W

Αν ρίξετε μια πιο προσεκτική ματιά στο Pico W, θα παρατηρήσετε την κεραία σε σχήμα τριγώνου της πλακέτας, παρόμοια με αυτή του Raspberry Pi 4. Το Raspberry Pi χρησιμοποιεί μια ενσωματωμένη κεραία με άδεια χρήσης από την ABRACON.

Αυτό σημαίνει ότι δεν απαιτείται πρόσθετη κεραία. Η ασύρματη διασύνδεση συνδέεται μέσω SPI στο RP2040.

Το επίσημο δελτίο δεδομένων προτείνει επίσης ότι για καλύτερη ασύρματη απόδοση, δεν πρέπει να τοποθετείτε μέταλλα κάτω ή κοντά στην κεραία. Ωστόσο, η προσθήκη γειωμένου μετάλλου στις πλευρές της κεραίας μπορεί να βελτιώσει το εύρος ζώνης της κεραίας.

Η ενσωματωμένη λυχνία LED ελέγχεται μέσω του ακροδέκτη WL_GPIO0 του τσιπ Infineon 43439. Στο Pico, η λυχνία LED ήταν συνδεδεμένη στο GPIO Pin 25.

Επιπλέον, οι ακίδες εντοπισμού σφαλμάτων SWD μετακινήθηκαν προς το κέντρο της πλακέτας, για να δημιουργηθεί χώρος για την κεραία της πλακέτας. Μπορείτε να τους βρείτε μεταξύ του RP2040 και του CYW43439 και η σειρά από αριστερά προς τα δεξιά εξακολουθεί να είναι SWCLK, GND, SWDIO.

Με το Pico W, μπορείτε να προγραμματίσετε σε C/C++ και MicroPython.

Κλασικό Bluetooth & BLE

Το Pico W λειτουργεί τόσο με Bluetooth Classic όσο και με Bluetooth Low Energy. Το Bluetooth Classic και το Bluetooth Low Energy (BLE) είναι δύο διαφορετικοί τρόποι επικοινωνίας των συσκευών στο πλαίσιο των προδιαγραφών Bluetooth.

Το Bluetooth Classic, επίσης γνωστό ως Bluetooth Basic Rate/Enhanced Data Rate (BR/EDR), είναι η αρχική έκδοση του Bluetooth. Σχεδιάστηκε για τη μετάδοση δεδομένων υψηλής ταχύτητας, τη ροή ήχου και τη σύζευξη συσκευών. Το Bluetooth Classic χρησιμοποιείται συνήθως για εφαρμογές όπως ασύρματα ηχεία ήχου, πληκτρολόγια, ποντίκια και μεταφορά αρχείων μεταξύ συσκευών.

Το Bluetooth Low Energy (BLE), επίσης γνωστό ως Bluetooth Smart, είναι μια αποδοτική παραλλαγή του Bluetooth. Το BLE εισήχθη ως μέρος της προδιαγραφής Bluetooth 4.0 και είναι βελτιστοποιημένο για συσκευές χαμηλής κατανάλωσης ενέργειας που απαιτούν μεγάλη διάρκεια ζωής της μπαταρίας, όπως συσκευές παρακολούθησης φυσικής κατάστασης, έξυπνα ρολόγια, συσκευές οικιακού αυτοματισμού και ασύρματοι αισθητήρες.

Το Pico W μπορεί να λειτουργήσει τόσο ως κεντρική συσκευή όσο και ως περιφερειακή συσκευή.

Ξεκινώντας με το Bluetooth στο Pico W

Ας ξεκινήσουμε με μια γρήγορη εργασία για να βεβαιωθούμε ότι το Bluetooth λειτουργεί σωστά.

Θα εκτελέσουμε ένα κλασικό πρόγραμμα για να ανάψει η ενσωματωμένη λυχνία LED στο Pico W, αλλά με Bluetooth.

Για το σκοπό αυτό, θα χρειαστείτε ένα Pico W, ένα καλώδιο micro-USB και ένα breadboard.

Pico W

ΒΗΜΑ ΠΡΩΤΟ

Το πρώτο πράγμα που θα χρειαστείτε είναι να κατεβάσετε Thonny IDE, αν δεν το έχετε ήδη.

Το Thonny είναι ένας εξαιρετικά εύκολος τρόπος για να προγραμματίσετε το MicroPython στο Pico W.

Πρέπει επίσης να κατεβάσετε αυτό το αρχείο UF2, το οποίο υποστηρίζει τόσο Wi-Fi όσο και BLE. Μόλις το κατεβάσετε, κρατήστε πατημένο το κουμπί BOOTSEL στο Pico W και συνδέστε το στον υπολογιστή σας μέσω USB. Αφήστε το κουμπί BOOTSEL μετά από περίπου 3 δευτερόλεπτα.

Θα εμφανιστεί μια απομακρυσμένη μονάδα δίσκου με την ονομασία "RPI-RP2". Μετακινήστε το αρχείο UF2 σε αυτή τη μονάδα.

Στη συνέχεια, η μονάδα δίσκου θα εξαφανιστεί.

ΒΗΜΑ ΔΕΥΤΕΡΟ

Μπορείτε τώρα να αποσυνδέσετε και να επανασυνδέσετε το Pico W (αυτή τη φορά, μην κρατάτε πατημένο το κουμπί BOOTSEL).

Ανοίξτε το Thonny.

Εικόνα του Pico W Bluetooth το Thonny IDE
Αλλάξτε το θέμα και τη γραμματοσειρά για να σώσετε τα μάτια σας!

Αφού ανοίξετε το Thonny, μεταβείτε στην επιλογή Εργαλεία > Επιλογές > Διερμηνέας και βεβαιωθείτε ότι ο διερμηνέας έχει οριστεί σε Micropython και ότι η θύρα είναι το Pico W. Ακολουθεί ένα παράδειγμα:

Το Pico W μπορεί να εμφανίζεται με διαφορετικό όνομα.

Μόλις το κάνετε αυτό, κάντε κλικ στο OK και είστε έτοιμοι να ξεκινήσετε.

Τώρα, αντιγράψτε τον παρακάτω κώδικα και επικολλήστε τον στην ενότητα :

from micropython import const
import struct
import bluetooth

_ADV_TYPE_FLAGS = const(0x01)
_ADV_TYPE_NAME = const(0x09)
_ADV_TYPE_UUID16_COMPLETE = const(0x3)
_ADV_TYPE_UUID32_COMPLETE = const(0x5)
_ADV_TYPE_UUID128_COMPLETE = const(0x7)
_ADV_TYPE_UUID16_MORE = const(0x2)
_ADV_TYPE_UUID32_MORE = const(0x4)
_ADV_TYPE_UUID128_MORE = const(0x6)
_ADV_TYPE_APPEARANCE = const(0x19)

def advertising_payload(limited_disc=False, br_edr=False, name=None, services=None, appearance=0):
    payload = bytearray()

    def _append(adv_type, value):
        nonlocal payload
        payload += struct.pack("BB", len(value) + 1, adv_type) + value

    _append(
        _ADV_TYPE_FLAGS,
        struct.pack("B", (0x01 if limited_disc else 0x02) + (0x18 if br_edr else 0x04)),
    )

    if name:
        _append(_ADV_TYPE_NAME, name)

    if services:
        for uuid in services:
            b = bytes(uuid)
            if len(b) == 2:
                _append(_ADV_TYPE_UUID16_COMPLETE, b)
            elif len(b) == 4:
                _append(_ADV_TYPE_UUID32_COMPLETE, b)
            elif len(b) == 16:
                _append(_ADV_TYPE_UUID128_COMPLETE, b)

    if appearance:
        _append(_ADV_TYPE_APPEARANCE, struct.pack("<h", appearance))

    return payload


def decode_field(payload, adv_type):
    i = 0
    result = []
    while i + 1 < len(payload):
        if payload[i + 1] == adv_type:
            result.append(payload[i + 2 : i + payload[i] + 1])
        i += 1 + payload[i]
    return result


def decode_name(payload):
    n = decode_field(payload, _ADV_TYPE_NAME)
    return str(n[0], "utf-8") if n else ""


def decode_services(payload):
    services = []
    for u in decode_field(payload, _ADV_TYPE_UUID16_COMPLETE):
        services.append(bluetooth.UUID(struct.unpack("<h", u)[0]))
    for u in decode_field(payload, _ADV_TYPE_UUID32_COMPLETE):
        services.append(bluetooth.UUID(struct.unpack("<d", u)[0]))
    for u in decode_field(payload, _ADV_TYPE_UUID128_COMPLETE):
        services.append(bluetooth.UUID(u))
    return services


def demo():
    payload = advertising_payload(
        name="micropython",
        services=[bluetooth.UUID(0x181A), bluetooth.UUID("6E400001-B5A3-F393-E0A9-E50E24DCCA9E")],
    )
    print(payload)
    print(decode_name(payload))
    print(decode_services(payload))


if __name__ == "__main__":
    demo()

Αποθηκεύστε αυτό το αρχείο στο Raspberry Pi Pico W ως "ble_advertising.py". Αυτό το αρχείο έχει σχεδιαστεί για να καταστήσει δυνατή την ανάγνωση του Pico W και την ανάγνωση από άλλες συσκευές.

Στη συνέχεια, ανοίξτε ένα νέο αρχείο στο Thonny και επικολλήστε τον ακόλουθο κώδικα:

# PiCockpit.com

import bluetooth
import random
import struct
import time
from machine import Pin
from ble_advertising import advertising_payload

from micropython import const

_IRQ_CENTRAL_CONNECT = const(1)
_IRQ_CENTRAL_DISCONNECT = const(2)
_IRQ_GATTS_WRITE = const(3)

_FLAG_READ = const(0x0002)
_FLAG_WRITE_NO_RESPONSE = const(0x0004)
_FLAG_WRITE = const(0x0008)
_FLAG_NOTIFY = const(0x0010)

_UART_UUID = bluetooth.UUID("6E400001-B5A3-F393-E0A9-E50E24DCCA9E")
_UART_TX = (
    bluetooth.UUID("6E400003-B5A3-F393-E0A9-E50E24DCCA9E"),
    _FLAG_READ | _FLAG_NOTIFY,
)
_UART_RX = (
    bluetooth.UUID("6E400002-B5A3-F393-E0A9-E50E24DCCA9E"),
    _FLAG_WRITE | _FLAG_WRITE_NO_RESPONSE,
)
_UART_SERVICE = (
    _UART_UUID,
    (_UART_TX, _UART_RX),
)


class BLESimplePeripheral:
    def __init__(self, ble, name="mpy-uart"):
        self._ble = ble
        self._ble.active(True)
        self._ble.irq(self._irq)
        ((self._handle_tx, self._handle_rx),) = self._ble.gatts_register_services((_UART_SERVICE,))
        self._connections = set()
        self._write_callback = None
        self._payload = advertising_payload(name=name, services=[_UART_UUID])
        self._advertise()

    def _irq(self, event, data):
        if event == _IRQ_CENTRAL_CONNECT:
            conn_handle, _, _ = data
            print("New connection", conn_handle)
            self._connections.add(conn_handle)
        elif event == _IRQ_CENTRAL_DISCONNECT:
            conn_handle, _, _ = data
            print("Disconnected", conn_handle)
            self._connections.remove(conn_handle)
            self._advertise()
        elif event == _IRQ_GATTS_WRITE:
            conn_handle, value_handle = data
            value = self._ble.gatts_read(value_handle)
            if value_handle == self._handle_rx and self._write_callback:
                self._write_callback(value)

    def send(self, data):
        for conn_handle in self._connections:
            self._ble.gatts_notify(conn_handle, self._handle_tx, data)

    def is_connected(self):
        return len(self._connections) > 0

    def _advertise(self, interval_us=500000):
        print("Starting advertising")
        self._ble.gap_advertise(interval_us, adv_data=self._payload)

    def on_write(self, callback):
        self._write_callback = callback


def demo():
    led_onboard = Pin("LED", Pin.OUT)
    ble = bluetooth.BLE()
    p = BLESimplePeripheral(ble)

    def on_rx(v):
        print("RX", v)

    p.on_write(on_rx)

    i = 0
    while True:
        if p.is_connected():
            led_onboard.on()
            for _ in range(3):
                data = str(i) + "_"
                print("TX", data)
                p.send(data)
                i += 1
        time.sleep_ms(100)


if __name__ == "__main__":
    demo()

Τώρα, όπως και πριν, αποθηκεύστε το αρχείο στο Pico W και αυτή τη φορά, μπορείτε να το ονομάσετε "led_peripheral.py". Ενώ το αρχείο διαφήμισης επιτρέπει στο Pico W να επικοινωνεί με άλλες συσκευές, το αρχείο περιφερειακών του επιτρέπει να συνάρτηση ως περιφερειακή συσκευή. Σε αυτή την περίπτωση, η λειτουργία αυτή θα είναι το άναμμα της λυχνίας LED.

Τώρα πατήστε "Εκτέλεση τρέχουσας δέσμης ενεργειών" στη γραμμή εργαλείων του Thonny.

Εικόνα του Pico W Bluetooth το Thonny IDE

Όπως μπορείτε να δείτε στην εικόνα, η κονσόλα θα βγάλει την ένδειξη "Starting advertising" (Εκκίνηση διαφήμισης). Σε αυτό το σημείο, μπορείτε να συνδεθείτε με μια συσκευή Bluetooth, όπως το τηλέφωνό σας. Βρείτε και πραγματοποιήστε ζεύξη με το "mpy-uart".

Εικόνα των συνδέσεων Bluetooth σε ένα τηλέφωνο Android

Μόλις ζευγαρώσετε τα δύο, η λυχνία LED του Pico W θα ανάψει και η κονσόλα Thonny θα αρχίσει να μετράει πόσο καιρό μετράνε τα δύο:

Εικόνα του Pico W Bluetooth το Thonny IDE

Συγχαρητήρια! Τώρα επιβεβαιώσατε ότι το Bluetooth του Pico W σας λειτουργεί και μπορείτε να επικεντρωθείτε στο επόμενο έργο σας!

Έργα Pico W Bluetooth

Όταν ξεκινάτε το επόμενο έργο σας στο Pico W, μπορείτε να ανατρέξετε σε μερικά από τα έργα που έχουν κάνει άλλοι. Δεδομένου ότι το Pico W μόλις έλαβε επίσημη υποστήριξη Bluetooth, νέα έργα μόλις άρχισαν να εμφανίζονται.

Ακολουθεί ένας (αυξανόμενος) κατάλογος με μερικά από τα έργα που έχουν εμφανιστεί μέχρι στιγμής:

  1. Pico W Bluetooth Τηλεχειριστήριο
  2. Pico W Bluetooth Ρομπότ
  3. Pico W Bluetooth Ποντίκι
  4. Pico W Bluetooth Φώτα
  5. Pico W USB σε Bluetooth Προσαρμογέας ήχου
  6. Pico W Bluetooth PicoDRO (ψηφιακή ένδειξη)

ΣΥΧΝΈΣ ΕΡΩΤΉΣΕΙΣ

Μπορώ να χρησιμοποιήσω το Bluetooth Classic με το Pico W;

Φυσικά, το Pico W υποστηρίζει Bluetooth Classic και BLE!

Μπορώ να συνδέσω ταυτόχρονα πολλές συσκευές στο Pico W;

Ναι, το Pico W μπορεί να λειτουργήσει ως κεντρική συσκευή και να συνδεθεί ταυτόχρονα με πολλά περιφερειακά Bluetooth. Μπορείτε επίσης να χρησιμοποιήσετε ταυτόχρονα το Bluetooth Classic και το BLE. Έτσι, μπορείτε να δημιουργήσετε εξαιρετικά σύνθετα συστήματα όπου το Pico W επικοινωνεί με ένα σωρό αισθητήρες ή ελέγχει πολλές συσκευές ταυτόχρονα.

Ποια είναι η εμβέλεια Bluetooth του Pico W;

Συνήθως μέχρι 30 μέτρα (98 πόδια) σε ανοιχτό χώρο. Ωστόσο, η εμβέλεια μπορεί να διαφέρει ανάλογα με περιβαλλοντικούς παράγοντες όπως εμπόδια, παρεμβολές και ισχύς σήματος.

Μπορώ να χρησιμοποιήσω το Pico W ως περιφερειακή συσκευή Bluetooth;

Το Pico W μπορεί να λειτουργήσει ως κεντρική ή περιφερειακή συσκευή. Έτσι, επιτρέπει σε άλλες κεντρικές συσκευές Bluetooth (όπως smartphones, tablet ή υπολογιστές) να συνδεθούν σε αυτό. Όλα αυτά λειτουργούν θαυμάσια με PiCockpit, παρεμπιπτόντως!

Πώς μπορώ να προγραμματίσω τη λειτουργία Bluetooth στο Pico W;

Μπορείτε να προγραμματίσετε τη λειτουργία Bluetooth στο Pico W χρησιμοποιώντας το Raspberry Pi Pico SDK έκδοση 1.5.1. Το SDK παρέχει βιβλιοθήκες και παραδείγματα ειδικά για την ανάπτυξη Bluetooth. Σας επιτρέπει να υλοποιείτε υπηρεσίες Bluetooth, χαρακτηριστικά και να χειρίζεστε πρωτόκολλα επικοινωνίας.

Ποιες είναι οι απαιτήσεις ισχύος για το Bluetooth στο Pico W;

Το Bluetooth έχει σχεδιαστεί για να είναι αποδοτικό στην κατανάλωση ενέργειας. Έτσι, το Pico W καταναλώνει ελάχιστη ενέργεια κατά τη διάρκεια περιόδων αδράνειας και μπορείτε να βελτιστοποιήσετε περαιτέρω τον κώδικά σας χρησιμοποιώντας τεχνικές όπως λειτουργίες αναστολής λειτουργίας και καταστάσεις χαμηλής κατανάλωσης ενέργειας. Οι συγκεκριμένες απαιτήσεις ισχύος εξαρτώνται προφανώς από την εφαρμογή και το σενάριο χρήσης.

11 Σχόλια

  1. Marcos Gutierrez στις Αύγουστος 4, 2023 στις 1:13 πμ

    Hola puedo adaptar la pico w a scoppy osciloscopy.agrdeceria su respuesta y como lo haria

  2. Electronikmx στις Αύγουστος 17, 2023 στις 12:16 πμ

    Después de unos segundos el dispositivo indica un error y se desconecta al querer vincularlo

    • Adam στις Αύγουστος 17, 2023 στις 6:51 πμ

      Ώρα;

      • Electronikmx στις Αύγουστος 17, 2023 στις 4:19 μμ

        Como comentaba, al momento de darle en el móvil a "vincular" en solicitud de enlace por medio de bluetooth observo que sí, RPI pico W envía una serie de números propios del programa en la tarjeta "TX 1_, TX 2_ ..." , sin embargo después de varios segundos el celular o tablet (lo intenté con 3 dispositivos) me indica que hubo un error al intentar vincular y se desconecta el bluetooth del móvil aparece el mensaje "Disconected 64", y bajo esa línea nuevamente aparece "Starting advertising" y tengo que darle en conectar de nuevo.

        • Javier στις Οκτώβριος 5, 2023 στις 11:08 μμ

          Me pasa lo mismo

  3. Alex στις Οκτώβριος 2, 2023 στις 8:00 πμ

    Μπορείτε να έχετε μια σύνδεση wifi ανοιχτή ταυτόχρονα με μια σύνδεση bluetooth στο pi pico W; Εάν όχι, μπορείτε να κάνετε εναλλαγή μεταξύ τους σε πραγματικό χρόνο;

  4. Javier στις Οκτώβριος 5, 2023 στις 11:10 μμ

    Me pasa lo mismo.... ya lo intenté de varios dispositivos y aplicaciones. No funcionó.

  5. Peter στις Νοέμβριος 12, 2023 στις 11:33 πμ

    Πώς να ρυθμίσετε τον ελεγκτή kitronik mini Pico για να συνδεθεί και να ελέγξει τη ρομποτική πλακέτα kitronik Pico;

  6. Brian στις Νοέμβριος 27, 2023 στις 12:27 πμ

    Γεια σας. Ακολούθησα τις οδηγίες σας, αλλά δεν μπορώ να βρω το mpy-uart στο iPhone μου στην ενότητα Bluetooth.

    Έχω ένα Pico W συνδεδεμένο μέσω USB στον υπολογιστή μου.
    Έκανα flashed το UF2 σας
    Αντέγραψα τον κώδικά σας και αποθήκευσα τα αρχεία όπως ονομάστηκαν στο pico W μέσω του Thonny
    Τρέχω Thonny και η κάτω δεξιά γωνία είναι το εργοστάσιο που ονομάζεται MicroPython (Raspberry Pi Pico) {στίγμα. όπως υπάρχει αιωρούμενη τελεία} Πίνακας CDC @ COM3
    Τρέχω το led_peripheral.py
    Η Shell βγάζει το μήνυμα "Starting advertising" (Ξεκινώντας τη διαφήμιση)
    Δεν το βλέπω στο iPhone

    Καμία σκέψη;

    Ευχαριστώ για τη συμβολή σας στον σκοπό αυτό.

    • Anant στις Μάρτιος 19, 2024 στις 2:31 μμ

      Γεια σας, αντιμετωπίζω το ίδιο ζήτημα εδώ. Καταφέρατε να το λύσετε;

  7. Paul B. στις Φεβρουάριος 22, 2024 στις 3:04 μμ

    Αντί για σύνδεση BT με ένα τηλέφωνο, έχω μια μονάδα GPS Arduino η οποία μεταδίδει τις συντεταγμένες της μέσω Bluetooth, υπάρχει τρόπος να συνδεθώ και να διαβάσω αυτό το σήμα με ένα Pico W?

Αφήστε ένα σχόλιο