Categories
Android Arduino Meshtastic Microcontroller Raspberry Pi Pico Uncategorized

Meshtastic Serial

I wanted to see about connecting a Raspberry Pi Pico to a LillyGo TTGO T-Beam v1.1 device. I noticed that Meshtastic supports serial communications, so I decided to give it a go to see how it worked.

There are several serial modes but the ones that seem the most useful are TXTMSG and PROTO. First attempt will be with the TXTMSG Mode as that seems straight forward. Once the TXTMSG Mode is working, I will look into how to use the PROTO Mode.

Wiring

We need to connect the grounds between the two devices, then connect the transmit (TX) from one to the receive (RX) of the other device. Below is a table showing the connections used in my setup.

T-BeamPico
RX pin 13TX pin 1 (GP0)
TX pin 14RX pin 2 (GP1)
GNDGND
T-Beam and Pico wiring
Wiring between T-Beam and Raspberry Pi Pico

Meshtastic Setup

Meshtastic firmware was installed using the Web Installer at https://flasher.meshtastic.org/. The T-Beam came with Meshtastic preinstalled. You may need to use another method to install the firmware if the Web Installer does not work.

Meshtastic Web Installer
Meshtastic Web Installer

T-Beam TEXTMSG Mode

Once Meshtastic has been installed on the T-Beam device and connected to the Android or Apple application, go to the Module Settings to setup the serial connection on the T-Beam device. The Module Settings is accessed by clicking on the kebab menu (aka three vertical dots menu) and selecting “Module Settings”.

kebab menu
Kebab Menu
Module Settings menu item
Module Settings menu item

Once the Module settings are displayed, scroll down to the “Serial Config” section and set the following items.

  • Serial enabled: turn on
  • RX: Set it to the T-Beam pin number for receive, which is 13 in my setup.
  • TX: Set it to the T-Beam pin number for transmit, which is 14 in my setup.
  • Serial baud rate: May leave it at the default setting or set it to “BAUD_38400”. I think it is best to set it as the default baud rate may change in other versions. I believe I read that it did change in the past.
  • Serial mode: Set it to TEXTMSG
  • Once everything is set, click the “Send” button.
Serial Configuration
Serial Configuration

Pico Arduino Code

The Pico code is written in C++ using the Arduino IDE. It is necessary to configure use the Pico Board provided by Earle F. Philhower, III. First, add the URL, https://github.com/earlephilhower/arduino-pico/releases/download/global/package_rp2040_index.json, to the Additional Boards Manager URLs by going to File > Preferences in the menu.

Arduino Preferences Menu Item
Arduino Preferences Menu Item
Arduino IDE Preferences
Arduino IDE Preferences

Click the icon to the left of the “Additional boards manager URLs” entry. Add the URL to the a new line in the textbox and click the “OK” button.

Additional Boards Manager URLs
Additional Boards Manager URLs

Open the boards manager by clicking on the boards manager icon, type “Pico” in the search textbox, and install the board, Raspberry Pi Pico/RP2040 by Earle F. Philhower, III.

Boards Manager
Boards Manager

Once the board is installed, you may select it from the boards dropdown selection in the IDE, when the Pico is connected to the PC.

Pico selected in the boards drop-down list
Raspberry Pi Pico selected in the boards drop-down list
/*
  Sample code to allow the Pico to act as a serial bridge between the PC and the Meshtastic device.

  Data sent to the Pico using the Arduino Serial Monitor, PuTTY, or other terminal software is sent
  to the Meshtastic device over the Pico UART0/Serial1 connection. Any data received from the Meshtastic
  device to the Pico is relayed to the PC over the Pico's serial over USB connection.

  REFERENCES:
    - https://meshtastic.org/docs/settings/moduleconfig/serial
    - https://github.com/earlephilhower/arduino-pico/discussions/210
*/

void setup() {
  // PC to Pico
  Serial.begin(9600);
  // Pico to Meshtastic device
  Serial1.begin(38400);
  while (!Serial)
    ;  // Serial is via USB; wait for enumeration
}

void loop() {
  // If data is received from the Meshtastic device, send it to the PC over the USB connection
  if (Serial1.available()) {
    String receiveMessage = Serial1.readString();
    Serial.print("Message received on Serial1 is:  ");
    Serial.println(receiveMessage);  // Send to serial monitor
  }

  // If data is received from the PC, send it to the Meshtastic Device
  while (Serial.available()) {
    int inByte = Serial.read();
    Serial1.write(inByte);
  }
}

Upload the code to the Raspberry Pi Pico. Once the code is loaded, open the serial monitor and type some text and hit enter. The message will be received on the other node(s).

Sending message from PC
Sending message from PC
Message received on other node
Message received on other node

Sending a message from another node, will be received and shown in the serial terminal.

Sending message from another node
Sending message from another node
Receiving message on PC
Receiving message on PC

Now the simple TEXTMSG is working, we can try to get the PROTO working. The PROTO mode is interesting as it may be possible to configure the Meshtastic device, and query it for additional information. I will look into the PROTO Mode in the near future.

Categories
Psion Raspberry Pi

Psion Sidecar Part II

I’m going to dive in a bit on the Psion Sidecar that I covered last week and add some details to explain the RS232 connections and the switches on the Sidecar.

Male DB9 Connector

Male DB9 Connector pinouts
Male DB9 Connector pinouts
PinFunctionI/O Direction
1Data Carrier Detect (DCD)Input
2Receive Data (RD)Input
3Transmit Data (TD or SD)Output
4Data Terminal Ready (DTR)Output
5Signal Ground (SG)
6Data Set Ready (DSR)Input
7Request to Send (RTS)Output
8Clear to Send (CTS)Input
9Ring Indicator (RI)Input
PC DB9 Pinout

Sidecar DB9 Pinout

The silkscreen and case markings were confusing me at first. It was a bit difficult to understand which switch position was for a straight Data Terminal Equipment (DTE) connection and which was for a Data Communications Equipment (DCE) connection. The silk screen on the PCB indicate that when both switches are toward the DB9 connector, that it is a straight DTE connection and when they are away from the DB9 connector, they are in the crossover/null modem DCE configuration. The case indicates that if they are to the left, as you look at the switch, then it is straight through and to the right is crossover configuration. These two were not in agreement.

Using an ohm meter to trace the connections through to the Raspberry Pi, it was apparent that the case was more correct but the opposite of what my thought was regarding the symbols. I thought that the straight arrow indicated that the DB9 was in a DTE pinout and the crossover symbol as the DCE connection. It is actually the opposite. I think that Kian may be indicating what device it is connecting to rather than what the DB9 pinout of the Psion Sidecar is when the switch is in a particular position.

Switch Positions

  • Left – DCE Pinout: Use when connecting to a PC or another device with DTE pinout.
  • Right – DTE Pinout: Use when connecting to the Psion, modem, or other device with a DCE pinout.
PinDB9
TX:RX
RTS:CTS
(Right DTE)
DB9
TX:RX
RTS:CTS
(Left DCE)
SP3232E
TX:RX
RTS:CTS
(Right DTE)
SP3232E
TX:RX
RTS:CTS
(Left DCE)
Raspberry Pi
TX:RX
RTS:CTS
(Right DTE)
Raspberry Pi
TX:RX
RTS:CTS
(Left DCE)
1Not ConnectedNot ConnectedNot ConnectedNot ConnectedNot ConnectedNot Connected
2RDTD13->1214<-1110 GPIO158 GPIO14
3TDRD14<-1113->128 GPIO1410 GPIO15
4Not ConnectedNot ConnectedNot ConnectedNot ConnectedNot ConnectedNot Connected
5SGSG151566
6Not ConnectedNot ConnectedNot ConnectedNot ConnectedNot ConnectedNot Connected
7RTSCTS7<-108->911 GPIO1736 GPIO16
8CTSRTS8->97<-1036 GPIO1611 GPIO17
9Not ConnectedNot ConnectedNot ConnectedNot ConnectedNot ConnectedNot Connected
DB9 to Raspberry Pi Pinouts
SP3232E IC Pinout showing buffers
SP3232E IC Pinout Showing Buffers

Properly shutting down the Psion Sidecar

To properly shutdown the Raspberry Pi in the Sidecar, open the Hermes or other terminal application. Connect to the Sidecar using telnet on port 23. Once connected, login and issue the command “sudo shutdown now“. Once the green light on the Raspberry Pi stops blinking, you may press the power button to turn the unit off.

Hermes used to properly shutdown the Raspberry Pi in the Sidecar.
Properly shutdown the Raspberry Pi in the Sidecar using Hermes Terminal application

Conclusion

I hope this is helpful in understanding how properly shutdown the Psion Sidecar and how to use the switches. Typically the switches will be in the right position to allow communication with a Psion 5mx device using the Psion BB9 cable.

Kian’s design is very nice as it allows the Psion Sidecar to be used for other things without the need of a null modem to connect it to another device. The only thing that you may need is a F-F gender changer and DB9 to DB25 adapters. This makes it a versatile device to connect other devices.

Categories
Psion Raspberry Pi

Getting Psion 5mx on the Internet

I found a project that Kian Ryan put together to get his Psion 5mx on the internet. It will not run YouTube or provide the content that we are used to today but it can provide a 1990’s internet experience.

Kian wrote up his build in a few of his blog posts. Below is a list of his blog posts. Please check them out for more details.

When I saw the video of Kian on Tom’s hardware, I immediately went to his blog to see how he put it together. I had been thinking of doing something similar and seeing what Kian had would save me a great deal of time. I do plan to make another version of his project using IrDA. I already have the parts that I believe I will need to make it happen. I want to get the RS232 version working first. I sourced and ordered the parts that I did not have on hand. A little over 2 weeks later, the last parts arrived so I could get started.

The first thing that I worked on was building the PiRS232 board. I had not paid attention to Kian’s instruction to use tall headers. I did not have tall headers on hand so I had to order some. A couple days later, the proper headers arrived so I could complete the build.

Parts List & Sources

  1. Raspberry Pi Zero W
  2. Pimoroni LiPo Amigo Pro
  3. Pimoroni LiPo SHIM for Raspberry Pi
  4. 2200mah LiPo Battery with JST connector
  5. Double ended JST connector
  6. 2×20 Long Male Header (19mm 16mm)
  7. M2.5 10mm+6mm Nylon stand-offs (F-M), screws and nuts
  8. M2.5 5mm screws
  9. M3 brass inserts
  10. M3 round head hex nut 8mm bolts
  11. Case
    • Quantity: 1
    • Source: Print the 4 STL files in the Case folder in Kian’s GitHub Repository. Optionally, you may printed on Printables
  12. Assembled PiRS232 board (See parts list below)
Parts laid out and numbered
Parts laid out and numbered. (NOTE: Header is not correct as it is a short header. There are brass inserts already in the case but extras are laid out. Only 2 brass inserts are needed. Double ended JST cable is shown as 2 JST pigtails. These will be made into one cable.)

Parts for the PiRS232 Board

  1. PCB for PiRS232 board
    • Quantity: 1
    • Source: Use the PiRS232.kicad_pcb in Kian’s GitHub Repository and have it made at PCBWay, OSHPark, or other PCB manufacturer. Another way is to go to the OSHPark project that I created and order it from there.
  2. SP3232E
  3. 0.1uF Capacitors
  4. Switch Slide DPDT
  5. DB9 Male Right Angle
PiRS232 Board Parts Numbered
PiRS232 Board Parts Numbered

3D Printing the Parts

I had printed the parts with ABS filament on an XYZprinting da Vinci 1.0 3D Printer. Below are the images from Simplify3D showing the orientation of the pieces.

PiRS232 Board Build

The first step was to solder the 0.1uF capacitors to the board.

Capacitors soldered to the board
Capacitors soldered to the board

Next was to install the SP3232E IC. Take note of pin 1 and orientate the IC correctly. Start by soldering 2 opposing corner pins. Make certain that the IC is mounted flush, then solder the remaining pins.

Solder the opposing corner pins of the IC
Solder the opposing corner pins of the IC
PiRS232 board with the IC installed
PiRS232 board with the IC installed

The switches were next. The same principle of soldering opposing corner pins, checking placement, then soldering remaining pins was done with the switches and then the DB9 connector.

Soldering the first switch
Soldering the first switch
Both switches are in place
Both switches are in place
DB9 connector is installed
DB9 connector is installed

Putting the Stack Together

Once the correct headers arrived, I could get to work putting everything together and move on to the software.

Long and short headers compared
The regular and long headers. The long headers are need to put the stack together.

Soldering the long header to the Raspberry Pi Zero. The header that I have is 19mm but 16mm looks to be a better fit. After soldering the header, the excess needed to be trimmed with flush cutters. It is handy to use a breadboard to help keep the pins straight. It may be necessary to prop up the Raspberry Pi to keep everything straight. Again, start with opposite corner pins, check the alignment, adjust if necessary, then solder the remaining pins.

Place the LiPo Shim on the Raspberry Pi and solder in place. Make certain that it does not touch any components and remains parallel to the Raspberry Pi.

Install the 10mm+6mm standoffs with nuts.

I did not like how the pins from the switch were right on top of the power connection so I place a bit of electrical tape over the pins.

Secure the PiRS232 board to the standoffs and solder the header pins.

If your headers are long, then trim them flush with the board.

Secure the LiPo Amigo Pro to the 3D Printed Power Rest with two or three M2.5 5mm screws.

Checking the fit for the LiPo Amigo Pro, it looks like the screw for the DB9 connector is going to be in the way, so we will need to remove it. It also looks like the threaded bracket is in the way as well so that too needs to be removed.

The fit is better but it looks like we may still need to make an adjustment. We will see when it all goes into the case.

Everything is all wired up, now on to the software. It is tempting to install it in the case but we need to be certain that the software is configured and ready before stuffing it in the case as the card is not accessible once everything is installed.

Software Setup

Using the Raspberry Pi Imager, setup a headless installation. If you don’t have the Raspberry Pi Imager installed, head over to https://www.raspberrypi.com/software/ and download the Raspberry Pi imager. Once installed, launch it and click the “CHOOSE OS” button.

Click the “Raspberry Pi OS (other)” option

Click the “Raspberry Pi OS Lite (32-bit)” option.

Click the gear icon in the lower right corner.

Setup the following options.

  • Set a hostname
  • Enable SSH (Typically you will want to use password authentication.)
  • Set username and password to something that you will remember.
  • Configure wireless LAN with your network SSID and password. Make certain that your Wireless LAN country is poperly set as well.
  • Set local settings so your time zone and keyboard are correct.
  • Setup the persistent settings to your liking.

Click the “CHOOSE STORA…” button to select your microSD card, then click the “WRITE” button. The OS will be installed to your card. Once the verification completes and is successful, eject the card and put it in the Raspberry Pi. Start the Raspberry Pi by pressing the power button on the LiPo Amigo Pro.

SSH into the Raspberry Pi

If you don’t have PuTTY or other terminal software installed, now is a good time to head over to https://www.putty.org/ to download and install PuTTY. Once installed, open PuTTY and connect to your Raspberry Pi using the hostname that you setup when installing the OS to the card. If you cannot open a session, you may need to connect to your wireless router to determine the IP Address assigned to the Raspberry Pi and use that to connect.

Using one of the available text editors, edit /boot/config.txt. I’m using Nano, so I issued the following command. (Don’t forget sudo or you will be opening a read-only version.

sudo nano /boot/config.txt

Add the following lines at the end of /boot/config.txt, then reboot the Raspberry Pi.

# Disable Bluetooth - switch UART
dtoverlay=pi3-disable-bt

enable_uart=1

Install Hermes terminal emulator on your Psion device. On the PiRS232 board, the switches should be in the TX:TX/RX:RX and RTS:CTS/CTS:RTS positions.

NOTE TO SELF: It has been a long time since I needed to take a screenshot on a Psion device. On the 5mx, press CTRL+FN+SHIFT+S. On Windows, use an application such as XnView to open the screenshot and convert to another format.

Once the Raspberry Pi reboots and Hermes is installed on the Psion, open Hermes. On the menu, select Connection> Connection… (or Ctrl+K). Select the following options, then click the “OK” button.

  • Comms: Serial port 0
  • Baud rate: 115200
  • Settings: 8 data; 1 stop; No parity
  • Handshaking: Hardware (RTS/CTS)

If you get a dialog stating “Opening serial port Access denied”, you will need to disable the remote link.

On the System screen, open the menu and select Tools > Remote link… (or Ctrl+L).

Change the Remote Link setting to “Off”.

When connected to the Raspberry Pi, it may be necessary to press the Enter key once or twice to receive the login prompt from the Raspberry Pi.

It is now possible to work directly from the Psion or using PuTTY.

Setting up Flow Control

These commands may be entered from the Psion or PuTTY. I’m using PuTTY because it is easier to copy and paste. Issue the following commands.

sudo apt-get update

sudo apt install build-essential git
git clone https://github.com/mholling/rpirtscts 
cd rpirtscts
make
sudo ./rpirtscts on

wget https://github.com/HiassofT/AtariSIO/blob/master/contrib/rpi/uart-ctsrts.dtbo?raw=true -O uart-ctsrts.dtbo
sudo mv uart-ctsrts.dtbo /boot/overlays/

sudo nano /boot/config.txt

Add the following at the end of /boot/config.txt, then save the file and exit the Nano editor. The first, second, and the last lines should already exist from the last step, when we edited the /boot/config.txt file. We are adding the third line here.

# Disable Bluetooth - switch UART, enable CTS/RTS
dtoverlay=pi3-disable-bt
dtoverlay=uart-ctsrts
enable_uart=1

Once the file has been saved and we are back at the command line, edit ~/.bashrc file by issuing the following command.
NOTE: Kian edits ~/.bash_rc but that file did not exist and creating it and adding the line did nothing. I needed to edit ~/.bashrc instead. Editing ~/.bashrc enabled flowcontrol for my setup.

nano ~/.bashrc

Add the following line at the end of the file.

stty -F /dev/ttyAMA0 crtscts

When using PuTTY or other SSH application, you may notice that there is an error when you login that states, “stty: /dev/ttyAMA0: Permission denied”. This is not an issue and does not show on the Psion 5mx serial connection. It may be possible to edit ~/.bashrc to only execute the command that we added if there are connected over a serial connection. That will take some further investigation but is a low priority. If you know how to detect the connection type and how to change the ~/.bashrc file, please leave a comment.

Optional – Install CMatrix

CMatrix is not necessary to install but it is a good test for the serial connection and it just looks cool. From either PuTTY or the Psion, issue the following commands to install and run CMatrix.

sudo apt-get install cmatrix

cmatrix

CMatrix runs slow on the Psion 5mx with a serial connection but it works. To exit, press Ctrl+C.

Setting Up Point-to-Point Protocol (PPP)

If you have not already, please read Kian’s PPP setup and understand the security concerns and understand that the serial terminal will no longer be available after this step.

Run the following commands from PuTTY.

sudo apt install ppp

sudo nano /etc/rc.local

Add the following two lines to /etc/rc.local before “exit 0”, save the file, and exit the editor.

stty -F /dev/ttyAMA0 raw
sudo pppd /dev/ttyAMA0 115200 10.0.0.1:10.0.0.2 proxyarp local noauth nodetach dump crtscts passive persist maxfail 0 holdoff 1 &

Start raspi-config by issuing the following command.

sudo raspi-config

When Raspberry Pi Software Configuration Tool launches, go to Interface Options > Serial Port. Select “No” for shell and “Yes” for enabled.

Verify that the confirmation message states that the serial login shell is disabled and that the serial interface is enabled.

If the configuration is correct, select finish to exit and reboot the Raspberry Pi.

Setting Up the Psion

Jump over to Kian’s instructions.

I ran into an issue when attempting to connect to the internet. Hermes would not connect.

The issue turned out to be quite obvious once it dawned on me that telnet server does not exist on the Raspberry Pi. There is a good reason that it is not installed. Telnet is a security concern as it is unencrypted. Keep this in mind if you install telnet on your Raspberry Pi. To install telnet, run the following command.

sudo apt-get install telnetd

Once telnet server was installed, things worked as Kian has in his blog post.

Web Browsing

Opera is the best web browser for Psion devices, but it has only a 30-day demo. You need a license to use it past 30 days. It can be downloaded from https://get.geo.opera.com/pub/opera/. It looks like the latest version (19 April 2002) is at https://get.geo.opera.com/pub/opera/symbian/514/en/er5/.

Well, I hit another snag. It appears that I cannot connect to the internet through the Raspberry Pi. DNS was not resolving domain names, so I attempted to browse by IP Address but that did not work either.

To fix this issue, we need to do a bit more configuring on the Raspberry Pi. I found a couple of posts that helped me figure out how to fix the issue.
SOURCE: https://www.instructables.com/Connect-the-Raspberry-Pi-to-network-using-UART/ and https://www.ducea.com/2006/08/01/how-to-enable-ip-forwarding-in-linux/

The following two commands are a temporary way to get it all working.

sudo sysctl -w net.ipv4.ip_forward=1

sudo iptables -t nat -A POSTROUTING -o wlan0 -j MASQUERADE

A more permanent solution is to edit /etc/sysctrl.conf and /etc/rc.local. First edit /etc/sysctrl.conf by using the following command.

sudo nano /etc/sysctl.conf

Find the commented line “#net.ipv4.ip_forward=1” and uncomment it, save the file, and exit the editor.

# Uncomment the next line to enable packet forwarding for IPv4
net.ipv4.ip_forward=1

Next edit /etc/sysctrl.conf by using the following command.

sudo nano /etc/rc.local

Add the following line before “exit 0”, then save the file and close the editor.

iptables -t nat -A POSTROUTING -o wlan0 -j MASQUERADE

Reboot the Raspberry Pi. Once the Raspberry Pi reboots, attempt to browse the internet on the Psion.

Closing Up the Case

Now that the software is in working order, we can put everything in the case and close it up. First start by carefully placing the stack in the case. It is a bit of a challenge to get the standoff into case without breaking the case but it will go, you just need to be careful.

The standoffs don’t protrude through the bottom, so no worries that it will scratch the table. 😉

The DB9 screw did not hit the Pimoroni LiPo Amigo Pro, so I was able to put it back on, then I installed the Pimoroni LiPo Amigo Pro on its self by attaching it with one M2.5 5mm screw.

Installed the battery and taped down the wires so they were not in the way of the switch.

Now close it up by attaching the lid with the M3 screws. I used a bit of tape to keep the button in place while I put it all together.

Categories
Desktop Application Development Raspberry Pi Software Development

Soft Latching Power Switch Revisited

This week, I have some updates revolving around the Soft Latching Power Switch, that I last wrote about eight years ago. I finally returned to the project and now have it working as I intended. I also have made some changes to the Dual Volt Amp Meter‘s Desktop software. I believe I may now have a stable usable version. Lastly, I’ve gotten started with Flux.ai and plan on using it to replace my old version of Eagle.

Soft Latching Power Switch

Soft Latching Switch on the bench
Soft Latching Switch on the bench connected to a Raspberry Pi Zero

I resolved a few items that I encountered previously when I attempted to use the Soft Latching Power Switch designed by Mosaic Industries to control an Adafruit 1000C. I was able to reliably control the PowerBoost 1000C using the Soft Latching circuit, one I removed R13 from the PowerBoost and placed a 200K ohm resistor between the enable and ground. R13 pulls up the enable pin to Vs so that the PowerBoost is always on, unless the enable pin is connected to ground. In my case, I wanted the opposite behavior. I wanted the PowerBoost to always be off unless the enable pin is connected to Vs.

The Soft Latching Power Switch designed by Mosaic Industries is intended to switch the 5V going into the Raspberry Pi but I wanted to use it differently by having it control turn off, or disable, the PowerBoost 1000C boost circuit. Below is a diagram showing the circuit used in this design.

Complete Circuit Diagram
Complete Circuit Diagram with the Soft Latching Circuit, Powerboost 1000C, and Raspberry Pi

The Soft Latching Power Switch is connected so that the input voltage is the Vs output of the Adafruit 1000C. The Vs output is USB voltage if USB Power is applied. If USB Power is not applied, Vs is the battery voltage. The output of the Soft Latching Power Switch output is connected to the enable pin of the Adafruit 1000C. The final connection of the Soft Latching Power Switch is the control pin, which is connected to GPIO22 (pin 15) of the Raspberry Pi.

The Adfruit PowerBoost 1000C is modified by removing the 200K ohm pull-up resistor, R13. An external 200K ohm resistor is connected between the enable pin and ground. A capacitor, around 0.01uF is placed in parallel with the resistor to prevent the PowerBoost from turning on the first time power is applied from either USB or battery. The value of the capacitor used is not critical. The first capacitor I grabbed was 0.01uF and it worked. The purpose of the capacitor is to make it look like a short from the enable pin to ground when power is first applied. If you find that it still starts from the on state rather than off state, you may need to use a higher value capacitor to provide more time for the capacitor to charge up and appear as a short to ground.

Once the circuit is put together and connected, you will need to load some scripts on the Raspberry Pi to allow the switch to shutdown the Raspberry Pi when the switch is pressed and for the Raspberry Pi to turn off the power when it shuts down. The scripts are available in the Pi-Power-Button project on GitHub.

This setup provides the following functionality:

  • Button press to turn on
  • Button press to signal to the device to shutdown
  • Long button press to force power off
  • Turn off power when the Raspberry Pi shuts down

Next Steps

  • Clean up the code now that it is working as expected
  • Possibly have one script file to handle shutdown and listening for button press
  • Design another circuit to allow similar functionality from a keyboard similar to the functionality on the HP 95lx and Psion 5 PDAs

Dual Volt Amp Meter

Made some changes on the desktop application for the Dual Volt Amp Meter project that I wrote about a few weeks ago.

I was having some issues with the software after it was running for a few hours. I would get random errors related to an index being out of bounds and could not figure out how that was possible when I am in a for loop that has the lower bound being zero and the upper bound being one less than the count of items in the list. I neglected to connect the dots that I was manipulating the list in another thread to limit the number of items in the list. The error would crop up if the timing was just right that the check on the array bounds occurred on the main thread, then the code then removed the item on the other thread. The next line in my main thread then referenced the item that was just removed, then the application would crash.

I believe I have now resolved all of those issues, so the code should be stable now. It has been running for a couple of hours so far without any issues.

Below is a capture from the application showing the button on the Soft Latching Power Switch being pressed and turning on the PowerBoost 1000C and in turn, the Raspberry Pi.

Graph from from the Dual Voltage Amp Meter
Graph from from the Dual Voltage Amp Meter showing the Soft Latching Power Switch being turned on.

Flux.ai

I discovered Flux.ai by watching a hackster.io video, where Alex Glow interviewed the Flux.ai team. I have since started working with Flux.ai and intend to create the Soft Latching Power Switch publicly in Flux.ai so others may use in their designs.

I really like what the Flux.ai has put together but it feels like there is much work to do to make it a product that may be used by the community. I plan to work more with Flux.ai and provide feedback to the team on design changes that may help users come up to speed quickly.

The only Schematic and PCB Layout tool that I have used successfully was Eagle. Once Eagle was acquired by Autodesk and moved to online subscription based licensing, I stopped updating Eagle. I’m still using Eagle 7.7.0 and would like to move on to something else. I have looked at KiCad and have it installed but have not made the commitment to start using it. Part of the reason is I have several components that I built in Eagle. I would need to start over in KiCad.

Another reason I have not moved to KiCad but am willing to move to Flux.ai, has to do with the parts libraries when sharing a project. I have received or pulled KiCad designs and have had to reach out to the authors to get some missing libraries. (The same is an issue with sharing Eagle designs.) Flux.ai solves this problem as libraries are online and may be shared with the community.

In addition to public parts, Flux.ai has the ability to create pull completed circuits with PCB layouts in other designs. This is great as one may design a power supply or other circuit and pull it in and reuse it in multiple projects. I have attempted something similar in Eagle but there are always issues with it and it seems you are always reinventing the wheel. Flux.ai eliminates redundant work and speeds up the design process.

Another advantage of Flux.ai is they have brought change management into the tool. You may see all the revisions made to a part or circuit, stay on an older version, or update to the latest change. This allows someone to update their public design to fix an issue and someone else who has used the design, may pull the latest fix into their design. It also allows someone to fork someone else’s design, improve upon it, then submit a pull request so the original designer can pull the change and everyone may benefit.

As you can tell, I’m very hopeful that Flux.ai will succeed and the Open Source community will embrace what Flux.ai is attempting to do with their hardware design platform. Give it a try. I hope to see the community help Flux.ai grow.

You may see what I’m up to on the platform by going to https://www.flux.ai/richteel. So far, I’ve put together one part for the IRF7319. I did so by forking another user’s part for the IRF7317.

Categories
Raspberry Pi

Microchip AR1100 Resistive Touch Screen to USB

I’m currently working on a project similar to what Rune Kyndal did, which is putting a Raspberry Pi inside an old HP 95LX case. You can see Rune’s project on HACKADAY.IO.

I sourced a 800×320 screen from BuyDisplay.com, that is a good match for the original dimensions of the HP 95LX display. Arguably, the screen that Rune sourced is better at 800×480, but I wanted a display that would allow for the original faceplate to be used so it looks as close to the original as possible. I still need to cram everything into the housing.

One thing that I wanted to be able to do is use the device without a mouse if I want to. That requires getting the touch screen to work. Today I was finally able to get the touch screen in a usable state with the help of tool created by tom-2015 and available on GitHub. The application runs on Linux, which I needed as the screen is at an odd resolution so the Microchip calibration tool will not work for the display. I was able to get Windows to use the display, when connected through HDMI, but was unable to get the correct resolution for calibration.

The rpi-AR1100 application provided on GitHub does the trick but I did have an issue that I needed to work through first. It took a few days of looking through the Microchip datasheet and walking through the code to determine that it was a timeout issue with reading/recognizing the calibration points being touched.

Issue Prior to Calibration

Before Calibrating the screen, the touch did not track to the edges of the screen. It was fine in the middle of the screen but as you got out to the edges, the pointer was not tracking and would not reach to the edges of the screen. Below is an image with a red rectangle showing the approximate bounds of the touch area prior to calibration.

Rectangle showing perimeter of the pointer boundary prior to calibration

The AR1100 works well once it is calibrated. If you calibrate it on the Raspberry Pi using Tom’s rpi-AR1100 utility on GitHub and find that the calibration is not responding to touches, you may need to edit line 185 in AR1100.cpp by changing the timeout parameter passed to the read_data function. I made the following edit to get it working on the Raspberry Pi Zero W.

Changed AR1100.cpp line 185
FROM: int result = read_data((unsigned char *) & response, sizeof(response), & bytes_read, 5);
TO: int result = read_data((unsigned char *) & response, sizeof(response), & bytes_read, 50);

UPDATE: Tom has made this change to the code in his repository. If you find that the application is not responding when touching the screen, you may need to increase this value.

Hope this helps you if you are working with the Microchip AR1100.
BTW: I’m using the Adafruit Resistive Touch Screen to USB Mouse Controller – AR1100, product number 1580.

Categories
Raspberry Pi

Raspberry Pi 4 – 19″ Rack with four units

Source Files are located on GitHub at https://github.com/richteel/pi_status.

The inspiration for this project is from a UCTRONICS Pi Rack that Jeff Geerling reviewed on his YouTube channel. The UTRONICS product may be seen at https://www.uctronics.com/cluster-and-rack-mount/for-raspberry-pi/1u-rack-mount/uctronics-pi-rack-pro-for-raspberry-pi-4b-19-1u-rack-mount-support-for-4-2-5-ssds.html. While I cannot build something as elegant as the UCTRONICS Pi Rack, I wanted to do something similar. I had a 1U ABS 19″ Rack Mount Case, so I decided to replicate the UCTRONICS product. Below is some information on my build.

Materials

Notes

  • Source and product pages are representative of items. Materials may be sourced from other vendors such as Adafruit, Digi-Key, Mouser, etc.
  • Currently (October 2022), Raspberry Pi boards are difficult to source. The situation should improve shortly. It is recommended that you use Raspberry Pi boards that you currently have or wait until they are available at approved vendors such as PiShop.us, Adafruit, Digi-Key, SparkFun, etc. You may be able to get a Raspberry Pi 4 at Amazon but it will be nearly triple the retail price. Below is the Amazon listing for a Raspberry Pi 4 with 4GB of RAM at $149.90 verses the retail price of $55 US.
Raspberry Pi listing on Amazon

You may find official retailers with Raspberry Pi boards in stock by going to https://rpilocator.com/.

Tools and Prerequisites

  • Laser Cutter or hand tools for cutting mounting and front plates
  • Ethernet Switch/Hub with PoE capability if using PoE+ Hat. If you plan to use PoE, your switch must support the IEEE 802.3at standard. (See Jeff Geerling’s video Review: Raspberry Pi’s new PoE+ HAT)

Laser Cutting Files

Download the files from GitHub at https://github.com/richteel/pi_status.

There are two files located in the case folder for use with a laser cutter. The front panel will be having some changes shortly so be warned if you decide to use it that it will not fit properly. I had only 1/8″ material so it is smaller to fit the case for testing. I now have 1/16″ stock and will be modifying the file for the 1/16″ material to fit properly in the case. I will also modify the notch for the USB to SATA adapter cable. I’m considering running them on top of the mounting plate rather than under it as it is not a good fit. If I do that, I may move the SD Card slot back to the center to avoid running it over a mounting hole.

The base was made with 1/8″ draftboard. The outline for the Raspberry Pi’s were scored while the rest was cut.

Glowforge Application – Mounting Plate
Glowforge Application – Front Panel

Assembly

The following directions utilize an unsupported method for mounting the PoE Hat. The PoE Hat should be mounted with the provided 10mm standoffs to provide a solid connection to the Raspberry Pi. Using the 11mm standoffs reduces the mating area but provides more contact area to allow a male header to make connection with the GPIO pins through the top of the PoE Hat. If you have a 2U case, it would be best to utilize the recommended 4 & 40 Pin Extra Tall Header (Push Fit Version) – POE HAT Set and a perfboard to make the GPIO connections. I attempted this setup but was unable to make it fit in the 1U case. That explains why UCTRONICS uses pogo pins on the bottom of the Raspberry Pi to make the GPIO Connections.

  1. Once the mounting and front plates are cut, the assembly may begin. The M2.5*5+5mm Male-Female Standoffs are secured to the mounting plate with M2.5 nuts for the Raspberry Pi mounts.
  2. The plastic housings for the Micro SD to Micro SD Card Extension Cables are removed and are secured to the mounting plate with the double sided tape provided. Make certain to line them up with the front plate and make certain that they are flush or extend slightly from the front plate.
  3. Once the standoffs and Micro SD Card Extension Cables are mounted, secure the mounting plate to the case with the 6#32*6BM or similar screws. You will not be able to put a screw under the second Raspberry Pi from the right as the Micro SD Extension Cable passes over the mounting point. I did not place any screws under either Raspberry Pi.
  4. Secure the Raspberry Pi boards to the mounting plate with the M2.5*11+6mm Male-Female Standoffs.
  5. Plug the Raspberry Pi PoE+ HATs into each Raspberry Pi and secure with the M2.5*5mm Screws.
  6. Secure the M2*4+3mm Male-Female Standoffs to the front plate with the M2*4mm Screws for mounting the displays.
  7. It is recommended to use MX1.25-4P Male & Female connectors to connect the switches to the 2×7 Header as the switches cannot be removed easily if not used. If you will not use the connectors, mount the switches to the front panel.
    Solder wires to the push-button switches.
  8. Solder wires to the OLED displays.
  9. Solder the wires to the 2×7 2.54mm Double Row Male Header. Refer to the diagram below. It is recommended to use a perfboard or heat-shrink to prevent accidental shorts.
  10. Once all the wires are soldered, mount the displays on the front panel with the M2 Nuts.
  11. Mount the push-button switches and plug the switches into the connectors if the connectors were used.
  12. Mount the front panel into the case.
  13. Spread the 2×7 male header pins apart slightly to provide a better connection when inserting through the top of the PoE Hat.
  14. Carefully plug the 2×7 male header into the PoE Hat. Make certain that you pay attention to the orientation. It is easier if you place the inside row into the PoE Hat then work the outside row into the PoE Hat.
  15. Double check that all connections are correct and all the screws, nuts, and standoffs are tight.
  16. Do not close the case yet! You need to test each Raspberry Pi first as it is likely that one or more of the pins on the 2×7 header will not be making contact with the GPIO pins so you will need to spread some pins apart a bit more to make good contact. It is also possible that one or more PoE hats will not make good contact with the Pi so that the fan will not run when the Raspberry Pi gets hot. You will need to check that everything on all Raspberry Pi boards are working before closing up the case.
  17. Once everything is working, you may close the case.
Wiring Pinout for the Front Panel and Button

Below are a few photos of the build.

Header Pins Spread Apart
Showing wiring using a perfboard for the 2×7 male header.
Mounting Plate with one Raspberry Pi mounted. (The screw under the 3rd Raspberry Pi was not installed in the final build.)
Installation showing SSD Drives installed.

Software Installation

Follow the steps in the README.md file in the GitHub repository to install the pi_status software on each Raspberry Pi.

Testing and Troubleshooting

No Power to the Raspberry Pi

  • Check if the PoE Hat has power.
    • Is the Red LED lit on the PoE Hat? – No
      • Does the network switch provide PoE+ (IEEE 802.3at standard)?
      • Is the switch port that the Raspberry Pi is connected to provide PoE+? (Some switches supply PoE+ to some but not all ports.)
      • Try another ethernet cable to see if that is the problem. Make certain that there are 4 pairs in the cable as all 8 wires are needed for PoE.
    • Is the Red LED lit on the PoE Hat? – Yes
      • Attempt to reseat the PoE Hat.
      • Unplug the 2×7 male header to see if there is a fault causing a short.

Raspberry Pi boots but the fan does not run when the Raspberry Pi is over 50C

  • Attempt to reseat the PoE Hat.
  • Unplug the 2×7 male header to see if there is a fault causing the issue.

Display does not work at all

  • From a Terminal Window, connect to the Raspberry Pi and run i2cdetect to see if device 3c is found.
    i2cdetect -y 1
  • Device 3c is found – No
    • Remove the 2×7 male header and spread apart the pins a bit more or if not all pins are spread apart the same, spread the pins that are closer together apart further until they are all spread apart the same distance. Most likely the issue will be with pins 1 through 6 so concentrate your effort on those pins.
    • Check for cold/bad solder connections on the display lines.
  • Device 3c is found – Yes
    • Make certain that the script is running. Run the following command to get the pid of the running script. If no pid is returned, then the script is not running.
      ps ax | grep ‘code.py’ | grep -v grep
    • If the script is not running, try to run it again.
      sh /home/pi/pi_status/display/launcher.sh -v
    • Check the error log to see if any errors were logged.
      cat /home/pi/pi_status/display/logs/error.txt
      or
      sudo tail -f /home/pi/pi_status/display/logs/error.txt

Display is garbled or stops working

  • Most likely, the display wires are too close to the transformer on the PoE Hat. Move the display wires so they are not close to the transformer and restart the script.
  • Double check that Display SDA is connected to the Raspberry Pi SDA and the Display SCL is connected to the Raspberry Pi SCL.
  • Check for cold/bad solder connections on the display lines.

LED on the switch is not lit and/or switch does not shutdown the Raspberry Pi

  • Remove the 2×7 male header and spread apart the pins a bit more or if not all pins are spread apart the same, spread the pins that are closer together apart further until they are all spread apart the same distance. Most likely the issue will be with pins 7 through 14 so concentrate your effort on those pins.
  • Check for cold/bad solder connections on the switch wires.
  • Make certain that the switch and LED are connected to the correct GPIO pins on the Raspberry Pi.

Going Further

Once everything is working as expected, you can set up the Raspberry Pi boards to boot from SSD instead of the Micro SD Card. Below is a list of high-level steps that I followed to boot from the SSD Drives.

Steps from https://www.tomshardware.com/reviews/raspberry-pi-headless-setup-how-to,6028.html to setup a headless Raspberry Pi.

Raspberry Pi Imager

  • Choose OS button
    • Select your OS (Pi 4)
      • Raspberry Pi OS (other)
        • Raspberry Pi OS (64-bit)
  • Choose Storage
  • Click the settings button or hit CTRL + Shift + X to bring up the settings menu
    • Set Hostname
    • Enable SSH
    • Set username and password
    • Set Wi-Fi network SSID, password, & country
    • Set Locale
    • Click Save
  • Choose Write

Enabling I2C & VNC

  • Open SSH Session
  • sudo raspi-config
    • Select Interfacing Options
      • Select I2C
        • Turn on the option
    • Select Interfacing Options
      • Select VNC
        • Turn on the option, then exit

Steps from https://github.com/richteel/pi_status to setup the display and button.

Setup Display and Button

  • Open SSH Session
    • sudo apt-get update
    • sudo apt-get upgrade
      * May want to reboot if updates were applied that require reboot
    • sudo pip3 install adafruit-blinka
    • sudo pip3 install adafruit-circuitpython-ssd1306
    • git clone https://github.com/richteel/pi_status.git
    • sudo crontab -e
    • Add the following line to the end of the file
      @reboot sh /home/pi/pi_status/display/launcher.sh
    • Reboot to make certain that the script starts at boot
      • sudo reboot now

Steps from https://www.tomshardware.com/how-to/boot-raspberry-pi-4-usb to boot from USB.

Allow booting from USB

  • Boot Raspberry Pi from SD Card
  • Open VNC to machine and use the SD Card Copier to copy SD Card to USB Drive
  • Open SSH Session
  • sudo raspi-config
    • Select Advanced Options
      • Select Boot Order
        • Select USB Boot
  • Shutdown the Raspberry Pi
    • sudo shutdown now
  • Remove the SD Card and restart the Raspberry Pi
Categories
Psion Raspberry Pi Pico

Re-creation of Psion Organiser II

In 1984, Psion launched the first practical pocket computer, the Psion Organiser I. Psion followed up with the Psion Organiser II.

Andrew Menadue has a project which recreates the Psion Organiser II with the Raspberry Pi Pico and ESP32-WROOM-32. He has several videos on YouTube and some GitHub repositories. Andrew was nice enough to send me a set of boards, which I’m in the process of building.

Bill of Materials

The bill of materials is an Excel document located on GitHub.

Power Supply

Categories
Raspberry Pi Pico

Armachat

I have been working on the Armachat project by Peter Misenko. I rewrote the code to implement functions that Peter had not completed and added a few more. Some of the added features include:

  • Implemented detection of a long keypress
  • Dedicated keys when not in the editor
    • Q – Toggle the keyboard backlight
    • A – Toggle the display backlight
    • V – Increase volume / Long keypress to decrease volume
    • B – Increase display brightness / Long keypress to decrease display brightness
  • Ability to receive messages in all screens including editor
  • Validation of editor input
  • Confirmation prompts

I have been working on an issue with editor text input. The display update procedure takes 400 to 500 milliseconds which causes an issue as keypresses are dropped when typing quickly. Initially it was taking nearly 1 second to update the screen so some improvement has been made but it is still not good enough. I continue to work on improving the screen draw time and may deploy a few things to allow all keys to be detected and handled.

Another area for improvement is the long keypress detection. I noticed that removing the long keypress detection speed up the code enough to catch all key presses however the added functionality that the long keypress provides is too much to ignore.

GitHub locations for Peter’s code and my rewrite.

Categories
Raspberry Pi

SainSmart 2.8″ TFT LCD Display Touch Screen on Raspberry Pi

I have a SainSmart 2.8″ TFT LCD Display Touch Screen a couple of years ago from MicroCenter. I want to use it on the Raspberry Pi and was surprised that no one has posted how to do this. I looked into this a bit and it looks like it should be easy enough. One of the things that throws folks off is the display is 16 bit verses 8 bit that is typically used on these displays. You can still use them with only 8 bits of data. Unfortunately SainSmart does not provide information on their product pages to allow their products to be used with anything other that their adapters or other products.

Here are some useful links that will be used in this writeup.

  1. Product Page for SainSmart 2.8″ TFT LCD Display Touch Screen
  2. Discussion page on Raspberry Pi Forum
  3. Zip file mentioned in the Raspberry Pi Forum post by M15H
  4. Posts on Adafruit’s Leaning site
LCDRaspberry Pi
PinFunctionPinFunction
1GND6, 9, 14, 20, 25, 30, 34, 39GND
2VCC1, 173V3
3NC  
4RS12GPIO 18
5WR11GPIO 17
6RD 1, 173V3
7DB815GPIO 22
8DB916GPIO 23
9DB1018GPIO 24
10DB1119GPIO 10
11DB1222GPIO 25
12DB1321GPIO 9
13DB1423GPIO 11
14DB1524GPIO 8
15CS7GPIO 4
16F_CS  
17RESET26GPIO 7
18NC  
19LED-A1, 173V3
20NC  
21DB06, 9, 14, 20, 25, 30, 34, 39GND
22DB16, 9, 14, 20, 25, 30, 34, 39GND
23DB26, 9, 14, 20, 25, 30, 34, 39GND
24DB36, 9, 14, 20, 25, 30, 34, 39GND
25DB46, 9, 14, 20, 25, 30, 34, 39GND
26DB56, 9, 14, 20, 25, 30, 34, 39GND
27DB66, 9, 14, 20, 25, 30, 34, 39GND
28DB76, 9, 14, 20, 25, 30, 34, 39GND
29D_CLK-23- -GPIO 11-
30D_CS-26--GPIO 7-
31D_DIN-19--GPIO 10-
32D_BUSY  
33D_OUT-21--GPIO 9-
34D_Penirq  
35SD_OUT(F_SI)  
36SD_SCLK(F_SCK)  
37SD_DIN(F_SO)  
38SD_CS  
39F_WP  
40F_HOLD  
Raspberry Pi Pinouts
Raspberry Pi Pinouts (https://www.raspberrypi.org/)

ILI9325

http://www.anya.bagge.no/hacks/2018/02/17/tft-panel/

https://www.raspberry-pi-geek.com/Archive/2014/07/TFT-touchscreens-for-the-Raspberry-Pi

https://www.raspberrypi.org/forums/viewtopic.php?t=208264

Categories
Raspberry Pi

Pipboy 3000

OVERVIEW

My daughter wanted to cosplay as a character from Fallout 3 for Awesomecon 2018 in Washington D.C. We found Noe and Pedro Ruiz’s design on learn.adafruit.com 1 and decided to build it. She decided do this cosplay a few days before the event so it was going to be a challenge to complete it in time but we did it.

I thought getting the electronics in time was going to be the biggest challenge but the biggest challenge was reducing the time for the 3D prints. We started on Sunday and did not finish until Wednesday afternoon. (We did not print continuously so the overall print time was less but not by much.) Noe and Pedro have some tips on reducing print time and they worked in combination with tweaking the infill and layer height.

3D PRINTING

My 3D printer is the XYZprinting daVinci 1.0. The printer is a few years old now and is not the best 3D printer by far but it does a fair job. The printer only supports ABS fulfillment and XYZprinting filament cartridges. I have yet to take time to change the head to support PLA or hack the firmware so I can use other filaments. This limits me to the colors of filament that I may use in the printer. We looked for a brown or green filament to use for the Pipboy but did not find any to my daughter’s liking. We decided to print it in white and spray paint it. We found some metallic paint which seemed to work well. Additionally, we printed the screen visor in black and the LED diffuser in natural.

As a side note, I started using Simplify3D Slicing Software with the printer and it has made a world of difference with the print quality and control of the printer. The prints come out much closer to the designed measurements than the XYZprinting software could accomplish. The software gives more options than the XYZprinting software which really came in handy for this project. Noe and Pedro recommend removing some of the supports for the armband and base-main pieces. The XYZprinting software is all or nothing regarding supports but the Simplify3D software allowed me to remove some supports while leaving others in place.

HARDWARE

Noe and Pedro do a good job in the write-up but as with most build instructions, a few things are left out or are not clear. Here are a few notes that I made along the way but it is not a complete list as we were under a very restrict time constraint to get this project done. Unfortunately that means take notes and documenting issues was not a priority.

Additional Materials needed but not listed in the materials list in the overview.

  • Electronic Parts & Components
  • Tools & Supplies
    • (Optional) Hot Glue and Hot Glue Gun
    • Adhesive foam such as weatherstripping for doors and windows

Below are the connections to the 3.5″ LCD Shield that were used in our build.

PypBoy Function Pin Pin Function PypBoy
LED + 3V3 1 2 5V  
ENC A GPIO2 3 4 5V PB 1000C +
ENC B GPIO3 5 6 GND PB 1000C –
ROT 1 GPIO4 7 8 GPIO14 ENC SW
LED – GND 9 10 GPIO15  
ROT 2 GPIO17 11 12 GPIO18  
ROT 3 GPIO27 13 14 GND ROT –
ROT 4 GPIO22 15 16 GPIO23 ROT 5
  3V3 17 18 GPIO24  
  GPIO10 19 20 GND  
  GPIO9 21 22 GPIO25  
  GPIO11 23 24 GPIO8  
ENC – GND 25 26 GPIO7  

SOFTWARE

We made a few tweaks to the software but they were to change the map and display some different text on some screens and adding some missing code to change other displayed text. I plan to post those minor changes in a future post. The more major changes implemented were to get the pypboy program to launch on start and wire up the rotary encoder so we can safely shutdown the Raspberry Pi.

The shutdown code was modified from Inderpreet Singh’s code on Element14’s website2.

REFERENCES

  1. Noe and Pedro’s writeup on learn.adafruit.com: https://learn.adafruit.com/raspberry-pi-pipboy-3000
  2. Inderpreet Singh’s Shutdown Code on Element14’s site: https://www.element14.com/community/docs/DOC-78055/l/adding-a-shutdown-button-to-the-raspberry-pi-b