Files
lighting-controller/test
Pi User e4a83e8f0d Add segmented_movement pattern with n4 parameter support
- Add n4 parameter to control server, LED bar receiver, and test script
- Create segmented_movement pattern with alternating forward/backward movement
- Pattern supports n1 (segment length), n2 (spacing), n3 (forward speed), n4 (backward speed)
- Fix test script to send all messages instead of just the first one
- Add segmented_movement to patterns_needing_params for proper parameter transmission
- Pattern intelligently handles all cases: alternating, forward-only, backward-only, or static
- Implements repeating segments with configurable spacing across LED strip
2025-10-03 19:54:43 +13:00
..

SPI Master Test for ESP32-C3

This directory contains test scripts to verify SPI communication between a Raspberry Pi (SPI master) and the ESP32-C3 (SPI slave).

Quick Start

  1. Setup: ./setup_spi.sh
  2. Send JSON: pipenv run send-json --beat --brightness 128 --pattern wave

Hardware Connections

Raspberry Pi GPIO Configuration

  • SCK: GPIO11 (Physical pin 23)
  • MISO: GPIO9 (Physical pin 21)
  • MOSI: GPIO10 (Physical pin 19)
  • CS: GPIO8 (Physical pin 24)

ESP32-C3 GPIO Configuration

  • SCK: GPIO20
  • MISO: GPIO9
  • MOSI: GPIO10
  • CS: GPIO7

Setup

  1. Enable SPI on Raspberry Pi:

    ./setup_spi.sh
    
  2. Flash ESP32-C3 with SPI slave firmware:

    cd ../esp32
    . $HOME/esp/esp-idf/export.sh
    idf.py -p /dev/ttyUSB0 flash monitor
    
  3. Connect the hardware:

    • Connect Raspberry Pi GPIO11 to ESP32-C3 GPIO20 (SCK)
    • Connect Raspberry Pi GPIO9 to ESP32-C3 GPIO9 (MISO)
    • Connect Raspberry Pi GPIO10 to ESP32-C3 GPIO10 (MOSI)
    • Connect Raspberry Pi GPIO8 to ESP32-C3 GPIO7 (CS)
    • Connect GND between both devices

Running Tests

Send JSON

To send your control JSON so the ESP32-C3 can json.loads it on the receiving side:

# Using pipenv script
pipenv run send-json --beat --brightness 128 --pattern wave

# Or directly
pipenv run python test/send_json.py --data '{"d":{"t":"b","br":128},"bar":{"pt":"off"}}'

Or programmatically:

from test.spi_master_test import SPIMasterTest

spi = SPIMasterTest()
payload = {
    "d": {"t": "b", "br": 128, "dl": 20},
    "bar": {"pt": "off"}
}
spi.send_json(payload)
spi.cleanup()

Keep payloads under ~190 bytes to fit in the ESP-NOW payload.

Individual Test Functions

The test script includes several test functions:

  1. Basic Communication Test

    • Single byte transmission
    • Multiple byte transmission
    • Longer message transmission
  2. Data Pattern Tests

    • All zeros
    • All ones
    • Alternating patterns
    • Incrementing/decrementing patterns
  3. Random Data Tests

    • Random data of varying lengths
    • Multiple random tests
  4. ESP-NOW Trigger Test

    • Sends recognizable patterns
    • Should trigger ESP-NOW broadcast on ESP32-C3
    • Verifies response patterns
  5. Stress Test

    • Continuous communication
    • Performance measurement
    • Transaction rate calculation

Expected Behavior

ESP32-C3 Response

The ESP32-C3 SPI slave should:

  1. Receive data on MOSI (GPIO10)
  2. Log received data to serial console
  3. Broadcast received data via ESP-NOW
  4. Send back a test pattern (0x00, 0x01, 0x02, ...)

Serial Monitor Output

When running the ESP32-C3, you should see output like:

I (1234) SPI_SLAVE: Starting SPI Slave with ESP-NOW example
I (1235) SPI_SLAVE: ESP-NOW initialized successfully
I (1236) SPI_SLAVE: SPI Slave initialized successfully
I (1237) SPI_SLAVE: MOSI: GPIO10, MISO: GPIO9, SCLK: GPIO20, CS: GPIO7
I (1238) SPI_SLAVE: Received 5 bytes:
0x48 0x65 0x6c 0x6c 0x6f 
I (1239) SPI_SLAVE: Broadcasting 5 bytes via ESP-NOW
I (1240) SPI_SLAVE: ESP-NOW send status: SUCCESS

Troubleshooting

Common Issues

  1. SPI device not found:

    ls -la /dev/spi*
    # Should show /dev/spidev0.0 and /dev/spidev0.1
    
  2. Permission denied:

    sudo usermod -a -G spi $USER
    # Log out and back in
    
  3. No response from ESP32-C3:

    • Check wiring connections
    • Verify ESP32-C3 is running SPI slave firmware
    • Check serial monitor for ESP32-C3 output
  4. ESP-NOW not working:

    • Ensure ESP32-C3 has WiFi/ESP-NOW initialized
    • Check for other ESP32-C3 devices to receive broadcasts
    • Monitor serial output for ESP-NOW status

Debug Mode

Enable debug output by modifying the test script:

# Add debug prints
print(f"SPI Mode: {spi_test.spi.mode}")
print(f"SPI Speed: {spi_test.spi.max_speed_hz}")
print(f"SPI Bits per word: {spi_test.spi.bits_per_word}")

Performance Notes

  • SPI Speed: Default 1MHz, can be increased for faster communication
  • Transaction Rate: Typically 100-1000 transactions/second depending on data size
  • ESP-NOW Broadcast: Adds ~1-2ms delay per transaction
  • Buffer Size: ESP32-C3 supports up to 256 bytes per transaction

Files

  • send_json.py - Main script - Send JSON over SPI to ESP32-C3
  • quick_test.py - Quick basic functionality test
  • spi_master_test.py - Comprehensive test suite
  • setup_spi.sh - Setup script for Raspberry Pi
  • requirements.txt - Python dependencies
  • README.md - This documentation