ジャンル不定の日記です。

液晶の傷を歯磨き粉で消してみた!

先日の記事のコメントの方で書いたが、商品画面で気づかなかったんだが、
通算何度目かの購入となるPC-DT3172(日立のUSBハブ付き17インチ液晶)が届いたが、画面に傷が入ってた。


中央上部らへん。
色付き画面だと目立たない感じで商品ページでも気づかなかったんだが、白画面だとガッツリ入ってる。
なので故障中でコンデンサ調達中の液晶が直せたら今回の液晶はサブ機用に回そうかと思ったが、傷を修復できないかと思って調べた。

以前中古ノートPCの画面に傷が入ってた際にセリアの塗るだけ液晶保護剤で傷を埋めることで修復を試みて全然効果がなかったが、
液晶の傷修復には、前回のように固まる透明な液体を充填するか、削って目立たなくするという方法がある。

削って目立たなくする方法では、研磨剤で削るとかあって、実践してる動画がYoutubeにあったので見て確かに傷が消える模様なんだが、
コメント欄にコーティングが剥がれるとか、真似したがひどくなったとか批判的なコメントが多かったが、逆に成功のコメントもあって、表面がコーティングされた液晶だと逆効果でコーティングされてない液晶だと効果あり?
スマホの液晶なんかはコーティングされてるものもあるような気がするが、PC液晶でコーティングされてる?少なくともPC-DT3172はコーティングないような・・・
120サイズで送ってもらったんで送料が高いが500円の中古液晶だし冒険してみても・・・

そして、本物の研磨剤を使う以外に、歯磨き粉には研磨剤が微量入ってるから歯磨き粉で磨くことで治る場合もあるとか・・・


ちょうど貰い物の歯磨き粉があったんで、歯磨き粉で磨く作戦をやってみることにした。
この歯磨き粉は貰い物だから非売品だが、LIONのデンタークリアMAXってやつみたい。

で1時間くらい結構力入れて磨いたと思うんだが、
気持ち傷が目立たなくなった気もしないでもないが、少なくとも傷がなくなるような状態にはならなかった・・・
ちなみに、メガネ拭きみたいな上部でツルツルの布があればよかったんだが、なかったんでティッシュに歯磨き粉つけて磨いた。

MOSFETでラッチ回路

作るわけでもないんだが、ON信号が来たらON信号を切ってもOFF信号が来るまでずっとONの回路を考えてみた。
こういうON状態を保持する回路をラッチ回路というらしいんだが、ググってもトランジスタを使う方法しか出てこなくて、MOSFETで作る例が見つからない。
トランジスタで作る回路は、エミッタからベースに流れる電流とコレクタに流れる電流の両方を使って実現するみたいなんだが、なんか両方の電流を使うのは邪道な感じがするし、電流駆動のトランジスタでスイッチを作るって考えが好きじゃない。
というわけで、MOSFETで考えてみた。

回路1

LEDの部分が動かしたい回路で、P1がPMOSでN1がNMOS。
N1の上の十字の部分はつながってない。交差しないで作る方法はないか?
回路に流れる電流はP1を通ってくるんでP1がOFFならOFFだが、P1のゲートには抵抗を介して電源がつながってる。
P1のゲートからN1を通ってGNDなんで、N1がONならP1のゲートはGNDになるんでN1がONならP1もONになる。
N1のゲートには信号をつなげるんで、信号が来ればN1はONになってP1もONになるので回路は動作する。
P1の下に回路の手前から分岐してN1のゲートにつながってるんで、P1がONならN1もONなんでON状態が保持される。
この際N1のゲート電圧はVDになるんでON信号方向に逆流防止でD1を入れた。なので降下電圧を考えてN1を動かせるだけの信号電圧は必要。
ON状態だとR2を通ってGNDに落ちるんで、ここの部分で電力をロスるね。まあ仕方ないのかな?R1経由もロスるか。

L9110使ってみた

前に買ったモータードライバ(L9110H)使ってみた。
ステッピングモーター動かしたいのでデュアルフルブリッジのほうが良いが、安いのでシングルブリッジのやつ。

コイル1本を1本の信号で制御したいんで、入力の片方に直接つないで、
もう片方には抵抗つけて5Vにつないで、N-MOSで信号きたときにGNDに落とす感じにした。
L9110Hを2個使ってOrange Pi ZeroでLED4個をモーターの代わりに光らせる実験したが、
最初つないだらLEDが点灯しなかった。
どっちか光るはずなのにおかしいと思ったが、
L9110Hに2つあるVCCのうち片方しかつないでなかったが、これ出力別に別れてるみたいで両方繋がないとダメぽい。
それと、Orange Pi Zero起動した時点ではGPIOがINになってるから、その関係で両方光らなかったぽい。

信号2本ででLED4個を順次光らせる実験うまく行ったんだが、
L9110Hが1個壊れてたみたいでLED1個光らなくて交換したら全部光った。

そしてモーター動かそうとしたんだが、28BYJ-48はユニポーラモーターだから、片方をGNDに落としてもう一方を絶縁する感じの回路にしないとダメなのね。
バイポーラの間隔でつないで電圧かけちゃったが回らんかったw

モーター固定部品

木材にタップ加工は無理なことがわかったが、角材か板材でなんとかしてみようと考えてる。
とりあえずモーター(28BYJ-48)の固定方法を考えてみた。


こんな感じで。

セリアのミニステーL1 4Pってやつ。
寸法は外形が29x15と記載されているが、
板厚1.5mmで長辺側の穴位置が角から8mmと23mmで短辺側が9.5mmくらいぽい。
穴寸法は3mmより小さい?m3ネジがすっぽりハマらないがねじ込めば入る。
m3-5mm以上のネジをねじ込んでナット固定で止まる感じ。

モーターにタイミングベルトのプーリーつけたが、GT2 6mmの16歯で5mm穴のもの。
商品説明に長さ14mmと書いてあるが実測15mmで、シャフト固定部とギア部が7mmずつでフランジ状の部分が1mmくらい。
直径は13mmでギア直径が9.5mmくらい。
m3穴が2個あるが2mmの6角穴付きボルトが最初からついてる。

モーターの寸法はデータシート見て、
固定穴の間隔が35mmで穴寸法は4.2mm。で両穴をつないだ直線上にモーターの中心がある。
ギア入りモーターなんでモーターの軸は8mmズレてる。
シャフト直径は5mm。
シャフトに奥まで挿し込んで隙間が1.5mmできる。きっちり奥まで入れなくてもいいし2mmで見といたほうが良いか?

セリアの木材にタップ加工してみた

3.4mmまでのピンバイスが届いたんで、以前買ったタップハンドル(m3-m6)と使って、
セリアの木材(丸棒2P)の先端にタップ加工してみた。

セリアの丸棒は直径15mmで長さ45cmなんだが、測ってみたら直径が16mmくらいで長さが452.5mmくらいあった。
正確じゃないのね・・・

電動ドリルで精密に穴あけできる気がしないんでピンバイスを用意したんだが、ズレた。
たぶん最初の1回転目でズレちゃってる。

そして、m3タップ加工をしようとしたんだが、タップハンドルに固定できない・・・
どうも、m3からm6のタップセットを買ったんだが、
タップ自体はm3からm6の4本ついてるがタップハンドルはm4以上ぽい・・・

仕方ないのでピンバイスにm3タップを固定して回してみた。
が、3mm穴になっちゃう・・・
やっぱ木材にタップ加工は無理ねw
タップハンドルでm4やってみても全然ダメな感じ。
そもそも回さずに押し込むだけで入っちゃうし。

SC1602BS

先日SPIフラッシュの実験をして、I2Cも使ってみたいが実験できるようなデバイス無いかなと思ったが、
昔買ったけど使わなかったキャラクタLCDがあるので確認してみたが、I2Cではなく8ピンでデータを送るデバイスだった。

I2Cデバイスは持ってないので、Aliexpressでなにかデバイス探してみたが、
手持ちの使ってないキャラクタLCDに似たものにI2Cのボードを付属したような商品が売ってた。
そういうことなら、同じく買ったけど使わなかったマイコンを使って手持ちのキャラクタLCDをマイコンで制御してI2Cでマイコンを制御すればよくね?
と思った。

なので、ちょっと手持ちのLCDを調べてみたが、
SC1602BSのバックライト付きってやつで、昔秋月で買ったやつ。


↑表画像


↑裏画像
右側の14電源と制御用の端子で、左側にも端子がある。
左側の端子は2ピンずつつながってて間に間隔があるが真ん中のオープンのとこにも穴が開いてるんで5ピンのヘッダーが挿さる感じ。
右側は7x2列の14ピン。

左側の方はバックライトみたいで、
近くにJ3があるんでハンダでショートさせて、R9に抵抗を設置。
Aの方に5V、Kの方にGNDを繋げばいいみたい。
バックライトはVF4.2で、R9は付属説明書で10-100Ωと記載されてる。
10Ωで80mAになるが、80mAでも暗いくらいでもっと小さい抵抗のほうがいいとか・・・
と思ったが、J3とR9を使用すると電源が共用されて、使わずにAとKを使うと別電源化できるぽい。
両側使ったほうが基板を支えられるが、電源共用化なら右の14品だけでいいから外部基板をちっちゃくできるね。

付属品と思われるもので、手元に7x2の14ピンソケットと100Ω抵抗x3があった。
だが、100Ωだと大きすぎ説があるのと、R9は穴無しのランドなんで本来はチップ抵抗載せるもんと思う。
R9のランドは0.5mmから4.0mmくらいな感じ。ランドの大きさは1.5mm角くらいかな?

14ピンの端子は付属品はソケットなんでブレッドボードで使うことを考えるとヘッダー品のほうが良いよね。
とおもったが、2列だと結局ブレッドボードにささらんわw
だが、このLCDを直接自作デバイスにつけるよりも、マイコン1個つけてSPIかI2Cで制御できる感じのデバイス化したいかな思うんで、やっぱソケットよりヘッダーのほうが良さそう。

左のバックライト端子と右の端子の外側の方の間隔は81.0mmぽい。
2.54mm単位で考えると81.24mmが近いがちょっとずれるが挿さる?
基板サイズは85x30mmで、端子の位置は端から2mm。
縦方向はセンターから対称ぽい。
LCD自体のサイズは71.2x25.2mm。
固定用の穴は81x24mm。
厚みは8.8mm。(説明書にLED=12.7って書いてあるが、実測8.8だな。もしかして手持ちのバックライトなし?)
LCD上面から基板上面までが4.8mmで基板厚みが1.6mm、
らしい。

物理的な構造以外は互換品がいっぱい出回っているようで、ソフト的なもんは情報に困らなそう。

spidevでSPIフラッシュの読み書きした

昨日はspidevの実験でデバイスのIDだけ取得してみたが、読み書きも試してみた。

ソースコード
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <linux/spi/spidev.h>

void CmdRdid(int fd);
char CmdRdsr(int fd);
char CmdRdscur(int fd);
void CmdWren(int fd);
void CmdRead(int fd);
void CmdPp(int fd);

int main(int argc,char** argv){
    char* dev=argv[1];
    int fd=open(dev,O_RDWR);
    if(fd<0){
        perror("open");
        exit(1);
    }
    CmdRdid(fd);
//    CmdRdsr(fd);
//    CmdWren(fd);
    CmdRead(fd);
    CmdPp(fd);
    CmdRead(fd);
    exit(0);
}
char SendMessage(int fd,char* tx_buf,int tx_len,int rx_len){
    int tr_len=rx_len?2:1;
    struct spi_ioc_transfer tr[2];
    char rx_buf[rx_len];
    memset(tr,0,sizeof tr);
    memset(rx_buf,0,sizeof rx_buf);
    tr[0].tx_buf=(unsigned long)tx_buf;
    tr[0].len=tx_len;
    tr[1].rx_buf=(unsigned long)rx_buf;
    tr[1].len=rx_len;
    if (ioctl(fd,SPI_IOC_MESSAGE(tr_len),tr)<0){
        perror("SPI_IOC_MESSAGE");
        exit(-1);
    }
    printf("%02x:",tx_buf[0]);
    for (int i=0;i<rx_len;i++){
        printf("%02x ",rx_buf[i]);
    }
    printf("\n");
    return(rx_buf[0]);
}
void CmdRdid(int fd){
    SendMessage(fd,"\x9f",1,3);
}
char CmdRdsr(int fd){
    return(SendMessage(fd,"\x05",1,1));
}
char CmdRdscur(int fd){
    return(SendMessage(fd,"\x2b",1,1));
}
void CmdWren(int fd){
    SendMessage(fd,"\x06",1,0);
}
void CmdRead(int fd){
    if(CmdRdsr(fd)&1){
        printf("WIP=1\n");
        exit(0);
    }
    SendMessage(fd,"\x03\x00\x00\x00",4,10);
}
void CmdPp(int fd){
    CmdWren(fd);
    if(!CmdRdsr(fd)&(1<<1)){
        printf("WEL=0\n");
        exit(0);
    }
    char tx_buf[260];
    tx_buf[0]=0x02;
    tx_buf[1]=0;
    tx_buf[2]=0;
    tx_buf[3]=0;
    for(int i=255;i>=0;i--){
        tx_buf[3+(256-i)]=i;
    }
    SendMessage(fd,tx_buf,260,0);
    while(CmdRdsr(fd)&1){
        printf("WIP=1\n");
    }
    if(CmdRdscur(fd)&(1<<5)){
        printf("P_FAIL=1\n");
        exit(0);
    }
}
昨日使ったサンプルはincludeがもっと多かったが、上記だけでコンパイルできた。

複数のコマンドを実装したんで、実際のデバイスアクセス部分はSendMessageに分割した。
ステータスの確認が必要なコマンドもあるんで先頭1byteだけ返す。
応答のないコマンドはSPI_IOC_MESSAGE(1)にすれば構造体が2要素になってても2番目は無視される模様。
tx_bufで送信文字列渡してるから長さはここで取得できるかと思ったが、NULLが含まれててうまく行かなかったんでtx_lenで長さも別途渡すことにした。

READ (0x03)→ PP (0x02) → READ(0x03)
の順でコマンドを送る。

RDSR(0x05)で最下位bit(WIP)が1の場合は書き込み中でREAD不能ぽいんで先にRDSRをする必要がある。
READは0x03に続けて3byteのアドレスを送信すると、そこからCSが上がるまで何バイトでも読み続ける。
指定しなければ、CSはioctlの開始時に下がって終了時に上がってくれるみたいなのでrx_lenで指定したbyte数だけ読み込まれる。

書き込みの際はWREN(0x06)を実行するとRDSR(0x05)で下から2bit目(WEL)が1になる。WEL=1じゃないと書き込み不可なので先に確認。
PPは0x03に続けて3byteのアドレスを送信だが、アドレスの3byte目(最下位)は0x00にする必要がある。
先頭4byteに続けて256byteのデータを続けるんで260byteをデバイスに送信する。
送信されたデータは一旦バッファに保存されて、データ送信完了後にCSが上がると書き込みが開始される。
書き込み中はWIPが1になるんでRDSRで確認する必要がある。
書き込みが成功するとRDSCURで取得できる1byteの下から5byte目(P_FAIL)が0になるが失敗すると1になるらしい。
WELは書き込みが完了すると0になるんで書き込み系の命令を使うときは毎回WRENが必要。


実行結果
# ./spi /dev/spidev1.0
9f:c2 20 18  
05:02  
03:ff ff ff ff ff ff ff ff ff ff  
06:
05:02  
02:
05:03  
WIP=1
05:03  
WIP=1
05:03  
WIP=1
05:03  
WIP=1
05:03  
WIP=1
05:03  
WIP=1
05:03  
WIP=1
05:00  
2b:00  
05:00  
03:ff fe fd fc fb fa f9 f8 f7 f6
こんな感じになった。
255から0のASCIIコードを書き込んだ。(最後がNULLのがいいと思ったんでデクリメントにした)
PPは256byte単位だがREADは10byteだけにした。
想定通りの結果と思う。

データの初期値は1なのかな?実験中に書き換わっちゃった可能性も否定できないが・・・
なお、書き込み中のWIPの確認で6回ループしてるが、2回目に実行するとPPして次の
RDSRでWIP=0になった。
同じデータだと書き込まれない?PCの処理速度の問題か?

spidevを使ってみた

先日Orange Pi Zeroでspidevが出てくるようにしたが、
前にZeroの2MBフラッシュと交換しようとして買ったSPIフラッシュ(macronix MX25L12835F)が手元にあって、今日SOP8のDIP変換ボードが届いたんで試してみることにした。

https://www.emcraft.com/stm32f769i-discovery-board/accessing-spi-devices-in-linux
↑にSPIフラッシュのIDを確認するコマンドを送るサンプルがあったんでそのまま使ってみた。

# ./spi /dev/spidev1.0
response(7): c2 20 18 c2 20 18
データシートの9-5のとこに0x9Fの出力がc2 20 18って書いてあるんでデバイスは機能してるぽい。
が、応答3byteだと思うんだがなんで6byteなんだろ。サンプルのソースコードでも6byteになってるが・・・

# ./spi /dev/spidev1.0
response(6): 18 c2 20 00 00 00
サンプルのソースコードからxfer[1].lenを3にしたら一応3byteになった。

あとググって調べたところxfer(変数名がxferではなくtrの例が多かったが)の配列要素が1で同じとこにtx_bufとrx_bufを設定してる例が多かった。
これは要素数が1だとSPI_IOC_MESSAGE(2)のとこもSPI_IOC_MESSAGE(1)になるぽいんだが、
試しに要素数1でやってみたら、
# ./spi /dev/spidev1.0
response(6): 00 c2 20 18 c2 20
こんな感じで返ってきた。
TXの送信中もrx_bufに入る感じと思う。
だから配列の要素数を増やして分離すれば応答だけを取れる?

データシート見るとコマンドの送信がコマンド番号1byteに続いてダミー2byteとアドレス1byteを送信しているようにも見えるんだが、
xfer[0].len = 1;を3に(ダミーが1byteと勘違いした)んだが、応答ずれちゃいそうな気がするが結果が変わらなかった。
配列の要素が切り替わるときにCSが切り替わってたりするのか?
調べてもよくわからんかった。

改造の際にmemset(xfer, 0, sizeof xfer);を消してみたら、
# ./spi /dev/spidev1.0
SPI_IOC_MESSAGE: Invalid argument
で機能しなかった。
設定しない構造体の要素は0に初期化しないとダメな感じ?

12Vを駆動するNOT回路

Orange Pi ZeroのGPIOが足りないからNOT回路で1本の信号で2回路制御するのを考えたが、


こんな感じでMOSFET3つ使わないとできない?
回路の上流側にスイッチをつけるのがハイサイドで下流側につけるのがローサイドというみたいだが、
ステッピングモーターの駆動でHブリッジにするんでハイサイドにスイッチをつける必要がある。
電圧は12VでGPIOは3.3Vなんで、NMOSは12Vを制御するのに12Vよりも大きい電圧が必要。PMOSなら12Vで制御できるが3.3Vではできない。

右上がPMOSだが、ゲートに電源電圧をつなげちゃえばオフにできる。
なので、右のPMOS部分だけ見るとゲートに12Vがかかっているので回路はOFF。

真ん中のMOSFETはNMOSでゲートに直接3.3VがかかっててソースがGNDなので、
ここだけ見るとNMOSはONで、右のPMOSのゲートからGNDに短絡するんで右のPMOSのゲートは0Vになって回路に通電してる。
ここの電圧は3.3Vである必要はないかな。

左もNMOSでGPIOとゲートをつなぐ。
これがONになると真ん中のNMOSのゲートがGNDになるんで真ん中のNMOSがOFFになる。
真ん中のNMOSがOFFだと右のPMOSのゲートが12Vになるんで回路が遮断される。


ような気がする・・・

モータードライバ買った

Orange Pi Zeroと MOSFET でのモーター制御ができたが、
次の段階として今回は5V駆動したんで12V駆動のために2.54mm化のDCジャックを注文して、
N-MOSFETだけだとモーター1つにGPIO4ピン使うが半分P-MOSFETならGPIOx2で制御できるはず。
というわけでP-MOSFETを買おうと思ったんだが、
デュアルMOSFETなるものを知った。

デュアルMOSFETはそのまんまMOSFETが2つのIC?なんだが、N+Pのものがある。
NのデュアルとPのデュアルに部品を分けた方が1個で電流を1本流せるが、
今回SOT-23のMOSFET使ってわかったが、肉眼で印字が見えないからNとPの2種類あったらどっちかわからん。
N+PのデュアルMOSFET使えば部品が1種で済むから見分ける必要がない。
というわけで、AO4606ってSOIC-8(SOP-8とは幅が違うぽい)のデュアルMOSFETを買おうかと思った。
SOT-23のシングルMOSFET50個分の値段で10個入りくらいの価格。
L9110SってフルブリッジのモータードライバICと似たような価格。
L9110は12V0.8Aしか流せないんでギリギリな感じだがAO4606は30V6Aまででかなり大電流が流せる。

が、よく考えるとフルブリッジのモータードライバはMOSFET4個分なんだよね。
ということに気づいたんでL9110買ってみることにした。
SOP-8だとAO4606と大差ない価格だったが、
変換基板につけるのもめんどいし勿体無いから、テスト用にL9110HってDIPパッケージのやつを5個にした。
本番ではSOP-8のL9110Sを別途買うつもり。