頭と尻尾はくれてやる!

パソコンおやじのiPhoneアプリ・サイト作成・運営日記


iPhone 6のフロントパネルを自分で交換修理してみた

ガラスが破損したiPhone 6

↑iPhone 6を落としてフロントのガラスが割れてしまった。

iPhone 6の近接センサーを交換した

↑このiPhone 6は以前業者にバッテリー交換を依頼したら通話ができなくなってしまい、近接センサーを自分で交換したiPhone 6だ。



↑幸いAmazonでフロントパネルも手頃な値段で売っていたので、交換を自分でやってみようと思ったのである。

分解工房・iPhone 6/フロントパネル(ガラス)交換修理方法
↑参考にしたのはこちらのページ。ホント感謝、感謝だ。

フロントパネル取り外し直後

↑フロントパネル部分を完全に切り離した状態。ここまでは前にやったことがある。

ホームボタン取り外し直後

↑ホームボタンを外したところ。どこが分離するのかよくわからなかったがなんとか外れた。

フロントカメラ、スピーカ取り外し直後

↑フロントカメラ、スピーカーなどを外したところ。

フロントパネルのバックプレート止めネジ部分

↑液晶パネル裏のバックプレートを外そうとしたが、参考ページには6つのネジがあるらしいけど4つ(白い丸のところ)しかなかった。赤い丸の部分にはネジがなかったが、まあいいや。

バックプレート取り外し後

↑バックプレートを外したところ。
下がAmazonで買った新しいフロントパネル。

取り外した部品のまとめ方

↑ちなみに取り外したネジや部品は工程ごとに紙で作成した”ケース”に入れて置いておいた。


後は逆に組み立てていくだけだ。


ところがその時に気付いたのだが、、、

新パネルのフロントカメラ部分

↑購入したフロントパネルにはフロントカメラを位置決めするため(と勝手に思っている)の透明な部品がない。

旧パネルのフロントカメラ部分

↑元のフロントパネルには同じところに透明な部品がある。
この部品はパネルに強固に接着されてるようで取れそうにないし、取れたところで正しい位置をだせるとは思えない。

フロントカメラ取り付け部

↑とりあえず取り付けた後に横から見ると、、、すごく斜め向いてる。そりゃそうだろう。
これはフロントカメラは使えないな、と諦めた。


気持ちを切り替えて組み立てて行ったのだが、、、

コネクタの誤配置

↑フロントパネルとバッテリー側を接続するコネクタ部分の上下関係(重なり方)を間違えていた。
一番横が長いのが真ん中になってるけど、

コネクタの接続部分

↑反対側は違う。一番横長なのが端にある、、、orz
こんなの間違えてたら組みあがらないようになっているのだろう、と深く考えずに組み立てていたのだ。

そんな感じで組み立て直しもあったのだが、、、

修理完成後のiPhone 6

↑なんとか元の形にはなった。
今の所、普通に使えている。
ちゃんと会話もできるのでスピーカ、近接センサあたりも問題がなかったようだ。
問題のフロントカメラがどういうわけかちゃんと映る。斜め向いてるのかもしれないが、端っこが表示されない、とかの不具合はない。

液晶の影

↑ただ、ディスプレイやホームボタンを強く押すと液晶独特の影のような正しく表示できていない部分が現れる。前にはこんなのなかった。
また、ホームボタンが少し奥まってる気がする。
どちらも使用には問題ないだろう。

なお、前に工具を買っていたため、今回フロントパネルに付属していた工具は一切使わなかった。
その工具はこちら↓

スポンサーサイト



ビット演算子のチルダ(~)って何やねん?

久々にMetalで描画するためにいろいろとコードを見てたりするのだが、Appleのコード(※1)に下のような面白いのがあった。
// The 256 byte aligned size of our uniform structures
static const size_t kAlignedSharedUniformsSize = (sizeof(SharedUniforms) & ~0xFF) + 0x100;
シェーダに渡すデータサイズを256バイトの倍数だといくらになるのかを計算している。
SharedUniformsという構造体(※2)のデータサイズを満たしつつ、256の倍数だといくらかを得たい。メモリの確保も必要になるので当然なるべく小さい方がいい。
構造体の中身がどんなのでもこの式でOKというものだけど、、、

なんて難解なんだ!

そんな難解な記述しなくてもええやん、と突っ込みたくなる。

なんだよ?0xFFの前の~(チルダ)は?!

調べるとビット演算でチルダはビット反転(補数を作る)なんだそうな(※3)。
0xFFは2進数だと全部1だから、その補数ってことは2進数では
…11 0000 0000
ってことか?
これとの&だから16進数で言うと下2桁をゼロにして、それより上のビットはそのままをキープできる。ここはすでに256の倍数。下2桁分は切り捨ててるようなものだから、あとで+0x100してる。
0x00との&だと上の桁までゼロにしちゃうから0xFFの補数を使ってたのか。



※1 ↓ここにも書いてるようにXcodeでプロジェクト新規作成時にARKitアプリで描画にMetal、言語にObjective-Cを選択した場合にできるコード。
SCNGeometryからMDLMeshを作成する

※2 ↓SharedUniforms はこんな構造体として定義されてる
typedef struct {
    // Camera Uniforms
    matrix_float4x4 projectionMatrix;
    matrix_float4x4 viewMatrix;
    matrix_float4x4 displayTransform;
    
    // Lighting Properties
    vector_float3 ambientLightColor;
    vector_float3 directionalLightDirection;
    vector_float3 directionalLightColor;
    float materialShininess;
} SharedUniforms;
※3 参考サイト
もう一度基礎からC言語 第19回 いろいろな演算子~ビット演算子 ビット演算子


Objective-Cでsmoothstep関数を使いたい

よくある関数らしい(?)smoothstep関数をObjective-Cで使いたくなったのだが、なさそうなので書いてみた。C++でもあるらしいけどそれだけのためにObjective-C++にするのが面倒なので。

参考サイトを見つつ書いてみたのがこんなの↓
-(float)smoothstepEdge0:(float)edge0 edge1:(float)edge1 x:(float) x
{
    x = [self clamp:(x - edge0) / (edge1 - edge0) minX:0.0 maxX:1.0];
    float r = x * x * (3 - 2 * x);
    
    return r;
}

-(float)clamp:(float)x minX:(float)minX maxX:(float)maxX
{
     return fmin(fmax(x, minX), maxX);
}

{
    // 実行してみる 
    float edge0 = 0.1;//—(1)
    float edge1 = 0.4;//—(1)

    float dX = 0.01;
    for(NSUInteger ite=0;ite<50;ite++) {
        float x = dX * (float)ite;
        float y = [self smoothstepEdge0:edge0 edge1:edge1 x:x];
        
        NSLog(@"%f %f”,x,y);
    }
}
clamp関数を使うみたいだが、なぜかclamp関数は以前に作っていた。
(1)この場合、0.1より小さいと0、0.4より大きいと1となり、その間はなめらかにつないでくれる。
0から0.5で入力xを変化させ、その時の出力yを計算してグラフ化(MacのNumbersを使用)した。

smoothstep関数のグラフ

↑スムーズにつながっている。
こんな関数でこんなグラフになるって、、、考えた人すごいよなあ。


参考サイト
c++ - Smoothstep function - Stack Overflow
smoothstep


Metalシェーダのfloat3とpacked_float3の違い

sizeof(simd_float3)=16という罠
↑ここと似たような話。ここで躓いてたので解決は早かったかもしれない。

そもそもはSCNVector3のデータ”列”をシェーダに渡したかった。1つだけではなく複数のSCNVector3を渡したい。
{
    SCNVector3 *offsets = calloc(… );//—(1)
    //(値を入れる処理)
    …

    NSData *data = [NSData dataWithBytes:offsets length:sizeof(SCNVector3)*NofVertices];
    [node.geometry.firstMaterial setValue:data forKey:@"offsets”];//—(2)
}
↑ (1)メモリ確保して、なんらかの値を入れる処理がある、とする。
(2)データ列をNSDataオブジェクトにしてそれをセットする。
ここまではよくある話。

これを頂点シェーダで受ける時に最初は下のようにして受けていた↓
…
 constant float3 *offsets [[buffer(3)]],
…
ところがこれだとなにやらおかしい。

Metal-Shading-Language-Specification
↑シェーダで使える関数とかここで見てる。
ここでfloat3について調べると、、、

リファレンスのスクショ1
↑サイズが16バイト?float3よ、お前もか、、、!
じゃあどうするの?と思って他のところを見ると

リファレンスのスクショ2
↑packed_float3というのがあってこれだと12バイトで受けてくれる。
…
//constant float3 *offsets [[buffer(3)]],
constant packed_float3 *offsets [[buffer(3)]],
uint vertexID [[vertex_id]] )
{
    float3 offset = offsets[vertexID];
    …
}
↑このように変更してSCNVector3を受け取ることができた。


simd_float4x4の作成方法

ARKitやSceneKit、Metalなどを使っているとAccelerateフレームワークのsimdなんとか、というタイプの値を使うことが多い。

floatで4x4のマトリックスを作成しようとしたのだが、
simd_make_float4x4
というのがない。
たいていはこのような形式なのでsimd_make_float...などと入力するとXcodeがそれっぽいのを

Xcodeのサジェスト内容

↑このようにサジェストしてくれるが、マトリックス作成用のが見つからない。

結局、simd_float4x4のプロパティにはcolumnsというのがあるとリファレンスで読んだので以下のようにした。
{
    simd_float4x4 matrix;

    simd_float4 c0 = simd_make_float4(+1.0000f, +1.0000f, +1.0000f, +0.0000f);
    simd_float4 c1 = simd_make_float4(+0.0000f, -0.3441f, +1.7720f, +0.0000f);
    simd_float4 c2 = simd_make_float4(+1.4020f, -0.7141f, +0.0000f, +0.0000f);
    simd_float4 c3 = simd_make_float4(-0.7010f, +0.5291f, -0.8860f, +1.0000f);
    
    matrix.columns[0] = c0;
    matrix.columns[1] = c1;
    matrix.columns[2] = c2;
    matrix.columns[3] = c3;
}





Copyright ©頭と尻尾はくれてやる!. Powered by FC2 Blog. Template by eriraha.

FC2Ad