This commit is contained in:
2026-07-04 18:45:55 +00:00
8 changed files with 126 additions and 34 deletions
+1
View File
@@ -225,3 +225,4 @@ cython_debug/
# PyPI configuration file # PyPI configuration file
.pypirc .pypirc
*.html
+2
View File
@@ -13,6 +13,7 @@ Scripts and documentation for setting up a Raspberry Pi (Zero W 1 or 2) for use
- [Starting on Raspberry Pi Zero](https://reykjavik.instructure.com/courses/6589/pages/starting-on-raspberry-pi-zero-w) - [Starting on Raspberry Pi Zero](https://reykjavik.instructure.com/courses/6589/pages/starting-on-raspberry-pi-zero-w)
## References and Links ## References and Links
- [Sparkfun GPIO pinout](https://cdn.sparkfun.com/assets/learn_tutorials/6/7/6/PiZero_1.pdf)
- [Guide to creating ssh keys](https://pimylifeup.com/raspberry-pi-ssh-keys/) Of note, this guide is a little dated as it suggests using RSA keys and many people are moving toward EDCSA keys. - [Guide to creating ssh keys](https://pimylifeup.com/raspberry-pi-ssh-keys/) Of note, this guide is a little dated as it suggests using RSA keys and many people are moving toward EDCSA keys.
- [Raspberry Pi Connect](https://connect.raspberrypi.com) - [Raspberry Pi Connect](https://connect.raspberrypi.com)
- [Setting up Raspberry Pi Connect](https://www.raspberrypi.com/documentation/services/connect.html) - [Setting up Raspberry Pi Connect](https://www.raspberrypi.com/documentation/services/connect.html)
@@ -21,6 +22,7 @@ Scripts and documentation for setting up a Raspberry Pi (Zero W 1 or 2) for use
- [Turning your Raspberry Pi Zero into a USB Gadget](https://learn.adafruit.com/turning-your-raspberry-pi-zero-into-a-usb-gadget/serial-gadget) Official Adafruit guide to gadget mode to allow the USB port to be used as a serial console to connect to it. We had trouble getting it to work in 2026 due to some changes in Raspberry Pi OS. - [Turning your Raspberry Pi Zero into a USB Gadget](https://learn.adafruit.com/turning-your-raspberry-pi-zero-into-a-usb-gadget/serial-gadget) Official Adafruit guide to gadget mode to allow the USB port to be used as a serial console to connect to it. We had trouble getting it to work in 2026 due to some changes in Raspberry Pi OS.
- [Python gpiozero library](https://gpiozero.readthedocs.io/en/stable/) a simple interface for working with GPIO devices - [Python gpiozero library](https://gpiozero.readthedocs.io/en/stable/) a simple interface for working with GPIO devices
- [CircuitPython Libraries on Linux and Raspberry Pi](https://learn.adafruit.com/circuitpython-on-raspberrypi-linux/installing-circuitpython-on-raspberry-pi) This is one option for GPIO, I2C, SPI, and PWM access in python. - [CircuitPython Libraries on Linux and Raspberry Pi](https://learn.adafruit.com/circuitpython-on-raspberrypi-linux/installing-circuitpython-on-raspberry-pi) This is one option for GPIO, I2C, SPI, and PWM access in python.
- [Comparing Rasbperry Pi python interfaces](https://raspberry.tips/en/raspberrypi-tutorials/raspberry-pi-gpio-python)
## For the Future ## For the Future
- [Setting up Zeroconf to use local names (.local) to access your Pi](https://learn.adafruit.com/bonjour-zeroconf-networking-for-windows-and-linux): this does not work on iot-research because multicast and MDNS are broken. - [Setting up Zeroconf to use local names (.local) to access your Pi](https://learn.adafruit.com/bonjour-zeroconf-networking-for-windows-and-linux): this does not work on iot-research because multicast and MDNS are broken.
+29 -1
View File
@@ -2,10 +2,32 @@
# Adapted from # Adapted from
# "Using OTG mode on Raspberry Pi SBCs" # "Using OTG mode on Raspberry Pi SBCs"
# https://pip-assets.raspberrypi.com/categories/685-app-notes-guides-whitepapers/documents/RP-009276-WP/Using-OTG-mode-on-Raspberry-Pi-SBCs # https://pip-assets.raspberrypi.com/categories/685-app-notes-guides-whitepapers/documents/RP-009276-WP/Using-OTG-mode-on-Raspberry-Pi-SBCs
# This script only works if you are running it as root
if [ $(id -u) -ne 0 ]; then
echo "Please run as root or use sudo"
exit 1
fi
# Is the dwc2 overlay installed? Nothing will work if it isn't.
if lsmod | grep -q "dwc2"; then
systemd-cat -t gadget.sh -p info echo "DWC2 module loaded, setting up OTG gadget serial and ethernet"
else
systemd-cat -t gadget.sh -p warning echo "DWC2 module missing. Aborting OTG setup."
systemctl disable serial-getty@ttyGS0.service
exit 1
fi
sudo modprobe libcomposite sudo modprobe libcomposite
cd /sys/kernel/config/usb_gadget cd /sys/kernel/config/usb_gadget
if [ -d "MyGadget" ]; then
systemd-cat -t gadget.sh -p warning echo "MyGadget already exists. Aborting OTG setup."
exit 1
fi
# Create our new gadget # Create our new gadget
sudo mkdir MyGadget mkdir MyGadget
cd MyGadget cd MyGadget
# Add some boilerplate data that the gadget needs # Add some boilerplate data that the gadget needs
echo 0x1d6b > idVendor # Linux Foundations USB VID. Replace with your own VID if required echo 0x1d6b > idVendor # Linux Foundations USB VID. Replace with your own VID if required
@@ -30,6 +52,7 @@ echo "Config 1" > configs/c.1/strings/0x409/configuration
### Remember to create the storage block device first ### Remember to create the storage block device first
## cd /root ## cd /root
### Example: Make a 256 MB file to act as "USB stick" ### Example: Make a 256 MB file to act as "USB stick"
## Only create it once or it will delete the previous content
## sudo dd if=/dev/zero of=drive.bin bs=1M count=256 ## sudo dd if=/dev/zero of=drive.bin bs=1M count=256
### Create a VFAT file system on the backing store ### Create a VFAT file system on the backing store
## sudo mkfs.vfat drive.bin ## sudo mkfs.vfat drive.bin
@@ -45,9 +68,14 @@ mkdir functions/acm.usb0
ln -s functions/acm.usb0 configs/c.1/ ln -s functions/acm.usb0 configs/c.1/
## Ethernet (RNDIS and ECM) ## Ethernet (RNDIS and ECM)
## Of note, this may cause the IP to show up as 127.0.0.1
## and wireless to suddenly fail to connect
mkdir functions/ecm.usb0 mkdir functions/ecm.usb0
ln -s functions/ecm.usb0 configs/c.1/ ln -s functions/ecm.usb0 configs/c.1/
## USB Device Controller update ## USB Device Controller update
UDC=`ls /sys/class/udc` UDC=`ls /sys/class/udc`
echo $UDC > UDC echo $UDC > UDC
# Enable the gettys
systemctl enable serial-getty@ttyGS0.service
+10
View File
@@ -0,0 +1,10 @@
# Initial connection to the Raspberry Pi
Now that you have an image with ssh and Raspberry Pi connect on your SD, you can connect to the pi
## Connecting using Raspberry Pi Connect
1. Login to https://connect.raspberrypi.com if you haven't already
1. Look at the list of devices, find the one you want, and click on "Connect"
![connect-devices.png](Graphics/connect-devices.png)
1. A remote shell window will pop up
![connect-shell.png](Graphics/connect-shell.png)
+37 -30
View File
@@ -1,49 +1,56 @@
# Gadget Mode to setup a serial connection over USB # Gadget Mode to setup a serial connection over USB
Prepare Raspberry Pi OS connection over a microUSB serial cable Prepare Raspberry Pi OS connection over a microUSB serial cable
Important: You will want to disable the serial console on RX/TX if you are trying to use that serial port for communicating with other devices.
Based upon Adafruit guide: https://learn.adafruit.com/turning-your-raspberry-pi-zero-into-a-usb-gadget/serial-gadget: Based upon Adafruit guide: https://learn.adafruit.com/turning-your-raspberry-pi-zero-into-a-usb-gadget/serial-gadget:
The author discovered the guide was out of date, consulted the [2025 Raspberry Pi whitepaper on OTG](https://pip-assets.raspberrypi.com/categories/685-app-notes-guides-whitepapers/documents/RP-009276-WP/Using-OTG-mode-on-Raspberry-Pi-SBCs), found additional errors, and was finally able to correct them thanks to this blog https://www.isticktoit.net/?p=1383 The author discovered the guide was out of date, consulted the [2025 Raspberry Pi whitepaper on OTG](https://pip-assets.raspberrypi.com/categories/685-app-notes-guides-whitepapers/documents/RP-009276-WP/Using-OTG-mode-on-Raspberry-Pi-SBCs), found additional errors, and was finally able to correct them thanks to this blog https://www.isticktoit.net/?p=1383
## Important :
- **Using the Gadget Mode will make the usb port unable to connect to a mouse or keyboard!!!** You will need to disable it make them work again.
- You will want to disable the serial console on RX/TX in `raspi-config` if you are trying to use that serial port for communicating with other devices.
## Procedure
Make sure you have your USB cable plugged into the left port **USB** and not the right port marked **PWR**. Make sure you have your USB cable plugged into the left port **USB** and not the right port marked **PWR**.
1. Open a connection to the device via ssh or Raspberry Pi Connect 1. Open a connection to the device via ssh or Raspberry Pi Connect
1. Become root (the superuser) 1. Become root (the superuser)
``` ```
sudo su sudo su
``` ```
1. Enable the DWC version 2 USB peripheral device tree overlay by appending it to the end after the `[all]` category (which is at the end) 1. Enable the DWC version 2 USB peripheral device tree overlay by appending it to the end after the `[all]` category (which is at the end)
``` ```
echo "dtoverlay=dwc2" >> /boot/firmware/config.txt echo "dtoverlay=dwc2" >> /boot/firmware/config.txt
``` ```
1. We add the required module `dwc2` for loading at startup 1. We add the required module `dwc2` for loading at startup
``` ```
echo "dwc2" >> /etc/modules echo "dwc2" >> /etc/modules
``` ```
1. Check that we can load the libcomposite module 1. Check that we can load the libcomposite module
``` ```
modprobe libcomposite modprobe libcomposite
``` ```
1. Put a copy of this repository in root's home directory using git 1. Put a copy of this repository in root's home directory using git
``` ```
apt install -y git apt install -y git
git clone https://gitea.cs.ru.is/RU-V207/rover-pi.git git clone https://gitea.cs.ru.is/RU-V207/rover-pi.git
``` ```
1. Go to Scripts and test if the `gadget.sh` runs without errors and hopefully a Serial port appers in Device Manager or equivalent 1. Go to Scripts and test if the `gadget.sh` runs without errors and hopefully a Serial port appers in Device Manager or equivalent
``` ```
cd rover-pi/Scripts/ cd rover-pi/Scripts/
./gadget.sh ./gadget.sh
``` ```
1. Install the systemd script 1. Install the systemd
`cp serial-ether-gadget.service /lib/systemd/system/.` ```
cp serial-ether-gadget.service /lib/systemd/system/.
```
1. Enable the service 1. Enable the service
``` ```
systemctl enable serial-ether-gadget.service systemctl enable serial-ether-gadget.service
``` ```
1. Enable the getty (which connects a login terminal to the serial port) 1. Enable the getty (which connects a login terminal to the serial port)
``` ```
systemctl enable serial-getty@ttyGS0.service systemctl enable serial-getty@ttyGS0.service
``` ```
1. Reboot and see if the serial port appears 1. Reboot and see if the serial port appears
# Connecting to the serial terminal # Connecting to the serial terminal
+2 -2
View File
@@ -23,7 +23,7 @@ We don't have many monitors and keyboards in V207 for students to use, so we wil
![imager-ssh_nokey.png](Graphics/imager-ssh_nokey.png) ![imager-ssh_nokey.png](Graphics/imager-ssh_nokey.png)
1. Once you have uploaded your `id_edcsa.pub` file it should look like this. 1. Once you have uploaded your `id_edcsa.pub` file it should look like this.
![imager-ssh_key.png](Graphics/imager-ssh_key.png) ![imager-ssh_key.png](Graphics/imager-ssh_key.png)
1. Since we don't have enough monitors, we will need another way to setup the initial connection. The officially supported option is Raspberry Pi Connect. You will need to: 1. Since we don't have a monitor, keyboard, and mouse available, we will need another way to setup the initial connection. The officially supported option is Raspberry Pi Connect. You will need to enable it then:
1. Register for an account first at https://connect.raspberrypi.com 1. Register for an account first at https://connect.raspberrypi.com
2. Confirm your account with email 2. Confirm your account with email
2. Login with that account 2. Login with that account
@@ -42,7 +42,7 @@ We don't have many monitors and keyboards in V207 for students to use, so we wil
1. Now you get to watch the writing then verifying. 1. Now you get to watch the writing then verifying.
![imager-writeimage-progress.png](Graphics/imager-writeimage-progress.png) ![imager-writeimage-progress.png](Graphics/imager-writeimage-progress.png)
![imager-writeimage-verifying.png](Graphics/imager-writeimage-verifying.png) ![imager-writeimage-verifying.png](Graphics/imager-writeimage-verifying.png)
1. The process is complete! 1. The process is complete! Now you can [connect to your pi](connect.md)
![imager-complete.png](Graphics/imager-complete.png) ![imager-complete.png](Graphics/imager-complete.png)
1. Take the SD card and put it into your pi. 1. Take the SD card and put it into your pi.
1. When you first boot it, it can take 10 minutes to finish configuring itself. Usually when the LED stops blinking for at least 30 seconds, it is done. 1. When you first boot it, it can take 10 minutes to finish configuring itself. Usually when the LED stops blinking for at least 30 seconds, it is done.
Executable
+19
View File
@@ -0,0 +1,19 @@
#!/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!
+25
View File
@@ -0,0 +1,25 @@
#!/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, 16) # GPIO16 as output (MOTA2)
lgpio.gpio_write(h, 16, 0) # LOW
# Hardware PWM on GPIO18 (pin 12) must be PWM-capable
# Frequency: 1000 Hz, duty cycle: 50%
lgpio.tx_pwm(h, 18, 1000, 50)
time.sleep(2)
# Reduce duty cycle to 20%
lgpio.tx_pwm(h, 18, 1000, 20)
time.sleep(2)
lgpio.tx_pwm(h, 18, 0, 0) # Stop PWM
finally:
lgpio.gpiochip_close(h) # Always close!