Trimiterea semnalului de la un senzor hall conectat la ESP32 către RaspberryPi 4 pe SPI
În acest mic proiect urmăresc transmiterea semnalului de la un senzor Hall către un Raspberry Pi 4,
utilizând o conexiune SPI cu un microcontroler ESP32. Descoperiți tehnologia din spatele senzorului Hall și modul în care acesta poate detecta câmpurile magnetice, apoi învățați cum să implementați o
conexiune Serial Peripheral Interface (SPI) între ESP32 și Raspberry Pi 4 pentru a transfera eficient datele măsurate. Acest ghid practic vă oferă informații esențiale și pași detaliați pentru a realiza o integrare robustă și precisă între dispozitivele dumneavoastră, deschizând astfel poarta către aplicații diverse, de la monitorizarea mediului înconjurător la proiecte IoT inovatoare.
Comunicația SPI – Serial Peripheral Interface
Comunicarea prin SPI (Serial Peripheral Interface) între un ESP32 și un Raspberry Pi 4 implică utilizarea a trei linii principale: MISO (Master In Slave Out), MOSI (Master Out Slave In), și SCK (Serial Clock). În plus, este posibil să fie nevoie de o linie suplimentară numită SS (Slave Select) sau CS (Chip Select), care indică la dispozitivul slave că trebuie să asculte datele transmise de master.
Despre comunicația SPI am mai discutat și în următoarele articole:
- https://blog.automatic-house.ro/2023/09/16/mini-proiect-51-comunicatia-pe-spi-dintre-arduino-uno-si-groundstudio-jade-nano/
- https://blog.automatic-house.ro/2023/09/26/mini-proiect-52-comunicatia-spi-intre-doua-placi-esp32-trimiterea-valorii-de-la-potentiometru/
Conectarea Hardware între RaspberryPi4 și ESP32
Iată pașii generali pentru a realiza comunicarea SPI între un ESP32 și un Raspberry Pi 4:
- Asigurați-vă că ambele dispozitive au SPI activat. Pe Raspberry Pi, acest lucru se poate face din
raspi-config
.
- Conectați MISO la MISO, MOSI la MOSI, SCK la SCK, și, dacă este necesar, SS/CS la linia corespunzătoare pe ambele dispozitive.
- Asigurați-vă că ambele dispozitive au aceeași referință de tensiune (de exemplu în acest caz avem 3.3V pentru fiecare dispozitiv, pentru că ambele dispozitive operează la această tensiune).
- Placa ESP32 am conectat-o pe unul din USB-urile de la RaspberryPi4 care asigura aceeasi tensiune de referinta si același GND
Senzorul Hall
Componente
- Placa Raspberry Pi 4 Model B – 2GB
- Carcasa Neximus® pentru Raspberry Pi 4 model B din aluminiu, racire pasiva, RPI 4B
- ESP32 Wireless WiFi Bluetooth Dual Core CP2104 – 38 pini
- ESP32 WiFi Bluetooth Development Board, Micro USB, Dual Core, 30 pini
- Senzor magnetic Linear Hall
- KY-024 Linear Magnetic Hall Switches Speed Counting Sensor Module
- Kit Start Componente Electronice
Configurarea și compilarea pentru RaspberryPi
Pentru a citi datele de pe interfata SPI folosind C++ pe Raspberry Pi 4, vei avea nevoie de o bibliotecă care să ofere suport pentru comunicarea SPI. O bibliotecă frecvent utilizată pentru această sarcină este “WiringPi“. Eu am căutat această librărie, am descărcat-o și am referențiat-o direct în aplicație (vezi în makefile mai jos).
Apoi pentru instalarea librăriei ncurse, care se utilizează în aplicație se utilizează următoarea comandă:
sudo apt-get install libncurses5-dev libncursesw5-dev
Fisierul makefile care ne ajută să compilăm mai ușor conține următoarele configurări:
#
# Cross Platform Makefile
# Compatible with MSYS2/MINGW, Ubuntu 14.04.1 and Mac OS X
#
# You will need GLFW (http://www.glfw.org):
# Linux:
# apt-get install libglfw-dev
# Mac OS X:
# brew install glfw
# MSYS2:
# pacman -S --noconfirm --needed mingw-w64-x86_64-toolchain mingw-w64-x86_64-glfw
#
#CXX = g++
#CXX = clang++
EXE = spi_test
APP_DIR = ../
SOURCES = main.cpp
SOURCES += $(APP_DIR)/WiringPi/wiringPi.c $(APP_DIR)/WiringPi/wiringPiSPI.c $(APP_DIR)/WiringPi/piThread.c $(APP_DIR)/WiringPi/softTone.c $(APP_DIR)/WiringPi/softPwm.c $(APP_DIR)/WiringPi/piHiPri.c
SOURCES += $(APP_DIR)/spidevlib/spidev_lib.c
OBJS = $(addsuffix .o, $(basename $(notdir $(SOURCES))))
UNAME_S := $(shell uname -s)
CXXFLAGS = -std=c++11 -I$(APP_DIR)/WiringPi -I$(APP_DIR)/spidevlib
CXXFLAGS += -g -Wall -Wformat
LIBS = -lpthread -lm -lcrypt -lrt -lncurses
##---------------------------------------------------------------------
## BUILD FLAGS PER PLATFORM
##---------------------------------------------------------------------
ifeq ($(UNAME_S), Linux) #LINUX
ECHO_MESSAGE = "Linux"
LIBS += -lGL `pkg-config --static --libs glfw3`
CXXFLAGS += `pkg-config --cflags glfw3`
CFLAGS = $(CXXFLAGS)
endif
##---------------------------------------------------------------------
## BUILD RULES
##---------------------------------------------------------------------
%.o:%.cpp
$(CXX) $(CXXFLAGS) -c -o $@$<
%.o:$(IMGUI_DIR)/WiringPi/%.c
$(CXX) $(CXXFLAGS) -c -o $@$<
%.o:$(IMGUI_DIR)/spidevlib/%.c
$(CXX) $(CXXFLAGS) -c -o $@$<
all: $(EXE)
@echo Build complete for $(ECHO_MESSAGE)
$(EXE): $(OBJS)
$(CXX) -o $@ $^ $(CXXFLAGS) $(LIBS)
clean: rm -f $(EXE) $(OBJS)
După lansarea compilării se vor genera fișierele obiect “*.o”, iar apoi se vor link edita și va rezulta un executabil spi_test.
florins@raspberrypi:~/imgui_demo_gl2/src2 $ make
g++ -std=c++11 -I..//WiringPi -I..//spidevlib -g -Wall -Wformat `pkg-config --cflags glfw3` -c -o main.o main.cpp
g++ -std=c++11 -I..//WiringPi -I..//spidevlib -g -Wall -Wformat `pkg-config --cflags glfw3` -c -o wiringPi.o ..//WiringPi/wiringPi.c
g++ -std=c++11 -I..//WiringPi -I..//spidevlib -g -Wall -Wformat `pkg-config --cflags glfw3` -c -o wiringPiSPI.o ..//WiringPi/wiringPiSPI.c
g++ -std=c++11 -I..//WiringPi -I..//spidevlib -g -Wall -Wformat `pkg-config --cflags glfw3` -c -o piThread.o ..//WiringPi/piThread.c
g++ -std=c++11 -I..//WiringPi -I..//spidevlib -g -Wall -Wformat `pkg-config --cflags glfw3` -c -o softTone.o ..//WiringPi/softTone.c
g++ -std=c++11 -I..//WiringPi -I..//spidevlib -g -Wall -Wformat `pkg-config --cflags glfw3` -c -o softPwm.o ..//WiringPi/softPwm.c
g++ -std=c++11 -I..//WiringPi -I..//spidevlib -g -Wall -Wformat `pkg-config --cflags glfw3` -c -o piHiPri.o ..//WiringPi/piHiPri.c
g++ -std=c++11 -I..//WiringPi -I..//spidevlib -g -Wall -Wformat `pkg-config --cflags glfw3` -c -o spidev_lib.o ..//spidevlib/spidev_lib.c
g++ -o spi_test main.o wiringPi.o wiringPiSPI.o piThread.o softTone.o softPwm.o piHiPri.o spidev_lib.o -std=c++11 -I..//WiringPi -I..//spidevlib -g -Wall -Wformat `pkg-config --cflags glfw3` -lpthread -lm -lcrypt -lrt -lncurses -lGL `pkg-config --static --libs glfw3`
Build complete for Linux
Pentru rularea aplicației se execută comanda:
florins@raspberrypi:~/imgui_demo_gl2/src2 $ ./spi_test
Configurarea și compilarea pentru ESP32
Cod de test pentru RaspberryPi4
Codul de test pentru ESP32
Documentație proiect
- https://medium.com/codex/how-to-install-a-fan-onto-a-raspberry-pi-and-make-it-run-dynamically-4ff0e59985fc
- https://randomnerdtutorials.com/raspberry-pi-pinout-gpios/
- https://www.theengineeringprojects.com/2021/03/what-is-raspberry-pi-4-pinout-specs-projects-datasheet.html
Afiliere eMag
Linkurile de la secțiunea “Componente” conțin adresa mea de afiliere la eMag.ro, iar dacă cumperi folosind aceste linkuri vei susține blogul meu. Mulțumesc!
eMag Genius:
Hai și tu în Genius! Abonează-te la Genius 12 luni și primești beneficii premium și 20 lei card cadou eMAG. Profită acum! eMag Genius
Mulțumesc pentru atenție!
Pentru întrebări și/sau consultanță tehnică vă stau la dispoziție pe blog mai jos în secțiunea de comentarii sau pe email simedruflorin@automatic-house.ro.
O zi plăcută tuturor !