I have a project consists of (micro controller RP2040 and Raspberry pi 4), the micro controller should send 2000 bytes every 10 millisecond to the raspberry pi over USB communication, and there is an application on raspberry pi which consume this data from USB.
The issue is, if the consumer app waits 200 milliseconds and then consume from USB, this causes a bottleneck on the micro controller which leads to lose data.
How can I increase the USB buffer size of the raspberry pi? I'm working on Raspberry pi OS 32bit.
Thank you
You should probably just make the consumer app faster or use a thread so it doesn't wait 200 milliseconds at the wrong time. If you can't do that, it might be possible to increase the size and number of read buffers in the Linux kernel by editing the code in cdc-acm.c. I'm not an expert on that code, but when I search for the word read_buffers I see some code that looks relevant. I'm assuming your microcontroller's USB interface is CDC ACM.
Related
I am a high school student, who is not very familiar with FPGAs and the Xilinx line.
I am running a ring oscillator module on a Zybo Z7 board. I am also running a counter module, which I want to sample at a high rate. I am currently sending the data through AXI to the ZYNQ processing system, and then using the inbuilt UART to USB buffer to send the data through a USB cable to my computer. On the computer side, I treat this input as a virtual serial line, and use a python script to take and log the data from an IOstream. This method takes very long, however, and I am trying to increase the sample speed. Thus, I was wondering if I could bypass the onboard PS, and connect the FPGA fabric directly to the UART buffer.
I have tried optimizing my PS code, which I have written in C. I have reached the point where it takes 30 oscillations of the onboard ZYNQ clock between samples. Now, however, I have created a newer and more reliable sampling framework in the FPGA logic, which requires a 'handshake' mechanism to start and stop the counter between samples. It takes a very long time for the PS to sample the counter, send the sample, and then restart the counter. Thus, the uptime of my sampling framework is a fraction of what I want it to be. Removing the PS would be ideal, as I know I can automate this handshake signal within the PL if I am able to connect it to a UART interface.
You can implement logic in the PL that can handle the UART communication thus bypassing the PS.
Here's an implementation you can try using:https://github.com/jakubcabal/uart-for-fpga
You would connect the UART pins to one of the Zybo Z7 Pmod ports and use an external USB to UART adapter such as this one, anyone would work as long it supports 3.3V: https://www.adafruit.com/product/5335
The adapter built into the board is connected to directly to the PS MIO pins and cannot be used by the PL.
I have bought an HC-12 module, but as much as I have investigated I have not found a way that a Raspberry Pi with a bluetooth detector called bluelog can detect it.
What do I have to do so that HC-12 wired to a Arduino can be detected with the bluetooth scanner?
How to set HC-12 in 'discoverable' mode?
Thank you
HC12 is a 433MHz transceiver. Bluetooth operates at 2.4GHz
What you're trying to do is impossible and doesn't make any sense.
There are other modules like HC05 or HC06 that communicate via Bluetooth. Your HC12 does not. You'll need a second of those transceivers to establish a connection between the Arduino and Raspberry PI.
This will give you up to 1km of range at lower bandwidth while Bluetooth only works across several meters.
So pick whatever suits your requirements best. A HC12 alone won't do much.
Maybe you should spend a few minutes on researching how radio transmission works befor you buy any equipment.
I have a project in hand where I need to connect 5 or more arduinos as slaves to Raspberry Pi. Load Cells, Reed Switch, Solenoid lock will be connected to each of the arduino. The arduinos need to send the weight readings when a communication is started by the raspberry pi(master). Only a single arduino will be activated at a time. The arduinos will be placed at a maximum of 6ft distance from the raspberry pi. I need advice regarding how to make this connection. I read that I2C cannot be used for long distances so I am unsure if 6 ft is a long distance for I2C. Next, I am trying to see if a USB would work for my case but the issue is the Pi has only 4 USB slots. So can I use a external USB hub with an external power supply and connected each of the arduinos to the USB hub and provide individual power supply to the arduinos? Will this arrangement work or should I be looking at any other protocol apart from I2C and USB?? Any advice on this will be much appreciated. Thanks a lot for your time.
Arduino (Nano, Uno, Mega etc.) can communicate via SPI, I2C or UART.
Long story short, SPI is not suitable for your application. It is used for fast data transfer over short distances (usually milimeters or centimeters), so mainly for communication between chips mounted on the same PCB or PCBs close together (e.g. display shields).
Using I2C is perfectly fine (let's say up to 10 meters) and in your case it is a way to go. The maximum possible length depends on baud rate, for 10 meters a 9600 baud rate would be OK. The big advantage is that you need only 2 wires to connect all Arduinos, the disadvantage is that only one device can transfer data at the time – in your case, that does not matter.
UART is used for communication with many external modules (GSM, GPS, HMI, ...) and also in combination with USB-TTL chip for communication via USB (virtual COM port). In your case, you can use UART e.g. in combination with external UART-RS485 converter module, but there is no need since you can use I2C.
I have a TI SensorTag bluetooth le device. It is not paired with my raspberry Pi. I installed bluez, but I don't have any applications of my own running. The second I power on the device, something on the Pi instantly connects to it. If I disable bluetooth on the Pi, the device becomes available for connections.
This is a problem for me because my own application can't connect to the device because something on the Pi has aggressively connected to it.
I am not sure what the reason is but this worked for me. Try following steps.
Go to terminal and type bluetoothctl.
Then type disconnect <device_address>
I have an Arduino with a 433mhz receiver attached. I've connected this to my computer via a usb to serial cable.
Connected to my laptop (development machine) it works fine with it (>15 metres), but when connecting it to the Raspberry pi (deployment machine) via the same USB cable the range is REALLY poor (<1 metre).
I've tried using another laptop and again it works fine. Suggesting something is wrong/different going on with the Raspberry Pi.
I measured the voltage at the 433mhz receiver and it was slightly lower when it was connected to the raspberry pi. I tried to rule this add by adding a voltage booster circuit but it made it worst if anything.
laptop = 4.88v
raspberry pi = 4.3v
raspberry pi using booster circuit = 4.98v
I've not tried an external power supply yet.
Any thoughts on what might be causing the problem?
Thank you in advance!
I connected up an external power supply to the receiver instead of using the power coming from the Raspberry Pi / Arduino. This made an amazing difference to the range.
For the receiver module I was working with 5.5V - 6V seemed to give the best range. Anything below 5V was pathetic.