K-0592

From 52Pi Wiki
Jump to navigation Jump to search

Mini Tower UPS Kit

K-0592-主.png

Description

This is a 3D printed Case for Raspberry Pi 4B and UPS PLUS. The material of case is made of PLA, and the side is made of transparent acrylic material. Ice tower cooler can be placed into the case with Raspberry Pi 4B and UPS Plus. The 0.96 inch OLED screen provided in kit can display the running status of Raspberry Pi or UPS Plus through programming.

 Note: Since the case is printed by FDM 3D printer and is made of PLA material, the surface of the case will have a little roughness, which is normal and does not affect the use. If necessary, you can polish it by yourself.
 Raspberry Pi 4B does not include in the package!!

Features

  • Support Raspberry Pi 4B only
  • Easy to assemble
  • Support OLED display
  • Support UPS Plus integration
  • Support ICE Tower Cooler integration
  • Good appearance
  • Compact mini

Gallery

  • Product Outlook
K-0592-主.png


  • New Features
K-0592-0.96.jpg


  • Definition of Ports
K-0592-2.jpg


  • UPS Plus
K-0592-ups.jpg


Package Includes

  • 1 x 3D printing Case
  • 2 x Acrylic side panel
  • 2 x 0.96 inch OLED Display and jumper wires
  • 1 x UPS Plus Module with screws and copper pillars
  • 1 x Low profile Ice tower cooler kit

How to assemble

  • 1. Fix the copper pillar to 3D printing case.
  • 2. Fix UPS Plus with short copper pillar.
  • 3. Fix Raspberry Pi 4B with short copper pillar and make sure the pogopin is against to the GPIO Pin.
  • 4. Fix the metal bracket of low profile ice tower cooler with M2.5 screws.
  • 5. Fix low profile ice tower cooler to Raspberry Pi with M2.5 screws.
  • 6. Fix 0.96 inch OLED display to the case with glue gun or tape, and connect the pins to GPIO according to the wiki's circuit diagram.
  • 7. Fix two side with acrylic panel with screws.
  • 8. You can also fix the fan to the arcrylic panel on the side.
K-0592安装.jpg


K-0592安装2.jpg


How to enable display

Documentations

How to display UPS information on OLED

  • 1.Make sure OLED display has been connected to Raspberry Pi on GPIO properly.
 check if the OLED screen is detected by Raspberry Pi via using following command in terminal: `i2cdetect -y 1` 
  • 2.Enable `I2C function` by using `sudo raspi-config` command, and navigate to `interface options` -> `I2C` -> `Enable` -> `YES`.
  • 3.Make sure Raspberry Pi has been connected to internet.
  • 4.Install dependents package via following commands:
sudo usermod -a -G i2c,spi,gpio pi
sudo apt install python-dev python-pip libfreetype6-dev libjpeg-dev build-essential
sudo apt install libsdl-dev libportmidi-dev libsdl-ttf2.0-dev libsdl-mixer1.2-dev libsdl-image1.2-dev
sudo -H pip3 install psutil
sudo -H pip3 install pi-ina219
sudo -H pip3 install Pillow
  • Log out and in again and clone this repository:
git clone https://github.com/rm-hull/luma.examples.git
cd luma.examples
  • Finally, install the luma libraries using:
sudo -H pip3 install -e . 
  • Change directory to `luma.examples/examples`
cd luma.examples/examples/
  • Backup `sys_info.py` file.
 cp sys_info.py sys_info.py.bak 

If UPS Plus is Connected

  • Modify `sys_info.py` file as following code, this is just a demo code, you can modify it as you want:
import os
import sys
import time
from pathlib import Path
from datetime import datetime
import smbus2
from ina219 import INA219, DeviceRangeError

if os.name != 'posix':
    sys.exit('{} platform not supported'.format(os.name))

from demo_opts import get_device
from luma.core.render import canvas
from PIL import ImageFont

try:
    import psutil
except ImportError:
    print("The psutil library was not found. Run 'sudo -H pip install psutil' to install it.")
    sys.exit()

# setting up configuration of UPS device.
DEVICE_BUS = 1
DEVICE_ADDR = 0x17
PROTECT_VOLT = 3700
SAMPLE_TIME = 2

# initializing an instance of ina_supply. 
ina_supply = INA219(0.00725, address=0x40)
ina_supply.configure()
supply_voltage = ina_supply.voltage()
supply_current = ina_supply.current()
supply_power = ina_supply.power()

# initializing instance of batteries status.
ina_batt = INA219(0.005, address=0x45)
ina_batt.configure()
batt_voltage = ina_batt.voltage()
batt_current = ina_batt.current()
batt_power = ina_batt.power()

# initializing an I2C bus.
bus = smbus2.SMBus(DEVICE_BUS)

# functions 
def bytes2human(n):
    """
    >>> bytes2human(10000)
    '9K'
    >>> bytes2human(100001221)
    '95M'
    """
    symbols = ('K', 'M', 'G', 'T', 'P', 'E', 'Z', 'Y')
    prefix = {}
    for i, s in enumerate(symbols):
        prefix[s] = 1 << (i + 1) * 10
    for s in reversed(symbols):
        if n >= prefix[s]:
            value = int(float(n) / prefix[s])
            return '%s%s' % (value, s)
    return "%sB" % n

# display cpu usage.
def cpu_usage():
    # load average, uptime
    uptime = datetime.now() - datetime.fromtimestamp(psutil.boot_time())
    av1, av2, av3 = os.getloadavg()
    return "Ld:%.1f %.1f %.1f Up: %s" \
        % (av1, av2, av3, str(uptime).split('.')[0])

# display memory usage.
def mem_usage():
    usage = psutil.virtual_memory()
    return "Mem: %s %.0f%%" \
        % (bytes2human(usage.used), 100 - usage.percent)

# display disk usage.
def disk_usage(dir):
    usage = psutil.disk_usage(dir)
    return "SD:  %s %.0f%%" \
        % (bytes2human(usage.used), usage.percent)

# display network status.
def network(iface):
    stat = psutil.net_io_counters(pernic=True)[iface]
    return "%s: Tx%s, Rx%s" % \
           (iface, bytes2human(stat.bytes_sent), bytes2human(stat.bytes_recv))

# draw status on OLED screen.
def stats(device):
    # use custom font
    font_path = str(Path(__file__).resolve().parent.joinpath('fonts', 'C&C Red Alert [INET].ttf'))
    font2 = ImageFont.truetype(font_path, 12)

    with canvas(device) as draw:
        draw.text((0, 0), cpu_usage(), font=font2, fill="white")
        if device.height >= 32:
            draw.text((0, 14), mem_usage(), font=font2, fill="white")

        if device.height >= 64:
            draw.text((0, 26), disk_usage('/'), font=font2, fill="white")
            try:
                draw.text((0, 38), network('wlan0'), font=font2, fill="white")
            except KeyError:
                # no wifi enabled/available
                pass

# display charging port status.
def chrg_port():
    aReceivedBuf = []
    aReceivedBuf.append(0x00)
    for i in range(1, 255):
        aReceivedBuf.append(bus.read_byte_data(DEVICE_ADDR, i))

    if (aReceivedBuf[8] << 8 | aReceivedBuf[7]) > 4000:
        charge_port = 'Charging via TYPE-C'
    elif (aReceivedBuf[10] << 8 | aReceivedBuf[9]) > 4000:
        charge_port = 'Charging via MicroUSB'
    else:
        charge_port = 'Not Charging'
    return "CP: %s" % charge_port

# display batteries current status.
def batt_cur():
    aReceivedBuf = []
    aReceivedBuf.append(0x00)
    for i in range(1, 255):
        aReceivedBuf.append(bus.read_byte_data(DEVICE_ADDR, i))
    chrg_rate = ina_batt.current()
    return "Bat Current: %.3f mA" % chrg_rate

# display batteries capacity status.
def batt_cap():
    aReceivedBuf = []
    aReceivedBuf.append(0x00)
    for i in range(1, 255):
        aReceivedBuf.append(bus.read_byte_data(DEVICE_ADDR, i))
    capacity = (aReceivedBuf[20] << 8 | aReceivedBuf[19])
    return "Bat Capacity: %d%%"% capacity

# display full batteries voltage status.
def full_bat():
    aReceivedBuf = []
    aReceivedBuf.append(0x00)
    for i in range(1, 255):
        aReceivedBuf.append(bus.read_byte_data(DEVICE_ADDR, i))
    full_batt = (aReceivedBuf[14] << 8 | aReceivedBuf[13])
    return "Full Bat Voltage: %d mV" % full_batt

# display UPS status infor on OLED screen.
def ups_status(device):
    # use custom font
    font_path = str(Path(__file__).resolve().parent.joinpath('fonts', 'C&C Red Alert [INET].ttf'))
    font2 = ImageFont.truetype(font_path, 12)

    with canvas(device) as draw:
        draw.text((0, 0), full_bat(), font=font2, fill="white")
        if device.height >= 32:
            draw.text((0, 14), batt_cap(), font=font2, fill="white")

        if device.height >= 64:
            draw.text((0, 26), chrg_port(), font=font2, fill="white")
            try:
                draw.text((0, 38), batt_cur(), font=font2, fill="white")
            except KeyError:
                # no wifi enabled/available
                pass

# define mainloop. 
def main():
    while True:
        stats(device)
        time.sleep(5)
        ups_status(device)
        time.sleep(5)

if __name__ == "__main__":
    try:
        device = get_device()
        main()
    except KeyboardInterrupt:
        pass
  • Execute it.
python3 sys_info.py

If running OLED 0.96 without UPS PLUS

  • Please create a new file named: `oled.py`
  • Copy and paste following demo code to test if it work properly

Keywords

  • Mini Tower UPS Kit, UPS case, ice tower case, case for raspberry pi 4B.