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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Raspberry Pi

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

Python

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

Arduino

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

Q&A

解決済

1回答

458閲覧

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

x066

総合スコア23

Raspberry Pi

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

Python

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

Arduino

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

0グッド

1クリップ

投稿2018/02/02 09:02

#やりたいこと
Arduinoと指紋認証センサのZFM-20を用いて、指紋データと紐付けされたID番号をシリアル通信によりRaspberryPiへ送信してテキスト出力したいです。
IDと指紋の登録にはこちらで提供されているenroll、確認にはfingerprintを用いました。
今回使用したArduinoのソースコードはfingerprintを一部改変して使用しました。
RaspberryPiとArduinoはusbケーブルで接続されています。
##できないこと
テキストファイルが正しく出力されません。
ID番号ではなく、シリアルモニタに出力している文字列の一部が出力されてしまいます。
enrollにより指紋とID番号2との紐付けは出来ております。
##Ardunioのソースコード
void loopの部分でID番号の送信を行わせたいです。

ino

1/*************************************************** 2 This is an example sketch for our optical Fingerprint sensor 3 4 Designed specifically to work with the Adafruit BMP085 Breakout 5 ----> http://www.adafruit.com/products/751 6 7 These displays use TTL Serial to communicate, 2 pins are required to 8 interface 9 Adafruit invests time and resources providing this open source code, 10 please support Adafruit and open-source hardware by purchasing 11 products from Adafruit! 12 13 Written by Limor Fried/Ladyada for Adafruit Industries. 14 BSD license, all text above must be included in any redistribution 15 ****************************************************/ 16 17 18#include "./Adafruit_Fingerprint.h" 19#include <stdio.h> 20#include <stdlib.h> 21// On Leonardo/Micro or others with hardware serial, use those! #0 is green wire, #1 is white 22// uncomment this line: 23// #define mySerial Serial1 24 25// For UNO and others without hardware serial, we must use software serial... 26// pin #2 is IN from sensor (GREEN wire) 27// pin #3 is OUT from arduino (WHITE wire) 28// comment these two lines if using hardware serial 29#include <SoftwareSerial.h> 30 31 32SoftwareSerial mySerial(2, 3); 33 34Adafruit_Fingerprint finger = Adafruit_Fingerprint(&mySerial); 35FILE *fp; 36 37void setup() 38{ 39 Serial.begin(9600); 40 while (!Serial); // For Yun/Leo/Micro/Zero/... 41 delay(100); 42 Serial.println("\n\nAdafruit finger detect test"); 43 44 // set the data rate for the sensor serial port 45 finger.begin(57600); 46 47 if (finger.verifyPassword()) { 48 Serial.println("Found fingerprint sensor!"); 49 } else { 50 Serial.println("Did not find fingerprint sensor :("); 51 while (1) { delay(1); } 52 } 53 54 finger.getTemplateCount(); 55 Serial.print("Sensor contains "); Serial.print(finger.templateCount); Serial.println(" templates"); 56 Serial.println("Waiting for valid finger..."); 57} 58 59void loop() // run over and over again 60{ 61 //追加部分 62 int id; 63 id = getFingerprintIDez(); 64 Serial.write(id); 65 delay(20); 66 //追加部分 67 68 fprintf(fp,"%d",id); 69 fclose(fp); 70 delay(50); //don't ned to run this at full speed. 71} 72 73 74 75uint8_t getFingerprintID() { 76 uint8_t p = finger.getImage(); 77 switch (p) { 78 case FINGERPRINT_OK: 79 Serial.println("Image taken"); 80 break; 81 case FINGERPRINT_NOFINGER: 82 Serial.println("No finger detected"); 83 return p; 84 case FINGERPRINT_PACKETRECIEVEERR: 85 Serial.println("Communication error"); 86 return p; 87 case FINGERPRINT_IMAGEFAIL: 88 Serial.println("Imaging error"); 89 return p; 90 default: 91 Serial.println("Unknown error"); 92 return p; 93 } 94 95 // OK success! 96 97 p = finger.image2Tz(); 98 switch (p) { 99 case FINGERPRINT_OK: 100 Serial.println("Image converted"); 101 break; 102 case FINGERPRINT_IMAGEMESS: 103 Serial.println("Image too messy"); 104 return p; 105 case FINGERPRINT_PACKETRECIEVEERR: 106 Serial.println("Communication error"); 107 return p; 108 case FINGERPRINT_FEATUREFAIL: 109 Serial.println("Could not find fingerprint features"); 110 return p; 111 case FINGERPRINT_INVALIDIMAGE: 112 Serial.println("Could not find fingerprint features"); 113 return p; 114 default: 115 Serial.println("Unknown error"); 116 return p; 117 } 118 119 // OK converted! 120 p = finger.fingerFastSearch(); 121 if (p == FINGERPRINT_OK) { 122 Serial.println("Found a print match!"); 123 } else if (p == FINGERPRINT_PACKETRECIEVEERR) { 124 Serial.println("Communication error"); 125 return p; 126 } else if (p == FINGERPRINT_NOTFOUND) { 127 Serial.println("Did not find a match"); 128 return p; 129 } else { 130 Serial.println("Unknown error"); 131 return p; 132 } 133 134 // found a match! 135 Serial.print("Found ID #"); Serial.print(finger.fingerID); 136 Serial.print(" with confidence of "); Serial.println(finger.confidence); 137 138 return finger.fingerID; 139} 140 141// returns -1 if failed, otherwise returns ID # 142int getFingerprintIDez() { 143 uint8_t p = finger.getImage(); 144 if (p != FINGERPRINT_OK) return -1; 145 146 p = finger.image2Tz(); 147 if (p != FINGERPRINT_OK) return -1; 148 149 p = finger.fingerFastSearch(); 150 if (p != FINGERPRINT_OK) return -1; 151 152 // found a match! 153 Serial.print("Found ID #"); Serial.print(finger.fingerID); 154 Serial.print(" with confidence of "); Serial.println(finger.confidence); 155 return finger.fingerID; 156}

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

イメージ説明
##RaspberryPiのソースコード

Python

1# -*- encoding: utf-8 -*- 2 3import serial 4import time 5 6ser = serial.Serial('/dev/ttyACM0',9600) 7time.sleep(2)#boottime 8 9str = ser.read(5) 10f = open('text.txt','w') 11f.write(str) 12f.close()

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

txt

1 2 3Ada

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

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

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

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

以下、概念コードです。

Python

1while True: 2 str = ser.readlne() 3 if str.rstrip() == '<end>': 4 break 5 6 # テキストに出力など

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

投稿2018/02/02 09:44

can110

総合スコア38266

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

x066

2018/02/02 10:31

回答ありがとうございます。 テキストファイルに無事に書き込まれました。 続けての質問になってしまうのですが、このID番号の部分のみを出力することは可能でしょうか? また無限ループではなく、1つのIDを識別したら終了するような仕組みにはできないでしょうか? 現在のテキストファイル出力結果です↓ 3-1-1-1-1-1-1-1-1-1-1Found ID #3 with confidence of 70
can110

2018/02/02 11:00

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

2018/02/02 11:09

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問