라즈베리와 아두이노 통신 질문입니다!

조회수 1559회

아두이노에 지문인식 센서를 달고 라즈베리파이와 uart통신을 하고 있습니다. 코딩을 하는중 지문인식센서의 값을 라즈베리파이에서 받지 못하여 코딩이 잘못되었나 질문 올립니다.

라즈베리파이 소스 입니다.

import time
import picamera
import datetime
import requests
import os
from flask import Flask, redirect, url_for
from werkzeug import secure_filename
import serial


port = "/dev/ttyACM0"
serialFromArduino = serial.Serial(port, 9600)
serialFromArduino.flushInput()



while True:
    if(serialFromArduino.inWaiting() > 0):
        input = serialFromArduino.read(1)
#        input = serialFromArduino.read(1)
       # print(input)
    if input=='a':
        with picamera.PiCamera() as camera:
                camera.brightness = 60
                camera.start_preview(fullscreen=False,window=(100,20,1024,768))
                time.sleep(5)
                camera.capture("A.jpg")
                print("AOK")
                camera.stop_preview()
                camera.close()
    if input=='b':
        with picamera.PiCamera() as camera:
                camera.brightness = 60
                camera.start_preview(fullscreen=False,window=(100,20,1024,768))
                time.sleep(5)
                camera.capture("B.jpg")
                print("BOK")
                camera.stop_preview()
                camera.close()

아두이노 소스입니다.

#include <Adafruit_Fingerprint.h>

#include <Wire.h>                            // I2C control library

#include <LiquidCrystal_I2C.h>          // LCD library 

#include <SoftwareSerial.h>

SoftwareSerial mySerial(18, 19);

#define SHOCK 5

LiquidCrystal_I2C lcd(0x27,16,2);



Adafruit_Fingerprint finger = Adafruit_Fingerprint(&mySerial);

/////////////////스위치////////////////////////////

int inputPin = 2; // 센서 시그널핀

int pirState = LOW; // PIR 초기상태

int val = 0; // Signal 입력값



int RELAY=8;



////////////////지문횟수/////////////////

int a=0;

//////////////////



void setup()  

{

Serial.begin(9600);

//////////////홀센서/////////////////////////////////



 pinMode(A0,INPUT);

  pinMode(A1,INPUT);

  ////////////////충격감지/////////////

  pinMode(SHOCK, INPUT);





 //////////////////릴레이+전자솔레노이드////////////

  pinMode(RELAY,OUTPUT);

 pinMode(3,OUTPUT);

 pinMode(4,OUTPUT);

  digitalWrite(RELAY,LOW); 





  /////////////////////전원 제어 스위치///////////////////////////

 pinMode(inputPin, INPUT);



  /////////////////////////지문센서////////////////////////////// 

  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 :(");
  }



  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

{

  ////////////////충격감지////////////

  if (digitalRead(SHOCK ) == HIGH) 
  {

    Serial.println('b');

  }



  val = digitalRead(inputPin);

  /////////////////////////////스위치로 전원 제어//////////////////////////////////////



  if(val == HIGH)

  {

  lcd.init();              

  lcd.setCursor(0,0);

  lcd.print("Welcome DDL!");

  lcd.setCursor(0,1);

  lcd.print("Put your finger!");

  lcd.backlight();

  Serial.println('a');



   ////////////////////지문센서////////////////////////////////////////////

   getFingerprintIDez();





    if(a>=0 && a<=2)

    {

      digitalWrite(3,LOW);

      digitalWrite(4,LOW);

    }   

  }



  else 

  {         
    Serial.println('c');

    lcd.noBacklight();  // turn on backlight  

    lcd.noDisplay();

  }



}

// returns -1 if failed, otherwise returns ID #

int getFingerprintIDez() {

  digitalWrite(RELAY,LOW);

  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) {

 a++;



 if(a>=3)

 {

  //////////EM락///////////////////////////

  digitalWrite(3,LOW);

  digitalWrite(4,HIGH);

///////////////////////////////////////////////////



  lcd.init();  

  lcd.setCursor(0,0);

  lcd.print("close the door");



  }



 lcd.init();  

 lcd.setCursor(0,0);

 lcd.print("Unsaved        ");

 lcd.setCursor(0,1);

 lcd.print("Fingerprint     ");

  return -1;

  }

  //지문 틀렸을시//



  a=0;//틀린횟수



  lcd.init();  

  lcd.setCursor(0,0);

  lcd.print("Open the door");

  delay(100);

  lcd.setCursor(0,1);

  lcd.print("                ");

  delay(100);

  lcd.setCursor(0,0);

  lcd.print("Welcome DDL!   ");

  lcd.setCursor(0,1);

  lcd.print("Put your finger!");

  // found a match!

  Serial.print("Found ID #"); Serial.print(finger.fingerID); 

  Serial.print(" with confidence of "); Serial.println(finger.confidence);

   digitalWrite(RELAY,HIGH);

  delay(300);

  return finger.fingerID; 

}

이 두개를 실행을 시키면 아두이노는 동작을 합니다. 하지만 아두이노의 값을 라즈베리가 받지 못하는거 같습니다.

실행 오류로는 사진으로 올립니다. 이미지

이거 말고도 때로는 serialFromArduino.inWaiting() > 0 이쪽 부분에서도 오류가 뜨는데 처음 작성할때는 오류가 안뜨던 부분이라... 어떤게 잘못된건지 잘 모르겠습니다.. 도움 부탁드립니다.

혹시 지무인식과 라즈베리파이가 uart통신에 충돌이 있는건가요??

1 답변

  • 환경을 갖출 수는 없어서 뭐 정확한 답변을 드리지는 못하겠는데 ㅋㅋ 지나가다 몇 자 끄적여 봅니다.

    에러 로그에 뜨는대로

    1. 디바이스가 disconnect 된건지 확인
    2. 하나의 포트에 다중 접속이 된 상황인지 확인

    해보시고

    그것도 아니라면... 어짜피 에러가 발생하여 멈추는 것이 문제이니 I/O(read) 부분을 try...except 문으로 감싸서 예외 처리를 해 보심이 어떠한지요.

    어짜피 라즈베리파이쪽에서 무한루프를 돌면서 입력을 polling하는 코드라 except가 발생해도 계속해서 다음 tick에 다시 받을 수 있을 것 같은데요? ㅎ

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)