일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- conda base 활성화
- 실행중인 포트 죽이기
- conda 기초 설정
- conda 가상환경 설정 오류
- conda base 기본 설정
- 티스토리챌린지
- 3000 port kill
- 오블완
- window netstat time wait 제거
- time wait port kill
- 려려
- Today
- Total
모도리는 공부중
21.02.10. 아두이노를 활용한 IoT수업 - 가변저항, 압력센서, 부저, WiFi모듈, IoT 종합 복습 본문
21.02.10. 아두이노를 활용한 IoT수업 - 가변저항, 압력센서, 부저, WiFi모듈, IoT 종합 복습
공부하는 모도리 2021. 2. 10. 16:52가변저항 센서
// the setup routine runs once when you press reset:
void setup() {
// initialize serial communication at 9600 bits per second:
Serial.begin(9600);
}
// the loop routine runs over and over again forever:
void loop() {
// read the input on analog pin 0:
int sensorValue = analogRead(A0);
// print out the value you read:
Serial.println(sensorValue);
delay(1); // delay in between reads for stability
}
가변저항을 돌려봤을 때 내 센서는 최저 86, 최고 1023이 나왔다.
다시 led를 연결하여 아날로그 신호를 led로 보내보도록 한다.
// the setup routine runs once when you press reset:
void setup() {
// initialize serial communication at 9600 bits per second:
Serial.begin(9600);
pinMode(9, OUTPUT);
}
// the loop routine runs over and over again forever:
void loop() {
// read the input on analog pin 0:
int sensorValue = analogRead(A0);
// print out the value you read:
Serial.println(sensorValue);
if (sensorValue >= 90) {
for (int i = 0; i <= sensorValue/4; i++) {
analogWrite(9, i);
}
} else {
analogWrite(9,0);
}
delay(1); // delay in between reads for stability
}
위의 코드를 map을 이용하면 굳이 /4를 사용하지 않고 더 간단하게 작성이 가능하다.
map(sensorValue, 0, 1023, 0, 255);
// the setup routine runs once when you press reset:
void setup() {
// initialize serial communication at 9600 bits per second:
Serial.begin(9600);
pinMode(9, OUTPUT);
}
// the loop routine runs over and over again forever:
void loop() {
int sensorValue = analogRead(A0);
Serial.println(sensorValue);
// 0 ~ 1023
// 0 ~ 255
int mapValue = map(sensorValue, 86, 1023, 0, 255);
analogWrite(9, mapValue);
delay(1); // delay in between reads for stability
}
압력센서는 일반적으로 자세교정에 많이 사용되는 편이다.
저항에 따라 값이 달라지는데 갈검빨은 400대, 갈검주는 800대까지 올라간다. (900은 손이 빨개지도록 눌러야 잠깐씩 보인다.)
// the setup routine runs once when you press reset:
void setup() {
// initialize serial communication at 9600 bits per second:
Serial.begin(9600);
pinMode(9, OUTPUT);
}
// the loop routine runs over and over again forever:
void loop() {
int sensorValue = analogRead(A0);
Serial.println(sensorValue);
int mapValue = map(sensorValue, 0, 900, 0, 255);
analogWrite(9, mapValue);
delay(1); // delay in between reads for stability
}
압력센서 결과 동영상
초음파센서
누가 봐도 스피커처럼 생겼지만 스피커는 아니고 초음파센서인 이 녀석. '거리를 인식'하는 녀석이며 예시로 자동차 후방 센서를 말씀해주셨다.
5v, 트리거 쏘고, 받고, 마이너스
VCC = 5V (+) / Trig = 2 / Echo = 3 / GND = GND (-)
연결하고
코드는 이렇게 작성한다.
int trig = 2;
int echo = 3;
void setup() {
pinMode(trig, OUTPUT);
pinMode(echo, INPUT);
Serial.begin(9600);
}
void loop() {
digitalWrite(trig, HIGH);
delay(1);
digitalWrite(trig, LOW);
// pulseIn(echo, HIGH); ← echo핀의 상태가 LOW에서 HIGH로 변하는 시점에서 걸리는 시간을 가져온다.
int duration = pulseIn(echo, HIGH);
int distance = duration/2/29; //왕복을 편도로 바꾸기 위해 2로 나누고 그 값을 29로 나눠준다.
Serial.print(distance);
Serial.println("cm"); // 문자열 연산이 되지 않으므로 print문을 한 번 더 사용.
delay(300); // 0.3초
}
-- 거리를 인식해서 시리얼모니터에 출력하는 동영상--
부저를 이용해서 만들어봅시다.
부저의 다리 길이가 같으면 보통 구분없이 사용하며, 다리 길이가 다르면 플러스 마이너스가 표기되어 있으므로 구분하여 사용한다. 만약 다리 길이가 같은데도 불구하고 구분되어 작성되었다면 그에 맞게 사용해주는 것이 맞다.
플러스는 8번 핀에, 마이너스는 마이너스에 연결을 해준다.
tone(pin, frequency, duration)
void setup() {
}
void loop() {
tone(8, 300, 1000);
delay(2000);
}
--소리가 나오는 부저 동영상--
frequency(주파수)의 값을 바꿔줄 때마다 나오는 값이 다 달라진다.
현재는 소리가 1초동안 나고 2초동안 멈춰있다.
그럼 이 값을 1초로 바꿔주면 어떻게 될까?
void setup() {
}
void loop() {
tone(8, 2000, 1000);
delay(1000);
}
2000은 귀청 찢어지는 소리가 나므로 1000으로 바꿔주었다.....
딜레이를 1000으로 바꿔주었더니 소리가 멈추지 않고 계속 날 것이다.
딜레이가 지속되는 동안 소리도 계속 나고 있다. 실행하는 동안 딜레이도 진행되기 때문에 실제로는 소리가 1초 나고 딜레이도 1초로 작동되었던 것. 우리는 속았습니다..^^
그렇다면 여기서 알 수 있는 부분은 무엇인가? 딜레이를 주고 싶으면 배수로 줘야 실제로는 /2로 적용이 된다는 것이다.
병원이나 어딘가 방문하면 문이 열리고 닫힐 때 나는 띠링띠링 소리를 들어본 적이 있을 것이다. 만들어봅시다.
int trig = 2;
int echo = 3;
void setup() {
pinMode(trig, OUTPUT);
pinMode(echo, INPUT);
Serial.begin(9600);
}
void loop() {
digitalWrite(trig, HIGH);
delay(1);
digitalWrite(trig, LOW);
int duration = pulseIn(echo, HIGH);
int distance = duration/2/29;
Serial.print(distance);
Serial.println("cm");
if (distance > 0 && distance < 10) {
tone(8, 1318, 500);
delay(500);
tone(8, 1046, 500);
delay(500);
}
}
-- 거리에 따라 소리가 나는 동영상 --
이번엔 와이파이 센서를 활용해서 수업해봅시다.
'ESP8266'이라는 통신 모듈입니다.
이더넷쉴드라는 것을 사용하면 아듀이노에서도 인터넷을 사용할 수 있다. 실은 인터넷이 되는 보드가 우노보드 말고도 또 있는데 그것은 제한적이다.
Serial.begin(9600); 은 시리얼 넘버를 사용하겠다는 의미. 지금 우리가 받은 와이파이 모듈은 115,200이지만 우노보드는 사용 불가. 다운을 시켜줘야 사용이 가능하다.
위의 잭을 이용하여 와이파이모듈을 우노보드와 빵판에 연결하는 작업을 진행해봅시다.
와이파이는 5v가 아닌 3.3v 사용. 5v 사용시 고장 위험.
그림과 같이 잘 배치하면 다음 사진처럼 빨간불이 들어온다.
선생님이 보내주신 파일 wifi모듈을 다운로드 받아서 esp8266_flasher.exe를 실행한다.
Bin 버튼을 눌러서 9600폴더에 있는 au-thinker-0.9.5.2-9600.bin을 선택해준 다음, 내가 우노보드를 연결한 포트 번호를 Download 옆 COM1자리에 입력해서 변경해준다. 엔터를 누르면 좌라라락 Writing 행렬이 이어지는데 99%를 찍고 끝났다면 정상적으로 다운로드가 완료된 것이다.
펌웨어업데이트 과정
시리얼모니터를 실행해주고 아래에서 Both NL & CR로 변경.
상단 입력창에 AT를 입력하고 엔터를 누르면,
OK.
만약 AT를 입력하고 엔터를 했는데 안 나온다면 와이파이 모듈에 문제가 있을 수 있으므로 모듈을 바꿔서 진행해보도록 한다.
CWMODE는 총 3가지 모드가 있는데, Station, AP, Dual 이 있다.
CWMODE를 2로 바꾸고 다시 물어보면,
현재 와이파이 중 연결 가능한 목록을 보여주는 명령어 입력
이렇게 연결 가능한 목록을 확인할 수 있으며, 이 중에서 내가 연결하고자 하는 와이파이가 있다면,
아래와 같이 명령어를 입력하고 엔터를 쳐준다. = 다음에 오는 첫번째는 와이파이 이름, 그 다음은 암호이다.
이제 서버를 연결하는 작업을 진행해보도록 한다.
이클립스를 실행해서 다이나믹프로젝트를 하나 만들고
jsp파일을 하나 만들어서 바디에 다음의 태그를 넣는다.
<%
String a = request.getParameter("state");
System.out.println(a);
%>
ctrl+f11을 눌러 실행하면 지금은 값이 없으므로 null이 뜨고, url창에 ?state=1234를 입력하면?
콘솔창에 값이 잘 보내진 것을 볼 수 있다.
컴퓨터에 랜선을 그대로 꽂은 상태라면 지금 다들 이더넷 상태일 것이다. 랜선이 아닌 와이파이를 잡아서 사용하는 사람과 같은 환경을 맞춰주기 위해 모두 랜카드를 컴퓨터에 꽂고 네트워크를 동일한 환경으로 맞춰주도록 한다.
wifi송신.txt에 있는 코드를 그대로 전체 복사해서 아두이노 코드 입력란을 깨끗이 비운뒤 붙여넣고,
빵판에서는 0,1번에 있는 핀을 2,3번으로 옮기고 마이너스 선(그라운드) 중 가운데에 꽂힌 선은 제거해준다.
cmd를 입력해서 명령프롬포트 실행, ipconfig를 입력하여 IPv4 주소에 있는 ip주소를 얻는다.
(ip주소는 개인적이므로 노출의 위험을 줄이기 위해 첨부 x)
SERVER_IP에는 cmd에 ipconfig를 입력해서 본 if를 입력하고 SERVER_PORT는 톰캣포트번호를 입력한다. 기억나지 않는다면 이클립스에서 아까 실행했을 때 떴던 localhost 뒤에 있는 숫자 4자리를 입력하면 된다.
블럭 지정한 부분을 이클립스에서 실행한 url 프로젝트명부터 복사해와서 변경해준다.
그리고 시리얼모니터를 실행하면
이렇게 떠야 정상적으로 연결이 된건데 만약
이렇게 뜨고 있다면 핫스팟 연결이 꺼진것은 아닌지 확인해보도록 한다. 연결을 확인한 후 다시 업로드버튼을 누른 후 시리얼모니터를 실행하면 정상적으로 연결된 것을 확인할 수 있다.
이클립스에도 정상적으로 값이 넘어가고 있는지 확인해주도록 합시다.
현재는 delay(10000)로 10초에 한 번씩 요청하고 있는 상태. 이것을 버튼을 클릭할 때만 요청이 들어가도록 하기 위해 버튼 인식을 먼저 확인하도록 한다.
빵판 연결을 추가한다.
버튼을 읽어오도록 하기 위해 5v를 연결하고 플러스도 추가, 4번 핀에 버튼을 인식시켜준다.
현재는 10초에 한 번 요청하는걸로 설정된, 딜레이가 있는 상태.
주석처리해준 다음 버튼을 누를 때만 이클립스에 값을 넘겨줄 것이므로,
위와 같이 코드를 수정해준다.
이전에 보내준 message와 헷갈리지 않도록 메세지 내용을 바꿔주고, 디지털신호를 읽어오게 코드를 추가한 다음 버튼이 눌리면 1인 것을 이용하여 메세지를 보내게 설정한다.
Data transfer successful이 뜬다면 버튼을 눌러보자.
버튼을 눌러줄 때마다 값이 잘 전해지고 있다.
이번엔 조도센서 값이 잘 넘어가는지 시스템을 만들어주도록 합시다.
조도센서는 아날로그 신호이므로 아날로그 리드를 먼저 확인하는 예제를 실행한다.
시리얼모니터에 조도센서 값이 잘 받아지고 있는 것을 확인했다면 본 실습에 들어간다.
조도센서에서 보내주는 신호는 정수값이므로 문자열로 바꿔주는 형변환을 해준다. (String)
위와 같이 조도센서 값이 이클립스 콘솔창으로 넘어가도록 해준 다음 버튼을 클릭해보면,
소매로 가려줄수록 더 잘 가려진 값이 넘어가는 것을 볼 수 있다.
'K-디지털 빅데이터 분석서비스 개발자과정 20.11.02~21.04.12 > ARDUINO' 카테고리의 다른 글
21.02.09. 아듀이노를 활용한 IoT수업 (0) | 2021.02.09 |
---|