K-0592
Jump to navigation
Jump to search
Mini Tower UPS Kit
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
- New Features
- Definition of Ports
- UPS Plus
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.
How to enable display
- Please refer to this URL: [ https://wiki.52pi.com/index.php/0.96_Inch_OLED_Module_SKU:_S-0005 ]
- There are tutorials on below.
Documentations
- SSD1306 Datasheet:File:SSD1306-Revision 1.0.pdf
- Mechanical Drawing:File:0.96inch Mechanical Drawing.pdf
- UPS Plus: [ https://wiki.52pi.com/index.php/UPS_Plus_SKU:_EP-0136 ]
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`
- Install psutil library
sudo -H pip3 install psutil
- Create a file named `ssd1306.py`
import smbus2 class ssd1306(object): DISPLAYOFF = 0xAE DISPLAYON = 0xAF DISPLAYALLON = 0xA5 DISPLAYALLON_RESUME = 0xA4 NORMALDISPLAY = 0xA6 INVERTDISPLAY = 0xA7 SETREMAP = 0xA0 SETMULTIPLEX = 0xA8 SETCONTRAST = 0x81 CHARGEPUMP = 0x8D COLUMNADDR = 0x21 COMSCANDEC = 0xC8 COMSCANINC = 0xC0 EXTERNALVCC = 0x1 MEMORYMODE = 0x20 PAGEADDR = 0x22 SETCOMPINS = 0xDA SETDISPLAYCLOCKDIV = 0xD5 SETDISPLAYOFFSET = 0xD3 SETHIGHCOLUMN = 0x10 SETLOWCOLUMN = 0x00 SETPRECHARGE = 0xD9 SETSEGMENTREMAP = 0xA1 SETSTARTLINE = 0x40 SETVCOMDETECT = 0xDB SWITCHCAPVCC = 0x2 class i2c(object): def __init__(self, bus=1, address=0x3c): self.send_cmd = 0x00 self.send_data = 0x40 try: self.addr = int(str(address), 0) except ValueError: raise "I2C device address invalid" try: self.bus = smbus2.SMBus(bus) except (IOError, OSError) as e: raise "I2C device not found" def command(self, *cmd): assert(len(cmd) <=32) try: self.bus.write_i2c_block_data(self.addr, self.send_cmd, list(cmd)) except (IOError, OSError) as e: raise "I2C device not found on address: 0x{0:02X}".format(self.addr) def data(self, data): block_size = 32 write = self.write_block i = 0 n = len(data) while i < n: write(list(data[i:i + block_size])) i += block_size def write_block(self, data): assert len(data) <= 32 self.bus.write_i2c_block_data(self.addr, self.send_data, data) def cleanup(self): self.bus.close() def show(self): self.command(self.const.DISPLAYON) def hide(self): self.command(self.const.DISPLAYOFF)
- 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.