PSoC 6 Pioneer Board mit IoT Add-On Shield meistern: Entwickler-Leitfaden
Einführung
Der PSoC 6 ist die neueste Ergänzung der leistungsstarken PSoC-Serie von Cypress. Das PSoC 6 Pioneer IoT Add-On Shield ist das zugehörige Entwicklungstool für diese Prozessorlinie, mit Onboard-Debugger, Arduino-kompatiblen Headern, CapSense-Widgets und mehr – alles angebunden an einen PSoC 6 Prozessor. Der Prozessor ist ein Dual-Core-Gerät mit einem Cortex-M0+ Low-Power-Prozessor und einem Cortex-M4 High-Performance-Prozessor, verbunden über gemeinsame Peripherie und Speicherbereich.
Dieses Tutorial zeigt, wie Sie mit dem Pioneer Board und dem Pioneer Add-on Shield die Fähigkeiten des PSoC 6 Geräts erweitern. Wir demonstrieren Kommunikation mit einem Raspberry Pi via BLE und WiFi (mit XBee WiFi Modul) sowie Kommunikation zwischen einem PSoC 4 BLE Pioneer Board und dem PSoC 6 Pioneer Board via BLE.
Benötigte Materialien
Die Beispiele in diesem Tutorial sind für das PSoC 6 Pioneer Kit gedacht, erhältlich direkt von Cypress oder Digi-Key.
Zusätzlich benötigen Sie ein Pioneer Add-on Shield und ein XBee WiFi Modul. Es gibt verschiedene XBee WiFi Optionen je nach Setup: Trace, RP-SMA Connector mit externer 2,4 GHz Antenne oder Wire. Am einfachsten ist XBee mit Drahtantenne.
Sie benötigen auch das Raspberry Pi 3 Starter Kit. Dies wird Ihr Kommunikationsziel vom PSoC 6 Pioneer Board. Natürlich können Sie auch nur den Pi 3 separat mit Breadboard, Jumper-Wires, Widerständen und LEDs kaufen, aber wir finden das Starter Kit ein exzellentes Angebot und sehr empfehlenswert.
Hardware-Übersicht
Lassen Sie uns die Features des Pioneer Kit IoT Add-on Boards im Detail betrachten.
- MicroSD-Kartenslot – Pins mappen auf SPI-Peripherie der meisten Arduino-kompatiblen Boards, inkl. PSoC 6 BLE Pioneer Board.
- XBee Header – Standard XBee Footprint, kompatibel mit allen offiziellen XBee Modulen.
- Qwiic Connector – Unterstützt alle SparkFun Qwiic Module. Liefert 3,3 V.
- MicroB USB Stromanschluss – Datenleitungen nicht verbunden. Liefert 5 V an 3,3 V Regler für XBee Modul, übersteuert 5 V vom Arduino Header und ermöglicht High-Power XBee Module (Cellular, WiFi, Pro) korrekt zu betreiben.
- D7 und D9 Buttons – Zwei Benutzer-Buttons an Pins D7 und D9 (P0.2 und P13.1 am PSoC 6, bzw. P1.0 und P0.4 am PSoC 4 BLE).
- 3,3 V Regler – Schaltregler bis 1,5 A, abhängig von Upstream-Versorgung. Bezieht Strom von 5 V an Arduino Pins oder MicroB Anschluss. Versorgt nur XBee Header.
- Level Shift Buffer – Wandelt 5 V Signale auf 3,3 V. Ermöglicht Betrieb in 3,3 V oder 5 V Systemen.
- I2C Level Shift Schaltung – Wandelt I2C Signale von 3,3 V auf 5 V falls nötig.
- Voltage Supply Selection Jumper – Wählt Pegel für I2C Level Shift. Standard 3,3 V. Auf 5 V für 5 V Systeme setzen. Beide PSoC 4 und PSoC 6 Pioneer BLE Boards sind 3,3 V Systeme.
- XBee DIO5 LED – DIO5 hat nützliche Default-Funktionen, besonders am WiFi Modul, wo es Konnektivität zum konfigurierten WiFi-Netzwerk anzeigt.
Beispiel: WiFi zum Raspberry Pi mit PSoC 6 Pioneer Kit
Dieses Beispiel demonstriert, wie man ein Signal via WiFi an einen Raspberry Pi sendet. Es zeigt Zugriff auf XBee WiFi Modul, Interprozess-Kommunikation zwischen den zwei Kernen des PSoC 6, und Empfang/Parsing von Befehlen mit einem Raspberry Pi.
Für dieses Beispiel ist Setup nötig, also gehen wir das jetzt durch.
PSoC 6 Pioneer Kit Setup: Hardware
Pioneer Kit Seite ist trivial: XBee WiFi Modul in Pioneer IoT Add-on Shield stecken und Shield in Arduino Header des Pioneer Kit Boards.
Raspberry Pi Seite erfordert mehr Erklärung. Sie müssen Hardware und Software auf dem Raspberry Pi einrichten.
PSoC 6 Pioneer Kit Setup: Software
Hinweis: PSoC 6 Support nur in Creator 4.2 oder später!
Software-Projekt für Pioneer Kit auf GitHub verfügbar.
PSOC 6 PIONEER KIT SOFTWARE DOWNLOAD
Nach Download und Entpacken können Sie das Beispiel (XBee_WiFi_Example) in PSoC Creator öffnen.
Zuerst die Datei „main_cm4.c“ öffnen und ein paar Änderungen vornehmen. Sie finden einen Code-Bereich wie folgt:
char ssid[] = "your_ssid_here";
char rpi_ip[] = "raspi_ip_here";
char ssid_pw[] = "wifi_pw_here";
int dest_port = 5000;
char encrypt_mode = WPA2;
Offensichtlich müssen Sie diese Einstellungen an Ihr Netzwerk anpassen. encrypt_mode kann WPA, WEP, WPA2 oder (hoffentlich nicht!) NO_SECURITY sein. rpi_ip ist ein dotted quad (z. B. „10.8.253.193“), den Sie durch Eingabe von ifconfig in einem Kommando-Fenster auf Ihrem Raspberry Pi erhalten (siehe unten für Anleitung zum Öffnen) und im wlan0 Bereich suchen.
Zum Programmieren das Board via mitgeliefertem USB-A auf USB-C Kabel mit PC verbinden. Dann „Program“ Button in der Toolbar klicken (wie unten gezeigt), um Projekt automatisch zu bauen und Board zu programmieren.
Eventuell erscheint ein Fenster zur Target-Auswahl. Unter „KitProg2“ ist der Eintrag egal, beide programmieren den Flash korrekt.
Raspberry Pi Setup: Hardware
Zuerst schauen wir uns die Hardware-Verbindung an:
Wie Sie sehen, haben wir eine LED (mit 330 Ohm Widerstand) an Pins 3 (GPIO 2) und 6 (Ground) des Raspberry Pi angeschlossen. Dies erlaubt GPIO2 zu toggeln und das Ergebnis an der LED zu sehen.
Raspberry Pi Setup: Software
Wir setzen ein Raspberry Pi mit neuester Raspbian-Version (Full Install, nicht Lite) voraus, verbunden mit Tastatur, Maus, Monitor und lokalem WLAN. Falls nicht der Fall, bitte kurz einrichten. Unser Tutorial zum Pi-Setup können Sie hier nachlesen.
Starten wir vom Raspberry Pi Desktop. Sie sollten einen Screen sehen wie:
Klicken Sie auf das kleine Logo oben am Bildschirm (wie unten gezeigt), um eine Kommandozeile zu öffnen. Der Rest des Tutorials setzt voraus, dass Sie diese offen haben.
Das öffnet ein Kommandozeilen-Fenster. Damit können Sie dem Raspberry Pi direkte Befehle erteilen.
Zuerst Flask installieren. Flask ist ein Python Web-Framework, das trivial ein Web-Frontend ermöglicht, das Python-Skripte im Backend ausführt. Folgenden Befehl eingeben und Enter drücken:
sudo pip install flask
Viel Text erscheint, am Ende ist Flask installiert.
Nächster Schritt: Unsere Projekt-Software von GitHub installieren:
git clone https://github.com/sparkfun/Flask_Tutorial
Wieder Text scrollen, bei Prompt-Rückkehr ist Installation fertig. Dann:
sudo python Flask_Tutorial/Python/app.py
Das startet die App und lauscht auf TCP/IP-Eingaben vom Pioneer Board. Sie können nun die LED am Raspberry Pi durch Drücken der D7 und D9 Buttons am IoT Shield ein- und ausschalten. Nice!
Was passiert hier? Teil 1: Das Pioneer Kit
Schauen wir uns an, was genau passiert, beginnend mit einer Hochlevel-Ansicht des PSoC 6 Software-Projekts. Sehen Sie den Workspace Explorer Frame links. Wir gehen ihn durch, markieren wichtige Dateien und deren Bezug zum Gesamtprojekt.
Schwer zu sehen? Bild anklicken für Detailansicht.
Top-Level des Projekts hat sechs Einträge: Schaltplan („TopDesign.sch“), Design Wide Resources („XBee_WiFi_Example.cydwr“), Source Files für Cortex-M0+ Core („CM0p (Core 0)“), Source Files für Cortex-M4 Core („CM4 (Core 1)“), Shared Files („Shared Files“), und IDE-generierte Support Files („Generated_Source“).
Der Schaltplan ist sehr einfach: paar LEDs, paar Switches, UART für Datentransfer zu/from XBee WiFi Modul. LEDs sind in aktueller Implementierung ungenutzt.
Den Inhalt der .cydwr Datei überspringen wir. Sie enthält Pin-Zuordnungen, Clock-Generierung, Core-Konfigurationskonstanten. Falls Interesse, gerne reinschauen – vieles selbsterklärend.
Weiter unten erreichen wir die Cortex-M0+ Source Files. Top-Level hat fünf Einträge: „Header Files“, „Source Files“, und drei weitere Dateien. Wir brauchen nur „Header Files“ und „Source Files“, und dort nur eine Datei: „main_cm0p.c“. Hier liegt die main()-Funktion für den Code auf dem Cortex-M0+ Prozessor.
Wie Sie aus der Workspace-Struktur vermuten, laufen zwei völlig getrennte Codebasen für die zwei Kerne. „main_cm0p.c“ ist Einstiegspunkt für Cortex-M0+ Code, der dann den Cortex-M4 Core startet. Ähnliche Subdomain für Cortex-M4 mit ähnlichen Dateien, wieder nur „Header Files“ und „Source Files“ relevant.
Schließlich „Shared Files“ Sektion. Meist auto-generiert, außer „ipc_common.c“ und „ipc_common.h“ – Helfer für Interprozess-Kommunikation, entwickelt für dieses Projekt.
Die Cortex-M0+ Main Datei
Nun die wichtigen Code-Bits, Datei für Datei, beginnend mit „main_cm0p.c“. Diese Datei handhabt alle Aktivitäten des Cortex-M0+ Kerns: Überwachung der zwei Pushbuttons und Senden eines Signals an Cortex-M4 beim Drücken.
Nicht ganz so einfach, da Cortex-M4 das Signal nach Bearbeitung löschen muss – also mehrere Prozesse auf gleichen Daten. Bei mehreren Prozessen auf gleichem Datensatz müssen Schreibkollisionen bedacht werden. Was passiert, wenn ein Prozess Daten ändert, während der andere sie ändert? Damit umzugehen nutzen wir systemgeschützte Reads/Writes, eingerichtet in den „ipc_common“ Dateien.
Um dies zu verstehen, muss man das Konzept eines IPC-Channels verstehen. IPC-Channels nutzen Semaphoren, um Daten von einem Prozess zum anderen zu schreiben, garantiert ohne Kollision zwischen den Kernen. Zu Beginn der Applikation für jeden Core müssen Endpunkte für IPC-Channels etabliert werden. Betrachten Sie diese zwei Zeilen:
IPC_STRUCT_Type *D9IpcHandle;
D9IpcHandle = Cy_IPC_Drv_GetIpcBaseAddress(7);
Die erste erstellt einen Pointer für ein Struct, das Eigenschaften eines IPC-Channels definiert. Die zweite setzt das Struct auf eine spezifische Speicheradresse: System IPC Channel 7. Wir nutzen Channel 7, da Channels 0-6 für System reserviert sind.
Als Nächstes müssen wir dem anderen Core mitteilen, welche Speicheradresse mit diesem IPC Channel assoziiert ist. Das macht dieser Funktionsaufruf:
while(Cy_IPC_Drv_SendMsgPtr(D9IpcHandle, CY_IPC_NO_NOTIFICATION, &D9Button) != CY_IPC_DRV_SUCCESS);
D9Button ist eine früher im Code definierte Variable. Der Funktionsaufruf ist in einer while()-Schleife, weil wir wiederholen wollen, bis wir Verifikation erhalten, dass der andere Prozess (Code auf Cortex-M4) die Info erhalten hat. Wir warten auch, bis der Lock auf der Variable freigegeben ist, was anzeigt, dass Cortex-M4 das Lesen des Pointer-Werts beendet hat.
while(Cy_IPC_Drv_IsLockAcquired(D9IpcHandle));
Schließlich fallen wir in unsere Endlosschleife für die Applikation, wo die benutzerdefinierten Funktionen ReadSharedVar() und WriteSharedVar() das Aktualisieren der geteilten Variablen handhaben, die Button-Status mit dem anderen Core kommunizieren. Wir schauen uns diese Funktionen später an.
Die Cortex-M4 Main Datei
In der Cortex-M4 main() Funktion wiederholen wir einige Operationen aus der Cortex-M0+ main() bzgl. IPC Channel Setup.
IPC_STRUCT_Type *D9IpcHandle;
D9IpcHandle = Cy_IPC_Drv_GetIpcBaseAddress(7);
Dann Code aufrufen, um die Nachricht vom Cortex-M0+ Prozess zu „fangen“, die die Adresse der geteilten Variable enthält.
while (Cy_IPC_Drv_ReadMsgPtr(D9IpcHandle, (void *)&D9Button) != CY_IPC_DRV_SUCCESS);
Wieder in while()-Schleife, damit kontinuierlich aufgerufen wird, bis Nachricht vom Cortex-M0+ gesendet. Dann Lock auf IPC Channel freigeben, damit Cortex-M0+ Prozess weiß, dass es weiterarbeiten und IPC Channel zukünftig nutzen kann. Keine while()-Schleife nötig, da offen: Aufruf muss nur einmal issued werden zum Lock-Release, versus Prüfen ob Lock released, was wiederholt werden muss bis Lock freigegeben.
Cy_IPC_Drv_LockRelease(D9IpcHandle, CY_IPC_NO_NOTIFICATION);
Nach Abschluss XBee WiFi Shield für lokales Netzwerk einrichten. Code hier nicht duplizieren, da im Beispiel gut dokumentiert.
In der Endlosschleife für Applikationscode wieder benutzerdefinierte Funktionen ReadSharedVar() und WriteSharedVar() aufrufen für Variablen mit Button-Status, geteilt mit Cortex-M0+ Core. Schauen wir genauer hin, was diese Funktionen tun.
Read More Info……
Using the PSoC 6 Pioneer Board with the Pioneer IoT Add-on Shield
Herstellungsprozess
- Wetterstation mit CWOP integrieren: Praktischer Leitfaden
- Acconeer A111 Pulsradar mit Raspberry Pi integrieren: Praktischer Leitfaden
- Einstieg in IoT und MQTT: Code-freies ESP8266 Tutorial
- Intelligenten Roboter mit Bridge Shield bauen – Raspberry Pi & Arduino Integration
- GoPiGo v2 auf Windows 10 IoT Core für Raspberry Pi 3 erweitern
- Die Kraft visueller Daten im IoT-Ökosystem entfesseln
- IoT revolutioniert Field Service: Predictive Maintenance & höherer ROI
- Wie Smart Cities IoT, Microservices und Dashboards für effizientes Asset Management nutzen
- IoT World: Inside Verticas Big-Data-Lösung für IoT-Analytics
- Hitanchis Lumada IoT Plattform: Industrielle Insights für Smart Manufacturing vereinen