ページ

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

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の同時点灯はできないようなので、注意が必要です。


その他関数

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

2020年9月2日水曜日

PETGの印刷設定とか

今回はamazonで売ってる安いPETGを購入し、しばらく印刷し大体わかってきたので備忘録として書いとこうかなと思います。

まあレビュー欄見たら個体差が大きいようであんまあてにおならないかもしれないが参考までに。

今回購入したのはこちら


購入したときは2580円でした。

プリンターはAdventurer3を使用します。

スライス設定はこんな感じ。


高精度設定はこんな感じです。


レイヤーの高さは0.15mm、第一層目のレイヤーは0.35mm
ヘッド温度235℃、プラットフォーム温度70℃

これでプラットフォームにあまり定着しないようだったら、第一層目のレイヤーを0.40mmにしプラットフォーム温度を75~80℃に設定してみてください。

長さの取り消し、スピードはあまり変わらないです。


急ぎ設定だとこんな感じ。

これでだいぶ早くなります。
印刷は荒いですがしっかり印刷できました。


高精度設定でマスクを印刷してみます。



これだけで4時間です。

と思いましたが、2時間経過したところで印刷を中止しました。

理由は印刷がうまくいかなかったからです。

ちょ、見てほしい




なんか荒いんだよなあ・・・

これはファンをオンにしてる影響なのか…?

いずれにせよこんなのつけてたら顔がいてえってことで中止しました。

まあこんな感じできれいに印刷できたのでいいんじゃないですか(適当)

こんな感じで終わります。





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


↓よかったらクリックお願いします↓
にほんブログ村 その他趣味ブログ 電子工作へ


2020年7月1日水曜日

FlashForge Adventurer3の糸引きとプラットフォームに定着しない問題。

今回はタイトル通りFlashForgeのAdventurer3で起きた問題についてです。
スライスソフトはFlashForge純正のFlashPrintを使用しています。

色々設定を変えて出力を行いました。


適当にモデルを作り、取り消し長さ、スピードや、ヘッドとプラットホームの温度、ヘッド移動速度など色々変えて13個ほど出力してみました。


取り消し長さは6.5mm以上にすると印刷物が荒くなったので5.5mmほどに決めました。
取り消しスピードによる結果の変化はありませんでした。


ヘッドの温度はFlashForge製PLA樹脂の説明書に記載の190~220℃で5℃ずつ変化させて印刷。
190℃で印刷するとかなり綺麗な糸引きでしたが、プラットフォームへの定着ができないのではないかという懸念から195~200℃に決定。


プラットフォーム温度による糸引きに差はありませんでしたが、70℃に設定したところプラットフォームへの定着はかなり改善されました。
そのかわり、取り出すときは少し冷まさないと取れません。

電気代もかかるので、大型なものを印刷するときは70℃に設定しようかな
そもそもラフト印刷すればいいじゃんってことで初期値より5℃高い55℃に設定。


あとは一層目の最大速度と最大移動速度ですね。
これにより一層目のプラットフォームへの定着問題がかなり改善されます。
最大速度は10mm/s、最大移動速度は50mm/sに設定したのですが、こうすると一層目の印刷範囲が広い場合かなり時間がかかってしまいます。
なので印刷範囲が広いときは、最大速度は15mm/sとかにするといいでしょう。


これが最終的なスライス設定です。

完全に糸引き問題について解決することはできませんでしたが、まあ妥協も大事ですよ。
プラットフォームへの定着問題につきましては、これにて解決できたかなと思います。
まあ定着しないならノリ塗れって話なんだろうけどプラットフォームを汚したくないのでその機会は本当に困った時だけでしょうたぶん。

近々3Dプリント関連についていろいろ書いていこうと思ってます。
そもそも見てくれてる人いるのか?こんな記事

まあ備忘録ってことで。

ではノシ



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


↓よかったらクリックお願いします↓
にほんブログ村 その他趣味ブログ 電子工作へ


2020年6月10日水曜日

Surface Laptop2のキーボードが反応しなくなった話

久しぶりです。
今朝、起きてパソコンを立ち上げ文字を打とうとするとキーボードが反応しなくなっていて焦りました。
結果的に治りましたので備忘録として載せておきます。
調べてみて、実践したことを箇条書きと説明で乗せていきます。

再起動
→全く変わらず。

すべてのボタン押してみる
→電源ボタンのみ反応。

簡単操作→キーボードですべてオフし許可するのチェックを外す
→変化なし。

デバイスマネージャーからキーボードのデバイスをアンインストール後再起動
→音沙汰なし。電源ボタンのみ反応。

音量大小(F5, F6)ボタンと電源ボタンを長押しで強制シャットダウンし、起動
→今までついていなかったキーボードのライトが光起動し勝利を確信。

といった具合でした。
ここまで30分。長期戦にはならず助かりました。
参考になればと思います。

では




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


↓よかったらクリックお願いします↓
にほんブログ村 その他趣味ブログ 電子工作へ


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に抵抗挟んでいませんが回路図の通り抵抗挟んだ方がいいです。
一応補足でした。

では。ノシ


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

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

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