I dont have any spare female headers
so I may just solder it to the PCB and keep the Zero within the case (instead of poking out of the slider/back-panel)
Yes, if you make a relay board for the RasPi Zero using a universal board, Iām sure I can fit it into custom case.
To do this, there are a few conditions:
-
Cut the universal board to the 24x15 hole size and position the pin sockets and headers as shown in the photo.
-
Cut the top edge as close to the holes as possible.
(Otherwise, it will be difficult to fit into the case.)
-
Use a 2x20-pin socket for the RasPi Zero with long pins, and keep the board-to-board spacing at 16mm.
-
The cover design for the RasPi Zero is currently a work in progress.
(It may need some further refinement.)
Also, one thing thatās bothering me is that, very occasionally, the keyboard (mouse emulation) may lose control.
This is difficult to reproduce, and Iām not sure what the conditions are.
Perhaps a I2C BUS repeater (such as a PCA9515) is needed for the I2C line.
Perfect!! Thanks for clarifying ![]()
I get that on my Pico2 @378Mhz running Madcockās picomite 6.00.03 and keyboard bios 1.2. Also very intermittent, say once a month when used daily. Will lose keyboard control and sometimes a random character repeats in the display. Almost always at power on. Maybe the stm32 ?.
I have experienced a fail of the keyboard if the battery is low or the usb hub is drawing to much power.
For example:
When I run a 5 Volt Booster on the USB port with a Wlan dongle on Startup. The keyboard was failing everytime with the Lyra board. So maybe some peak usages let the stm32 fail.
I see, so thatās what was happening.
It seems difficult to determine whether the cause is the STM32 firmware (V1.2), overclocking the PicoMite to 376MHz, or a problem with the I2C signal status between the STM32 and RasPiPICO.
Yes, it can happen, and Iāve had a similar experience.
However, the problems with my keyboard seem to occur when the battery voltage isnāt too low, or while the device is charging.
Here is what Iām thinking.
Itās a bit long.
Looking at the PicoCalc schematic, the I2C line used for communication between the STM32 and RasPICO is pulled up to 3.3V with a 4.7K ohm resistor.
āRasPiZero2 on PicoCalcā requires the creation of a relay board, and uses a RasPiZero2/W instead of RasPICO, so itās the RasPiZero2, not the RasPICO, that communicates with the STM32 via I2C.
The RasPiZero2ās I2C is GP2,3, and apparently the internal pull-up resistor is about 1.8K ohms.
Thatās a fairly small resistance value, but a strong pull-up.
If you look at the āGuide for Setup Pi Zero 2 on Picocalcā, youāll see that the I2C wiring is described, but thereās no mention of 3.3V.
In other words, if you create a relay board and wire it according to the description, the I2C that the RasPiZero2 uses to communicate with the STM32 will not be pulled up to 3.3V.
And because the PicoCalc board has a 4.7K ohm resistor installed for pull-up purposes, the SDA and SCL will be connected via the 4.7K ohm resistor.
It looks like this. Isnāt this strange?
ā¦Could something like that possibly be the cause of I2C (keyboard) problem?
If you connect the 3V3 of the RasPiZero, it should become a proper, normal I2C,
but the I2C pull-up resistor will be the RasPiZeroās internal pull-up resistor of approximately 1.8K ohms plus the 4.7K ohms from the PicoCalc board.
I tried wiring up RasPiZeroās 3V3, but it seemed to have a negative effect on the I2C communications environment, causing frequent strange keyboard input problems.
Specifically, even when Iād only typed a single character, the key would continue to be typed as if it were being repeated.
Maybe the pull-ups were too powerful.
So, basically, I thought about the following:
1). As mentioned above, if I donāt wire 3V3, the I2C SDA and SCL will be connected via a resistor.
Thatās strange, so wouldnāt it be better to wire 3V3 to solve that problem?
2). However, if I do that, the pull-up will be too strong, so wouldnāt something need to be done to address that?
3). Since itās difficult to replace the pull-up resistor to solve this problem,
wouldnāt it be better to use an I2C repeater (such as the PCA9515)?
So, itās something like this.
Well, this is just my imagination, and I havenāt done any experiments or tried it yet.
Iām thinking of trying to mount a PCA9515 on a RasPiZero2 on PicoCalc relay board and experiment with it.
I donāt know if this idea is correct, and maybe Iām misunderstanding something.
It seems like at this point the only way to get it running is to just install a really lite desktop and either boot command it with startx to just open Pico-8 or just put it on the desktop.
I used an I2C repeater (PCA9515) and a POLOLU Voltage Regulator unit (Pololu - 2.5-9V Fine-Adjust Step-Up/Step-Down Voltage Regulator S9V11MA) to modify the relay board so that it has the following configuration.
For now, the keyboard seems to be working fine, but I wonāt know if this is really an effective change until Iāve used it for a long time.
Maybe the keyboard problem Iām claiming is just an illusion.
However, Iād like to think that at least the problem with the I2C circuit has been fixed.
I think I may followed the wrong GitHub? https://github.com/wasdwasd0105/picocalc-pi-zero-2?tab=readme-ov-file#guide-for-setup-pi-zero-2-on-picocalc
After installing the driver using
cd ./picocalc-pi-zero-2
chmod +x ./setup_display.sh
sudo ./setup_display.sh
I got this
-- Build files have been written to: /home/jblanked/picocalc-pi-zero-2/fbcp-ili9341-picocalc/build
[ 14%] Building CXX object CMakeFiles/fbcp-ili9341.dir/display.cpp.o
[ 14%] Building CXX object CMakeFiles/fbcp-ili9341.dir/dma.cpp.o
[ 14%] Building CXX object CMakeFiles/fbcp-ili9341.dir/diff.cpp.o
[ 19%] Building CXX object CMakeFiles/fbcp-ili9341.dir/fbcp-ili9341.cpp.o
In file included from /home/jblanked/picocalc-pi-zero-2/fbcp-ili9341-picocalc/diff.cpp:6:
/home/jblanked/picocalc-pi-zero-2/fbcp-ili9341-picocalc/spi.h: In member function āuint32_t* SPITask::DmaSpiHeaderAddress()ā:
/home/jblanked/picocalc-pi-zero-2/fbcp-ili9341-picocalc/spi.h:132:51: warning: taking address of packed member of āSPITaskā may result in an unaligned pointer value [-Waddress-of-packed-member]
132 | inline uint32_t *DmaSpiHeaderAddress() { return &dmaSpiHeader; }
| ^~~~~~~~~~~~~
In file included from /home/jblanked/picocalc-pi-zero-2/fbcp-ili9341-picocalc/display.cpp:3:
/home/jblanked/picocalc-pi-zero-2/fbcp-ili9341-picocalc/spi.h: In member function āuint32_t* SPITask::DmaSpiHeaderAddress()ā:
/home/jblanked/picocalc-pi-zero-2/fbcp-ili9341-picocalc/spi.h:132:51: warning: taking address of packed member of āSPITaskā may result in an unaligned pointer value [-Waddress-of-packed-member]
132 | inline uint32_t *DmaSpiHeaderAddress() { return &dmaSpiHeader; }
| ^~~~~~~~~~~~~
In file included from /home/jblanked/picocalc-pi-zero-2/fbcp-ili9341-picocalc/dma.cpp:12:
/home/jblanked/picocalc-pi-zero-2/fbcp-ili9341-picocalc/spi.h: In member function āuint32_t* SPITask::DmaSpiHeaderAddress()ā:
/home/jblanked/picocalc-pi-zero-2/fbcp-ili9341-picocalc/spi.h:132:51: warning: taking address of packed member of āSPITaskā may result in an unaligned pointer value [-Waddress-of-packed-member]
132 | inline uint32_t *DmaSpiHeaderAddress() { return &dmaSpiHeader; }
| ^~~~~~~~~~~~~
[ 23%] Building CXX object CMakeFiles/fbcp-ili9341.dir/gpu.cpp.o
[ 28%] Building CXX object CMakeFiles/fbcp-ili9341.dir/hx8357d.cpp.o
/home/jblanked/picocalc-pi-zero-2/fbcp-ili9341-picocalc/gpu.cpp:1:10: fatal error: bcm_host.h: No such file or directory
1 | #include <bcm_host.h> // bcm_host_init, bcm_host_deinit
| ^~~~~~~~~~~~
compilation terminated.
make[2]: *** [CMakeFiles/fbcp-ili9341.dir/build.make:132: CMakeFiles/fbcp-ili9341.dir/gpu.cpp.o] Error 1
make[2]: *** Waiting for unfinished jobs....
[ 33%] Building CXX object CMakeFiles/fbcp-ili9341.dir/ili9341.cpp.o
In file included from /home/jblanked/picocalc-pi-zero-2/fbcp-ili9341-picocalc/fbcp-ili9341.cpp:21:
/home/jblanked/picocalc-pi-zero-2/fbcp-ili9341-picocalc/spi.h: In member function āuint32_t* SPITask::DmaSpiHeaderAddress()ā:
/home/jblanked/picocalc-pi-zero-2/fbcp-ili9341-picocalc/spi.h:132:51: warning: taking address of packed member of āSPITaskā may result in an unaligned pointer value [-Waddress-of-packed-member]
132 | inline uint32_t *DmaSpiHeaderAddress() { return &dmaSpiHeader; }
| ^~~~~~~~~~~~~
make[1]: *** [CMakeFiles/Makefile2:83: CMakeFiles/fbcp-ili9341.dir/all] Error 2
make: *** [Makefile:91: all] Error 2
install: cannot stat 'fbcp-ili9341': No such file or directory
After/during keyboard driver installation using
cd ./picocalc-pi-zero-2
chmod +x ./setup_keyboard.sh
sudo ./setup_keyboard.sh
I got this:
/home/jblanked/picocalc-pi-zero-2/picocalc_kbd/picocalc_kbd.c:157:6: warning: no previous prototype for āinput_fw_read_fifoā [-Wmissing-prototypes]
157 | void input_fw_read_fifo(struct kbd_ctx* ctx)
| ^~~~~~~~~~~~~~~~~~
/home/jblanked/picocalc-pi-zero-2/picocalc_kbd/picocalc_kbd.c: In function ākbd_timer_functionā:
/home/jblanked/picocalc-pi-zero-2/picocalc_kbd/picocalc_kbd.c:452:51: warning: parameter ādataā set but not used [-Wunused-but-set-parameter]
452 | static void kbd_timer_function(struct timer_list *data)
| ~~~~~~~~~~~~~~~~~~~^~~~
/home/jblanked/picocalc-pi-zero-2/picocalc_kbd/picocalc_kbd.c: At top level:
/home/jblanked/picocalc-pi-zero-2/picocalc_kbd/picocalc_kbd.c:459:5: warning: no previous prototype for āinput_probeā [-Wmissing-prototypes]
459 | int input_probe(struct i2c_client* i2c_client)
| ^~~~~~~~~~~
/home/jblanked/picocalc-pi-zero-2/picocalc_kbd/picocalc_kbd.c:577:6: warning: no previous prototype for āinput_shutdownā [-Wmissing-prototypes]
577 | void input_shutdown(struct i2c_client* i2c_client)
| ^~~~~~~~~~~~~~
/home/jblanked/picocalc-pi-zero-2/picocalc_kbd/picocalc_kbd.c:595:10: warning: no previous prototype for āparams_get_sysfs_gidā [-Wmissing-prototypes]
595 | uint32_t params_get_sysfs_gid(void)
| ^~~~~~~~~~~~~~~~~~~~
/home/jblanked/picocalc-pi-zero-2/picocalc_kbd/picocalc_kbd.c:729:5: warning: no previous prototype for āsysfs_probeā [-Wmissing-prototypes]
729 | int sysfs_probe(struct i2c_client* i2c_client)
| ^~~~~~~~~~~
/home/jblanked/picocalc-pi-zero-2/picocalc_kbd/picocalc_kbd.c:754:6: warning: no previous prototype for āsysfs_shutdownā [-Wmissing-prototypes]
754 | void sysfs_shutdown(struct i2c_client* i2c_client)
| ^~~~~~~~~~~~~~
And when trying to do the last step: Edit /boot/config.txt (with sudo) and add:
I got this
dtparam=i2c_arm=on
dtoverlay=picocalc_kbd
DO NOT EDIT THIS FILE
The file you are looking for has moved to /boot/firmware/config.txt
(which I then modified the /boot/firmware/config.txt)
But I donāt see anything on the screen
Then I followed https://github.com/ironat/picocalc_bookworm?tab=readme-ov-file#display-without-drm and I saw the screen flash once, but I havenāt see anything on the screen since
This may be because your Raspbian version is different.
You may have Bookworm or Trixie installed.
(āpicocalc-pi-zero-2ā instructs you to install the Legacy 32-bit Bullseye Raspberry Pi OS.)
Did you install Raspbian using Raspberry Pi Imager?
Bullseye has recently disappeared from the options in Raspberry Pi Imager.
Legacy 32-bit Bullseye appears to be available here:
2023-05-03-raspios-bullseye-armhf.img.xz 2023-05-03 01:50 872M
Thanks for the reply!! Thatās exactly what the issue must be. Iāll install the one you sent and then go through all of the steps again and report back
This time after using
cd ./picocalc-pi-zero-2
chmod +x ./setup_display.sh
sudo ./setup_display.sh
I got
CMake Warning:
Manually-specified variables were not used by the project:
USE_GPU
-- Build files have been written to: /home/jblanked/picocalc-pi-zero-2/fbcp-ili9341-picocalc/build
Scanning dependencies of target fbcp-ili9341
[ 19%] Building CXX object CMakeFiles/fbcp-ili9341.dir/dma.cpp.o
[ 19%] Building CXX object CMakeFiles/fbcp-ili9341.dir/fbcp-ili9341.cpp.o
[ 19%] Building CXX object CMakeFiles/fbcp-ili9341.dir/diff.cpp.o
[ 19%] Building CXX object CMakeFiles/fbcp-ili9341.dir/display.cpp.o
In file included from /home/jblanked/picocalc-pi-zero-2/fbcp-ili9341-picocalc/display.cpp:3:
/home/jblanked/picocalc-pi-zero-2/fbcp-ili9341-picocalc/spi.h: In member function āuint32_t* SPITask::DmaSpiHeaderAddress()ā:
/home/jblanked/picocalc-pi-zero-2/fbcp-ili9341-picocalc/spi.h:132:51: warning: taking address of packed member of āSPITaskā may result in an unaligned pointer value [-Waddress-of-packed-member]
132 | inline uint32_t *DmaSpiHeaderAddress() { return &dmaSpiHeader; }
| ^~~~~~~~~~~~~
In file included from /home/jblanked/picocalc-pi-zero-2/fbcp-ili9341-picocalc/diff.cpp:6:
/home/jblanked/picocalc-pi-zero-2/fbcp-ili9341-picocalc/spi.h: In member function āuint32_t* SPITask::DmaSpiHeaderAddress()ā:
/home/jblanked/picocalc-pi-zero-2/fbcp-ili9341-picocalc/spi.h:132:51: warning: taking address of packed member of āSPITaskā may result in an unaligned pointer value [-Waddress-of-packed-member]
132 | inline uint32_t *DmaSpiHeaderAddress() { return &dmaSpiHeader; }
| ^~~~~~~~~~~~~
In file included from /home/jblanked/picocalc-pi-zero-2/fbcp-ili9341-picocalc/dma.cpp:12:
/home/jblanked/picocalc-pi-zero-2/fbcp-ili9341-picocalc/spi.h: In member function āuint32_t* SPITask::DmaSpiHeaderAddress()ā:
/home/jblanked/picocalc-pi-zero-2/fbcp-ili9341-picocalc/spi.h:132:51: warning: taking address of packed member of āSPITaskā may result in an unaligned pointer value [-Waddress-of-packed-member]
132 | inline uint32_t *DmaSpiHeaderAddress() { return &dmaSpiHeader; }
| ^~~~~~~~~~~~~
In file included from /home/jblanked/picocalc-pi-zero-2/fbcp-ili9341-picocalc/fbcp-ili9341.cpp:21:
/home/jblanked/picocalc-pi-zero-2/fbcp-ili9341-picocalc/spi.h: In member function āuint32_t* SPITask::DmaSpiHeaderAddress()ā:
/home/jblanked/picocalc-pi-zero-2/fbcp-ili9341-picocalc/spi.h:132:51: warning: taking address of packed member of āSPITaskā may result in an unaligned pointer value [-Waddress-of-packed-member]
132 | inline uint32_t *DmaSpiHeaderAddress() { return &dmaSpiHeader; }
| ^~~~~~~~~~~~~
[ 23%] Building CXX object CMakeFiles/fbcp-ili9341.dir/gpu.cpp.o
[ 28%] Building CXX object CMakeFiles/fbcp-ili9341.dir/hx8357d.cpp.o
[ 33%] Building CXX object CMakeFiles/fbcp-ili9341.dir/ili9341.cpp.o
[ 38%] Building CXX object CMakeFiles/fbcp-ili9341.dir/ili9486.cpp.o
[ 42%] Building CXX object CMakeFiles/fbcp-ili9341.dir/ili9488.cpp.o
[ 47%] Building CXX object CMakeFiles/fbcp-ili9341.dir/keyboard.cpp.o
In file included from /home/jblanked/picocalc-pi-zero-2/fbcp-ili9341-picocalc/ili9488.cpp:5:
/home/jblanked/picocalc-pi-zero-2/fbcp-ili9341-picocalc/spi.h: In member function āuint32_t* SPITask::DmaSpiHeaderAddress()ā:
/home/jblanked/picocalc-pi-zero-2/fbcp-ili9341-picocalc/spi.h:132:51: warning: taking address of packed member of āSPITaskā may result in an unaligned pointer value [-Waddress-of-packed-member]
132 | inline uint32_t *DmaSpiHeaderAddress() { return &dmaSpiHeader; }
| ^~~~~~~~~~~~~
[ 52%] Building CXX object CMakeFiles/fbcp-ili9341.dir/low_battery.cpp.o
In file included from /home/jblanked/picocalc-pi-zero-2/fbcp-ili9341-picocalc/low_battery.cpp:6:
/home/jblanked/picocalc-pi-zero-2/fbcp-ili9341-picocalc/spi.h: In member function āuint32_t* SPITask::DmaSpiHeaderAddress()ā:
/home/jblanked/picocalc-pi-zero-2/fbcp-ili9341-picocalc/spi.h:132:51: warning: taking address of packed member of āSPITaskā may result in an unaligned pointer value [-Waddress-of-packed-member]
132 | inline uint32_t *DmaSpiHeaderAddress() { return &dmaSpiHeader; }
| ^~~~~~~~~~~~~
[ 57%] Building CXX object CMakeFiles/fbcp-ili9341.dir/mailbox.cpp.o
[ 61%] Building CXX object CMakeFiles/fbcp-ili9341.dir/mem_alloc.cpp.o
[ 66%] Building CXX object CMakeFiles/fbcp-ili9341.dir/mpi3501.cpp.o
[ 71%] Building CXX object CMakeFiles/fbcp-ili9341.dir/mz61581.cpp.o
[ 76%] Building CXX object CMakeFiles/fbcp-ili9341.dir/spi.cpp.o
[ 80%] Building CXX object CMakeFiles/fbcp-ili9341.dir/ssd1351.cpp.o
[ 85%] Building CXX object CMakeFiles/fbcp-ili9341.dir/st7735r.cpp.o
[ 90%] Building CXX object CMakeFiles/fbcp-ili9341.dir/statistics.cpp.o
[ 95%] Building CXX object CMakeFiles/fbcp-ili9341.dir/text.cpp.o
In file included from /home/jblanked/picocalc-pi-zero-2/fbcp-ili9341-picocalc/spi.cpp:11:
/home/jblanked/picocalc-pi-zero-2/fbcp-ili9341-picocalc/spi.h: In member function āuint32_t* SPITask::DmaSpiHeaderAddress()ā:
/home/jblanked/picocalc-pi-zero-2/fbcp-ili9341-picocalc/spi.h:132:51: warning: taking address of packed member of āSPITaskā may result in an unaligned pointer value [-Waddress-of-packed-member]
132 | inline uint32_t *DmaSpiHeaderAddress() { return &dmaSpiHeader; }
| ^~~~~~~~~~~~~
[100%] Linking CXX executable fbcp-ili9341
[100%] Built target fbcp-ili9341
No other errors/warnings following the other steps. But I still only see screen flash once and then itās a blank/black screen. Anything else Iām missing?
I first follow all of these steps:
sudo apt update
sudo apt install -y git
git clone https://github.com/wasdwasd0105/picocalc-pi-zero-2.git
cd ./picocalc-pi-zero-2
chmod +x ./setup_display.sh
sudo ./setup_display.sh
# then reboot
cd ./picocalc-pi-zero-2
chmod +x ./setup_keyboard.sh
sudo ./setup_keyboard.sh
# then reboot
# Edit /boot/config.txt (with sudo) and add:
dtparam=audio=on
dtoverlay=audremap,pins_12_13
# then I go to https://github.com/ironat/picocalc_bookworm?tab=readme-ov-file#display-without-drm
# Do compile the overlay for the display
git clone https://github.com/ironat/picocalc_bookworm
cd picocalc_bookworm
dtc -I dts -O dtb -o picodisplay.dtbo picodisplay.dts
sudo cp picodisplay.dtbo /boot/overlays/.
# Update /boot/firmware/config.txt
# For more options and information see
# http://rptl.io/configtxt
# Some settings may impact device functionality. See link above for details
# Uncomment some or all of these to enable the optional hardware interfaces
#FOR KEYBOARD
dtparam=i2c_arm=on
dtoverlay=picocalc_kbd
#dtparam=i2s=on
# FOR DISPLAY
dtparam=spi=on
# Enable audio (loads snd_bcm2835)
# FOR AUDIO
dtparam=audio=on
dtoverlay=audremap,pins_12_13
# Additional overlays and parameters are documented
# /boot/firmware/overlays/README
# Automatically load overlays for detected cameras
camera_auto_detect=1
# Automatically load overlays for detected DSI displays
display_auto_detect=1
# Normal Display driver:
#FOR DISPLAY
#Display
dtoverlay=spi0-1cs
dtoverlay=picodisplay
# Automatically load initramfs files, if found
auto_initramfs=1
# Enable DRM VC4 V3D driver
dtoverlay=vc4-kms-v3d
max_framebuffers=2
# Don't have the firmware create an initial video= setting in cmdline.txt.
# Use the kernel's default instead.
disable_fw_kms_setup=1
# Disable compensation for displays with overscan
disable_overscan=1
# Run as fast as firmware / board allows
arm_boost=1
[cm4]
# Enable host mode on the 2711 built-in XHCI USB controller.
# This line should be removed if the legacy DWC2 controller is required
# (e.g. for USB device mode) or if USB support is not required.
otg_mode=1
[cm5]
dtoverlay=dwc2,dr_mode=host
[all]
I trying today with Trixie light. Maybe it is better.
For Bookworm please use the Display with MIPI_DPI_SPI part.
IT works well for Bookworm and also Trixi with dektop. ( I know it is confusing. I will remove the old display install methods.)
Remember the Keyboard entries must be copied to the new config.txt location. /boot/firmware/config.txt
and You have to change the keyboard script for trixie from wasdwasd0105:
For the keyboard you have to change the setup_keyboard_script: (kernel-package instead of raspberrypi-kernel-headers)
sudo apt update
sudo apt install -y \
build-essential \
kernel-package \
device-tree-compiler \
git
Awesome so steps moving forward:
- Install the latest bookworm (does 64bit or 32bit matter?)
- Install the keyboard driver:
sudo apt update
sudo apt install -y git
git clone https://github.com/wasdwasd0105/picocalc-pi-zero-2.git
cd ./picocalc-pi-zero-2
chmod +x ./setup_keyboard.sh
sudo ./setup_keyboard.sh
- Follow the steps from " Display with MIPI_DPI_SPI": GitHub - ironat/picocalc_bookworm
- Update the keyboard script again:
sudo apt update
sudo apt install -y \
build-essential \
kernel-package \
device-tree-compiler \
git
Everything look correct?
The change in the Keyboard script is only for trixie not for bookworm.
I have an error in the piocmipi.bin file so the screen is flipped, sorry.
Also you have to add:
fbcon=map:1 fbcon=font:MINI4x6
to the end of /boot/firmware/cmdline.txt
I will upload a fix now.









