ページ

ラベル Arduino の投稿を表示しています。 すべての投稿を表示
ラベル Arduino の投稿を表示しています。 すべての投稿を表示

2023年8月18日金曜日

指紋認証センサー「R503」の備忘録

おひさしぶりです、ばったです。

何か作ろうにもワンルームじゃ作業スペースもなく、何とか重い腰を持ち上げて
今回は指紋認証センサーのR503をArduinoを使って色々ためしてみたいと思います。
(調べても、日本語サイトが見つからなかったので備忘録がてら書きます。)


指紋認証の仕組みについては調べたら出てくるので記載はしないですが、
指紋認証システムは大きく分けて3種類ほどあるそうで、
「光学式」「静電容量式」「超音波式」と順番に高価で高性能なものになっています。


そして、今回実験するものは「静電容量式」のものを使います。
某リンゴ製のホームボタンとかについているあれですね。




(おなじみのAliで2000円ほどで買いました。高かったです。)

このユニットのスペックをざっくりと書くと、

・電圧        :3.3V
・動作電流      :20mA
・LEDの色      :青、赤、紫
・指紋登録数     :200個
・精度(未登録突破率) :<0.001%
・精度(登録済失敗率) :<1%
・通信ポートレート  :(9600×N)bps、N = 1~12(デフォ値N = 6、57600bps)


といった感じで、かなり精度がいいものとなっています。
今回、このセンサーをArduinoで制御していきたいと思います。

このセンサーのデータシートはこちらから見ることができます。


①事前準備


さて、まずは事前に必要なものを準備しましょう。
今回使用したものは以下の通りです。

・指紋認証センサー R503          ←R502でも可。どちらも中身は一緒です。
・Arduino UNO(互換品)              ←ArduinoであればNanoでもMegaでもいいです。
・Arduino↔PC間接続コード
・PC (Windows10)

開発環境はお任せします。
では次にライブラリをインストールします。
Adafruit Fingerprint Sensor Library」というすでに公開されてあるライブラリを使用します。
こちらのGitHub上にライブラリがありますのでこれをArduino IDEにインストールしてください。
光学式の指紋センサーもこのライブラリを使用するため、ご不明な方はそちらもご覧ください。




②配線

次に、配線ですね。
センサーユニットからは計6本の配線が出ております。
以下ご参照ください。



若干配線の色が違いますが、順番は一緒です。
写真だと上から以下の通りで、Arduinoへの配線も記載しておきます。
Pin 1 赤色 :電源DC3.3V           →3.3Vへ
Pin 2 黒色 :GND                     →GNDへ
Pin 3 黄色 :アウトプット(Tx)    →デジタルPin2へ
Pin 4 茶色 :インプット(Rx)       デジタルPin3へ
Pin 5 青色 :指検出信号             →未接続
Pin 6 白色 :誘導電源DC3-6V     →5Vへ(3.3Vでも大丈夫です。)


Pin5は使用用途がないので今回使いません。
試していないのでわかりませんが、センサーに触れたら3.3Vを出力する線ですかね。
実際にA実験してみました。
センサーに触れていないときは「1(analog時は1023)」を出力し、少しでも振れれば「0(analog時も同様に0)」を出力する線のようです。
analogRead時は触れ加減によって値が変わるかと考えていましたが、そんなことはなく単純に1/0の表現でした。


配線するとこのようになります。


(コネクタは切りました。そのままだと接続できないので。)
以上で環境構築は完了です。


③プログラム

ライブラリをインストールすると、IDEの「スケッチ例」にプログラムが格納されています。指紋登録方法や認証方法などは先ほどの光学式の参考サイトに詳しく記載されていますので、詳細は省きます。

プログラムだけ見ても関数の使い方がよくわからなかったので、ここからは
いろいろ調べながら分かった関数をいくつか記載しておきます。


LED制御

まずは光学式との大きな差で言うとLEDの可否ですね。
静電容量式は「青、赤、紫」のLEDが搭載されています。
制御方法について詳しく説明していきます。

まず、LEDを光らせる関数ですがこのように構成されています。
finger.LEDcontrol(点滅方法, 点滅スピード, LEDの色, 点滅回数);

1.点滅方法
 ここでは点灯、消灯、点滅、点滅(呼吸のような)、フェードイン/アウトなどが選べます。
 点灯:FINGERPRINT_LED_ON
 消灯:FINGERPRINT_LED_OFF
 点滅:FINGERPRINT_LED_FLASHING
 点滅(呼吸のような):FINGERPRINT_LED_BREATHING
 フェードイン:FINGERPRINT_LED_GRADUAL_ON
 フェードアウト:FINGERPRINT_LED_GRADUAL_OFF

2.点滅スピード
 ここでは点滅時のスピードを制御できます。
 制御は0x00~0xffまでなので256段階で調整でき、0~255を設定します。
 ここは設定数字の×10msが1サイクルのスピードになります。
 点灯時は関係ないので、数字は何でもいいです。

3.LEDの色
 LEDは先ほども述べた通り「青、赤、紫」の3種類が組み込まれています。
 それぞれのコードは以下になります。
 青:FINGERPRINT_LED_BLUE
 赤:FINGERPRINT_LED_RED
 紫:FINGERPRINT_LED_PURPLE

4.点滅回数
 ここでは点滅時の回数を設定できます。
 0~infiniteで可能です。回数制限なしの場合、この部分は省力も可能です。
 点滅スピードと同様に、点灯時は関係ないです。
 
以上がLEDの制御方法です。
LEDの同時点灯はできないようなので、注意が必要です。


その他関数

分かったこと書きますといいましたが、そこまで書くことがなくなってきました。
とりあえずスケッチ例に載っていた関数でも書いていきます。

2019年6月16日日曜日

2桁7セグメントLEDを使った超音波距離計の製作

どうもみなさん。こんにちは。
久しぶりの更新ですがさっそく本題に入ります。
今日は2桁7セグメントLEDで距離を表示させる超音波距離計を製作します。

今回使った部品です。
・2桁7セグメントLED  (ELD-511SRWA)
・Arduino Nano (互換品)
・超音波センサ (HC-SR04)
・51Ω抵抗(7本)
※型番をクリックするとデータシートへ飛びます



回路図です。

こんな感じです。
ではプログラムへ行きます。

const int A = 2;
const int B = 3;
const int C = 4;
const int D = 5;
const int E = 6;
const int F = 7;
const int G = 8;
const int TRG = 12;
const int ECH = 13;

void setup() {
pinMode(TRG, OUTPUT);   //超音波センサトリガー
pinMode(ECH, INPUT);    //超音波センサエコー

/*
   a1              a2 
 f1  b1       f2  b2
   g1              g2
 e1  c1        e2  c2
    d1   dp1     d2  dp2

7seg対応ピン
a1=16, a2=11
b1=15, b2=10
c1=3, c2=8
d1=2, d2=6
e1=1, e2=5
f1=18, f2=12
g1=17, g2=7
dp1=4, dp2=9
cathode1=14, cathode2=13
*/

  pinMode(A,OUTPUT);
  pinMode(B,OUTPUT);
  pinMode(C,OUTPUT);
  pinMode(D,OUTPUT);
  pinMode(E,OUTPUT);
  pinMode(F,OUTPUT);
  pinMode(G,OUTPUT);
  pinMode(9,OUTPUT);
  pinMode(10,OUTPUT);

Serial.begin(9600);
}

//光らせる部分を指定
void ledSeg(int val) {
  switch(val) {
    case 0:
      digitalWrite(A,1);
      digitalWrite(B,1);
      digitalWrite(C,1);
      digitalWrite(D,1);
      digitalWrite(E,1);
      digitalWrite(F,1);
      digitalWrite(G,0);
    break;

    case 1:
      digitalWrite(A,0);
      digitalWrite(B,1);
      digitalWrite(C,1);
      digitalWrite(D,0);
      digitalWrite(E,0);
      digitalWrite(F,0);
      digitalWrite(G,0);
    break;

    case 2:
      digitalWrite(A,1);
      digitalWrite(B,1);
      digitalWrite(C,0);
      digitalWrite(D,1);
      digitalWrite(E,1);
      digitalWrite(F,0);
      digitalWrite(G,1);
    break;

    case 3:
      digitalWrite(A,1);
      digitalWrite(B,1);
      digitalWrite(C,1);
      digitalWrite(D,1);
      digitalWrite(E,0);
      digitalWrite(F,0);
      digitalWrite(G,1);
    break;

    case 4:
      digitalWrite(A,0);
      digitalWrite(B,1);
      digitalWrite(C,1);
      digitalWrite(D,0);
      digitalWrite(E,0);
      digitalWrite(F,1);
      digitalWrite(G,1);
    break;

    case 5:
      digitalWrite(A,1);
      digitalWrite(B,0);
      digitalWrite(C,1);
      digitalWrite(D,1);
      digitalWrite(E,0);
      digitalWrite(F,1);
      digitalWrite(G,1);
    break;

    case 6:
      digitalWrite(A,1);
      digitalWrite(B,0);
      digitalWrite(C,1);
      digitalWrite(D,1);
      digitalWrite(E,1);
      digitalWrite(F,1);
      digitalWrite(G,1);
    break;

    case 7:
      digitalWrite(A,1);
      digitalWrite(B,1);
      digitalWrite(C,1);
      digitalWrite(D,0);
      digitalWrite(E,0);
      digitalWrite(F,1);
      digitalWrite(G,0);
    break;

    case 8:
      digitalWrite(A,1);
      digitalWrite(B,1);
      digitalWrite(C,1);
      digitalWrite(D,1);
      digitalWrite(E,1);
      digitalWrite(F,1);
      digitalWrite(G,1);
    break;

    case 9:
      digitalWrite(A,1);
      digitalWrite(B,1);
      digitalWrite(C,1);
      digitalWrite(D,1);
      digitalWrite(E,0);
      digitalWrite(F,1);
      digitalWrite(G,1);
    break;
  }
}
//ここまで

void loop() {

//ここから超音波計 
int diff;
float dis;
digitalWrite(12, HIGH);
delayMicroseconds(10);
digitalWrite(12, LOW);
diff = pulseIn(13, HIGH);
dis = (float)diff * 0.01715;
Serial.print(dis);
Serial.println("cm");
delay(10);
//ここまで

//数字を桁で分ける
int n = dis;                 //整数変換
int n1=0,a2=0,a1=0,i,j;

for(i=0;i<=10;i++){
  n1 = n-i*10;
  if(n1>9){
    a2 = 9;           //99以上なら2桁目を9
    a1 = 9;           //99以上なら1桁目を9
  }
  else if(0<=n1 && n1<=9){
    a2 = i;                  //2桁目の数字
    for(j=0;j<=10;j++){
      if(n1 == j){
        a1 = j;              //1桁目の数字
      }
    }
  }
  else if(n1>9) a2 = 9;
}
//ここまで

//7セグカウンタ出力
  for(int k=0; k<10; k++) {
  digitalWrite(9,LOW);
  digitalWrite(10,HIGH);
  ledSeg(a2);
  delay(10);
  
  digitalWrite(9,HIGH);
  digitalWrite(10,LOW);
  ledSeg(a1);
  delay(10);
  }
//ここまで


}

プログラムの中で一応コメント書いてあるので解説は省略します、質問ある方はコメントしてください。
はい、そしてこれをArduinoへ書き込みます。




大体50cmくらいまではかなり正確に測定できています。
それ以降はたまにかなり値がぶれます。

70cm付近で250cmなど値が荒ぶっています。


100cm以上は99と表示されます。

これで、無事完成しました。
一応備忘録のつもりですので自分が見やすいように書いています。
それと写真では7セグLEDに抵抗挟んでいませんが回路図の通り抵抗挟んだ方がいいです。
一応補足でした。

では。ノシ


にほんブログ村に参加しています。

↓よかったらクリックお願いします↓

にほんブログ村 その他趣味ブログ 電子工作へ


2017年3月5日日曜日

Arduinoデビュー

どうも、みなさん久しぶりです
前からArduinoやってみたいなーって思ってたんですけど、高いんで手が出せずにいました
でまあ知らべてたら互換機っていうのがあって買ってみました
なので正確に言うとArduino互換機デビューですね

まず、互換機、僕が買ったのはこちらです
Aruduino UNOの互換です
まずパソコンとつなげてみます
しかし認識されません
ここで戸惑います
調べてみると、USBとシリアル変換チップがCH340Gというもので
まずそれを読み込むためのドライバーをインストールしないといけないようです
ドライバーはaitendoの商品ページ↓からインストールできるようです
aitendo CH340G
こんなのが出てくるのでINSTALLを押しましょう
これでドライバーソフトが入ったので認識されるはずです
しっかり読み込まれています
次にArduino IDEをインストールします
ここからインストールできます
Windows、Linux、Macに対応しております
とりあえず僕はWindows10なので「windows installer」をおします
次のページが表示されるので「Just Download」を押しましょう
これでArduino IDE (89.3MB)がダウンロードされるはずです

はい、ここまででやっとArduino互換機に書き込める環境が整いました

ではまず手始めにおなじみのLチカをやってみます
Arduino IDEを開きます
ファイル→スケッチ例→01.Basics→Blink
でBlinkを開きます
するとプログラムが出てくると思います
チェックマークを押し、コンパイルします
できたらパソコンとArduinoが接続されていることを確認して⇒を押します
これでボードに書き込まれます
Arduinoの13pinとGNDにLEDをさしてみるとチカチカ一秒おきに光ると思います

ここまでできたらArduinoデビューです
おめでとうございます^^

次回はナイトライダー風LED点灯について書こうと思います

長文失礼しました

ではノシ

↓よかったらクリックお願いします↓

にほんブログ村 その他趣味ブログ 電子工作へ