【ESP32】体重計を改造して重量データをBluetooth SPPでPCに送ってみる。
副資材の在庫管理2の記事で作ったものです。
Bluetooth仕様の体重計が売ってあったんですが、スマホアプリと連携が必要でそんな機能要らなかったので改造して好きなようにデータを送信できるようにしました。
一定時間ごとにBluetoothのSPP通信で体重計の重量データをPCに送るっていうだけです。
中国製の安い体重計を買ってそれについていたマイコンと表示器と電池は取っ払って、天板、カバーとロードセルだけを利用しています。
HX711のロードセルアンプモジュールとESP32を中に入れてはい完成です。
重量誤差も±3gくらいだったんですがまぁそんなに精度要らないから今回は問題無しです。
ノイズもそんなになさそうでいい感じですね。
体重計初めて分解したんですが、中ってスカスカなんですね。
ロードセル4個のブリッジ回路に、基板上にBluetoothが搭載したマイコンそして表示機。
そういえば分解したときに両面テープで天板が貼られていたのですが組み立て時に面倒だったのか何枚か剥離紙剥がしてないんですよね~
(いやきっと高さを合わせるためってことで理解しました。うん)
ネットで探してみたんですがsparkfunさんサイトがわかりやすかったので参考にして作ってみました。
learn.sparkfun.com
【機器仕様】
・電源入力時に重量のゼロ合わせする。(トレーとか置くので)
・一定時間ごとにBluetoothのSPP通信で重量データをPCに送る。
【材料】5,000円くらい
・デジタル体重計(今回は最大160kgまで測定できるやつ)
・HX711モジュール
・ESP32
・ユニバーサル基板
・USBケーブル(タイプA to microB)※給電用
【準備】
ライブラリをインストールする。
github.com
ライブラリ内の
「SparkFun_HX 711_Calibration」スケッチを使用して取得する。単位は"kg"で出力するようにするためにzero_factorの値を取得する。
スケッチでは単位がポンドになるように設定されていたのでkgになるように設定しました。(1gなら0.001の値が出ます)
手持ちの200gの重りを乗せて合うようにしてみました。
配線図
回路図
【接続】
HX 711 → ESP32ピン32
CLK → 21
DOUT → 22
VCC → 3.3V HX711ボードは2.7Vから5Vまで電源供給可能
GND → GND
【スケッチ】
#include "BluetoothSerial.h" BluetoothSerial SerialBT; #include "HX711.h" #define calibration_factor -15000 // この値はSparkFun_HX 711_Calibrationスケッチを使用して取得する。 #define zero_factor 8421804 // この値は、SparkFun_HX 711_Calibrationスケッチを使用して取得する。単位は"g"で出力 //HX711接続ピンの設定 #define LOADCELL_DOUT_PIN 22 #define LOADCELL_SCK_PIN 21 HX711 scale; //センサのノイズ除去(ローパスフィルタ) volatile float LoadCellVal, LoadCellVal_RC; // ロードセルの値、フィルタ後の値 #define n 5 // サンプリング回数 整数を入力 #define a 0.8 // 0<a<1の範囲 大きいほどローパスフィルタの効果大だが反応が鈍くなる int i; String strDATA = "LoadCellValue"; // 送信用データ(strDATA,ロードセルの値Kg) #define bps0 115200 // シリアル通信UART0への転送速度:単位はbps(送信先(PC)に合わせる) /*********************************************************************** 初期化 **********************************************************************/ void setup() { SerialBT.begin("ESP32_SPP_HX711_LordCell"); // Bluetoothデバイス名 // Serial.begin(bps0); // 通信速度bps、USBのシリアルモニタから確認用(実装時はOFF) delay(500); //ロードセルHX711の設定 scale.begin(LOADCELL_DOUT_PIN, LOADCELL_SCK_PIN);// ロードセルのピンの設定 scale.set_scale(calibration_factor); // この値はSparkFun_HX 711_Calibrationスケッチを使用して取得されます scale.set_offset(zero_factor); // 以前の既知の0_factorを使用してスケールを0アウトします // Serial.println(F("BLE_SPP start")); } /*********************************************************************** Loop処理 n回分のロードセルの重量データをローパスフィルタを通してペアリングされた機器にSPP通信で送信する。 **********************************************************************/ void loop() { LoadCellVal_RC = scale.get_units(); for (i = 1; i < n; i++) { // n回分繰り返し LoadCellVal = scale.get_units(); // ロードセルの値をHX711から取得 // Serial.print(LoadCellVal); LoadCellVal_RC = a * LoadCellVal_RC + (float)LoadCellVal * (1 - a);//フィルタ(n回分を差分方程式でノイズを除去する) } String str = strDATA + "," + String((float)LoadCellVal_RC, 3); // 文字列結合荷重は1g以下切り捨て SerialBT.print(str); // 文字列をBluetoothで送信 // Serial.print(str); delay(700); }
【Seeeduino XIAO】RS232cから受信した信号をUSB HIDで送信してみる。
前回に引き続きRS232cからBluetoothのHIDプロファイルで送れるようにしてみました。
マイコンは無線使わないので小さくて安いSeeeduino XIAOを選定してみました。
フリスクのケースに入れたかったのですが、RS232cのコネクタが大きくてケースに入らなかった...
どうしたもんかと思いコンビニ探したらちょっと大きいロ○テのキシリトールタブレットのケースが
あったのでそれに入れました。
見た感じはこんな感じです。
機器仕様
・PCとBluetoothでペアリングすることで利用可能(パスワードなし)
・RS232cの信号のレベルをTTLレベルに変換し、非同期シリアル通信(UART)で受信したデータを
マイコンで受けて蓄積し、改行コードを受信したら文字列をUSB HIDでデータ送信。
HIDだったらキーボード入力と同じように扱えるから、Excelに取り込後に関数やVBAで
文字列データ処理する。
予備知識
Ardoino IDEにSeeeduino XIAOのボードライブラリをインストールする。
以下にセットアップ方法があります。
wiki.seeedstudio.com
接続
UART(HardwareSerial)
UART1(RX:GPIO7 TX:GPIO6)受信(RX)のみ使用
ボーレート:9600
ビット長:8ビット、パリティ:なし、ストップビット:なし(SERIAL_8N1)
送信側→本機
3.3V-3.3V
GND -GND
TX -GPIO7(RX)
ブレッドボード
回路図
USB HID仕様
#include <Keyboard.h> //#define bps0 115200 //bps UART0(USB) #define bps1 9600 // bps UART1 String strDATA = "No Data"; // 送信する文字列 volatile bool strConplete = true; void setup() { strDATA.reserve(128); // strDATAの文字列の格納領域を128byte数確保 Keyboard.begin(); // USB HID接続開始 // Serial.begin(bps0); // UART0 Serial1.begin(bps1); // UART1 delay(500); // Keyboard.println("USB HID"); } void loop() { while (Serial1.available() > 0) { // 受信したデータバッファが1バイト以上存在する場合 if (strConplete == true) { // 新たなデータを取得したときにデータ初期化 strConplete = false; // フラグ初期化 strDATA = ""; // データ初期化 } char inChar = (char)Serial1.read(); // Serial1からデータ読み込み if (inChar == '\n') { // 改行コード(LF)がある場合の処理 strConplete = true; // フラグを更新 Keyboard.println(strDATA); // USB HIDでデータ送信 } else if (inChar != '\r') { // CRの改行コードの場合は結合しない strDATA += inChar; // 読み込んだデータを結合 } } delay(1); }
【ESP32】RS232cから受信した信号をBluetoothで送信してみる。
経緯
会社の古い測定器にRS-232c出力の機器があるんですが、測定器の紙に書き写していた記録類をPCに直接データを取り込んで楽にしたいという要望を受けて作ってみました。
具体的には塵埃測定機器や電子天秤からのデータなんですが、他の試験機器にも流用できそうだからやってみようかと思いました。
ちなみに今回から現場の方で開発用+製作部品予算をもらって作るようにしてみました。うちの部署お金ないので、自己啓発+自費で遊びでやってたんですが、今後会社内でやっていくならビジネスモデル確立しとかないとあそbe...
..IT関連の改善手段も増やさないと今の仕事の価値があがらないですからね。大変だ~←棒読み
担当者とどういう流れで測定作業をするか話したんですが、n箇所の塵埃測定ポイントがあり、機器にデータを蓄積してから、纏めてPCに出力する流れでやることを提案しました。取り込みは有線、無線どっちでやるかって話になったときに使う人が「ブルートゥース??」な方が使われることが想定されるので、有線(USB HID)でよくねって思ったんですが、安いからどっちも欲しいって欲張りなこと言われました。
まぁ他の部署にも売り込むための実績作るためにはいいかと思って作りました。
まずは無線仕様としてESP32 Bluetoothを使うようにします。有線は別の記事で。
今回BluetoothのプロファイルはSPPとHID両方記載しています。
いろんなPCで使うから今回使うのはHIDでいいかな~
機器仕様
・PCとBluetoothでペアリングすることで利用可能(パスワードなし)
・RS232cの信号のレベルをTTLレベルに変換し、非同期シリアル通信(UART)で受信したデータを
マイコンで受けて蓄積し、改行コードを受信したら文字列をBluetoothでデータ送信。
HIDだったらキーボード入力と同じように扱えるから、Excelに取り込後に関数やVBAで
文字列データ処理する。
開発環境
Arudoino IDEにESP32をセットアップする。
スイッチサイエンスのページです。
trac.switch-science.com
BLE HIDで接続する場合
以下のキーボードライブラリをDLして、Ardoino IDEに読み込ませる。
↓GitHubのページです。
ESP32をBluetoothキーボードとして機能させ、その機能を制御できるライブラリがあるので、ダウンロードしてArudoino IDEに取り込んでください。
github.com
予備知識
規格:ESP32 Bluetooth 4.2
UART(HardwareSerial)
UART0(RX0:GPIO 3、TX0:GPIO 1)USB
UART2(RX2:GPIO16、TX2:GPIO17)受信のRXのみ使用
RS232c機器の設定は以下にしておく
ボーレート:9600
ビット長:8ビット、パリティ:なし、ストップビット:なし(SERIAL_8N1)
接続
送信側→ESP32
3.3V -3.3V
GND -GND
TX -GPIO16(RX)
RX -GPIO17(TX) ※今回利用しない。
ブレッドボード
回路図
Bluetooth SPP送信仕様
#include <BluetoothSerial.h> // Bluetooth SPPプロファイルのライブラリ BluetoothSerial SerialBT; //#define bps0 115200 // bps UART0(RX:GPIO 3,TX:GPIO 1)USB #define bps2 9600 // bps UART2(RX:GPIO 16) String strDATA = "No Data"; // 送信する文字列 volatile bool strConplete = true; void setup() { strDATA.reserve(128); // strDATAの文字列の格納領域を128byte数確保 SerialBT.begin("ESP32_SPP"); // デバイス名でBluetooth開始 // Serial.begin(bps0); // UART0 Serial2.begin(bps2); // UART2 delay(500); } void loop() { while (Serial2.available() > 0) { // 受信したデータバッファが1バイト以上存在する場合 if (strConplete == true) { // 新たなデータを取得したときにデータ初期化 strConplete = false; // フラグ初期化 strDATA = ""; // データ初期化 } char inChar = Serial2.read(); // Serial2からデータ読み込み if (inChar == '\n') { // 改行コード(LF)がある場合の処理 strConplete = true; // フラグを更新 SerialBT.println(strDATA); // Bluetooth送信 } else if (inChar != '\r') { // CRの改行コードの場合は結合しない strDATA += inChar; // 読み込んだデータを結合 } } delay(1); }
Bluetooth HID仕様
#include <BleKeyboard.h> // Bluetooth HIDプロファイルのライブラリ BleKeyboard bleKeyboard("ESP32BLE_HID"); // Bluetoothペアリング時の表示名 //#define bps0 115200 // bps UART0(RX:GPIO 3,TX:GPIO 1)USB #define bps2 9600 // bps UART2(RX:GPIO 16) String strDATA = "No Data"; // 送信する文字列 volatile bool strConplete = true; void setup() { strDATA.reserve(128); // strDATAの文字列の格納領域を128byte数確保 bleKeyboard.begin(); // BLE HID接続開始 // Serial.begin(bps0); // UART0 Serial2.begin(bps2); // UART2 delay(500); } void loop() { while (Serial2.available() > 0) { // 受信したデータバッファが1バイト以上存在する場合 if (strConplete == true) { // 新たなデータを取得したときにデータ初期化 strConplete = false; // フラグ初期化 strDATA = ""; // データ初期化 } char inChar = Serial2.read(); // Serial2からデータ読み込み if (inChar == '\n') { // 改行コード(LF)がある場合の処理 strConplete = true; // フラグを更新 // Serial.println(strDATA) bleKeyboard.println(strDATA); // Bluetooth送信 } else if (inChar != '\r') { // CRの改行コードの場合は結合しない strDATA += inChar; // 読み込んだデータを結合 } } delay(1); }
【作業改善】副資材の在庫管理2
あれから担当者の引き継ぎや何やかんやあったんですが、いろんな人の協力を得てなんとかできました。
棚卸しと共に運用できそうです...
と思ったんですがその間に会社のOS更新やOfficeのアップデートのタイミングが重なり、AccessDBとの連携がうまく行かないんです。
どうしたもんか...みんなぁ~おらに力を貸してくれ。
とりあえずここまできたので残しておきます。
今までの業務フローの見直し、それに合わせた管理ツール開発、利用部門や利用者への説明と合意ect...
こういう改善策やツールって使ってもらう人への説明と理解してもらうのが一番たいへんなんですよね。
納得して使ってもらえなければそれはどんなものでも続かないし、誰も幸せにならないですからね。
今回は非常にやりやすい職場でした。
【業務フローの調査と提案時にいつも大変だと思うこと】
1.人によってやってるとか、やってないとか認識がバラバラだった。
これ職場は経験上だと管理者と担当者の間で起こることがありました。「担当者に一任していますから担当者に聞いてください←キリッ」な場合かなぁ。
担当者が複数人の場合で担当者間で言ってることバラバラの場合は、マニュアルさえなくて雰囲気やなんとなくでやってる場合があるんですが、まぁこれは結構酷い場合。
今回は比較的上記の齟齬がすくなくて話が進みやすかったです。
2.入力が面倒だから管理したくない人と管理できたら納期遅延が減って管理が楽になる人との意見があった。
自分の仕事が増えるかもしれないリスクを負うのって嫌ですよね。それが全体最適化だとしても、自分が手間だと感じたら全体が悪くなるように見えてしますんですよね。
認知心理学だと認知バイアス?でしたっけ?
要するに何が言いたいかというと、私よりその人の能力に優劣がどうこうってことではなくて、みんなな何かしらそういう心理が働いて反応してしまうってことですね。
今回はなかったですが、以前会議中に提案しただけで机叩いて怒られたこともあって結構ドキドキするんですよ。だからほら...議論をしているんだからすぐに反応して怒らないで。
上記のことが起きないように、やっていること
・業務フローを作るときから一緒に調査するようにして活動に巻き込んでおく。
・活動が始まっていきなり何のツールや改善をするかって話になったら、一旦業務のフローを教えてもらって現状を図にして問題点を整理する。
・みんな何かしらの先入観はあれど、良くしたいと思ってると考えて、現場の方に寄り添って考えてみる。
【ツールの仕様】
1.BluetoothのSPPプロファイルで送れるバーコードリーダと体重計(別記事似て紹介)をPCにペアリングする。
2.体重計は約1s毎にひたすら重量を送信する。
3.副資材には一意のバーコードラベルを付与してAccessのDBに登録しておく。
4.発注点を決めてAccessのDBに登録する。
5.バーコードリーダを読み取ったら時に入力されていた重量を管理ツールを介してAccessのDBに登録する。
6.重量が発注点を割ったら注文アラートを出す。
【利用者が運用でやること】
1.作業者は接着剤、コーティング剤を取り出し後に重量計に乗せて副資材のバーコードを読み取りAccessに登録する。
使うたびに在庫量を更新する。
2.管理者は常に最新の在庫を確認できるので、発注点を割ったら注文。(定量発注方式)
有効期限の管理は週1回の廃却日に確認する。
これできたら紙に書いての管理と、紙を見ながら棚卸ししていた業務がやっと開放されますね。令和3年の話です。
進展あったらまた書きます。
【嬉しかったこと】
・Fritzingがだんだん使えるようになった。
・マイコンを使える様になって会社で仕事の幅が増えた。(でも会社のPCだとプロキシやらの制限で開発環境の構築がまだできないです)
以前ビックサイトでやってるIoT展とか見に行くとArdoinoタッパーに入れとるやん!とかあるので趣味で自作してみようかな。
おわり
【作業改善】副資材の在庫管理1
先日、製造現場から現場改善の相談を受けて整理してみました。
【現場から依頼された時の内容】
月一溶剤やコーテイング材棚卸しの時、電子天秤で副資材を測定し、値を管理台帳にキーボードで手打ちで転記している。
【現場の悩み】
・棚卸しの管理時間に手間がある。
・月一の在庫管理では在庫切れで困っている。
【現場の要望】
・値の書き写し作業を無くしたい。
・データ入力時書き写す先と値のミスを減らしたい。
・在庫切れを無くしたい。
悩みの背景を理解するために、現場に行って作業のやり方や環境を作業者と確認してみたときの状況を以下に記載します。
場所:溶剤やコーテイング材置き場は危険物保管庫の建屋。
生産:少量多品種で機種によって副資材の種類と使用頻度バラバラ
作業:毎日保管庫から隣の作業建屋に使う溶剤などを運搬し、当日中に保管庫に戻す。
(消防法などの制約)
設備:A&D社の電子天秤を使っており、RS232c端子がある。
インフラ:社内ネットワークに繋げられるノートPCは持っているが、
保管庫にはネットワークが引かれていない。(作業建屋はネットワークあり)
ここからあるべき姿を想像しながら、効率化の解決手段を考えてみた。
【解決手段】
方針①:手書きは自動化して、転記作業時間を短縮する。
副資材情報→現品をバーコードかQRコード管理してリーダーで取得
重量 →A&D社の電子天秤からRS232cで取得
方針②:欠品を防ぐために、発注点を決める、発注頻度を上げる。
・この職場は少量多品種生産で機種によって溶剤や塗装剤の種類と使用頻度に変動が大きい。
・在庫管理方式としては班長と作業者のカンと経験で発注している。
・確認頻度と発注頻度が頻度が1ヶ月となり溶剤保管庫の最大保管容量を超える管理はできない。
改善案:毎日使うときに副資材の重量を更新、週2回の発注。
【これからやろうとしてること】
・改善後の業務フローを検討。(在庫管理方法、発注頻度を上げる)
・RS-232cからPCにデータを取り込む手段にESP32を利用。(別記事に記載)
・溶剤の管理番号採番と溶剤の在庫管理ツールの開発。(Excel VBA)
現場の担当者に来週提案してみます。
つづく
初めてのブログ
初めてのブログ立ち上げてみました。
私はとある工場でものの流し方や作業改善をする部署でお仕事でやらせてもらってます。
当ブログでは改善にあまり投資できないけど、同じ課題が抱えている方々に改善の役に立てたらいいなと思って書いていきます。
また、改善の途中経過や考えたことも書いていきます。
IEとか生産方式とかIoTとかの成功事例は様々な方が書いているのですが、このブログでは未熟な私が改善の途中経過も書いていくので泥臭い部分や、細かい部分も書いていきます。
自作IoT的なものをちょっとハマって1から勉強中です。
会社のPCではプロキシが通らなくてプログラミング環境が一部構築できず、家帰ってから自分のPCで自己学習と自費開発してマイコンを持ってってる感じです。もう趣味ですね。
怒られるまでやりたいと思います。
スキル、趣味
結構ミーハー、いろいろです。
- 生産工学、IEなどを活用した分析と改善(現業務)
- はんだ付け(前部署)、電子機器組み立て1級取得
- 日本溶接協会マイクロソルダリング インストラクタの資格を取得
- 最近始めようと思うRaspberry PiやArdoino、ESP32、Seeeduino XIAOを使った改善
- 初心者レベルのプログラミング:Excel VBA(社内では需要が高いです)、C++、Python
- 読書が好きです。トヨタ生産方式やプログラミング、決算表の見方などの本を見ていたら、さらに深く知るためには哲学や仏教の学習が必要だと気付きました。
この無常の世の中で共存共栄し続ける環境を目指していきます。
よろしくおねがいします。
おわり