テーブルタップのパイロットランプ修理

 

JUGEMテーマ:電子工作

 

ELPAのテーブルタップ。

 


スイッチが全体で共通なのが意外と便利で愛用しております。
アースの穴もくっついていますので、
家のコンセントのアースにしっかりくっつけて使っております。

 

ところが、パイロットランプが光らなくなってしまいまして、
 ここにLEDをくっつけてみようかなーみたいな。修理記事になります。

 

それでそれで、実験開始。

 


回路

 


この回路で落ち着きました。駄目です。下の方に最新の回路を提示しています。

 最初は10KΩの抵抗を4.7KΩで始めたのですが、
  時間が経つと抵抗があっちっちになるので、やはり無理があると思い、
  10KΩに落ち着きました。下に計算式書いときます。

 

抵抗は秋月から調達した1Wまで耐えるやつです。


 

 

 

■計算


4.7Kで計算した場合、
家庭用電源の場合、実行電圧が100Vとすると、
最大の電圧が141ボルトとなり、こういう時は最大で計算します。
まず電流を出します。(LEDの電圧降下を無視するとします)
  141V÷(4.7KΩ+4.7KΩ)=15mAとなります。
 続けて抵抗ひとつにかかる電圧は最大70.5Vなりますので、
  (LEDの電圧降下を無視するとします)
 ワット数が
  70.5V×15mA=1.058W
  あっ、1W超えてますね。
   これでは危ないですね。将来焼け切れるかもですね。

    それで熱くなっておりました。

 

はい。
 10KΩで再計算します。
  141V÷(10KΩ+10KΩ)=7mAとなります。
 ワット数が
  70.5V×7mA=0.49W
  定格の半分ですね。
  これなら大丈夫でしょう。
  家庭用電源100V専用です。200Vの場合はもうちょい抵抗値上げましょう。

 


 

ある日LEDが点灯していない事に気づき、もう少し改造しました。

 

 

 

抵抗を追加 と 定電流ダイオード追加してます。

ESP32回路のノイズ対策

JUGEMテーマ:電子工作

 

いつも使っているのと同じ回路でマイコンが停止するという事象が

発生しておりましたので、事象の再現試験とその対策を実施しました。

 

■再現試験の方法。

 

旧式(なのか?まだまだ現役の部分もありますけど、)
 の『蛍光灯』を使います。
  直管40W蛍光灯+グローランプでスイッチON/OFFします。
   普通にラジオでノイズ音が「ぶちぶちっぶちー」って聞こえるぐらいノイズが発生しています。
   電源を入れるとチカチカーってグローが光って、その後に蛍光灯本体が光ります。

 

 

 

これを使えば、保護なしのESP32ぐらいは5分ぐらいで止めれます。
秋月のESP32のDevkitCだと、これぐらいでは止まらないですね。

 

■ノイズ発生の自動化

 

事象が発生するまで、スイッチを10秒ごとにON/OFFしていたのですが、
 30分もやってると、さすがに飽きてきましたので、
  マイコンのLチカと、リレーを組み合わせて自動化しました。

 

接続概要は
 ESP32--リレー--蛍光灯
  です。

 

Lチカは以下プログラムです。
 ledはパイロットランプ用です。
 led2をリレーに接続しています。
 7秒ON、3秒OFFです。全体で10秒で繰り返しますので、
 1時間で360on/offです。
  エンジンでいうと6rpmですね。

 

■ノイズ自動化のプログラム


from machine import Pin
import utime

led = Pin(13, Pin.OUT)
led2 = Pin(12, Pin.OUT)

while True:
  
  led.value(1)
  led2.value(1)
  
  utime.sleep(7)
  
  led.value(0)
  led2.value(0)
  
  utime.sleep(3)
  

■ノイズ自動化の動作

 

https://youtu.be/l3bgIuqiNKA

 

■ノイズ自動化の回路図

 

 

■試行錯誤

 

電源ラインとかにノイズが乗って停止しているのかなーと思いましたので、
 まずはコンデンサーをどんどん追加。
  470μF、1000μF、2200μFと追加していき、
   まずまずの安定感を見ていたのですが、
  完全とは言えなく、ごくまれに死にます。


 ノイズの対策としては、金属で周りを囲むとかも考えられるんですが、
 ESPの場合はWIFIの電波送受信しなきゃなので、金属で囲むのはダメっすよねー。

 ちなみに使っていた電源はスイッチサイエンスさんのUSB-UART変換のやつです。

 


これのVCCとGNDをブレッドボード用のケーブルで接続していました。
 いかにもラインからノイズ入りそうですよね。

 

それでー
 上にも書いた通り、ESP32のDEV-KITでは死なないですので、
  それを真似することにしてみました。

 

なんと、死ぬ事象はぴたりと止まりました。
 3時間経過=延べ1080蛍光灯電源ON/OFFでも停止せず。
  という結果を記録しましたので、これで大丈夫だろうという事で、
   記録に残します。

 

■回路図

 

 

追加したのは緑枠線の中。
3端子レギュレーターで5Vから降圧して、
 その後ろの3.3Vラインに0.1μFと22μFを接続しました。
  それと、効果あるかは不明ですが、ENとGND間に0.1μFを入れました。


ポイントは最短距離で結ぶ事です。

 

元々の回路でも3端子レギュレーターで3.3Vを生成してESP32に入れていたのですが、
 (スイッチサイエンスさんのシリアルUSB変換基盤にのっているやつです)

 大きく違うのは、3.3Vを生成後、最短距離で、
  ESP32の電源ラインに入れている部分ですね。
ここが長い事によって、ノイズを拾ってしまっていたんですね。
 前の回路ですと、20センチぐらいの細いケーブルを使っていましたので、そのせいですね。

 

■全体考察

 

やっぱ、電子回路、難しいですね。
 ブレッドボード上でうまくいっても現場がノイズだらけだと、
  謎の停止の事象が・・・のような事、経験してきました。
  
追加で実験したんですが、
 3端子レギュレーターではなく、DC-DCコンバーターでも
 問題なく動作しております。秋月のHT7733A仕様のやつですね。
  こちらもノイズ発生装置で1080ノイズに耐えております。

FONTX2形式をESP32のmicropythonで扱う

JUGEMテーマ:電子工作

 

前の記事

 https://ameblo.jp/fc2miha/entry-12837059330.html
 http://miha.jugem.cc/?eid=366
 
前の記事でarduinoで日本語表示の準備を書いてましたが、
フォントファイルを扱うという前提で考えた場合、
 esp32のマイクロパイソンであれば、ファイルシステムが使えるので、
 ファイルの転送も楽ですし、まずは、ESP32のmicropythonでフォントファイルを
 使えた方が良いので、そちらから進めることにします。
 
前回の記事をpythonで書き換えた感じになります。

 

■フォントファイルの準備

以下のファイル名でFONTをESPのファイル領域に入れておくこと

 

 ILGZ32XF.FNT  SJIS
 ILGZ16XF.FNT  SJIS
 ILGH32XF.FNT  ANSI
 ILGH16XB.FNT  ANSI

 

フォントの入れかたは

 ampy -p com4 -d 1 put ILGZ32XF.FNT

  とか、com4の所とファイル名の所は書き換えてください。

 

■実行結果

 

 

■プログラム

 

 https://drive.google.com/file/d/1xYPl0iTGT3D7YbjvGF4faPrTCdUnjJCk/view?usp=sharing

 

以下は抜粋

 

・ファイルを読み込んでフォントのパラメータを変数に確保

 

 f = open(FONT_FILE, 'rb')
 f_sig     = f.read(6)  #FONTX2と入る
 f_name    = f.read(8)  #フォント名
 f_width   = f.read(1)  #フォント幅 ドット
 f_height  = f.read(1)  #フォント高 ドット
 f_code    = f.read(1)  #文字コード 1=SJIS
  f_block_num = f.read(1)  #ブロック数

 

・バイナリのままだと扱いづらいのでintに変換

 パイソンはここらへんがメンドクサイ。


 width = int.from_bytes(f_width, 'little')
 height  = int.from_bytes(f_height, 'little')

 

・フォントファイルがSJISの場合はテーブル作成

 

    block_num = int.from_bytes(f_block_num, 'little')
    
    for i in range(block_num):
        f_start = f.read(2)
        bs = f_start[1] * 256 + f_start[0]
        #
        f_end  = f.read(2)
        be = f_end[1] * 256 + f_end[0]
        #
        block_start.append(bs);
        block_end.append(be);
    
    for i in range(block_num):
        print(hex(block_start[i])+"-"+hex(block_end[i]))

 

・フォントファイル中のフォントの位置を特定


    char_count = 0
    exist_flag = 0
    for i in range(block_num):
        if block_start[i] <= code and code <= block_end[i] :
            char_count = char_count + (code - block_start[i])
            exist_flag = 1
            break
        else :
            char_count = char_count + (block_end[i] - block_start[i]) + 1;
    font_size = int((width + 7) / 8) * height
    seek_point = 18 + 4 * block_num + char_count * font_size
    print(font_size)
    print(seek_point)

 

・再オープンしてseekし1フォント読み込み
 f = open(FONT_FILE, 'rb')
 f.seek(seek_point)
 font_buf = f.read(font_size)
 f.close()

 

・フォントのビット列を判定して表示
 str = ""
 for i in range(font_size):
     bit = font_buf[i];
     for b in range(8) :
         if bit & 128:
             str = str + "■"
         else :
             str = str + " "
         bit = bit << 1;
     if ((i+1) % int((width + 7) / 8) == 0) :
         print(str)
         str = ""

arduinoで日本語表示の準備

 

マイコンで表示可能な320×240ドットとかの
グラフィックディスプレーに日本語を表示しようとすると、
メモリ容量などの問題から別のメモリ(ROM)等に
漢字のデータを用意する必要があります。

 

それの為に準備されたと思われる商品がGT20L16J1Yなんですけど、
もうすでに品切れで、作っていない様子です。

 

 

 

もっと早く試していればよかったんですけど、
遅きに失した状況です。

 

■GT20L16J1Yの説明を先にすると、


 縦16ドット、横16ドット(半角は横8ドット)で文字が表現されており、
 記号、英数字、カタカナ、第一水準、第二水準の漢字が格納されている。
 点の濃淡はなく、黒を1、白を0としてデジタルデータで格納されており、
 ROMのアドレスにSPI通信でアクセスする事で1バイト毎のデジタルデータとして
 取得することが可能です。取得した1バイトのデータをさらに分解して
 1ドット=1ビットのデータとして扱うことがが可能です。
 縦16ドット、横16ドットの1文字は256ビット=32バイトで表現されています。

 

手に入らないものはしょうがないので、
他に使えそうなものがないかなと考え、思いついたのが、
昔DOS/Vで使われていたフォント形式。拡張子FNTとかだったと思う。

 

その筋で辿って行った所、いろいろと有用な情報が見つかりました。

 

以下調べた色々メモ。

 

■現在の主流は「つるータイプふぉんと」=TrueTypeFontである。


 これはWindowsとかで使われていて拡大してもギザギザにならない方式です。
 拡張子はTTFで、座標でデータを持っている。座標間を曲線で結ぶとか、
 直線で結ぶとかの情報を持っていて、大きくした場合でも
 座標に掛け算するだけなので簡単にギザギザのない文字表現が可能です。
 ただし、ロジックが難しそうなので、マイコンに向いているかと言われると、
 現時点では難しそう。
 
■FONTX2形式


 DOS/Vなどで使われていたフォント=FONTX2
 http://elm-chan.org/docs/dosv/fontx.html
 「FONTXファイルの使いかた」さんのサイトです。
 
 これによるとファイルの先頭から
 char sig[6];          //FONTX2と入る
 char name[8];         //フォント名
 unsigned char width;  //フォント幅 ドット
 unsigned char height; //フォント高 ドット
 unsigned char code;   //文字コード 1=SJIS
 unsigned char block_num; //コードブロック数
 {  // コードブロック数分続く
  unsigned short block_start; //ブロックごとのコードの開始 リトルエンディアン
  unsigned short block_end;   //ブロックごとのコードの終了 リトルエンディアン
 }
 unsigned char font_image[xx];  //フォントイメージ (※2:フォントサイズ×各ブロックのコード数の総和)
 
 半角の場合
 char sig[6];          //FONTX2と入る
 char name[8];         //フォント名
 unsigned char width;  //フォント幅 ドット
 unsigned char height; //フォント高 ドット
 unsigned char code;   //文字コード 0=ANK
 unsigned char font_image[xx];  //フォントイメージ (フォントサイズ×256)
 
 ※フォントイメージは1バイト単位で格納されるため、幅が8の倍数でない場合は後ろに0が格納される
  
■IPAフォント


 https://moji.or.jp/ipafont/ipaex00401/
 IPAフォントライセンスなるものがあり、
 上記参照ですが、3条の制限をよく読んでもらうとわかりますが、
 若干の条件はありつつも、自由に使用可能です。

 

■IPAフォントをビットマップフォントに変換


 http://ayati.cocolog-nifty.com/blog/2012/08/ipalx322416-64a.html
 「こばこのひみつ」さんのサイトです。
 ビットマップ変換済みのファイルをダウンロード可能です。
 上記IPAのフォントをWFONTXにより変換し、FUTOME.EXEでボールド加工したもの
 と解説されています。
  ILFONT03.zip
 上記のIPAライセンスに従って配布されているものですね。

 

■WFONTX


 https://www.vector.co.jp/soft/dos/writing/se002881.html
 Windows3.1用のソフトとの事で、Windows11で動かそうとしても動きませんね。
 ソースが付いてくるので、そのうち挑戦かな?と思いますけど。

 

■FUTOME.EXE
 捜索中

 

■今回の実行例

 

薔薇の ら ですね。32×32のビットマップイメージです。

 

 

■プログラム

 

全体はこちら。

 →https://drive.google.com/file/d/1J5ESzDM_8dY5jtJ8GjAUxGUL_rQacaFQ/view?usp=sharing

 

抜粋と解説です。

 

■フォントは上記で紹介した こばこのひみつさんのものです。

#define FONT_FILE _T("ILGZ32XF.FNT")

 

■structで下記のように定義しました。

 

#pragma pack (1)

struct S_FONT {
    char sig[6];          //FONTX2と入る
    char name[8];         //フォント名
    unsigned char width;  //フォント幅 ドット
    unsigned char height; //フォント高 ドット
    unsigned char code;   //文字コード 1=SJIS
} s_font;

 

struct S_BLOCK {
    unsigned short block_start; //ブロックごとのコードの開始 リトルエンディアン
    unsigned short block_end;   //ブロックごとのコードの終了 リトルエンディアン
};

 

struct S_FONT2 {
    unsigned char block_num;       //コードブロック数
    struct S_BLOCK* block; //コードブロック
} s_font2;


#pragma pack (8)


■次の関数でコードブロックまでの情報をメモリ上に展開しておきます。

 

void CFileReadDlg::OnBnClickedButton1()
{
    CFile f;

    BOOL bRet;
    CFileException ex;

    bRet = f.Open(FONT_FILE, CFile::modeRead, &ex);
    if (bRet) {
        TRACE("open success¥n");

        char buf[256];

        UINT n = f.Read(&s_font, sizeof(struct S_FONT));
        if (n == sizeof(struct S_FONT)) {
            memset(buf, '¥0', sizeof(buf));
            memcpy(buf, s_font.sig, 6);
            TRACE("%s¥n", buf);
            memset(buf, '¥0', sizeof(buf));
            memcpy(buf, s_font.name, 8);
            TRACE("%s¥n", buf);
            TRACE("width=%d¥n", s_font.width);
            TRACE("height=%d¥n", s_font.height);
            TRACE("code=%d¥n", s_font.code);
        }

        if (s_font.code == 0) { //ANSI
            s_font2.block_num = 0;
        }

        if (s_font.code == 1){ //SJIS
            n = f.Read(&s_font2.block_num, sizeof(s_font2.block_num));
            if (n == sizeof(s_font2.block_num)) {
                TRACE("block_num=%d¥n", s_font2.block_num);
            }
            if (s_font2.block) {
                free(s_font2.block);
            }
            s_font2.block = (struct S_BLOCK *)malloc(sizeof(struct S_BLOCK) * s_font2.block_num);
            n = f.Read(s_font2.block, sizeof(struct S_BLOCK) * s_font2.block_num);
            if (n == sizeof(struct S_BLOCK) * s_font2.block_num) {
                for (int i = 0; i < s_font2.block_num; i++) {
                    TRACE("block_read %x-%x¥n", s_font2.block[i].block_start, s_font2.block[i].block_end);
                }
            }

        }

    }
    else {
        TRACE("open error¥n");
        return;
    }
    f.Close();
}

 

■次の関数にsjisコードを渡すと、デバッグとしてビットマップイメージを「■」と「・」で表示します。


 「■」の所がビット1の所で、「・」の所がビット0の所です。
 1文字のみ対応です。

 この関数を呼び出す前に上の関数を呼び出しておく必要があります。

 

void ConvertDisplay(unsigned int code)
{
    int char_count = 0;
    int exist_flag = 0;


    for (int i = 0; i < s_font2.block_num; i++) {
        if (s_font2.block[i].block_start <= code && code <= s_font2.block[i].block_end) {
            char_count = char_count + (code - s_font2.block[i].block_start);
            exist_flag = 1;
            break;
        }
        else {
            char_count = char_count + (s_font2.block[i].block_end - s_font2.block[i].block_start) + 1;
        }
    }

    if (s_font.code == 1 && exist_flag == 0) {
        TRACE("見つかりません");
        return;
    }

    if (s_font.code == 0 && code>=256) {
        TRACE("見つかりません");
        return;
    }

    unsigned int font_size;
    font_size = (s_font.width + 7) / 8 * s_font.height;

    unsigned int seek_point;
    if (s_font.code == 1) {
        seek_point = 18 + 4 * s_font2.block_num + char_count * font_size;
    }
    else {  //ANSI
        seek_point = 17 + code * font_size;
    }

    CFile f;
    BOOL bRet;
    CFileException ex;

    bRet = f.Open(FONT_FILE, CFile::modeRead, &ex);
    if (bRet) {
        TRACE("open success¥n");

        unsigned char* font_buf;
        font_buf = (unsigned char*)malloc(font_size);

        f.Seek(seek_point, CFile::begin);
        unsigned int n = f.Read(font_buf, font_size);
        if (n == font_size) {
            char str[256];
            memset(str, NULL, sizeof(str));
            for (unsigned int i = 0; i < font_size; i++) {
                //TRACE("%x", font_buf[i]);
                unsigned int bit = font_buf[i];
                for (int b = 0; b < 8; b++) {
                    if (bit & 128) {
                        strcat_s(str, sizeof(str), "■");
                    }
                    else {
                        strcat_s(str, sizeof(str), "・");
                    }
                    bit = bit << 1;
                }
                if ((i+1) % ((s_font.width + 7) / 8) == 0) {
                    TRACE("%s¥n", str);
                    memset(str, NULL, sizeof(str));
                }


            }
        }
        free(font_buf);
    }
    else {
        TRACE("open error¥n");
        return;
    }
    f.Close();
}

テーブルタップをきれいに直した。話


先日、
 暇だったので、
  車で出かけたついでに、ホームセンターを偵察しておりましました。

 

ホームセンター大好きです。
 巡回コースにはホームセンター数件、電気量販店数件、ブックオフ、ハードオフなど入っております。

 

今回見つけたのはこちら。
 WV7003W モダン露出増設ボックス

 

 

電源の延長タップを作った時に後ろむき出しになっていたので
 後ろのカバーになると思い購入しました。

 

元々のむき出しの図

 


完成図。

 


やっぱ、こっちのほうがスッキリですね。
満足満足!!

押し入れの中にしまってあった、箱型のビジネスバッグ。


私がサラリーマンで出張の時に使っていた物であるが、
中に置き忘れていたシステム手帳に2003年のカレンダーが付いていた。

 

中身にその当時の仕事のスケジュールとか連絡先とか書かれてて、覚えてる。
その段階で10年ぐらい使っていたので、購入したのはおそらく1990年頃ですね。
会社に入った頃でバブルの頃とは言え若かったので2万円は痛かった覚えがある。

 

■トランクの皮張り版の様なバッグです。

 

箱型のバッグで、トランク型と言うのだろうか?
 箱の周囲をぐるっと硬いもので囲ってあり、
  表面は革?で覆ってあり、
   裏表がチャックで開く構造になっています。

 

 

 

 

 

■故障個所

 


周囲の構造部分の硬い奴が割れてしまって、ぐにゃりとなっている状況です。

 

写真の青い部分に沿って硬い構造物があるはずなんですが
途中欠けて黄色のようになってしまっております。

 

確か、2003年当時壊れて、直そうと思いつつも、そのままになり、
やがて、押し入れにという運命をたどっておりました。


そのまま使ってしまうと、傷が広がって、完全に壊れてしまいますので、
これで良かった気もします。

 

 そのほか、肩掛けのベルト?と言うのでしょうかね?
 本当は本体にくっついている部分は取り外し可能な金具があったんですが、
 金具が壊れてしまい、直接ベルトを縫い付けて修理してあります。


■修理

 

ホームセンターで補強用に金具を購入。

 

 

固定して、穴をあけて

 

 

ネジで固定

 

 

もう一枚

 

 

■完成

 

ちょっとふやけてる?直線であるはずの部分が曲がってるのは古さの証か?

奥の方のボルトが手術跡。

 

■RAWLINGS

 

 

RAWLINGSとあるので、ググると
 スポーツ関連のバッグとかのメーカーらしいですね。
 でもロゴが全然違うのでたぶん違うんだろうなー。

  もう判らないですね。

   30年以上前の物なのでそう言ったもんなのかもです。

 

重量計_HX711-ハーフブリッジロードセル1個

 

JUGEMテーマ:電子工作

重さをはかるロードセルシリーズ第4弾です。

 

ハーフブリッジ4個で構成
 https://ameblo.jp/fc2miha/entry-12835245969.html
 http://miha.jugem.cc/?eid=360
フルブリッジ1個で構成
 https://ameblo.jp/fc2miha/entry-12835409272.html
 http://miha.jugem.cc/?eid=361
ハーフブリッジ2個で構成
 https://ameblo.jp/fc2miha/entry-12835545932.html
 http://miha.jugem.cc/?eid=362

 

ハーフブリッジ1個で構成
 →今回の試み。

 

という事で、ハーフブリッジ1個と固定抵抗を組み合わせてフルブリッジ構成にする記事です。

 

■回路

 


 ハーフブリッジロードセルの中身に2個の抵抗がついている。
 それに普通の固定抵抗を加えてフルブリッジ構成になっている。

 

■ハマりポイント

 ゼロ=0が安定しない。
 上記のハーフブリッジ2個の時も安定しない傾向が見られたが、
 1個だと全く安定しません。
 
 何かを載せた時に測定結果が大きくなるので、それなりに重量センサーとして働いてはいます。
 ただ、誤差が大きくて、0が定まらなく、正確に重さをはかる用途には不向きな気がします。
 スイッチみたいに使う分には出来そうだけど、あまり実用的ではないです。
 1個のフルブリッジにするか、ハーフの4個が正確な様です。

 

■プログラム

 

色々試行錯誤してみました。

 

改善点
 測定を10回平均とした。
 HX711の仕様によると、データが準備できると、DTをLowにするとなっているので、
  測定開始時DTのLowを待ってからデータを読み取るように変更

 

long saisyo = 0;

long get2()
{
  while(1){
    if(!digitalRead(8)){
      break;
    }
  }
  
  long ret = 0;
  for (char i = 0; i < 24; i++) {
    digitalWrite(9, 1);
    delayMicroseconds(1);
    digitalWrite(9, 0);
    delayMicroseconds(1);
    ret = (ret << 1) | (digitalRead(8));
  }
  ret = ret ^ 0x800000;
  return ret;
}

long get()
{
  //return get2();
  
  long total = 0;
  long ret = 0;
  //digitalWrite(9, 0);
  //delay(1000);
  for (int i=0;i<10;i++) {
    total = total + get2();
  }
  ret = total / 10;
  return ret;
}

void setup()
{
  Serial.begin(9600);
  Serial.println("start");
  pinMode(9, OUTPUT);
  pinMode(8, INPUT);

  
  for(int i=5;i>0;i--){
    Serial.print(i);
    delay(1000);
  }
  Serial.println("0");
  
  saisyo = get();
  
  Serial.print("saisyo=");
  Serial.println(saisyo);

}
void loop() {

  long atai = 0;

  atai = get();
//  for (char i = 0; i < 24; i++) {
//    digitalWrite(9, 1);
//    delayMicroseconds(1);
//    digitalWrite(9, 0);
//    delayMicroseconds(1);
//    atai = (atai << 1) | (digitalRead(8));
//  }
//  atai = atai ^ 0x800000;

  Serial.print("atai=");
  Serial.println(atai);
  
  long omosa;
  omosa = ((atai - saisyo)) / 640;
  omosa = omosa * 10;
  Serial.print("omosa=");
  Serial.println(omosa);
  
  delay(2000);
}

重量計_HX711-ハーフブリッジロードセル2個

JUGEMテーマ:電子工作

 

重さをはかるロードセルシリーズ第3弾です。

 

前々の記事
 https://ameblo.jp/fc2miha/entry-12835245969.html
 http://miha.jugem.cc/?eid=360
  ハーフブリッジ4個でフルブリッジを構成
前の記事
 https://ameblo.jp/fc2miha/entry-12835409272.html
 http://miha.jugem.cc/?eid=361
  フルブリッジ1個で構成
今回
 ハーフブリッジ2個でフルブリッジを構成

という事で、ハーフブリッジ2個を組み合わせてフルブリッジ構成にする記事です。

 

■ハマりポイント

 前々の記事の回路を参考にして、
  単純に白-白と黒-黒を電源のEの+と-に入れただけではダメだったので、
   ここがハマりポイントになります。

 

■試行錯誤の末、回路がこちら。

 

 

ロードセルの白は黒へ、黒は白へ接続して電源であるEの+と-へ接続。
信号線は赤をAの+と-へ接続です。

 

最初に失敗した方だと、
 白-白と黒-黒を電源のEの+と-に接続ですが、
 ロードセルそれぞれ指で押してやると片方がプラスになるんですけど、
  もう片方がマイナスになるという謎現象が発生。
  同時に押すと打ち消しあう?謎。
 それで、反対にしたら安定して動きだしたというわけ。
 しばし回路とにらめっこしてみる。
 ハーフブリッジの中身の回路はこちら。
  
  
  
 Negative strain と Positive strain
 翻訳すると
  「負のひずみ」 と 「正のひずみ」
 となっているね。
 
 想像するにロードセルの微妙に曲がる部分の表と裏に抵抗がくっついてて。
  表側が伸びて裏側が縮む、
  そして伸び縮みによって抵抗が変化すれば、
  赤のラインに出てくる電圧が変化するわけですよね。
  
  で、その電圧の変化をHX711が読み取ってデジタル変換して送ってくれると
  いうわけで、HX711にとってみれば、A+とA-は逆に反応してもらわないと
  いけない訳で。。。。。
  なので、フルブリッジロードセルの中身では
   今回実験したみたいな回路で接続されていると思われる。
  
  で、フルブリッジロードセルのケーブルは4本になっていて、
  結果グリーンからA+ホワイトからA-に接続されている。


  想像なのでよくわからんけど。これで動きます。

 

今回はハーフブリッジ2個なので測定するにあたり工作しました。

 

2個ね

 

横からの写真

横から見た図

□□□□□□□□□□□□□□□□□□□□ ←上の板

 ■■■           ■■■■  ←左がロードセルで右が板
□□□□□□□□□□□□□□□□□□□□ ←下の板

ロードセルと高さを合わせるために板を置いて調整しています。

 

■プログラム

 

ロードセルが半分なので、半分ぐらいはロードセルのないところに体重乗ってるので、

その計算式を変更しています。

 

long saisyo = 0;

void setup() {
  Serial.begin(9600);
  Serial.println("start");
  pinMode(9, OUTPUT);
  pinMode(8, INPUT);

  delay(2000);
  for (char i = 0; i < 24; i++) {
    digitalWrite(9, 1);
    delayMicroseconds(1);
    digitalWrite(9, 0);
    delayMicroseconds(1);
    saisyo = (saisyo << 1) | (digitalRead(8));
  }
  saisyo = saisyo ^ 0x800000;
  Serial.print("saisyo=");
  Serial.println(saisyo);

}
void loop() {

  long atai = 0;
  
  for (char i = 0; i < 24; i++) {
    digitalWrite(9, 1);
    delayMicroseconds(1);
    digitalWrite(9, 0);
    delayMicroseconds(1);
    atai = (atai << 1) | (digitalRead(8));
  }
  
  atai = atai ^ 0x800000;
  Serial.print("atai=");
  Serial.println(atai);
  
  long omosa;
  omosa = ((atai - saisyo)) / 258.14784769572;
  omosa = omosa * 10;
  Serial.print("omosa=");
  Serial.println(omosa);
  
  delay(2000);
}
 

重量計_HX711-フルブリッジロードセル

 

JUGEMテーマ:電子工作

 

先日ハーフブリッジロードセルを記事にしました。
 https://ameblo.jp/fc2miha/entry-12835245969.html
 http://miha.jugem.cc/?eid=360
その続きと言いましょうか?

 

今回はフルブリッジのロードセルを記事にしました。
 VKLSVAN HX711 デジタル 秤量センサー モジュール 5KG ロードセル 電子はかりモジュール
  https://www.amazon.co.jp/gp/product/B098Q2FVW1/ref=ppx_yo_dt_b_asin_title_o00_s00?ie=UTF8&psc=1

例によってamazonでポチっておきましたのが、本日届きましたので記事にします。

 

参考にしたページ
 https://denshikit.main.jp/topf/technology84.html
 前回と同じですが、こちらの構造と同じものを試してみたくてポチってしまった。

 

丸形の台座に組まれている状態で届きましたので工作は必要なく、
 arduinoへ接続するのみです。
 簡単簡単。

 

■接続

 

 

上記の部分は既に接続完了でお届けされるので
arduinoへの接続は
 HX711   arduino
  VCC-----5V
  SCK-----D9
  DT -----D8
  GND-----GND

 

■商品写真

 

 

 

横から見た写真ですね。
このロードセルの場合、赤丸で囲った2か所はスペーサーを入れて固定して上の板に
 測定対象を乗っける構造になっています。
 
見えにくいので図解

          測定対象        
                      
 □□□□□□□□□□□□□□□□□□□□ ←上の板
                      
   ■■■                ←スペーサー
                      
  □□□□□□□□□□□□□□□□□□  ←ロードセル
                      
                ■■■   ←スペーサー
                      
 □□□□□□□□□□□□□□□□□□□□ ←下の板
                      
 こんな構造ですね。

 

■ハマりポイントは無かったですね。

 

  しいて言えば、プログラムの初期化タイミング。
 setup()で起動直後delay(300);になっていたんですが、
  この時間では初期化が間に合っていなかったようで、
   delay(600);に変更しております。
 HX711は同じなので、接続するロードセルによって時間がかかったりするのでしょうか?

 

■ロードセルの種類


 
 
 
 今回使ったのはビーム型に当たると思います。
 前回の記事で使ったのは何という型なんでしょうかね?

 

■スペック

 

 

■プログラム

 

long saisyo = 0;

void setup() {
  Serial.begin(9600);
  Serial.println("start");
  pinMode(9, OUTPUT);
  pinMode(8, INPUT);

  delay(500);
  for (char i = 0; i < 24; i++) {
    digitalWrite(9, 1);
    delayMicroseconds(1);
    digitalWrite(9, 0);
    delayMicroseconds(1);
    saisyo = (saisyo << 1) | (digitalRead(8));
  }
  saisyo = saisyo ^ 0x800000;
  Serial.print("saisyo=");
  Serial.println(saisyo);

}
void loop() {

  long atai = 0;
  
  for (char i = 0; i < 24; i++) {
    digitalWrite(9, 1);
    delayMicroseconds(1);
    digitalWrite(9, 0);
    delayMicroseconds(1);
    atai = (atai << 1) | (digitalRead(8));
  }
  
  atai = atai ^ 0x800000;
  Serial.print("atai=");
  Serial.println(atai);
  
  long omosa;
  omosa = ((atai - saisyo) / 1000) *2.2; //saisyoは何も乗っていない時の出力の値、桁が大きいので1000で割っている
  Serial.print("omosa=");
  Serial.println(omosa);
  
  delay(2000);
}

重量計_HX711-ハーフブリッジロードセル4個

JUGEMテーマ:電子工作

 

重さをはかるロードセルっていうものを使った事がないので興味が出て
amazonでポチっておいたものが届いたので組み立てて実験してみた話。

ロードセルが四つもくっついてて安いじゃんとか思って買ってみました。


https://www.amazon.co.jp/gp/product/B09YYJCM35/ref=ppx_yo_dt_b_asin_title_o02_s00?ie=UTF8&th=1
アンプとADコンバーターとしてHX711を使用するわりと一般的なものです。

 

そしたら・・・ですね。いつものようにハマりポイント有りましたので、
その注意点をお伝えするべく、この記事を書いております。

 

■色々調べた事まとめ。

 

参考にしたページ
 https://denshikit.main.jp/topf/technology84.html
 親切丁寧にまとめてあります。
 台所にあるキッチンスケール。
 一昔前はバネがくっついてて、押すとへっこむと思ってたんだけど、
 今は押してもへっこまないんですね。
 ロードセルの設置方法によって微妙な歪みが発生するのでそれを

 検出するって事ですね。
 
 んーなるほど。すげー。

 

■接続図

 

 

 

AMAZONにのっている説明の接続図に従って、接続してみて、
上記参考ページのプログラムをそのまま入れてみました。
arduinoとプログラムは動いている。なんか数字も上げて来てくれるんだけど。
何を乗っけても反応なし。
なんか誤差っぽい数字の違いはあるんですがね。

 

ここでいろいろ考えて

 

■ハマりポイント1

 

なんと、回路図が異なる。

上の図の左上と右下に同じものを異なる方法で図にしてあるんだけど、
 よく見ると異なる。おそるべし中国製造2025

 

見たときに気づいていたんだけど、
 他にもハーフブリッジロードセルを販売しているほかの

 amazonのページの回路と右下の説明が同じだったため、
 右下を採用して接続していたため、動かなかったみたいです。
 後で自分で書いた回路図は掲載するけど、左上は正しいっぽい。

 

■ハマりポイント2

 

なんと、ロードセルの置き方が難しい。
写真の通り、はんだ付けで使っているゴムの板の上に四つ並べて
上から指とかで押してみるんだけど、
この真ん中の所。ただ置いただけだと下のほうにも出っ張りがあり、

曲がらないんですね。

 

 

 

ロードセルは微妙に曲がらないとですので、
MDF版を加工して真ん中が下に下がるように配置しました。

 

 

 

配置

 

そして、上に鉄板を置いて、その上に物を載せることで重さが測定できるようになりました。

 

鉄板

 

完成

 

測定

 

 

測定2

 

プログラムは参考ページからほとんど変えておらず、
HX711 から取得した数値を重さに変換する計算式が異なるぐらいです。

 

■ロードセルスペック

 

 

50Kgまで測定できるので4つで200Kgまで測定可能。
ロードセルの中身の抵抗は1KΩで2個入ってて、
 ハーフブリッジになっている。
あと温度が上は50℃まで、下は-10℃まで
ぐらい知っていればば普通は大丈夫かな
 自分もわからない部分有ります。
  英語だしね。

 

■回路図

 

 

■プログラム

 

long saisyo = 0;

void setup() {
  Serial.begin(9600);
  Serial.println("start");
  pinMode(9, OUTPUT);
  pinMode(8, INPUT);

  delay(300);
  for (char i = 0; i < 24; i++) {
    digitalWrite(9, 1);
    delayMicroseconds(1);
    digitalWrite(9, 0);
    delayMicroseconds(1);
    saisyo = (saisyo << 1) | (digitalRead(8));
  }
  saisyo = saisyo ^ 0x800000;
  Serial.print("saisyo=");
  Serial.println(saisyo);

}
void loop() {

  long atai = 0;
  
  for (char i = 0; i < 24; i++) {
    digitalWrite(9, 1);
    delayMicroseconds(1);
    digitalWrite(9, 0);
    delayMicroseconds(1);
    atai = (atai << 1) | (digitalRead(8));
  }
  
  atai = atai ^ 0x800000;
  Serial.print("atai=");
  Serial.println(atai);
  
  long omosa;
  omosa = ((atai - saisyo)) / 216.5227963525836;
  omosa = omosa * 10;
  Serial.print("omosa=");
  Serial.println(omosa);
  
  delay(2000);
}