I2C接続AQMシリーズのキャラクタ表示LCDをMicro:bitで使う (4) 圧力センサ

力を感じよう

 台所で使う「はかり」は千円ほどで購入できます。しかし、使われている圧力センサ単独では市販されていないようです。工業用の圧力センサはとても高価です。

 FSRと呼ばれる扱いやすい圧力センサを入手しました。

圧力の変化は抵抗値の変化

 FSR端子をテスタをΩレンジにしてつないでも、抵抗値は表示されません。指で押すと、

  • 強めに押すと約400Ω
  • 少し力を抜くと約1kΩ
  • もっと軽く触ったぐらいだと約6kΩ
  • 数字が表示される限界近く軽く触ると約70kΩ

でした。

 データシートには、圧力と抵抗のグラフが掲載されています。その関係の再現性は±15~±25%と大雑把です。したがって、はかりなどの用途のセンサではないようです。本体はフィルム状で大変薄く、1mm前後です。この特徴を考え、椅子に座っている人が離席したかどうかを判断するセンサとしての利用を検討します。

お尻はいがいと大きい

 入手した圧力センサは直径19mmです。これ一つではお尻をカバーできません。最低二つ、四つぐらいあると、間違いなく体重がかかっているかどうかを判断できそうです。

 実験なので、センサは一つで挑戦しました。まず、センサに1mのリード線をはんだ付けします。センサをA4用紙の真ん中より左寄りにメンディング・テープで貼り付けます。テスタをつなぎ、センサを椅子の上に置き、A4用紙を裏返し、座ります。

 日頃座っている椅子は、メッシュ状で体重がかかるとたわみます。座ると100kΩ前後、座りかえると10kΩ前後が表示されました。座るところがフラットな木の椅子では、座る位置によってまったく抵抗の表示されない部分が多くありました。センサの上にお尻がしっかり乗ったときは、数kΩから20kΩくらいでした。

 前回のCdSと同様に直列に抵抗を入れて、電圧を読み取る構成にしました。

 抵抗R1を47kΩとすると、圧力センサR2が100kのとき、3.3*47k/(47k+100k)=1.1V 、R2が20kのとき、3.3*47k/(47k+20k)=2.3Vが得られます。

スケッチ

 圧力センサの分圧出力をA1につなげて、次のスケッチを動かします。

1
2
3
4
5
6
7
8
9
10
11
12
float Vref = 3.19;
float a1;
void setup() {
    Serial.begin(9600);
}
void loop() {
    Serial.println("start ");
    a1=analogRead(A1);
    Serial.print(a1/1023*Vref);
    Serial.println(" ");
    delay(500);
}

 シリアルプロッタの結果です。椅子に薄いクッションを引いておくと、人が座っているとほぼ3V、離席すると0Vになります。これであれば、センサは1個でも実用になりそうです。長期にわたる運用では、ケーブルの断線などのチェックも必要でしょう。

 離席しているときは緑色のLEDが、座っているときは赤色のLEDが点灯するスケッチです。スレッショルドは1.5Vにしました。LEDの点灯は前回のCdSと同じ配線です。

float Vref = 3.19;
float Volt1;

void setup() {
Serial.begin(9600);
pinMode(12,OUTPUT); //Green
pinMode(8,OUTPUT); //Red
digitalWrite(8,LOW);
digitalWrite(12,HIGH);
delay(1000);
}

void loop() {
Serial.println("start ");
Volt1=(float)analogRead(A1)/1023*Vref;
Serial.print(Volt1);
Serial.println(" ");
if ( Volt1>1.5 ) {
digitalWrite(12,LOW);
digitalWrite(8,HIGH);
} else {
digitalWrite(8,LOW);
digitalWrite(12,HIGH);
}
delay(500);
}

LCDへの表示

 上記のスケッチに、LCDへの表示を追加します。人が座っている状態では赤のLEDが点灯し、LCDにはzaisekiと表示が出ます。

#include <Wire.h>
unsigned char lcd_address = 0x3e;
float Vref = 3.19;
float Volt1;

int i2cwritecmd(byte cmd) {
Wire.beginTransmission(lcd_address);
Wire.write((byte)0x00);
Wire.write(cmd);
return Wire.endTransmission();
}

int i2cwritedata(byte data) {
Wire.beginTransmission(lcd_address);
Wire.write(0x40);
Wire.write(data);
return Wire.endTransmission();
}

void lcdcu_set(int x, int y) { // xは桁数、0から16が指定できる。yは行数で0が1行目、1が2行目
byte ca = (x + y * 0x40) | (0x80); i2cwritecmd(ca);
}

void lcdclear() {
i2cwritecmd(0x01);delay(1);
}

void i2cprint( String pdata) {
int n = pdata.length();
for (int i = 0; i < n; i = i + 1) {
i2cwritedata(pdata.charAt(i));
delay(1);
}
}

void init_lcd() { // LCDの初期化
delay(145);
i2cwritecmd(0x38);delay(1);
i2cwritecmd(0x39);delay(1);
i2cwritecmd(0x14);delay(1);
i2cwritecmd(0x73);delay(1);
i2cwritecmd(0x56);delay(1); // 3.3V
i2cwritecmd(0x6c);delay(300);
i2cwritecmd(0x38);delay(1);
i2cwritecmd(0x0c);delay(2);
i2cwritecmd(0x01);delay(2);
}
void setup() {
Wire.begin();
init_lcd();
i2cprint(String("Start"));
Serial.begin(9600);
pinMode(12,OUTPUT); //Green
pinMode(8,OUTPUT); //Red
digitalWrite(8,LOW);
digitalWrite(12,HIGH);
delay(1000);
}
void loop() {
lcdclear();
Serial.println("start ");
Volt1=(float)analogRead(A1)/1023*Vref;
lcdcu_set(0,0);i2cprint("A1 Press=");
i2cprint(String(Volt1)); i2cprint("V");
Serial.print(Volt1);Serial.println(" ");
if ( Volt1 < 1.5 ) {
digitalWrite(12,LOW);
digitalWrite(8,HIGH);
lcdcu_set(0,1);
i2cprint("riseki");
} else {
digitalWrite(8,LOW);
digitalWrite(12,HIGH);
lcdcu_set(0,1);
i2cprint("zaiseki");
}
delay(500);
}

 コラム 工業用の圧力センサ

 工業用途には、ロードセルという名称の圧力センサが使われてきました。力の大きさを電気信号に変える変換器です。写真は荷重(0~20kg)に応じた電圧をリニアに出力するSC133-20kgです。ひずみゲージがアルミニウム・ブロックに貼り付けられています。

 定格出力は1.0±0.1mV/V、精度は0.05%なので、はかりに利用できるセンサです。