이전 내용은 "스마트 쓰레기통 제작기(1)", "스마트 쓰레기통 제작기(2)"에서 확인할 수 있다.
https://jy-develop.tistory.com/2
[Arduino] 스마트 쓰레기통 제작기(1) - 기획 및 물품 구매
2024년 1학기, 대학교 2학년이 되자마자 첫 프로젝트 강의를 듣게 되었다.전공필수 과목이라 들을 수밖에 없었지만, '만드는 건 재밌으니까'라는 막연한 기대감을 안고 1학기를 시작했다. OT부터
jy-develop.tistory.com
https://jy-develop.tistory.com/3
[Arduino] 스마트 쓰레기통 제작기(2) - 스피커모듈 및 터치센서 구현
이전 내용은 "스마트 쓰레기통 제작기(1)"에서 확인할 수 있다. https://jy-develop.tistory.com/2 [Arduino] 스마트 쓰레기통 제작기(1) - 기획 및 물품 구매2024년 1학기, 대학교 2학년이 되자마자 첫 프로젝
jy-develop.tistory.com
열심히 스피커 모듈 및 터치센서 모듈 구현을 완료하고 최종 발표까지 남은시간은 약 1주일...
최종 발표 전날 각자 파트에서 제작한 것을 합치기 위해 모여야 하는데, 팀장님과 팀원 한 명이 최종발표 당일날 시험이 너무 많아 그 전날 준비에 참여하지 못한다는 소식이 들려왔다. 팀장님이 모터와 로드셀 제어를 맡았기 때문에 핵심 모듈을 전달 받아 나머지 하드웨어 제작 및 발표 준비는 나와 다른 팀원이 같이 하게 되었다.
그렇게 맞이한 최종발표 하루 전, 무수한 전공 시험에 찌든 채로 터덜터덜 만나기로 했던 강의실로 걸어갔다. 해당 수업을 하는 강의실이었기에 이미 그 안은 인산인해였다. 겨우 자리를 잡아 모듈을 제작한 쓰레기통에 붙이려고 하는데, 혹시 몰라 모터 모듈 테스트를 돌렸다.
"어라?? 작동을 안하는데....???"
멘붕이 오기 직전이었지만, 로드셀이 문제인지 모터가 문제인지 모르는 일이라 로드셀 따로, 모터 따로 테스트를 진행했다. 로드셀은 시리얼 모니터에 값을 잘 출력해내는 것을 보고 안도의 한숨을 내쉬었다. 로드셀 인식이 잘 안돼서 다른 조들도 고생하고 있었기 때문에 너무 무서웠지만 아니었다.
그럼 범인은 하나다. 모터가 문제가 생긴거다. 우리가 사용한 DC모터는 꽤나 인증된 샛노란색의 기어박스 모터였다. 팀원도 이게 문제가 있을리가 없다며 의아해했다. 고민 끝에 모터드라이버 외부전원 배터리를 바꿔보기로 했다.
우리는 모터 4개를 한번에 처리하는 모터드라이버가 아닌 2개씩 제어하는 L298 모터드라이버 2개를 사용했다.
https://www.devicemart.co.kr/goods/view?no=1278835
2A L298 모터드라이버 모듈 (아두이노 호환) [SZH-EK001]
ST사의 고전압 고전류 모터 드라이버 칩인 L298N을 탑재한 Dual H-Bridge 모터 드라이버 / 작동 전압 : 5V-35V / 전류 : 2A(MAX single bridge)
www.devicemart.co.kr
2개 중에 하나를 바꿨더니 모터가 돌아갔다. 팀원과 함께 안심하며 다른 모터드라이버도 배터리를 바꿨다.
"배터리 바꿔도... 안돌아가는데..?"
청천벽력이었다. 이게 뭐야 싶어 작동하지 않는 모터를 작동되는 모터드라이버에 연결해 다시 테스트를 진행했다. 결과는 정상 작동. 그렇다. 모터드라이버 불량이었던 것.... 그래도 보조 바퀴를 가지고 있어 "그냥 모터 2개만 쓰고 뒤에 보조바퀴를 달자~" 하며 위기를 넘겼다.
넘겼다고 생각했다... 모터를 2개로 줄이기로 하고, 팀원은 모터 납땜을, 나는 그에 맞게 코드를 수정하기 위해 메가보드를 노트북에 연결하는데 아두이노 IDE에서 인식이 안됐다. 이게 뭔가 싶어 이것 저것 다 뒤졌다. 드라이버 고장이다, 보드를 초기화해봐라, 노트북 포트가 고장난거다 등 gpt와 구글을 붙잡고 약 30분 정도 씨름했던 것 같다.(체감상 1시간 정도는 된 거 같았다...)
계속되는 오류에 정말 멘탈이 나가서 멍해졌다. 그동안 해왔던 작업이 물거품이 되고, 내일 발표 때 이런 결과물을 들고 어떻게 발표를 해야하나 싶었다. 그러다 누군가 내 머리에 이렇게 말하는 것 같았다.
"보드 바꿔보자. 메가보드 고장난 거 아니야...?"
이 생각이 들자마자 바로 동방에 있던 예비 아두이노 보드를 들고 왔다. 혹시 몰라 정품 보드로 들고와서 그냥 무작정 노트북과 연결했다. 그제서야 아두이노의 불빛과 IDE에 뜨는 아두이노 포트가 보였다. 해결됐다는 안도감과 함께 왜 진작 바꿀 생각을 하지 않았을까 하는 아쉬움이 밀려들었지만, 그 감상에 젖을 시간조차 없었다.
연결이 되고 나서 모터 2개로 코드를 변경하고 로드셀과 함께 코드를 돌렸다. 또 작동 실패...
이번에는 부품의 문제가 아니라 코드의 문제임을 단번에 알았다. 부품은 각각 다 잘 돌아가고 있었으니까...
코드를 하나하나 뜯어보고 너무 많이 사용된 delay 함수와 너무 복잡한 로직을 단순하게 풀어 수정했다. 그 옆에서 계속 납땜하고 기다려주고, 바로 시제품 제작을 마무리할 수 있도록 열심히 일해준 팀원에게 감사를 표한다.
그렇게 완성된 로드셀과 모터 코드
//smart_trashcan.ino
#include <Servo.h>
#include <SoftwareSerial.h>
#include <Adafruit_NeoPixel.h>
#include <HX711.h>
//주행용 아두이노
// int L1motorCW = 15;
// int L1motorCCW = 14;
// int L2motorCW = 12;
// int L2motorCCW = 13;
// -> 모터 2개를 지운 흔적
int R1motorCW = 9;
int R1motorCCW = 10;
int R2motorCW = 6;
int R2motorCCW = 11;
//적외선 센서 -> 라인트레이싱
int IRL = 7;
int IRR = 8;
//초음파 센서 -> 앞에 장애물 감지 시 정지하기 위함
int TRIG = 3;
int ECHO = 2;
int speed = 255;
// HX711 로드셀 핀 설정
#define LOADCELL_DOUT_PIN 12 //초록
#define LOADCELL_SCK_PIN 13 //노랑
HX711 scale;
// LED 스트립 핀 설정 및 LED 개수 설정
#define LED_PIN 5
#define NUM_LEDS 8 // LED 스트립에 연결된 LED 개수
Adafruit_NeoPixel strip = Adafruit_NeoPixel(NUM_LEDS, LED_PIN, NEO_GRB + NEO_KHZ800);
// 무게 및 거리 임계값 설정
float weightThreshold = 6400.0; // 예시 값 (단위: g)
const int distanceThreshold = 20; // 예시 값 (단위: cm)
// 무게에 따라 켜질 LED의 개수 계산을 위한 최대 무게값 설정
float maxWeight = 1000.0; // 예시 최대 무게 (단위: g)
// 소프트웨어 시리얼 설정 (RX, TX)
//SoftwareSerial mySerial(10, 11); // RX, TX 핀 설정
void setup() {
Serial.begin(9600);
pinMode(R1motorCW, OUTPUT);
pinMode(R1motorCCW, OUTPUT);
// pinMode(L2motorCW, OUTPUT);
// pinMode(L2motorCCW, OUTPUT);
pinMode(R2motorCW, OUTPUT);
pinMode(R2motorCCW, OUTPUT);
pinMode(IRL, INPUT);
pinMode(IRR, INPUT);
pinMode(TRIG, INPUT);
pinMode(ECHO, INPUT);
// 로드셀 초기화
scale.begin(LOADCELL_DOUT_PIN, LOADCELL_SCK_PIN);
scale.set_scale(); // 로드셀의 보정을 위해 필요시 수정
scale.tare(); // 현재 로드셀 값을 0으로 설정
// LED 스트립 초기화
strip.begin();
strip.show(); // Initialize all pixels to 'off'
}
void loop() {
// 로드셀을 이용한 무게 감지
float weight = scale.get_units(10); // 10회 측정값의 평균을 계산
weight = abs(weight);
// LED 스트립 제어
for (int i = 0; i < 8; i++) {
if (i+1 < weight/500) {
strip.setPixelColor(i, strip.Color(255, 255, 0)); // 빨간색 LED 켜기
} else {
strip.setPixelColor(i, strip.Color(0, 0, 0)); // LED 끄기
}
}
strip.show(); // 변경사항 적용
Serial.println(weight);
// 무게와 거리 조건 체크
if (weight > weightThreshold) {
long duration, distance;
digitalWrite(TRIG, LOW);
delayMicroseconds(2);
digitalWrite(TRIG, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG, LOW);
duration = pulseIn(ECHO, HIGH);
distance = duration * 17/1000;
Serial.println(duration);
Serial.print("\nDistance:");
Serial.print(distance);
Serial.println(" cm");
if(digitalRead(IRL) == HIGH && digitalRead(IRR) == HIGH){
analogWrite(R1motorCW, speed);
analogWrite(R1motorCCW, 0);
analogWrite(R2motorCW, speed);
analogWrite(R2motorCCW, 0);
}
else if(digitalRead(IRL) == LOW && digitalRead(IRR) == HIGH){
analogWrite(R1motorCW, 0);
analogWrite(R1motorCCW, speed);
analogWrite(R2motorCW, 0);
analogWrite(R2motorCCW, speed);
}
else if(digitalRead(IRL) == HIGH && digitalRead(IRR) == LOW){
analogWrite(R1motorCW, speed);
analogWrite(R1motorCCW, 0);
analogWrite(R2motorCW, speed);
analogWrite(R2motorCCW, 0);
}
else if(digitalRead(IRL) == LOW && digitalRead(IRR) == LOW){
analogWrite(R1motorCW, 0);
analogWrite(R1motorCCW, 0);
analogWrite(R2motorCW, 0);
analogWrite(R2motorCCW, 0);
}
if(distance < 15){
analogWrite(R1motorCW, 0);
analogWrite(R1motorCCW, 0);
analogWrite(R2motorCW, 0);
analogWrite(R2motorCCW, 0);
delay(1000);
}
}
// delay(1000); // 0.5초마다 측정 반복
}
void Break(long distance){
if(distance < 50){
// analogWrite(L1motorCW, 0);
// analogWrite(L1motorCCW, 0);
// analogWrite(L2motorCW, 0);
// analogWrite(L2motorCCW, 0);
analogWrite(R1motorCW, 0);
analogWrite(R1motorCCW, 0);
analogWrite(R2motorCW, 0);
analogWrite(R2motorCCW, 0);
delay(5000);
}
}
이렇게 모터 제어까지 끝이 났다. 드디어 부품들이 제대로 돌아가는 것을 다 확인하고, 팀원이 쓰레기통 안에 고이 회로를 집어넣고 선정리를 시작했다. 나는 그동안 발표자료 준비를 했다. 발표자료 마감까지 약 1~2시간 남은 시점이라 열심히 쓸 내용을 고르고, 발표 자료를 만들었다.
그렇게 오후 6시에 시작했던 작업은 10시 반 정도가 되어 마무리 되었다. 하드웨어로 고생한 팀원을 먼저 보내고 발표를 준비해 12시 안으로 모든 작업을 끝냈다. 마지막으로 강의실에 있던 동기들 작품도 구경하며 전날을 마무리 했다.
드디어 발.표.당.일.
우리가 지금까지 완성했던 것을 보여주기 위해 여분의 배터리와 쓰레기통 안에 넣을 물건들을 구입한 후, 발표 대기 장소같은 강의실로 향했다. 팀원과 함께 마지막 테스트를 마치고, 발표 내용을 곱씹으며 긴장되는 마음을 가라앉혔다.(진정이 되진 않았지만..)
우리 팀 차례가 되어 교수님들 앞에 서서 발표를 진행했다. 이런 문제점으로 우린 이 주제로 프로젝트를 진행했고, 이런 센서를 활용해 이런 기능을 만들었고, 이렇게 작동된다를 5분 안에 시현까지 마무리 해야했다. 긴장되는 마음에 발표 시간은 조금 넘쳤지만, 작동도 나름 잘 했고, 질문도 부정적이진 않아서 다행이라고 생각했다.
발표 중 말을 더듬은 것이 너무 아쉬웠지만, 팀원이 작동도 잘 되고 괜찮았다고 말해줘서 이미 끝난 거 계속 곱씹으면 내 멘탈만 안좋을 것 같아 후련한 감정만 남긴 채 프로젝트 수업을 마무리 했다.
그렇게 2024년 1학기 종강을 맞이했고, 성적 열람의 날이 밝았다. 비슷한 주제로 진행한 팀도 있고, 다른 팀들도 너무 잘 했기에 많이 긴장되었지만, 쏟았던 노력이 기대감을 키웠다. 그렇게 성적이 나오고, 열람한 결과 A+이었다. 성적이 다는 아니지만, 교수님들께 좋은 평가를 받을 수 있는 프로젝트를 진행했다 싶어 뿌듯했다.
하나의 프로젝트를 위해 노력하고 좋은 결과로 이어지는 경험을 할 수 있어서 너무 행복했다. 이 경험으로 한층 성장할 수 있는 내가 되길 바라며 다음 프로젝트의 후기로 돌아오겠다.
[Arduino] 스마트 쓰레기통 제작기(2) - 스피커모듈 및 터치센서 구현 (0) | 2025.01.28 |
---|---|
[Arduino] 스마트 쓰레기통 제작기(1) - 기획 및 물품 구매 (0) | 2025.01.27 |