Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

PMW3360 & Banana-Pi Leaf S3 #6

Open
kslifter opened this issue Jun 19, 2023 · 0 comments
Open

PMW3360 & Banana-Pi Leaf S3 #6

kslifter opened this issue Jun 19, 2023 · 0 comments

Comments

@kslifter
Copy link

I am working with an open-source DIY mouse project that currently uses the ADND505 sensor(https://www.lynxware.org/), but I am wanting to modify it to use the PMW3360 Sensor. The project uses the Banana-Pi Leaf S3 chip (https://wiki.banana-pi.org/BPI-Leaf-S3). He said he looked into this sensor but was unable to find the code to use for his current project. This chip uses ESP32-S3 and supports Arduino programming. As a sidenote, his last version of this mouse used the ATMEGA32u4 controller, which I know you have a GitHub using that with the PMW3360. So if the PMW3360 won't work with the Banana-Pi, then I can go that route.

Since I am pretty new to all of this I started googling how to connect 2, but didn't find much documentation. I then decided to ask Chat GPT about it and it says that it is possible. I was wondering if you could confirm what it told me?

When asked about connecting the PMW3360 to the Banana Pi Leaf S3:
**Yes, you can connect a PMW3360 optical sensor to a Banana Pi Leaf S3 board using an Arduino. However, there are a few things to consider.

The PMW3360 sensor communicates using SPI (Serial Peripheral Interface), so you will need to use the SPI pins on the Banana Pi Leaf S3 and Arduino to establish communication between the two devices. You'll need to connect the following pins:

Banana Pi Leaf S3 SPI Pins:

  • MOSI (Master Out Slave In): Connect to Arduino's MOSI pin.
  • MISO (Master In Slave Out): Connect to Arduino's MISO pin.
  • SCK (Serial Clock): Connect to Arduino's SCK pin.
  • CS (Chip Select): Connect to a digital pin on the Arduino. You can choose any available digital pin.

Additionally, you need to connect the power and ground pins of the PMW3360 sensor to the appropriate pins on the Arduino.

Here's a general wiring setup:

PMW3360 Arduino Banana Pi Leaf S3

VCC -> 5V 5V
GND -> GND GND
SCK -> SCK SPI SCLK
MISO -> MISO SPI MISO
MOSI -> MOSI SPI MOSI
CS -> Digital Pin SPI CS

Once the connections are made, you can write Arduino code to communicate with the PMW3360 sensor over SPI. You'll need to initialize the SPI interface and configure the necessary settings for the PMW3360, such as resolution and sample rate. Then, you can read data from the sensor and process it as needed.

Keep in mind that this is a high-level overview, and the exact implementation details will depend on your specific hardware setup and the libraries you choose to use. Make sure to consult the datasheet and documentation of the PMW3360 sensor and refer to the Arduino and Banana Pi Leaf S3 documentation for further guidance on SPI communication and pin configurations.**

When asked to provide the full Arduino code using the library from SparkFun:

**Certainly! Here's the complete code that combines the PMW3360 sensor, Arduino, and Banana Pi Leaf S3 for SPI communication:

Arduino Code:(cpp)

#include <SPI.h>
#include <PMW3360.h>

// Define the Chip Select (CS) pin
const int CS_PIN = 10;  // Choose any available digital pin

// Create an instance of the PMW3360 class
PMW3360 mouse(CS_PIN);

void setup() {
  // Initialize SPI communication
  SPI.begin();
  
  // Initialize the PMW3360 sensor
  mouse.init();
  
  // Configure the sensor settings (e.g., resolution, sample rate)
  mouse.setCPI(800);   // Set CPI (Counts Per Inch)
  mouse.setSampleRate(2000);  // Set sample rate in Hz
}

void loop() {
  // Read motion data from the sensor
  int16_t motionX, motionY;
  bool motionDetected = mouse.getMotion(&motionX, &motionY);
  
  // Print the motion data if motion is detected
  if (motionDetected) {
    Serial.print("Motion X: ");
    Serial.print(motionX);
    Serial.print("  Motion Y: ");
    Serial.println(motionY);
  }
  
  // Add a delay between readings
  delay(10);
}

Banana Pi Code: (python)

import spidev

# Open SPI bus
spi = spidev.SpiDev()
spi.open(0, 0)  # Use the appropriate bus and chip select (CS) pins

# Read motion data from the Arduino
def read_motion():
    # Request motion data from Arduino
    spi.xfer([0x00])
    # Read the motion data
    motion_data = spi.xfer([0x00, 0x00, 0x00, 0x00])
    # Extract X and Y motion values
    motion_x = (motion_data[0] << 8) | motion_data[1]
    motion_y = (motion_data[2] << 8) | motion_data[3]
    return motion_x, motion_y

# Continuous motion data reading
while True:
    # Read motion data from the sensor
    motion_x, motion_y = read_motion()

    # Print the motion data
    print(f"Motion X: {motion_x}  Motion Y: {motion_y}")

Make sure to upload the Arduino code to your Arduino board using the Arduino IDE. Connect the PMW3360 sensor to the Arduino as described earlier in our conversation. On the Banana Pi, make sure you have the spidev module installed (you can install it using pip install spidev). Connect the SPI pins on the Banana Pi (MISO, MOSI, SCK, and CS) to the corresponding pins on the Arduino.

The Arduino code reads motion data from the PMW3360 sensor using SPI communication and sends it over the serial port. The Banana Pi code then reads the motion data from the Arduino through SPI using the spidev module and prints it to the console.

Note that in the Banana Pi code, you may need to adjust the spi.open(0, 0) line to match the appropriate SPI bus and chip select (CS) pins on your specific Banana Pi model. Refer to the Banana Pi documentation for the correct SPI pins.

Remember to establish a common ground connection between the Arduino and the Banana Pi to ensure proper communication.**

Thank you so much, and I look forward to hearing back.
-Ian

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant