728x90

아두이노로 만들수 있는 프로젝트 들은 참많다

 

 

어떻게 만드는지 등은 다 아두이노 공식 홈페이지 상에서도 제공하고 있지만

 

 

막상 그런 제품을 만들 비용과 시간, 게으름 때문에 제대로 해볼 생각은 한적이 없었다.

 

 

다행이 이번에 하드웨어와 소프트웨어를 통합한 프로토타이핑을 하면서

 

 

이제서야 한번 시도해볼 기회가 생긴것 같다.

 

 

처음에는 원래 역 도립진자를 한번 만들어보고 싶었다.

 

 

본인은 제어 공학을 공부했지만 이론적인 내용과 간단한 메트랩 실습만 조금해보았지

 

 

실제 제어기 적인 내용은 제대로 만들어보지를 못했다.

 

 

그러다보니 이런걸 다루어보고싶었지만

 

 

하드웨어를 만들줄 모르니 엄두가 안나더라

 

 

그렇게 해서 제어기와 프로토타이핑을 결합한

 

역 도립진자를 생각하게 되었다.

 

 

 

 

 

 

 

이것 자체가 석사 논문에 쓰기도 하는 내용이기도 하고

 

적당한 거라 생각하려했는데

 

* 하다 하다 삼단 역 도립진자도 있다..

 

 

 

 

아두이노 예제 코드만 몇번 놀리고 말았던 내가 하기에는 조금 힘들것 같더라

 

 

대신 이전에 조금더 간단한 예제가 생각난게

 

초음파 밸런서가 있었다.

 

 

 

 

시소 처럼 생긴 구조물 끝에 초음파 센서와 공을 놓고

 

공이 너무 가까워지면 시소를 기울려 떨어지게 하고

 

너무 멀어지면 초음파쪽으로 기울어지도록 제어하는 예제였는데

 

 

 

 

 

이런식으로

 

한번 PID 게인들 조절하면서 찾아가는 과정을 한번 해보고 싶다.

 

처음부터 역도립진자하는것보단 쉽겠지

 

 

 

 

내가 배운 제어공학을 생각하면

 

분명 많은 시간을 들여서 신호와 시스템, 제어공학을 공부했지만

 

아직도 PID 제어기가 뭔지, 해가 뭔지 잘 정리되는 느낌이 들질 않는다.

 

아마 간단한 메트랩 예제만 해보고 말았지

 

실제로 제대로 된 프로젝트를 해본적이 없어서 그런것 같다.

 

 

이번 기회에 PID 제어기가 들어간 이러한 프로젝트를 직접 만들어 보고 싶다.

 

 

 

 

 

 

만약 정말 시간이 남는다면

 

조금 더 어려운 프로젝트로

 

아두이노 강아지나 자율주행 차량용 차체 같은것을 만들어 보고자 한다.

 

 

 

이전에 자율주행 차 연구를 할때

 

하드웨어에 대해서 아는게 하나도 없어

 

장난감 자동차에다가 수백만워너치 장비들을 올려서 사용하곤 했었다.

 

 

까꿍

 

 

보기도 너무 안좋고 심하게 조잡했다.

 

다른 곳에서 로봇 만든다고하면

 

이런 장난감 차체가아니라 실제 기구 제작해서 만든다는데

 

이런것 밖에 쓸수없는게 너무 자존심 상하더라

 

 

 

 

이런거 만들어보고싶다..

 

300x250
728x90

 

개인 프로토타이핑 목표

1. 초음파 기울기 

2. 역도립진자 만들기

 

 

 

제품 디자인 프로세스

1.  디자인 방향 설정

2. 디자인 컨셉 설정

3. 스케치 1차 시각화

4. 스펙 및 개발 레이아웃 설정

5. 3d 디자인 모델링

6. 3d 렌더링 등 2차 시각화

7. 프로토 타입 등 실물 확인 작업

8. 개발 실장 검토

9. 디자인 및 개발 개선

10. 디자인 목업, 워킹 목업 제작

------------ 목표------------

11. 금형 검토 및 양산성 검토

12. 금형 제작 및 시사출 검토

    * 시사출 검토 : 전문가들이 금형을 만들어도 안되는 경우가 많음. 문제 검출 

13. CMF 시방서 및 샘플 제작

14. 품질 감리 및 양산

 

 

제품 디자인 프로세스에 관한 이야기

규모에 따라 와따가따가 건너띄기도

=> 적립이 안되고, 비용을 줄이기위함

-> 그렇다고 안되는건 아님 (목적에 부합하는것이 가장 중요, 이게 합리적일수도)

 

 

 

 

금형이란?

- 틀을 의미

 

 

 

 

드라프트?

- 사출물이 빠져나올수있는 각도를 줄임 정밀하느냐에 따라서  달라질 수있음 어떤 

=> 3d 프린팅에는 그런게 없기 때문. 어떤 형상에서든 제한이 존재하지 않음

 

 

 

 

 

디자이너 정의의 필요성

- 많은 사람들이 비전은 있지만 명확하지 않음

- 디자이너가 풀어줌

=> 깔금하게 만들어주세요라는 경우가 많음

- 스코프 정의 가 중요

 

 

 

 

일의 범위(스코프) 정의 

- 비용, 시간, 일정이 일의 범위에 따라 정해지기때문

- 비지니스  환경과 스코프 설정 이해 필요

 

 

 

 

 

 

대기업과 디자인

- 어느정도 설정이 정리되서 온다

- 디자이너들은 이 제품이 동작과 기능 어떻게 심미적으로 아름답게 보이는지 신경을 많이 쓰임

    => 컨셉 설정의 많은 부분 차지

- 디자인 리서치 팀도 따로있음 

    => 체계화가 되있으나 경험의 폭이 좁음

- 학생들이랑 비슷 판넬에다 아이디어 키워드 붙이고 정리

 

 

 

 

스케치와 시각화

- 바로 3d도 문제될수 있으

- 스케치, 모델링 다 과정

- 3d로 해봐야디겟느넫 3d해보고 유기적으로 와다가다가 중요

- 스케치 멋잇게 해봣자 결과 안나오면 otl

- 스캐치 상에서 개발 관련된 얘기는 잘하지 않음. 그러다 잘못되는 경우가 많음

 => 스타트업이 의사결정이 빠르다 ...

 

 

 

레이아웃

- 완성된 제품을 봤을때. 산출물 껍데기를 뺀 상태를 레이아웃

- 레이아웃이 있어야 겉데기를 만들수 이따

- 레이아웃이 와따가따하다가 3d 디자인 검토

 

 

 

랜더링

- 키샷 같은 프로그램으로 얘기해보면 좋을듯

- 제대로된 후가공은 힘들듯

 

 

개발 실장 검토

- 개발이 가능한지 여부를 다룸

 

 

 

 

디자인 프로세스 필요 역량

- 다음 기술을 기반으로 캐드와 프로토타이핑 와따가따

- 비슷하진 않더라도 거슬리지 않게 하기도 힘듬

 

 

 

 

디자인 프로세스 장비

1. 3d cad(라이노)

 - 3d 형상 제작 및 데이터화

 - 컨셉 정리

2. 3D 프린터

 - 프로토타입, 부품, 양산 등에 활용 가능

 - 퀄리티에서 변수 존재

3. 레이저 커터

 - 2d 작업에 적합(판을 자르는ㄷ ㅔ 사용)

 - 2d 이상 작업 힘듬. 열로 인한 마감 문제 발생

 

 

 

 

3D CAD 개념

1. 폴리곤 모델링

- 유기체에 적합

- 다양하고 자유로운 표현 가능

- 수취화 힘듬

 

2. Nurbs 모델링

- 고정 물체에 적합

- 정량적이고 수치화에 용이함

- 자유로운 표현이 힘듬

 

 

 

 

 

 

프로토타입 목표 - 구체화 ver.1

1. 가장 간단한 프로젝트 

 - 초음파 발란서

2. 중간 난이도 프로젝트

 - 역 도립진자

3. 고 난이도 프로젝트

 - 중형 자율차 차체

4. 초고난이도 프로젝트

 - 개 로봇

 

 

 

 

300x250
728x90

EMC 관점 수동 소자

1. 저항

2. 캐패시터

3. 인덕터

4. Ferrite Bead

5. EMI Filter

6. Common Mode Choke Coil

7. 3단자 캐패시터

 

 

 

 

저항 registor

- 전류 흐름을 억제하는 소자

- 옴의 법칙 : I = V/R

- 저항 특성 : 캐패시터 , 인덕터와 달리 전력 소모

- 기호

- 물리적 원리 : rho는 물질의 비저항(고유저항), s는 물질의 단면적, l은 길이

           => 저항은 고유저항과 길이에 비례, 단면적에 반비례

 

 

 

 

저항의 종류

1. 직렬 접속 저항

- V = IR에 따라 R은 직렬합

 

2. 병렬 접속 저항

- 병렬 접속으로 인해 직렬에 비해 저항의 크기가 줄어듬

 

 

 

 

 

캐패시터 capacitor

- 에너지 저장하는 소자

- 저장 에너지

- 교류 저항

- 시간 영역에서 캐패시터의 전류 전압과의 관계식

- 기호

 

- 물리적 원리 : epsilon_0는 자유공간 유전율, epsilon_r은 비유전율, d는 전극간 거리, S는 전극 면적

 

 

캐패시터의 합성

1. 직렬 연결

 

2.병렬 연결

 

 

캐패시터와 SRF Self Resonant Frequency

- 동작 주파수가 증가할수록 Passive 소자의 제작 구조상 발생하는 기생 캐패시턴스와 인덕턴스의 영향으로 의도된 임피던스 특성과 겨양과 반대로 동작하기 시작하는 주파수

- 캐패시터의 경우 SRF보다 높은 주파수에서 인덕터로 동작

 

 

 

 

 

 

 

 

 

 

 

300x250
728x90

휴대폰 비행기 모드의 필요성

- 전자 시스템 전파 간섭 우려 때문에 필요

=> 전화, 메시지, 인터넷 등이 사용 불가

- 비행기 운형에 영향을 주는 전자파

=> 항공기 운행 오작동 발생 가능

 

 

 

 

전자파란?

- 주기적으로 세기가 변하는 전자기장이 공간속으로 전파해 나가는 파동 현상

- 아래의 그림은 전자파를 이루는 전기장과 자기장을 보여줌

https://m.blog.naver.com/PostView.nhn?blogId=winglass&logNo=220987431370&proxyReferer=https:%2F%2Fwww.google.com%2F

 

 

 

 

전자파의 반사, 굴절, 회절

- 반사 : 입사한 전자파가 되돌아가는 현상

- 굴절 : 산란체의 경계면에서 전자파 진행경로가 꺾이는 현상

- 회절 : 장애물에 의해 전자파가 도달할수 없는 곳에서 전자파가 전파되는 현상

 * 방송이나 무선통신에서 송신 안테나를 볼수없는데도 전자파를 수신함

 

전자파의 세기

- 전자파 발생원으로부터 거리에 따라 급격히 감소

- 자유 공간 진행(직접파)하거나 반사 또는 굴절된 전자파의 전력은 거리의 제곱에 반비례하여 감소

- 회절된 전자파의 전력은 거리에 반비례하여 감소

 * 회절된 전자파는 회절이 일어나는 지점에서 세기가 크게 줄어들므로 직접파나 반사파, 굴절파에 비해 세기가 크게 약해짐

 

 

주파수 스펙트럼과 용도

- 아래의 그림은 각 주파수대역별 용도를 보여줌

http://www.ktword.co.kr/abbr_view.php?m_temp1=624&id=1029

 

 

 

 

 

 

전자파 관련 용어

EMC(Electro Magnetic Compatibility)

- 전자파 적합성or 전자파 양립성

- 기기외부로 불요 전자파를 최소로 방출시켜 다른 기기에 전자파 간섭을 일으키지 않고, 외부로부터 전자파 간섭에 영향을 받아도 정상적으로 동작할 수 있는 상태

 

EMI - Electro Magnetic Interference

- 전자파 간섭

- 전류 흐름에 의해 도선에 자연적으로 발생되는 에너지가 타 기기에 방해 간섭원천으로 동작되는 형태

 

 

EMS Electro Magnetic Susceptibility

- 전자파 내성

- 외부의 전자파 간섭으로부터 전자기기가 간섭을 받음에도 얼마나 기능을 하는가 의미

 

 

 

 

EMI 전자파 간섭의 종류

- RE Radiated Emission 방사방출 : 30MHz 이상 회로서 발생. 전자파가 공기로 방사되는 전자파를 잡음

- Conducted Emission 전도 방출 : 30MHz 이하 회로에서 발생. 신호선, 전원선 같은 매질로 전달되는 전자파 잡음

-ESD ElectroStatic Discharge 정전기 방전

   : 서로 다른 정전기 전위 가진 물체가 가까워질때 갑작스러운 전하 이동으로 과전류 흘러 오작동 발생하는 현상

- RS Radiated Susceptibility 방사 내성 : 자유공간으로부터 전파되어오는 전자파 간섭에 견디는 정도

- CS conducted Susceptibility 전도 내성 :외부 케이블, power cords, IO interconnect 등에서 오는 전자파 간섭에 견디는 정도

- EFT/Burst Electrical Fast Transient/Burst : 전기적 빠른 과도 현상

- Surge : 전기회로에서 수초간 지속되는 전압, 전류, 전력의 과도 현상

- Voltage Dip : 전압 강하. 전압 감소 전자 시스템의 한 지점에서 전압이 급격히 감소했다가 짧은 시간 후에 회복되는 현상

- hazard 위해 : 전자파가 유기체에 미치는 위협

- EMP Electro Magnetic Pulse : 전자파 펄스. 

 

 

 

 

 

 

 

 

전자파 발생 원리

- 아래의 그림은 전자기파의 발생 원리를 보여줌

- 전선을 따라 전류가 흐르면 주위에 전기장과 자기장이 형성됨

https://m.blog.naver.com/applepop/221087212063

 

- 아래의 그림은 LC회로로. 축전기와 코일이 규칙적으로 진동하는 회로

 

 

 

전파의 속도

- 지구 7바퀴 반 도는데 1초

- 지구에서 화성가는데 3.3초

- 지구에서 태양가는데 8분 3초

- 전파의 속도 초당 30만 km

 

 

 

 

 

전자파 환경

- 자연 잡음 :자연적 현상에 의해 발생하는 잡음

       => 대기 잡음 : 번개, 이온층 임펄스, 슈만공진

      => 우주 잡음 : 태양 흑점 활동, 천체 축 열 잡음

- 인공 잡음 : 인간이 사용하는 기계에 의해 발생하는 잡음

    => 의도적 잡음 : 제품 성능 및 기기 동작을 위해 고의적으로 Rf에너지 발생시키는 경우

        * 예시 : 송신기 고조파, 수신기의 국부발진기(AM/FM), TV의 동기 펄스, 마이크로프로세스

    => 비의도적 잡음 : 제품의 성능 또는 기능 동작을 수행하는 동안 비의도적으로 RF 에너지가 발생

       * 예시 : 전동기, 전기접점 기기(릴레이, 스위치), 스파크 방전(이그니션), 코로나 방전(송전선)

 

 

 

전자파 기술 변화 과정

1. 1900년대 이전 - 전자파 개념 존재 x

- 교환 시설 : 수동식(자석식/ 공전식)

- 전송/정보/이동통신 : 기술 발전 미흡

- 전자파 환경 : 자연환경에 의한 전자파가 존재

 

2. 1900년대 - 전자파 활용 기술 연구

- 교환시설 : 기계식 (STM/EM/Cross-Bar)

- 전송 : 아날로그 전송기술 사용(나선 반송/동축케이블/PCM방식)

- 전자파 환경 : 군사 목적에 의해 중요성 인식 시작

 

 

3. 1970년대 - 군사 목적에 의한 전자파 대응

- 교환시설 : 반전자식 교환기 (No.1AESS)

- 전송 : 아날로그 방식 이동전화 상용화

- 전자파 환경 : 무선 분야 기술 전개에 따른 전자파 중요성 인식

 

 

4. 1980년대 - 선진국 중심 EMI 자율적 규제

- 교환시설 : 전전자식

- 이동통신 : 아날로그방식 세계적 운영

- 전송기술 :광통신망 이용

- 전자파 환경 :전자 산업 발달에 따른 전자파 문제 발생 및 중요성 강조

   => 전자파 규제 시작

 

5. 1990년대 - 국내 산업기기 EMI 승인 의무화

- 디지털 시대

- 전파환경의 복잡, 무선 시설이ㅡ 발달

- 사용 주파수 대영 증가

- 전자파 환경 : 전자파 세계적 강제 규제

    =>세계 각국 자국 산업 보호를 위한 규제

 

6. 2000년대 - 전자파 규제 범위 확대

- 유무선 위성통신의 통합

- 첨단 멀티미디어 시대 IMT-2000

- 전자파 환경 : 소비자 및 제품 품질 수준의 척도. => EMI규제에서 EMS 분야로 확대

 

 

 

EMC 문제 대두 배경

1. 전기 전자기기의 디지털화

- 아날로그 회로 : 잡음의 영향이 일과성이 강함

- 디지털 회로 : 메모리 소자 내장, 낮은 직류 전류에서 동작 => 미약한 잡음 영향이 메모리에 기억되어 오작동 발생

 

2. 전기 전자기기의 저전력화

 - 기기의 소형화,  전지의 긴 수명 확보

   => 동작 전압이 낮아짐(저전력화) => 같은 잡음 레벨에도 장애 발생

 

3. 전기 전자기기의 고밀도화

 - CPU가 내장된 디지털 기기의 급속한 보급

 => 좁은 공간에 인접해짐 => 각기기간 전자파 간섭이 심해짐

 

 

300x250
728x90

목표

- 전기전자기기 설계시 전자파 적합성 전반을 이해도를 높여 초기 설계 단계에서 대책을 수립

- 회로에 반영하여 EMC 문제로 인한 비용을 최소화 하기 위함

 

 

OrCAD ( CAD : Computer Aided Design)

- cad : 컴퓨터 기반 설계의 약어

- 제도가 아닌 컴퓨터를 이용한 설계

- 전자 분야에서 설계 자동화에 사용되는 프로그램을 EDA( Electronic Design Automation, 전자설계 자동화) 라고 부름

 

 

CAD 프로그램 종류

- PADS, P-CAD, CADSTAR

- OrCAD : 전자회로설계, 회로시뮬레이션, 회로기판 설계

 

 

 

 

OrCAD

- EDA 전자 설계 자동화 프로그램중 하나로 국내에서 보편적으로 사용됨

- 주요 프로그램

프로그램 주요 기능
Capture 회로도 Schematic 설계
Capture CIS OrCAD Capture에 대화 형식의 부품정보
시스템 통합한것
Pspice 회로 시뮬레이터
PCB Editor PCB 설계
Signal Integrity SI(회로 무결성) 분석

 

 

 

OrCAD Capture 특징

- 회로도 Schematic 분석을 쉽게 도와줌

- 전자회로 도면을 그려서 이를 인쇄회로기판 PCB : Printed Circuit Board로 구현하기 위한 Netlist File을 생성 가능

- 명령어의 빠른 접근을 위한 툴바와 툴 팔레트 제공

- 부품 목록, 도면 정보등을 문서화 시켜서 이를 데이터베이스화

- Excel, Lotus 등 각종 스프레드 시트 등과 파일 호환 가능

 

 

 

회로도 작성 방법

1. 프로젝트 시작

 

2. 설계 환경 설정

 

3. 부품 배치 및 배선하기 ( 부품 생성, 라이브러리 추가, 풋 프린트값 입력)

 

4. 어노테이트 (참조값 갱신)

 

5. DRC ( Design Rule Check)

 

6. 후처리 파일(네트리스트, BOM 파일 등) 생성

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

300x250
728x90

외부 인터럽트 벡터

- 인터럽트 벡터 테이블에서 상위에 위치

 

ATmega128에서 외부 인터럽트 핀 결정

- GPIO 핀 -> 범용 입출력 핀

- ATmega128의 53개의 핀만으로 다양한 기능을 동작하기엔 부족 -> 한 핀이 다른 기능도 사용 가능

 

 

 

외부 인터럽트 핀

- PD0 ~ PD3까지가 INT0 ~ INT3

- PE4 ~ PE7 까지가 INT4 ~INT7

- 해당 GPIO핀들을 외부 인터럽트 핀으로 사용가능

 

 

외부 인터럽트 회로

- 인터럽트 설정을 해야 외부 인터럽트 사용 가능

외부 인터럽트 사용 회로

 

외부 인터럽트 벡터 매크로

- 외부 인터럽트 0과 외부 인터럽트 3을 사용 시 벡터 매크로 설정

- 스위치 첫번째와 네번째를 외부 인터럽트 핀으로 사용

#include <avr/interrupt.h>

ISR(INT0_vect)
{

}

ISR(INT3_vect)
{

}

 

 

SREG Register

- 인터럽트 사용시 내부에 인터럽트 관련 설정을 했을때만 동작

-> 아무때나 인터럽트 발생 방지 

-> 레지스터 설정을 해야함 ->SREG 레지스터

- Status Register : 상태 레지스터

- 인터럽트를 사용하기 위해서 SREG 레지스터의 7번 비트에 1을 써야함(글로벌 인터럽트)

Status Register

 

글로벌 인터럽트 설정

- SREG 레지스터 7번 비트에 1을 저장

- 상태 레지스터는 다른 역활도 수행하므로 잘못 변경되지 않도록 주의

SREG |= (1<<SREG_I)
// SREG |= (1<<7);
// SREG = SERG | (1<<7);

 

SEI와 CLI 명령어

- sei() : Global Interrupt Enable -> 전체 인터럽트 활성

- cli() : Global Intterupt Disable -> 전체 인터럽트 비활성

sei();
// SREG |= (1 << SREG_I)와 같다.

cli();
// SREG |= (0 <<SREG_I)와 같다.

 

EIMSK Register

- External Interrupt MaSK Resgister

- 외부 인터럽트를 개별적으로 허용하는데 사용

- 사용하려는 외부 인터럽트를 high를 주면 된다.

ex) INT0 ~ INT3 을 1로 주면 외부 인터럽트 0 ~ 3 사용 가능

EIMSK Register

EIMSK Register 사용 예시

EIMSK = (1 << INT3);// 1 << 3 = 0b0000 1000;
EIMSK = (1 << INT0) | (1 << INT2); // 0b000 0101

 

EICRA/EICRB Register

- External Interrupt Control Register A/B

- EICRA : 외부 인트럽트 INT0 ~ INT3 감지 방법 결정

- EICRB : 외부 인터럽트 INT4 ~ INT7 감지 방법 결정

EICRA Register
ERCIB Register

EICRA Register

- ISC(숫자)1/0 과 같은 이름 규칙을 가짐

-> ISC01, ISC00 : 외부 인터럽트 0번 설정

-> ISC11, ISC10 : 외부 인터럽트 1번 실징

아래의 테이블 참고

ex 1) ISC01 = 1, ISC00 = 0 일 시

 -> 외부 인터럽트 0번에 폴링 에지 때 인터럽트 발생

ex 2) ISC71 = 1, ISC70 = 1 인 경우

 -> 외부 인터럽트 7번이 라이징 에지 때 인터럽트 발생

=> 스위치가 눌릴때 인터럽트? 눌리고 땔때 인터럽트?

- 스위치 여러개 사용 시 각각에 대해 별도로 코딩해야함

EICRA 레지스터 동작 설명

 

EICRA 코드 구현

EICRA |= (0<<ISC21) | (0<<ISC20); //INT2핀에 Low 신호 입력 순간 인터럽트 발생

EICRA = (1<<ISC21) | (1<<ISC20) | (1<<ISC11) | (0<<ISC10);
// INT2 핀 라이징 에지 시 인터럽트 발생 + INT1핀 폴링 에지시 인터럽트 발생

 

 

 

1. 외부 인터럽트 0 로우 레벨 시 LED on/Off

#include <avr/io.h>
#include <avr/intterupt.h>
#include <util/delay.h>

ISR (INT0_vect)
{
	PORTC = 0x00;
    _delay_ms(50);
    PORTC = 0xFF;
    _delay_ms(50);
}

int main(void)
{
	DDRC = 0xFF; // 출력 모드
    PORTC = 0xFF; // 하이레벨
    DDRD = 0x00; //입력 모드
    PORTD = 0xFF; // 내부 풀업 사용
    
    EICRA = (0 << ISC01) | (0 << ISC00);
    //Low가 들어오는 순간 인터럽트 발생 -> 내부 풀업으로 기본 상태 1 -> 스위치 클릭시 0-> INT0 발생
    EIMSK = (1 << INT0); //INT0 허용
    sei();//글로벌 인터럽트 인에이블
    while(1);
}

회로 설정

D1 VDD n1 ;LED D1이 VDD와 n1 node사이에 연결1
R1 n1 PC0 330 ; 저항 R1을 n1 node와 PC0 사이에 연결

D2 VDD n2
R2 n2 PC1 330

D3 VDD n3
R3 n3 PC2 330

D4 VDD n4
R4 n4 PC3 330

D5 VDD n5
R5 n5 PC4 330

D6 VDD n6
R6 n6 PC5 330

D7 VDD n7
R7 n7 PC6 330

D8 VDD n8
R8 n8 PC7 330

K0 PD0 VSS  LATCHEd ;K0 스위치는 래치타입 

- 래치 스위치를 사용하여 한번 누르면 눌린 상태가 유지됨

-> 눌린 상태서 HIGH, 다시 누르면 LOW로 변함

 

300x250
728x90

인터럽트

- HW 인터럽트, SW인터럽트

 

소프트웨어 SW 인터럽트

- 소프트웨어 요청으로 발생되는 인터럽트

- 마이크로 프로세서 내부에서 발생

- ex) 타이머/카운터

 

하드웨어 인터럽트

- 하드웨어 요청으로 발생

- 마이크로 프로세서 외부에서 발생

- ex) 스위치, 센서류

 

인터럽트 처리 순서

1. 일반 작업 실행

2. 인터럽트 발생(요청)

3. 수행작업 정지(복귀 주소 저장)

- 인터럽트 벡터 테이블 -> ISR(Interupt Service Routine) 주소로 점프

4. 인터럽트 서비스 루틴 실행

5. ISR 종료후 복귀

6. 멈췃던 작업 실행

인터럽트 처리 순서

 

인터럽트의 종류

- ATmega128은 35개의 인터럽트로 구성

- 인터럽트 우선 순위는 하드웨어적으로 설정됨

인터럽트 벡터 테이블

 

 

폴링 Polling

- 명령어로 특정 레지스터 값을 계속 읽어 레지스터 값이나 핀 값 변화를 체크하는 방식

- 작업 중에 계속 변화가 있는지 확임함

 

폴링 예시

- while문으로 !(UCSRA & (1<<RXC))가 1인지 계속 확인함

- 1이 아니면(0이면) 계속 루프에 머무름

- 1이 된 상태에서 루프를 넘어감

unsigned char USART_Receive(void)
{
	while ( !(UCSRA & (1<<RXC)) )
    
    return UDR;
}

 

인터럽트 inturrupt

- 하드웨어적으로 변화를 체크하여 변화시에만 동작함

 

인터럽트 벡터 매크로

- 벡터 테이블에서 외부 인터럽트 4개를 사용한다고 하는 경우. 인터럽트 서비스 루틴을 쓸때 매크로를 선언을 해주어야함

 ex) vector no.2 ~ 5

- iom 128 헤더파일에서 벡터테이블에 해당되는 인터럽트 벡터 매크로 확인 가능

#define INT0_vector		_VECTOR(1)
#define SIG_INTERRUPT0	_VECTOR(1)

#define INT1_vector		_VECTOR(2)
#define SIG_INTERRUPT1	_VECTOR(2)

#define INT2_vector		_VECTOR(3)
#define SIG_INTERRUPT2	_VECTOR(3)

#define INT3_vector		_VECTOR(4)
#define SIG_INTERRUPT3	_VECTOR(5)

 

iom128 헤더 파일 열어봐야하는 이유

- 외부 인터럽트 마스크인 EMSK 레지스터의 비트 값들이 숫자로 정의됨

* EMSK레지스터 : External Interrupt Mask register

- 비트코딩 사용하기 위함

 EIMSK = (1<<INT0) | (1<<INT2);

-> EIMSK = (1<<0) | (1<<2);

 

iom128 헤더파일내 EIMSK 레지스터

 

iom128내 인터럽트 벡터 매크로

 

 

iom128내 외부 인터럽트 마스크 레지스터

 

 

인터럽트 서비스 루틴

1. 인터럽트 서비스 루틴은 함수가 아님

 * 인터럽트 호출이 발생 뒤 실행되는 구간이라 특정 메모리 주소로 지정됨.

 * 인터럽트 서비스 루틴 작성 규칙에 따라 구현해야함

2. 인터럽트 서비스 루틴 선언 방식

- SIGNAL(벡터) 형식 : 일부 통합 개발환경에서 지원 x

- ISR(뻭터, 속성)

#include <avr/interrupt.h>

ISR (벡터, 속성)
{
	//인터럽트 서비스 루틴 코드 삽입
}

3. AVR GCC 인터럽트 서비스 루틴 속성

- GCC Manual에서 설명

- EMPTY_INTERRUPT(벡터) : 빈 인터럽트 처리

- ISR_ALIASOF(벡터) : 동일한 ISR 수행

- BADISR_vect : 선언되지 않은 인터럽트 처리

- ISR_NOBLOCK : 중첩 인터럽트 처리. sei()

 * 8비트 마이크로 컨트롤러에서는 중첩을 쓸 일은 없음

- ISR_NAKED : ISR 루틴 직접 작성시, reti() 반드시 호출

 

 

벡터 매크로

- no 1 : 리셋

- 35가지가 있으며 아래의 벡터 매크로를 참고해서 인터럽트 사용시 해당 벡터 매크로 선언해야함

 

 

인터럽트 서비스 루틴과 벡터 매크로 작성예 1

#include <avr/interrupt.h>

ISR (INT0_vect)// INT0 인터럽트가 발생시 이 인터럽트 서비스 루틴 동작함
{
	//routine
}

/*
지원하지 않는 경우 존쟈
SIGNAL (SIG_INTERRUPT0)
{
	//routine
}
*/

 

인터럽트 서비스 루틴과 벡터 매크로 작성예 2

#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>

volatile unsigned int flag;

//외부 인터럽트 0번 발생시 동작
ISR (INT0_vect)
{
	PORTC = 0xFF;
    _delay_ms(50);
    PORTC = 0x00;
    _dela_ms(50);
}

//외부 인터럽트 2번 발생시 동작
ISR (INT2_vect)
{
	flag = run;
}
300x250
728x90

문자 LCD 제어 예제 1

 

#define F_CPU 8000000	//클럭 설정
#include <avr\io.h>              // Most basic include files
#include <util/delay.h>

//DDRAM 설정 : 0x80+DDRAM addr 값
#define LINE1 0x80	//첫번째 라인의 DDRAM addr : 0x00->0x80+0x00
#define LINE2 0xC0	//두번째 라인의 DDRAM addr : 0x40->0x80+0x40

//PG2=LCD_EN, PG1=RW, PG0=RS에 연결
#define CMD_WRITE		0xFC	//명령어 쓰기 E=1, RW=0, RS=0
#define CMD_READ		0xFE	//명령어 읽기 E=1, RW=1, RS=0
#define DATA_WRITE	0xFD	//데이터 쓰기 E=1, RW=0, RS=1
#define DATA_READ		0xFF	//데이터 읽기 E=1, RW=1, RS=1
#define LCD_EN			0x04	//PG2에 연결

//LCD에 명령을 쓰기위한 함수
void LCD_cmd_write(unsigned char cmd)
{
	PORTG = CMD_WRITE;
	PORTB = cmd;
	PORTG =PORTG^LCD_EN;
	_delay_ms(2);
}
//LCD에 데이터를 쓰기 위한 함수
void LCD_data_write(unsigned char data)
{
	PORTG = DATA_WRITE;
	PORTB = data;
	PORTG = PORTG^LCD_EN;
	_delay_ms(2);
}

void init_LCD(void)
{
	_delay_ms(15);
	LCD_cmd_write(0x38);//명령레지스터에 0x38 전달
	_delay_ms(5);
	LCD_cmd_write(0x38);
	_delay_us(100);
	LCD_cmd_write(0x38);
	LCD_cmd_write(0x08);
	LCD_cmd_write(0x01);
	LCD_cmd_write(0x06);
	LCD_cmd_write(0x0C);
}

//LCD에 문자열 표시하기위한 함수
void LCD_wr_string(char d_line, char *str)
{
	LCD_cmd_write(d_line);
	while(*str != '\0')
	{
		LCD_data_write(*str);
		str++;
	}
}
//ATmega128 포트 초기화
void init_system(void)
{
	DDRB=0xFF;
	DDRG=0xFF;
}

int main()
{
	init_system();
	init_LCD();

	LCD_wr_string(LINE1, "Hello AVR!");
	LCD_wr_string(LINE2, "LCD Test ");	
	while (1)
	{
	}
	return 1;
}

 

초기화 코드는 아래를 참고하여 작성

 

 

스위치 조작을 이용한 LCD 상태 표시

 

// ***********************************************************
// Project:
// Author:
// Module description:
// ***********************************************************

#include <avr\io.h>              // Most basic include files
#include <util/delay.h>

//DDRAM 설정 : 0x80+DDRAM addr 값
#define LINE1 0x80	//첫번째 라인의 DDRAM addr : 0x00->0x80+0x00
#define LINE2 0xC0	//두번째 라인의 DDRAM addr : 0x40->0x80+0x40

//PG2=LCD_EN, PG1=RW, PG0=RS에 연결
#define CMD_WRITE		0xFC	//명령어 쓰기 E=1, RW=0, RS=0
#define CMD_READ		0xFE	//명령어 읽기 E=1, RW=1, RS=0
#define DATA_WRITE	0xFD	//데이터 쓰기 E=1, RW=0, RS=1
#define DATA_READ		0xFF	//데이터 읽기 E=1, RW=1, RS=1
#define LCD_EN			0x04	//PG2에 연결

//LCD에 명령을 쓰기위한 함수
void LCD_cmd_write(unsigned char cmd)
{
	PORTG = CMD_WRITE;
	PORTB = cmd;
	PORTG =PORTG^LCD_EN;
	_delay_ms(2);
}
//LCD에 데이터를 쓰기 위한 함수
void LCD_data_write(unsigned char data)
{
	PORTG = DATA_WRITE;
	PORTB = data;
	PORTG = PORTG^LCD_EN;
	_delay_ms(2);
}

void init_LCD(void)
{
	_delay_ms(15);
	LCD_cmd_write(0x38);//명령레지스터에 0x38 전달
	_delay_ms(5);
	LCD_cmd_write(0x38);
	_delay_us(100);
	LCD_cmd_write(0x38);
	LCD_cmd_write(0x08);
	LCD_cmd_write(0x01);
	LCD_cmd_write(0x06);
	LCD_cmd_write(0x0C);
}

//LCD에 문자열 표시하기위한 함수
void LCD_wr_string(char d_line, char *str)
{
	LCD_cmd_write(d_line);
	while(*str != '\0')
	{
		LCD_data_write(*str);
		str++;
	}
}
//ATmega128 포트 초기화
void init_system(void)
{
	//B,G- LCD
	DDRB=0xFF;
	DDRG=0xFF;
	//C- LED, D-SWITCH
	DDRC=0xFF;
	DDRD=0x00;
	PORTC=0xFF;
	PORTD=0xFF;//내부풀업 사용
}

int main()
{
	init_system();
	init_LCD();


	unsigned char sw1, sw2;
	while(1)
	{
		sw1 = PIND & 0xFE;//1111 1110 -PD 0번 스위치 눌릴때
		sw2 = PIND & 0xFD;//1111 1101 -PD 1번 스위치가 눌릴때
		
		if (sw1 == PIND)
		{
			LCD_wr_string(LINE1, "   switch 1 ");
			LCD_wr_string(LINE2, "200ms Blinking");
			PORTC = 0xFE;//1111 1110 0번 LED 블링크
			_delay_ms(200);
			PORTC = 0xFF;
			_delay_ms(200);
		}	
		else if (sw2 == PIND)
		{
			LCD_wr_string(LINE1, "  switch 2");
			LCD_wr_string(LINE2, " 500ms blinking!");
			PORTC= 0xFD;
			_delay_ms(500);
			PORTC= 0xFF;
			_delay_ms(500);
		}
		else
		{
			LCD_wr_string(LINE1, "    ");
			LCD_wr_string(LINE2, "     ");
		}
	}
	return 1;
}


 

회로 설정 프로젝트 코드

D1 VDD n1 ;LED D1이 VDD와 n1 node사이에 연결1
R1 n1 PC0 330 ; 저항 R1을 n1 node와 PC0 사이에 연결

D2 VDD n2
R2 n2 PC1 330

D3 VDD n3
R3 n3 PC2 330

D4 VDD n4
R4 n4 PC3 330

D5 VDD n5
R5 n5 PC4 330

D6 VDD n6
R6 n6 PC5 330

D7 VDD n7
R7 n7 PC6 330

D8 VDD n8
R8 n8 PC7 330

K0 PD0 VSS
K1 PD1 VSS

Xdisp LCD(16 2 250K) PG0 PG1 PG2 PB7 PB6 PB5 PB4 PB3 PB2 PB1 PB0

 

- 스위치 LCD 테스트 중 실수한게

스위치를 꾹 누르고 있어야 적절한 PIND 입력이 전달된다.

살짝 눌러놓고 왜 LCD가 안뜨나 했다..

 

300x250
728x90

LCD 액정 디스플레이

- 대부분 디스플레이에 사용

- FND 같은 단순한 형태부터

- 실제 가까운 OLED까지

 

 

문자 LCD

- Liquid Crystal Display 약자

- Character Type LCD와 Graphic Type LCD로 구분

- 최대 가로로 쓰이는 문자수와 세로로 표시되는 줄 수로 규격이 정해짐

 -> 16 x 2(16글자 2줄), 20 x 4 (20글자 4줄), 40 x 2 등 다양한 종류

- LCD와 컨트롤러가 결합된 모듈형태

- 대부분 Hitachi의 HD44780 컨트롤러 내장 -> DH44780의 데이터시트를 보면서 해야함

 

문자 LCD

 

C-LCD 핀 구성

- MCU가 통해 신호를 보내야함

- MCU 측 PB0~7 까지 8개 핀, PG0~2 3개 -> 11개 핀 할당

- LCD Driver에선 RS, RW, E와 DB0~7핀이 받음

MCU - LCD 
컨트롤트롤러와 LCD

 

 C_LCD 핀의 기능 

- CN-LCD는 LCD 모듈

 

LCD 핀의 기능

- 1,2  그라운드와 전원

- 3 가변저항

- 15, 16은 백라이트 전원과 그라운드 연결 

- 4 : PG0 핀으로 high를 보내면 데이터 레지스터 선택, low를 보내면 명령레지스터 선택

LCD 회로도

 

 

 

DDRAM Display Data RAM

- 최대 80*8bit 기억 용량 (최대 80글자 기억)

-  DDRAM의 1행 0x00 ~ 0x27 addr(40문자) : 0x80 + (0x00 ~ 0x27)

- DDRAM의 2행 0x40 ~ 0x67 addr(40문자) : 0x80 + (0x40 ~ 0x67)

- DDRAM의 address 동작 상태 (실제 메모리 공간 : 0x80~0xA7, 0xC0 ~ 0xE7)

-> 0x80하는 이유는 뒤에 서술

 

CG ROM(Character Generator ROM)

- 문자 생성 ROM

- 가로 16 x 세로 12개의 address code를 가짐

- 192개의 숫자, 문자 패턴을 가짐

 

CG RAM(character generator ram)

- 문자 생성 ram

- 사용자가 프로그램으로 문자 패턴을 만들 경우 사용하는 ram

- 0x00 ~ 0x3f 번지 저장

- 8개의 사용자 공간 활용 가능

- 전원 off 시 data는 삭제됨

-> 잘 사용하지 않으나 문자 생성 필요시 사용

 

 

레지스터 선택 신호

- 명령어/데이터 쓰기 작업만 집중 : CGROM에 있는 192개의 숫자, 문자 패턴을 씀

- Instruction Register IR : Text LCD 모듈 환경 설정

- Data Register DR : 모듈에 글자를 표시하기 위한 데이터 값이 들어가는 레지스터

- IR에 명령어 세팅 -> DR에 표시하는 값 write

- rs=0, rw=0 명령어 쓰기 -> Instruction Register에 제어 데이터 쓰기

- rs=1, rw=0 데이터 쓰기-> LCD에 표시할 문자를 Data Register에 쓰기

 

 

 

문자 LCD 명령 테이블

- I/D, S/C, R/L은 명령 옵션 아래의 명령 옵션 참고

 

문자 LCD 명령 옵션

 

8비트 LCD 초기화

 

8비트 데이터 버스를 사용하는 LCD 초기화 방법

//LCD 초기화
void init_LCD()
{
	_delay_ms(15);
    
    /*
    0x38의 의미 -> 문자 LCD 명령 테이블 참고
    0x38 == 0011 10xx
    Function set 명령을 의미
    DL 옵션이 1, N 옵션 1, F옵션 0 / 인터페이스(DL), 라인(N), 폰트(F)
    => 문자 LCD 명령 옵션 참고
    DL =1 -> 8비트 데이터 버스 사용 data line
    N = 1 -> 두줄 사용 number line
    F = 0 -> 5x8 dot 사이즈 글자 font / F=1 인경우 5 x 10 dot size 글자 사용 -> 0011 11xx을 write하면됨
    
    */
    LCD_cmd_write(0x38); 
    
    _delay_ms(5);
    LCD_cmd_write(0x38);
    _delay_ms(100);
    LCD_cmd_write(0x38);
    
    LCD_cmd_write(0x08); //표시 off
    LCD_cmd_write(0x01); // 화면 지우기
    LCD_cmd_write(0x06); // 엔트리 모드 셋
    LCD_cmd_write(0x0C); //표시 on
    
}

 

쓰기 동작 타이밍도

- 데이터 시트 마지막에 있음

- 유효한 명령/데이터로 하기 위해서 E을 high에서 low로 중간에 떨어뜨려야 함

 

문자 LCD 표시 예제

//LCD 8비트 인터페이스 초기화 함수
void LCD_init()
{
	DDRB = 0xFF;
	DDRG = 0xFF;
	_delay_ms(20);
	LCD_command(0x38);
	LCD_command(0x08);
	LCD_command(0x01);
	_delay_ms(1);
	LCD_command(0x06);
	LCD_command(0x0E);

}

//LCD 명령 처리 함수
void LCD_command(unsigned char cmd)
{
	//0000 0100
	PORTG = 0x04; //E=1, RW=0, RS=0 -> 명령 레지스터에 명령쓰기
	PORTB = cmd;  // 명령 전달
	_delay_us(1);
	PORTG = 0x00; //E=0, RW=0, RS=0
	// enable을 high에서 low로 떨어져야 valid data   -동작 타이밍도 참고
	_delay_us(1); //명령 쓰기
	
}
// LCD 데이터 처리 함수
void LCD_data(unsigned char data)
{
	PORTG = 0x05;//E=1, RW=0, RS=1  LCD에 표시할 문자를 데이터레지스터에 쓰기
	PORTB = data;//데이터 값 전달
	_delay_us(1);
	PORTG = 0x01;//E=0, RW=0, RS=1 LCD 데이터 처리신호 high->low
	_delay_us(1);
}

// 문자열 처리 함수
void LCD_string(unsigned char cmd, unsigned char *str)
{
	//문자열 출력 위치 명령 전달
	LCD_command(cmd);
	// 문자열 마지막 null에서 루프 종료
	while (*str != '\0')
	{
		LCD_data(*str);
		str++;
	}
}

// ***********************************************************
// Main program
//
int main(void) {

	LCD_init();
	
	unsigned char str1[] ="LCD display";
	unsigned char str2[] = "  Example ";
	while (1)
	{
		LCD_string(0x80, str1);// 첫째줄 0x80부터 시작
		LCD_string(0xC0, str2);// 둘째줄 0xC0부터 시
		_delay_ms(100);
	}
	return 1;
}

LCD VMLAB 프로젝트 코드

 ;                     rs  rw  E   -------------8bit interface----
 Xdisp	LCD(16 2 250K) PG0 PG1 PG2 PB7 PB6 PB5 PB4 PB3 PB2 PB1 PB0
 ;X(이름)disp(모듈)
 ;16 x 2 , 250K 크리스탈 동작

300x250
728x90

FND 세븐 세그먼트

- Flexible Numeric Display

- 숫자 표현을 위한 디스플레이용 소자

- .을 포함하여 8개 LED 배열하여 표현

FND

 

 

FND 내부 회로

- 커먼 캐소드형 : 컴 단자가 - , 공통으로 -단자에 연결

- 커먼 애노드형 : com 단자가 + 전압, 공통으로 + 단자에 연결

Common Cathod형 FND
Common Anode 형

 

FND 동작 원리

- 캐소드 타입 : 핀에 하이 신호 시 불켜짐

- 애노드 타입 : 핀에 로 신호시 불켜짐

 

 

FND 캐소드 타입 테이블

- 애노드 타입의 경우 캐소드 타입을 반전시키면 된다.

 

핀 연결

 

모든 세그먼트를 연결시

- 총 54개 핀이 필요

- 6개의 COM(COM0~COM5), 8(a~h) x 6

 

세그먼트 공통 연결시

- 14개 핀으로 제어

 - 8(a~h) + 6(COM0 ~ COM5)

문제 : 8개의 비트 만으로 6개 FND 값 전체를 한번에 제어할수 없음

-> 잔상 효과로 각 LED를 시간차 주어 제어

 

잔상효과를 이용한 FND 제어

- 자리를 바꾸면서 남는 잔상으로 숫자 표시 -> 모든 세그먼트 연결하는것보다 핀 수를 줄일 수 있음

-> 가장 흔한 FND 제어 방식

 

FND 회로도

- 캐소드 공통형 회로도

- 사용된 핀 확인해야함

- PE2~5 4개, PA0~PA7 8개

 

FND 제어 예제 1

- FND를 사용하기 위해 커먼과 핀을 출력설정해야함

#include <avr/io.h>
#include <util/delay.h>

int main(void)
{
	DDRA = 0xFF;
    DDRE = 0xFF;
    
    while (1)
    {
    	PORTA = 0x3F;	// 숫자 '0'
        PORTE = 0x00;	// X1~X2 FND ENABLE
        _delay_ms(10);
    }
}

 

회로도 코드

;_led7cc : 커먼 캐소드 타입 FND
; PA0~PA7를 입력
; PE0를 캐소드에 연결
X1 _led7cc PA0 PA1 PA2 PA3 PA4 PA5 PA6 PA7 PE0
X2 _led7cc PA0 PA1 PA2 PA3 PA4 PA5 PA6 PA7 PE1
X3 _led7cc PA0 PA1 PA2 PA3 PA4 PA5 PA6 PA7 PE2
X4 _led7cc PA0 PA1 PA2 PA3 PA4 PA5 PA6 PA7 PE3
X5 _led7cc PA0 PA1 PA2 PA3 PA4 PA5 PA6 PA7 PE4
X6 _led7cc PA0 PA1 PA2 PA3 PA4 PA5 PA6 PA7 PE5
X7 _led7cc PA0 PA1 PA2 PA3 PA4 PA5 PA6 PA7 PE6
X8 _led7cc PA0 PA1 PA2 PA3 PA4 PA5 PA6 PA7 PE7

; 커먼 애노드 타입 사용시 _led7ca
;FND 설정, Xn _led7cc seg_a seg_b seg_c seg_h ... seg_h GND

 

FND 제어 예제 2

#include <avr/io.h>
#include <util/delay.h>

int main(void)
{

	unsigned char seg[8] = {0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F};
    unsigned char i;
    
	DDRA = 0xFF;
    DDRE = 0xFF;
    PORTE - 0x00;	//전체 FND enable
    
    while (1)
    {
  		for (i = 0; i < 8; i++)
        {
        	PORTA = seg[i];
            _delay_ms(100);
        }
  	}
}

 

다이나믹 FND

- VMLAB에서 사용불가.

300x250

+ Recent posts