<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>OpenSCAD on Nyanmo main blog</title>
    <link>https://www.nyanmo.info/tags/openscad/</link>
    <description>Recent content in OpenSCAD on Nyanmo main blog</description>
    <generator>Hugo</generator>
    <language>ja</language>
    <lastBuildDate>Thu, 09 Jul 2026 13:14:46 +0900</lastBuildDate>
    <atom:link href="https://www.nyanmo.info/tags/openscad/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>PCIe(GPU) 縦方向マウント</title>
      <link>https://www.nyanmo.info/images/3dmodel/pcieverticalmount/</link>
      <pubDate>Thu, 09 Jul 2026 13:14:46 +0900</pubDate>
      <guid>https://www.nyanmo.info/images/3dmodel/pcieverticalmount/</guid>
      <description>&lt;h2 id=&#34;このモデルを作った動機とか&#34;&gt;このモデルを作った動機とか&lt;/h2&gt;
&lt;p&gt;　最近、Intel Arc A770 LE を2枚で動かし、VRAM 32GB 環境で、SYCLを使って llama.cpp によるローカル LLM 環境を試してみている。&lt;/p&gt;
&lt;p&gt;　そこで、しばらく使っていると PC 自体が落ちてしまい、しばらく一時間ほど PC が使用不能になるという問題があった。色々試してみたところ、原因としては2枚のうち、1枚の GPU の吸気が Proliant ML 150 Gen9 の PCIe x16 の配置と、Intel Arc A770 LE の作り的に窒息していることがわかった。慢性的な冷却不足に陥り、ヒートシンクなどの熱容量を使い切ると、熱くなりすぎて保護が動作し、PC が落ちてしまうことがわかった。&lt;/p&gt;
&lt;p&gt;　この問題を解決するために、1枚の GPU を移動させることで解決させたいと思った。ただ単に PCIe を延長するだけでは、固定されていない状態で、GPU を壊してしまう恐れがあるジャンクなセットアップになってしまう。そこで 3D プリント可能なモデルを作ってみた。&lt;/p&gt;
&lt;h2 id=&#34;ダウンロード&#34;&gt;ダウンロード&lt;/h2&gt;
&lt;p&gt;　今回は Blender ではなく、OpenSCAD というソフトウェアを使ってモデルを作成した。モデルの大きさを 10 倍とかにする必要はなく、Cura で読み込めばそのままののサイズのままで印刷できるはずである。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a download href=&#34;https://www.nyanmo.info/images/3Dmodel/PCIeVerticalMount/main.stl&#34;&gt;
main.stl
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a download href=&#34;https://www.nyanmo.info/images/3Dmodel/PCIeVerticalMount/main.scad&#34;&gt;
main.scad
&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;印刷環境&#34;&gt;印刷環境&lt;/h2&gt;
&lt;p&gt;　印刷環境についてはいい加減であり、反り返ったり糸引きなどをしても、最終的に形になって十分な強度が出て使うことができればよしとしている。よって、各自自分の環境や好みに合わせて調整する必要があり、以下は参考程度である。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Ender-3 Pro&lt;/li&gt;
&lt;li&gt;中華系列の安価な PETG フィラメント&lt;/li&gt;
&lt;li&gt;ホットエンド温度 245℃&lt;/li&gt;
&lt;li&gt;ベースプレート温度 65℃&lt;/li&gt;
&lt;li&gt;のりは塗っていない&lt;/li&gt;
&lt;li&gt;ガラスプレート&lt;/li&gt;
&lt;li&gt;印刷時間が 17 時間程度になる速度 (印刷速度は厳密には管理していない)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;3d-モデルpreview&#34;&gt;3D モデルpreview&lt;/h2&gt;
&lt;p&gt;&lt;script type=&#34;importmap&#34;&gt;
{
  &#34;imports&#34;: {
    &#34;three&#34;: &#34;https://cdn.jsdelivr.net/npm/three@0.170.0/build/three.module.js&#34;,
    &#34;three/addons/&#34;: &#34;https://cdn.jsdelivr.net/npm/three@0.170.0/examples/jsm/&#34;
  }
}
&lt;/script&gt;

&lt;script  type=&#34;text/javascript&#34; src=&#34;https://www.nyanmo.info/libs/zip.js/dist/zip.min.js&#34;&gt;&lt;/script&gt;
























&lt;div class=&#34;THREEcontainer518679342 column&#34;&gt;
    &lt;div class=&#34;mainView&#34;&gt;
        
    &lt;/div&gt;
    &lt;div class=&#34;MMDcontroler column&#34;&gt;
        &lt;div class=&#34;buttonContainer mmdControlerContainer motion row border&#34;&gt;
            &lt;input type=&#34;button&#34; id=&#34;fullscreen&#34; name=&#34;fullscreen&#34; value=&#34;全画面表示&#34;/&gt;
        &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;
&lt;script type=&#34;module&#34;&gt;
    
    
    
    
    
    
    
    
    


    import * as THREE from &#39;three&#39;;
    import { STLLoader } from &#39;three/addons/loaders/STLLoader.js&#39;;
    import { OrbitControls } from &#39;three/addons/controls/OrbitControls.js&#39;

    
    
    let article = document.querySelector(&#34;article.post-single&#34;)
    const screenSize = {
        width: article.clientWidth,
        height: article.clientWidth * 0.8
    }

    
    const scene = new THREE.Scene();
    scene.background = new THREE.Color().setRGB(0.03,0.03,0.03)
    scene.add(new THREE.AxesHelper(50))

    
    const camera = new THREE.PerspectiveCamera( 75, screenSize.width / screenSize.height, 0.1, 1000 );
    const container = document.querySelector(&#34;.THREEcontainer518679342&#34;)
    const mainView  = container.querySelector(&#34;.mainView&#34;)
    const renderer = new THREE.WebGLRenderer();
    renderer.setSize(screenSize.width,screenSize.height);
    renderer.shadowMap.enabled = true;
    mainView.appendChild( renderer.domElement );

    
    const buttons = container.querySelector(&#34;.MMDcontroler.column&#34;)
    const fullscreen = buttons.querySelector(&#34;#fullscreen&#34;)

    fullscreen.addEventListener(&#34;click&#34;, () =&gt; {
        mainView.requestFullscreen()
    })

    mainView.addEventListener(&#34;fullscreenchange&#34;,() =&gt; {
        let width = 0
        let height = 0
        if(document.fullscreenElement){
            width   = window.innerWidth
            height  = window.outerHeight
            
            
            
        }else{
            width   = screenSize.width
            height  = screenSize.height
            
        }
        
        
        console.log(width)
        console.log(height)
        renderer.setPixelRatio(window.devicePixelRatio);
        renderer.setSize(width, height);
        
        camera.aspect = width / height;
        camera.updateProjectionMatrix();
        
    })
    



        

    
    const controls = new OrbitControls(camera, renderer.domElement)
    controls.enableDamping = true

    
    const loader = new STLLoader();
    loader.load( &#39;\/images\/3Dmodel\/PCIeVerticalMount\/main.stl&#39;, function (geometry) {
        const material = new THREE.MeshStandardMaterial();
        material.color = new THREE.Color().setHex(0x274d63)
        const mesh = new THREE.Mesh(geometry, material)
        mesh.receiveShadow = true
        
        mesh.position.x = Number(&#34;0&#34;)
        mesh.position.y = Number(&#34;20&#34;)
        mesh.position.z = Number(&#34;20&#34;)
        mesh.rotation.x = Math.PI * Number(&#34;270&#34;) / 180.0
        mesh.rotation.y = Math.PI * Number(&#34;0&#34;) / 180.0
        mesh.rotation.z = Math.PI * Number(&#34;0&#34;) / 180.0

        scene.add(mesh)
    }, undefined, function ( error ) {
        console.error( error );
    } );

    
    let lightPosOffset = Number(&#34;200&#34;)
    const lightPos = [
        {x:0,y:0,z:0},

        {x:lightPosOffset,y:0 ,z:0},
        {x:-lightPosOffset,y:0 ,z:0},

        {x:0,y:lightPosOffset ,z:0},
        {x:0,y:-lightPosOffset ,z:0},

        {x:0,y:0 ,z:lightPosOffset},
        {x:0,y:0 ,z:-lightPosOffset},

        {x:0,y:lightPosOffset ,z:lightPosOffset},
        {x:0,y:-lightPosOffset ,z:lightPosOffset},
        {x:0,y:lightPosOffset ,z:-lightPosOffset},
        {x:0,y:-lightPosOffset ,z:-lightPosOffset},

        {x:lightPosOffset,y:0 ,z:lightPosOffset},
        {x:-lightPosOffset,y:0 ,z:lightPosOffset},
        {x:lightPosOffset,y:0 ,z:-lightPosOffset},
        {x:-lightPosOffset,y:0 ,z:-lightPosOffset},

        {x:lightPosOffset,y:lightPosOffset ,z:0},
        {x:-lightPosOffset,y:lightPosOffset ,z:0},
        {x:lightPosOffset,y:-lightPosOffset ,z:0},
        {x:-lightPosOffset,y:-lightPosOffset ,z:0},

        {x:lightPosOffset,y:lightPosOffset ,z:lightPosOffset},
        {x:-lightPosOffset,y:lightPosOffset ,z:lightPosOffset},
        {x:lightPosOffset,y:-lightPosOffset ,z:lightPosOffset},
        {x:lightPosOffset,y:lightPosOffset ,z:-lightPosOffset},
        {x:-lightPosOffset,y:-lightPosOffset ,z:lightPosOffset},
        {x:-lightPosOffset,y:lightPosOffset ,z:-lightPosOffset},
        {x:lightPosOffset,y:-lightPosOffset ,z:-lightPosOffset},
        {x:-lightPosOffset,y:-lightPosOffset ,z:-lightPosOffset},
    ] 

    
    const color = 0xFFFFFF;
    const intensity = Number(&#34;1&#34;);
    for(let pos of lightPos){
        let light =  new THREE.DirectionalLight(color, intensity);
        light.position.set(pos.x, pos.y,pos.z);
        scene.add(light);
    }

    
    
    camera.position.set(
        Number(&#34;100&#34;),
        Number(&#34;65&#34;),
        Number(&#34;250&#34;)
    )
    controls.target.set(
        Number(&#34;100&#34;),
        Number(&#34;70&#34;),
        Number(&#34;0&#34;)
    )

    
    function animate() {
        renderer.render( scene, camera );
        controls.update()
    }
    renderer.setAnimationLoop( animate );
&lt;/script&gt;&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
