Compare commits

..
10 Commits
Author SHA1 Message Date
foley c96d0bb829 hostname and IP on display 2026-10-04 14:21:06 +00:00
foley 58206eb384 auto start python env 2026-09-24 23:05:01 +00:00
foley 7cc99fb75e sshfs for the win 2026-09-24 23:00:56 +00:00
foley b292dbd6e9 adding ssh key to ssh-agent 2026-09-24 22:43:50 +00:00
foley 7fa93735bd wlan power save 2026-09-24 22:35:24 +00:00
foley a4d28d02f7 more about gadget mode 2026-09-24 22:00:20 +00:00
foley b0d632f0c5 rpi-usb-gadget works better but needs an offline-switch 2026-09-06 20:07:41 +00:00
foley 040a6ca33f Merge branch 'master' of ssh://gitea.cs.ru.is:2222/RU-V207/rover-pi 2026-09-06 19:42:02 +00:00
foley e74eff43a2 the lgpio examples do not work reliably. Starting new Blinka 2026-09-06 19:41:51 +00:00
foley 39c0f158fe switch to logger (more POSIX) 2026-07-02 11:04:19 +00:00
6 changed files with 126 additions and 82 deletions
+31 -1
View File
@@ -12,7 +12,8 @@ Scripts and documentation for setting up a Raspberry Pi (Zero W 1 or 2) for use
sudo apt-get -y upgrade
```
1. [Gadget Mode to setup a network connection over USB](https://github.com/raspberrypi/rpi-usb-gadget)
1. [Gadget Mode to setup a network connection over USB](https://github.com/raspberrypi/rpi-usb-gadget). A more explanatory version in the [Raspberry Pi Newsletter](https://www.raspberrypi.com/news/usb-gadget-mode-in-raspberry-pi-os-ssh-over-usb/)
* If you don't have Internet Connection Sharing, th pi will show up as 10.12.194.1
1. [Setup the OLED screen to print the IP](oled-display/README.md)
Based upon [Marcel's script on github to show the IP address on the OLED screen](https://github.com/mkyas/cpsy-display-ip)
1. Install Blinka by following the guide [CircuitPython Libraries on Linux and Raspberry Pi](https://learn.adafruit.com/circuitpython-on-raspberrypi-linux/installing-circuitpython-on-raspberry-pi)]
@@ -48,3 +49,32 @@ Credit: Daníel Bjartur Guðmundsson, transcribed by Joseph T. Foley
1. Show details of "preconfigured" network: nmcli connection show preconfigured
1. Change the SSID (which wireless network you will connect to) in the "New_SSID": nmcli connection modify preconfigured wifi.ssid "New_SSID"
1. Change the wireless access password in the "New_Password": nmcli connection modify preconfigured wifi-sec.psk "New_Password"
## Wifi keeps dropping out. What do I do?
1. `sudo raspi-config`
1. Advanced Options > A12 WLAN Power Save
1. Yes to disabling
## I'd like to stop typing my password all the time
1. Copy your private key to your pi from `~/.ssh/id_*` to the Pi
1. On the Pi, start ssh-agent with
```eval $(ssh-agent)```
1. Now add your key
```ssh-add```
## I'd like to access my pi's files directly on my computer.
In linux, you can use sshfs: https://github.com/libfuse/sshfs
1. Install sshfs
```sudo apt install sshfs```
1. Make a place to mount the files on the pi
```mkdir username-rover```
1. Now we mount the pi's filesystem using sshfs
```sshfs username@host-or-ip /home/username ~/username-rover```
## How do I get the python virtual environment to start each time
1. Edit your `.bashrc` to have this at the end:
```
if [ -f ~/env/bin/activate ]; then
source ~/env/bin/activate
fi
```
+10 -3
View File
@@ -18,20 +18,27 @@ else
fi
# Is the dwc2 overlay installed? Nothing will work if it isn't.
<<<<<<< HEAD
if lsmod | grep -q "dwc2"; then
echo "DWC2 module loaded, setting up OTG gadget serial and ethernet" | logger -t $0 -p info
echo "DWC2 module loaded"
=======
if [ -d /sys/class/udc ] && [ -n "$(ls -A /sys/class/udc)" ]; then
systemd-cat -t gadget.sh -p info echo "DWC2 precompiled, setting up OTG gadget serial and ethernet"
elif lsmod | grep -q "dwc2"; then
systemd-cat -t gadget.sh -p info echo "Pre 6.18.39 kernel. DWC2 module loaded, setting up OTG gadget serial and ethernet"
>>>>>>> master
else
systemd-cat -t gadget.sh -p warning echo "DWC2 module missing. Aborting OTG setup."
echo "DWC2 module missing. Aborting OTG setup." | logger -t $0 -p info
echo "DWC2 module missing"
systemctl disable serial-getty@ttyGS0.service
exit 1
fi
sudo modprobe libcomposite
modprobe libcomposite
cd /sys/kernel/config/usb_gadget
if [ -d "MyGadget" ]; then
systemd-cat -t gadget.sh -p warning echo "MyGadget already exists. Aborting OTG setup."
echo "MyGadget already exists. Aborting OTG setup." | logger -t $0 -p info
exit 1
fi
-19
View File
@@ -1,19 +0,0 @@
#!/usr/bin/python
# From https://raspberry.tips/en/raspberrypi-tutorials/raspberry-pi-gpio-python
import lgpio
import time
# Open GPIO chip (0 = /dev/gpiochip0, on Pi 5 gpiochip4 also possible)
h = lgpio.gpiochip_open(0)
try:
lgpio.gpio_claim_output(h, 18) # GPIO18 (pin 12) as output (MOTA1)
for _ in range(5):
lgpio.gpio_write(h, 18, 1) # HIGH
time.sleep(0.5)
lgpio.gpio_write(h, 18, 0) # LOW
time.sleep(0.5)
finally:
lgpio.gpiochip_close(h) # Always close!
-34
View File
@@ -1,34 +0,0 @@
#!/usr/bin/python
# This test assumes you are trying to control a motor through a DRV8833 motor
# controller chip. This general approach should work for other motors as well.
import lgpio
import time
# pin assignments
gpio_pwm = 18 #MOTA1
gpio_reverse = 16 #MOTA2
gpio_notsleep = 24 #MSLEEP
# parameters
pwm_freq = 1000
h = lgpio.gpiochip_open(0)
try:
lgpio.gpio_claim_output(h, gpio_reverse)
lgpio.gpio_claim_output(h, gpio_notsleep)
lgpio.gpio_write(h, gpio_reverse, 0) # low on reverse pin to turn off h-bridge MOTA2
lgpio.gpio_write(h, gpio_notsleep, 1) # high on /sleep to enable both h-bridges
while True:
for pwm_level in range(0,100):
lgpio.tx_pwm(h, gpio_pwm, pwm_freq, pwm_level)
pwm_level += 10
time.sleep(0.05)
for pwm_level in range(100,0,-1):
lgpio.tx_pwm(h, gpio_pwm, pwm_freq, pwm_level)
pwm_level += 10
time.sleep(0.05)
finally:
lgpio.gpio_write(h, gpio_notsleep, 1) # high on /sleep to disable
lgpio.gpiochip_close(h) # Always close!
-25
View File
@@ -1,25 +0,0 @@
#!/usr/bin/python
# From https://raspberry.tips/en/raspberrypi-tutorials/raspberry-pi-gpio-python
import lgpio
import time
# Open GPIO chip (0 = /dev/gpiochip0, on Pi 5 gpiochip4 also possible)
h = lgpio.gpiochip_open(0)
# Hardware PWM on GPIO18 (pin 12) must be PWM-capable
pwm_pin = 18
pwm_freq = 1000
try:
while True:
for pwm_level in range(0,100):
lgpio.tx_pwm(h, pwm_pin, pwm_freq, pwm_level)
pwm_level += 10
time.sleep(0.05)
for pwm_level in range(100,0,-1):
lgpio.tx_pwm(h, pwm_pin, pwm_freq, pwm_level)
pwm_level += 10
time.sleep(0.05)
finally:
lgpio.tx_pwm(h, pwm_pin, 0, 0) # Stop PWM
lgpio.gpiochip_close(h) # Always close!
+85
View File
@@ -0,0 +1,85 @@
# SPDX-FileCopyrightText: 2021 ladyada for Adafruit Industries
# SPDX-License-Identifier: MIT
"""
This demo will fill the screen with white, draw a black box on top
and then print the device's hostname and IP address in the center of the display
This example is for use on (Linux) computers that are using CPython with
Adafruit Blinka to support CircuitPython libraries. CircuitPython does
not support PIL/pillow (python imaging library)!
"""
import board
import digitalio
from PIL import Image, ImageDraw, ImageFont
import adafruit_ssd1306
import socket
import platform
# Define the Reset Pin
oled_reset = None
try:
oled_reset = digitalio.DigitalInOut(board.D4)
except:
pass
# No reset pin
# Change these
# to the right size for your display!
WIDTH = 128
HEIGHT = 64
BORDER = 5
# Use for I2C.
i2c = board.I2C() # uses board.SCL and board.SDA
oled = adafruit_ssd1306.SSD1306_I2C(WIDTH, HEIGHT, i2c, addr=0x3C, reset=oled_reset)
# Clear display.
oled.fill(0)
oled.show()
# Create blank image for drawing.
# Make sure to create image with mode '1' for 1-bit color.
image = Image.new("1", (oled.width, oled.height))
# Get drawing object to draw on image.
draw = ImageDraw.Draw(image)
# Draw a white background
draw.rectangle((0, 0, oled.width, oled.height), outline=255, fill=255)
# Draw a smaller inner rectangle
draw.rectangle(
(BORDER, BORDER, oled.width - BORDER - 1, oled.height - BORDER - 1),
outline=0,
fill=0,
)
# Load default font.
font = ImageFont.load_default()
# Get the local IP address as a string.
with socket.socket(socket.AF_INET, socket.SOCK_DGRAM) as s:
s.connect(("8.8.8.8", 80))
ipaddr = s.getsockname()[0]
hostname = platform.node()
text = hostname + "\n" + ipaddr
bbox = font.getbbox(ipaddr)
(font_width, font_height) = bbox[2] - bbox[0], bbox[3] - bbox[1]
draw.multiline_text(
xy=(10,10),
text=text,
fill=255,
font=font,
spacing=2, #pixel gap between lines,
align="left",
)
# Display image
oled.image(image)
oled.show()