質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.47%

  • Python

    12249questions

    Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

  • Raspberry Pi

    1087questions

    Raspberry Piは、ラズベリーパイ財団が開発した、名刺サイズのLinuxコンピュータです。 学校で基本的なコンピュータ科学の教育を促進することを意図しています。

  • Arduino

    691questions

    Arduinoは、AVRマイコン、単純なI/O(入出力)ポートを備えた基板、C言語を元としたArduinoのプログラム言語と、それを実装した統合開発環境から構成されたシステムです。

ArduinoUnoR3とRaspberryPi3MODEL:Bでシリアル通信を行い文字を送信させたい

解決済

回答 1

投稿

  • 評価
  • クリップ 1
  • VIEW 717

x066

score 11

やりたいこと

Arduinoと指紋認証センサのZFM-20を用いて、指紋データと紐付けされたID番号をシリアル通信によりRaspberryPiへ送信してテキスト出力したいです。
IDと指紋の登録にはこちらで提供されているenroll、確認にはfingerprintを用いました。
今回使用したArduinoのソースコードはfingerprintを一部改変して使用しました。
RaspberryPiとArduinoはusbケーブルで接続されています。

できないこと

テキストファイルが正しく出力されません。
ID番号ではなく、シリアルモニタに出力している文字列の一部が出力されてしまいます。
enrollにより指紋とID番号2との紐付けは出来ております。

Ardunioのソースコード

void loopの部分でID番号の送信を行わせたいです。

/*************************************************** 
  This is an example sketch for our optical Fingerprint sensor

  Designed specifically to work with the Adafruit BMP085 Breakout 
  ----> http://www.adafruit.com/products/751

  These displays use TTL Serial to communicate, 2 pins are required to 
  interface
  Adafruit invests time and resources providing this open source code, 
  please support Adafruit and open-source hardware by purchasing 
  products from Adafruit!

  Written by Limor Fried/Ladyada for Adafruit Industries.  
  BSD license, all text above must be included in any redistribution
 ****************************************************/


#include "./Adafruit_Fingerprint.h"
#include <stdio.h>
#include <stdlib.h>
// On Leonardo/Micro or others with hardware serial, use those! #0 is green wire, #1 is white
// uncomment this line:
// #define mySerial Serial1

// For UNO and others without hardware serial, we must use software serial...
// pin #2 is IN from sensor (GREEN wire)
// pin #3 is OUT from arduino  (WHITE wire)
// comment these two lines if using hardware serial
#include <SoftwareSerial.h>


SoftwareSerial mySerial(2, 3);

Adafruit_Fingerprint finger = Adafruit_Fingerprint(&mySerial);
FILE *fp;

void setup()  
{
  Serial.begin(9600);
  while (!Serial);  // For Yun/Leo/Micro/Zero/...
  delay(100);
  Serial.println("\n\nAdafruit finger detect test");

  // set the data rate for the sensor serial port
  finger.begin(57600);

  if (finger.verifyPassword()) {
    Serial.println("Found fingerprint sensor!");
  } else {
    Serial.println("Did not find fingerprint sensor :(");
    while (1) { delay(1); }
  }

  finger.getTemplateCount();
  Serial.print("Sensor contains "); Serial.print(finger.templateCount); Serial.println(" templates");
  Serial.println("Waiting for valid finger...");
}

void loop()                     // run over and over again
{
  //追加部分
  int id;
  id =  getFingerprintIDez();
  Serial.write(id);
  delay(20);
  //追加部分

 fprintf(fp,"%d",id);
 fclose(fp);
  delay(50);            //don't ned to run this at full speed.
}



uint8_t getFingerprintID() {
  uint8_t p = finger.getImage();
  switch (p) {
    case FINGERPRINT_OK:
      Serial.println("Image taken");
      break;
    case FINGERPRINT_NOFINGER:
      Serial.println("No finger detected");
      return p;
    case FINGERPRINT_PACKETRECIEVEERR:
      Serial.println("Communication error");
      return p;
    case FINGERPRINT_IMAGEFAIL:
      Serial.println("Imaging error");
      return p;
    default:
      Serial.println("Unknown error");
      return p;
  }

  // OK success!

  p = finger.image2Tz();
  switch (p) {
    case FINGERPRINT_OK:
      Serial.println("Image converted");
      break;
    case FINGERPRINT_IMAGEMESS:
      Serial.println("Image too messy");
      return p;
    case FINGERPRINT_PACKETRECIEVEERR:
      Serial.println("Communication error");
      return p;
    case FINGERPRINT_FEATUREFAIL:
      Serial.println("Could not find fingerprint features");
      return p;
    case FINGERPRINT_INVALIDIMAGE:
      Serial.println("Could not find fingerprint features");
      return p;
    default:
      Serial.println("Unknown error");
      return p;
  }

  // OK converted!
  p = finger.fingerFastSearch();
  if (p == FINGERPRINT_OK) {
    Serial.println("Found a print match!");
  } else if (p == FINGERPRINT_PACKETRECIEVEERR) {
    Serial.println("Communication error");
    return p;
  } else if (p == FINGERPRINT_NOTFOUND) {
    Serial.println("Did not find a match");
    return p;
  } else {
    Serial.println("Unknown error");
    return p;
  }   

  // found a match!
  Serial.print("Found ID #"); Serial.print(finger.fingerID); 
  Serial.print(" with confidence of "); Serial.println(finger.confidence); 

  return finger.fingerID;
}

// returns -1 if failed, otherwise returns ID #
int getFingerprintIDez() {
  uint8_t p = finger.getImage();
  if (p != FINGERPRINT_OK)  return -1;

  p = finger.image2Tz();
  if (p != FINGERPRINT_OK)  return -1;

  p = finger.fingerFastSearch();
  if (p != FINGERPRINT_OK)  return -1;

  // found a match!
  Serial.print("Found ID #"); Serial.print(finger.fingerID); 
  Serial.print(" with confidence of "); Serial.println(finger.confidence);
  return finger.fingerID; 
}

Arduinoのシリアルモニタ

シリアルモニタの画像です。
5行目の「Found ID #2 ...」から指紋とIDの紐付けが確実に行われていることが分かります。
このID番号を出力させたいのですが、現在はモニタ内の文章の一部がテキストファイルに出力されてしまいます。

イメージ説明

RaspberryPiのソースコード

# -*- encoding: utf-8 -*-

import serial
import time

ser = serial.Serial('/dev/ttyACM0',9600)
time.sleep(2)#boottime

str = ser.read(5)
f = open('text.txt','w')
f.write(str)
f.close()

出力されたtxtファイル

上記のシリアルモニタ内の「Adafruit finger....」のAdaの部分が出力されています。

Ada

分かりにくい部分があれば連絡お願い致します。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+1

ser.read(5)で1回だけ5文字しか受信していないからです。
そのため、通信設定にもよりますがおそらく改行(\r\n)含めて「ada(\r\n)」しかテキストには出力できていません。

シリアル通信で連続的に送信されるデータを受信するにはテキスト行ベースで扱うと楽です。
すなわち、送信側(Arduino)は、データをすべて文字列(テキストデータ)として構築し、最後に改行を含めて送信します。
受信側(RaspPi)ではreadline()で改行まで一気に受信します。
さらに全体終了を示すコマンド文字列<end>も決めておくと制御が楽になります。

以下、概念コードです。

while True:
    str = ser.readlne()
    if str.rstrip() == '<end>':
        break

    # テキストに出力など

なお、Arduino側ソースのSerial.write(id);Serial.print(id);と数値文字(テキストデータ)として出力したほうが、受信側にとっても分かりやすいです。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/02/02 19:31

    回答ありがとうございます。
    テキストファイルに無事に書き込まれました。

    続けての質問になってしまうのですが、このID番号の部分のみを出力することは可能でしょうか?
    また無限ループではなく、1つのIDを識別したら終了するような仕組みにはできないでしょうか?

    現在のテキストファイル出力結果です↓
    3-1-1-1-1-1-1-1-1-1-1Found ID #3 with confidence of 70

    キャンセル

  • 2018/02/02 20:00

    RaspPi側で「Found ID #3」という文字が含まれていたら
    #の後ろの数字部分を抜き出してファイルに出力して受信ループを抜ければよいです。
    それぞれ簡単な文字列判定、比較、抽出でできます。

    キャンセル

  • 2018/02/02 20:09

    分かりました。試してみます。
    丁寧な回答をしてくださり、ありがとうございました。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.47%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る

  • Python

    12249questions

    Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

  • Raspberry Pi

    1087questions

    Raspberry Piは、ラズベリーパイ財団が開発した、名刺サイズのLinuxコンピュータです。 学校で基本的なコンピュータ科学の教育を促進することを意図しています。

  • Arduino

    691questions

    Arduinoは、AVRマイコン、単純なI/O(入出力)ポートを備えた基板、C言語を元としたArduinoのプログラム言語と、それを実装した統合開発環境から構成されたシステムです。