Hallo.
Vor kurzem bin ich Yukari, der auch ein LED-Shop im professionellen Bereich ist. Nun, nach der neuesten Mode. Oiler wollte auch "den PC mit einer LED zum Leuchten bringen". Ich habe es versucht.
In solch einer Situation!
Es ist in Ordnung, wenn Sie Materialien sammeln, die die folgenden Bedingungen erfüllen, und dies mit Topfalchemie tun.
――Ein Fall, in dem Sie LEDs hineinstecken und die LEDs von außen sehen können.
Nun, ich suchte nach einem Koffer mit einer "Glas- oder Acrylfront". Ich habe einen Fall von NZXTs H510i Elite gemacht. Nun, eine einfache Wasserkühlung namens "kraken M22" wurde eingeführt, damit die Abwärme der CPU abgeführt werden konnte.
Abhängig von der Größe der Knospe gibt es mehrere Arten von "HUB75-Vollfarbmatrix-LEDs", die heutzutage beliebt sind. Die Zahl nach dem "P" in der Modellnummer entspricht der Größe der Krempe. Das diesmal ausgewählte Gehäuse scheint in der Lage zu sein, zwei Lüfter von 12 cm bis 14 cm auf der Vorderseite zu halten. Wählen Sie eine Größe, die so aussieht.
Wenn es sich beispielsweise um 32 x 64 P5 handelt, ist die Größe "16 cm x 32 cm", was etwas groß ist. Wenn Sie die typische Auflösung und Größe tabellieren, sieht es so aus.
Tonhöhe | Größe | Größe |
---|---|---|
P2 | 64x128 | 12.8cm x 25.6cm |
P2.5 | 32x64 | 8.0cm x 16.0cm |
P3 | 32x64 | 9.6cm x 19.2cm |
P4 | 32x64 | 12.8cm x 25.6cm |
P5 | 32x64 | 16.0cm x 32.0cm |
P6.67 | 32x64 | 21.3cm x 42.6cm |
Nun, diesmal habe ich mich für das Top "P2 64x128" entschieden. Vielleicht macht es mehr Spaß, eine Lösung zu haben. Wenn die kurze Seite 64 Punkte oder mehr beträgt, besteht eine hohe Wahrscheinlichkeit, dass die Adresszeile "E" erforderlich ist. Bitte seien Sie vorsichtig bei der Auswahl der Karte, die später beschrieben wird.
Verwenden Sie den Raspberry Pi, um ihn zum Leuchten zu bringen.
Dieses Mal habe ich "Raspberry Pi4 4GB" gewählt. Der Fall ist angemessen, aber da GPIO verwendet wird, ist der offizielle Fall streng.
Als nächstes kommt die LED-Schnittstellenkarte. Diesmal entschied ich mich für das alte Adafruit-Brett, das ich übrig hatte.
Jedoch! Die folgenden zwei Änderungen sind erforderlich.
Wenn man sich auf diese Beschreibung bezieht, fühlt es sich an, als würde man zwei Linien und einen Schnitt hinzufügen. Es gibt zwei Muster der Adress-E-Leitung. Überprüfen Sie daher zuerst mit einem Tester usw., welches Panel Sie verwenden. Die nicht verwendete Adresse E fällt auf GND.
https://github.com/hzeller/rpi-rgb-led-matrix
Die Verkabelung ist ordnungsgemäß mit Polyimid befestigt.
Zunächst sieht die Vorderseite so aus.
Die Rückseite ist mit M3-Schrauben am Steg des 12-cm-Lüfters befestigt.
Es wird so aussehen, wenn Sie es einfügen.
Das allein ist einsam, also habe ich auch eine LED auf den Boden gelegt.
Dieser Typ ist mit Magneten und Halterungen an den vier Ecken befestigt.
Dieser Magnet wird im LED-Shop neben Sengoku Densho in Akihabara, Benribenri, verkauft.
https://www.akiba-led.jp/product/1197
Die LED verbindet die untere LED mit dem Raspeltorte und verbindet sich dann mit einer Kette mit der vorderen LED. Dies ist lediglich eine Verkabelung.
Die Stromversorgung erfolgt über SATA. Nun, es ist ein langjähriges Versprechen, aber die Stromversorgung für PCs ist im Allgemeinen "gelb: 12 V", "rot: 5 V", "orange: 3,3 V" und "schwarz: GND". Mit RaspberryPi4 und LED scheint es 5A oder mehr zu verwenden, aber es ist in Ordnung, da es sich um ein PC-Netzteil handelt (entsprechend).
Die Schnittstelle zwischen Raspberry Pi und PC verwendet LAN. Die PC-Seite ist USB LAN. Verwenden Sie für USB den Konvertierungsanschluss für das Gehäuse aus der Kopfzeile des Motherboards.
Die Verbindung um den Raspberry Pi sieht so aus.
Schieben Sie danach den Raspeltorte in die Lücke hinter dem Netzteil des H510i Elite, und der Vorgang ist abgeschlossen.
Nun, mit anderen Worten, dieser PC. Es ist ein "Dual Configuration PC", der in zwei Umgebungen lebt. Von außen sieht es aus wie ein normaler PC.
Die Rückseite ist auch ein gewöhnlicher PC.
Es wird nicht mit dem echten NZXT-Steuermechanismus "HUE2" gewettet.
Während die Dinge bis zu diesem Punkt gehalten werden, ist es "keine Änderung des Falles".
Auf der PC-Seite ist eine Überwachungssoftware erforderlich. Dieses Mal habe ich "Open Hardware Monitor" verwendet. Diese Software verfügt über eine Webserverfunktion, sodass ich die Situation von außen erfassen kann. Es ist eine Strategie, den JSON für das Rendern auf der Raspeye-Seite zu verwenden. https://forest.watch.impress.co.jp/docs/review/383668.html
Die oben genannte Software unterstützt jedoch nicht die aktuelle Architektur. Eigentlich verwende ich "LibreHardwareMonitor" von Nora Build von der folgenden URL. http://takkun87.blog40.fc2.com/blog-category-6.html
Wenn Sie den Webserver aktivieren, das F / W entsprechend einstellen und den folgenden JSON von außen erhalten, ist dies erfolgreich. http://[IPアドレス]:8085/data.json
Der Inhalt sieht folgendermaßen aus (Teilauszug):
data.json
{
"id": 0,
"Text": "Sensor",
"Min": "Min",
"Value": "Value",
"Max": "Max",
"ImageURL": "",
"Children": [
{
"id": 1,
"Text": "DESKTOP-HOGEHOGE",
"Min": "",
"Value": "",
"Max": "",
"ImageURL": "images_icon/computer.png ",
"Children": [
{
"id": 2,
"Text": "ASRock Z390 Phantom Gaming 6",
"Min": "",
"Value": "",
"Max": "",
"ImageURL": "images_icon/mainboard.png ",
"Children": [
{
"id": 3,
"Text": "Nuvoton NCT6791D",
"Min": "",
"Value": "",
"Max": "",
"ImageURL": "images_icon/chip.png ",
"Children": [
{
"id": 4,
"Text": "Voltages",
"Min": "",
"Value": "",
"Max": "",
"ImageURL": "images_icon/voltage.png ",
"Children": [
{
"id": 5,
"Text": "Vcore",
"Min": "1.392 V",
"Value": "1.392 V",
"Max": "1.408 V",
"SensorId": "/lpc/nct6791d/voltage/0",
"Type": "Voltage",
"ImageURL": "images/transparent.png ",
"Children": []
},
{
"id": 6,
"Text": "Voltage #2",
"Min": "1.680 V",
"Value": "1.688 V",
"Max": "1.688 V",
"SensorId": "/lpc/nct6791d/voltage/1",
"Type": "Voltage",
"ImageURL": "images/transparent.png ",
"Children": []
},
{
"id": 7,
"Text": "AVCC",
"Min": "3.488 V",
"Value": "3.488 V",
"Max": "3.488 V",
"SensorId": "/lpc/nct6791d/voltage/2",
"Type": "Voltage",
"ImageURL": "images/transparent.png ",
"Children": []
},
{
"id": 8,
"Text": "3VCC",
"Min": "3.488 V",
"Value": "3.488 V",
"Max": "3.488 V",
"SensorId": "/lpc/nct6791d/voltage/3",
"Type": "Voltage",
"ImageURL": "images/transparent.png ",
"Children": []
},
{
"id": 9,
"Text": "Voltage #5",
"Min": "1.016 V",
"Value": "1.032 V",
"Max": "1.032 V",
"SensorId": "/lpc/nct6791d/voltage/4",
"Type": "Voltage",
"ImageURL": "images/transparent.png ",
"Children": []
},
{
"id": 10,
"Text": "Voltage #6",
"Min": "1.088 V",
"Value": "1.088 V",
Weisen Sie danach dem USB-LAN und dem Raspeye Ihres PCs eine geeignete lokale IP zu, um die Kommunikation zu sichern.
Was zu tun ist, ist so
Informationen zur Bibliothek für LED-Panels finden Sie unter der folgenden URL. https://qiita.com/eucalyhome/items/e871e297bfd527ccaf2c
Ich habe versucht, "Statusanzeige" und "Lebensspiel (Änderungen der Geschäftigkeit je nach Temperatur)" zu implementieren. Die LEDs sind miteinander verkettet, sodass die ersten 128 Punkte für Lebensspiele und die letzten 128 Punkte für die vertikale Statusanzeige bestimmt sind.
ledstat.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from PIL import Image, ImageDraw, ImageOps, ImageFont, ImageFilter, ImageChops, ImageColor
from rgbmatrix import RGBMatrix, RGBMatrixOptions
import time, re, copy, os, codecs, random, datetime, json
import numpy as np
from scipy import signal
class ledworker(object):
def ledinit(self):
self.options = RGBMatrixOptions()
self.options.hardware_mapping = "adafruit-hat-pwm"
self.options.led_rgb_sequence = "RGB"
self.options.rows = 64
self.options.chain_length = 8
self.options.parallel = 1
self.options.pwm_bits = 11
self.options.brightness = 50
self.options.pwm_lsb_nanoseconds = 130
self.options.gpio_slowdown = 1
self.options.panel_type = "FM6126A"
self.matrix = RGBMatrix(options = self.options)
def ledoutput(self,handle):
self.matrix.SetImage(handle)
def imagenew(self):
imagecolorspace = 'RGB'
imagecolorfill = (0, 0, 80)
imagesizex = 256
imagesizey = 64
image = Image.new(imagecolorspace, (imagesizex, imagesizey), imagecolorfill)
return (image)
class lifeworker(object):
def initstate(self, width, height, init_alive_prob=0.5):
N = width*height
v = np.array(np.random.rand(N) + init_alive_prob, dtype=int)
return v.reshape(height, width)
def addstate(self, F, width, height, init_alive_prob=0.5):
N = width*height
v = np.array(np.random.rand(N) + init_alive_prob, dtype=int).reshape(height, width)
v = F + v
return v
def countneighbor(self, F):
mask = np.ones((3, 3), dtype=int)
return signal.correlate2d(F, mask, mode="same", boundary="wrap")
def nextgeneration(self, F):
N = self.countneighbor(F)
G = (N == 3) + F * (N == 4)
return G
def toimage(self, F):
nparray = np.array(F, dtype=np.uint8)*255
image = Image.fromarray(np.uint8(nparray)).convert("1")
return image
class monitorworker(object):
def getdata(self):
datafile_hwdata = '/ramdisk/hwdata.json'
outdata = {}
outdata['cpuload'] = 0
outdata['cputemp'] = 0
outdata['gpuload'] = 0
outdata['gputemp'] = 0
outdata['cpuclock'] = 0
if not os.path.exists(datafile_hwdata):
return (outdata)
try:
with open(datafile_hwdata) as f:
hwdata = json.load(f)
except:
return (outdata)
for primarykey in hwdata['Children'][0]['Children']:
if 'cpu' in primarykey['ImageURL']:
for secondarykey in primarykey['Children']:
if 'Clocks' in secondarykey['Text']:
for thirdkey in secondarykey['Children']:
if 'CPU Core #1' in thirdkey['Text']:
outdata['cpuclock'] =re.sub("[^0-9\.]","",thirdkey['Value'])
if 'Load' in secondarykey['Text']:
for thirdkey in secondarykey['Children']:
if 'CPU Total' in thirdkey['Text']:
outdata['cpuload'] =re.sub("[^0-9\.]","",thirdkey['Value'])
if 'nvidia' in primarykey['ImageURL']:
for secondarykey in primarykey['Children']:
if 'Temperatures' in secondarykey['Text']:
outdata['gputemp'] = re.sub("[^0-9\.]","",secondarykey['Children'][0]['Value'])
if 'Load' in secondarykey['Text']:
outdata['gpuload'] = re.sub("[^0-9\.]","",secondarykey['Children'][0]['Value'])
if 'mainboard' in primarykey['ImageURL']:
for secondarykey in primarykey['Children'][0]['Children']:
if 'Temperatures' in secondarykey['Text']:
outdata['cputemp'] = re.sub("[^0-9\.]","",secondarykey['Children'][0]['Value'])
outdata['cpuload'] = "{0:5.1f}".format(float(outdata['cpuload']))
outdata['gpuload'] = "{0:5.1f}".format(float(outdata['gpuload']))
outdata['cpuclock'] = "{0:4d}".format(int(outdata['cpuclock']))
return (outdata)
def writetext(draw,hpos,message,color,font):
w, h = draw.textsize(str(message), font)
w = 48 - w
draw.text((w,hpos), str(message), color,font=font)
def main():
led = ledworker()
led.ledinit()
image = led.imagenew()
fontdata = "./GDhwGoJA-OTF112b2.otf"
life = lifeworker()
lifedatablue = life.initstate(128, 64, init_alive_prob=0.08)
lifedatagreen = life.initstate(128, 64, init_alive_prob=0.08)
monitor = monitorworker()
outdata = monitor.getdata()
imagebasel = Image.open('/data/ledstat/nzx_log_w.png').convert("RGB")
imagebasel = imagebasel.transpose(Image.ROTATE_180)
imagebaseh = copy.copy(imagebasel)
imagebaseh = imagebaseh.transpose(Image.ROTATE_90)
imageh = copy.copy(imagebasel)
image = Image.new('RGB', (256, 64), (0, 0, 0))
image.paste(imageh,(128, 0))
imagehtemp = copy.copy(imagebaseh)
draw = ImageDraw.Draw(imagehtemp)
font = ImageFont.truetype(fontdata, 16)
fontsmall = ImageFont.truetype(fontdata, 7)
addcount = 0
while True:
imageblue = life.toimage(lifedatablue)
imagegreen = life.toimage(lifedatagreen)
imagel = copy.copy(imagebasel)
imagel.paste(Image.new("RGB", imagel.size, (0,255,255)), mask=imageblue)
imagel.paste(Image.new("RGB", imagel.size, (0,0,255)), mask=imagegreen)
image.paste(imagel,(128, 0))
led.ledoutput(image)
lifedatablue = life.nextgeneration(lifedatablue)
lifedatagreen = life.nextgeneration(lifedatagreen)
time.sleep(0.05)
addcount = addcount + 1
if addcount > 20:
addcount = 0
outdatatemp = monitor.getdata()
if outdatatemp['cputemp'] != 0:
outdata = outdatatemp
blueseed = (float(outdata['cputemp'])-40) / 200
greenseed = (float(outdata['gputemp'])-40) / 200
if blueseed < 0:
blueseed = 0
if greenseed < 0:
greenseed = 0
lifedatablue = life.addstate(lifedatablue,128, 64, init_alive_prob=blueseed)
lifedatagreen = life.addstate(lifedatagreen,128, 64, init_alive_prob=greenseed)
lifedatablue = life.nextgeneration(lifedatablue)
lifedatagreen = life.nextgeneration(lifedatagreen)
imagehtemp.paste(imagebaseh,(0, 0))
draw.text((0,0), "CPU", (0, 255, 255),font=font)
writetext(draw,16,outdata['cpuload'],(255, 255, 255),font)
draw.text((48,24), "%", (0, 255, 255),font=fontsmall)
writetext(draw,32,outdata['cputemp'],(255, 255, 255),font)
draw.text((48,40), "'C", (0, 255, 255),font=fontsmall)
writetext(draw,48,outdata['cpuclock'],(255, 255, 255),font)
draw.text((48,56), "MHz", (0, 255, 255),font=fontsmall)
draw.text((0,74), "GPU", (0, 0, 255),font=font)
writetext(draw,90,outdata['gpuload'],(255, 255, 255),font)
draw.text((48,98), "%", (0, 0, 255),font=fontsmall)
writetext(draw,106,outdata['gputemp'],(255, 255, 255),font)
draw.text((48,116), "'C", (0, 0, 255),font=fontsmall)
imageh = copy.copy(imagehtemp)
imageh = imageh.transpose(Image.ROTATE_90)
image.paste(imageh,(0, 0))
if __name__ == '__main__':
main()
Für die Implementierung des Lebensspiels habe ich auf die folgende URL verwiesen. https://qiita.com/sage-git/items/c6c175887faa4cf737fb
Die vorausgesetzten Dateien lauten wie folgt 128x64 Hintergrundlogo: /data/ledstat/nzx_log_w.png Data.json für den PC-Status: /ramdisk/data.json Schriftart: ./GDhwGoJA-OTF112b2.otf
Die Schrift ist die auf der Autobahn, na ja, wenn Sie möchten. https://forest.watch.impress.co.jp/library/software/gdhighway/
Als nächstes ein geeignetes Programm, um JSON vom PC zu bekommen
getdata.py
import urllib.request
import json
import time
url = 'http://[ip address]:8085/data.json'
datafile = '/ramdisk/hwdata.json'
req = urllib.request.Request(url)
while True:
try:
with urllib.request.urlopen(req) as res:
body = json.load(res)
fw = open(datafile,'w')
json.dump(body,fw,indent=4)
fw.close()
except:
time.sleep(30)
time.sleep(2)
Es funktioniert mit Python3 Note, na ja, skrupellos.
Die RAMDISK-Definition ist einfach. Erstellen Sie zunächst ein 777-Verzeichnis mit "/ ramdisk /" als root. Fügen Sie FSTAB "tmpfs / ramdisk tmpfs default, size = 16m 0 0" hinzu. Einfach "mount -a" oder neu starten. Wenn Sie df und "tmpfs 16384 84 16300 1% / ramdisk" haben, ist es OK.
Die Registrierung bei systemd sieht wie folgt aus.
/etc/system/getdata.service
[Unit]
Description=getdata
[Service]
ExecStart=/usr/bin/python3 /data/ledstat/getdata.py
Restart=always
Type=simple
User=pi
[Install]
WantedBy=multi-user.target
/etc/systemd/system/ledstat.service
[Unit]
Description=ledstat
[Service]
WorkingDirectory=/data/ledstat
ExecStart=/usr/bin/python /data/ledstat/ledstat.py
Restart=always
Type=simple
[Install]
WantedBy=multi-user.target
Dann von "systemctl daemon -reload"
systemctl start getdata
systemctl enable getdata
systemctl start ledstat
systemctl enable ledstat
Mit einem Gefühl. Wenn ein Fehler auftritt, überprüfen Sie den Status.
Die Frontplatte sieht so aus! ..
Das untere Bedienfeld sieht folgendermaßen aus, wenn Sie nicht beschäftigt sind.
Wenn ich beschäftigt bin und die Temperatur steigt, bin ich verwirrt.
Es macht ziemlich viel Spaß w.
Ich meine. Ich frage mich, ob ich so etwas wie Öl machen könnte.
Übrigens sehe ich beim Spielen keinen anderen Computer. Es ist mit LED-Panels bedeckt, so dass die Temperatur zu steigen scheint. Erstens erzeugt die LED Wärme.
Es gibt nichts Gutes, worüber man ernsthaft nachdenken könnte. Es ist gut, weil es Spaß macht! .. Es ist wunderschön! ..
Manzoku! ..
Recommended Posts