반응형

아두이노와 지문 인식 센서를 사용해 보자.

 

AS608 칩을 사용한 지문 인식 센서다.

 

핀맵은 왼쪽부터 아래와 같다. (D- D+는 USB 연결 시 사용한다)

D- D+ UA TCH GND RX TX VCC(3.3V)

제품마다 다를 수 있다.

 

아래와 같이 연결한다.

VCC - 3.3V

TX - D2

RX - D3

GND - GND

 

Arduino IDE - Library Manager - fingerprint를 검색하고 Adafruit Fingerprint Sensor Library를 설치한다.

 

 

File - Examples - Adafruit Fingerprint Sensor Library - enroll 을 선택한다.

 

컴파일하고 아두이노에 업로드한다.

 

시리얼 모니터를 확인하면 지문인식 센서가 인식되고 ID 입력을 기다린다.

 

127개의 지문을 인식할 수 있다. 처음 이므로 1을 입력하면 첫 번째 지문 등록 대기상태로 들어간다.

 

 

손가락을 대면 지문이 인식되고 뗐다 다시 대면 첫 번째 지문이 등록 된다. 2를 입력하고 동일한 방법으로 두 번째 지문을 등록한다.

 

이번엔 fingerprint 예제를 불러온다.

 

컴파일하고 업로드한다.

 

지문인식 센서가 인식되고 대기상태에 들어간다. 센서에 2개의 지문(템플릿)이 있다고 표시된다.

 

 

첫 번째 등록한 손가락을 대면 ID 1과 매치된다.

 

두 번째 손가락을 대면 ID 2와 매칭된다.

 

반응형
Posted by J-sean
:
반응형

토양 수분 센서를 라즈베리 파이와 함께 사용해 보자.

 

라즈베리 파이는 아날로그 신호를 입력 받을 수 없기 때문에 ADC(MCP3008)를 사용해야 한다.

 

Analog-Digital Converter

 

라즈베리 파이 - ADC - 토양 수분 센서를 연결한다.

 

 

ADC            -       Raspberry Pi

VDD                                5V
VREF                               5V
AGND                            Ground
CLK                           GPIO11(SCLK)
DOUT                         GPIO9(MISO)
DIN                            GPIO10(MOSI)
CS/SHDN                    GPIO8(CE0)
DGND                            Ground

 

Soil Moisture Sensor   -   ADC(Raspberry Pi)

VCC                                       (5V)

GND                                    (Ground)

A0                                         CH0

 

라즈베리 파이에서 raspi-config를 실행한다.

 

 

3 Interface Options를 선택한다.

 

I4 SPI를 선택한다.

 

YES를 선택한다.

 

SPI가 활성화 된다.

 

 

git이 설치되어 있지 않다면 설치한다.

 

py-spidev를 다운 받는다.

 

다운받은 py-spidev 디렉토리로 이동하고 설치한다

 

수분량을 감지하는 소스를 입력하고 저장한다.

 

 

소스를 실행하면 센서에서 읽은 값이 표시된다.

※ 참고

Python Spidev

 

반응형
Posted by J-sean
:
반응형

열 관련 시뮬레이션을 진행할때는 온도 측정 센서의 위치에 따라 결과가 크게 바뀔 수 있다.


시뮬레이션의 효율을 고려해 단순한 모양의 히터와 발열체 그리고 커버를 준비한다. (100X100X25mm)


Solution type - Transient, Total time: 3600 sec, Time increment: 30 sec

Thermostat cut off lower bound: 98°C, upper bound: 102°C

Thermostat position: 파란점(히터 외부)


히터 표면 9 포인트의 승온 그래프.


이번엔 Thermostat position을 히터 내부 발열체와 커버 사이로(붉은점) 지정한다.



히터 표면 9 포인트의 승온 그래프.


744초를 기준으로 목표 온도에 대해 더 낮은 overshooting 및 hunting을 보인다. 효율을 위해 작고 단순한 히터로 시뮬레이션 했기 때문에 차이가 극명하게 보이지 않지만 크고 복잡한 구조에서는 확실한 차이가 발생 한다.


반응형
Posted by J-sean
:
반응형

예전 영화에서 종종 볼 수 있던 레이저 침입 감지 시스템은 간단한 작동 원리에도 불구하고 레이저를 이용 한 방식이 뭔가 있어 보이는지 아직까지도 영화나 드라마에서 심심치 않게 볼 수 있다. 작동 원리가 간단한 만큼 저렴한 부품으로도 비슷하게 만들어 볼 수 있다.


침입 감지 시스템을 회피하기 위한 Catherine Zeta-Jones의 피나는 노력 (영화 Entrapment)


The Big Bang Theory


약 $0.4 짜리 레이저 모듈. 5V로 작동하고 출력 5mW, 파장 650nm의 붉은색 레이저를 발생 시킨다.


Red 

625 - 740nm

Orange

590 - 625nm

Yellow

565 - 590nm

Green

520 - 565nm

Cyan

500 - 520nm

Blue

435 - 500nm

Violet

380 - 435nm


약 $0.7 짜리 레이저 수신 모듈. 5V로 작동하고, 레이저가 수신 될때는 HIGH 시그널을, 수신 되지 않을때는 LOW 시그널을 출력 한다. 수신하려는 레이저 외, 태양이나 다른 강한 빛이 없는 실내용.



레이저 리시버 센서는 방향에 주의 한다. 반대로 연결하면 뜨거울 정도로 열이 발생 한다.


위 다이어그램과 같이 구성 한다.


레이저 모듈에서 레이저가 발생되고 수신 모듈에서 이 레이저를 감지하면 HIGH 시그널을 출력 한다.


중간에 장애물이 생겨 레이저를 수신하지 못하게 되면 수신 모듈에서 LOW 시그널을 출력하고 아두이노는 디지털 4번 핀으로 HIGH를 출력해 Buzzer를 작동 시킨다.



실제 부품의 연결 방식은 다이어그램과 다르지만 기본 구성은 동일 하다. 


소스를 컴파일하고 아두이노에 업로드 한다.


제작 과정 및 테스트


Serial Monitor에도 적의 침입 기록이 남는다.


반응형
Posted by J-sean
:
반응형

You can retrieve multiple sensor data at the same time. Say you need ACCELEROMETER and AMBIENT_TEMPERATURE data.

동시에 여러가지 센서 데이터를 받아 올 수 있다. 예를 들어 ACCELEROMETER 와 AMBIENT_TEMPERATURE 센서의 데이터를 받아 오자.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
public class MainActivity extends AppCompatActivity {
 
    TextView textView;
    TextView textView2;
 
    SensorManager manager;
    List<Sensor> sensors;
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
 
        textView = findViewById(R.id.textView);
        textView2 = findViewById(R.id.textView2);
 
        Button button = findViewById(R.id.button);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                manager = (SensorManager)getSystemService(SENSOR_SERVICE);
                sensors = manager.getSensorList(Sensor.TYPE_ALL);
 
                int index = 0;
                for (Sensor sensor : sensors) {
                    textView.append("#" + index++ + ": " + sensor.getName() + '\n');
                }
            }
        });
 
        final SensorEventListener sensorEventListener = new SensorEventListener() {
            @Override
            public void onSensorChanged(SensorEvent event) {
                if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) {
                    String str = "Sensor Timestamp: " + event.timestamp + "\n\n";
                    str = str + "Sensor Accuracy: " + event.accuracy + '\n';
 
                    for (int index = 0; index < event.values.length; index++) {
                        str += ("Sensor Value #" + index + ": " + event.values[index] + '\n');
                    }
 
                    textView.setText(str);
                }
 
                if (event.sensor.getType() == Sensor.TYPE_AMBIENT_TEMPERATURE) {
                    String str = "Sensor Timestamp: " + event.timestamp + "\n\n";
                    str = str + "Sensor Accuracy: " + event.accuracy + '\n';
 
                    for (int index = 0; index < event.values.length; index++) {
                        str += ("Sensor Value #" + index + ": " + event.values[index] + '\n');
                    }
 
                    textView2.setText(str);
                }
            }
 
            /*
            SENSOR_STATUS_ACCURACY_HIGH
            This sensor is reporting data with maximum accuracy
            Constant Value: 3 (0x00000003)
            SENSOR_STATUS_ACCURACY_LOW
            This sensor is reporting data with low accuracy, calibration with the environment is needed
            Constant Value: 1 (0x00000001)
            SENSOR_STATUS_ACCURACY_MEDIUM
            This sensor is reporting data with an average level of accuracy, calibration with the environment may improve the readings
            Constant Value: 2 (0x00000002)
            SENSOR_STATUS_NO_CONTACT
            The values returned by this sensor cannot be trusted because the sensor had no contact with what it was measuring
            (for example, the heart rate monitor is not in contact with the user).
            Constant Value: -1 (0xffffffff)
            SENSOR_STATUS_UNRELIABLE
            The values returned by this sensor cannot be trusted, calibration is needed or the environment doesn't allow readings
            Constant Value: 0 (0x00000000)
            */
 
            @Override
            public void onAccuracyChanged(Sensor sensor, int accuracy) {
 
            }
        };
 
        Button button2 = findViewById(R.id.button2);
        button2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                manager.registerListener(sensorEventListener, manager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER), SensorManager.SENSOR_DELAY_UI);
                // If sensors.get(0) == manager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER)...
                //manager.registerListener(sensorEventListener, sensors.get(0), SensorManager.SENSOR_DELAY_UI);
                manager.registerListener(sensorEventListener, manager.getDefaultSensor(Sensor.TYPE_AMBIENT_TEMPERATURE), SensorManager.SENSOR_DELAY_UI);
            }
        });
 
        Button button3 = findViewById(R.id.button3);
        button3.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                manager.unregisterListener(sensorEventListener, manager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER));
                // If sensors.get(0) == manager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER)...
                //manager.unregisterListener(sensorEventListener, sensors.get(0));
                manager.unregisterListener(sensorEventListener, manager.getDefaultSensor(Sensor.TYPE_AMBIENT_TEMPERATURE));
            }
        });
    }
}



Sensor List


Sensor data


반응형
Posted by J-sean
: