편집 기록

편집 기록
  • 프로필 알 수 없는 사용자님의 편집
    날짜2018.09.05

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


    아두이노에 지문인식 센서를 달고 라즈베리파이와 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통신에 충돌이 있는건가요??

  • 프로필 엽토군님의 편집
    날짜2018.09.05

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


    아두이노에 지문인식 센서를 달고 라즈베리파이와 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통신에 충돌이 있는건가요??

  • 프로필 알 수 없는 사용자님의 편집
    날짜2018.08.29

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


    아두이노에 지문인식 센서를 달고 라즈베리파이와 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통신에 충돌이 있는건가요??